Overview
APE Balance
0 APE
APE Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
3669950 | 15 days ago | Contract Creation | 0 APE |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
GnosisSafeWithoutProxy
Compiler Version
v0.8.12+commit.f00d7308
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity 0.8.12; import "../vendor/@gnosis.pm/[email protected]/contracts/GnosisSafe.sol"; /// @title Gnosis Safe 1.3.0 modified to be used without a proxy contract GnosisSafeWithoutProxy is GnosisSafe { /// @dev The GnosisSafe constructor disables the contract from being set up /// so that it can only be used through proxies. We undo that here and then /// do the setup. /// @param _owners Owners /// @param _threshold Number of required confirmations for a transaction constructor(address[] memory _owners, uint256 _threshold) { // Reset `threshold` to be able to set up owners threshold = 0; // Go through the GnosisSafe `setup()` steps setupOwners(_owners, _threshold); // Do not set up a fallback handler address fallbackHandler = address(0); // Do not set up modules address to = address(0); bytes memory data = ""; setupModules(to, data); // Do not make payment // Emit the event as if `setup()` was called emit SafeSetup(msg.sender, _owners, _threshold, to, fallbackHandler); } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; import "../common/Enum.sol"; /// @title Executor - A contract that can execute transactions /// @author Richard Meissner - <[email protected]> contract Executor { function execute( address to, uint256 value, bytes memory data, Enum.Operation operation, uint256 txGas ) internal returns (bool success) { if (operation == Enum.Operation.DelegateCall) { // solhint-disable-next-line no-inline-assembly assembly { success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0) } } else { // solhint-disable-next-line no-inline-assembly assembly { success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0) } } } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; import "../common/SelfAuthorized.sol"; /// @title Fallback Manager - A contract that manages fallback calls made to this contract /// @author Richard Meissner - <[email protected]> contract FallbackManager is SelfAuthorized { event ChangedFallbackHandler(address handler); // keccak256("fallback_manager.handler.address") bytes32 internal constant FALLBACK_HANDLER_STORAGE_SLOT = 0x6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d5; function internalSetFallbackHandler(address handler) internal { bytes32 slot = FALLBACK_HANDLER_STORAGE_SLOT; // solhint-disable-next-line no-inline-assembly assembly { sstore(slot, handler) } } /// @dev Allows to add a contract to handle fallback calls. /// Only fallback calls without value and with data will be forwarded. /// This can only be done via a Safe transaction. /// @param handler contract to handle fallbacks calls. function setFallbackHandler(address handler) public authorized { internalSetFallbackHandler(handler); emit ChangedFallbackHandler(handler); } // solhint-disable-next-line payable-fallback,no-complex-fallback fallback() external { bytes32 slot = FALLBACK_HANDLER_STORAGE_SLOT; // solhint-disable-next-line no-inline-assembly assembly { let handler := sload(slot) if iszero(handler) { return(0, 0) } calldatacopy(0, 0, calldatasize()) // The msg.sender address is shifted to the left by 12 bytes to remove the padding // Then the address without padding is stored right after the calldata mstore(calldatasize(), shl(96, caller())) // Add 20 bytes for the address appended add the end let success := call(gas(), handler, 0, 0, add(calldatasize(), 20), 0, 0) returndatacopy(0, 0, returndatasize()) if iszero(success) { revert(0, returndatasize()) } return(0, returndatasize()) } } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; import "../common/Enum.sol"; import "../common/SelfAuthorized.sol"; interface Guard { function checkTransaction( address to, uint256 value, bytes memory data, Enum.Operation operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address payable refundReceiver, bytes memory signatures, address msgSender ) external; function checkAfterExecution(bytes32 txHash, bool success) external; } /// @title Fallback Manager - A contract that manages fallback calls made to this contract /// @author Richard Meissner - <[email protected]> contract GuardManager is SelfAuthorized { event ChangedGuard(address guard); // keccak256("guard_manager.guard.address") bytes32 internal constant GUARD_STORAGE_SLOT = 0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8; /// @dev Set a guard that checks transactions before execution /// @param guard The address of the guard to be used or the 0 address to disable the guard function setGuard(address guard) external authorized { bytes32 slot = GUARD_STORAGE_SLOT; // solhint-disable-next-line no-inline-assembly assembly { sstore(slot, guard) } emit ChangedGuard(guard); } function getGuard() internal view returns (address guard) { bytes32 slot = GUARD_STORAGE_SLOT; // solhint-disable-next-line no-inline-assembly assembly { guard := sload(slot) } } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; import "../common/Enum.sol"; import "../common/SelfAuthorized.sol"; import "./Executor.sol"; /// @title Module Manager - A contract that manages modules that can execute transactions via this contract /// @author Stefan George - <[email protected]> /// @author Richard Meissner - <[email protected]> contract ModuleManager is SelfAuthorized, Executor { event EnabledModule(address module); event DisabledModule(address module); event ExecutionFromModuleSuccess(address indexed module); event ExecutionFromModuleFailure(address indexed module); address internal constant SENTINEL_MODULES = address(0x1); mapping(address => address) internal modules; function setupModules(address to, bytes memory data) internal { require(modules[SENTINEL_MODULES] == address(0), "GS100"); modules[SENTINEL_MODULES] = SENTINEL_MODULES; if (to != address(0)) // Setup has to complete successfully or transaction fails. require(execute(to, 0, data, Enum.Operation.DelegateCall, gasleft()), "GS000"); } /// @dev Allows to add a module to the whitelist. /// This can only be done via a Safe transaction. /// @notice Enables the module `module` for the Safe. /// @param module Module to be whitelisted. function enableModule(address module) public authorized { // Module address cannot be null or sentinel. require(module != address(0) && module != SENTINEL_MODULES, "GS101"); // Module cannot be added twice. require(modules[module] == address(0), "GS102"); modules[module] = modules[SENTINEL_MODULES]; modules[SENTINEL_MODULES] = module; emit EnabledModule(module); } /// @dev Allows to remove a module from the whitelist. /// This can only be done via a Safe transaction. /// @notice Disables the module `module` for the Safe. /// @param prevModule Module that pointed to the module to be removed in the linked list /// @param module Module to be removed. function disableModule(address prevModule, address module) public authorized { // Validate module address and check that it corresponds to module index. require(module != address(0) && module != SENTINEL_MODULES, "GS101"); require(modules[prevModule] == module, "GS103"); modules[prevModule] = modules[module]; modules[module] = address(0); emit DisabledModule(module); } /// @dev Allows a Module to execute a Safe transaction without any further confirmations. /// @param to Destination address of module transaction. /// @param value Ether value of module transaction. /// @param data Data payload of module transaction. /// @param operation Operation type of module transaction. function execTransactionFromModule( address to, uint256 value, bytes memory data, Enum.Operation operation ) public virtual returns (bool success) { // Only whitelisted modules are allowed. require(msg.sender != SENTINEL_MODULES && modules[msg.sender] != address(0), "GS104"); // Execute transaction without further confirmations. success = execute(to, value, data, operation, gasleft()); if (success) emit ExecutionFromModuleSuccess(msg.sender); else emit ExecutionFromModuleFailure(msg.sender); } /// @dev Allows a Module to execute a Safe transaction without any further confirmations and return data /// @param to Destination address of module transaction. /// @param value Ether value of module transaction. /// @param data Data payload of module transaction. /// @param operation Operation type of module transaction. function execTransactionFromModuleReturnData( address to, uint256 value, bytes memory data, Enum.Operation operation ) public returns (bool success, bytes memory returnData) { success = execTransactionFromModule(to, value, data, operation); // solhint-disable-next-line no-inline-assembly assembly { // Load free memory location let ptr := mload(0x40) // We allocate memory for the return data by setting the free memory location to // current free memory location + data size + 32 bytes for data size value mstore(0x40, add(ptr, add(returndatasize(), 0x20))) // Store the size mstore(ptr, returndatasize()) // Store the data returndatacopy(add(ptr, 0x20), 0, returndatasize()) // Point the return data to the correct memory location returnData := ptr } } /// @dev Returns if an module is enabled /// @return True if the module is enabled function isModuleEnabled(address module) public view returns (bool) { return SENTINEL_MODULES != module && modules[module] != address(0); } /// @dev Returns array of modules. /// @param start Start of the page. /// @param pageSize Maximum number of modules that should be returned. /// @return array Array of modules. /// @return next Start of the next page. function getModulesPaginated(address start, uint256 pageSize) external view returns (address[] memory array, address next) { // Init array with max page size array = new address[](pageSize); // Populate return array uint256 moduleCount = 0; address currentModule = modules[start]; while (currentModule != address(0x0) && currentModule != SENTINEL_MODULES && moduleCount < pageSize) { array[moduleCount] = currentModule; currentModule = modules[currentModule]; moduleCount++; } next = currentModule; // Set correct size of returned array // solhint-disable-next-line no-inline-assembly assembly { mstore(array, moduleCount) } } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; import "../common/SelfAuthorized.sol"; /// @title OwnerManager - Manages a set of owners and a threshold to perform actions. /// @author Stefan George - <[email protected]> /// @author Richard Meissner - <[email protected]> contract OwnerManager is SelfAuthorized { event AddedOwner(address owner); event RemovedOwner(address owner); event ChangedThreshold(uint256 threshold); address internal constant SENTINEL_OWNERS = address(0x1); mapping(address => address) internal owners; uint256 internal ownerCount; uint256 internal threshold; /// @dev Setup function sets initial storage of contract. /// @param _owners List of Safe owners. /// @param _threshold Number of required confirmations for a Safe transaction. function setupOwners(address[] memory _owners, uint256 _threshold) internal { // Threshold can only be 0 at initialization. // Check ensures that setup function can only be called once. require(threshold == 0, "GS200"); // Validate that threshold is smaller than number of added owners. require(_threshold <= _owners.length, "GS201"); // There has to be at least one Safe owner. require(_threshold >= 1, "GS202"); // Initializing Safe owners. address currentOwner = SENTINEL_OWNERS; for (uint256 i = 0; i < _owners.length; i++) { // Owner address cannot be null. address owner = _owners[i]; require(owner != address(0) && owner != SENTINEL_OWNERS && owner != address(this) && currentOwner != owner, "GS203"); // No duplicate owners allowed. require(owners[owner] == address(0), "GS204"); owners[currentOwner] = owner; currentOwner = owner; } owners[currentOwner] = SENTINEL_OWNERS; ownerCount = _owners.length; threshold = _threshold; } /// @dev Allows to add a new owner to the Safe and update the threshold at the same time. /// This can only be done via a Safe transaction. /// @notice Adds the owner `owner` to the Safe and updates the threshold to `_threshold`. /// @param owner New owner address. /// @param _threshold New threshold. function addOwnerWithThreshold(address owner, uint256 _threshold) public authorized { // Owner address cannot be null, the sentinel or the Safe itself. require(owner != address(0) && owner != SENTINEL_OWNERS && owner != address(this), "GS203"); // No duplicate owners allowed. require(owners[owner] == address(0), "GS204"); owners[owner] = owners[SENTINEL_OWNERS]; owners[SENTINEL_OWNERS] = owner; ownerCount++; emit AddedOwner(owner); // Change threshold if threshold was changed. if (threshold != _threshold) changeThreshold(_threshold); } /// @dev Allows to remove an owner from the Safe and update the threshold at the same time. /// This can only be done via a Safe transaction. /// @notice Removes the owner `owner` from the Safe and updates the threshold to `_threshold`. /// @param prevOwner Owner that pointed to the owner to be removed in the linked list /// @param owner Owner address to be removed. /// @param _threshold New threshold. function removeOwner( address prevOwner, address owner, uint256 _threshold ) public authorized { // Only allow to remove an owner, if threshold can still be reached. require(ownerCount - 1 >= _threshold, "GS201"); // Validate owner address and check that it corresponds to owner index. require(owner != address(0) && owner != SENTINEL_OWNERS, "GS203"); require(owners[prevOwner] == owner, "GS205"); owners[prevOwner] = owners[owner]; owners[owner] = address(0); ownerCount--; emit RemovedOwner(owner); // Change threshold if threshold was changed. if (threshold != _threshold) changeThreshold(_threshold); } /// @dev Allows to swap/replace an owner from the Safe with another address. /// This can only be done via a Safe transaction. /// @notice Replaces the owner `oldOwner` in the Safe with `newOwner`. /// @param prevOwner Owner that pointed to the owner to be replaced in the linked list /// @param oldOwner Owner address to be replaced. /// @param newOwner New owner address. function swapOwner( address prevOwner, address oldOwner, address newOwner ) public authorized { // Owner address cannot be null, the sentinel or the Safe itself. require(newOwner != address(0) && newOwner != SENTINEL_OWNERS && newOwner != address(this), "GS203"); // No duplicate owners allowed. require(owners[newOwner] == address(0), "GS204"); // Validate oldOwner address and check that it corresponds to owner index. require(oldOwner != address(0) && oldOwner != SENTINEL_OWNERS, "GS203"); require(owners[prevOwner] == oldOwner, "GS205"); owners[newOwner] = owners[oldOwner]; owners[prevOwner] = newOwner; owners[oldOwner] = address(0); emit RemovedOwner(oldOwner); emit AddedOwner(newOwner); } /// @dev Allows to update the number of required confirmations by Safe owners. /// This can only be done via a Safe transaction. /// @notice Changes the threshold of the Safe to `_threshold`. /// @param _threshold New threshold. function changeThreshold(uint256 _threshold) public authorized { // Validate that threshold is smaller than number of owners. require(_threshold <= ownerCount, "GS201"); // There has to be at least one Safe owner. require(_threshold >= 1, "GS202"); threshold = _threshold; emit ChangedThreshold(threshold); } function getThreshold() public view returns (uint256) { return threshold; } function isOwner(address owner) public view returns (bool) { return owner != SENTINEL_OWNERS && owners[owner] != address(0); } /// @dev Returns array of owners. /// @return Array of Safe owners. function getOwners() public view returns (address[] memory) { address[] memory array = new address[](ownerCount); // populate return array uint256 index = 0; address currentOwner = owners[SENTINEL_OWNERS]; while (currentOwner != SENTINEL_OWNERS) { array[index] = currentOwner; currentOwner = owners[currentOwner]; index++; } return array; } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; /// @title Enum - Collection of enums /// @author Richard Meissner - <[email protected]> contract Enum { enum Operation {Call, DelegateCall} }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; /// @title EtherPaymentFallback - A contract that has a fallback to accept ether payments /// @author Richard Meissner - <[email protected]> contract EtherPaymentFallback { event SafeReceived(address indexed sender, uint256 value); /// @dev Fallback function accepts Ether transactions. receive() external payable { emit SafeReceived(msg.sender, msg.value); } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; /// @title SecuredTokenTransfer - Secure token transfer /// @author Richard Meissner - <[email protected]> contract SecuredTokenTransfer { /// @dev Transfers a token and returns if it was a success /// @param token Token that should be transferred /// @param receiver Receiver to whom the token should be transferred /// @param amount The amount of tokens that should be transferred function transferToken( address token, address receiver, uint256 amount ) internal returns (bool transferred) { // 0xa9059cbb - keccack("transfer(address,uint256)") bytes memory data = abi.encodeWithSelector(0xa9059cbb, receiver, amount); // solhint-disable-next-line no-inline-assembly assembly { // We write the return value to scratch space. // See https://docs.soliditylang.org/en/v0.7.6/internals/layout_in_memory.html#layout-in-memory let success := call(sub(gas(), 10000), token, 0, add(data, 0x20), mload(data), 0, 0x20) switch returndatasize() case 0 { transferred := success } case 0x20 { transferred := iszero(or(iszero(success), iszero(mload(0)))) } default { transferred := 0 } } } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; /// @title SelfAuthorized - authorizes current contract to perform actions /// @author Richard Meissner - <[email protected]> contract SelfAuthorized { function requireSelfCall() private view { require(msg.sender == address(this), "GS031"); } modifier authorized() { // This is a function call as it minimized the bytecode size requireSelfCall(); _; } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; /// @title SignatureDecoder - Decodes signatures that a encoded as bytes /// @author Richard Meissner - <[email protected]> contract SignatureDecoder { /// @dev divides bytes signature into `uint8 v, bytes32 r, bytes32 s`. /// @notice Make sure to peform a bounds check for @param pos, to avoid out of bounds access on @param signatures /// @param pos which signature to read. A prior bounds check of this parameter should be performed, to avoid out of bounds access /// @param signatures concatenated rsv signatures function signatureSplit(bytes memory signatures, uint256 pos) internal pure returns ( uint8 v, bytes32 r, bytes32 s ) { // The signature format is a compact form of: // {bytes32 r}{bytes32 s}{uint8 v} // Compact means, uint8 is not padded to 32 bytes. // solhint-disable-next-line no-inline-assembly assembly { let signaturePos := mul(0x41, pos) r := mload(add(signatures, add(signaturePos, 0x20))) s := mload(add(signatures, add(signaturePos, 0x40))) // Here we are loading the last 32 bytes, including 31 bytes // of 's'. There is no 'mload8' to do this. // // 'byte' is not working due to the Solidity parser, so lets // use the second best option, 'and' v := and(mload(add(signatures, add(signaturePos, 0x41))), 0xff) } } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; /// @title Singleton - Base for singleton contracts (should always be first super contract) /// This contract is tightly coupled to our proxy contract (see `proxies/GnosisSafeProxy.sol`) /// @author Richard Meissner - <[email protected]> contract Singleton { // singleton always needs to be first declared variable, to ensure that it is at the same location as in the Proxy contract. // It should also always be ensured that the address is stored alone (uses a full word) address private singleton; }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; /// @title StorageAccessible - generic base contract that allows callers to access all internal storage. /// @notice See https://github.com/gnosis/util-contracts/blob/bb5fe5fb5df6d8400998094fb1b32a178a47c3a1/contracts/StorageAccessible.sol contract StorageAccessible { /** * @dev Reads `length` bytes of storage in the currents contract * @param offset - the offset in the current contract's storage in words to start reading from * @param length - the number of words (32 bytes) of data to read * @return the bytes that were read. */ function getStorageAt(uint256 offset, uint256 length) public view returns (bytes memory) { bytes memory result = new bytes(length * 32); for (uint256 index = 0; index < length; index++) { // solhint-disable-next-line no-inline-assembly assembly { let word := sload(add(offset, index)) mstore(add(add(result, 0x20), mul(index, 0x20)), word) } } return result; } /** * @dev Performs a delegetecall on a targetContract in the context of self. * Internally reverts execution to avoid side effects (making it static). * * This method reverts with data equal to `abi.encode(bool(success), bytes(response))`. * Specifically, the `returndata` after a call to this method will be: * `success:bool || response.length:uint256 || response:bytes`. * * @param targetContract Address of the contract containing the code to execute. * @param calldataPayload Calldata that should be sent to the target contract (encoded method name and arguments). */ function simulateAndRevert(address targetContract, bytes memory calldataPayload) external { // solhint-disable-next-line no-inline-assembly assembly { let success := delegatecall(gas(), targetContract, add(calldataPayload, 0x20), mload(calldataPayload), 0, 0) mstore(0x00, success) mstore(0x20, returndatasize()) returndatacopy(0x40, 0, returndatasize()) revert(0, add(returndatasize(), 0x40)) } } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; /** * @title GnosisSafeMath * @dev Math operations with safety checks that revert on error * Renamed from SafeMath to GnosisSafeMath to avoid conflicts * TODO: remove once open zeppelin update to solc 0.5.0 */ library GnosisSafeMath { /** * @dev Multiplies two numbers, reverts on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b); return c; } /** * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } /** * @dev Adds two numbers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; import "./base/ModuleManager.sol"; import "./base/OwnerManager.sol"; import "./base/FallbackManager.sol"; import "./base/GuardManager.sol"; import "./common/EtherPaymentFallback.sol"; import "./common/Singleton.sol"; import "./common/SignatureDecoder.sol"; import "./common/SecuredTokenTransfer.sol"; import "./common/StorageAccessible.sol"; import "./interfaces/ISignatureValidator.sol"; import "./external/GnosisSafeMath.sol"; /// @title Gnosis Safe - A multisignature wallet with support for confirmations using signed messages based on ERC191. /// @author Stefan George - <[email protected]> /// @author Richard Meissner - <[email protected]> contract GnosisSafe is EtherPaymentFallback, Singleton, ModuleManager, OwnerManager, SignatureDecoder, SecuredTokenTransfer, ISignatureValidatorConstants, FallbackManager, StorageAccessible, GuardManager { using GnosisSafeMath for uint256; string public constant VERSION = "1.3.0"; // keccak256( // "EIP712Domain(uint256 chainId,address verifyingContract)" // ); bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH = 0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218; // keccak256( // "SafeTx(address to,uint256 value,bytes data,uint8 operation,uint256 safeTxGas,uint256 baseGas,uint256 gasPrice,address gasToken,address refundReceiver,uint256 nonce)" // ); bytes32 private constant SAFE_TX_TYPEHASH = 0xbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d8; event SafeSetup(address indexed initiator, address[] owners, uint256 threshold, address initializer, address fallbackHandler); event ApproveHash(bytes32 indexed approvedHash, address indexed owner); event SignMsg(bytes32 indexed msgHash); event ExecutionFailure(bytes32 txHash, uint256 payment); event ExecutionSuccess(bytes32 txHash, uint256 payment); uint256 public nonce; bytes32 private _deprecatedDomainSeparator; // Mapping to keep track of all message hashes that have been approve by ALL REQUIRED owners mapping(bytes32 => uint256) public signedMessages; // Mapping to keep track of all hashes (message or transaction) that have been approve by ANY owners mapping(address => mapping(bytes32 => uint256)) public approvedHashes; // This constructor ensures that this contract can only be used as a master copy for Proxy contracts constructor() { // By setting the threshold it is not possible to call setup anymore, // so we create a Safe with 0 owners and threshold 1. // This is an unusable Safe, perfect for the singleton threshold = 1; } /// @dev Setup function sets initial storage of contract. /// @param _owners List of Safe owners. /// @param _threshold Number of required confirmations for a Safe transaction. /// @param to Contract address for optional delegate call. /// @param data Data payload for optional delegate call. /// @param fallbackHandler Handler for fallback calls to this contract /// @param paymentToken Token that should be used for the payment (0 is ETH) /// @param payment Value that should be paid /// @param paymentReceiver Adddress that should receive the payment (or 0 if tx.origin) function setup( address[] calldata _owners, uint256 _threshold, address to, bytes calldata data, address fallbackHandler, address paymentToken, uint256 payment, address payable paymentReceiver ) external { // setupOwners checks if the Threshold is already set, therefore preventing that this method is called twice setupOwners(_owners, _threshold); if (fallbackHandler != address(0)) internalSetFallbackHandler(fallbackHandler); // As setupOwners can only be called if the contract has not been initialized we don't need a check for setupModules setupModules(to, data); if (payment > 0) { // To avoid running into issues with EIP-170 we reuse the handlePayment function (to avoid adjusting code of that has been verified we do not adjust the method itself) // baseGas = 0, gasPrice = 1 and gas = payment => amount = (payment + 0) * 1 = payment handlePayment(payment, 0, 1, paymentToken, paymentReceiver); } emit SafeSetup(msg.sender, _owners, _threshold, to, fallbackHandler); } /// @dev Allows to execute a Safe transaction confirmed by required number of owners and then pays the account that submitted the transaction. /// Note: The fees are always transferred, even if the user transaction fails. /// @param to Destination address of Safe transaction. /// @param value Ether value of Safe transaction. /// @param data Data payload of Safe transaction. /// @param operation Operation type of Safe transaction. /// @param safeTxGas Gas that should be used for the Safe transaction. /// @param baseGas Gas costs that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund) /// @param gasPrice Gas price that should be used for the payment calculation. /// @param gasToken Token address (or 0 if ETH) that is used for the payment. /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin). /// @param signatures Packed signature data ({bytes32 r}{bytes32 s}{uint8 v}) function execTransaction( address to, uint256 value, bytes calldata data, Enum.Operation operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address payable refundReceiver, bytes memory signatures ) public payable virtual returns (bool success) { bytes32 txHash; // Use scope here to limit variable lifetime and prevent `stack too deep` errors { bytes memory txHashData = encodeTransactionData( // Transaction info to, value, data, operation, safeTxGas, // Payment info baseGas, gasPrice, gasToken, refundReceiver, // Signature info nonce ); // Increase nonce and execute transaction. nonce++; txHash = keccak256(txHashData); checkSignatures(txHash, txHashData, signatures); } address guard = getGuard(); { if (guard != address(0)) { Guard(guard).checkTransaction( // Transaction info to, value, data, operation, safeTxGas, // Payment info baseGas, gasPrice, gasToken, refundReceiver, // Signature info signatures, msg.sender ); } } // We require some gas to emit the events (at least 2500) after the execution and some to perform code until the execution (500) // We also include the 1/64 in the check that is not send along with a call to counteract potential shortings because of EIP-150 require(gasleft() >= ((safeTxGas * 64) / 63).max(safeTxGas + 2500) + 500, "GS010"); // Use scope here to limit variable lifetime and prevent `stack too deep` errors { uint256 gasUsed = gasleft(); // If the gasPrice is 0 we assume that nearly all available gas can be used (it is always more than safeTxGas) // We only substract 2500 (compared to the 3000 before) to ensure that the amount passed is still higher than safeTxGas success = execute(to, value, data, operation, gasPrice == 0 ? (gasleft() - 2500) : safeTxGas); gasUsed = gasUsed.sub(gasleft()); // If no safeTxGas and no gasPrice was set (e.g. both are 0), then the internal tx is required to be successful // This makes it possible to use `estimateGas` without issues, as it searches for the minimum gas where the tx doesn't revert require(success || safeTxGas != 0 || gasPrice != 0, "GS013"); // We transfer the calculated tx costs to the tx.origin to avoid sending it to intermediate contracts that have made calls uint256 payment = 0; if (gasPrice > 0) { payment = handlePayment(gasUsed, baseGas, gasPrice, gasToken, refundReceiver); } if (success) emit ExecutionSuccess(txHash, payment); else emit ExecutionFailure(txHash, payment); } { if (guard != address(0)) { Guard(guard).checkAfterExecution(txHash, success); } } } function handlePayment( uint256 gasUsed, uint256 baseGas, uint256 gasPrice, address gasToken, address payable refundReceiver ) private returns (uint256 payment) { // solhint-disable-next-line avoid-tx-origin address payable receiver = refundReceiver == address(0) ? payable(tx.origin) : refundReceiver; if (gasToken == address(0)) { // For ETH we will only adjust the gas price to not be higher than the actual used gas price payment = gasUsed.add(baseGas).mul(gasPrice < tx.gasprice ? gasPrice : tx.gasprice); require(receiver.send(payment), "GS011"); } else { payment = gasUsed.add(baseGas).mul(gasPrice); require(transferToken(gasToken, receiver, payment), "GS012"); } } /** * @dev Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise. * @param dataHash Hash of the data (could be either a message hash or transaction hash) * @param data That should be signed (this is passed to an external validator contract) * @param signatures Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash. */ function checkSignatures( bytes32 dataHash, bytes memory data, bytes memory signatures ) public view { // Load threshold to avoid multiple storage loads uint256 _threshold = threshold; // Check that a threshold is set require(_threshold > 0, "GS001"); checkNSignatures(dataHash, data, signatures, _threshold); } /** * @dev Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise. * @param dataHash Hash of the data (could be either a message hash or transaction hash) * @param data That should be signed (this is passed to an external validator contract) * @param signatures Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash. * @param requiredSignatures Amount of required valid signatures. */ function checkNSignatures( bytes32 dataHash, bytes memory data, bytes memory signatures, uint256 requiredSignatures ) public view { // Check that the provided signature data is not too short require(signatures.length >= requiredSignatures.mul(65), "GS020"); // There cannot be an owner with address 0. address lastOwner = address(0); address currentOwner; uint8 v; bytes32 r; bytes32 s; uint256 i; for (i = 0; i < requiredSignatures; i++) { (v, r, s) = signatureSplit(signatures, i); if (v == 0) { // If v is 0 then it is a contract signature // When handling contract signatures the address of the contract is encoded into r currentOwner = address(uint160(uint256(r))); // Check that signature data pointer (s) is not pointing inside the static part of the signatures bytes // This check is not completely accurate, since it is possible that more signatures than the threshold are send. // Here we only check that the pointer is not pointing inside the part that is being processed require(uint256(s) >= requiredSignatures.mul(65), "GS021"); // Check that signature data pointer (s) is in bounds (points to the length of data -> 32 bytes) require(uint256(s).add(32) <= signatures.length, "GS022"); // Check if the contract signature is in bounds: start of data is s + 32 and end is start + signature length uint256 contractSignatureLen; // solhint-disable-next-line no-inline-assembly assembly { contractSignatureLen := mload(add(add(signatures, s), 0x20)) } require(uint256(s).add(32).add(contractSignatureLen) <= signatures.length, "GS023"); // Check signature bytes memory contractSignature; // solhint-disable-next-line no-inline-assembly assembly { // The signature data for contract signatures is appended to the concatenated signatures and the offset is stored in s contractSignature := add(add(signatures, s), 0x20) } require(ISignatureValidator(currentOwner).isValidSignature(data, contractSignature) == EIP1271_MAGIC_VALUE, "GS024"); } else if (v == 1) { // If v is 1 then it is an approved hash // When handling approved hashes the address of the approver is encoded into r currentOwner = address(uint160(uint256(r))); // Hashes are automatically approved by the sender of the message or when they have been pre-approved via a separate transaction require(msg.sender == currentOwner || approvedHashes[currentOwner][dataHash] != 0, "GS025"); } else if (v > 30) { // If v > 30 then default va (27,28) has been adjusted for eth_sign flow // To support eth_sign and similar we adjust v and hash the messageHash with the Ethereum message prefix before applying ecrecover currentOwner = ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", dataHash)), v - 4, r, s); } else { // Default is the ecrecover flow with the provided data hash // Use ecrecover with the messageHash for EOA signatures currentOwner = ecrecover(dataHash, v, r, s); } require(currentOwner > lastOwner && owners[currentOwner] != address(0) && currentOwner != SENTINEL_OWNERS, "GS026"); lastOwner = currentOwner; } } /// @dev Allows to estimate a Safe transaction. /// This method is only meant for estimation purpose, therefore the call will always revert and encode the result in the revert data. /// Since the `estimateGas` function includes refunds, call this method to get an estimated of the costs that are deducted from the safe with `execTransaction` /// @param to Destination address of Safe transaction. /// @param value Ether value of Safe transaction. /// @param data Data payload of Safe transaction. /// @param operation Operation type of Safe transaction. /// @return Estimate without refunds and overhead fees (base transaction and payload data gas costs). /// @notice Deprecated in favor of common/StorageAccessible.sol and will be removed in next version. function requiredTxGas( address to, uint256 value, bytes calldata data, Enum.Operation operation ) external returns (uint256) { uint256 startGas = gasleft(); // We don't provide an error message here, as we use it to return the estimate require(execute(to, value, data, operation, gasleft())); uint256 requiredGas = startGas - gasleft(); // Convert response to string and return via error message revert(string(abi.encodePacked(requiredGas))); } /** * @dev Marks a hash as approved. This can be used to validate a hash that is used by a signature. * @param hashToApprove The hash that should be marked as approved for signatures that are verified by this contract. */ function approveHash(bytes32 hashToApprove) external { require(owners[msg.sender] != address(0), "GS030"); approvedHashes[msg.sender][hashToApprove] = 1; emit ApproveHash(hashToApprove, msg.sender); } /// @dev Returns the chain id used by this contract. function getChainId() public view returns (uint256) { uint256 id; // solhint-disable-next-line no-inline-assembly assembly { id := chainid() } return id; } function domainSeparator() public view returns (bytes32) { return keccak256(abi.encode(DOMAIN_SEPARATOR_TYPEHASH, getChainId(), this)); } /// @dev Returns the bytes that are hashed to be signed by owners. /// @param to Destination address. /// @param value Ether value. /// @param data Data payload. /// @param operation Operation type. /// @param safeTxGas Gas that should be used for the safe transaction. /// @param baseGas Gas costs for that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund) /// @param gasPrice Maximum gas price that should be used for this transaction. /// @param gasToken Token address (or 0 if ETH) that is used for the payment. /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin). /// @param _nonce Transaction nonce. /// @return Transaction hash bytes. function encodeTransactionData( address to, uint256 value, bytes calldata data, Enum.Operation operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, uint256 _nonce ) public view returns (bytes memory) { bytes32 safeTxHash = keccak256( abi.encode( SAFE_TX_TYPEHASH, to, value, keccak256(data), operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce ) ); return abi.encodePacked(bytes1(0x19), bytes1(0x01), domainSeparator(), safeTxHash); } /// @dev Returns hash to be signed by owners. /// @param to Destination address. /// @param value Ether value. /// @param data Data payload. /// @param operation Operation type. /// @param safeTxGas Fas that should be used for the safe transaction. /// @param baseGas Gas costs for data used to trigger the safe transaction. /// @param gasPrice Maximum gas price that should be used for this transaction. /// @param gasToken Token address (or 0 if ETH) that is used for the payment. /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin). /// @param _nonce Transaction nonce. /// @return Transaction hash. function getTransactionHash( address to, uint256 value, bytes calldata data, Enum.Operation operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, uint256 _nonce ) public view returns (bytes32) { return keccak256(encodeTransactionData(to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce)); } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; contract ISignatureValidatorConstants { // bytes4(keccak256("isValidSignature(bytes,bytes)") bytes4 internal constant EIP1271_MAGIC_VALUE = 0x20c13b0b; } abstract contract ISignatureValidator is ISignatureValidatorConstants { /** * @dev Should return whether the signature provided is valid for the provided data * @param _data Arbitrary length data signed on the behalf of address(this) * @param _signature Signature byte array associated with _data * * MUST return the bytes4 magic value 0x20c13b0b when function passes. * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5) * MUST allow external calls */ function isValidSignature(bytes memory _data, bytes memory _signature) public view virtual returns (bytes4); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256","name":"_threshold","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"AddedOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"approvedHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"ApproveHash","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"handler","type":"address"}],"name":"ChangedFallbackHandler","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"guard","type":"address"}],"name":"ChangedGuard","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"ChangedThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"module","type":"address"}],"name":"DisabledModule","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"module","type":"address"}],"name":"EnabledModule","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"txHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"payment","type":"uint256"}],"name":"ExecutionFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"module","type":"address"}],"name":"ExecutionFromModuleFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"module","type":"address"}],"name":"ExecutionFromModuleSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"txHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"payment","type":"uint256"}],"name":"ExecutionSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"RemovedOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"SafeReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":false,"internalType":"address[]","name":"owners","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"},{"indexed":false,"internalType":"address","name":"initializer","type":"address"},{"indexed":false,"internalType":"address","name":"fallbackHandler","type":"address"}],"name":"SafeSetup","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"msgHash","type":"bytes32"}],"name":"SignMsg","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"addOwnerWithThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hashToApprove","type":"bytes32"}],"name":"approveHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"approvedHashes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"changeThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"dataHash","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signatures","type":"bytes"},{"internalType":"uint256","name":"requiredSignatures","type":"uint256"}],"name":"checkNSignatures","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"dataHash","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"checkSignatures","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"prevModule","type":"address"},{"internalType":"address","name":"module","type":"address"}],"name":"disableModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"enableModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"},{"internalType":"uint256","name":"safeTxGas","type":"uint256"},{"internalType":"uint256","name":"baseGas","type":"uint256"},{"internalType":"uint256","name":"gasPrice","type":"uint256"},{"internalType":"address","name":"gasToken","type":"address"},{"internalType":"address","name":"refundReceiver","type":"address"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"encodeTransactionData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"},{"internalType":"uint256","name":"safeTxGas","type":"uint256"},{"internalType":"uint256","name":"baseGas","type":"uint256"},{"internalType":"uint256","name":"gasPrice","type":"uint256"},{"internalType":"address","name":"gasToken","type":"address"},{"internalType":"address payable","name":"refundReceiver","type":"address"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"execTransaction","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"}],"name":"execTransactionFromModule","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"}],"name":"execTransactionFromModuleReturnData","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"returnData","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"start","type":"address"},{"internalType":"uint256","name":"pageSize","type":"uint256"}],"name":"getModulesPaginated","outputs":[{"internalType":"address[]","name":"array","type":"address[]"},{"internalType":"address","name":"next","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"getStorageAt","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"},{"internalType":"uint256","name":"safeTxGas","type":"uint256"},{"internalType":"uint256","name":"baseGas","type":"uint256"},{"internalType":"uint256","name":"gasPrice","type":"uint256"},{"internalType":"address","name":"gasToken","type":"address"},{"internalType":"address","name":"refundReceiver","type":"address"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"getTransactionHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"isModuleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"prevOwner","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"removeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"}],"name":"requiredTxGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"handler","type":"address"}],"name":"setFallbackHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"guard","type":"address"}],"name":"setGuard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256","name":"_threshold","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"address","name":"fallbackHandler","type":"address"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"payment","type":"uint256"},{"internalType":"address payable","name":"paymentReceiver","type":"address"}],"name":"setup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"signedMessages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"bytes","name":"calldataPayload","type":"bytes"}],"name":"simulateAndRevert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"prevOwner","type":"address"},{"internalType":"address","name":"oldOwner","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"swapOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200365738038062003657833981016040819052620000349162000461565b6000600455620000458282620000b8565b60408051602081019091526000808252908190620000648282620002fe565b336001600160a01b03167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a886868587604051620000a594939291906200053b565b60405180910390a25050505050620005fd565b60045415620000f65760405162461bcd60e51b8152602060048201526005602482015264047533230360dc1b60448201526064015b60405180910390fd5b8151811115620001315760405162461bcd60e51b8152602060048201526005602482015264475332303160d81b6044820152606401620000ed565b60018110156200016c5760405162461bcd60e51b815260206004820152600560248201526423a999181960d91b6044820152606401620000ed565b600160005b8351811015620002cb576000848281518110620001925762000192620005a7565b6020026020010151905060006001600160a01b0316816001600160a01b031614158015620001ca57506001600160a01b038116600114155b8015620001e057506001600160a01b0381163014155b8015620001ff5750806001600160a01b0316836001600160a01b031614155b620002355760405162461bcd60e51b8152602060048201526005602482015264475332303360d81b6044820152606401620000ed565b6001600160a01b038181166000908152600260205260409020541615620002875760405162461bcd60e51b815260206004820152600560248201526411d4cc8c0d60da1b6044820152606401620000ed565b6001600160a01b03928316600090815260026020526040902080546001600160a01b0319169382169390931790925580620002c281620005bd565b91505062000171565b506001600160a01b0316600090815260026020526040902080546001600160a01b03191660011790559051600355600455565b6001600081905260205260008051602062003637833981519152546001600160a01b031615620003595760405162461bcd60e51b8152602060048201526005602482015264047533130360dc1b6044820152606401620000ed565b6001600081905260208190526000805160206200363783398151915280546001600160a01b03191690911790556001600160a01b03821615620003dd57620003a78260008360015a620003e1565b620003dd5760405162461bcd60e51b8152602060048201526005602482015264047533030360dc1b6044820152606401620000ed565b5050565b60006001836001811115620003fa57620003fa620005e7565b141562000415576000808551602087018986f4905062000425565b600080855160208701888a87f190505b95945050505050565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200045c57600080fd5b919050565b600080604083850312156200047557600080fd5b82516001600160401b03808211156200048d57600080fd5b818501915085601f830112620004a257600080fd5b8151602082821115620004b957620004b96200042e565b8160051b604051601f19603f83011681018181108682111715620004e157620004e16200042e565b6040529283528183019350848101820192898411156200050057600080fd5b948201945b838610156200052957620005198662000444565b8552948201949382019362000505565b97909101519698969750505050505050565b6080808252855190820181905260009060209060a0840190828901845b828110156200057f5781516001600160a01b03168452928401929084019060010162000558565b50505090830195909552506001600160a01b0392831660408201529116606090910152919050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415620005e057634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052602160045260246000fd5b61302a806200060d6000396000f3fe6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314610620578063f698da2514610640578063f8dc5dd914610655578063ffa1ad741461067557610218565b8063e19a9dd9146105ab578063e318b52b146105cb578063e75235b8146105eb578063e86637db1461060057610218565b8063cc2f8452116100d1578063cc2f84521461051d578063d4d9bdcd1461054b578063d8d11f781461056b578063e009cfde1461058b57610218565b8063affed0e0146104a7578063b4faba09146104bd578063b63e800d146104dd578063c4ca3a9c146104fd57610218565b80635624b25b1161017a5780636a761202116101495780636a7612021461041a5780637d8329741461042d578063934f3a1114610465578063a0e67e2b1461048557610218565b80635624b25b146103805780635ae6bd37146103ad578063610b5925146103da578063694e80c3146103fa57610218565b80632f54bf6e116101b65780632f54bf6e146102f55780633408e47014610315578063468721a7146103325780635229073f1461035257610218565b80630d582f131461027e57806312fb68e0146102a05780632d9ad53d146102c057610218565b366102185760405134815233907f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d9060200160405180910390a2005b34801561022457600080fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d580548061024f57005b36600080373360601b365260008060143601600080855af190503d6000803e80610278573d6000fd5b503d6000f35b34801561028a57600080fd5b5061029e61029936600461249d565b6106a6565b005b3480156102ac57600080fd5b5061029e6102bb36600461256b565b610806565b3480156102cc57600080fd5b506102e06102db3660046125df565b610c6e565b60405190151581526020015b60405180910390f35b34801561030157600080fd5b506102e06103103660046125df565b610ca9565b34801561032157600080fd5b50465b6040519081526020016102ec565b34801561033e57600080fd5b506102e061034d36600461260b565b610ce1565b34801561035e57600080fd5b5061037261036d36600461260b565b610db8565b6040516102ec9291906126c1565b34801561038c57600080fd5b506103a061039b3660046126dc565b610dee565b6040516102ec91906126fe565b3480156103b957600080fd5b506103246103c8366004612711565b60076020526000908152604090205481565b3480156103e657600080fd5b5061029e6103f53660046125df565b610e73565b34801561040657600080fd5b5061029e610415366004612711565b610fb5565b6102e0610428366004612772565b61104d565b34801561043957600080fd5b5061032461044836600461249d565b600860209081526000928352604080842090915290825290205481565b34801561047157600080fd5b5061029e61048036600461284a565b611396565b34801561049157600080fd5b5061049a6113e0565b6040516102ec91906128fa565b3480156104b357600080fd5b5061032460055481565b3480156104c957600080fd5b5061029e6104d836600461290d565b6114d0565b3480156104e957600080fd5b5061029e6104f836600461295c565b6114f3565b34801561050957600080fd5b50610324610518366004612a50565b611614565b34801561052957600080fd5b5061053d61053836600461249d565b6116ae565b6040516102ec929190612ac0565b34801561055757600080fd5b5061029e610566366004612711565b6117a7565b34801561057757600080fd5b50610324610586366004612aea565b61183c565b34801561059757600080fd5b5061029e6105a6366004612baa565b611869565b3480156105b757600080fd5b5061029e6105c63660046125df565b611998565b3480156105d757600080fd5b5061029e6105e6366004612be3565b6119fd565b3480156105f757600080fd5b50600454610324565b34801561060c57600080fd5b506103a061061b366004612aea565b611bec565b34801561062c57600080fd5b5061029e61063b3660046125df565b611cc5565b34801561064c57600080fd5b50610324611d2e565b34801561066157600080fd5b5061029e610670366004612c2e565b611d85565b34801561068157600080fd5b506103a0604051806040016040528060058152602001640312e332e360dc1b81525081565b6106ae611ef8565b6001600160a01b038216158015906106d057506001600160a01b038216600114155b80156106e557506001600160a01b0382163014155b61070a5760405162461bcd60e51b815260040161070190612c6f565b60405180910390fd5b6001600160a01b0382811660009081526002602052604090205416156107425760405162461bcd60e51b815260040161070190612c8e565b60026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e080546001600160a01b038481166000818152604081208054939094166001600160a01b0319938416179093556001835283549091161790915560038054916107af83612cc3565b90915550506040516001600160a01b03831681527f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269060200160405180910390a180600454146108025761080281610fb5565b5050565b610811816041611f31565b825110156108495760405162461bcd60e51b8152602060048201526005602482015264047533032360dc1b6044820152606401610701565b6000808060008060005b86811015610c62576041818102890160208101516040820151919092015160ff169550909350915083610a20579193508391610890876041611f31565b8210156108c75760405162461bcd60e51b8152602060048201526005602482015264475330323160d81b6044820152606401610701565b87516108d4836020611f6a565b111561090a5760405162461bcd60e51b815260206004820152600560248201526423a998191960d91b6044820152606401610701565b60208289018101518951909161092d908390610927908790611f6a565b90611f6a565b11156109635760405162461bcd60e51b8152602060048201526005602482015264475330323360d81b6044820152606401610701565b6040516320c13b0b60e01b8082528a8501602001916001600160a01b038916906320c13b0b90610999908f908690600401612cde565b602060405180830381865afa1580156109b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109da9190612d03565b6001600160e01b03191614610a195760405162461bcd60e51b815260206004820152600560248201526411d4cc0c8d60da1b6044820152606401610701565b5050610bc8565b8360ff1660011415610aa3579193508391336001600160a01b0384161480610a6a57506001600160a01b03851660009081526008602090815260408083208d845290915290205415155b610a9e5760405162461bcd60e51b8152602060048201526005602482015264475330323560d81b6044820152606401610701565b610bc8565b601e8460ff161115610b68576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018b9052600190605c0160405160208183030381529060405280519060200120600486610b089190612d2d565b6040805160008152602081018083529390935260ff90911690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610b57573d6000803e3d6000fd5b505050602060405103519450610bc8565b6040805160008152602081018083528c905260ff861691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015610bbb573d6000803e3d6000fd5b5050506020604051035194505b856001600160a01b0316856001600160a01b0316118015610c0257506001600160a01b038581166000908152600260205260409020541615155b8015610c1857506001600160a01b038516600114155b610c4c5760405162461bcd60e51b815260206004820152600560248201526423a998191b60d91b6044820152606401610701565b8495508080610c5a90612cc3565b915050610853565b50505050505050505050565b600060016001600160a01b03831614801590610ca357506001600160a01b038281166000908152600160205260409020541615155b92915050565b60006001600160a01b038216600114801590610ca35750506001600160a01b0390811660009081526002602052604090205416151590565b600033600114801590610d0b5750336000908152600160205260409020546001600160a01b031615155b610d3f5760405162461bcd60e51b815260206004820152600560248201526411d4cc4c0d60da1b6044820152606401610701565b610d4c858585855a611f86565b90508015610d845760405133907f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb890600090a2610db0565b60405133907facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37590600090a25b949350505050565b60006060610dc886868686610ce1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b60606000610dfd836020612d50565b6001600160401b03811115610e1457610e146124c9565b6040519080825280601f01601f191660200182016040528015610e3e576020820181803683370190505b50905060005b83811015610e6b578481015460208083028401015280610e6381612cc3565b915050610e44565b509392505050565b610e7b611ef8565b6001600160a01b03811615801590610e9d57506001600160a01b038116600114155b610ed15760405162461bcd60e51b8152602060048201526005602482015264475331303160d81b6044820152606401610701565b6001600160a01b038181166000908152600160205260409020541615610f215760405162461bcd60e51b815260206004820152600560248201526423a998981960d91b6044820152606401610701565b600160208181527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80546001600160a01b03858116600081815260408082208054949095166001600160a01b031994851617909455959095528254168417909155519182527fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844091015b60405180910390a150565b610fbd611ef8565b600354811115610fdf5760405162461bcd60e51b815260040161070190612d6f565b60018110156110185760405162461bcd60e51b815260206004820152600560248201526423a999181960d91b6044820152606401610701565b60048190556040518181527f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c9390602001610faa565b60008060006110678e8e8e8e8e8e8e8e8e8e600554611bec565b60058054919250600061107983612cc3565b9091555050805160208201209150611092828286611396565b5060006110bd7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c85490565b90506001600160a01b0381161561114357806001600160a01b03166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b81526004016111109c9b9a99989796959493929190612dc6565b600060405180830381600087803b15801561112a57600080fd5b505af115801561113e573d6000803e3d6000fd5b505050505b61116f6111528a6109c4612e8b565b603f61115f8c6040612d50565b6111699190612ea3565b90611fce565b61117b906101f4612e8b565b5a10156111b25760405162461bcd60e51b8152602060048201526005602482015264047533031360dc1b6044820152606401610701565b60005a90506112238f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8c600014611210578e611f86565b6109c45a61121e9190612ec5565b611f86565b93506112305a8290611fe5565b9050838061123d57508915155b8061124757508715155b61127b5760405162461bcd60e51b8152602060048201526005602482015264475330313360d81b6044820152606401610701565b6000881561129357611290828b8b8b8b612000565b90505b84156112d75760408051858152602081018390527f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e910160405180910390a1611311565b60408051858152602081018390527f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23910160405180910390a15b50506001600160a01b0381161561138557604051631264e26d60e31b81526004810183905283151560248201526001600160a01b03821690639327136890604401600060405180830381600087803b15801561136c57600080fd5b505af1158015611380573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b600454806113ce5760405162461bcd60e51b8152602060048201526005602482015264475330303160d81b6044820152606401610701565b6113da84848484610806565b50505050565b606060006003546001600160401b038111156113fe576113fe6124c9565b604051908082528060200260200182016040528015611427578160200160208202803683370190505b506001600090815260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e054919250906001600160a01b03165b6001600160a01b0381166001146114c8578083838151811061148857611488612edc565b6001600160a01b039283166020918202929092018101919091529181166000908152600290925260409091205416816114c081612cc3565b925050611464565b509092915050565b600080825160208401855af480600052503d6020523d600060403e60403d016000fd5b6115318a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c9250612106915050565b6001600160a01b0384161561156857611568847f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b6115a88787878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122ec92505050565b81156115bf576115bd82600060018685612000565b505b336001600160a01b03167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b89604051611600959493929190612ef2565b60405180910390a250505050505050505050565b6000805a905061165d878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050505a611f86565b61166657600080fd5b60005a6116739083612ec5565b90508060405160200161168891815260200190565b60408051601f198184030181529082905262461bcd60e51b8252610701916004016126fe565b60606000826001600160401b038111156116ca576116ca6124c9565b6040519080825280602002602001820160405280156116f3578160200160208202803683370190505b506001600160a01b0380861660009081526001602052604081205492945091165b6001600160a01b0381161580159061173657506001600160a01b038116600114155b801561174157508482105b15611799578084838151811061175957611759612edc565b6001600160a01b0392831660209182029290920181019190915291811660009081526001909252604090912054168161179181612cc3565b925050611714565b908352919491935090915050565b336000908152600260205260409020546001600160a01b03166117f45760405162461bcd60e51b8152602060048201526005602482015264047533033360dc1b6044820152606401610701565b336000818152600860209081526040808320858452909152808220600190555183917ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c91a350565b60006118518c8c8c8c8c8c8c8c8c8c8c611bec565b8051906020012090509b9a5050505050505050505050565b611871611ef8565b6001600160a01b0381161580159061189357506001600160a01b038116600114155b6118c75760405162461bcd60e51b8152602060048201526005602482015264475331303160d81b6044820152606401610701565b6001600160a01b0382811660009081526001602052604090205481169082161461191b5760405162461bcd60e51b8152602060048201526005602482015264475331303360d81b6044820152606401610701565b6001600160a01b038181166000818152600160209081526040808320805488871685528285208054919097166001600160a01b03199182161790965592849052825490941690915591519081527faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427691015b60405180910390a15050565b6119a0611ef8565b7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c88181556040516001600160a01b03831681527f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa29060200161198c565b611a05611ef8565b6001600160a01b03811615801590611a2757506001600160a01b038116600114155b8015611a3c57506001600160a01b0381163014155b611a585760405162461bcd60e51b815260040161070190612c6f565b6001600160a01b038181166000908152600260205260409020541615611a905760405162461bcd60e51b815260040161070190612c8e565b6001600160a01b03821615801590611ab257506001600160a01b038216600114155b611ace5760405162461bcd60e51b815260040161070190612c6f565b6001600160a01b03838116600090815260026020526040902054811690831614611b225760405162461bcd60e51b8152602060048201526005602482015264475332303560d81b6044820152606401610701565b6001600160a01b038281166000818152600260209081526040808320805487871680865283862080549289166001600160a01b0319938416179055968a1685528285208054821690971790965592849052825490941690915591519081527ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf910160405180910390a16040516001600160a01b03821681527f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269060200160405180910390a1505050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d604051611c26929190612f5e565b604051908190038120611c4c949392918e908e908e908e908e908e908e90602001612f6e565b60408051601f1981840301815291905280516020909101209050601960f81b600160f81b611c78611d2e565b6040516001600160f81b031993841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529150509b9a5050505050505050505050565b611ccd611ef8565b611cf5817f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b6040516001600160a01b03821681527f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b090602001610faa565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b611d8d611ef8565b806001600354611d9d9190612ec5565b1015611dbb5760405162461bcd60e51b815260040161070190612d6f565b6001600160a01b03821615801590611ddd57506001600160a01b038216600114155b611df95760405162461bcd60e51b815260040161070190612c6f565b6001600160a01b03838116600090815260026020526040902054811690831614611e4d5760405162461bcd60e51b8152602060048201526005602482015264475332303560d81b6044820152606401610701565b6001600160a01b03828116600081815260026020526040808220805488861684529183208054929095166001600160a01b03199283161790945591815282549091169091556003805491611ea083612fdd565b90915550506040516001600160a01b03831681527ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf9060200160405180910390a18060045414611ef357611ef381610fb5565b505050565b333014611f2f5760405162461bcd60e51b8152602060048201526005602482015264475330333160d81b6044820152606401610701565b565b600082611f4057506000610ca3565b6000611f4c8385612d50565b905082611f598583612ea3565b14611f6357600080fd5b9392505050565b600080611f778385612e8b565b905083811015611f6357600080fd5b60006001836001811115611f9c57611f9c612d8e565b1415611fb5576000808551602087018986f49050611fc5565b600080855160208701888a87f190505b95945050505050565b600081831015611fde5781611f63565b5090919050565b600082821115611ff457600080fd5b6000610db08385612ec5565b6000806001600160a01b03831615612018578261201a565b325b90506001600160a01b0384166120ad5761204c3a861061203a573a61203c565b855b6120468989611f6a565b90611f31565b6040519092506001600160a01b0382169083156108fc029084906000818181858888f193505050506120a85760405162461bcd60e51b8152602060048201526005602482015264475330313160d81b6044820152606401610701565b6120fc565b6120bb856120468989611f6a565b91506120c88482846123e6565b6120fc5760405162461bcd60e51b815260206004820152600560248201526423a998189960d91b6044820152606401610701565b5095945050505050565b6004541561213e5760405162461bcd60e51b8152602060048201526005602482015264047533230360dc1b6044820152606401610701565b815181111561215f5760405162461bcd60e51b815260040161070190612d6f565b60018110156121985760405162461bcd60e51b815260206004820152600560248201526423a999181960d91b6044820152606401610701565b600160005b83518110156122b95760008482815181106121ba576121ba612edc565b6020026020010151905060006001600160a01b0316816001600160a01b0316141580156121f157506001600160a01b038116600114155b801561220657506001600160a01b0381163014155b80156122245750806001600160a01b0316836001600160a01b031614155b6122405760405162461bcd60e51b815260040161070190612c6f565b6001600160a01b0381811660009081526002602052604090205416156122785760405162461bcd60e51b815260040161070190612c8e565b6001600160a01b03928316600090815260026020526040902080546001600160a01b03191693821693909317909255806122b181612cc3565b91505061219d565b506001600160a01b0316600090815260026020526040902080546001600160a01b03191660011790559051600355600455565b600160008190526020527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f546001600160a01b0316156123565760405162461bcd60e51b8152602060048201526005602482015264047533130360dc1b6044820152606401610701565b6001600081905260208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80546001600160a01b03191690911790556001600160a01b03821615610802576123b28260008360015a611f86565b6108025760405162461bcd60e51b8152602060048201526005602482015264047533030360dc1b6044820152606401610701565b604080516001600160a01b03841660248201526044808201849052825180830390910181526064909101909152602080820180516001600160e01b031663a9059cbb60e01b1781528251600093929184919082896127105a03f13d80156124585760208114612460576000935061246b565b81935061246b565b600051158215171593505b5050509392505050565b6001600160a01b038116811461248a57600080fd5b50565b803561249881612475565b919050565b600080604083850312156124b057600080fd5b82356124bb81612475565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126124f057600080fd5b81356001600160401b038082111561250a5761250a6124c9565b604051601f8301601f19908116603f01168101908282118183101715612532576125326124c9565b8160405283815286602085880101111561254b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561258157600080fd5b8435935060208501356001600160401b038082111561259f57600080fd5b6125ab888389016124df565b945060408701359150808211156125c157600080fd5b506125ce878288016124df565b949793965093946060013593505050565b6000602082840312156125f157600080fd5b8135611f6381612475565b80356002811061249857600080fd5b6000806000806080858703121561262157600080fd5b843561262c81612475565b93506020850135925060408501356001600160401b0381111561264e57600080fd5b61265a878288016124df565b925050612669606086016125fc565b905092959194509250565b6000815180845260005b8181101561269a5760208185018101518683018201520161267e565b818111156126ac576000602083870101525b50601f01601f19169290920160200192915050565b8215158152604060208201526000610db06040830184612674565b600080604083850312156126ef57600080fd5b50508035926020909101359150565b602081526000611f636020830184612674565b60006020828403121561272357600080fd5b5035919050565b60008083601f84011261273c57600080fd5b5081356001600160401b0381111561275357600080fd5b60208301915083602082850101111561276b57600080fd5b9250929050565b60008060008060008060008060008060006101408c8e03121561279457600080fd5b61279d8c61248d565b9a5060208c013599506001600160401b038060408e013511156127bf57600080fd5b6127cf8e60408f01358f0161272a565b909a5098506127e060608e016125fc565b975060808d0135965060a08d0135955060c08d0135945061280360e08e0161248d565b93506128126101008e0161248d565b9250806101208e0135111561282657600080fd5b506128388d6101208e01358e016124df565b90509295989b509295989b9093969950565b60008060006060848603121561285f57600080fd5b8335925060208401356001600160401b038082111561287d57600080fd5b612889878388016124df565b9350604086013591508082111561289f57600080fd5b506128ac868287016124df565b9150509250925092565b600081518084526020808501945080840160005b838110156128ef5781516001600160a01b0316875295820195908201906001016128ca565b509495945050505050565b602081526000611f6360208301846128b6565b6000806040838503121561292057600080fd5b823561292b81612475565b915060208301356001600160401b0381111561294657600080fd5b612952858286016124df565b9150509250929050565b6000806000806000806000806000806101008b8d03121561297c57600080fd5b8a356001600160401b038082111561299357600080fd5b818d0191508d601f8301126129a757600080fd5b8135818111156129b657600080fd5b8e60208260051b85010111156129cb57600080fd5b60208381019d50909b508d013599506129e660408e0161248d565b985060608d01359150808211156129fc57600080fd5b50612a098d828e0161272a565b9097509550612a1c905060808c0161248d565b9350612a2a60a08c0161248d565b925060c08b01359150612a3f60e08c0161248d565b90509295989b9194979a5092959850565b600080600080600060808688031215612a6857600080fd5b8535612a7381612475565b94506020860135935060408601356001600160401b03811115612a9557600080fd5b612aa18882890161272a565b9094509250612ab49050606087016125fc565b90509295509295909350565b604081526000612ad360408301856128b6565b905060018060a01b03831660208301529392505050565b60008060008060008060008060008060006101408c8e031215612b0c57600080fd5b8b35612b1781612475565b9a5060208c0135995060408c01356001600160401b03811115612b3957600080fd5b612b458e828f0161272a565b909a509850612b58905060608d016125fc565b965060808c0135955060a08c0135945060c08c0135935060e08c0135612b7d81612475565b92506101008c0135612b8e81612475565b809250506101208c013590509295989b509295989b9093969950565b60008060408385031215612bbd57600080fd5b8235612bc881612475565b91506020830135612bd881612475565b809150509250929050565b600080600060608486031215612bf857600080fd5b8335612c0381612475565b92506020840135612c1381612475565b91506040840135612c2381612475565b809150509250925092565b600080600060608486031215612c4357600080fd5b8335612c4e81612475565b92506020840135612c5e81612475565b929592945050506040919091013590565b602080825260059082015264475332303360d81b604082015260600190565b60208082526005908201526411d4cc8c0d60da1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600019821415612cd757612cd7612cad565b5060010190565b604081526000612cf16040830185612674565b8281036020840152611fc58185612674565b600060208284031215612d1557600080fd5b81516001600160e01b031981168114611f6357600080fd5b600060ff821660ff841680821015612d4757612d47612cad565b90039392505050565b6000816000190483118215151615612d6a57612d6a612cad565b500290565b602080825260059082015264475332303160d81b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b60028110612dc257634e487b7160e01b600052602160045260246000fd5b9052565b6001600160a01b038d168152602081018c90526101606040820181905281018a905260006101808b8d828501376000838d01820152601f8c01601f19168301612e12606085018d612da4565b8a60808501528960a08501528860c0850152612e3960e08501896001600160a01b03169052565b6001600160a01b0387166101008501528184820301610120850152612e6082820187612674565b92505050612e7a6101408301846001600160a01b03169052565b9d9c50505050505050505050505050565b60008219821115612e9e57612e9e612cad565b500190565b600082612ec057634e487b7160e01b600052601260045260246000fd5b500490565b600082821015612ed757612ed7612cad565b500390565b634e487b7160e01b600052603260045260246000fd5b6080808252810185905260008660a08301825b88811015612f35578235612f1881612475565b6001600160a01b0316825260209283019290910190600101612f05565b50602084019690965250506001600160a01b039283166040820152911660609091015292915050565b8183823760009101908152919050565b8b81526001600160a01b038b81166020830152604082018b9052606082018a9052610160820190612fa2608084018b612da4565b60a083019890985260c082019690965260e0810194909452918516610100840152909316610120820152610140019190915295945050505050565b600081612fec57612fec612cad565b50600019019056fea2646970667358221220f6f5fdd82f6339ba7e849e16f376185b1da6f9d1c9d29b9e22a63bb16320857364736f6c634300080c0033cc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000042a18bab999803bba3c7186dc725e567ed28d95500000000000000000000000080efdd3bb15f2108c407049c5575490858800d4700000000000000000000000056afb8383b3e8db331e711e1183f195ced7b9faf0000000000000000000000005b2962121b4334fe563f7062fea975f51313ede300000000000000000000000009dea15d4e1f82787e181f23788dc3f4b3d3dae400000000000000000000000070cc8f7c40a8e65a73b804ad1c49f39d40ea3050000000000000000000000000433171908d5bab4ac0e860c64d1333f51a310321000000000000000000000000918350a01a4c259fbcc94c6fb2ca49a3753bdb86
Deployed Bytecode
0x6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314610620578063f698da2514610640578063f8dc5dd914610655578063ffa1ad741461067557610218565b8063e19a9dd9146105ab578063e318b52b146105cb578063e75235b8146105eb578063e86637db1461060057610218565b8063cc2f8452116100d1578063cc2f84521461051d578063d4d9bdcd1461054b578063d8d11f781461056b578063e009cfde1461058b57610218565b8063affed0e0146104a7578063b4faba09146104bd578063b63e800d146104dd578063c4ca3a9c146104fd57610218565b80635624b25b1161017a5780636a761202116101495780636a7612021461041a5780637d8329741461042d578063934f3a1114610465578063a0e67e2b1461048557610218565b80635624b25b146103805780635ae6bd37146103ad578063610b5925146103da578063694e80c3146103fa57610218565b80632f54bf6e116101b65780632f54bf6e146102f55780633408e47014610315578063468721a7146103325780635229073f1461035257610218565b80630d582f131461027e57806312fb68e0146102a05780632d9ad53d146102c057610218565b366102185760405134815233907f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d9060200160405180910390a2005b34801561022457600080fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d580548061024f57005b36600080373360601b365260008060143601600080855af190503d6000803e80610278573d6000fd5b503d6000f35b34801561028a57600080fd5b5061029e61029936600461249d565b6106a6565b005b3480156102ac57600080fd5b5061029e6102bb36600461256b565b610806565b3480156102cc57600080fd5b506102e06102db3660046125df565b610c6e565b60405190151581526020015b60405180910390f35b34801561030157600080fd5b506102e06103103660046125df565b610ca9565b34801561032157600080fd5b50465b6040519081526020016102ec565b34801561033e57600080fd5b506102e061034d36600461260b565b610ce1565b34801561035e57600080fd5b5061037261036d36600461260b565b610db8565b6040516102ec9291906126c1565b34801561038c57600080fd5b506103a061039b3660046126dc565b610dee565b6040516102ec91906126fe565b3480156103b957600080fd5b506103246103c8366004612711565b60076020526000908152604090205481565b3480156103e657600080fd5b5061029e6103f53660046125df565b610e73565b34801561040657600080fd5b5061029e610415366004612711565b610fb5565b6102e0610428366004612772565b61104d565b34801561043957600080fd5b5061032461044836600461249d565b600860209081526000928352604080842090915290825290205481565b34801561047157600080fd5b5061029e61048036600461284a565b611396565b34801561049157600080fd5b5061049a6113e0565b6040516102ec91906128fa565b3480156104b357600080fd5b5061032460055481565b3480156104c957600080fd5b5061029e6104d836600461290d565b6114d0565b3480156104e957600080fd5b5061029e6104f836600461295c565b6114f3565b34801561050957600080fd5b50610324610518366004612a50565b611614565b34801561052957600080fd5b5061053d61053836600461249d565b6116ae565b6040516102ec929190612ac0565b34801561055757600080fd5b5061029e610566366004612711565b6117a7565b34801561057757600080fd5b50610324610586366004612aea565b61183c565b34801561059757600080fd5b5061029e6105a6366004612baa565b611869565b3480156105b757600080fd5b5061029e6105c63660046125df565b611998565b3480156105d757600080fd5b5061029e6105e6366004612be3565b6119fd565b3480156105f757600080fd5b50600454610324565b34801561060c57600080fd5b506103a061061b366004612aea565b611bec565b34801561062c57600080fd5b5061029e61063b3660046125df565b611cc5565b34801561064c57600080fd5b50610324611d2e565b34801561066157600080fd5b5061029e610670366004612c2e565b611d85565b34801561068157600080fd5b506103a0604051806040016040528060058152602001640312e332e360dc1b81525081565b6106ae611ef8565b6001600160a01b038216158015906106d057506001600160a01b038216600114155b80156106e557506001600160a01b0382163014155b61070a5760405162461bcd60e51b815260040161070190612c6f565b60405180910390fd5b6001600160a01b0382811660009081526002602052604090205416156107425760405162461bcd60e51b815260040161070190612c8e565b60026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e080546001600160a01b038481166000818152604081208054939094166001600160a01b0319938416179093556001835283549091161790915560038054916107af83612cc3565b90915550506040516001600160a01b03831681527f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269060200160405180910390a180600454146108025761080281610fb5565b5050565b610811816041611f31565b825110156108495760405162461bcd60e51b8152602060048201526005602482015264047533032360dc1b6044820152606401610701565b6000808060008060005b86811015610c62576041818102890160208101516040820151919092015160ff169550909350915083610a20579193508391610890876041611f31565b8210156108c75760405162461bcd60e51b8152602060048201526005602482015264475330323160d81b6044820152606401610701565b87516108d4836020611f6a565b111561090a5760405162461bcd60e51b815260206004820152600560248201526423a998191960d91b6044820152606401610701565b60208289018101518951909161092d908390610927908790611f6a565b90611f6a565b11156109635760405162461bcd60e51b8152602060048201526005602482015264475330323360d81b6044820152606401610701565b6040516320c13b0b60e01b8082528a8501602001916001600160a01b038916906320c13b0b90610999908f908690600401612cde565b602060405180830381865afa1580156109b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109da9190612d03565b6001600160e01b03191614610a195760405162461bcd60e51b815260206004820152600560248201526411d4cc0c8d60da1b6044820152606401610701565b5050610bc8565b8360ff1660011415610aa3579193508391336001600160a01b0384161480610a6a57506001600160a01b03851660009081526008602090815260408083208d845290915290205415155b610a9e5760405162461bcd60e51b8152602060048201526005602482015264475330323560d81b6044820152606401610701565b610bc8565b601e8460ff161115610b68576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018b9052600190605c0160405160208183030381529060405280519060200120600486610b089190612d2d565b6040805160008152602081018083529390935260ff90911690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610b57573d6000803e3d6000fd5b505050602060405103519450610bc8565b6040805160008152602081018083528c905260ff861691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015610bbb573d6000803e3d6000fd5b5050506020604051035194505b856001600160a01b0316856001600160a01b0316118015610c0257506001600160a01b038581166000908152600260205260409020541615155b8015610c1857506001600160a01b038516600114155b610c4c5760405162461bcd60e51b815260206004820152600560248201526423a998191b60d91b6044820152606401610701565b8495508080610c5a90612cc3565b915050610853565b50505050505050505050565b600060016001600160a01b03831614801590610ca357506001600160a01b038281166000908152600160205260409020541615155b92915050565b60006001600160a01b038216600114801590610ca35750506001600160a01b0390811660009081526002602052604090205416151590565b600033600114801590610d0b5750336000908152600160205260409020546001600160a01b031615155b610d3f5760405162461bcd60e51b815260206004820152600560248201526411d4cc4c0d60da1b6044820152606401610701565b610d4c858585855a611f86565b90508015610d845760405133907f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb890600090a2610db0565b60405133907facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37590600090a25b949350505050565b60006060610dc886868686610ce1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b60606000610dfd836020612d50565b6001600160401b03811115610e1457610e146124c9565b6040519080825280601f01601f191660200182016040528015610e3e576020820181803683370190505b50905060005b83811015610e6b578481015460208083028401015280610e6381612cc3565b915050610e44565b509392505050565b610e7b611ef8565b6001600160a01b03811615801590610e9d57506001600160a01b038116600114155b610ed15760405162461bcd60e51b8152602060048201526005602482015264475331303160d81b6044820152606401610701565b6001600160a01b038181166000908152600160205260409020541615610f215760405162461bcd60e51b815260206004820152600560248201526423a998981960d91b6044820152606401610701565b600160208181527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80546001600160a01b03858116600081815260408082208054949095166001600160a01b031994851617909455959095528254168417909155519182527fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844091015b60405180910390a150565b610fbd611ef8565b600354811115610fdf5760405162461bcd60e51b815260040161070190612d6f565b60018110156110185760405162461bcd60e51b815260206004820152600560248201526423a999181960d91b6044820152606401610701565b60048190556040518181527f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c9390602001610faa565b60008060006110678e8e8e8e8e8e8e8e8e8e600554611bec565b60058054919250600061107983612cc3565b9091555050805160208201209150611092828286611396565b5060006110bd7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c85490565b90506001600160a01b0381161561114357806001600160a01b03166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b81526004016111109c9b9a99989796959493929190612dc6565b600060405180830381600087803b15801561112a57600080fd5b505af115801561113e573d6000803e3d6000fd5b505050505b61116f6111528a6109c4612e8b565b603f61115f8c6040612d50565b6111699190612ea3565b90611fce565b61117b906101f4612e8b565b5a10156111b25760405162461bcd60e51b8152602060048201526005602482015264047533031360dc1b6044820152606401610701565b60005a90506112238f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8c600014611210578e611f86565b6109c45a61121e9190612ec5565b611f86565b93506112305a8290611fe5565b9050838061123d57508915155b8061124757508715155b61127b5760405162461bcd60e51b8152602060048201526005602482015264475330313360d81b6044820152606401610701565b6000881561129357611290828b8b8b8b612000565b90505b84156112d75760408051858152602081018390527f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e910160405180910390a1611311565b60408051858152602081018390527f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23910160405180910390a15b50506001600160a01b0381161561138557604051631264e26d60e31b81526004810183905283151560248201526001600160a01b03821690639327136890604401600060405180830381600087803b15801561136c57600080fd5b505af1158015611380573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b600454806113ce5760405162461bcd60e51b8152602060048201526005602482015264475330303160d81b6044820152606401610701565b6113da84848484610806565b50505050565b606060006003546001600160401b038111156113fe576113fe6124c9565b604051908082528060200260200182016040528015611427578160200160208202803683370190505b506001600090815260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e054919250906001600160a01b03165b6001600160a01b0381166001146114c8578083838151811061148857611488612edc565b6001600160a01b039283166020918202929092018101919091529181166000908152600290925260409091205416816114c081612cc3565b925050611464565b509092915050565b600080825160208401855af480600052503d6020523d600060403e60403d016000fd5b6115318a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c9250612106915050565b6001600160a01b0384161561156857611568847f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b6115a88787878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122ec92505050565b81156115bf576115bd82600060018685612000565b505b336001600160a01b03167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b89604051611600959493929190612ef2565b60405180910390a250505050505050505050565b6000805a905061165d878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050505a611f86565b61166657600080fd5b60005a6116739083612ec5565b90508060405160200161168891815260200190565b60408051601f198184030181529082905262461bcd60e51b8252610701916004016126fe565b60606000826001600160401b038111156116ca576116ca6124c9565b6040519080825280602002602001820160405280156116f3578160200160208202803683370190505b506001600160a01b0380861660009081526001602052604081205492945091165b6001600160a01b0381161580159061173657506001600160a01b038116600114155b801561174157508482105b15611799578084838151811061175957611759612edc565b6001600160a01b0392831660209182029290920181019190915291811660009081526001909252604090912054168161179181612cc3565b925050611714565b908352919491935090915050565b336000908152600260205260409020546001600160a01b03166117f45760405162461bcd60e51b8152602060048201526005602482015264047533033360dc1b6044820152606401610701565b336000818152600860209081526040808320858452909152808220600190555183917ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c91a350565b60006118518c8c8c8c8c8c8c8c8c8c8c611bec565b8051906020012090509b9a5050505050505050505050565b611871611ef8565b6001600160a01b0381161580159061189357506001600160a01b038116600114155b6118c75760405162461bcd60e51b8152602060048201526005602482015264475331303160d81b6044820152606401610701565b6001600160a01b0382811660009081526001602052604090205481169082161461191b5760405162461bcd60e51b8152602060048201526005602482015264475331303360d81b6044820152606401610701565b6001600160a01b038181166000818152600160209081526040808320805488871685528285208054919097166001600160a01b03199182161790965592849052825490941690915591519081527faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427691015b60405180910390a15050565b6119a0611ef8565b7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c88181556040516001600160a01b03831681527f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa29060200161198c565b611a05611ef8565b6001600160a01b03811615801590611a2757506001600160a01b038116600114155b8015611a3c57506001600160a01b0381163014155b611a585760405162461bcd60e51b815260040161070190612c6f565b6001600160a01b038181166000908152600260205260409020541615611a905760405162461bcd60e51b815260040161070190612c8e565b6001600160a01b03821615801590611ab257506001600160a01b038216600114155b611ace5760405162461bcd60e51b815260040161070190612c6f565b6001600160a01b03838116600090815260026020526040902054811690831614611b225760405162461bcd60e51b8152602060048201526005602482015264475332303560d81b6044820152606401610701565b6001600160a01b038281166000818152600260209081526040808320805487871680865283862080549289166001600160a01b0319938416179055968a1685528285208054821690971790965592849052825490941690915591519081527ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf910160405180910390a16040516001600160a01b03821681527f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269060200160405180910390a1505050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d604051611c26929190612f5e565b604051908190038120611c4c949392918e908e908e908e908e908e908e90602001612f6e565b60408051601f1981840301815291905280516020909101209050601960f81b600160f81b611c78611d2e565b6040516001600160f81b031993841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529150509b9a5050505050505050505050565b611ccd611ef8565b611cf5817f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b6040516001600160a01b03821681527f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b090602001610faa565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b611d8d611ef8565b806001600354611d9d9190612ec5565b1015611dbb5760405162461bcd60e51b815260040161070190612d6f565b6001600160a01b03821615801590611ddd57506001600160a01b038216600114155b611df95760405162461bcd60e51b815260040161070190612c6f565b6001600160a01b03838116600090815260026020526040902054811690831614611e4d5760405162461bcd60e51b8152602060048201526005602482015264475332303560d81b6044820152606401610701565b6001600160a01b03828116600081815260026020526040808220805488861684529183208054929095166001600160a01b03199283161790945591815282549091169091556003805491611ea083612fdd565b90915550506040516001600160a01b03831681527ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf9060200160405180910390a18060045414611ef357611ef381610fb5565b505050565b333014611f2f5760405162461bcd60e51b8152602060048201526005602482015264475330333160d81b6044820152606401610701565b565b600082611f4057506000610ca3565b6000611f4c8385612d50565b905082611f598583612ea3565b14611f6357600080fd5b9392505050565b600080611f778385612e8b565b905083811015611f6357600080fd5b60006001836001811115611f9c57611f9c612d8e565b1415611fb5576000808551602087018986f49050611fc5565b600080855160208701888a87f190505b95945050505050565b600081831015611fde5781611f63565b5090919050565b600082821115611ff457600080fd5b6000610db08385612ec5565b6000806001600160a01b03831615612018578261201a565b325b90506001600160a01b0384166120ad5761204c3a861061203a573a61203c565b855b6120468989611f6a565b90611f31565b6040519092506001600160a01b0382169083156108fc029084906000818181858888f193505050506120a85760405162461bcd60e51b8152602060048201526005602482015264475330313160d81b6044820152606401610701565b6120fc565b6120bb856120468989611f6a565b91506120c88482846123e6565b6120fc5760405162461bcd60e51b815260206004820152600560248201526423a998189960d91b6044820152606401610701565b5095945050505050565b6004541561213e5760405162461bcd60e51b8152602060048201526005602482015264047533230360dc1b6044820152606401610701565b815181111561215f5760405162461bcd60e51b815260040161070190612d6f565b60018110156121985760405162461bcd60e51b815260206004820152600560248201526423a999181960d91b6044820152606401610701565b600160005b83518110156122b95760008482815181106121ba576121ba612edc565b6020026020010151905060006001600160a01b0316816001600160a01b0316141580156121f157506001600160a01b038116600114155b801561220657506001600160a01b0381163014155b80156122245750806001600160a01b0316836001600160a01b031614155b6122405760405162461bcd60e51b815260040161070190612c6f565b6001600160a01b0381811660009081526002602052604090205416156122785760405162461bcd60e51b815260040161070190612c8e565b6001600160a01b03928316600090815260026020526040902080546001600160a01b03191693821693909317909255806122b181612cc3565b91505061219d565b506001600160a01b0316600090815260026020526040902080546001600160a01b03191660011790559051600355600455565b600160008190526020527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f546001600160a01b0316156123565760405162461bcd60e51b8152602060048201526005602482015264047533130360dc1b6044820152606401610701565b6001600081905260208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80546001600160a01b03191690911790556001600160a01b03821615610802576123b28260008360015a611f86565b6108025760405162461bcd60e51b8152602060048201526005602482015264047533030360dc1b6044820152606401610701565b604080516001600160a01b03841660248201526044808201849052825180830390910181526064909101909152602080820180516001600160e01b031663a9059cbb60e01b1781528251600093929184919082896127105a03f13d80156124585760208114612460576000935061246b565b81935061246b565b600051158215171593505b5050509392505050565b6001600160a01b038116811461248a57600080fd5b50565b803561249881612475565b919050565b600080604083850312156124b057600080fd5b82356124bb81612475565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126124f057600080fd5b81356001600160401b038082111561250a5761250a6124c9565b604051601f8301601f19908116603f01168101908282118183101715612532576125326124c9565b8160405283815286602085880101111561254b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561258157600080fd5b8435935060208501356001600160401b038082111561259f57600080fd5b6125ab888389016124df565b945060408701359150808211156125c157600080fd5b506125ce878288016124df565b949793965093946060013593505050565b6000602082840312156125f157600080fd5b8135611f6381612475565b80356002811061249857600080fd5b6000806000806080858703121561262157600080fd5b843561262c81612475565b93506020850135925060408501356001600160401b0381111561264e57600080fd5b61265a878288016124df565b925050612669606086016125fc565b905092959194509250565b6000815180845260005b8181101561269a5760208185018101518683018201520161267e565b818111156126ac576000602083870101525b50601f01601f19169290920160200192915050565b8215158152604060208201526000610db06040830184612674565b600080604083850312156126ef57600080fd5b50508035926020909101359150565b602081526000611f636020830184612674565b60006020828403121561272357600080fd5b5035919050565b60008083601f84011261273c57600080fd5b5081356001600160401b0381111561275357600080fd5b60208301915083602082850101111561276b57600080fd5b9250929050565b60008060008060008060008060008060006101408c8e03121561279457600080fd5b61279d8c61248d565b9a5060208c013599506001600160401b038060408e013511156127bf57600080fd5b6127cf8e60408f01358f0161272a565b909a5098506127e060608e016125fc565b975060808d0135965060a08d0135955060c08d0135945061280360e08e0161248d565b93506128126101008e0161248d565b9250806101208e0135111561282657600080fd5b506128388d6101208e01358e016124df565b90509295989b509295989b9093969950565b60008060006060848603121561285f57600080fd5b8335925060208401356001600160401b038082111561287d57600080fd5b612889878388016124df565b9350604086013591508082111561289f57600080fd5b506128ac868287016124df565b9150509250925092565b600081518084526020808501945080840160005b838110156128ef5781516001600160a01b0316875295820195908201906001016128ca565b509495945050505050565b602081526000611f6360208301846128b6565b6000806040838503121561292057600080fd5b823561292b81612475565b915060208301356001600160401b0381111561294657600080fd5b612952858286016124df565b9150509250929050565b6000806000806000806000806000806101008b8d03121561297c57600080fd5b8a356001600160401b038082111561299357600080fd5b818d0191508d601f8301126129a757600080fd5b8135818111156129b657600080fd5b8e60208260051b85010111156129cb57600080fd5b60208381019d50909b508d013599506129e660408e0161248d565b985060608d01359150808211156129fc57600080fd5b50612a098d828e0161272a565b9097509550612a1c905060808c0161248d565b9350612a2a60a08c0161248d565b925060c08b01359150612a3f60e08c0161248d565b90509295989b9194979a5092959850565b600080600080600060808688031215612a6857600080fd5b8535612a7381612475565b94506020860135935060408601356001600160401b03811115612a9557600080fd5b612aa18882890161272a565b9094509250612ab49050606087016125fc565b90509295509295909350565b604081526000612ad360408301856128b6565b905060018060a01b03831660208301529392505050565b60008060008060008060008060008060006101408c8e031215612b0c57600080fd5b8b35612b1781612475565b9a5060208c0135995060408c01356001600160401b03811115612b3957600080fd5b612b458e828f0161272a565b909a509850612b58905060608d016125fc565b965060808c0135955060a08c0135945060c08c0135935060e08c0135612b7d81612475565b92506101008c0135612b8e81612475565b809250506101208c013590509295989b509295989b9093969950565b60008060408385031215612bbd57600080fd5b8235612bc881612475565b91506020830135612bd881612475565b809150509250929050565b600080600060608486031215612bf857600080fd5b8335612c0381612475565b92506020840135612c1381612475565b91506040840135612c2381612475565b809150509250925092565b600080600060608486031215612c4357600080fd5b8335612c4e81612475565b92506020840135612c5e81612475565b929592945050506040919091013590565b602080825260059082015264475332303360d81b604082015260600190565b60208082526005908201526411d4cc8c0d60da1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600019821415612cd757612cd7612cad565b5060010190565b604081526000612cf16040830185612674565b8281036020840152611fc58185612674565b600060208284031215612d1557600080fd5b81516001600160e01b031981168114611f6357600080fd5b600060ff821660ff841680821015612d4757612d47612cad565b90039392505050565b6000816000190483118215151615612d6a57612d6a612cad565b500290565b602080825260059082015264475332303160d81b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b60028110612dc257634e487b7160e01b600052602160045260246000fd5b9052565b6001600160a01b038d168152602081018c90526101606040820181905281018a905260006101808b8d828501376000838d01820152601f8c01601f19168301612e12606085018d612da4565b8a60808501528960a08501528860c0850152612e3960e08501896001600160a01b03169052565b6001600160a01b0387166101008501528184820301610120850152612e6082820187612674565b92505050612e7a6101408301846001600160a01b03169052565b9d9c50505050505050505050505050565b60008219821115612e9e57612e9e612cad565b500190565b600082612ec057634e487b7160e01b600052601260045260246000fd5b500490565b600082821015612ed757612ed7612cad565b500390565b634e487b7160e01b600052603260045260246000fd5b6080808252810185905260008660a08301825b88811015612f35578235612f1881612475565b6001600160a01b0316825260209283019290910190600101612f05565b50602084019690965250506001600160a01b039283166040820152911660609091015292915050565b8183823760009101908152919050565b8b81526001600160a01b038b81166020830152604082018b9052606082018a9052610160820190612fa2608084018b612da4565b60a083019890985260c082019690965260e0810194909452918516610100840152909316610120820152610140019190915295945050505050565b600081612fec57612fec612cad565b50600019019056fea2646970667358221220f6f5fdd82f6339ba7e849e16f376185b1da6f9d1c9d29b9e22a63bb16320857364736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000042a18bab999803bba3c7186dc725e567ed28d95500000000000000000000000080efdd3bb15f2108c407049c5575490858800d4700000000000000000000000056afb8383b3e8db331e711e1183f195ced7b9faf0000000000000000000000005b2962121b4334fe563f7062fea975f51313ede300000000000000000000000009dea15d4e1f82787e181f23788dc3f4b3d3dae400000000000000000000000070cc8f7c40a8e65a73b804ad1c49f39d40ea3050000000000000000000000000433171908d5bab4ac0e860c64d1333f51a310321000000000000000000000000918350a01a4c259fbcc94c6fb2ca49a3753bdb86
-----Decoded View---------------
Arg [0] : _owners (address[]): 0x42A18Bab999803BBa3c7186DC725E567Ed28D955,0x80efDd3bB15F2108C407049C5575490858800D47,0x56AfB8383B3E8DB331E711e1183F195CeD7B9FaF,0x5b2962121b4334fe563F7062feA975f51313EDE3,0x09dEa15D4E1F82787e181F23788Dc3f4b3d3DAE4,0x70cC8f7C40A8e65A73b804Ad1c49F39D40ea3050,0x433171908d5BAB4ac0E860c64D1333F51A310321,0x918350a01A4C259FBCc94c6Fb2ca49A3753BDb86
Arg [1] : _threshold (uint256): 4
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [3] : 00000000000000000000000042a18bab999803bba3c7186dc725e567ed28d955
Arg [4] : 00000000000000000000000080efdd3bb15f2108c407049c5575490858800d47
Arg [5] : 00000000000000000000000056afb8383b3e8db331e711e1183f195ced7b9faf
Arg [6] : 0000000000000000000000005b2962121b4334fe563f7062fea975f51313ede3
Arg [7] : 00000000000000000000000009dea15d4e1f82787e181f23788dc3f4b3d3dae4
Arg [8] : 00000000000000000000000070cc8f7c40a8e65a73b804ad1c49f39d40ea3050
Arg [9] : 000000000000000000000000433171908d5bab4ac0e860c64d1333f51a310321
Arg [10] : 000000000000000000000000918350a01a4c259fbcc94c6fb2ca49a3753bdb86
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ 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.