Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60c06040 | 17412342 | 410 days ago | IN | Create: ParaswapBotAuthorizer | 0 ETH | 0.04898764 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ParaswapBotAuthorizer
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.19; import "DEXBaseACL.sol"; import "ACLUtils.sol"; import "ParaswapUtils.sol"; interface IUniswapV2Pair { function token0() external view returns (address); function token1() external view returns (address); } // Authorizer For AugustusSwapper 0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57 contract ParaswapBotAuthorizer is DEXBaseACL { bytes32 public constant NAME = "ParaswapBotAuthorizer"; uint256 public constant VERSION = 1; // Paraswap treat 0xee.ee as ETH. uint256 private constant DIRECTION_FLAG = 0x0000000000000000000000010000000000000000000000000000000000000000; // Same address across multi chains. address public immutable ROUTER = 0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57; address public immutable WETH = getWrappedTokenAddress(); constructor(address _owner, address _caller) DEXBaseACL(_owner, _caller) {} function contracts() public view override returns (address[] memory _contracts) { _contracts = new address[](1); _contracts[0] = ROUTER; } // Internal functions. function _checkBeneficiary(address to) internal view { require(to == address(0) || to == _txn().from, "Invalid beneficiary"); } // ACL functions. // SimpleSwap https://etherscan.io/address/0x6e8b66CC92fCD7fE1332664182BEB1161DBFc82d#code // tx https://etherscan.io/tx/0x5307ce12e6252aaea5cd40b845bf0a10ecdfdb3849a5cf388c67e285379e54cf function simpleSwap(Utils.SimpleData calldata data) external view { _swapInOutTokenCheck(data.fromToken, data.toToken); _checkBeneficiary(data.beneficiary); } // tx https://etherscan.io/tx/0xafcdfda106f18a61339630f0475164dcb478bc7e1956c27a1013238f1a29b7ac function simpleBuy(Utils.SimpleData calldata data) external view { _swapInOutTokenCheck(data.fromToken, data.toToken); _checkBeneficiary(data.beneficiary); } // MultiPath https://etherscan.io/address/0xb41Ec6e014e2AD12Ae8514216EAb2592b74F19e7#code // tx https://etherscan.io/tx/0x931f1ace658a3b788f2954bf76d03fd75fa6ec0728e7f7994d84b16a7f10a4a0 function multiSwap(Utils.SellData calldata data) external view { address fromToken = data.fromToken; Utils.Path[] memory path = data.path; address toToken = path[path.length - 1].to; _swapInOutTokenCheck(fromToken, toToken); _checkBeneficiary(data.beneficiary); } // tx https://etherscan.io/tx/0x3e0ab6db5ec3c8f05a80ddab6857d97b5c4154a37879564930004c462e949071 function megaSwap(Utils.MegaSwapSellData calldata data) external view { address fromToken = data.fromToken; address toToken; Utils.MegaSwapPath[] calldata path = data.path; toToken = path[0].path[path[0].path.length - 1].to; _swapInOutTokenCheck(fromToken, toToken); _checkBeneficiary(data.beneficiary); } // NewUniswapV2Router https://etherscan.io/address/0x4FF0dEC5f9a763Aa1E5C2a962aa6f4eDFeE4f9eA#code // tx https://etherscan.io/tx/0xdeefd143100d096eb9402b2ff89764a4bf18a106d38dfe60b34ca7fd4159560a function swapOnUniswapV2Fork( address tokenIn, uint256 amountIn, uint256 amountOutMin, address weth, uint256[] calldata pools ) external view { _checkUniV2Fork(tokenIn, weth, pools); } // tx https://etherscan.io/tx/0x7b0c3f245834edbe867325dda781a1820e7dfe3a7a0f93e9704f0b7cf03808f3 function buyOnUniswapV2Fork( address tokenIn, uint256 amountInMax, uint256 amountOut, address weth, uint256[] calldata pools ) external view { _checkUniV2Fork(tokenIn, weth, pools); } function _checkUniV2Fork(address tokenIn, address weth, uint256[] calldata pools) internal view { bool tokensBoughtEth; if (tokenIn == ETH_ADDRESS) { require(weth == WETH, "Invalid WETH"); } else { require(weth == WETH || weth == address(0), "Invalid WETH"); tokensBoughtEth = weth != address(0); } uint256 lastPool = pools[pools.length - 1]; address lastPair = address(uint160(lastPool)); bool direction = lastPool & DIRECTION_FLAG == 0; address tokenOut = direction ? IUniswapV2Pair(lastPair).token1() : IUniswapV2Pair(lastPair).token0(); if (tokensBoughtEth) { require(tokenOut == WETH, "Invalid pool"); tokenOut = ETH_ADDRESS; } _swapInOutTokenCheck(tokenIn, tokenOut); } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.19; import "EnumerableSet.sol"; import "BaseACL.sol"; /// @title DEXBaseACL - ACL template for DEX. /// @author Cobo Safe Dev Team https://www.cobo.com/ abstract contract DEXBaseACL is BaseACL { using EnumerableSet for EnumerableSet.AddressSet; bytes32 public constant override TYPE = AuthType.DEX; EnumerableSet.AddressSet swapInTokenWhitelist; EnumerableSet.AddressSet swapOutTokenWhitelist; event SwapInTokenAdded(address indexed token); event SwapInTokenRemoved(address indexed token); event SwapOutTokenAdded(address indexed token); event SwapOutTokenRemoved(address indexed token); struct SwapInToken { address token; bool tokenStatus; } struct SwapOutToken { address token; bool tokenStatus; } constructor(address _owner, address _caller) BaseACL(_owner, _caller) {} // External set functions. function addSwapInTokens(address[] calldata _tokens) external onlyOwner { for (uint256 i = 0; i < _tokens.length; i++) { address token = _tokens[i]; if (swapInTokenWhitelist.add(token)) { emit SwapInTokenAdded(token); } } } function removeSwapInTokens(address[] calldata _tokens) external onlyOwner { for (uint256 i = 0; i < _tokens.length; i++) { address token = _tokens[i]; if (swapInTokenWhitelist.remove(token)) { emit SwapInTokenRemoved(token); } } } function addSwapOutTokens(address[] calldata _tokens) external onlyOwner { for (uint256 i = 0; i < _tokens.length; i++) { address token = _tokens[i]; if (swapOutTokenWhitelist.add(token)) { emit SwapOutTokenAdded(token); } } } function removeSwapOutTokens(address[] calldata _tokens) external onlyOwner { for (uint256 i = 0; i < _tokens.length; i++) { address token = _tokens[i]; if (swapOutTokenWhitelist.remove(token)) { emit SwapOutTokenRemoved(token); } } } // External view functions. function hasSwapInToken(address _token) public view returns (bool) { return swapInTokenWhitelist.contains(_token); } function getSwapInTokens() external view returns (address[] memory tokens) { return swapInTokenWhitelist.values(); } function hasSwapOutToken(address _token) public view returns (bool) { return swapOutTokenWhitelist.contains(_token); } function getSwapOutTokens() external view returns (address[] memory tokens) { return swapOutTokenWhitelist.values(); } // Internal check utility functions. function _swapInTokenCheck(address _token) internal view { require(hasSwapInToken(_token), "In token not allowed"); } function _swapOutTokenCheck(address _token) internal view { require(hasSwapOutToken(_token), "Out token not allowed"); } function _swapInOutTokenCheck(address _inToken, address _outToken) internal view { _swapInTokenCheck(_inToken); _swapOutTokenCheck(_outToken); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.19; import "EnumerableSet.sol"; import "BaseAuthorizer.sol"; /// @title BaseACL - Basic ACL template which uses the call-self trick to perform function and parameters check. /// @author Cobo Safe Dev Team https://www.cobo.com/ /// @dev Steps to extend this: /// 1. Set the NAME and VERSION. /// 2. Write ACL functions according the target contract. /// 3. Add a constructor. eg: /// `constructor(address _owner, address _caller) BaseACL(_owner, _caller) {}` /// 4. Override `contracts()` to only target contracts that you checks. For txn //// whose to address is not in the list `_preExecCheck()` will revert. /// 5. (Optional) If state changing operation in the checking method is required, /// override `_preExecCheck()` to change `staticcall` to `call`. /// 6. (Optional) Override `permissions()` to summary your checking methods. /// /// NOTE for ACL developers: /// 1. Implement your checking functions which should be defined extractly the same as /// the target method to control so you do not bother to write a lot abi.decode code. /// 2. Checking funtions should NOT return any value, use `require` to perform your check. /// 3. BaseACL may serve for multiple target contracts. /// - Implement contracts() to manage the target contracts set. /// - Use `onlyContract` modifier or check `_txn().to` in checking functions. /// 4. Do NOT implement your own `setXXX` function, wrap your data into `Variant` and /// use `setVariant` `getVariant` instead. /// 5. If you still need your own setter, ensure `onlyOwner` is used. abstract contract BaseACL is BaseAuthorizer { using EnumerableSet for EnumerableSet.Bytes32Set; /// @dev Set such constants in sub contract. // bytes32 public constant NAME = "BaseACL"; // bytes32 public constant override TYPE = "ACLType"; // uint256 public constant VERSION = 0; /// Only preExecCheck is used in BaseACL. uint256 public constant flag = AuthFlags.HAS_PRE_CHECK_MASK; constructor(address _owner, address _caller) BaseAuthorizer(_owner, _caller) {} /// Internal functions. function _parseReturnData( bool success, bytes memory revertData ) internal pure returns (AuthorizerReturnData memory authData) { if (success) { // ACL check function should return empty bytes which differs from normal view functions. require(revertData.length == 0, Errors.ACL_FUNC_RETURNS_NON_EMPTY); authData.result = AuthResult.SUCCESS; } else { if (revertData.length < 68) { // 4(Error sig) + 32(offset) + 32(length) authData.message = string(revertData); } else { assembly { // Slice the sighash. revertData := add(revertData, 0x04) } authData.message = abi.decode(revertData, (string)); } } } function _contractCheck(TransactionData calldata transaction) internal virtual returns (bool result) { // This works as a catch-all check. Sample but safer. address to = transaction.to; address[] memory _contracts = contracts(); // Call external. for (uint i = 0; i < _contracts.length; i++) { if (to == _contracts[i]) return true; } return false; } function _packTxn(TransactionData calldata transaction) internal pure virtual returns (bytes memory) { bytes memory txnData = abi.encode(transaction); bytes memory callDataSize = abi.encode(transaction.data.length); return abi.encodePacked(transaction.data, txnData, callDataSize); } function _unpackTxn() internal pure virtual returns (TransactionData memory transaction) { uint256 end = msg.data.length; uint256 callDataSize = abi.decode(msg.data[end - 32:end], (uint256)); transaction = abi.decode(msg.data[callDataSize:], (TransactionData)); } // @dev Only valid in self-call checking functions. function _txn() internal pure virtual returns (TransactionData memory transaction) { return _unpackTxn(); } function _preExecCheck( TransactionData calldata transaction ) internal virtual override returns (AuthorizerReturnData memory authData) { if (!_contractCheck(transaction)) { authData.result = AuthResult.FAILED; authData.message = Errors.NOT_IN_CONTRACT_LIST; return authData; } (bool success, bytes memory revertData) = address(this).staticcall(_packTxn(transaction)); return _parseReturnData(success, revertData); } function _postExecCheck( TransactionData calldata transaction, TransactionResult calldata callResult, AuthorizerReturnData calldata preData ) internal virtual override returns (AuthorizerReturnData memory authData) { authData.result = AuthResult.SUCCESS; } // Internal view functions. // Utilities for checking functions. function _checkRecipient(address _recipient) internal view { require(_recipient == _txn().from, "Invalid recipient"); } function _checkContract(address _contract) internal view { require(_contract == _txn().to, "Invalid contract"); } // Modifiers. modifier onlyContract(address _contract) { _checkContract(_contract); _; } /// External functions /// @dev Implement your own access control checking functions here. // example: // function transfer(address to, uint256 amount) // onlyContract(USDT_ADDR) // external view // { // require(amount > 0 & amount < 10000, "amount not in range"); // } /// @dev Override this as `_preExecCheck` used. /// @notice Target contracts this BaseACL controls. function contracts() public view virtual returns (address[] memory _contracts) {} fallback() external virtual { revert(Errors.METHOD_NOT_ALLOW); } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.19; import "BaseOwnable.sol"; import "Errors.sol"; import "IAuthorizer.sol"; import "IAccount.sol"; import "IRoleManager.sol"; /// @title BaseAuthorizer - A basic pausable authorizer with caller restriction. /// @author Cobo Safe Dev Team https://www.cobo.com/ /// @dev Base contract to extend to implement specific authorizer. abstract contract BaseAuthorizer is IAuthorizer, BaseOwnable { /// @dev Override such constants while extending BaseAuthorizer. bool public paused = false; // Often used for off-chain system. // Each contract instance has its own value. bytes32 public tag = ""; // The caller which is able to call this contract's pre/postExecProcess // and pre/postExecCheck having side-effect. // It is usually the account or the parent authorizer(set) on higher level. address public caller; // This is the account this authorizer works for. // Currently used to lookup `roleManager`. // If not used it is OK to keep it unset. address public account; event CallerSet(address indexed caller); event AccountSet(address indexed account); event TagSet(bytes32 indexed tag); event PausedSet(bool indexed status); constructor(address _owner, address _caller) BaseOwnable(_owner) { caller = _caller; } function initialize(address _owner, address _caller) public { initialize(_owner); caller = _caller; emit CallerSet(_caller); } function initialize(address _owner, address _caller, address _account) public { initialize(_owner, _caller); account = _account; emit AccountSet(_account); } modifier onlyCaller() virtual { require(msg.sender == caller, Errors.INVALID_CALLER); _; } /// @notice Change the caller. /// @param _caller the caller which calls the authorizer. function setCaller(address _caller) external onlyOwner { caller = _caller; emit CallerSet(_caller); } /// @notice Change the account. /// @param _account the account which the authorizer get role manager from. function setAccount(address _account) external onlyOwner { account = _account; emit AccountSet(_account); } /// @notice Change the tag for the contract instance. /// @dev For off-chain index. /// @param _tag the tag function setTag(bytes32 _tag) external onlyOwner { tag = _tag; emit TagSet(_tag); } /// @notice Set the pause status. Authorizer just denies all when paused. /// @param _paused the paused status: true or false. function setPaused(bool _paused) external onlyOwner { paused = _paused; emit PausedSet(_paused); } /// @notice Function check if a transaction can be executed. /// @param transaction Transaction data which contains from,to,value,data,delegate /// @return authData Return check status, error message and hint (if needed) function preExecCheck( TransactionData calldata transaction ) external virtual onlyCaller returns (AuthorizerReturnData memory authData) { if (paused) { authData.result = AuthResult.FAILED; authData.message = Errors.AUTHORIZER_PAUSED; } else { authData = _preExecCheck(transaction); } } /// @notice Check after transaction execution. /// @param transaction Transaction data which contains from,to,value,data,delegate /// @param callResult Transaction call status and return data. function postExecCheck( TransactionData calldata transaction, TransactionResult calldata callResult, AuthorizerReturnData calldata preData ) external virtual onlyCaller returns (AuthorizerReturnData memory authData) { if (paused) { authData.result = AuthResult.FAILED; authData.message = Errors.AUTHORIZER_PAUSED; } else { authData = _postExecCheck(transaction, callResult, preData); } } /// @dev Perform actions before the transaction execution. /// `onlyCaller` check forced here or attacker can call this directly /// to pollute our data. function preExecProcess(TransactionData calldata transaction) external virtual onlyCaller { if (!paused) _preExecProcess(transaction); } /// @dev Perform actions after the transaction execution. /// `onlyCaller` check forced here or attacker can call this directly /// to pollute our data. function postExecProcess( TransactionData calldata transaction, TransactionResult calldata callResult ) external virtual onlyCaller { if (!paused) _postExecProcess(transaction, callResult); } /// @dev Extract the roles of the delegate. If no roleManager set return empty lists. function _authenticate(TransactionData calldata transaction) internal view returns (bytes32[] memory roles) { return _authenticate(transaction.delegate); } function _authenticate(address delegate) internal view returns (bytes32[] memory roles) { require(account != address(0), Errors.ACCOUNT_NOT_SET); address roleManager = IAccount(account).roleManager(); require(roleManager != address(0), Errors.ROLE_MANAGER_NOT_SET); roles = IRoleManager(roleManager).getRoles(delegate); } /// @dev Call `roleManager` to validate the role of delegate. function _hasRole(TransactionData calldata transaction, bytes32 role) internal view returns (bool) { return _hasRole(transaction.delegate, role); } function _hasRole(address delegate, bytes32 role) internal view returns (bool) { require(account != address(0), Errors.ACCOUNT_NOT_SET); address roleManager = IAccount(account).roleManager(); require(roleManager != address(0), Errors.ROLE_MANAGER_NOT_SET); return IRoleManager(roleManager).hasRole(delegate, role); } /// @dev Override this to implement new authorization. /// NOTE: If your check involves side-effect, onlyCaller should be used. function _preExecCheck( TransactionData calldata transaction ) internal virtual returns (AuthorizerReturnData memory authData) {} /// @dev Override this to implement new authorization. function _postExecCheck( TransactionData calldata transaction, TransactionResult calldata callResult, AuthorizerReturnData calldata preData ) internal virtual returns (AuthorizerReturnData memory) {} function _preExecProcess(TransactionData calldata transaction) internal virtual {} function _postExecProcess( TransactionData calldata transaction, TransactionResult calldata callResult ) internal virtual {} /// @dev Override this if you implement new type of authorizer. function TYPE() external view virtual returns (bytes32) { return AuthType.COMMON; } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.19; import "Errors.sol"; import "BaseVersion.sol"; /// @title BaseOwnable - Provides simple ownership access control. /// @author Cobo Safe Dev Team https://www.cobo.com/ /// @dev Can be used in both proxy and non-proxy mode. abstract contract BaseOwnable is BaseVersion { address public owner; address public pendingOwner; bool private initialized = false; event PendingOwnerSet(address indexed to); event NewOwnerSet(address indexed owner); modifier onlyOwner() { require(owner == msg.sender, Errors.CALLER_IS_NOT_OWNER); _; } /// @dev `owner` is set by argument, thus the owner can any address. /// When used in non-proxy mode, `initialize` can not be called /// after deployment. constructor(address _owner) { initialize(_owner); } /// @dev When used in proxy mode, `initialize` can be called by anyone /// to claim the ownership. /// This function can be called only once. function initialize(address _owner) public { require(!initialized, Errors.ALREADY_INITIALIZED); _setOwner(_owner); initialized = true; } /// @notice User should ensure the corrent owner address set, or the /// ownership may be transferred to blackhole. It is recommended to /// take a safer way with setPendingOwner() + acceptOwner(). function transferOwnership(address newOwner) external onlyOwner { require(newOwner != address(0), "New Owner is zero"); _setOwner(newOwner); } /// @notice The original owner calls `setPendingOwner(newOwner)` and the new /// owner calls `acceptOwner()` to take the ownership. function setPendingOwner(address to) external onlyOwner { pendingOwner = to; emit PendingOwnerSet(pendingOwner); } function acceptOwner() external { require(msg.sender == pendingOwner); _setOwner(pendingOwner); } /// @notice Make the contract immutable. function renounceOwnership() external onlyOwner { _setOwner(address(0)); } // Internal functions /// @dev Clear pendingOwner to prevent from reclaiming the ownership. function _setOwner(address _owner) internal { owner = _owner; pendingOwner = address(0); emit NewOwnerSet(owner); } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.19; /// @dev Common errors. This helps reducing the contract size. library Errors { // "E1"; // Call/Static-call failed. string constant CALL_FAILED = "E2"; // Argument's type not supported in View Variant. string constant INVALID_VIEW_ARG_SOL_TYPE = "E3"; // Invalid length for variant raw data. string constant INVALID_VARIANT_RAW_DATA = "E4"; // "E5"; // Invalid variant type. string constant INVALID_VAR_TYPE = "E6"; // Rule not exists string constant RULE_NOT_EXISTS = "E7"; // Variant name not found. string constant VAR_NAME_NOT_FOUND = "E8"; // Rule: v1/v2 solType mismatch string constant SOL_TYPE_MISMATCH = "E9"; // "E10"; // Invalid rule OP. string constant INVALID_RULE_OP = "E11"; // "E12"; // "E13"; // "E14"; // "E15"; // "E16"; // "E17"; // "E18"; // "E19"; // "E20"; // checkCmpOp: OP not support string constant CMP_OP_NOT_SUPPORT = "E21"; // checkBySolType: Invalid op for bool string constant INVALID_BOOL_OP = "E22"; // checkBySolType: Invalid op string constant CHECK_INVALID_OP = "E23"; // Invalid solidity type. string constant INVALID_SOL_TYPE = "E24"; // computeBySolType: invalid vm op string constant INVALID_VM_BOOL_OP = "E25"; // computeBySolType: invalid vm arith op string constant INVALID_VM_ARITH_OP = "E26"; // onlyCaller: Invalid caller string constant INVALID_CALLER = "E27"; // "E28"; // Side-effect is not allowed here. string constant SIDE_EFFECT_NOT_ALLOWED = "E29"; // Invalid variant count for the rule op. string constant INVALID_VAR_COUNT = "E30"; // extractCallData: Invalid op. string constant INVALID_EXTRACTOR_OP = "E31"; // extractCallData: Invalid array index. string constant INVALID_ARRAY_INDEX = "E32"; // extractCallData: No extract op. string constant NO_EXTRACT_OP = "E33"; // extractCallData: No extract path. string constant NO_EXTRACT_PATH = "E34"; // BaseOwnable: caller is not owner string constant CALLER_IS_NOT_OWNER = "E35"; // BaseOwnable: Already initialized string constant ALREADY_INITIALIZED = "E36"; // "E37"; // "E38"; // BaseACL: ACL check method should not return anything. string constant ACL_FUNC_RETURNS_NON_EMPTY = "E39"; // "E40"; // BaseAccount: Invalid delegate. string constant INVALID_DELEGATE = "E41"; // RootAuthorizer: delegateCallAuthorizer not set string constant DELEGATE_CALL_AUTH_NOT_SET = "E42"; // RootAuthorizer: callAuthorizer not set. string constant CALL_AUTH_NOT_SET = "E43"; // BaseAccount: Authorizer not set. string constant AUTHORIZER_NOT_SET = "E44"; // BaseAccount: Invalid authorizer flag. string constant INVALID_AUTHORIZER_FLAG = "E45"; // BaseAuthorizer: Authorizer paused. string constant AUTHORIZER_PAUSED = "E46"; // Authorizer set: Invalid hint. string constant INVALID_HINT = "E47"; // Authorizer set: All auth deny. string constant ALL_AUTH_FAILED = "E48"; // BaseACL: Method not allow. string constant METHOD_NOT_ALLOW = "E49"; // AuthorizerUnionSet: Invalid hint collected. string constant INVALID_HINT_COLLECTED = "E50"; // AuthorizerSet: Empty auth set string constant EMPTY_AUTH_SET = "E51"; // AuthorizerSet: hint not implement. string constant HINT_NOT_IMPLEMENT = "E52"; // RoleAuthorizer: Empty role set string constant EMPTY_ROLE_SET = "E53"; // RoleAuthorizer: No auth for the role string constant NO_AUTH_FOR_THE_ROLE = "E54"; // BaseACL: No in contract white list. string constant NOT_IN_CONTRACT_LIST = "E55"; // BaseACL: Same process not allowed to install twice. string constant SAME_PROCESS_TWICE = "E56"; // BaseAuthorizer: Account not set (then can not find roleManger) string constant ACCOUNT_NOT_SET = "E57"; // BaseAuthorizer: roleManger not set string constant ROLE_MANAGER_NOT_SET = "E58"; }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.19; import "IVersion.sol"; /// @title BaseVersion - Provides version information /// @author Cobo Safe Dev Team https://www.cobo.com/ /// @dev /// Implement NAME() and VERSION() methods according to IVersion interface. /// /// Or just: /// bytes32 public constant NAME = "<Your contract name>"; /// uint256 public constant VERSION = <Your contract version>; /// /// Change the NAME when writing new kind of contract. /// Change the VERSION when upgrading existing contract. abstract contract BaseVersion is IVersion { /// @dev Convert to `string` which looks prettier on Etherscan viewer. function _NAME() external view virtual returns (string memory) { return string(abi.encodePacked(this.NAME())); } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.19; interface IVersion { function NAME() external view returns (bytes32 name); function VERSION() external view returns (uint256 version); }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.19; import "Types.sol"; interface IAuthorizer { function flag() external view returns (uint256 authFlags); function setCaller(address _caller) external; function preExecCheck(TransactionData calldata transaction) external returns (AuthorizerReturnData memory authData); function postExecCheck( TransactionData calldata transaction, TransactionResult calldata callResult, AuthorizerReturnData calldata preAuthData ) external returns (AuthorizerReturnData memory authData); function preExecProcess(TransactionData calldata transaction) external; function postExecProcess(TransactionData calldata transaction, TransactionResult calldata callResult) external; } interface IAuthorizerSupportingHint is IAuthorizer { // When IAuthorizer(auth).flag().supportHint() == true; function collectHint( AuthorizerReturnData calldata preAuthData, AuthorizerReturnData calldata postAuthData ) external view returns (bytes memory hint); }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.19; enum AuthResult { FAILED, SUCCESS } struct CallData { uint256 flag; // 0x1 delegate call, 0x0 call. address to; uint256 value; bytes data; // calldata bytes hint; bytes extra; // for future support: signatures etc. } struct TransactionData { address from; // Sender who performs the transaction a.k.a wallet address. address delegate; // Delegate who calls executeTransactions(). // Same as CallData uint256 flag; // 0x1 delegate call, 0x0 call. address to; uint256 value; bytes data; // calldata bytes hint; bytes extra; } struct AuthorizerReturnData { AuthResult result; string message; bytes data; // Authorizer return data. usually used for hint purpose. } struct TransactionResult { bool success; // Call status. bytes data; // Return/Revert data. bytes hint; } library TxFlags { uint256 internal constant DELEGATE_CALL_MASK = 0x1; // 1 for delegatecall, 0 for call function isDelegateCall(uint256 flag) internal pure returns (bool) { return flag & DELEGATE_CALL_MASK == DELEGATE_CALL_MASK; } } library VarName { bytes5 internal constant TEMP = "temp."; function isTemp(bytes32 name) internal pure returns (bool) { return bytes5(name) == TEMP; } } library AuthType { bytes32 internal constant FUNC = "FunctionType"; bytes32 internal constant TRANSFER = "TransferType"; bytes32 internal constant DEX = "DexType"; bytes32 internal constant LENDING = "LendingType"; bytes32 internal constant COMMON = "CommonType"; bytes32 internal constant SET = "SetType"; bytes32 internal constant VM = "VM"; } library AuthFlags { uint256 internal constant HAS_PRE_CHECK_MASK = 0x1; uint256 internal constant HAS_POST_CHECK_MASK = 0x2; uint256 internal constant HAS_PRE_PROC_MASK = 0x4; uint256 internal constant HAS_POST_PROC_MASK = 0x8; uint256 internal constant SUPPORT_HINT_MASK = 0x40; uint256 internal constant FULL_MODE = HAS_PRE_CHECK_MASK | HAS_POST_CHECK_MASK | HAS_PRE_PROC_MASK | HAS_POST_PROC_MASK; function isValid(uint256 flag) internal pure returns (bool) { // At least one check handler is activated. return hasPreCheck(flag) || hasPostCheck(flag); } function hasPreCheck(uint256 flag) internal pure returns (bool) { return flag & HAS_PRE_CHECK_MASK == HAS_PRE_CHECK_MASK; } function hasPostCheck(uint256 flag) internal pure returns (bool) { return flag & HAS_POST_CHECK_MASK == HAS_POST_CHECK_MASK; } function hasPreProcess(uint256 flag) internal pure returns (bool) { return flag & HAS_PRE_PROC_MASK == HAS_PRE_PROC_MASK; } function hasPostProcess(uint256 flag) internal pure returns (bool) { return flag & HAS_POST_PROC_MASK == HAS_POST_PROC_MASK; } function supportHint(uint256 flag) internal pure returns (bool) { return flag & SUPPORT_HINT_MASK == SUPPORT_HINT_MASK; } } // For Rule VM. // For each VariantType, an extractor should be implement. enum VariantType { INVALID, // Mark for delete. EXTRACT_CALLDATA, // extract calldata by path bytes. NAME, // name for user-defined variant. RAW, // encoded solidity values. VIEW, // staticcall view non-side-effect function and get return value. CALL, // call state changing function and get returned value. RULE, // rule expression. ANY } // How the data should be decoded. enum SolidityType { _invalid, // Mark for delete. _any, _bytes, _bool, ///// START 1 ///// Generated by gen_rulelib.py (start) _address, _uint256, _int256, ///// Generated by gen_rulelib.py (end) ///// END 1 _end } // A common operand in rule. struct Variant { VariantType varType; SolidityType solType; bytes data; } // OpCode for rule expression which returns v0. enum OP { INVALID, // One opnd. VAR, // v1 NOT, // !v1 // Two opnds. // checkBySolType() which returns boolean. EQ, // v1 == v2 NE, // v1 != v2 GT, // v1 > v2 GE, // v1 >= v2 LT, // v1 < v2 LE, // v1 <= v2 IN, // v1 in [...] NOTIN, // v1 not in [...] // computeBySolType() which returns bytes (with same solType) AND, // v1 & v2 OR, // v1 | v2 ADD, // v1 + v2 SUB, // v1 - v2 MUL, // v1 * v2 DIV, // v1 / v2 MOD, // v1 % v2 // Three opnds. IF, // v1? v2: v3 // Side-effect ones. ASSIGN, // v1 := v2 VM, // rule list bytes. NOP // as end. } struct Rule { OP op; Variant[] vars; }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.19; import "Types.sol"; interface IAccount { /// @notice Call Gnosis Safe to execute a transaction /// @dev Delegates can call this method to invoke gnosis safe to forward to /// transaction to target contract /// The function can only be called by delegates. /// @param callData The callData to be called by Gnosis Safe function execTransaction(CallData calldata callData) external returns (TransactionResult memory result); function execTransactions( CallData[] calldata callDataList ) external returns (TransactionResult[] memory resultList); function setAuthorizer(address _authorizer) external; function setRoleManager(address _roleManager) external; function addDelegate(address _delegate) external; function addDelegates(address[] calldata _delegates) external; /// @dev Sub instance should override this to set `from` for transaction /// @return account The address for the contract wallet, also the /// `msg.sender` address which send the transaction. function getAccountAddress() external view returns (address account); function roleManager() external view returns (address _roleManager); function authorizer() external view returns (address _authorizer); }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.19; import "Types.sol"; interface IRoleManager { function getRoles(address delegate) external view returns (bytes32[] memory); function hasRole(address delegate, bytes32 role) external view returns (bool); } interface IFlatRoleManager is IRoleManager { function addRoles(bytes32[] calldata roles) external; function grantRoles(bytes32[] calldata roles, address[] calldata delegates) external; function revokeRoles(bytes32[] calldata roles, address[] calldata delegates) external; function getDelegates() external view returns (address[] memory); function getAllRoles() external view returns (bytes32[] memory); }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.19; address constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; address constant ZERO_ADDRESS = address(0); function getWrappedTokenAddress() view returns (address tokenAddress) { uint256 chainId = block.chainid; // ETH: WETH if (chainId == 1) return 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; // Optimism: WETH if (chainId == 10) return 0x4200000000000000000000000000000000000006; // BSC: WBNB if (chainId == 56) return 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c; // Polygon: WMATIC if (chainId == 137) return 0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270; // Arbitrum: WETH if (chainId == 42161) return 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1; // Avalanche: WAVAX if (chainId == 43114) return 0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7; revert("Unsupport chain"); }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.19; // From https://etherscan.io/address/0x6e8b66CC92fCD7fE1332664182BEB1161DBFc82d#code library Utils { address private constant ETH_ADDRESS = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); uint256 private constant MAX_UINT = type(uint256).max; /** * @param fromToken Address of the source token * @param fromAmount Amount of source tokens to be swapped * @param toAmount Minimum destination token amount expected out of this swap * @param expectedAmount Expected amount of destination tokens without slippage * @param beneficiary Beneficiary address * 0 then 100% will be transferred to beneficiary. Pass 10000 for 100% * @param path Route to be taken for this swap to take place */ struct SellData { address fromToken; uint256 fromAmount; uint256 toAmount; uint256 expectedAmount; address payable beneficiary; Utils.Path[] path; address payable partner; uint256 feePercent; bytes permit; uint256 deadline; bytes16 uuid; } struct BuyData { address adapter; address fromToken; address toToken; uint256 fromAmount; uint256 toAmount; uint256 expectedAmount; address payable beneficiary; Utils.Route[] route; address payable partner; uint256 feePercent; bytes permit; uint256 deadline; bytes16 uuid; } struct MegaSwapSellData { address fromToken; uint256 fromAmount; uint256 toAmount; uint256 expectedAmount; address payable beneficiary; Utils.MegaSwapPath[] path; address payable partner; uint256 feePercent; bytes permit; uint256 deadline; bytes16 uuid; } struct SimpleData { address fromToken; address toToken; uint256 fromAmount; uint256 toAmount; uint256 expectedAmount; address[] callees; bytes exchangeData; uint256[] startIndexes; uint256[] values; address payable beneficiary; address payable partner; uint256 feePercent; bytes permit; uint256 deadline; bytes16 uuid; } struct Adapter { address payable adapter; uint256 percent; uint256 networkFee; //NOT USED Route[] route; } struct Route { uint256 index; //Adapter at which index needs to be used address targetExchange; uint256 percent; bytes payload; uint256 networkFee; //NOT USED - Network fee is associated with 0xv3 trades } struct MegaSwapPath { uint256 fromAmountPercent; Path[] path; } struct Path { address to; uint256 totalNetworkFee; //NOT USED - Network fee is associated with 0xv3 trades Adapter[] adapters; } function ethAddress() internal pure returns (address) { return ETH_ADDRESS; } function maxUint() internal pure returns (uint256) { return MAX_UINT; } }
{ "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 200 }, "libraries": { "ParaswapBotAuthorizer.sol": {} }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_caller","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AccountSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"CallerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"NewOwnerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"PausedSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"PendingOwnerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"SwapInTokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"SwapInTokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"SwapOutTokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"SwapOutTokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"tag","type":"bytes32"}],"name":"TagSet","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TYPE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"account","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"addSwapInTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"addSwapOutTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"weth","type":"address"},{"internalType":"uint256[]","name":"pools","type":"uint256[]"}],"name":"buyOnUniswapV2Fork","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"caller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contracts","outputs":[{"internalType":"address[]","name":"_contracts","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flag","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSwapInTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSwapOutTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"hasSwapInToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"hasSwapOutToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_caller","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_caller","type":"address"},{"internalType":"address","name":"_account","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"},{"internalType":"uint256","name":"toAmount","type":"uint256"},{"internalType":"uint256","name":"expectedAmount","type":"uint256"},{"internalType":"address payable","name":"beneficiary","type":"address"},{"components":[{"internalType":"uint256","name":"fromAmountPercent","type":"uint256"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"totalNetworkFee","type":"uint256"},{"components":[{"internalType":"address payable","name":"adapter","type":"address"},{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"networkFee","type":"uint256"},{"components":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"targetExchange","type":"address"},{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"uint256","name":"networkFee","type":"uint256"}],"internalType":"struct Utils.Route[]","name":"route","type":"tuple[]"}],"internalType":"struct Utils.Adapter[]","name":"adapters","type":"tuple[]"}],"internalType":"struct Utils.Path[]","name":"path","type":"tuple[]"}],"internalType":"struct Utils.MegaSwapPath[]","name":"path","type":"tuple[]"},{"internalType":"address payable","name":"partner","type":"address"},{"internalType":"uint256","name":"feePercent","type":"uint256"},{"internalType":"bytes","name":"permit","type":"bytes"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes16","name":"uuid","type":"bytes16"}],"internalType":"struct Utils.MegaSwapSellData","name":"data","type":"tuple"}],"name":"megaSwap","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"},{"internalType":"uint256","name":"toAmount","type":"uint256"},{"internalType":"uint256","name":"expectedAmount","type":"uint256"},{"internalType":"address payable","name":"beneficiary","type":"address"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"totalNetworkFee","type":"uint256"},{"components":[{"internalType":"address payable","name":"adapter","type":"address"},{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"networkFee","type":"uint256"},{"components":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"targetExchange","type":"address"},{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"uint256","name":"networkFee","type":"uint256"}],"internalType":"struct Utils.Route[]","name":"route","type":"tuple[]"}],"internalType":"struct Utils.Adapter[]","name":"adapters","type":"tuple[]"}],"internalType":"struct Utils.Path[]","name":"path","type":"tuple[]"},{"internalType":"address payable","name":"partner","type":"address"},{"internalType":"uint256","name":"feePercent","type":"uint256"},{"internalType":"bytes","name":"permit","type":"bytes"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes16","name":"uuid","type":"bytes16"}],"internalType":"struct Utils.SellData","name":"data","type":"tuple"}],"name":"multiSwap","outputs":[],"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":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"delegate","type":"address"},{"internalType":"uint256","name":"flag","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"hint","type":"bytes"},{"internalType":"bytes","name":"extra","type":"bytes"}],"internalType":"struct TransactionData","name":"transaction","type":"tuple"},{"components":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"hint","type":"bytes"}],"internalType":"struct TransactionResult","name":"callResult","type":"tuple"},{"components":[{"internalType":"enum AuthResult","name":"result","type":"uint8"},{"internalType":"string","name":"message","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct AuthorizerReturnData","name":"preData","type":"tuple"}],"name":"postExecCheck","outputs":[{"components":[{"internalType":"enum AuthResult","name":"result","type":"uint8"},{"internalType":"string","name":"message","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct AuthorizerReturnData","name":"authData","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"delegate","type":"address"},{"internalType":"uint256","name":"flag","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"hint","type":"bytes"},{"internalType":"bytes","name":"extra","type":"bytes"}],"internalType":"struct TransactionData","name":"transaction","type":"tuple"},{"components":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"hint","type":"bytes"}],"internalType":"struct TransactionResult","name":"callResult","type":"tuple"}],"name":"postExecProcess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"delegate","type":"address"},{"internalType":"uint256","name":"flag","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"hint","type":"bytes"},{"internalType":"bytes","name":"extra","type":"bytes"}],"internalType":"struct TransactionData","name":"transaction","type":"tuple"}],"name":"preExecCheck","outputs":[{"components":[{"internalType":"enum AuthResult","name":"result","type":"uint8"},{"internalType":"string","name":"message","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct AuthorizerReturnData","name":"authData","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"delegate","type":"address"},{"internalType":"uint256","name":"flag","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"hint","type":"bytes"},{"internalType":"bytes","name":"extra","type":"bytes"}],"internalType":"struct TransactionData","name":"transaction","type":"tuple"}],"name":"preExecProcess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"removeSwapInTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"removeSwapOutTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"setAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_caller","type":"address"}],"name":"setCaller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"setPendingOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_tag","type":"bytes32"}],"name":"setTag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"},{"internalType":"uint256","name":"toAmount","type":"uint256"},{"internalType":"uint256","name":"expectedAmount","type":"uint256"},{"internalType":"address[]","name":"callees","type":"address[]"},{"internalType":"bytes","name":"exchangeData","type":"bytes"},{"internalType":"uint256[]","name":"startIndexes","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"address payable","name":"beneficiary","type":"address"},{"internalType":"address payable","name":"partner","type":"address"},{"internalType":"uint256","name":"feePercent","type":"uint256"},{"internalType":"bytes","name":"permit","type":"bytes"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes16","name":"uuid","type":"bytes16"}],"internalType":"struct Utils.SimpleData","name":"data","type":"tuple"}],"name":"simpleBuy","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"},{"internalType":"uint256","name":"toAmount","type":"uint256"},{"internalType":"uint256","name":"expectedAmount","type":"uint256"},{"internalType":"address[]","name":"callees","type":"address[]"},{"internalType":"bytes","name":"exchangeData","type":"bytes"},{"internalType":"uint256[]","name":"startIndexes","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"address payable","name":"beneficiary","type":"address"},{"internalType":"address payable","name":"partner","type":"address"},{"internalType":"uint256","name":"feePercent","type":"uint256"},{"internalType":"bytes","name":"permit","type":"bytes"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes16","name":"uuid","type":"bytes16"}],"internalType":"struct Utils.SimpleData","name":"data","type":"tuple"}],"name":"simpleSwap","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"weth","type":"address"},{"internalType":"uint256[]","name":"pools","type":"uint256[]"}],"name":"swapOnUniswapV2Fork","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tag","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526001805461ffff60a01b19169055600060025573def171fe48cf0115b1d80b88dc8eab59176fee5760805262000039620000b6565b6001600160a01b031660a0523480156200005257600080fd5b5060405162002e2e38038062002e2e8339810160408190526200007591620002ae565b818181818181816200008781620001d3565b50600380546001600160a01b0319166001600160a01b0392909216919091179055506200033695505050505050565b6000466001819003620000de5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc291505090565b80600a03620001025773420000000000000000000000000000000000000691505090565b80603803620001265773bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c91505090565b806089036200014a57730d500b1d8e8ef31e21c99d1db9a6444d3adf127091505090565b8061a4b1036200016f577382af49447d8a07e3bd95bd0d56f35241523fbab191505090565b8061a86a03620001945773b31f66aa3c1e785363f0875a1b74e27b85fd66c791505090565b60405162461bcd60e51b815260206004820152600f60248201526e2ab739bab83837b93a1031b430b4b760891b60448201526064015b60405180910390fd5b60015460408051808201909152600381526222999b60e91b602082015290600160a01b900460ff16156200021c5760405162461bcd60e51b8152600401620001ca9190620002e6565b5062000228816200023e565b506001805460ff60a01b1916600160a01b179055565b600080546001600160a01b0383166001600160a01b0319918216811783556001805490921690915560405190917f038720101b9ced74445432ced46c7e5e4c80202669153dd67d226c66a0aa477b91a250565b80516001600160a01b0381168114620002a957600080fd5b919050565b60008060408385031215620002c257600080fd5b620002cd8362000291565b9150620002dd6020840162000291565b90509250929050565b600060208083528351808285015260005b818110156200031557858101830151858201604001528201620002f7565b506000604082860101526040601f19601f8301168501019250505092915050565b60805160a051612ab662000378600039600081816104e601528181611374015281816113e9015261158401526000818161033c0152610b060152612ab66000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c80638da5cb5b11610151578063beb92f55116100c3578063e30c397811610087578063e30c39781461058b578063ebbc49651461059e578063f2660027146105a6578063f2fde38b146105b9578063fc9c8d39146105cc578063ffa1ad741461043b57610269565b8063beb92f551461052c578063c0c53b8b1461053f578063c42069ec14610552578063c4d66de814610565578063d58c3fc31461057857610269565b8063a3f4df7e11610115578063a3f4df7e146104af578063a94e78ef146104ce578063ad5c4648146104e1578063b2f1e6db146102c1578063b695e2ef14610508578063bb24fe8a1461051b57610269565b80638da5cb5b146104435780639326bc5e14610456578063935532bb1461046957806397bd65a81461047c5780639d5228e81461048f57610269565b8063485cc955116101ea5780636c0f79b6116101ae5780636c0f79b6146103fd578063712beb0914610405578063715018a61461040d5780637c4c833b1461041557806384c76c7c14610428578063890eba681461043b57610269565b8063485cc9551461039c57806351f91066146103af57806354e3f31b146102fe5780635c975abb146103c65780635dab2420146103ea57610269565b80632506065011610231578063250606501461031157806329f6d57c1461032457806332fe7b261461033757806342905ba91461037657806346c67b6d1461038957610269565b806308dbebf6146102a35780630b86a4c1146102c157806316c38b3c146102d657806316ea5c5d146102e95780632298207a146102fe575b604080518082018252600381526245343960e81b6020820152905162461bcd60e51b815261029a9190600401611d57565b60405180910390fd5b6102ab6105df565b6040516102b89190611d57565b60405180910390f35b6102d46102cf366004611dd5565b610669565b005b6102d46102e4366004611e50565b61067d565b6102f161070d565b6040516102b89190611e72565b6102d461030c366004611ebf565b61071e565b6102d461031f366004611efa565b610760565b6102d4610332366004611f3b565b61083a565b61035e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102b8565b6102d4610384366004611efa565b6108cb565b6102d4610397366004611f71565b6109a0565b6102d46103aa366004611fa5565b610a8e565b6103b860025481565b6040519081526020016102b8565b6001546103da90600160a81b900460ff1681565b60405190151581526020016102b8565b60045461035e906001600160a01b031681565b6102f1610ae2565b6102f1610b5b565b6102d4610b67565b6102d4610423366004612003565b610bba565b6102d4610436366004611efa565b610c1b565b6103b8600181565b60005461035e906001600160a01b031681565b6103da610464366004611f3b565b610cf0565b6102d4610477366004611efa565b610d03565b6103da61048a366004611f3b565b610dd8565b6104a261049d366004612066565b610de5565b6040516102b891906120ed565b6103b8742830b930b9bbb0b82137ba20baba3437b934bd32b960591b81565b6102d46104dc366004611f71565b610ea1565b61035e7f000000000000000000000000000000000000000000000000000000000000000081565b6102d4610516366004612159565b610f1e565b6103b8664465785479706560c81b81565b6102d461053a366004611f3b565b610f98565b6102d461054d366004612172565b611029565b6102d4610560366004611f3b565b61107f565b6102d4610573366004611f3b565b611110565b6102d46105863660046121bd565b611176565b60015461035e906001600160a01b031681565b6102d46111d0565b6104a26105b43660046121bd565b6111fc565b6102d46105c7366004611f3b565b6112b1565b60035461035e906001600160a01b031681565b6060306001600160a01b031663a3f4df7e6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561061f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064391906121f1565b60405160200161065591815260200190565b604051602081830303815290604052905090565b6106758684848461134b565b505050505050565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b031633146106c35760405162461bcd60e51b815260040161029a9190611d57565b506001805460ff60a81b1916600160a81b831515908102919091179091556040517f40db37ff5c0bdc2c427fbb2078c8f24afea940abac0e3c23bb4ea3bf2da2b21290600090a250565b6060610719600561161e565b905090565b61074361072e6020830183611f3b565b61073e6040840160208501611f3b565b61162b565b61075d61075861014083016101208401611f3b565b61163d565b50565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b031633146107a65760405162461bcd60e51b815260040161029a9190611d57565b5060005b818110156108355760008383838181106107c6576107c661220a565b90506020020160208101906107db9190611f3b565b90506107e86005826116a8565b15610822576040516001600160a01b038216907f11d761ef41dc70cdaee3d0610189711c62da37a797d661034f0986f14399b06f90600090a25b508061082d81612236565b9150506107aa565b505050565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b031633146108805760405162461bcd60e51b815260040161029a9190611d57565b50600480546001600160a01b0319166001600160a01b0383169081179091556040517f195359283029fbdb9a24519b1ec07caf1677655529bf99dc1634c1e8b288118090600090a250565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b031633146109115760405162461bcd60e51b815260040161029a9190611d57565b5060005b818110156108355760008383838181106109315761093161220a565b90506020020160208101906109469190611f3b565b90506109536007826116a8565b1561098d576040516001600160a01b038216907f79f0e54b3eae4cd6491b0a5038f048490bcec1e21b97818b8302cf5587066ee690600090a25b508061099881612236565b915050610915565b60006109af6020830183611f3b565b9050600036816109c260a086018661224f565b91509150818160008181106109d9576109d961220a565b90506020028101906109eb9190612298565b6109f990602081019061224f565b600184846000818110610a0e57610a0e61220a565b9050602002810190610a209190612298565b610a2e90602081019061224f565b610a399291506122b8565b818110610a4857610a4861220a565b9050602002810190610a5a91906122cb565b610a68906020810190611f3b565b9250610a74848461162b565b610a8761075860a0870160808801611f3b565b5050505050565b610a9782611110565b600380546001600160a01b0319166001600160a01b0383169081179091556040517fac431eb831269b53b41991f6cbfbfc93f4baa395996a8170abac93962b5a358e90600090a25050565b604080516001808252818301909252606091602080830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110610b3857610b3861220a565b60200260200101906001600160a01b031690816001600160a01b03168152505090565b6060610719600761161e565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b03163314610bad5760405162461bcd60e51b815260040161029a9190611d57565b50610bb860006116bd565b565b60038054604080518082019091529182526245323760e81b60208301526001600160a01b03163314610bff5760405162461bcd60e51b815260040161029a9190611d57565b50600154600160a81b900460ff16610c1757610c1782825b5050565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b03163314610c615760405162461bcd60e51b815260040161029a9190611d57565b5060005b81811015610835576000838383818110610c8157610c8161220a565b9050602002016020810190610c969190611f3b565b9050610ca3600782611710565b15610cdd576040516001600160a01b038216907f67bb215b6aed7cca18e965f9b5088e24f9a2dd29dabd4e5c5e786462275adf2b90600090a25b5080610ce881612236565b915050610c65565b6000610cfd600583611725565b92915050565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b03163314610d495760405162461bcd60e51b815260040161029a9190611d57565b5060005b81811015610835576000838383818110610d6957610d6961220a565b9050602002016020810190610d7e9190611f3b565b9050610d8b600582611710565b15610dc5576040516001600160a01b038216907fec44f51830691f58dcfc9f96d0c988a4d599bcef0b7768f4a24c4ecec8faa74290600090a25b5080610dd081612236565b915050610d4d565b6000610cfd600783611725565b610e0a6040805160608101909152806000815260200160608152602001606081525090565b60038054604080518082019091529182526245323760e81b60208301526001600160a01b03163314610e4f5760405162461bcd60e51b815260040161029a9190611d57565b50600154600160a81b900460ff1615610e8c5760008152604080518082019091526003815262229a1b60e91b602080830191909152820152610e9a565b610e97848484611747565b90505b9392505050565b6000610eb06020830183611f3b565b90506000610ec160a084018461224f565b610eca91612456565b905060008160018351610edd91906122b8565b81518110610eed57610eed61220a565b6020026020010151600001519050610f05838261162b565b610f1861075860a0860160808701611f3b565b50505050565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b03163314610f645760405162461bcd60e51b815260040161029a9190611d57565b50600281905560405181907fef711e3eb06966d227e22eb4fa0302550dcd7257cf69b537cf4d37af53ea9cda90600090a250565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b03163314610fde5760405162461bcd60e51b815260040161029a9190611d57565b50600380546001600160a01b0319166001600160a01b0383169081179091556040517fac431eb831269b53b41991f6cbfbfc93f4baa395996a8170abac93962b5a358e90600090a250565b6110338383610a8e565b600480546001600160a01b0319166001600160a01b0383169081179091556040517f195359283029fbdb9a24519b1ec07caf1677655529bf99dc1634c1e8b288118090600090a2505050565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b031633146110c55760405162461bcd60e51b815260040161029a9190611d57565b50600180546001600160a01b0319166001600160a01b0383169081179091556040517f68f49b346b94582a8b5f9d10e3fe3365318fe8f191ff8dce7c59c6cad06b02f590600090a250565b60015460408051808201909152600381526222999b60e91b602082015290600160a01b900460ff16156111565760405162461bcd60e51b815260040161029a9190611d57565b50611160816116bd565b506001805460ff60a01b1916600160a01b179055565b60038054604080518082019091529182526245323760e81b60208301526001600160a01b031633146111bb5760405162461bcd60e51b815260040161029a9190611d57565b50600154600160a81b900460ff1661075d5750565b6001546001600160a01b031633146111e757600080fd5b600154610bb8906001600160a01b03166116bd565b6112216040805160608101909152806000815260200160608152602001606081525090565b60038054604080518082019091529182526245323760e81b60208301526001600160a01b031633146112665760405162461bcd60e51b815260040161029a9190611d57565b50600154600160a81b900460ff16156112a35760008152604080518082019091526003815262229a1b60e91b602080830191909152820152919050565b610cfd82611777565b919050565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b031633146112f75760405162461bcd60e51b815260040161029a9190611d57565b506001600160a01b0381166113425760405162461bcd60e51b81526020600482015260116024820152704e6577204f776e6572206973207a65726f60781b604482015260640161029a565b61075d816116bd565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b038616016113e7577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316146113e25760405162461bcd60e51b815260206004820152600c60248201526b092dcecc2d8d2c840ae8aa8960a31b604482015260640161029a565b611477565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316148061142e57506001600160a01b038416155b6114695760405162461bcd60e51b815260206004820152600c60248201526b092dcecc2d8d2c840ae8aa8960a31b604482015260640161029a565b506001600160a01b03831615155b600083836114866001826122b8565b8181106114955761149561220a565b60200291909101359150819050600160a01b81161560008161151857826001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151391906126c9565b61157a565b826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611556573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157a91906126c9565b90508415611609577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316146115f25760405162461bcd60e51b815260206004820152600c60248201526b125b9d985b1a59081c1bdbdb60a21b604482015260640161029a565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b611613898261162b565b505050505050505050565b60606000610e9a83611844565b611634826118a0565b610c17816118ec565b6001600160a01b03811615806116665750611656611939565b516001600160a01b038281169116145b61075d5760405162461bcd60e51b8152602060048201526013602482015272496e76616c69642062656e656669636961727960681b604482015260640161029a565b6000610e9a836001600160a01b038416611949565b600080546001600160a01b0383166001600160a01b0319918216811783556001805490921690915560405190917f038720101b9ced74445432ced46c7e5e4c80202669153dd67d226c66a0aa477b91a250565b6000610e9a836001600160a01b038416611a3c565b6001600160a01b03811660009081526001830160205260408120541515610e9a565b61176c6040805160608101909152806000815260200160608152602001606081525090565b600181529392505050565b61179c6040805160608101909152806000815260200160608152602001606081525090565b6117a582611a8b565b6117d3576000815260408051808201909152600381526245353560e81b602080830191909152820152919050565b600080306117e085611b12565b6040516117ed91906126e6565b600060405180830381855afa9150503d8060008114611828576040519150601f19603f3d011682016040523d82523d6000602084013e61182d565b606091505b509150915061183c8282611ba8565b949350505050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561189457602002820191906000526020600020905b815481526020019060010190808311611880575b50505050509050919050565b6118a981610cf0565b61075d5760405162461bcd60e51b8152602060048201526014602482015273125b881d1bdad95b881b9bdd08185b1b1bddd95960621b604482015260640161029a565b6118f581610dd8565b61075d5760405162461bcd60e51b815260206004820152601560248201527413dd5d081d1bdad95b881b9bdd08185b1b1bddd959605a1b604482015260640161029a565b611941611ca7565b610719611c53565b60008181526001830160205260408120548015611a3257600061196d6001836122b8565b8554909150600090611981906001906122b8565b90508181146119e65760008660000182815481106119a1576119a161220a565b90600052602060002001549050808760000184815481106119c4576119c461220a565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806119f7576119f76126f8565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610cfd565b6000915050610cfd565b6000818152600183016020526040812054611a8357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610cfd565b506000610cfd565b600080611a9e6080840160608501611f3b565b90506000611aaa610ae2565b905060005b8151811015611b0757818181518110611aca57611aca61220a565b60200260200101516001600160a01b0316836001600160a01b031603611af557506001949350505050565b80611aff81612236565b915050611aaf565b506000949350505050565b6060600082604051602001611b27919061277c565b60408051601f1981840301815291905290506000611b4860a085018561286c565b604051611b5c925060200190815260200190565b60408051601f198184030181529190529050611b7b60a085018561286c565b8383604051602001611b9094939291906128b2565b60405160208183030381529060405292505050919050565b611bcd6040805160608101909152806000815260200160608152602001606081525090565b8215611c1857815160408051808201909152600381526245333960e81b60208201529015611c0e5760405162461bcd60e51b815260040161029a9190611d57565b5060018152610cfd565b604482511015611c2e5760208101829052610cfd565b60048201915081806020019051810190611c4891906128ed565b602082015292915050565b611c5b611ca7565b3660008082611c6b6020826122b8565b611c779285929061295a565b810190611c849190612159565b9050611c93368281600061295a565b810190611ca09190612984565b9250505090565b60405180610100016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160006001600160a01b03168152602001600081526020016060815260200160608152602001606081525090565b60005b83811015611d22578181015183820152602001611d0a565b50506000910152565b60008151808452611d43816020860160208601611d07565b601f01601f19169290920160200192915050565b602081526000610e9a6020830184611d2b565b6001600160a01b038116811461075d57600080fd5b80356112ac81611d6a565b60008083601f840112611d9c57600080fd5b5081356001600160401b03811115611db357600080fd5b6020830191508360208260051b8501011115611dce57600080fd5b9250929050565b60008060008060008060a08789031215611dee57600080fd5b8635611df981611d6a565b955060208701359450604087013593506060870135611e1781611d6a565b925060808701356001600160401b03811115611e3257600080fd5b611e3e89828a01611d8a565b979a9699509497509295939492505050565b600060208284031215611e6257600080fd5b81358015158114610e9a57600080fd5b6020808252825182820181905260009190848201906040850190845b81811015611eb35783516001600160a01b031683529284019291840191600101611e8e565b50909695505050505050565b600060208284031215611ed157600080fd5b81356001600160401b03811115611ee757600080fd5b82016101e08185031215610e9a57600080fd5b60008060208385031215611f0d57600080fd5b82356001600160401b03811115611f2357600080fd5b611f2f85828601611d8a565b90969095509350505050565b600060208284031215611f4d57600080fd5b8135610e9a81611d6a565b60006101608284031215611f6b57600080fd5b50919050565b600060208284031215611f8357600080fd5b81356001600160401b03811115611f9957600080fd5b61183c84828501611f58565b60008060408385031215611fb857600080fd5b8235611fc381611d6a565b91506020830135611fd381611d6a565b809150509250929050565b60006101008284031215611f6b57600080fd5b600060608284031215611f6b57600080fd5b6000806040838503121561201657600080fd5b82356001600160401b038082111561202d57600080fd5b61203986838701611fde565b9350602085013591508082111561204f57600080fd5b5061205c85828601611ff1565b9150509250929050565b60008060006060848603121561207b57600080fd5b83356001600160401b038082111561209257600080fd5b61209e87838801611fde565b945060208601359150808211156120b457600080fd5b6120c087838801611ff1565b935060408601359150808211156120d657600080fd5b506120e386828701611ff1565b9150509250925092565b60208152600082516002811061211357634e487b7160e01b600052602160045260246000fd5b806020840152506020830151606060408401526121336080840182611d2b565b90506040840151601f198483030160608501526121508282611d2b565b95945050505050565b60006020828403121561216b57600080fd5b5035919050565b60008060006060848603121561218757600080fd5b833561219281611d6a565b925060208401356121a281611d6a565b915060408401356121b281611d6a565b809150509250925092565b6000602082840312156121cf57600080fd5b81356001600160401b038111156121e557600080fd5b61183c84828501611fde565b60006020828403121561220357600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161224857612248612220565b5060010190565b6000808335601e1984360301811261226657600080fd5b8301803591506001600160401b0382111561228057600080fd5b6020019150600581901b3603821315611dce57600080fd5b60008235603e198336030181126122ae57600080fd5b9190910192915050565b81810381811115610cfd57610cfd612220565b60008235605e198336030181126122ae57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715612319576123196122e1565b60405290565b604051608081016001600160401b0381118282101715612319576123196122e1565b60405160a081016001600160401b0381118282101715612319576123196122e1565b60405161010081016001600160401b0381118282101715612319576123196122e1565b604051601f8201601f191681016001600160401b03811182821017156123ae576123ae6122e1565b604052919050565b60006001600160401b038211156123cf576123cf6122e1565b5060051b60200190565b60006001600160401b038211156123f2576123f26122e1565b50601f01601f191660200190565b600082601f83011261241157600080fd5b813561242461241f826123d9565b612386565b81815284602083860101111561243957600080fd5b816020850160208301376000918101602001919091529392505050565b600061246461241f846123b6565b838152602081019036600586901b8501111561247f57600080fd5b835b8560051b85018110156126c0576001600160401b0380823511156124a457600080fd5b81358601606081360312156124b857600080fd5b6124c06122f7565b6124ca8235611d6a565b813581526020820135602082015282604083013511156124e957600080fd5b60408201358201915036601f83011261250157600080fd5b61250e61241f83356123b6565b82358082526020808301929160051b8501013681111561252d57600080fd5b602085015b818110156126a857868135111561254857600080fd5b803586016080601f1982360301121561256057600080fd5b61256861231f565b6125756020830135611d6a565b60208201358152604082013560208201526060820135604082015288608083013511156125a157600080fd5b60808201358201915036603f8301126125b957600080fd5b60208201356125ca61241f826123b6565b81815260059190911b8301604001906020810190368311156125eb57600080fd5b604085015b83811015612691578c8135111561260657600080fd5b8035860160a0603f1982360301121561261e57600080fd5b612626612341565b6040820135815261263a6060830135611d6a565b60608201356020820152608082013560408201528e60a0830135111561265f57600080fd5b61267236604060a0850135850101612400565b606082015260c0919091013560808201528352602092830192016125f0565b506060840152505085525060209384019301612532565b50506040830152508552505060209283019201612481565b50949350505050565b6000602082840312156126db57600080fd5b8151610e9a81611d6a565b600082516122ae818460208701611d07565b634e487b7160e01b600052603160045260246000fd5b6000808335601e1984360301811261272557600080fd5b83016020810192503590506001600160401b0381111561274457600080fd5b803603821315611dce57600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815261279d6020820161279084611d7f565b6001600160a01b03169052565b60006127ab60208401611d7f565b6001600160a01b038116604084015250604083013560608301526127d160608401611d7f565b6001600160a01b038116608084015250608083013560a08301526127f860a084018461270e565b6101008060c086015261281061012086018385612753565b925061281f60c087018761270e565b9250601f19808786030160e0880152612839858584612753565b945061284860e089018961270e565b9450915080878603018388015250612861848483612753565b979650505050505050565b6000808335601e1984360301811261288357600080fd5b8301803591506001600160401b0382111561289d57600080fd5b602001915036819003821315611dce57600080fd5b8385823760008482016000815284516128cf818360208901611d07565b84519101906128e2818360208801611d07565b019695505050505050565b6000602082840312156128ff57600080fd5b81516001600160401b0381111561291557600080fd5b8201601f8101841361292657600080fd5b805161293461241f826123d9565b81815285602083850101111561294957600080fd5b612150826020830160208601611d07565b6000808585111561296a57600080fd5b8386111561297757600080fd5b5050820193919092039150565b60006020828403121561299657600080fd5b81356001600160401b03808211156129ad57600080fd5b9083019061010082860312156129c257600080fd5b6129ca612363565b6129d383611d7f565b81526129e160208401611d7f565b6020820152604083013560408201526129fc60608401611d7f565b60608201526080830135608082015260a083013582811115612a1d57600080fd5b612a2987828601612400565b60a08301525060c083013582811115612a4157600080fd5b612a4d87828601612400565b60c08301525060e083013582811115612a6557600080fd5b612a7187828601612400565b60e0830152509594505050505056fea264697066735822122018832123aa435358b36870934cea2e4cce970b45de568e1e29b7b15488e75a6564736f6c6343000813003300000000000000000000000089635b6dc339ff219c53ef8a7c53af3368decabb00000000000000000000000089635b6dc339ff219c53ef8a7c53af3368decabb
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102695760003560e01c80638da5cb5b11610151578063beb92f55116100c3578063e30c397811610087578063e30c39781461058b578063ebbc49651461059e578063f2660027146105a6578063f2fde38b146105b9578063fc9c8d39146105cc578063ffa1ad741461043b57610269565b8063beb92f551461052c578063c0c53b8b1461053f578063c42069ec14610552578063c4d66de814610565578063d58c3fc31461057857610269565b8063a3f4df7e11610115578063a3f4df7e146104af578063a94e78ef146104ce578063ad5c4648146104e1578063b2f1e6db146102c1578063b695e2ef14610508578063bb24fe8a1461051b57610269565b80638da5cb5b146104435780639326bc5e14610456578063935532bb1461046957806397bd65a81461047c5780639d5228e81461048f57610269565b8063485cc955116101ea5780636c0f79b6116101ae5780636c0f79b6146103fd578063712beb0914610405578063715018a61461040d5780637c4c833b1461041557806384c76c7c14610428578063890eba681461043b57610269565b8063485cc9551461039c57806351f91066146103af57806354e3f31b146102fe5780635c975abb146103c65780635dab2420146103ea57610269565b80632506065011610231578063250606501461031157806329f6d57c1461032457806332fe7b261461033757806342905ba91461037657806346c67b6d1461038957610269565b806308dbebf6146102a35780630b86a4c1146102c157806316c38b3c146102d657806316ea5c5d146102e95780632298207a146102fe575b604080518082018252600381526245343960e81b6020820152905162461bcd60e51b815261029a9190600401611d57565b60405180910390fd5b6102ab6105df565b6040516102b89190611d57565b60405180910390f35b6102d46102cf366004611dd5565b610669565b005b6102d46102e4366004611e50565b61067d565b6102f161070d565b6040516102b89190611e72565b6102d461030c366004611ebf565b61071e565b6102d461031f366004611efa565b610760565b6102d4610332366004611f3b565b61083a565b61035e7f000000000000000000000000def171fe48cf0115b1d80b88dc8eab59176fee5781565b6040516001600160a01b0390911681526020016102b8565b6102d4610384366004611efa565b6108cb565b6102d4610397366004611f71565b6109a0565b6102d46103aa366004611fa5565b610a8e565b6103b860025481565b6040519081526020016102b8565b6001546103da90600160a81b900460ff1681565b60405190151581526020016102b8565b60045461035e906001600160a01b031681565b6102f1610ae2565b6102f1610b5b565b6102d4610b67565b6102d4610423366004612003565b610bba565b6102d4610436366004611efa565b610c1b565b6103b8600181565b60005461035e906001600160a01b031681565b6103da610464366004611f3b565b610cf0565b6102d4610477366004611efa565b610d03565b6103da61048a366004611f3b565b610dd8565b6104a261049d366004612066565b610de5565b6040516102b891906120ed565b6103b8742830b930b9bbb0b82137ba20baba3437b934bd32b960591b81565b6102d46104dc366004611f71565b610ea1565b61035e7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6102d4610516366004612159565b610f1e565b6103b8664465785479706560c81b81565b6102d461053a366004611f3b565b610f98565b6102d461054d366004612172565b611029565b6102d4610560366004611f3b565b61107f565b6102d4610573366004611f3b565b611110565b6102d46105863660046121bd565b611176565b60015461035e906001600160a01b031681565b6102d46111d0565b6104a26105b43660046121bd565b6111fc565b6102d46105c7366004611f3b565b6112b1565b60035461035e906001600160a01b031681565b6060306001600160a01b031663a3f4df7e6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561061f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064391906121f1565b60405160200161065591815260200190565b604051602081830303815290604052905090565b6106758684848461134b565b505050505050565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b031633146106c35760405162461bcd60e51b815260040161029a9190611d57565b506001805460ff60a81b1916600160a81b831515908102919091179091556040517f40db37ff5c0bdc2c427fbb2078c8f24afea940abac0e3c23bb4ea3bf2da2b21290600090a250565b6060610719600561161e565b905090565b61074361072e6020830183611f3b565b61073e6040840160208501611f3b565b61162b565b61075d61075861014083016101208401611f3b565b61163d565b50565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b031633146107a65760405162461bcd60e51b815260040161029a9190611d57565b5060005b818110156108355760008383838181106107c6576107c661220a565b90506020020160208101906107db9190611f3b565b90506107e86005826116a8565b15610822576040516001600160a01b038216907f11d761ef41dc70cdaee3d0610189711c62da37a797d661034f0986f14399b06f90600090a25b508061082d81612236565b9150506107aa565b505050565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b031633146108805760405162461bcd60e51b815260040161029a9190611d57565b50600480546001600160a01b0319166001600160a01b0383169081179091556040517f195359283029fbdb9a24519b1ec07caf1677655529bf99dc1634c1e8b288118090600090a250565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b031633146109115760405162461bcd60e51b815260040161029a9190611d57565b5060005b818110156108355760008383838181106109315761093161220a565b90506020020160208101906109469190611f3b565b90506109536007826116a8565b1561098d576040516001600160a01b038216907f79f0e54b3eae4cd6491b0a5038f048490bcec1e21b97818b8302cf5587066ee690600090a25b508061099881612236565b915050610915565b60006109af6020830183611f3b565b9050600036816109c260a086018661224f565b91509150818160008181106109d9576109d961220a565b90506020028101906109eb9190612298565b6109f990602081019061224f565b600184846000818110610a0e57610a0e61220a565b9050602002810190610a209190612298565b610a2e90602081019061224f565b610a399291506122b8565b818110610a4857610a4861220a565b9050602002810190610a5a91906122cb565b610a68906020810190611f3b565b9250610a74848461162b565b610a8761075860a0870160808801611f3b565b5050505050565b610a9782611110565b600380546001600160a01b0319166001600160a01b0383169081179091556040517fac431eb831269b53b41991f6cbfbfc93f4baa395996a8170abac93962b5a358e90600090a25050565b604080516001808252818301909252606091602080830190803683370190505090507f000000000000000000000000def171fe48cf0115b1d80b88dc8eab59176fee5781600081518110610b3857610b3861220a565b60200260200101906001600160a01b031690816001600160a01b03168152505090565b6060610719600761161e565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b03163314610bad5760405162461bcd60e51b815260040161029a9190611d57565b50610bb860006116bd565b565b60038054604080518082019091529182526245323760e81b60208301526001600160a01b03163314610bff5760405162461bcd60e51b815260040161029a9190611d57565b50600154600160a81b900460ff16610c1757610c1782825b5050565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b03163314610c615760405162461bcd60e51b815260040161029a9190611d57565b5060005b81811015610835576000838383818110610c8157610c8161220a565b9050602002016020810190610c969190611f3b565b9050610ca3600782611710565b15610cdd576040516001600160a01b038216907f67bb215b6aed7cca18e965f9b5088e24f9a2dd29dabd4e5c5e786462275adf2b90600090a25b5080610ce881612236565b915050610c65565b6000610cfd600583611725565b92915050565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b03163314610d495760405162461bcd60e51b815260040161029a9190611d57565b5060005b81811015610835576000838383818110610d6957610d6961220a565b9050602002016020810190610d7e9190611f3b565b9050610d8b600582611710565b15610dc5576040516001600160a01b038216907fec44f51830691f58dcfc9f96d0c988a4d599bcef0b7768f4a24c4ecec8faa74290600090a25b5080610dd081612236565b915050610d4d565b6000610cfd600783611725565b610e0a6040805160608101909152806000815260200160608152602001606081525090565b60038054604080518082019091529182526245323760e81b60208301526001600160a01b03163314610e4f5760405162461bcd60e51b815260040161029a9190611d57565b50600154600160a81b900460ff1615610e8c5760008152604080518082019091526003815262229a1b60e91b602080830191909152820152610e9a565b610e97848484611747565b90505b9392505050565b6000610eb06020830183611f3b565b90506000610ec160a084018461224f565b610eca91612456565b905060008160018351610edd91906122b8565b81518110610eed57610eed61220a565b6020026020010151600001519050610f05838261162b565b610f1861075860a0860160808701611f3b565b50505050565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b03163314610f645760405162461bcd60e51b815260040161029a9190611d57565b50600281905560405181907fef711e3eb06966d227e22eb4fa0302550dcd7257cf69b537cf4d37af53ea9cda90600090a250565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b03163314610fde5760405162461bcd60e51b815260040161029a9190611d57565b50600380546001600160a01b0319166001600160a01b0383169081179091556040517fac431eb831269b53b41991f6cbfbfc93f4baa395996a8170abac93962b5a358e90600090a250565b6110338383610a8e565b600480546001600160a01b0319166001600160a01b0383169081179091556040517f195359283029fbdb9a24519b1ec07caf1677655529bf99dc1634c1e8b288118090600090a2505050565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b031633146110c55760405162461bcd60e51b815260040161029a9190611d57565b50600180546001600160a01b0319166001600160a01b0383169081179091556040517f68f49b346b94582a8b5f9d10e3fe3365318fe8f191ff8dce7c59c6cad06b02f590600090a250565b60015460408051808201909152600381526222999b60e91b602082015290600160a01b900460ff16156111565760405162461bcd60e51b815260040161029a9190611d57565b50611160816116bd565b506001805460ff60a01b1916600160a01b179055565b60038054604080518082019091529182526245323760e81b60208301526001600160a01b031633146111bb5760405162461bcd60e51b815260040161029a9190611d57565b50600154600160a81b900460ff1661075d5750565b6001546001600160a01b031633146111e757600080fd5b600154610bb8906001600160a01b03166116bd565b6112216040805160608101909152806000815260200160608152602001606081525090565b60038054604080518082019091529182526245323760e81b60208301526001600160a01b031633146112665760405162461bcd60e51b815260040161029a9190611d57565b50600154600160a81b900460ff16156112a35760008152604080518082019091526003815262229a1b60e91b602080830191909152820152919050565b610cfd82611777565b919050565b60005460408051808201909152600381526245333560e81b6020820152906001600160a01b031633146112f75760405162461bcd60e51b815260040161029a9190611d57565b506001600160a01b0381166113425760405162461bcd60e51b81526020600482015260116024820152704e6577204f776e6572206973207a65726f60781b604482015260640161029a565b61075d816116bd565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b038616016113e7577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316846001600160a01b0316146113e25760405162461bcd60e51b815260206004820152600c60248201526b092dcecc2d8d2c840ae8aa8960a31b604482015260640161029a565b611477565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316846001600160a01b0316148061142e57506001600160a01b038416155b6114695760405162461bcd60e51b815260206004820152600c60248201526b092dcecc2d8d2c840ae8aa8960a31b604482015260640161029a565b506001600160a01b03831615155b600083836114866001826122b8565b8181106114955761149561220a565b60200291909101359150819050600160a01b81161560008161151857826001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151391906126c9565b61157a565b826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611556573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157a91906126c9565b90508415611609577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316816001600160a01b0316146115f25760405162461bcd60e51b815260206004820152600c60248201526b125b9d985b1a59081c1bdbdb60a21b604482015260640161029a565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b611613898261162b565b505050505050505050565b60606000610e9a83611844565b611634826118a0565b610c17816118ec565b6001600160a01b03811615806116665750611656611939565b516001600160a01b038281169116145b61075d5760405162461bcd60e51b8152602060048201526013602482015272496e76616c69642062656e656669636961727960681b604482015260640161029a565b6000610e9a836001600160a01b038416611949565b600080546001600160a01b0383166001600160a01b0319918216811783556001805490921690915560405190917f038720101b9ced74445432ced46c7e5e4c80202669153dd67d226c66a0aa477b91a250565b6000610e9a836001600160a01b038416611a3c565b6001600160a01b03811660009081526001830160205260408120541515610e9a565b61176c6040805160608101909152806000815260200160608152602001606081525090565b600181529392505050565b61179c6040805160608101909152806000815260200160608152602001606081525090565b6117a582611a8b565b6117d3576000815260408051808201909152600381526245353560e81b602080830191909152820152919050565b600080306117e085611b12565b6040516117ed91906126e6565b600060405180830381855afa9150503d8060008114611828576040519150601f19603f3d011682016040523d82523d6000602084013e61182d565b606091505b509150915061183c8282611ba8565b949350505050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561189457602002820191906000526020600020905b815481526020019060010190808311611880575b50505050509050919050565b6118a981610cf0565b61075d5760405162461bcd60e51b8152602060048201526014602482015273125b881d1bdad95b881b9bdd08185b1b1bddd95960621b604482015260640161029a565b6118f581610dd8565b61075d5760405162461bcd60e51b815260206004820152601560248201527413dd5d081d1bdad95b881b9bdd08185b1b1bddd959605a1b604482015260640161029a565b611941611ca7565b610719611c53565b60008181526001830160205260408120548015611a3257600061196d6001836122b8565b8554909150600090611981906001906122b8565b90508181146119e65760008660000182815481106119a1576119a161220a565b90600052602060002001549050808760000184815481106119c4576119c461220a565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806119f7576119f76126f8565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610cfd565b6000915050610cfd565b6000818152600183016020526040812054611a8357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610cfd565b506000610cfd565b600080611a9e6080840160608501611f3b565b90506000611aaa610ae2565b905060005b8151811015611b0757818181518110611aca57611aca61220a565b60200260200101516001600160a01b0316836001600160a01b031603611af557506001949350505050565b80611aff81612236565b915050611aaf565b506000949350505050565b6060600082604051602001611b27919061277c565b60408051601f1981840301815291905290506000611b4860a085018561286c565b604051611b5c925060200190815260200190565b60408051601f198184030181529190529050611b7b60a085018561286c565b8383604051602001611b9094939291906128b2565b60405160208183030381529060405292505050919050565b611bcd6040805160608101909152806000815260200160608152602001606081525090565b8215611c1857815160408051808201909152600381526245333960e81b60208201529015611c0e5760405162461bcd60e51b815260040161029a9190611d57565b5060018152610cfd565b604482511015611c2e5760208101829052610cfd565b60048201915081806020019051810190611c4891906128ed565b602082015292915050565b611c5b611ca7565b3660008082611c6b6020826122b8565b611c779285929061295a565b810190611c849190612159565b9050611c93368281600061295a565b810190611ca09190612984565b9250505090565b60405180610100016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160006001600160a01b03168152602001600081526020016060815260200160608152602001606081525090565b60005b83811015611d22578181015183820152602001611d0a565b50506000910152565b60008151808452611d43816020860160208601611d07565b601f01601f19169290920160200192915050565b602081526000610e9a6020830184611d2b565b6001600160a01b038116811461075d57600080fd5b80356112ac81611d6a565b60008083601f840112611d9c57600080fd5b5081356001600160401b03811115611db357600080fd5b6020830191508360208260051b8501011115611dce57600080fd5b9250929050565b60008060008060008060a08789031215611dee57600080fd5b8635611df981611d6a565b955060208701359450604087013593506060870135611e1781611d6a565b925060808701356001600160401b03811115611e3257600080fd5b611e3e89828a01611d8a565b979a9699509497509295939492505050565b600060208284031215611e6257600080fd5b81358015158114610e9a57600080fd5b6020808252825182820181905260009190848201906040850190845b81811015611eb35783516001600160a01b031683529284019291840191600101611e8e565b50909695505050505050565b600060208284031215611ed157600080fd5b81356001600160401b03811115611ee757600080fd5b82016101e08185031215610e9a57600080fd5b60008060208385031215611f0d57600080fd5b82356001600160401b03811115611f2357600080fd5b611f2f85828601611d8a565b90969095509350505050565b600060208284031215611f4d57600080fd5b8135610e9a81611d6a565b60006101608284031215611f6b57600080fd5b50919050565b600060208284031215611f8357600080fd5b81356001600160401b03811115611f9957600080fd5b61183c84828501611f58565b60008060408385031215611fb857600080fd5b8235611fc381611d6a565b91506020830135611fd381611d6a565b809150509250929050565b60006101008284031215611f6b57600080fd5b600060608284031215611f6b57600080fd5b6000806040838503121561201657600080fd5b82356001600160401b038082111561202d57600080fd5b61203986838701611fde565b9350602085013591508082111561204f57600080fd5b5061205c85828601611ff1565b9150509250929050565b60008060006060848603121561207b57600080fd5b83356001600160401b038082111561209257600080fd5b61209e87838801611fde565b945060208601359150808211156120b457600080fd5b6120c087838801611ff1565b935060408601359150808211156120d657600080fd5b506120e386828701611ff1565b9150509250925092565b60208152600082516002811061211357634e487b7160e01b600052602160045260246000fd5b806020840152506020830151606060408401526121336080840182611d2b565b90506040840151601f198483030160608501526121508282611d2b565b95945050505050565b60006020828403121561216b57600080fd5b5035919050565b60008060006060848603121561218757600080fd5b833561219281611d6a565b925060208401356121a281611d6a565b915060408401356121b281611d6a565b809150509250925092565b6000602082840312156121cf57600080fd5b81356001600160401b038111156121e557600080fd5b61183c84828501611fde565b60006020828403121561220357600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161224857612248612220565b5060010190565b6000808335601e1984360301811261226657600080fd5b8301803591506001600160401b0382111561228057600080fd5b6020019150600581901b3603821315611dce57600080fd5b60008235603e198336030181126122ae57600080fd5b9190910192915050565b81810381811115610cfd57610cfd612220565b60008235605e198336030181126122ae57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715612319576123196122e1565b60405290565b604051608081016001600160401b0381118282101715612319576123196122e1565b60405160a081016001600160401b0381118282101715612319576123196122e1565b60405161010081016001600160401b0381118282101715612319576123196122e1565b604051601f8201601f191681016001600160401b03811182821017156123ae576123ae6122e1565b604052919050565b60006001600160401b038211156123cf576123cf6122e1565b5060051b60200190565b60006001600160401b038211156123f2576123f26122e1565b50601f01601f191660200190565b600082601f83011261241157600080fd5b813561242461241f826123d9565b612386565b81815284602083860101111561243957600080fd5b816020850160208301376000918101602001919091529392505050565b600061246461241f846123b6565b838152602081019036600586901b8501111561247f57600080fd5b835b8560051b85018110156126c0576001600160401b0380823511156124a457600080fd5b81358601606081360312156124b857600080fd5b6124c06122f7565b6124ca8235611d6a565b813581526020820135602082015282604083013511156124e957600080fd5b60408201358201915036601f83011261250157600080fd5b61250e61241f83356123b6565b82358082526020808301929160051b8501013681111561252d57600080fd5b602085015b818110156126a857868135111561254857600080fd5b803586016080601f1982360301121561256057600080fd5b61256861231f565b6125756020830135611d6a565b60208201358152604082013560208201526060820135604082015288608083013511156125a157600080fd5b60808201358201915036603f8301126125b957600080fd5b60208201356125ca61241f826123b6565b81815260059190911b8301604001906020810190368311156125eb57600080fd5b604085015b83811015612691578c8135111561260657600080fd5b8035860160a0603f1982360301121561261e57600080fd5b612626612341565b6040820135815261263a6060830135611d6a565b60608201356020820152608082013560408201528e60a0830135111561265f57600080fd5b61267236604060a0850135850101612400565b606082015260c0919091013560808201528352602092830192016125f0565b506060840152505085525060209384019301612532565b50506040830152508552505060209283019201612481565b50949350505050565b6000602082840312156126db57600080fd5b8151610e9a81611d6a565b600082516122ae818460208701611d07565b634e487b7160e01b600052603160045260246000fd5b6000808335601e1984360301811261272557600080fd5b83016020810192503590506001600160401b0381111561274457600080fd5b803603821315611dce57600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815261279d6020820161279084611d7f565b6001600160a01b03169052565b60006127ab60208401611d7f565b6001600160a01b038116604084015250604083013560608301526127d160608401611d7f565b6001600160a01b038116608084015250608083013560a08301526127f860a084018461270e565b6101008060c086015261281061012086018385612753565b925061281f60c087018761270e565b9250601f19808786030160e0880152612839858584612753565b945061284860e089018961270e565b9450915080878603018388015250612861848483612753565b979650505050505050565b6000808335601e1984360301811261288357600080fd5b8301803591506001600160401b0382111561289d57600080fd5b602001915036819003821315611dce57600080fd5b8385823760008482016000815284516128cf818360208901611d07565b84519101906128e2818360208801611d07565b019695505050505050565b6000602082840312156128ff57600080fd5b81516001600160401b0381111561291557600080fd5b8201601f8101841361292657600080fd5b805161293461241f826123d9565b81815285602083850101111561294957600080fd5b612150826020830160208601611d07565b6000808585111561296a57600080fd5b8386111561297757600080fd5b5050820193919092039150565b60006020828403121561299657600080fd5b81356001600160401b03808211156129ad57600080fd5b9083019061010082860312156129c257600080fd5b6129ca612363565b6129d383611d7f565b81526129e160208401611d7f565b6020820152604083013560408201526129fc60608401611d7f565b60608201526080830135608082015260a083013582811115612a1d57600080fd5b612a2987828601612400565b60a08301525060c083013582811115612a4157600080fd5b612a4d87828601612400565b60c08301525060e083013582811115612a6557600080fd5b612a7187828601612400565b60e0830152509594505050505056fea264697066735822122018832123aa435358b36870934cea2e4cce970b45de568e1e29b7b15488e75a6564736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000089635b6dc339ff219c53ef8a7c53af3368decabb00000000000000000000000089635b6dc339ff219c53ef8a7c53af3368decabb
-----Decoded View---------------
Arg [0] : _owner (address): 0x89635b6DC339ff219C53Ef8a7C53aF3368dECaBb
Arg [1] : _caller (address): 0x89635b6DC339ff219C53Ef8a7C53aF3368dECaBb
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000089635b6dc339ff219c53ef8a7c53af3368decabb
Arg [1] : 00000000000000000000000089635b6dc339ff219c53ef8a7c53af3368decabb
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.