More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 38 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Execute Order | 12798023 | 4 hrs ago | IN | 0 S | 0.0430599 | ||||
Create Order | 12797949 | 4 hrs ago | IN | 0 S | 0.01050542 | ||||
Create Order | 12797230 | 4 hrs ago | IN | 0 S | 0.01050542 | ||||
Create Order | 12795521 | 4 hrs ago | IN | 0 S | 0.01050542 | ||||
Create Order | 12768536 | 8 hrs ago | IN | 0 S | 0.01104122 | ||||
Execute Order | 12765524 | 8 hrs ago | IN | 0 S | 0.01514635 | ||||
Create Order | 12765463 | 8 hrs ago | IN | 0 S | 0.01026542 | ||||
Create Order | 12765252 | 8 hrs ago | IN | 0 S | 0.01050542 | ||||
Create Order | 12765076 | 8 hrs ago | IN | 0 S | 0.01136042 | ||||
Execute Order | 12764483 | 8 hrs ago | IN | 0 S | 0.015657 | ||||
Create Order | 12764352 | 8 hrs ago | IN | 0 S | 0.01136042 | ||||
Execute Order | 12763590 | 8 hrs ago | IN | 0 S | 0.0155401 | ||||
Create Order | 12763461 | 8 hrs ago | IN | 0 S | 0.01136042 | ||||
Emergency Withdr... | 12763262 | 8 hrs ago | IN | 0 S | 0.0026411 | ||||
Create Order | 12761923 | 9 hrs ago | IN | 0 S | 0.01203329 | ||||
Emergency Withdr... | 12761559 | 9 hrs ago | IN | 0 S | 0.0025556 | ||||
Emergency Withdr... | 12761507 | 9 hrs ago | IN | 0 S | 0.0026411 | ||||
Create Order | 12758666 | 9 hrs ago | IN | 0 S | 0.01170964 | ||||
Create Order | 12713107 | 14 hrs ago | IN | 0 S | 0.01104122 | ||||
Execute Order | 12712753 | 14 hrs ago | IN | 0 S | 0.0231294 | ||||
Create Order | 12712553 | 14 hrs ago | IN | 0 S | 0.01136042 | ||||
Execute Order | 12711816 | 14 hrs ago | IN | 0 S | 0.0165163 | ||||
Create Order | 12711627 | 15 hrs ago | IN | 0 S | 0.01136042 | ||||
Emergency Withdr... | 12711396 | 15 hrs ago | IN | 0 S | 0.0026411 | ||||
Create Order | 12707514 | 15 hrs ago | IN | 0 S | 0.01002542 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
SwapExecutor
Compiler Version
v0.8.25+commit.b61c2a91
Optimization Enabled:
Yes with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/Pausable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "./AuctionManager.sol"; import "./SolverRegistry.sol"; import "./libraries/DataTypes.sol"; contract SwapExecutor is Ownable, Pausable, ReentrancyGuard { using SafeERC20 for IERC20; mapping(uint256 => DataTypes.Order) public orders; uint256 public nextOrderId; uint256 public protocolFeePercent; uint256 public constant MAX_FEE = 50; // Max 0.5% fee SolverRegistry public solverRegistry; AuctionManager public auctionManager; event OrderCreated( uint256 indexed orderId, address indexed creator, address sourceToken, uint256 sourceAmount, address targetToken, uint256 minTargetAmount ); event OrderExecuted( uint256 indexed orderId, address indexed executor, uint256 sourceAmount, uint256 targetAmount, uint256 fee ); constructor(address _solverRegistry, address _auctionManager, uint256 _protocolFeePercent) Ownable(msg.sender) { require(_protocolFeePercent <= MAX_FEE, "Fee too high"); solverRegistry = SolverRegistry(_solverRegistry); auctionManager = AuctionManager(_auctionManager); protocolFeePercent = _protocolFeePercent; } function createOrder( address sourceToken, uint256 sourceAmount, address targetToken, uint256 minTargetAmount ) external whenNotPaused returns (uint256) { require(sourceAmount > 0, "Invalid amount"); IERC20(sourceToken).safeTransferFrom(msg.sender, address(this), sourceAmount); uint256 orderId = nextOrderId++; orders[orderId] = DataTypes.Order({ creator: msg.sender, sourceToken: sourceToken, sourceAmount: sourceAmount, targetToken: targetToken, minTargetAmount: minTargetAmount, executed: false }); auctionManager.createAuction(orderId); emit OrderCreated( orderId, msg.sender, sourceToken, sourceAmount, targetToken, minTargetAmount ); return orderId; } function executeOrder( uint256 orderId, uint256 bidAmount, bytes[] calldata callData, address[] calldata targets ) external nonReentrant whenNotPaused { DataTypes.Order storage order = orders[orderId]; (, address winner, bytes memory strategy, bool finalized, ) = auctionManager.auctions(orderId); require(!order.executed, "Order already executed"); require(finalized, "auction not finalized"); require(msg.sender == winner, "Not winner"); require(bidAmount >= order.minTargetAmount, "Below min amount"); require(targets.length == callData.length, "Length mismatch"); (,,bool isActive) = solverRegistry.solvers(msg.sender); require(isActive, "Not registered solver"); // Verify the execution strategy matches the winning strategy bytes memory executionStrategy = abi.encode(msg.sender, targets, callData, bidAmount); require(keccak256(executionStrategy) == keccak256(strategy), "Invalid strategy"); uint256 targetBalanceBefore = IERC20(order.targetToken).balanceOf(address(this)); // Execute swaps for(uint256 i = 0; i < targets.length; i++) { (bool success, ) = targets[i].call(callData[i]); require(success, "Execution failed"); } // Verify execution results uint256 targetBalanceAfter = IERC20(order.targetToken).balanceOf(address(this)); require(targetBalanceAfter - targetBalanceBefore >= bidAmount, "Insufficient output"); order.executed = true; // Transfer fee (total - 0.5%, 0.15% to protocol, 0.35% to solver) uint256 fee = (targetBalanceAfter * protocolFeePercent) / 10000; IERC20(order.targetToken).safeTransfer(order.creator, targetBalanceAfter - fee); IERC20(order.targetToken).safeTransfer(msg.sender, fee * 7000 / 10000); emit OrderExecuted( orderId, msg.sender, order.sourceAmount, targetBalanceAfter - fee, fee ); } function setProtocolFee(uint256 _newFee) external onlyOwner { require(_newFee <= MAX_FEE, "Fee too high"); protocolFeePercent = _newFee; } function emergencyWithdraw( address token, address to, uint256 amount ) external onlyOwner { IERC20(token).safeTransfer(to, amount); } function emergencyWithdrawETH(address to, uint256 amount) external onlyOwner { require(to != address(0), "Invalid address"); require(amount > 0, "Invalid amount"); (bool success, ) = payable(to).call{value: amount}(""); require(success, "ETH transfer failed"); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at, * consider using {ReentrancyGuardTransient} instead. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant NOT_ENTERED = 1; uint256 private constant ENTERED = 2; uint256 private _status; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _status = NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { bool private _paused; /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); /** * @dev The operation failed because the contract is paused. */ error EnforcedPause(); /** * @dev The operation failed because the contract is not paused. */ error ExpectedPause(); /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { if (paused()) { revert EnforcedPause(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert ExpectedPause(); } } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; import {IERC1363} from "../../../interfaces/IERC1363.sol"; import {Address} from "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC-20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { /** * @dev An operation with an ERC-20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. * * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being * set here. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { safeTransfer(token, to, value); } else if (!token.transferAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferFromAndCallRelaxed( IERC1363 token, address from, address to, uint256 value, bytes memory data ) internal { if (to.code.length == 0) { safeTransferFrom(token, from, to, value); } else if (!token.transferFromAndCall(from, to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}. * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall} * once without retrying, and relies on the returned value to be true. * * Reverts if the returned value is other than `true`. */ function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { forceApprove(token, to, value); } else if (!token.approveAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements. */ function _callOptionalReturn(IERC20 token, bytes memory data) private { uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) // bubble errors if iszero(success) { let ptr := mload(0x40) returndatacopy(ptr, 0, returndatasize()) revert(ptr, returndatasize()) } returnSize := returndatasize() returnValue := mload(0) } if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { bool success; uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) returnSize := returndatasize() returnValue := mload(0) } return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import "@openzeppelin/contracts/access/Ownable.sol"; import "./libraries/DataTypes.sol"; contract AuctionManager is Ownable { address public swapExecutor; mapping(uint256 => DataTypes.Auction) public auctions; uint256 auctionDuration; event AuctionCreated(uint256 indexed orderId); event AuctionFinalized( uint256 indexed orderId, address indexed winner, bytes strategy ); constructor(address _swapExecutor, uint256 _auctionDuration) Ownable(msg.sender) { swapExecutor = _swapExecutor; auctionDuration = _auctionDuration; } function createAuction(uint256 orderId) public { require(msg.sender == swapExecutor, "Unauthorized"); require(!auctions[orderId].finalized, "Auction exists"); auctions[orderId] = DataTypes.Auction({ orderId: orderId, winner: address(0), strategy: "", finalized: false, endTime: block.timestamp + auctionDuration }); emit AuctionCreated(orderId); } function finalizeAuction( uint256 orderId, address winner, bytes calldata strategy ) external onlyOwner { DataTypes.Auction storage auction = auctions[orderId]; require(!auction.finalized, "Already finalized"); require(block.timestamp >= auction.endTime, "Auction not ended"); auction.winner = winner; auction.strategy = strategy; auction.finalized = true; emit AuctionFinalized(orderId, winner, strategy); } function setAuctionDuration(uint256 _newAuctionDuration) external onlyOwner { auctionDuration = _newAuctionDuration; } function setSwapExecutor(address _newSwapExecutor) external onlyOwner { swapExecutor = _newSwapExecutor; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/Pausable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "./libraries/DataTypes.sol"; contract SolverRegistry is Ownable, Pausable, ReentrancyGuard { using SafeERC20 for IERC20; mapping(address => DataTypes.Solver) public solvers; uint256 public minDeposit; event SolverRegistered(address indexed solver, uint256 deposit); event SolverDeregistered(address indexed solver, uint256 deposit); event MinDepositUpdated(uint256 oldDeposit, uint256 newDeposit); constructor(uint256 _minDeposit) Ownable(msg.sender) { minDeposit = _minDeposit; } function registerSolver() external payable whenNotPaused { require(msg.value >= minDeposit, "Insufficient deposit"); require(!solvers[msg.sender].isActive, "Solver already registered"); solvers[msg.sender] = DataTypes.Solver({ solverAddress: msg.sender, deposit: msg.value, isActive: true }); emit SolverRegistered(msg.sender, msg.value); } function deregisterSolver() external nonReentrant { require(solvers[msg.sender].isActive, "Solver not registered"); uint256 deposit = solvers[msg.sender].deposit; solvers[msg.sender].isActive = false; (bool success, ) = payable(msg.sender).call{value: deposit}(""); require(success, "Transfer failed"); emit SolverDeregistered(msg.sender, deposit); } function updateMinDeposit(uint256 _newDeposit) external onlyOwner { uint256 oldDeposit = minDeposit; minDeposit = _newDeposit; emit MinDepositUpdated(oldDeposit, _newDeposit); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; library DataTypes { struct Solver { address solverAddress; uint256 deposit; bool isActive; } struct Order { address creator; address sourceToken; uint256 sourceAmount; address targetToken; uint256 minTargetAmount; // uint256 deadline; bool executed; } struct Auction { uint256 orderId; address winner; bytes strategy; bool finalized; uint256 endTime; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol) pragma solidity ^0.8.20; import {IERC20} from "./IERC20.sol"; import {IERC165} from "./IERC165.sol"; /** * @title IERC1363 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363]. * * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction. */ interface IERC1363 is IERC20, IERC165 { /* * Note: the ERC-165 identifier for this interface is 0xb0202a11. * 0xb0202a11 === * bytes4(keccak256('transferAndCall(address,uint256)')) ^ * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^ * bytes4(keccak256('approveAndCall(address,uint256)')) ^ * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) */ /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @param data Additional data with no specified format, sent in call to `spender`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/Address.sol) pragma solidity ^0.8.20; import {Errors} from "./Errors.sol"; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert Errors.InsufficientBalance(address(this).balance, amount); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert Errors.FailedCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {Errors.FailedCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert Errors.InsufficientBalance(address(this).balance, value); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case * of an unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {Errors.FailedCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly ("memory-safe") { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert Errors.FailedCall(); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "../token/ERC20/IERC20.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol) pragma solidity ^0.8.20; import {IERC165} from "../utils/introspection/IERC165.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol) pragma solidity ^0.8.20; /** * @dev Collection of common custom errors used in multiple contracts * * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library. * It is recommended to avoid relying on the error API for critical functionality. * * _Available since v5.1._ */ library Errors { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error InsufficientBalance(uint256 balance, uint256 needed); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedCall(); /** * @dev The deployment failed. */ error FailedDeployment(); /** * @dev A necessary precompile is missing. */ error MissingPrecompile(address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "remappings": [ "@openzeppelin/=lib/openzeppelin-contracts/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/", "openzeppelin-contracts/=lib/openzeppelin-contracts/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "cancun", "viaIR": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_solverRegistry","type":"address"},{"internalType":"address","name":"_auctionManager","type":"address"},{"internalType":"uint256","name":"_protocolFeePercent","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"address","name":"sourceToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"sourceAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"targetToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"minTargetAmount","type":"uint256"}],"name":"OrderCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"uint256","name":"sourceAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"targetAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"OrderExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionManager","outputs":[{"internalType":"contract AuctionManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sourceToken","type":"address"},{"internalType":"uint256","name":"sourceAmount","type":"uint256"},{"internalType":"address","name":"targetToken","type":"address"},{"internalType":"uint256","name":"minTargetAmount","type":"uint256"}],"name":"createOrder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyWithdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"},{"internalType":"uint256","name":"bidAmount","type":"uint256"},{"internalType":"bytes[]","name":"callData","type":"bytes[]"},{"internalType":"address[]","name":"targets","type":"address[]"}],"name":"executeOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nextOrderId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"orders","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"sourceToken","type":"address"},{"internalType":"uint256","name":"sourceAmount","type":"uint256"},{"internalType":"address","name":"targetToken","type":"address"},{"internalType":"uint256","name":"minTargetAmount","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setProtocolFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"solverRegistry","outputs":[{"internalType":"contract SolverRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561000f575f80fd5b5060405161155038038061155083398101604081905261002e91610150565b338061005457604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61005d816100e6565b505f805460ff60a01b191690556001805560328111156100ae5760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b604482015260640161004b565b600580546001600160a01b039485166001600160a01b0319918216179091556006805493909416921691909117909155600455610189565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b038116811461014b575f80fd5b919050565b5f805f60608486031215610162575f80fd5b61016b84610135565b925061017960208501610135565b9150604084015190509250925092565b6113ba806101965f395ff3fe608060405234801561000f575f80fd5b50600436106100f0575f3560e01c8063a85c38ef11610093578063d79e856711610063578063d79e85671461024e578063e63ea40814610261578063f2fde38b14610274578063fc05ca3114610287575f80fd5b8063a85c38ef14610197578063b0192f9a1461022a578063bc063e1a1461023d578063d6e6eb9f14610245575f80fd5b80636f4c58e2116100ce5780636f4c58e214610141578063715018a61461016c578063787dce3d146101745780638da5cb5b14610187575f80fd5b80632a58b330146100f45780635c975abb146101105780636cab57cf1461012c575b5f80fd5b6100fd60035481565b6040519081526020015b60405180910390f35b5f54600160a01b900460ff166040519015158152602001610107565b61013f61013a366004610eb5565b61029a565b005b600554610154906001600160a01b031681565b6040516001600160a01b039091168152602001610107565b61013f6108dd565b61013f610182366004610f32565b6108f0565b5f546001600160a01b0316610154565b6101ec6101a5366004610f32565b600260208190525f91825260409091208054600182015492820154600383015460048401546005909401546001600160a01b03938416958416949293909116919060ff1686565b604080516001600160a01b039788168152958716602087015285019390935293166060830152608082019290925290151560a082015260c001610107565b600654610154906001600160a01b031681565b6100fd603281565b6100fd60045481565b61013f61025c366004610f5d565b61093d565b61013f61026f366004610f87565b610a67565b61013f610282366004610fc5565b610a83565b6100fd610295366004610fe7565b610ac0565b6102a2610c94565b6102aa610cbe565b5f8681526002602052604080822060065491516302b8d13560e51b8152600481018a9052909291829182916001600160a01b03169063571a26a0906024015f60405180830381865afa158015610302573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526103299190810190611054565b506005880154929650909450925060ff161590506103875760405162461bcd60e51b815260206004820152601660248201527513dc99195c88185b1c9958591e48195e1958dd5d195960521b60448201526064015b60405180910390fd5b806103cc5760405162461bcd60e51b8152602060048201526015602482015274185d58dd1a5bdb881b9bdd08199a5b985b1a5e9959605a1b604482015260640161037e565b336001600160a01b038416146104115760405162461bcd60e51b815260206004820152600a6024820152692737ba103bb4b73732b960b11b604482015260640161037e565b83600401548910156104585760405162461bcd60e51b815260206004820152601060248201526f10995b1bddc81b5a5b88185b5bdd5b9d60821b604482015260640161037e565b8487146104995760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b604482015260640161037e565b600554604051630afeb1b360e31b81523360048201525f916001600160a01b0316906357f58d9890602401606060405180830381865afa1580156104df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105039190611135565b925050508061054c5760405162461bcd60e51b81526020600482015260156024820152742737ba103932b3b4b9ba32b932b21039b7b63b32b960591b604482015260640161037e565b5f3388888c8c8f60405160200161056896959493929190611199565b604051602081830303815290604052905083805190602001208180519060200120146105c95760405162461bcd60e51b815260206004820152601060248201526f496e76616c696420737472617465677960801b604482015260640161037e565b60038601546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610611573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610635919061128c565b90505f5b8881101561072f575f8a8a83818110610654576106546112a3565b90506020020160208101906106699190610fc5565b6001600160a01b03168d8d84818110610684576106846112a3565b905060200281019061069691906112b7565b6040516106a49291906112fa565b5f604051808303815f865af19150503d805f81146106dd576040519150601f19603f3d011682016040523d82523d5f602084013e6106e2565b606091505b50509050806107265760405162461bcd60e51b815260206004820152601060248201526f115e1958dd5d1a5bdb8819985a5b195960821b604482015260640161037e565b50600101610639565b5060038701546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061079c919061128c565b90508c6107a9838361131d565b10156107ed5760405162461bcd60e51b8152602060048201526013602482015272125b9cdd59999a58da595b9d081bdd5d1c1d5d606a1b604482015260640161037e565b60058801805460ff191660011790556004545f906127109061080f9084611336565b610819919061134d565b895490915061084a906001600160a01b0316610835838561131d565b60038c01546001600160a01b03169190610ce8565b6108673361271061085d84611b58611336565b610835919061134d565b336001600160a01b03168f7f1cd65e6e4f6a6bfcff65064f4e22d514f481a38dcbe4c2ad13ccde1b22e069418b6002015484866108a4919061131d565b604080519283526020830191909152810185905260600160405180910390a35050505050505050506108d560018055565b505050505050565b6108e5610d47565b6108ee5f610d73565b565b6108f8610d47565b60328111156109385760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b604482015260640161037e565b600455565b610945610d47565b6001600160a01b03821661098d5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161037e565b5f81116109cd5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015260640161037e565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610a16576040519150601f19603f3d011682016040523d82523d5f602084013e610a1b565b606091505b5050905080610a625760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b604482015260640161037e565b505050565b610a6f610d47565b610a626001600160a01b0384168383610ce8565b610a8b610d47565b6001600160a01b038116610ab457604051631e4fbdf760e01b81525f600482015260240161037e565b610abd81610d73565b50565b5f610ac9610cbe565b5f8411610b095760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015260640161037e565b610b1e6001600160a01b038616333087610dc2565b600380545f9182610b2e8361136c565b909155506040805160c0810182523381526001600160a01b0389811660208084019182528385018b81528a841660608601908152608086018b81525f60a088018181528a825260029586905290899020975188546001600160a01b03199081169189169190911789559551600189018054881691891691909117905592519387019390935551600386018054909416908516179092555160048085019190915590516005909301805460ff191693151593909317909255600654925163d5563f3160e01b815291820184905292935091169063d5563f31906024015f604051808303815f87803b158015610c20575f80fd5b505af1158015610c32573d5f803e3d5ffd5b5050604080516001600160a01b038a81168252602082018a90528816818301526060810187905290513393508492507f87fe93d79d983fe0c58212e2b0ffef6a47b3d30067aae73d04d7136301ac32d29181900360800190a395945050505050565b600260015403610cb757604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b5f54600160a01b900460ff16156108ee5760405163d93c066560e01b815260040160405180910390fd5b6040516001600160a01b03838116602483015260448201839052610a6291859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050610e01565b5f546001600160a01b031633146108ee5760405163118cdaa760e01b815233600482015260240161037e565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b038481166024830152838116604483015260648201839052610dfb9186918216906323b872dd90608401610d15565b50505050565b5f8060205f8451602086015f885af180610e20576040513d5f823e3d81fd5b50505f513d91508115610e37578060011415610e44565b6001600160a01b0384163b155b15610dfb57604051635274afe760e01b81526001600160a01b038516600482015260240161037e565b5f8083601f840112610e7d575f80fd5b50813567ffffffffffffffff811115610e94575f80fd5b6020830191508360208260051b8501011115610eae575f80fd5b9250929050565b5f805f805f8060808789031215610eca575f80fd5b8635955060208701359450604087013567ffffffffffffffff80821115610eef575f80fd5b610efb8a838b01610e6d565b90965094506060890135915080821115610f13575f80fd5b50610f2089828a01610e6d565b979a9699509497509295939492505050565b5f60208284031215610f42575f80fd5b5035919050565b6001600160a01b0381168114610abd575f80fd5b5f8060408385031215610f6e575f80fd5b8235610f7981610f49565b946020939093013593505050565b5f805f60608486031215610f99575f80fd5b8335610fa481610f49565b92506020840135610fb481610f49565b929592945050506040919091013590565b5f60208284031215610fd5575f80fd5b8135610fe081610f49565b9392505050565b5f805f8060808587031215610ffa575f80fd5b843561100581610f49565b935060208501359250604085013561101c81610f49565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b8051801515811461104f575f80fd5b919050565b5f805f805f60a08688031215611068575f80fd5b85519450602086015161107a81610f49565b604087015190945067ffffffffffffffff80821115611097575f80fd5b818801915088601f8301126110aa575f80fd5b8151818111156110bc576110bc61102c565b604051601f8201601f19908116603f011681019083821181831017156110e4576110e461102c565b816040528281528b60208487010111156110fc575f80fd5b8260208601602083015e5f60208483010152809750505050505061112260608701611040565b9150608086015190509295509295909350565b5f805f60608486031215611147575f80fd5b835161115281610f49565b6020850151909350915061116860408501611040565b90509250925092565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b038781168252608060208084018290529083018790525f91889160a08501845b8a8110156111e75784356111d381610f49565b8416825293820193908201906001016111c0565b5085810360408701528781528181019350600588901b810182019250885f5b8981101561127357828503601f190186528135368c9003601e1901811261122b575f80fd5b8b01848101903567ffffffffffffffff811115611246575f80fd5b803603821315611254575f80fd5b61125f878284611171565b978601979650505090830190600101611206565b5050505060609390930193909352509695505050505050565b5f6020828403121561129c575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f808335601e198436030181126112cc575f80fd5b83018035915067ffffffffffffffff8211156112e6575f80fd5b602001915036819003821315610eae575f80fd5b818382375f9101908152919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561133057611330611309565b92915050565b808202811582820484141761133057611330611309565b5f8261136757634e487b7160e01b5f52601260045260245ffd5b500490565b5f6001820161137d5761137d611309565b506001019056fea26469706673582212201ab88755a56493cc3b560a18c63b0f993b3b6f6345a632b6dbcfe0f08dcfbae764736f6c634300081900330000000000000000000000004d10eddf0f1b88064ab803b85b685d8b9bb32ae30000000000000000000000001606d01c18e0243d955f55955f29b8393f43bbe60000000000000000000000000000000000000000000000000000000000000032
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106100f0575f3560e01c8063a85c38ef11610093578063d79e856711610063578063d79e85671461024e578063e63ea40814610261578063f2fde38b14610274578063fc05ca3114610287575f80fd5b8063a85c38ef14610197578063b0192f9a1461022a578063bc063e1a1461023d578063d6e6eb9f14610245575f80fd5b80636f4c58e2116100ce5780636f4c58e214610141578063715018a61461016c578063787dce3d146101745780638da5cb5b14610187575f80fd5b80632a58b330146100f45780635c975abb146101105780636cab57cf1461012c575b5f80fd5b6100fd60035481565b6040519081526020015b60405180910390f35b5f54600160a01b900460ff166040519015158152602001610107565b61013f61013a366004610eb5565b61029a565b005b600554610154906001600160a01b031681565b6040516001600160a01b039091168152602001610107565b61013f6108dd565b61013f610182366004610f32565b6108f0565b5f546001600160a01b0316610154565b6101ec6101a5366004610f32565b600260208190525f91825260409091208054600182015492820154600383015460048401546005909401546001600160a01b03938416958416949293909116919060ff1686565b604080516001600160a01b039788168152958716602087015285019390935293166060830152608082019290925290151560a082015260c001610107565b600654610154906001600160a01b031681565b6100fd603281565b6100fd60045481565b61013f61025c366004610f5d565b61093d565b61013f61026f366004610f87565b610a67565b61013f610282366004610fc5565b610a83565b6100fd610295366004610fe7565b610ac0565b6102a2610c94565b6102aa610cbe565b5f8681526002602052604080822060065491516302b8d13560e51b8152600481018a9052909291829182916001600160a01b03169063571a26a0906024015f60405180830381865afa158015610302573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526103299190810190611054565b506005880154929650909450925060ff161590506103875760405162461bcd60e51b815260206004820152601660248201527513dc99195c88185b1c9958591e48195e1958dd5d195960521b60448201526064015b60405180910390fd5b806103cc5760405162461bcd60e51b8152602060048201526015602482015274185d58dd1a5bdb881b9bdd08199a5b985b1a5e9959605a1b604482015260640161037e565b336001600160a01b038416146104115760405162461bcd60e51b815260206004820152600a6024820152692737ba103bb4b73732b960b11b604482015260640161037e565b83600401548910156104585760405162461bcd60e51b815260206004820152601060248201526f10995b1bddc81b5a5b88185b5bdd5b9d60821b604482015260640161037e565b8487146104995760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b604482015260640161037e565b600554604051630afeb1b360e31b81523360048201525f916001600160a01b0316906357f58d9890602401606060405180830381865afa1580156104df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105039190611135565b925050508061054c5760405162461bcd60e51b81526020600482015260156024820152742737ba103932b3b4b9ba32b932b21039b7b63b32b960591b604482015260640161037e565b5f3388888c8c8f60405160200161056896959493929190611199565b604051602081830303815290604052905083805190602001208180519060200120146105c95760405162461bcd60e51b815260206004820152601060248201526f496e76616c696420737472617465677960801b604482015260640161037e565b60038601546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610611573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610635919061128c565b90505f5b8881101561072f575f8a8a83818110610654576106546112a3565b90506020020160208101906106699190610fc5565b6001600160a01b03168d8d84818110610684576106846112a3565b905060200281019061069691906112b7565b6040516106a49291906112fa565b5f604051808303815f865af19150503d805f81146106dd576040519150601f19603f3d011682016040523d82523d5f602084013e6106e2565b606091505b50509050806107265760405162461bcd60e51b815260206004820152601060248201526f115e1958dd5d1a5bdb8819985a5b195960821b604482015260640161037e565b50600101610639565b5060038701546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061079c919061128c565b90508c6107a9838361131d565b10156107ed5760405162461bcd60e51b8152602060048201526013602482015272125b9cdd59999a58da595b9d081bdd5d1c1d5d606a1b604482015260640161037e565b60058801805460ff191660011790556004545f906127109061080f9084611336565b610819919061134d565b895490915061084a906001600160a01b0316610835838561131d565b60038c01546001600160a01b03169190610ce8565b6108673361271061085d84611b58611336565b610835919061134d565b336001600160a01b03168f7f1cd65e6e4f6a6bfcff65064f4e22d514f481a38dcbe4c2ad13ccde1b22e069418b6002015484866108a4919061131d565b604080519283526020830191909152810185905260600160405180910390a35050505050505050506108d560018055565b505050505050565b6108e5610d47565b6108ee5f610d73565b565b6108f8610d47565b60328111156109385760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b604482015260640161037e565b600455565b610945610d47565b6001600160a01b03821661098d5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161037e565b5f81116109cd5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015260640161037e565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610a16576040519150601f19603f3d011682016040523d82523d5f602084013e610a1b565b606091505b5050905080610a625760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b604482015260640161037e565b505050565b610a6f610d47565b610a626001600160a01b0384168383610ce8565b610a8b610d47565b6001600160a01b038116610ab457604051631e4fbdf760e01b81525f600482015260240161037e565b610abd81610d73565b50565b5f610ac9610cbe565b5f8411610b095760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015260640161037e565b610b1e6001600160a01b038616333087610dc2565b600380545f9182610b2e8361136c565b909155506040805160c0810182523381526001600160a01b0389811660208084019182528385018b81528a841660608601908152608086018b81525f60a088018181528a825260029586905290899020975188546001600160a01b03199081169189169190911789559551600189018054881691891691909117905592519387019390935551600386018054909416908516179092555160048085019190915590516005909301805460ff191693151593909317909255600654925163d5563f3160e01b815291820184905292935091169063d5563f31906024015f604051808303815f87803b158015610c20575f80fd5b505af1158015610c32573d5f803e3d5ffd5b5050604080516001600160a01b038a81168252602082018a90528816818301526060810187905290513393508492507f87fe93d79d983fe0c58212e2b0ffef6a47b3d30067aae73d04d7136301ac32d29181900360800190a395945050505050565b600260015403610cb757604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b5f54600160a01b900460ff16156108ee5760405163d93c066560e01b815260040160405180910390fd5b6040516001600160a01b03838116602483015260448201839052610a6291859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050610e01565b5f546001600160a01b031633146108ee5760405163118cdaa760e01b815233600482015260240161037e565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b038481166024830152838116604483015260648201839052610dfb9186918216906323b872dd90608401610d15565b50505050565b5f8060205f8451602086015f885af180610e20576040513d5f823e3d81fd5b50505f513d91508115610e37578060011415610e44565b6001600160a01b0384163b155b15610dfb57604051635274afe760e01b81526001600160a01b038516600482015260240161037e565b5f8083601f840112610e7d575f80fd5b50813567ffffffffffffffff811115610e94575f80fd5b6020830191508360208260051b8501011115610eae575f80fd5b9250929050565b5f805f805f8060808789031215610eca575f80fd5b8635955060208701359450604087013567ffffffffffffffff80821115610eef575f80fd5b610efb8a838b01610e6d565b90965094506060890135915080821115610f13575f80fd5b50610f2089828a01610e6d565b979a9699509497509295939492505050565b5f60208284031215610f42575f80fd5b5035919050565b6001600160a01b0381168114610abd575f80fd5b5f8060408385031215610f6e575f80fd5b8235610f7981610f49565b946020939093013593505050565b5f805f60608486031215610f99575f80fd5b8335610fa481610f49565b92506020840135610fb481610f49565b929592945050506040919091013590565b5f60208284031215610fd5575f80fd5b8135610fe081610f49565b9392505050565b5f805f8060808587031215610ffa575f80fd5b843561100581610f49565b935060208501359250604085013561101c81610f49565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b8051801515811461104f575f80fd5b919050565b5f805f805f60a08688031215611068575f80fd5b85519450602086015161107a81610f49565b604087015190945067ffffffffffffffff80821115611097575f80fd5b818801915088601f8301126110aa575f80fd5b8151818111156110bc576110bc61102c565b604051601f8201601f19908116603f011681019083821181831017156110e4576110e461102c565b816040528281528b60208487010111156110fc575f80fd5b8260208601602083015e5f60208483010152809750505050505061112260608701611040565b9150608086015190509295509295909350565b5f805f60608486031215611147575f80fd5b835161115281610f49565b6020850151909350915061116860408501611040565b90509250925092565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b038781168252608060208084018290529083018790525f91889160a08501845b8a8110156111e75784356111d381610f49565b8416825293820193908201906001016111c0565b5085810360408701528781528181019350600588901b810182019250885f5b8981101561127357828503601f190186528135368c9003601e1901811261122b575f80fd5b8b01848101903567ffffffffffffffff811115611246575f80fd5b803603821315611254575f80fd5b61125f878284611171565b978601979650505090830190600101611206565b5050505060609390930193909352509695505050505050565b5f6020828403121561129c575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f808335601e198436030181126112cc575f80fd5b83018035915067ffffffffffffffff8211156112e6575f80fd5b602001915036819003821315610eae575f80fd5b818382375f9101908152919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561133057611330611309565b92915050565b808202811582820484141761133057611330611309565b5f8261136757634e487b7160e01b5f52601260045260245ffd5b500490565b5f6001820161137d5761137d611309565b506001019056fea26469706673582212201ab88755a56493cc3b560a18c63b0f993b3b6f6345a632b6dbcfe0f08dcfbae764736f6c63430008190033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004d10eddf0f1b88064ab803b85b685d8b9bb32ae30000000000000000000000001606d01c18e0243d955f55955f29b8393f43bbe60000000000000000000000000000000000000000000000000000000000000032
-----Decoded View---------------
Arg [0] : _solverRegistry (address): 0x4d10eDDf0f1b88064AB803b85B685d8b9BB32Ae3
Arg [1] : _auctionManager (address): 0x1606D01C18E0243D955F55955f29b8393F43BbE6
Arg [2] : _protocolFeePercent (uint256): 50
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000004d10eddf0f1b88064ab803b85b685d8b9bb32ae3
Arg [1] : 0000000000000000000000001606d01c18e0243d955f55955f29b8393f43bbe6
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000032
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
SONIC | 100.00% | $0.453469 | 0.7 | $0.3174 |
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.