Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 18 from a total of 18 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Execute Transact... | 168492783 | 470 days ago | IN | 0 ETH | 0.00007275 | ||||
Execute Transact... | 168454668 | 470 days ago | IN | 0 ETH | 0.00007185 | ||||
Confirm Transact... | 167477186 | 473 days ago | IN | 0 ETH | 0.00003874 | ||||
Submit Transacti... | 167139437 | 474 days ago | IN | 0 ETH | 0.00014507 | ||||
Confirm Transact... | 109930960 | 652 days ago | IN | 0 ETH | 0.00003602 | ||||
Submit Transacti... | 108664740 | 656 days ago | IN | 0 ETH | 0.00015 | ||||
Execute Transact... | 65233246 | 785 days ago | IN | 0 ETH | 0.00007203 | ||||
Confirm Transact... | 62221708 | 794 days ago | IN | 0 ETH | 0.00004111 | ||||
Submit Transacti... | 61639262 | 796 days ago | IN | 0 ETH | 0.00014224 | ||||
Execute Transact... | 37939185 | 891 days ago | IN | 0 ETH | 0.00003606 | ||||
Confirm Transact... | 34622140 | 903 days ago | IN | 0 ETH | 0.00001913 | ||||
Submit Transacti... | 31172646 | 916 days ago | IN | 0 ETH | 0.00012972 | ||||
Execute Transact... | 30855706 | 917 days ago | IN | 0 ETH | 0.00007407 | ||||
Confirm Transact... | 29622767 | 924 days ago | IN | 0 ETH | 0.00004081 | ||||
Submit Transacti... | 29521341 | 925 days ago | IN | 0 ETH | 0.00022855 | ||||
Submit Transacti... | 7302501 | 1147 days ago | IN | 0 ETH | 0.001637279772 ETH | ||||
Execute Transact... | 7122601 | 1149 days ago | IN | 0 ETH | 0.000758315227 ETH | ||||
Submit Transacti... | 6747518 | 1154 days ago | IN | 0 ETH | 0.001325012502 ETH |
Latest 18 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
65233246 | 785 days ago | 0 ETH | ||||
65233246 | 785 days ago | 0 ETH | ||||
37939185 | 891 days ago | 0 ETH | ||||
37939185 | 891 days ago | 0 ETH | ||||
37939185 | 891 days ago | 0 ETH | ||||
37939185 | 891 days ago | 0 ETH | ||||
37939185 | 891 days ago | 0 ETH | ||||
30855706 | 917 days ago | 0 ETH | ||||
30855706 | 917 days ago | 0 ETH | ||||
30855706 | 917 days ago | 0 ETH | ||||
30855706 | 917 days ago | 0 ETH | ||||
30855706 | 917 days ago | 0 ETH | ||||
30855706 | 917 days ago | 0 ETH | ||||
30855706 | 917 days ago | 0 ETH | ||||
30855706 | 917 days ago | 0 ETH | ||||
7122601 | 1149 days ago | 0 ETH | ||||
7122601 | 1149 days ago | 0 ETH | ||||
7122601 | 1149 days ago | 0 ETH |
Loading...
Loading
Contract Name:
ZeroExGovernor
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity Standard Json-Input format)
/* Copyright 2019 ZeroEx Intl. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity ^0.5.9; pragma experimental ABIEncoderV2; import "./MultiSigWalletWithTimeLock.sol"; import "@0x/contracts-utils/contracts/src/LibBytes.sol"; import "@0x/contracts-utils/contracts/src/LibSafeMath.sol"; contract ZeroExGovernor is MultiSigWalletWithTimeLock { using LibBytes for bytes; using LibSafeMath for uint256; struct TimeLock { bool hasCustomTimeLock; uint128 secondsTimeLocked; } event FunctionCallTimeLockRegistration( bytes4 functionSelector, address destination, bool hasCustomTimeLock, uint128 newSecondsTimeLocked ); // Function selector => destination => seconds timelocked mapping (bytes4 => mapping (address => TimeLock)) public functionCallTimeLocks; /// @dev Contract constructor sets initial owners, required number of confirmations, and default time lock /// It will also register unique timelocks for each passed in function selector / destination combo. /// @param _functionSelectors Array of function selectors for registered functions. /// @param _destinations Array of destinations for registered function calls. /// @param _functionCallTimeLockSeconds Array of seconds that each registered function call will be timelocked. /// @param _owners List of initial owners. /// @param _required Number of required confirmations. /// @param _defaultSecondsTimeLocked Default duration in seconds needed after a transaction is confirmed to become executable. constructor ( bytes4[] memory _functionSelectors, address[] memory _destinations, uint128[] memory _functionCallTimeLockSeconds, address[] memory _owners, uint256 _required, uint256 _defaultSecondsTimeLocked ) public MultiSigWalletWithTimeLock( _owners, _required, _defaultSecondsTimeLocked ) { uint256 length = _functionSelectors.length; require( length == _destinations.length && length == _functionCallTimeLockSeconds.length, "EQUAL_LENGTHS_REQUIRED" ); // Register function timelocks for (uint256 i = 0; i != length; i++) { _registerFunctionCall( true, // all functions registered in constructor are assumed to have a custom timelock _functionSelectors[i], _destinations[i], _functionCallTimeLockSeconds[i] ); } } /// @dev Registers a custom timelock to a specific function selector / destination combo /// @param hasCustomTimeLock True if timelock is custom. /// @param functionSelector 4 byte selector of registered function. /// @param destination Address of destination where function will be called. /// @param newSecondsTimeLocked Duration in seconds needed after a transaction is confirmed to become executable. function registerFunctionCall( bool hasCustomTimeLock, bytes4 functionSelector, address destination, uint128 newSecondsTimeLocked ) external onlyWallet { _registerFunctionCall( hasCustomTimeLock, functionSelector, destination, newSecondsTimeLocked ); } /// @dev Allows anyone to execute a confirmed transaction. /// Transactions *must* encode the values with the signature "bytes[] data, address[] destinations, uint256[] values" /// The `destination` and `value` fields of the transaction in storage are ignored. /// All function calls must be successful or the entire call will revert. /// @param transactionId Transaction ID. function executeTransaction(uint256 transactionId) public notExecuted(transactionId) fullyConfirmed(transactionId) { Transaction storage transaction = transactions[transactionId]; transaction.executed = true; // Decode batch transaction data from transaction.data // `destination` and `value` fields of transaction are ignored // Note that `destination` must be non-0, or the transaction cannot be submitted // solhint-disable ( bytes[] memory data, address[] memory destinations, uint256[] memory values ) = abi.decode( transaction.data, (bytes[], address[], uint256[]) ); // solhint-enable // Ensure lengths of array properties are equal uint256 length = data.length; require( length == destinations.length && length == values.length, "EQUAL_LENGTHS_REQUIRED" ); uint256 transactionConfirmationTime = confirmationTimes[transactionId]; for (uint i = 0; i != length; i++) { // Ensure that each function call is past its timelock _assertValidFunctionCall( transactionConfirmationTime, data[i], destinations[i] ); // Call each function // solhint-disable-next-line avoid-call-value (bool didSucceed,) = destinations[i].call.value(values[i])(data[i]); // Ensure that function call was successful require( didSucceed, "FAILED_EXECUTION" ); } emit Execution(transactionId); } /// @dev Registers a custom timelock to a specific function selector / destination combo /// @param hasCustomTimeLock True if timelock is custom. /// @param functionSelector 4 byte selector of registered function. /// @param destination Address of destination where function will be called. /// @param newSecondsTimeLocked Duration in seconds needed after a transaction is confirmed to become executable. function _registerFunctionCall( bool hasCustomTimeLock, bytes4 functionSelector, address destination, uint128 newSecondsTimeLocked ) internal { // Clear the previous secondsTimeLocked if custom timelock not used uint128 _secondsTimeLocked = hasCustomTimeLock ? newSecondsTimeLocked : 0; TimeLock memory timeLock = TimeLock({ hasCustomTimeLock: hasCustomTimeLock, secondsTimeLocked: _secondsTimeLocked }); functionCallTimeLocks[functionSelector][destination] = timeLock; emit FunctionCallTimeLockRegistration( functionSelector, destination, hasCustomTimeLock, _secondsTimeLocked ); } /// @dev Ensures that the function call has past its timelock. /// @param transactionConfirmationTime Timestamp at which transaction was fully confirmed. /// @param data Function calldata. /// @param destination Address to call function on. function _assertValidFunctionCall( uint256 transactionConfirmationTime, bytes memory data, address destination ) internal view { bytes4 functionSelector = data.readBytes4(0); TimeLock memory timeLock = functionCallTimeLocks[functionSelector][destination]; // solhint-disable not-rely-on-time if (timeLock.hasCustomTimeLock) { require( block.timestamp >= transactionConfirmationTime.safeAdd(timeLock.secondsTimeLocked), "CUSTOM_TIME_LOCK_INCOMPLETE" ); } else { require( block.timestamp >= transactionConfirmationTime.safeAdd(secondsTimeLocked), "DEFAULT_TIME_LOCK_INCOMPLETE" ); } // solhint-enable not-rely-on-time } }
// solhint-disable pragma solidity ^0.5.9; /// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution. /// @author Stefan George - <[email protected]> contract MultiSigWallet { /* * Events */ event Confirmation(address indexed sender, uint256 indexed transactionId); event Revocation(address indexed sender, uint256 indexed transactionId); event Submission(uint256 indexed transactionId); event Execution(uint256 indexed transactionId); event ExecutionFailure(uint256 indexed transactionId); event Deposit(address indexed sender, uint256 value); event OwnerAddition(address indexed owner); event OwnerRemoval(address indexed owner); event RequirementChange(uint256 required); /* * Constants */ uint256 constant public MAX_OWNER_COUNT = 50; /* * Storage */ mapping (uint256 => Transaction) public transactions; mapping (uint256 => mapping (address => bool)) public confirmations; mapping (address => bool) public isOwner; address[] public owners; uint256 public required; uint256 public transactionCount; struct Transaction { address destination; uint256 value; bytes data; bool executed; } /* * Modifiers */ modifier onlyWallet() { require( msg.sender == address(this), "ONLY_CALLABLE_BY_WALLET" ); _; } modifier ownerDoesNotExist(address owner) { require( !isOwner[owner], "OWNER_EXISTS" ); _; } modifier ownerExists(address owner) { require( isOwner[owner], "OWNER_DOESNT_EXIST" ); _; } modifier transactionExists(uint256 transactionId) { require( transactions[transactionId].destination != address(0), "TX_DOESNT_EXIST" ); _; } modifier confirmed(uint256 transactionId, address owner) { require( confirmations[transactionId][owner], "TX_NOT_CONFIRMED" ); _; } modifier notConfirmed(uint256 transactionId, address owner) { require( !confirmations[transactionId][owner], "TX_ALREADY_CONFIRMED" ); _; } modifier notExecuted(uint256 transactionId) { require( !transactions[transactionId].executed, "TX_ALREADY_EXECUTED" ); _; } modifier notNull(address _address) { require( _address != address(0), "NULL_ADDRESS" ); _; } modifier validRequirement(uint256 ownerCount, uint256 _required) { require( ownerCount <= MAX_OWNER_COUNT && _required <= ownerCount && _required != 0 && ownerCount != 0, "INVALID_REQUIREMENTS" ); _; } /// @dev Fallback function allows to deposit ether. function() external payable { if (msg.value > 0) { emit Deposit(msg.sender, msg.value); } } /* * Public functions */ /// @dev Contract constructor sets initial owners and required number of confirmations. /// @param _owners List of initial owners. /// @param _required Number of required confirmations. constructor( address[] memory _owners, uint256 _required ) public validRequirement(_owners.length, _required) { for (uint256 i = 0; i < _owners.length; i++) { require( !isOwner[_owners[i]] && _owners[i] != address(0), "DUPLICATE_OR_NULL_OWNER" ); isOwner[_owners[i]] = true; } owners = _owners; required = _required; } /// @dev Allows to add a new owner. Transaction has to be sent by wallet. /// @param owner Address of new owner. function addOwner(address owner) public onlyWallet ownerDoesNotExist(owner) notNull(owner) validRequirement(owners.length + 1, required) { isOwner[owner] = true; owners.push(owner); emit OwnerAddition(owner); } /// @dev Allows to remove an owner. Transaction has to be sent by wallet. /// @param owner Address of owner. function removeOwner(address owner) public onlyWallet ownerExists(owner) { isOwner[owner] = false; for (uint256 i = 0; i < owners.length - 1; i++) { if (owners[i] == owner) { owners[i] = owners[owners.length - 1]; break; } } owners.length -= 1; if (required > owners.length) { changeRequirement(owners.length); } emit OwnerRemoval(owner); } /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet. /// @param owner Address of owner to be replaced. /// @param newOwner Address of new owner. function replaceOwner(address owner, address newOwner) public onlyWallet ownerExists(owner) ownerDoesNotExist(newOwner) { for (uint256 i = 0; i < owners.length; i++) { if (owners[i] == owner) { owners[i] = newOwner; break; } } isOwner[owner] = false; isOwner[newOwner] = true; emit OwnerRemoval(owner); emit OwnerAddition(newOwner); } /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet. /// @param _required Number of required confirmations. function changeRequirement(uint256 _required) public onlyWallet validRequirement(owners.length, _required) { required = _required; emit RequirementChange(_required); } /// @dev Allows an owner to submit and confirm a transaction. /// @param destination Transaction target address. /// @param value Transaction ether value. /// @param data Transaction data payload. /// @return Returns transaction ID. function submitTransaction(address destination, uint256 value, bytes memory data) public returns (uint256 transactionId) { transactionId = _addTransaction(destination, value, data); confirmTransaction(transactionId); } /// @dev Allows an owner to confirm a transaction. /// @param transactionId Transaction ID. function confirmTransaction(uint256 transactionId) public ownerExists(msg.sender) transactionExists(transactionId) notConfirmed(transactionId, msg.sender) { confirmations[transactionId][msg.sender] = true; emit Confirmation(msg.sender, transactionId); executeTransaction(transactionId); } /// @dev Allows an owner to revoke a confirmation for a transaction. /// @param transactionId Transaction ID. function revokeConfirmation(uint256 transactionId) public ownerExists(msg.sender) confirmed(transactionId, msg.sender) notExecuted(transactionId) { confirmations[transactionId][msg.sender] = false; emit Revocation(msg.sender, transactionId); } /// @dev Allows anyone to execute a confirmed transaction. /// @param transactionId Transaction ID. function executeTransaction(uint256 transactionId) public ownerExists(msg.sender) confirmed(transactionId, msg.sender) notExecuted(transactionId) { if (isConfirmed(transactionId)) { Transaction storage txn = transactions[transactionId]; txn.executed = true; if ( _externalCall( txn.destination, txn.value, txn.data.length, txn.data ) ) { emit Execution(transactionId); } else { emit ExecutionFailure(transactionId); txn.executed = false; } } } // call has been separated into its own function in order to take advantage // of the Solidity's code generator to produce a loop that copies tx.data into memory. function _externalCall( address destination, uint256 value, uint256 dataLength, bytes memory data ) internal returns (bool) { bool result; assembly { let x := mload(0x40) // "Allocate" memory for output (0x40 is where "free memory" pointer is stored by convention) let d := add(data, 32) // First 32 bytes are the padded length of data, so exclude that result := call( sub(gas, 34710), // 34710 is the value that solidity is currently emitting // It includes callGas (700) + callVeryLow (3, to pay for SUB) + callValueTransferGas (9000) + // callNewAccountGas (25000, in case the destination address does not exist and needs creating) destination, value, d, dataLength, // Size of the input (in bytes) - this is what fixes the padding problem x, 0 // Output is ignored, therefore the output size is zero ) } return result; } /// @dev Returns the confirmation status of a transaction. /// @param transactionId Transaction ID. /// @return Confirmation status. function isConfirmed(uint256 transactionId) public view returns (bool) { uint256 count = 0; for (uint256 i = 0; i < owners.length; i++) { if (confirmations[transactionId][owners[i]]) { count += 1; } if (count == required) { return true; } } } /* * Internal functions */ /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet. /// @param destination Transaction target address. /// @param value Transaction ether value. /// @param data Transaction data payload. /// @return Returns transaction ID. function _addTransaction( address destination, uint256 value, bytes memory data ) internal notNull(destination) returns (uint256 transactionId) { transactionId = transactionCount; transactions[transactionId] = Transaction({ destination: destination, value: value, data: data, executed: false }); transactionCount += 1; emit Submission(transactionId); } /* * Web3 call functions */ /// @dev Returns number of confirmations of a transaction. /// @param transactionId Transaction ID. /// @return Number of confirmations. function getConfirmationCount(uint256 transactionId) public view returns (uint256 count) { for (uint256 i = 0; i < owners.length; i++) { if (confirmations[transactionId][owners[i]]) { count += 1; } } } /// @dev Returns total number of transactions after filers are applied. /// @param pending Include pending transactions. /// @param executed Include executed transactions. /// @return Total number of transactions after filters are applied. function getTransactionCount(bool pending, bool executed) public view returns (uint256 count) { for (uint256 i = 0; i < transactionCount; i++) { if (pending && !transactions[i].executed || executed && transactions[i].executed) { count += 1; } } } /// @dev Returns list of owners. /// @return List of owner addresses. function getOwners() public view returns (address[] memory) { return owners; } /// @dev Returns array with owner addresses, which confirmed transaction. /// @param transactionId Transaction ID. /// @return Returns array of owner addresses. function getConfirmations(uint256 transactionId) public view returns (address[] memory _confirmations) { address[] memory confirmationsTemp = new address[](owners.length); uint256 count = 0; uint256 i; for (i = 0; i < owners.length; i++) { if (confirmations[transactionId][owners[i]]) { confirmationsTemp[count] = owners[i]; count += 1; } } _confirmations = new address[](count); for (i = 0; i < count; i++) { _confirmations[i] = confirmationsTemp[i]; } } /// @dev Returns list of transaction IDs in defined range. /// @param from Index start position of transaction array. /// @param to Index end position of transaction array. /// @param pending Include pending transactions. /// @param executed Include executed transactions. /// @return Returns array of transaction IDs. function getTransactionIds( uint256 from, uint256 to, bool pending, bool executed ) public view returns (uint256[] memory _transactionIds) { uint256[] memory transactionIdsTemp = new uint256[](transactionCount); uint256 count = 0; uint256 i; for (i = 0; i < transactionCount; i++) { if (pending && !transactions[i].executed || executed && transactions[i].executed) { transactionIdsTemp[count] = i; count += 1; } } _transactionIds = new uint256[](to - from); for (i = from; i < to; i++) { _transactionIds[i - from] = transactionIdsTemp[i]; } } }
/* Copyright 2019 ZeroEx Intl. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity ^0.5.9; import "@0x/contracts-utils/contracts/src/LibSafeMath.sol"; import "./MultiSigWallet.sol"; /// @title Multisignature wallet with time lock- Allows multiple parties to execute a transaction after a time lock has passed. /// @author Amir Bandeali - <[email protected]> // solhint-disable not-rely-on-time contract MultiSigWalletWithTimeLock is MultiSigWallet { using LibSafeMath for uint256; event ConfirmationTimeSet(uint256 indexed transactionId, uint256 confirmationTime); event TimeLockChange(uint256 secondsTimeLocked); uint256 public secondsTimeLocked; mapping (uint256 => uint256) public confirmationTimes; modifier fullyConfirmed(uint256 transactionId) { require( isConfirmed(transactionId), "TX_NOT_FULLY_CONFIRMED" ); _; } modifier pastTimeLock(uint256 transactionId) { require( block.timestamp >= confirmationTimes[transactionId].safeAdd(secondsTimeLocked), "TIME_LOCK_INCOMPLETE" ); _; } /// @dev Contract constructor sets initial owners, required number of confirmations, and time lock. /// @param _owners List of initial owners. /// @param _required Number of required confirmations. /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds. constructor ( address[] memory _owners, uint256 _required, uint256 _secondsTimeLocked ) public MultiSigWallet(_owners, _required) { secondsTimeLocked = _secondsTimeLocked; } /// @dev Changes the duration of the time lock for transactions. /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds. function changeTimeLock(uint256 _secondsTimeLocked) public onlyWallet { secondsTimeLocked = _secondsTimeLocked; emit TimeLockChange(_secondsTimeLocked); } /// @dev Allows an owner to confirm a transaction. /// @param transactionId Transaction ID. function confirmTransaction(uint256 transactionId) public ownerExists(msg.sender) transactionExists(transactionId) notConfirmed(transactionId, msg.sender) { bool isTxFullyConfirmedBeforeConfirmation = isConfirmed(transactionId); confirmations[transactionId][msg.sender] = true; emit Confirmation(msg.sender, transactionId); if (!isTxFullyConfirmedBeforeConfirmation && isConfirmed(transactionId)) { _setConfirmationTime(transactionId, block.timestamp); } } /// @dev Allows anyone to execute a confirmed transaction. /// @param transactionId Transaction ID. function executeTransaction(uint256 transactionId) public notExecuted(transactionId) fullyConfirmed(transactionId) pastTimeLock(transactionId) { Transaction storage txn = transactions[transactionId]; txn.executed = true; if (_externalCall(txn.destination, txn.value, txn.data.length, txn.data)) { emit Execution(transactionId); } else { emit ExecutionFailure(transactionId); txn.executed = false; } } /// @dev Sets the time of when a submission first passed. function _setConfirmationTime(uint256 transactionId, uint256 confirmationTime) internal { confirmationTimes[transactionId] = confirmationTime; emit ConfirmationTimeSet(transactionId, confirmationTime); } }
pragma solidity ^0.5.9; import "./LibRichErrors.sol"; import "./LibSafeMathRichErrors.sol"; library LibSafeMath { function safeMul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; if (c / a != b) { LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError( LibSafeMathRichErrors.BinOpErrorCodes.MULTIPLICATION_OVERFLOW, a, b )); } return c; } function safeDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError( LibSafeMathRichErrors.BinOpErrorCodes.DIVISION_BY_ZERO, a, b )); } uint256 c = a / b; return c; } function safeSub(uint256 a, uint256 b) internal pure returns (uint256) { if (b > a) { LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError( LibSafeMathRichErrors.BinOpErrorCodes.SUBTRACTION_UNDERFLOW, a, b )); } return a - b; } function safeAdd(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; if (c < a) { LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError( LibSafeMathRichErrors.BinOpErrorCodes.ADDITION_OVERFLOW, a, b )); } return c; } function max256(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } function min256(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } }
/* Copyright 2019 ZeroEx Intl. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity ^0.5.9; library LibRichErrors { // bytes4(keccak256("Error(string)")) bytes4 internal constant STANDARD_ERROR_SELECTOR = 0x08c379a0; // solhint-disable func-name-mixedcase /// @dev ABI encode a standard, string revert error payload. /// This is the same payload that would be included by a `revert(string)` /// solidity statement. It has the function signature `Error(string)`. /// @param message The error string. /// @return The ABI encoded error. function StandardError( string memory message ) internal pure returns (bytes memory) { return abi.encodeWithSelector( STANDARD_ERROR_SELECTOR, bytes(message) ); } // solhint-enable func-name-mixedcase /// @dev Reverts an encoded rich revert reason `errorData`. /// @param errorData ABI encoded error data. function rrevert(bytes memory errorData) internal pure { assembly { revert(add(errorData, 0x20), mload(errorData)) } } }
pragma solidity ^0.5.9; library LibSafeMathRichErrors { // bytes4(keccak256("Uint256BinOpError(uint8,uint256,uint256)")) bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR = 0xe946c1bb; // bytes4(keccak256("Uint256DowncastError(uint8,uint256)")) bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR = 0xc996af7b; enum BinOpErrorCodes { ADDITION_OVERFLOW, MULTIPLICATION_OVERFLOW, SUBTRACTION_UNDERFLOW, DIVISION_BY_ZERO } enum DowncastErrorCodes { VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32, VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64, VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96 } // solhint-disable func-name-mixedcase function Uint256BinOpError( BinOpErrorCodes errorCode, uint256 a, uint256 b ) internal pure returns (bytes memory) { return abi.encodeWithSelector( UINT256_BINOP_ERROR_SELECTOR, errorCode, a, b ); } function Uint256DowncastError( DowncastErrorCodes errorCode, uint256 a ) internal pure returns (bytes memory) { return abi.encodeWithSelector( UINT256_DOWNCAST_ERROR_SELECTOR, errorCode, a ); } }
/* Copyright 2019 ZeroEx Intl. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity ^0.5.9; import "./LibBytesRichErrors.sol"; import "./LibRichErrors.sol"; library LibBytes { using LibBytes for bytes; /// @dev Gets the memory address for a byte array. /// @param input Byte array to lookup. /// @return memoryAddress Memory address of byte array. This /// points to the header of the byte array which contains /// the length. function rawAddress(bytes memory input) internal pure returns (uint256 memoryAddress) { assembly { memoryAddress := input } return memoryAddress; } /// @dev Gets the memory address for the contents of a byte array. /// @param input Byte array to lookup. /// @return memoryAddress Memory address of the contents of the byte array. function contentAddress(bytes memory input) internal pure returns (uint256 memoryAddress) { assembly { memoryAddress := add(input, 32) } return memoryAddress; } /// @dev Copies `length` bytes from memory location `source` to `dest`. /// @param dest memory address to copy bytes to. /// @param source memory address to copy bytes from. /// @param length number of bytes to copy. function memCopy( uint256 dest, uint256 source, uint256 length ) internal pure { if (length < 32) { // Handle a partial word by reading destination and masking // off the bits we are interested in. // This correctly handles overlap, zero lengths and source == dest assembly { let mask := sub(exp(256, sub(32, length)), 1) let s := and(mload(source), not(mask)) let d := and(mload(dest), mask) mstore(dest, or(s, d)) } } else { // Skip the O(length) loop when source == dest. if (source == dest) { return; } // For large copies we copy whole words at a time. The final // word is aligned to the end of the range (instead of after the // previous) to handle partial words. So a copy will look like this: // // #### // #### // #### // #### // // We handle overlap in the source and destination range by // changing the copying direction. This prevents us from // overwriting parts of source that we still need to copy. // // This correctly handles source == dest // if (source > dest) { assembly { // We subtract 32 from `sEnd` and `dEnd` because it // is easier to compare with in the loop, and these // are also the addresses we need for copying the // last bytes. length := sub(length, 32) let sEnd := add(source, length) let dEnd := add(dest, length) // Remember the last 32 bytes of source // This needs to be done here and not after the loop // because we may have overwritten the last bytes in // source already due to overlap. let last := mload(sEnd) // Copy whole words front to back // Note: the first check is always true, // this could have been a do-while loop. // solhint-disable-next-line no-empty-blocks for {} lt(source, sEnd) {} { mstore(dest, mload(source)) source := add(source, 32) dest := add(dest, 32) } // Write the last 32 bytes mstore(dEnd, last) } } else { assembly { // We subtract 32 from `sEnd` and `dEnd` because those // are the starting points when copying a word at the end. length := sub(length, 32) let sEnd := add(source, length) let dEnd := add(dest, length) // Remember the first 32 bytes of source // This needs to be done here and not after the loop // because we may have overwritten the first bytes in // source already due to overlap. let first := mload(source) // Copy whole words back to front // We use a signed comparisson here to allow dEnd to become // negative (happens when source and dest < 32). Valid // addresses in local memory will never be larger than // 2**255, so they can be safely re-interpreted as signed. // Note: the first check is always true, // this could have been a do-while loop. // solhint-disable-next-line no-empty-blocks for {} slt(dest, dEnd) {} { mstore(dEnd, mload(sEnd)) sEnd := sub(sEnd, 32) dEnd := sub(dEnd, 32) } // Write the first 32 bytes mstore(dest, first) } } } } /// @dev Returns a slices from a byte array. /// @param b The byte array to take a slice from. /// @param from The starting index for the slice (inclusive). /// @param to The final index for the slice (exclusive). /// @return result The slice containing bytes at indices [from, to) function slice( bytes memory b, uint256 from, uint256 to ) internal pure returns (bytes memory result) { // Ensure that the from and to positions are valid positions for a slice within // the byte array that is being used. if (from > to) { LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired, from, to )); } if (to > b.length) { LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired, to, b.length )); } // Create a new bytes structure and copy contents result = new bytes(to - from); memCopy( result.contentAddress(), b.contentAddress() + from, result.length ); return result; } /// @dev Returns a slice from a byte array without preserving the input. /// @param b The byte array to take a slice from. Will be destroyed in the process. /// @param from The starting index for the slice (inclusive). /// @param to The final index for the slice (exclusive). /// @return result The slice containing bytes at indices [from, to) /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted. function sliceDestructive( bytes memory b, uint256 from, uint256 to ) internal pure returns (bytes memory result) { // Ensure that the from and to positions are valid positions for a slice within // the byte array that is being used. if (from > to) { LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired, from, to )); } if (to > b.length) { LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired, to, b.length )); } // Create a new bytes structure around [from, to) in-place. assembly { result := add(b, from) mstore(result, sub(to, from)) } return result; } /// @dev Pops the last byte off of a byte array by modifying its length. /// @param b Byte array that will be modified. /// @return The byte that was popped off. function popLastByte(bytes memory b) internal pure returns (bytes1 result) { if (b.length == 0) { LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired, b.length, 0 )); } // Store last byte. result = b[b.length - 1]; assembly { // Decrement length of byte array. let newLen := sub(mload(b), 1) mstore(b, newLen) } return result; } /// @dev Tests equality of two byte arrays. /// @param lhs First byte array to compare. /// @param rhs Second byte array to compare. /// @return True if arrays are the same. False otherwise. function equals( bytes memory lhs, bytes memory rhs ) internal pure returns (bool equal) { // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare. // We early exit on unequal lengths, but keccak would also correctly // handle this. return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs); } /// @dev Reads an address from a position in a byte array. /// @param b Byte array containing an address. /// @param index Index in byte array of address. /// @return address from byte array. function readAddress( bytes memory b, uint256 index ) internal pure returns (address result) { if (b.length < index + 20) { LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired, b.length, index + 20 // 20 is length of address )); } // Add offset to index: // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index) // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index) index += 20; // Read address from array memory assembly { // 1. Add index to address of bytes array // 2. Load 32-byte word from memory // 3. Apply 20-byte mask to obtain address result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff) } return result; } /// @dev Writes an address into a specific position in a byte array. /// @param b Byte array to insert address into. /// @param index Index in byte array of address. /// @param input Address to put into byte array. function writeAddress( bytes memory b, uint256 index, address input ) internal pure { if (b.length < index + 20) { LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired, b.length, index + 20 // 20 is length of address )); } // Add offset to index: // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index) // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index) index += 20; // Store address into array memory assembly { // The address occupies 20 bytes and mstore stores 32 bytes. // First fetch the 32-byte word where we'll be storing the address, then // apply a mask so we have only the bytes in the word that the address will not occupy. // Then combine these bytes with the address and store the 32 bytes back to memory with mstore. // 1. Add index to address of bytes array // 2. Load 32-byte word from memory // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address let neighbors := and( mload(add(b, index)), 0xffffffffffffffffffffffff0000000000000000000000000000000000000000 ) // Make sure input address is clean. // (Solidity does not guarantee this) input := and(input, 0xffffffffffffffffffffffffffffffffffffffff) // Store the neighbors and address into memory mstore(add(b, index), xor(input, neighbors)) } } /// @dev Reads a bytes32 value from a position in a byte array. /// @param b Byte array containing a bytes32 value. /// @param index Index in byte array of bytes32 value. /// @return bytes32 value from byte array. function readBytes32( bytes memory b, uint256 index ) internal pure returns (bytes32 result) { if (b.length < index + 32) { LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired, b.length, index + 32 )); } // Arrays are prefixed by a 256 bit length parameter index += 32; // Read the bytes32 from array memory assembly { result := mload(add(b, index)) } return result; } /// @dev Writes a bytes32 into a specific position in a byte array. /// @param b Byte array to insert <input> into. /// @param index Index in byte array of <input>. /// @param input bytes32 to put into byte array. function writeBytes32( bytes memory b, uint256 index, bytes32 input ) internal pure { if (b.length < index + 32) { LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired, b.length, index + 32 )); } // Arrays are prefixed by a 256 bit length parameter index += 32; // Read the bytes32 from array memory assembly { mstore(add(b, index), input) } } /// @dev Reads a uint256 value from a position in a byte array. /// @param b Byte array containing a uint256 value. /// @param index Index in byte array of uint256 value. /// @return uint256 value from byte array. function readUint256( bytes memory b, uint256 index ) internal pure returns (uint256 result) { result = uint256(readBytes32(b, index)); return result; } /// @dev Writes a uint256 into a specific position in a byte array. /// @param b Byte array to insert <input> into. /// @param index Index in byte array of <input>. /// @param input uint256 to put into byte array. function writeUint256( bytes memory b, uint256 index, uint256 input ) internal pure { writeBytes32(b, index, bytes32(input)); } /// @dev Reads an unpadded bytes4 value from a position in a byte array. /// @param b Byte array containing a bytes4 value. /// @param index Index in byte array of bytes4 value. /// @return bytes4 value from byte array. function readBytes4( bytes memory b, uint256 index ) internal pure returns (bytes4 result) { if (b.length < index + 4) { LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError( LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired, b.length, index + 4 )); } // Arrays are prefixed by a 32 byte length field index += 32; // Read the bytes4 from array memory assembly { result := mload(add(b, index)) // Solidity does not require us to clean the trailing bytes. // We do it anyway result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000) } return result; } /// @dev Writes a new length to a byte array. /// Decreasing length will lead to removing the corresponding lower order bytes from the byte array. /// Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array. /// @param b Bytes array to write new length to. /// @param length New length of byte array. function writeLength(bytes memory b, uint256 length) internal pure { assembly { mstore(b, length) } } }
/* Copyright 2019 ZeroEx Intl. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity ^0.5.9; library LibBytesRichErrors { enum InvalidByteOperationErrorCodes { FromLessThanOrEqualsToRequired, ToLessThanOrEqualsLengthRequired, LengthGreaterThanZeroRequired, LengthGreaterThanOrEqualsFourRequired, LengthGreaterThanOrEqualsTwentyRequired, LengthGreaterThanOrEqualsThirtyTwoRequired, LengthGreaterThanOrEqualsNestedBytesLengthRequired, DestinationLengthGreaterThanOrEqualSourceLengthRequired } // bytes4(keccak256("InvalidByteOperationError(uint8,uint256,uint256)")) bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR = 0x28006595; // solhint-disable func-name-mixedcase function InvalidByteOperationError( InvalidByteOperationErrorCodes errorCode, uint256 offset, uint256 required ) internal pure returns (bytes memory) { return abi.encodeWithSelector( INVALID_BYTE_OPERATION_ERROR_SELECTOR, errorCode, offset, required ); } }
/* Copyright 2019 ZeroEx Intl. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity ^0.5.9; import "@0x/contracts-utils/contracts/src/LibBytes.sol"; contract ContractCallReceiver { using LibBytes for bytes; event ContractCall( bytes4 functionSelector, bytes data, uint256 value ); bytes4 constant internal ALWAYS_REVERT_SELECTOR = 0xF1F2F3F4; function () external payable { bytes4 selector = msg.data.readBytes4(0); if (selector == ALWAYS_REVERT_SELECTOR) { revert(); } emit ContractCall( selector, msg.data, msg.value ); } }
/* Copyright 2019 ZeroEx Intl. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity ^0.5.9; // solhint-disable no-empty-blocks contract TestRejectEther {}
/* Copyright 2019 ZeroEx Intl. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity ^0.5.9; pragma experimental ABIEncoderV2; import "../src/ZeroExGovernor.sol"; // solhint-disable no-empty-blocks contract TestZeroExGovernor is ZeroExGovernor { constructor ( bytes4[] memory _functionSelectors, address[] memory _destinations, uint128[] memory _functionCallTimeLockSeconds, address[] memory _owners, uint256 _required, uint256 _defaultSecondsTimeLocked ) public ZeroExGovernor( _functionSelectors, _destinations, _functionCallTimeLockSeconds, _owners, _required, _defaultSecondsTimeLocked ) {} function registerFunctionCallBypassWallet( bool hasCustomTimeLock, bytes4 functionSelector, address destination, uint128 newSecondsTimeLocked ) external { _registerFunctionCall( hasCustomTimeLock, functionSelector, destination, newSecondsTimeLocked ); } function assertValidFunctionCall( uint256 transactionConfirmationTime, bytes calldata data, address destination ) external view { _assertValidFunctionCall( transactionConfirmationTime, data, destination ); } }
{ "remappings": [ "@0x/contracts-utils=/Users/noah0x/Documents/0x/Arbitrum/exchange-v3/node_modules/@0x/contracts-utils" ], "optimizer": { "enabled": true, "runs": 1000000, "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true } }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "evmVersion": "istanbul" }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"bytes4[]","name":"_functionSelectors","type":"bytes4[]"},{"internalType":"address[]","name":"_destinations","type":"address[]"},{"internalType":"uint128[]","name":"_functionCallTimeLockSeconds","type":"uint128[]"},{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256","name":"_required","type":"uint256"},{"internalType":"uint256","name":"_defaultSecondsTimeLocked","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Confirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"confirmationTime","type":"uint256"}],"name":"ConfirmationTimeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Execution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"ExecutionFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes4","name":"functionSelector","type":"bytes4"},{"indexed":false,"internalType":"address","name":"destination","type":"address"},{"indexed":false,"internalType":"bool","name":"hasCustomTimeLock","type":"bool"},{"indexed":false,"internalType":"uint128","name":"newSecondsTimeLocked","type":"uint128"}],"name":"FunctionCallTimeLockRegistration","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerRemoval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"required","type":"uint256"}],"name":"RequirementChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Revocation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Submission","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"secondsTimeLocked","type":"uint256"}],"name":"TimeLockChange","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"MAX_OWNER_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"addOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_required","type":"uint256"}],"name":"changeRequirement","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_secondsTimeLocked","type":"uint256"}],"name":"changeTimeLock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"confirmTransaction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"confirmationTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"confirmations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"executeTransaction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"},{"internalType":"address","name":"","type":"address"}],"name":"functionCallTimeLocks","outputs":[{"internalType":"bool","name":"hasCustomTimeLock","type":"bool"},{"internalType":"uint128","name":"secondsTimeLocked","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"getConfirmationCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"getConfirmations","outputs":[{"internalType":"address[]","name":"_confirmations","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bool","name":"pending","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"}],"name":"getTransactionCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"},{"internalType":"bool","name":"pending","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"}],"name":"getTransactionIds","outputs":[{"internalType":"uint256[]","name":"_transactionIds","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"isConfirmed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"owners","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"hasCustomTimeLock","type":"bool"},{"internalType":"bytes4","name":"functionSelector","type":"bytes4"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint128","name":"newSecondsTimeLocked","type":"uint128"}],"name":"registerFunctionCall","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"removeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"replaceOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"required","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"revokeConfirmation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"secondsTimeLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"submitTransaction","outputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"transactionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transactions","outputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bool","name":"executed","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200338938038062003389833981016040819052620000349162000545565b8282828282815181603282111580156200004e5750818111155b80156200005a57508015155b80156200006657508115155b6200008e5760405162461bcd60e51b81526004016200008590620006b4565b60405180910390fd5b60005b8451811015620001755760026000868381518110620000ac57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615801562000108575060006001600160a01b0316858281518110620000f457fe5b60200260200101516001600160a01b031614155b620001275760405162461bcd60e51b8152600401620000859062000646565b6001600260008784815181106200013a57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905560010162000091565b5083516200018b90600390602087019062000317565b5050506004555060065550508551855181148015620001aa5750845181145b620001c95760405162461bcd60e51b815260040162000085906200067d565b60005b8181146200022e57620002256001898381518110620001e757fe5b6020026020010151898481518110620001fc57fe5b60200260200101518985815181106200021157fe5b60200260200101516200023c60201b60201c565b600101620001cc565b505050505050505062000732565b6000846200024c5760006200024e565b815b90506200025a62000381565b5060408051808201825286151581526001600160801b0380841660208084019182526001600160e01b031989166000908152600882528581206001600160a01b038a16825290915284902083518154925190931661010002610100600160881b031993151560ff19909316929092179290921617905590517f694405724de467488eda192d814f39ffe7f6503fe0b1eefd4ea332f9c611c5ec906200030790879087908a9087906200060b565b60405180910390a1505050505050565b8280548282559060005260206000209081019282156200036f579160200282015b828111156200036f57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000338565b506200037d92915062000398565b5090565b604080518082019091526000808252602082015290565b620003bf91905b808211156200037d5780546001600160a01b03191681556001016200039f565b90565b600082601f830112620003d3578081fd5b8151620003ea620003e48262000712565b620006eb565b8181529150602080830190848101818402860182018710156200040c57600080fd5b60005b84811015620004435781516001600160a01b03811681146200043057600080fd5b845292820192908201906001016200040f565b505050505092915050565b600082601f8301126200045f578081fd5b815162000470620003e48262000712565b8181529150602080830190848101818402860182018710156200049257600080fd5b60005b84811015620004435781516001600160e01b031981168114620004b757600080fd5b8452928201929082019060010162000495565b600082601f830112620004db578081fd5b8151620004ec620003e48262000712565b8181529150602080830190848101818402860182018710156200050e57600080fd5b60005b84811015620004435781516001600160801b03811681146200053257600080fd5b8452928201929082019060010162000511565b60008060008060008060c087890312156200055e578182fd5b86516001600160401b038082111562000575578384fd5b620005838a838b016200044e565b9750602089015191508082111562000599578384fd5b620005a78a838b01620003c2565b96506040890151915080821115620005bd578384fd5b620005cb8a838b01620004ca565b95506060890151915080821115620005e1578384fd5b50620005f089828a01620003c2565b9350506080870151915060a087015190509295509295509295565b6001600160e01b03199490941684526001600160a01b03929092166020840152151560408301526001600160801b0316606082015260800190565b60208082526017908201527f4455504c49434154455f4f525f4e554c4c5f4f574e4552000000000000000000604082015260600190565b60208082526016908201527f455155414c5f4c454e475448535f524551554952454400000000000000000000604082015260600190565b60208082526014908201527f494e56414c49445f524551554952454d454e5453000000000000000000000000604082015260600190565b6040518181016001600160401b03811182821017156200070a57600080fd5b604052919050565b60006001600160401b0382111562000728578081fd5b5060209081020190565b612c4780620007426000396000f3fe6080604052600436106101a15760003560e01c80639ace38c2116100e1578063c01a8c841161008a578063d74f8edd11610064578063d74f8edd146104ff578063dc8452cd14610514578063e20056e614610529578063ee22610b14610549576101a1565b8063c01a8c841461049f578063c6427474146104bf578063d38f2d82146104df576101a1565b8063b5dc40c3116100bb578063b5dc40c31461044a578063b77bf6001461046a578063ba51a6df1461047f576101a1565b80639ace38c2146103cb578063a0e67e2b146103fb578063a8abe69a1461041d576101a1565b8063547415251161014e578063784547a711610128578063784547a71461033d5780637ad28c511461035d5780637f05c8b61461037d5780638b51d13f146103ab576101a1565b806354741525146102dd5780637065cb48146102fd578063751ad5601461031d576101a1565b80632f54bf6e1161017f5780632f54bf6e1461026e5780633411c81c1461029b57806337bd78a0146102bb576101a1565b8063025e7c27146101f8578063173825d91461022e57806320ea8d861461024e575b34156101f6573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040516101ed9190612ae5565b60405180910390a25b005b34801561020457600080fd5b50610218610213366004612558565b610569565b60405161022591906125ee565b60405180910390f35b34801561023a57600080fd5b506101f66102493660046122db565b61059d565b34801561025a57600080fd5b506101f6610269366004612558565b61084c565b34801561027a57600080fd5b5061028e6102893660046122db565b6109a7565b604051610225919061271d565b3480156102a757600080fd5b5061028e6102b6366004612570565b6109bc565b3480156102c757600080fd5b506102d06109dc565b6040516102259190612ae5565b3480156102e957600080fd5b506102d06102f8366004612498565b6109e2565b34801561030957600080fd5b506101f66103183660046122db565b610a4e565b34801561032957600080fd5b506101f66103383660046124cc565b610c73565b34801561034957600080fd5b5061028e610358366004612558565b610cbe565b34801561036957600080fd5b506101f6610378366004612558565b610d52565b34801561038957600080fd5b5061039d61039836600461253b565b610dcb565b604051610225929190612728565b3480156103b757600080fd5b506102d06103c6366004612558565b610e04565b3480156103d757600080fd5b506103eb6103e6366004612558565b610e80565b604051610225949392919061260f565b34801561040757600080fd5b50610410610f69565b604051610225919061268c565b34801561042957600080fd5b5061043d610438366004612594565b610fd9565b60405161022591906126e5565b34801561045657600080fd5b50610410610465366004612558565b611104565b34801561047657600080fd5b506102d06112bc565b34801561048b57600080fd5b506101f661049a366004612558565b6112c2565b3480156104ab57600080fd5b506101f66104ba366004612558565b61139e565b3480156104cb57600080fd5b506102d06104da36600461232f565b611540565b3480156104eb57600080fd5b506102d06104fa366004612558565b61155f565b34801561050b57600080fd5b506102d0611571565b34801561052057600080fd5b506102d0611576565b34801561053557600080fd5b506101f66105443660046122f7565b61157c565b34801561055557600080fd5b506101f6610564366004612558565b611806565b6003818154811061057657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b3330146105df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a40565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040902054819060ff16610640576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906129d2565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b6003547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018110156107bc578273ffffffffffffffffffffffffffffffffffffffff16600382815481106106dc57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156107b457600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061073457fe5b6000918252602090912001546003805473ffffffffffffffffffffffffffffffffffffffff909216918390811061076757fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506107bc565b60010161068c565b50600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906107ee90826120d8565b50600354600454111561080757600354610807906112c2565b60405173ffffffffffffffffffffffffffffffffffffffff8316907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a25050565b3360008181526002602052604090205460ff16610895576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906129d2565b60008281526001602090815260408083203380855292529091205483919060ff166108ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d69061292d565b600084815260208190526040902060030154849060ff161561093a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a77565b600085815260016020908152604080832033808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555187927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a35050505050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b60065481565b6000805b600554811015610a4757838015610a0f575060008181526020819052604090206003015460ff16155b80610a335750828015610a33575060008181526020819052604090206003015460ff165b15610a3f576001820191505b6001016109e6565b5092915050565b333014610a87576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a40565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040902054819060ff1615610ae9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612851565b8173ffffffffffffffffffffffffffffffffffffffff8116610b37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906127e3565b60038054905060010160045460328211158015610b545750818111155b8015610b5f57508015155b8015610b6a57508115155b610ba0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612aae565b73ffffffffffffffffffffffffffffffffffffffff851660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915560038054918201815583527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d9190a25050505050565b333014610cac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a40565b610cb884848484611b51565b50505050565b600080805b600354811015610d4a5760008481526001602052604081206003805491929184908110610cec57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff1615610d2d576001820191505b600454821415610d4257600192505050610d4d565b600101610cc3565b50505b919050565b333014610d8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a40565b60068190556040517fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b437790610dc0908390612ae5565b60405180910390a150565b600860209081526000928352604080842090915290825290205460ff81169061010090046fffffffffffffffffffffffffffffffff1682565b6000805b600354811015610e7a5760008381526001602052604081206003805491929184908110610e3157fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff1615610e72576001820191505b600101610e08565b50919050565b60006020818152918152604090819020805460018083015460028085018054875161010095821615959095027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011691909104601f810188900488028401880190965285835273ffffffffffffffffffffffffffffffffffffffff90931695909491929190830182828015610f565780601f10610f2b57610100808354040283529160200191610f56565b820191906000526020600020905b815481529060010190602001808311610f3957829003601f168201915b5050506003909301549192505060ff1684565b60606003805480602002602001604051908101604052809291908181526020018280548015610fce57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610fa3575b505050505090505b90565b606080600554604051908082528060200260200182016040528015611008578160200160208202803883390190505b5090506000805b60055481101561108957858015611038575060008181526020819052604090206003015460ff16155b8061105c575084801561105c575060008181526020819052604090206003015460ff165b15611081578083838151811061106e57fe5b6020026020010181815250506001820191505b60010161100f565b8787036040519080825280602002602001820160405280156110b5578160200160208202803883390190505b5093508790505b868110156110f9578281815181106110d057fe5b602002602001015184898303815181106110e657fe5b60209081029190910101526001016110bc565b505050949350505050565b606080600380549050604051908082528060200260200182016040528015611136578160200160208202803883390190505b5090506000805b60035481101561122d576000858152600160205260408120600380549192918490811061116657fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff161561122557600381815481106111ad57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383815181106111e457fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b60010161113d565b81604051908082528060200260200182016040528015611257578160200160208202803883390190505b509350600090505b818110156112b45782818151811061127357fe5b602002602001015184828151811061128757fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161125f565b505050919050565b60055481565b3330146112fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a40565b60035481603282118015906113105750818111155b801561131b57508015155b801561132657508115155b61135c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612aae565b60048390556040517fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a90611391908590612ae5565b60405180910390a1505050565b3360008181526002602052604090205460ff166113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906129d2565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff16611444576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906128f6565b60008381526001602090815260408083203380855292529091205484919060ff161561149c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612888565b60006114a786610cbe565b600087815260016020818152604080842033808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051929350889290917f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a380158015611529575061152986610cbe565b15611538576115388642611c89565b505050505050565b600061154d848484611cd8565b90506115588161139e565b9392505050565b60076020526000908152604090205481565b603281565b60045481565b3330146115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a40565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902054829060ff16611616576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906129d2565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902054829060ff1615611678576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612851565b60005b600354811015611734578473ffffffffffffffffffffffffffffffffffffffff16600382815481106116a957fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561172c5783600382815481106116df57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611734565b60010161167b565b5073ffffffffffffffffffffffffffffffffffffffff80851660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090811690915593871682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a260405173ffffffffffffffffffffffffffffffffffffffff8416907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a250505050565b600081815260208190526040902060030154819060ff1615611854576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a77565b8161185e81610cbe565b611894576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906128bf565b6000838152602081815260409182902060038101805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909116811790915560028083018054865161010094821615949094027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011691909104601f81018590048502830185019095528482529193606093849384939290918301828280156119805780601f1061195557610100808354040283529160200191611980565b820191906000526020600020905b81548152906001019060200180831161196357829003601f168201915b505050505080602001905161199891908101906123c4565b9250925092506000835190508251811480156119b45750815181145b6119ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612964565b600088815260076020526040812054905b828114611b1a57611a3382878381518110611a1257fe5b6020026020010151878481518110611a2657fe5b6020026020010151611e36565b6000858281518110611a4157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16858381518110611a6b57fe5b6020026020010151888481518110611a7f57fe5b6020026020010151604051611a9491906125d2565b60006040518083038185875af1925050503d8060008114611ad1576040519150601f19603f3d011682016040523d82523d6000602084013e611ad6565b606091505b5050905080611b11576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d69061299b565b506001016119fb565b5060405189907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a2505050505050505050565b600084611b5f576000611b61565b815b9050611b6b612101565b5060408051808201825286151581526fffffffffffffffffffffffffffffffff80841660208084019182527fffffffff00000000000000000000000000000000000000000000000000000000891660009081526008825285812073ffffffffffffffffffffffffffffffffffffffff8a168252909152849020835181549251909316610100027fffffffffffffffffffffffffffffff00000000000000000000000000000000ff9315157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909316929092179290921617905590517f694405724de467488eda192d814f39ffe7f6503fe0b1eefd4ea332f9c611c5ec90611c7990879087908a90879061274a565b60405180910390a1505050505050565b600082815260076020526040908190208290555182907f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d90611ccc908490612ae5565b60405180910390a25050565b60008373ffffffffffffffffffffffffffffffffffffffff8116611d28576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906127e3565b6005546040805160808101825273ffffffffffffffffffffffffffffffffffffffff8881168252602080830189815283850189815260006060860181905287815280845295909520845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001694169390931783555160018301559251805194965091939092611dc0926002850192910190612118565b5060609190910151600390910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560058054600101905560405182907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a2509392505050565b6000611e48838263ffffffff611f9516565b9050611e52612101565b507fffffffff000000000000000000000000000000000000000000000000000000008116600090815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845282529182902082518084019093525460ff811615801584526101009091046fffffffffffffffffffffffffffffffff1691830191909152611f41576020810151611f039086906fffffffffffffffffffffffffffffffff1663ffffffff611ff016565b421015611f3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a09565b611f8e565b600654611f5590869063ffffffff611ff016565b421015611f8e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d69061281a565b5050505050565b60008160040183511015611fbb57611fbb611fb6600385518560040161200c565b6120b1565b5060208183018101519101907fffffffff00000000000000000000000000000000000000000000000000000000165b92915050565b60008282018381101561155857611558611fb6600086866120b9565b6060632800659560e01b84848460405160240161202b939291906127d5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b606063e946c1bb60e01b84848460405160240161202b939291906127b3565b8154818355818111156120fc576000838152602090206120fc918101908301612196565b505050565b604080518082019091526000808252602082015290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061215957805160ff1916838001178555612186565b82800160010185558215612186579182015b8281111561218657825182559160200191906001019061216b565b50612192929150612196565b5090565b610fd691905b80821115612192576000815560010161219c565b600082601f8301126121c0578081fd5b81516121d36121ce82612b15565b612aee565b8181529150602080830190848101818402860182018710156121f457600080fd5b60005b8481101561221c57815161220a81612ba3565b845292820192908201906001016121f7565b505050505092915050565b600082601f830112612237578081fd5b81516122456121ce82612b15565b81815291506020808301908481018184028601820187101561226657600080fd5b60005b8481101561221c57815184529282019290820190600101612269565b80358015158114611fea57600080fd5b600082601f8301126122a5578081fd5b81516122b36121ce82612b35565b91508082528360208285010111156122ca57600080fd5b610a47816020840160208601612b77565b6000602082840312156122ec578081fd5b813561155881612ba3565b60008060408385031215612309578081fd5b823561231481612ba3565b9150602083013561232481612ba3565b809150509250929050565b600080600060608486031215612343578081fd5b833561234e81612ba3565b925060208401359150604084013567ffffffffffffffff811115612370578182fd5b80850186601f820112612381578283fd5b803591506123916121ce83612b35565b8281528760208484010111156123a5578384fd5b8260208301602083013783602084830101528093505050509250925092565b6000806000606084860312156123d8578283fd5b835167ffffffffffffffff808211156123ef578485fd5b81860187601f820112612400578586fd5b805192506124106121ce84612b15565b83815260208082019190838101895b87811015612448576124368d848451890101612295565b8552938201939082019060010161241f565b50508901519097509350505080821115612460578384fd5b61246c878388016121b0565b93506040860151915080821115612481578283fd5b5061248e86828701612227565b9150509250925092565b600080604083850312156124aa578182fd5b6124b48484612285565b91506124c38460208501612285565b90509250929050565b600080600080608085870312156124e1578081fd5b84356124ec81612bc8565b935060208501356124fc81612bd6565b9250604085013561250c81612ba3565b915060608501356fffffffffffffffffffffffffffffffff81168114612530578182fd5b939692955090935050565b6000806040838503121561254d578182fd5b823561231481612bd6565b600060208284031215612569578081fd5b5035919050565b60008060408385031215612582578182fd5b82359150602083013561232481612ba3565b600080600080608085870312156125a9578182fd5b843593506020850135925060408501356125c281612bc8565b9150606085013561253081612bc8565b600082516125e4818460208701612b77565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff861682528460208301526080604083015283518060808401526126508160a0850160208801612b77565b921515606083015250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160160a0019392505050565b602080825282518282018190526000918401906040840190835b818110156126da57835173ffffffffffffffffffffffffffffffffffffffff168352602093840193909201916001016126a6565b509095945050505050565b602080825282518282018190526000918401906040840190835b818110156126da5783518352602093840193909201916001016126ff565b901515815260200190565b91151582526fffffffffffffffffffffffffffffffff16602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000094909416845273ffffffffffffffffffffffffffffffffffffffff929092166020840152151560408301526fffffffffffffffffffffffffffffffff16606082015260800190565b60608101600485106127c157fe5b938152602081019290925260409091015290565b60608101600885106127c157fe5b6020808252600c908201527f4e554c4c5f414444524553530000000000000000000000000000000000000000604082015260600190565b6020808252601c908201527f44454641554c545f54494d455f4c4f434b5f494e434f4d504c45544500000000604082015260600190565b6020808252600c908201527f4f574e45525f4558495354530000000000000000000000000000000000000000604082015260600190565b60208082526014908201527f54585f414c52454144595f434f4e4649524d4544000000000000000000000000604082015260600190565b60208082526016908201527f54585f4e4f545f46554c4c595f434f4e4649524d454400000000000000000000604082015260600190565b6020808252600f908201527f54585f444f45534e545f45584953540000000000000000000000000000000000604082015260600190565b60208082526010908201527f54585f4e4f545f434f4e4649524d454400000000000000000000000000000000604082015260600190565b60208082526016908201527f455155414c5f4c454e475448535f524551554952454400000000000000000000604082015260600190565b60208082526010908201527f4641494c45445f455845435554494f4e00000000000000000000000000000000604082015260600190565b60208082526012908201527f4f574e45525f444f45534e545f45584953540000000000000000000000000000604082015260600190565b6020808252601b908201527f435553544f4d5f54494d455f4c4f434b5f494e434f4d504c4554450000000000604082015260600190565b60208082526017908201527f4f4e4c595f43414c4c41424c455f42595f57414c4c4554000000000000000000604082015260600190565b60208082526013908201527f54585f414c52454144595f455845435554454400000000000000000000000000604082015260600190565b60208082526014908201527f494e56414c49445f524551554952454d454e5453000000000000000000000000604082015260600190565b90815260200190565b60405181810167ffffffffffffffff81118282101715612b0d57600080fd5b604052919050565b600067ffffffffffffffff821115612b2b578081fd5b5060209081020190565b600067ffffffffffffffff821115612b4b578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015612b92578181015183820152602001612b7a565b83811115610cb85750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114612bc557600080fd5b50565b8015158114612bc557600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612bc557600080fdfea365627a7a72315820a5597104875bc950ef7cc880adf23d12732ed641d3fb34a1157b7ffd5d5f13f26c6578706572696d656e74616cf564736f6c6343000511004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050000000000000000000000009e4496ade6096b000c856219c27734f4f89a5210000000000000000000000000257619b7155d247e43c8b6d90c8c17278ae481f0000000000000000000000000520dffed1dc6e3e871d944bb473c3d483f5f3fb90000000000000000000000005a9d540a07a96a2bfc8a8dfd638359778c72526f00000000000000000000000001ba2d1fc567074f18e75fe34b4fcda7330499e1
Deployed Bytecode
0x6080604052600436106101a15760003560e01c80639ace38c2116100e1578063c01a8c841161008a578063d74f8edd11610064578063d74f8edd146104ff578063dc8452cd14610514578063e20056e614610529578063ee22610b14610549576101a1565b8063c01a8c841461049f578063c6427474146104bf578063d38f2d82146104df576101a1565b8063b5dc40c3116100bb578063b5dc40c31461044a578063b77bf6001461046a578063ba51a6df1461047f576101a1565b80639ace38c2146103cb578063a0e67e2b146103fb578063a8abe69a1461041d576101a1565b8063547415251161014e578063784547a711610128578063784547a71461033d5780637ad28c511461035d5780637f05c8b61461037d5780638b51d13f146103ab576101a1565b806354741525146102dd5780637065cb48146102fd578063751ad5601461031d576101a1565b80632f54bf6e1161017f5780632f54bf6e1461026e5780633411c81c1461029b57806337bd78a0146102bb576101a1565b8063025e7c27146101f8578063173825d91461022e57806320ea8d861461024e575b34156101f6573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040516101ed9190612ae5565b60405180910390a25b005b34801561020457600080fd5b50610218610213366004612558565b610569565b60405161022591906125ee565b60405180910390f35b34801561023a57600080fd5b506101f66102493660046122db565b61059d565b34801561025a57600080fd5b506101f6610269366004612558565b61084c565b34801561027a57600080fd5b5061028e6102893660046122db565b6109a7565b604051610225919061271d565b3480156102a757600080fd5b5061028e6102b6366004612570565b6109bc565b3480156102c757600080fd5b506102d06109dc565b6040516102259190612ae5565b3480156102e957600080fd5b506102d06102f8366004612498565b6109e2565b34801561030957600080fd5b506101f66103183660046122db565b610a4e565b34801561032957600080fd5b506101f66103383660046124cc565b610c73565b34801561034957600080fd5b5061028e610358366004612558565b610cbe565b34801561036957600080fd5b506101f6610378366004612558565b610d52565b34801561038957600080fd5b5061039d61039836600461253b565b610dcb565b604051610225929190612728565b3480156103b757600080fd5b506102d06103c6366004612558565b610e04565b3480156103d757600080fd5b506103eb6103e6366004612558565b610e80565b604051610225949392919061260f565b34801561040757600080fd5b50610410610f69565b604051610225919061268c565b34801561042957600080fd5b5061043d610438366004612594565b610fd9565b60405161022591906126e5565b34801561045657600080fd5b50610410610465366004612558565b611104565b34801561047657600080fd5b506102d06112bc565b34801561048b57600080fd5b506101f661049a366004612558565b6112c2565b3480156104ab57600080fd5b506101f66104ba366004612558565b61139e565b3480156104cb57600080fd5b506102d06104da36600461232f565b611540565b3480156104eb57600080fd5b506102d06104fa366004612558565b61155f565b34801561050b57600080fd5b506102d0611571565b34801561052057600080fd5b506102d0611576565b34801561053557600080fd5b506101f66105443660046122f7565b61157c565b34801561055557600080fd5b506101f6610564366004612558565b611806565b6003818154811061057657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b3330146105df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a40565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040902054819060ff16610640576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906129d2565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b6003547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018110156107bc578273ffffffffffffffffffffffffffffffffffffffff16600382815481106106dc57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156107b457600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061073457fe5b6000918252602090912001546003805473ffffffffffffffffffffffffffffffffffffffff909216918390811061076757fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506107bc565b60010161068c565b50600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906107ee90826120d8565b50600354600454111561080757600354610807906112c2565b60405173ffffffffffffffffffffffffffffffffffffffff8316907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a25050565b3360008181526002602052604090205460ff16610895576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906129d2565b60008281526001602090815260408083203380855292529091205483919060ff166108ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d69061292d565b600084815260208190526040902060030154849060ff161561093a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a77565b600085815260016020908152604080832033808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555187927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a35050505050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b60065481565b6000805b600554811015610a4757838015610a0f575060008181526020819052604090206003015460ff16155b80610a335750828015610a33575060008181526020819052604090206003015460ff165b15610a3f576001820191505b6001016109e6565b5092915050565b333014610a87576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a40565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040902054819060ff1615610ae9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612851565b8173ffffffffffffffffffffffffffffffffffffffff8116610b37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906127e3565b60038054905060010160045460328211158015610b545750818111155b8015610b5f57508015155b8015610b6a57508115155b610ba0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612aae565b73ffffffffffffffffffffffffffffffffffffffff851660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915560038054918201815583527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d9190a25050505050565b333014610cac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a40565b610cb884848484611b51565b50505050565b600080805b600354811015610d4a5760008481526001602052604081206003805491929184908110610cec57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff1615610d2d576001820191505b600454821415610d4257600192505050610d4d565b600101610cc3565b50505b919050565b333014610d8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a40565b60068190556040517fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b437790610dc0908390612ae5565b60405180910390a150565b600860209081526000928352604080842090915290825290205460ff81169061010090046fffffffffffffffffffffffffffffffff1682565b6000805b600354811015610e7a5760008381526001602052604081206003805491929184908110610e3157fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff1615610e72576001820191505b600101610e08565b50919050565b60006020818152918152604090819020805460018083015460028085018054875161010095821615959095027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011691909104601f810188900488028401880190965285835273ffffffffffffffffffffffffffffffffffffffff90931695909491929190830182828015610f565780601f10610f2b57610100808354040283529160200191610f56565b820191906000526020600020905b815481529060010190602001808311610f3957829003601f168201915b5050506003909301549192505060ff1684565b60606003805480602002602001604051908101604052809291908181526020018280548015610fce57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610fa3575b505050505090505b90565b606080600554604051908082528060200260200182016040528015611008578160200160208202803883390190505b5090506000805b60055481101561108957858015611038575060008181526020819052604090206003015460ff16155b8061105c575084801561105c575060008181526020819052604090206003015460ff165b15611081578083838151811061106e57fe5b6020026020010181815250506001820191505b60010161100f565b8787036040519080825280602002602001820160405280156110b5578160200160208202803883390190505b5093508790505b868110156110f9578281815181106110d057fe5b602002602001015184898303815181106110e657fe5b60209081029190910101526001016110bc565b505050949350505050565b606080600380549050604051908082528060200260200182016040528015611136578160200160208202803883390190505b5090506000805b60035481101561122d576000858152600160205260408120600380549192918490811061116657fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff161561122557600381815481106111ad57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383815181106111e457fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b60010161113d565b81604051908082528060200260200182016040528015611257578160200160208202803883390190505b509350600090505b818110156112b45782818151811061127357fe5b602002602001015184828151811061128757fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161125f565b505050919050565b60055481565b3330146112fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a40565b60035481603282118015906113105750818111155b801561131b57508015155b801561132657508115155b61135c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612aae565b60048390556040517fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a90611391908590612ae5565b60405180910390a1505050565b3360008181526002602052604090205460ff166113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906129d2565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff16611444576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906128f6565b60008381526001602090815260408083203380855292529091205484919060ff161561149c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612888565b60006114a786610cbe565b600087815260016020818152604080842033808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051929350889290917f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a380158015611529575061152986610cbe565b15611538576115388642611c89565b505050505050565b600061154d848484611cd8565b90506115588161139e565b9392505050565b60076020526000908152604090205481565b603281565b60045481565b3330146115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a40565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902054829060ff16611616576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906129d2565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902054829060ff1615611678576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612851565b60005b600354811015611734578473ffffffffffffffffffffffffffffffffffffffff16600382815481106116a957fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561172c5783600382815481106116df57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611734565b60010161167b565b5073ffffffffffffffffffffffffffffffffffffffff80851660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090811690915593871682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a260405173ffffffffffffffffffffffffffffffffffffffff8416907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a250505050565b600081815260208190526040902060030154819060ff1615611854576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a77565b8161185e81610cbe565b611894576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906128bf565b6000838152602081815260409182902060038101805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909116811790915560028083018054865161010094821615949094027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011691909104601f81018590048502830185019095528482529193606093849384939290918301828280156119805780601f1061195557610100808354040283529160200191611980565b820191906000526020600020905b81548152906001019060200180831161196357829003601f168201915b505050505080602001905161199891908101906123c4565b9250925092506000835190508251811480156119b45750815181145b6119ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612964565b600088815260076020526040812054905b828114611b1a57611a3382878381518110611a1257fe5b6020026020010151878481518110611a2657fe5b6020026020010151611e36565b6000858281518110611a4157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16858381518110611a6b57fe5b6020026020010151888481518110611a7f57fe5b6020026020010151604051611a9491906125d2565b60006040518083038185875af1925050503d8060008114611ad1576040519150601f19603f3d011682016040523d82523d6000602084013e611ad6565b606091505b5050905080611b11576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d69061299b565b506001016119fb565b5060405189907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a2505050505050505050565b600084611b5f576000611b61565b815b9050611b6b612101565b5060408051808201825286151581526fffffffffffffffffffffffffffffffff80841660208084019182527fffffffff00000000000000000000000000000000000000000000000000000000891660009081526008825285812073ffffffffffffffffffffffffffffffffffffffff8a168252909152849020835181549251909316610100027fffffffffffffffffffffffffffffff00000000000000000000000000000000ff9315157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909316929092179290921617905590517f694405724de467488eda192d814f39ffe7f6503fe0b1eefd4ea332f9c611c5ec90611c7990879087908a90879061274a565b60405180910390a1505050505050565b600082815260076020526040908190208290555182907f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d90611ccc908490612ae5565b60405180910390a25050565b60008373ffffffffffffffffffffffffffffffffffffffff8116611d28576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906127e3565b6005546040805160808101825273ffffffffffffffffffffffffffffffffffffffff8881168252602080830189815283850189815260006060860181905287815280845295909520845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001694169390931783555160018301559251805194965091939092611dc0926002850192910190612118565b5060609190910151600390910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560058054600101905560405182907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a2509392505050565b6000611e48838263ffffffff611f9516565b9050611e52612101565b507fffffffff000000000000000000000000000000000000000000000000000000008116600090815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845282529182902082518084019093525460ff811615801584526101009091046fffffffffffffffffffffffffffffffff1691830191909152611f41576020810151611f039086906fffffffffffffffffffffffffffffffff1663ffffffff611ff016565b421015611f3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a09565b611f8e565b600654611f5590869063ffffffff611ff016565b421015611f8e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d69061281a565b5050505050565b60008160040183511015611fbb57611fbb611fb6600385518560040161200c565b6120b1565b5060208183018101519101907fffffffff00000000000000000000000000000000000000000000000000000000165b92915050565b60008282018381101561155857611558611fb6600086866120b9565b6060632800659560e01b84848460405160240161202b939291906127d5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b606063e946c1bb60e01b84848460405160240161202b939291906127b3565b8154818355818111156120fc576000838152602090206120fc918101908301612196565b505050565b604080518082019091526000808252602082015290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061215957805160ff1916838001178555612186565b82800160010185558215612186579182015b8281111561218657825182559160200191906001019061216b565b50612192929150612196565b5090565b610fd691905b80821115612192576000815560010161219c565b600082601f8301126121c0578081fd5b81516121d36121ce82612b15565b612aee565b8181529150602080830190848101818402860182018710156121f457600080fd5b60005b8481101561221c57815161220a81612ba3565b845292820192908201906001016121f7565b505050505092915050565b600082601f830112612237578081fd5b81516122456121ce82612b15565b81815291506020808301908481018184028601820187101561226657600080fd5b60005b8481101561221c57815184529282019290820190600101612269565b80358015158114611fea57600080fd5b600082601f8301126122a5578081fd5b81516122b36121ce82612b35565b91508082528360208285010111156122ca57600080fd5b610a47816020840160208601612b77565b6000602082840312156122ec578081fd5b813561155881612ba3565b60008060408385031215612309578081fd5b823561231481612ba3565b9150602083013561232481612ba3565b809150509250929050565b600080600060608486031215612343578081fd5b833561234e81612ba3565b925060208401359150604084013567ffffffffffffffff811115612370578182fd5b80850186601f820112612381578283fd5b803591506123916121ce83612b35565b8281528760208484010111156123a5578384fd5b8260208301602083013783602084830101528093505050509250925092565b6000806000606084860312156123d8578283fd5b835167ffffffffffffffff808211156123ef578485fd5b81860187601f820112612400578586fd5b805192506124106121ce84612b15565b83815260208082019190838101895b87811015612448576124368d848451890101612295565b8552938201939082019060010161241f565b50508901519097509350505080821115612460578384fd5b61246c878388016121b0565b93506040860151915080821115612481578283fd5b5061248e86828701612227565b9150509250925092565b600080604083850312156124aa578182fd5b6124b48484612285565b91506124c38460208501612285565b90509250929050565b600080600080608085870312156124e1578081fd5b84356124ec81612bc8565b935060208501356124fc81612bd6565b9250604085013561250c81612ba3565b915060608501356fffffffffffffffffffffffffffffffff81168114612530578182fd5b939692955090935050565b6000806040838503121561254d578182fd5b823561231481612bd6565b600060208284031215612569578081fd5b5035919050565b60008060408385031215612582578182fd5b82359150602083013561232481612ba3565b600080600080608085870312156125a9578182fd5b843593506020850135925060408501356125c281612bc8565b9150606085013561253081612bc8565b600082516125e4818460208701612b77565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff861682528460208301526080604083015283518060808401526126508160a0850160208801612b77565b921515606083015250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160160a0019392505050565b602080825282518282018190526000918401906040840190835b818110156126da57835173ffffffffffffffffffffffffffffffffffffffff168352602093840193909201916001016126a6565b509095945050505050565b602080825282518282018190526000918401906040840190835b818110156126da5783518352602093840193909201916001016126ff565b901515815260200190565b91151582526fffffffffffffffffffffffffffffffff16602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000094909416845273ffffffffffffffffffffffffffffffffffffffff929092166020840152151560408301526fffffffffffffffffffffffffffffffff16606082015260800190565b60608101600485106127c157fe5b938152602081019290925260409091015290565b60608101600885106127c157fe5b6020808252600c908201527f4e554c4c5f414444524553530000000000000000000000000000000000000000604082015260600190565b6020808252601c908201527f44454641554c545f54494d455f4c4f434b5f494e434f4d504c45544500000000604082015260600190565b6020808252600c908201527f4f574e45525f4558495354530000000000000000000000000000000000000000604082015260600190565b60208082526014908201527f54585f414c52454144595f434f4e4649524d4544000000000000000000000000604082015260600190565b60208082526016908201527f54585f4e4f545f46554c4c595f434f4e4649524d454400000000000000000000604082015260600190565b6020808252600f908201527f54585f444f45534e545f45584953540000000000000000000000000000000000604082015260600190565b60208082526010908201527f54585f4e4f545f434f4e4649524d454400000000000000000000000000000000604082015260600190565b60208082526016908201527f455155414c5f4c454e475448535f524551554952454400000000000000000000604082015260600190565b60208082526010908201527f4641494c45445f455845435554494f4e00000000000000000000000000000000604082015260600190565b60208082526012908201527f4f574e45525f444f45534e545f45584953540000000000000000000000000000604082015260600190565b6020808252601b908201527f435553544f4d5f54494d455f4c4f434b5f494e434f4d504c4554450000000000604082015260600190565b60208082526017908201527f4f4e4c595f43414c4c41424c455f42595f57414c4c4554000000000000000000604082015260600190565b60208082526013908201527f54585f414c52454144595f455845435554454400000000000000000000000000604082015260600190565b60208082526014908201527f494e56414c49445f524551554952454d454e5453000000000000000000000000604082015260600190565b90815260200190565b60405181810167ffffffffffffffff81118282101715612b0d57600080fd5b604052919050565b600067ffffffffffffffff821115612b2b578081fd5b5060209081020190565b600067ffffffffffffffff821115612b4b578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015612b92578181015183820152602001612b7a565b83811115610cb85750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114612bc557600080fd5b50565b8015158114612bc557600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612bc557600080fdfea365627a7a72315820a5597104875bc950ef7cc880adf23d12732ed641d3fb34a1157b7ffd5d5f13f26c6578706572696d656e74616cf564736f6c63430005110040
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050000000000000000000000009e4496ade6096b000c856219c27734f4f89a5210000000000000000000000000257619b7155d247e43c8b6d90c8c17278ae481f0000000000000000000000000520dffed1dc6e3e871d944bb473c3d483f5f3fb90000000000000000000000005a9d540a07a96a2bfc8a8dfd638359778c72526f00000000000000000000000001ba2d1fc567074f18e75fe34b4fcda7330499e1
-----Decoded View---------------
-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [10] : 0000000000000000000000009e4496ade6096b000c856219c27734f4f89a5210
Arg [11] : 000000000000000000000000257619b7155d247e43c8b6d90c8c17278ae481f0
Arg [12] : 000000000000000000000000520dffed1dc6e3e871d944bb473c3d483f5f3fb9
Arg [13] : 0000000000000000000000005a9d540a07a96a2bfc8a8dfd638359778c72526f
Arg [14] : 00000000000000000000000001ba2d1fc567074f18e75fe34b4fcda7330499e1
Deployed Bytecode Sourcemap
801:7539:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3116:9:0;:13;3112:79;;3158:10;3150:30;;;3170:9;3150:30;;;;;;;;;;;;;;;3112:79;801:7539:2;1079:23:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1079:23:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;4434:496;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4434:496:0;;;;;;;;:::i;7095:299::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7095:299:0;;;;;;;;:::i;1033:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1033:40:0;;;;;;;;:::i;:::-;;;;;;;;960:67;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;960:67:0;;;;;;;;:::i;1153:32:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1153:32:1;;;:::i;:::-;;;;;;;;11700:334:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11700:334:0;;;;;;;;:::i;4029:282::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4029:282:0;;;;;;;;:::i;3531:376:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3531:376:2;;;;;;;;:::i;9741:378:0:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9741:378:0;;;;;;;;:::i;2428:194:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2428:194:1;;;;;;;;:::i;1272:78:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1272:78:2;;;;;;;;:::i;:::-;;;;;;;;;11149:289:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11149:289:0;;;;;;;;:::i;902:52::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;902:52:0;;;;;;;;:::i;:::-;;;;;;;;;;;12118:118;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12118:118:0;;;:::i;:::-;;;;;;;;13383:742;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13383:742:0;;;;;;;;:::i;:::-;;;;;;;;12415:619;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;12415:619:0;;;;;;;;:::i;1137:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1137:31:0;;;:::i;5781:215::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5781:215:0;;;;;;;;:::i;2728:550:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2728:550:1;;;;;;;;:::i;6255:258:0:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6255:258:0;;;;;;;;:::i;1192:53:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1192:53:1;;;;;;;;:::i;820:44:0:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;820:44:0;;;:::i;1108:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1108:23:0;;;:::i;5132:478::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5132:478:0;;;;;;;;:::i;4324:1721:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4324:1721:2;;;;;;;;:::i;1079:23:0:-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1079:23:0;:::o;4434:496::-;1388:10;1410:4;1388:27;1367:97;;;;;;;;;;;;;;;;;;;;;;1705:14;;;;;;;:7;:14;;;;;;4524:5;;1705:14;;1684:79;;;;;;;;;;;;;;4545:14;;;4562:5;4545:14;;;:7;:14;;;;;:22;;;;;;4577:189;4601:6;:13;:17;;4597:21;;4577:189;;;4656:5;4643:18;;:6;4650:1;4643:9;;;;;;;;;;;;;;;;;;;;:18;4639:117;;;4693:6;4700:13;;:17;;;;4693:25;;;;;;;;;;;;;;;;4681:6;:9;;4693:25;;;;;4688:1;;4681:9;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;4736:5;;4639:117;4620:3;;4577:189;;;-1:-1:-1;4775:6:0;:18;;;;;;;;;:::i;:::-;-1:-1:-1;4818:6:0;:13;4807:8;;:24;4803:87;;;4865:6;:13;4847:32;;:17;:32::i;:::-;4904:19;;;;;;;;;;;1474:1;4434:496;:::o;7095:299::-;7181:10;1705:14;;;;:7;:14;;;;;;;;1684:79;;;;;;;;;;;;;;2074:28;;;;:13;:28;;;;;;;;7226:10;2074:35;;;;;;;;;7211:13;;7226:10;2074:35;;2053:98;;;;;;;;;;;;;;2448:12;:27;;;;;;;;;;:36;;;7258:13;;2448:36;;2447:37;2426:103;;;;;;;;;;;;;;7330:5;7287:28;;;:13;:28;;;;;;;;7316:10;7287:40;;;;;;;;:48;;;;;;7350:37;7301:13;;7350:37;;;2161:1;1773;;7095:299;;:::o;1033:40::-;;;;;;;;;;;;;;;:::o;960:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1153:32:1:-;;;;:::o;11700:334:0:-;11803:13;;11832:196;11856:16;;11852:1;:20;11832:196;;;11897:7;:36;;;;-1:-1:-1;11909:12:0;:15;;;;;;;;;;:24;;;;;11908:25;11897:36;:76;;;;11937:8;:36;;;;-1:-1:-1;11949:12:0;:15;;;;;;;;;;:24;;;;;11937:36;11893:125;;;12002:1;11993:10;;;;11893:125;11874:3;;11832:196;;;;11700:334;;;;:::o;4029:282::-;1388:10;1410:4;1388:27;1367:97;;;;;;;;;;;;;;1562:14;;;;;;;:7;:14;;;;;;4122:5;;1562:14;;1561:15;1540:74;;;;;;;;;;;;;;4145:5;2619:22;;;2598:81;;;;;;;;;;;;;;4177:6;:13;;;;4193:1;4177:17;4196:8;;862:2;2799:10;:29;;:68;;;;;2857:10;2844:9;:23;;2799:68;:98;;;;-1:-1:-1;2883:14:0;;;2799:98;:129;;;;-1:-1:-1;2913:15:0;;;2799:129;2778:196;;;;;;;;;;;;;;4220:14;;;;;;;:7;:14;;;;;;:21;;;;4237:4;4220:21;;;;;;4251:6;27:10:-1;;23:18;;;45:23;;4251:18:0;;;;;;;;;;;;4284:20;;;4220:14;4284:20;2689:1;;1624;1474;4029:282;:::o;3531:376:2:-;1388:10:0;1410:4;1388:27;1367:97;;;;;;;;;;;;;;3749:151:2;3784:17;3815:16;3845:11;3870:20;3749:21;:151::i;:::-;3531:376;;;;:::o;9741:378:0:-;9830:4;;;9877:236;9901:6;:13;9897:17;;9877:236;;;9939:28;;;;:13;:28;;;;;9968:6;:9;;9939:28;;;9975:1;;9968:9;;;;;;;;;;;;;;;;;;;;9939:39;;;;;;;;;;;;;;;9935:88;;;10007:1;9998:10;;;;9935:88;10049:8;;10040:5;:17;10036:67;;;10084:4;10077:11;;;;;;10036:67;9916:3;;9877:236;;;;9741:378;;;;;:::o;2428:194:1:-;1388:10:0;1410:4;1388:27;1367:97;;;;;;;;;;;;;;2528:17:1;:38;;;2581:34;;;;;;2548:18;;2581:34;;;;;;;;;;2428:194;:::o;1272:78:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11149:289:0:-;11247:13;;11276:156;11300:6;:13;11296:17;;11276:156;;;11338:28;;;;:13;:28;;;;;11367:6;:9;;11338:28;;;11374:1;;11367:9;;;;;;;;;;;;;;;;;;;;11338:39;;;;;;;;;;;;;;;11334:88;;;11406:1;11397:10;;;;11334:88;11315:3;;11276:156;;;;11149:289;;;:::o;902:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;902:52:0;;;;;;;-1:-1:-1;;902:52:0;;;:::o;12118:118::-;12184:16;12223:6;12216:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12118:118;;:::o;13383:742::-;13548:32;13596:35;13648:16;;13634:31;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;13634:31:0;-1:-1:-1;13596:69:0;-1:-1:-1;13675:13:0;;13721:235;13737:16;;13733:1;:20;13721:235;;;13778:7;:36;;;;-1:-1:-1;13790:12:0;:15;;;;;;;;;;:24;;;;;13789:25;13778:36;:76;;;;13818:8;:36;;;;-1:-1:-1;13830:12:0;:15;;;;;;;;;;:24;;;;;13818:36;13774:172;;;13902:1;13874:18;13893:5;13874:25;;;;;;;;;;;;;:29;;;;;13930:1;13921:10;;;;13774:172;13755:3;;13721:235;;;14002:4;13997:2;:9;13983:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;13983:24:0;;13965:42;;14026:4;14022:8;;14017:102;14036:2;14032:1;:6;14017:102;;;14087:18;14106:1;14087:21;;;;;;;;;;;;;;14059:15;14079:4;14075:1;:8;14059:25;;;;;;;;;;;;;;;;;:49;14040:3;;14017:102;;;13383:742;;;;;;;;;:::o;12415:619::-;12509:31;12556:34;12607:6;:13;;;;12593:28;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;12593:28:0;-1:-1:-1;12556:65:0;-1:-1:-1;12631:13:0;;12677:202;12693:6;:13;12689:17;;12677:202;;;12731:28;;;;:13;:28;;;;;12760:6;:9;;12731:28;;;12767:1;;12760:9;;;;;;;;;;;;;;;;;;;;12731:39;;;;;;;;;;;;;;;12727:142;;;12817:6;12824:1;12817:9;;;;;;;;;;;;;;;;;;;;;;;;;12790:17;12808:5;12790:24;;;;;;;;;;;;;:36;;;;;;;;;;;12853:1;12844:10;;;;12727:142;12708:3;;12677:202;;;12919:5;12905:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;12905:20:0;;12888:37;;12944:1;12940:5;;12935:93;12951:5;12947:1;:9;12935:93;;;12997:17;13015:1;12997:20;;;;;;;;;;;;;;12977:14;12992:1;12977:17;;;;;;;;:40;;;;:17;;;;;;;;;;;:40;12958:3;;12935:93;;;12415:619;;;;;;:::o;1137:31::-;;;;:::o;5781:215::-;1388:10;1410:4;1388:27;1367:97;;;;;;;;;;;;;;5886:6;:13;5901:9;862:2;2799:29;;;;;:68;;;2857:10;2844:9;:23;;2799:68;:98;;;;-1:-1:-1;2883:14:0;;;2799:98;:129;;;;-1:-1:-1;2913:15:0;;;2799:129;2778:196;;;;;;;;;;;;;;5926:8;:20;;;5961:28;;;;;;5937:9;;5961:28;;;;;;;;;;1474:1;;5781:215;:::o;2728:550:1:-;2814:10;1705:14:0;;;;:7;:14;;;;;;;;1684:79;;;;;;;;;;;;;;1919:1;1868:27;;;;;;;;;;:39;2852:13:1;;1868:53:0;:39;1847:115;;;;;;;;;;;;;;2267:28;;;;:13;:28;;;;;;;;2903:10:1;2267:35:0;;;;;;;;;2888:13:1;;2903:10;2267:35:0;;2266:36;2245:103;;;;;;;;;;;;;;2929:41:1;2973:26;2985:13;2973:11;:26::i;:::-;3010:28;;;;3053:4;3010:28;;;;;;;;3039:10;3010:40;;;;;;;;:47;;;;;;;;;;3072:39;;2929:70;;-1:-1:-1;3024:13:1;;3039:10;;3072:39;;;3127:36;3126:37;:67;;;;;3167:26;3179:13;3167:11;:26::i;:::-;3122:150;;;3209:52;3230:13;3245:15;3209:20;:52::i;:::-;2358:1:0;1972;;1773;2728:550:1;;:::o;6255:258:0:-;6369:21;6422:41;6438:11;6451:5;6458:4;6422:15;:41::i;:::-;6406:57;;6473:33;6492:13;6473:18;:33::i;:::-;6255:258;;;;;:::o;1192:53:1:-;;;;;;;;;;;;;:::o;820:44:0:-;862:2;820:44;:::o;1108:23::-;;;;:::o;5132:478::-;1388:10;1410:4;1388:27;1367:97;;;;;;;;;;;;;;1705:14;;;;;;;:7;:14;;;;;;5241:5;;1705:14;;1684:79;;;;;;;;;;;;;;1562:14;;;;;;;:7;:14;;;;;;5274:8;;1562:14;;1561:15;1540:74;;;;;;;;;;;;;;5303:9;5298:168;5322:6;:13;5318:17;;5298:168;;;5373:5;5360:18;;:6;5367:1;5360:9;;;;;;;;;;;;;;;;;;;;:18;5356:100;;;5410:8;5398:6;5405:1;5398:9;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;5436:5;;5356:100;5337:3;;5298:168;;;-1:-1:-1;5475:14:0;;;;5492:5;5475:14;;;:7;:14;;;;;;:22;;;;;;;;;5507:17;;;;;;;;:24;;;;;5475:22;5507:24;;;;5546:19;;5475:14;;5546:19;;;5580:23;;;;;;;;;;;1773:1;1474;5132:478;;:::o;4324:1721:2:-;2448:12:0;:27;;;;;;;;;;:36;;;4410:13:2;;2448:36:0;;2447:37;2426:103;;;;;;;;;;;;;;4448:13:2;1330:26:1;1342:13;1330:11;:26::i;:::-;1309:95;;;;;;;;;;;;;;4477:31:2;4511:27;;;;;;;;;;;;4548:20;;;:27;;4571:4;4548:27;;;;;;;;;4986:16;;;;4962:95;;;;4548:27;4962:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4511:27;;4850:19;;;;;;4962:95;4986:16;;4962:95;;4986:16;4962:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4836:221;;;;;;5150:14;5167:4;:11;5150:28;;5219:12;:19;5209:6;:29;:56;;;;;5252:6;:13;5242:6;:23;5209:56;5188:125;;;;;;;;;;;;;;5324:35;5362:32;;;:17;:32;;;;;;;5404:596;5426:6;5421:1;:11;5404:596;;5520:141;5562:27;5607:4;5612:1;5607:7;;;;;;;;;;;;;;5632:12;5645:1;5632:15;;;;;;;;;;;;;;5520:24;:141::i;:::-;5768:15;5788:12;5801:1;5788:15;;;;;;;;;;;;;;:20;;5815:6;5822:1;5815:9;;;;;;;;;;;;;;5826:4;5831:1;5826:7;;;;;;;;;;;;;;5788:46;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;5767:67:2;;;5929:10;5904:85;;;;;;;;;;;;;;-1:-1:-1;5434:3:2;;5404:596;;;-1:-1:-1;6014:24:2;;6024:13;;6014:24;;;;;1414:1:1;;;;;;2539::0;4324:1721:2;;:::o;6476:762::-;6752:26;6781:17;:44;;6824:1;6781:44;;;6801:20;6781:44;6752:73;;6835:24;;:::i;:::-;-1:-1:-1;6862:121:2;;;;;;;;;;;;;;;;;;;;;;;;6993:39;;;-1:-1:-1;6993:39:2;;;:21;:39;;;;;:52;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7071:160;;;;;;7015:16;;7033:11;;6904:17;;6954:18;;7071:160;;;;;;;;;;6476:762;;;;;;:::o;3976:235:1:-;4086:32;;;;:17;:32;;;;;;;:51;;;4152:52;4104:13;;4152:52;;;;4121:16;;4152:52;;;;;;;;;;3976:235;;:::o;10452:500:0:-;10625:21;10595:11;2619:22;;;2598:81;;;;;;;;;;;;;;10678:16;;10734:140;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10734:140:0;;;;;;10704:27;;;;;;;;;;:170;;;;;;;;;;;;;;;-1:-1:-1;10704:170:0;;;;;;;10678:16;;-1:-1:-1;10734:140:0;;10704:27;;:170;;;;;;;;;;:::i;:::-;-1:-1:-1;10704:170:0;;;;;;;;;;;;;;;;;;;;;;;10884:16;:21;;-1:-1:-1;10884:21:0;;;10920:25;;10931:13;;10920:25;;-1:-1:-1;;10920:25:0;10452:500;;;;;;:::o;7501:837:2:-;7686:23;7712:18;:4;7686:23;7712:18;:15;:18;:::i;:::-;7686:44;;7740:24;;:::i;:::-;-1:-1:-1;7767:39:2;;;;;;;:21;:39;;;;;;;;:52;;;;;;;;;;;7740:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7873:416;;7999:26;;;;7963:63;;:27;;:63;;;:35;:63;:::i;:::-;7944:15;:82;;7919:168;;;;;;;;;;;;;;7873:416;;;8198:17;;8162:54;;:27;;:54;:35;:54;:::i;:::-;8143:15;:73;;8118:160;;;;;;;;;;;;;;7501:837;;;;;:::o;16814:871:6:-;16934:13;16978:5;16986:1;16978:9;16967:1;:8;:20;16963:290;;;17003:239;17025:216;17087:87;17192:1;:8;17218:5;17226:1;17218:9;17025:44;:216::i;:::-;17003:21;:239::i;:::-;-1:-1:-1;17329:2:6;17426:13;;;;;17420:20;17320:11;;;17579:66;17567:79;16814:871;;;;;:::o;1335:383:9:-;1421:7;1456:5;;;1475;;;1471:223;;;1496:187;1518:164;1575:55;1648:1;1667;1518:39;:164::i;1292:378:7:-;1480:12;1232:10;1551:37;;1602:9;1625:6;1645:8;1515:148;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1515:148:7;;;49:4:-1;25:18;;61:17;;1515:148:7;182:15:-1;1515:148:7;;;;179:29:-1;;;;160:49;;;1515:148:7;-1:-1:-1;1292:378:7;;;;;:::o;1511:170:8:-;1654:9;1648:16;1641:4;1630:9;1626:20;1619:46;731:322:10;884:12;196:10;955:28;;997:9;1020:1;1035;919:127;;;;;;;;;;;801:7539:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;801:7539:2;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;801:7539:2;;;-1:-1:-1;801:7539:2;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;301:714:-1;;425:3;418:4;410:6;406:17;402:27;392:2;;-1:-1;;433:12;392:2;473:6;467:13;495:76;510:60;563:6;510:60;;;495:76;;;599:21;;;486:85;-1:-1;643:4;656:14;;;;631:17;;;745;;;736:27;;;;733:36;-1:-1;730:2;;;782:1;;772:12;730:2;807:1;792:217;817:6;814:1;811:13;792:217;;;226:6;220:13;238:33;265:5;238:33;;;885:61;;960:14;;;;988;;;;839:1;832:9;792:217;;;796:14;;;;;385:630;;;;;1758:714;;1882:3;1875:4;1867:6;1863:17;1859:27;1849:2;;-1:-1;;1890:12;1849:2;1930:6;1924:13;1952:76;1967:60;2020:6;1967:60;;1952:76;2056:21;;;1943:85;-1:-1;2100:4;2113:14;;;;2088:17;;;2202;;;2193:27;;;;2190:36;-1:-1;2187:2;;;2239:1;;2229:12;2187:2;2264:1;2249:217;2274:6;2271:1;2268:13;2249:217;;;3990:13;;2342:61;;2417:14;;;;2445;;;;2296:1;2289:9;2249:217;;2480:124;2544:20;;30798:13;;30791:21;32941:32;;32931:2;;32987:1;;32977:12;2747:434;;2855:3;2848:4;2840:6;2836:17;2832:27;2822:2;;-1:-1;;2863:12;2822:2;2903:6;2897:13;2925:60;2940:44;2977:6;2940:44;;2925:60;2916:69;;3005:6;2998:5;2991:21;3109:3;3041:4;3100:6;3033;3091:16;;3088:25;3085:2;;;3126:1;;3116:12;3085:2;3136:39;3168:6;3041:4;3067:5;3063:16;3041:4;3033:6;3029:17;3136:39;;4053:241;;4157:2;4145:9;4136:7;4132:23;4128:32;4125:2;;;-1:-1;;4163:12;4125:2;85:6;72:20;97:33;124:5;97:33;;4301:366;;;4422:2;4410:9;4401:7;4397:23;4393:32;4390:2;;;-1:-1;;4428:12;4390:2;85:6;72:20;97:33;124:5;97:33;;;4480:63;-1:-1;4580:2;4619:22;;72:20;97:33;72:20;97:33;;;4588:63;;;;4384:283;;;;;;4674:595;;;;4821:2;4809:9;4800:7;4796:23;4792:32;4789:2;;;-1:-1;;4827:12;4789:2;85:6;72:20;97:33;124:5;97:33;;;4879:63;-1:-1;4979:2;5018:22;;3842:20;;-1:-1;5115:2;5100:18;;5087:32;5139:18;5128:30;;5125:2;;;-1:-1;;5161:12;5125:2;5236:6;5225:9;5221:22;3291:3;3284:4;3276:6;3272:17;3268:27;3258:2;;-1:-1;;3299:12;3258:2;3346:6;3333:20;3319:34;;3368:64;3383:48;3424:6;3383:48;;3368:64;3452:6;3445:5;3438:21;3556:3;4979:2;3547:6;3480;3538:16;;3535:25;3532:2;;;-1:-1;;3563:12;3532:2;32056:6;4979:2;3480:6;3476:17;4979:2;3514:5;3510:16;32033:30;-1:-1;4979:2;32103:6;3514:5;32094:16;;32087:27;5181:72;;;;;;4783:486;;;;;;5276:908;;;;5493:2;5481:9;5472:7;5468:23;5464:32;5461:2;;;-1:-1;;5499:12;5461:2;5550:17;5544:24;5588:18;;5580:6;5577:30;5574:2;;;-1:-1;;5610:12;5574:2;5713:6;5702:9;5698:22;1168:3;1161:4;1153:6;1149:17;1145:27;1135:2;;-1:-1;;1176:12;1135:2;1216:6;1210:13;1196:27;;1238:81;1253:65;1311:6;1253:65;;1238:81;1347:21;;;1391:4;1404:14;;;;1325:16;1379:17;;;-1:-1;1484:242;1509:6;1506:1;1503:13;1484:242;;;1609:53;1658:3;1391:4;1585:3;1579:10;1383:6;1567:23;;1609:53;;;1597:66;;1677:14;;;;1705;;;;1531:1;1524:9;1484:242;;;-1:-1;;5773:18;;5767:25;5630:100;;-1:-1;5767:25;-1:-1;;;5801:30;;;5798:2;;;-1:-1;;5834:12;5798:2;5864:85;5941:7;5932:6;5921:9;5917:22;5864:85;;;5854:95;;6007:2;5996:9;5992:18;5986:25;5972:39;;5588:18;6023:6;6020:30;6017:2;;;-1:-1;;6053:12;6017:2;;6083:85;6160:7;6151:6;6140:9;6136:22;6083:85;;;6073:95;;;5455:729;;;;;;6191:354;;;6306:2;6294:9;6285:7;6281:23;6277:32;6274:2;;;-1:-1;;6312:12;6274:2;6374:50;6416:7;6392:22;6374:50;;;6364:60;;6479:50;6521:7;6461:2;6501:9;6497:22;6479:50;;;6469:60;;6268:277;;;;;;6552:609;;;;;6703:3;6691:9;6682:7;6678:23;6674:33;6671:2;;;-1:-1;;6710:12;6671:2;2557:6;2544:20;2569:30;2593:5;2569:30;;;6762:60;-1:-1;6859:2;6897:22;;2677:20;2702:32;2677:20;2702:32;;;6867:62;-1:-1;6966:2;7005:22;;72:20;97:33;72:20;97:33;;;6974:63;-1:-1;7074:2;7113:22;;3705:20;31384:34;31373:46;;33184:35;;33174:2;;-1:-1;;33223:12;33174:2;6665:496;;;;-1:-1;6665:496;;-1:-1;;6665:496;7168:364;;;7288:2;7276:9;7267:7;7263:23;7259:32;7256:2;;;-1:-1;;7294:12;7256:2;2690:6;2677:20;2702:32;2728:5;2702:32;;7539:241;;7643:2;7631:9;7622:7;7618:23;7614:32;7611:2;;;-1:-1;;7649:12;7611:2;-1:-1;3842:20;;7605:175;-1:-1;7605:175;7787:366;;;7908:2;7896:9;7887:7;7883:23;7879:32;7876:2;;;-1:-1;;7914:12;7876:2;3855:6;3842:20;7966:63;;8066:2;8109:9;8105:22;72:20;97:33;124:5;97:33;;8160:605;;;;;8309:3;8297:9;8288:7;8284:23;8280:33;8277:2;;;-1:-1;;8316:12;8277:2;3855:6;3842:20;8368:63;;8468:2;8511:9;8507:22;3842:20;8476:63;;8576:2;8616:9;8612:22;2544:20;2569:30;2593:5;2569:30;;;8584:60;-1:-1;8681:2;8717:22;;2544:20;2569:30;2544:20;2569:30;;17063:254;;11546:5;29225:12;11657:52;11702:6;11697:3;11690:4;11683:5;11679:16;11657:52;;;11721:16;;;;;17184:133;-1:-1;;17184:133;17324:213;31504:42;31493:54;;;;9197:37;;17442:2;17427:18;;17413:124;17544:611;;31504:42;9227:5;31493:54;9204:3;9197:37;16924:5;17919:2;17908:9;17904:18;16894:37;17754:3;17956:2;17945:9;17941:18;17934:48;11186:5;29225:12;29895:6;17754:3;17743:9;17739:19;29883;11279:52;11324:6;29923:14;17743:9;29923:14;17919:2;11305:5;11301:16;11279:52;;;30798:13;;30791:21;18141:2;18126:18;;10889:34;-1:-1;32493:2;32473:14;;;;32489:7;32469:28;11343:39;29923:14;11343:39;;17725:430;-1:-1;;;17725:430;18162:361;18330:2;18344:47;;;29225:12;;18315:18;;;29883:19;;;18162:361;;28921:14;;;29923;;;;18162:361;9805:260;9830:6;9827:1;9824:13;9805:260;;;9891:13;;31504:42;31493:54;9197:37;;18330:2;29623:14;;;;8926;;;;9852:1;9845:9;9805:260;;;-1:-1;18397:116;;18301:222;-1:-1;;;;;18301:222;18530:361;18698:2;18712:47;;;29225:12;;18683:18;;;29883:19;;;18530:361;;28921:14;;;29923;;;;18530:361;10534:260;10559:6;10556:1;10553:13;10534:260;;;10620:13;;16894:37;;18698:2;29623:14;;;;9108;;;;10581:1;10574:9;10534:260;;18898:201;30798:13;;30791:21;10889:34;;19010:2;18995:18;;18981:118;19106:312;30798:13;;30791:21;10889:34;;31384;31373:46;19404:2;19389:18;;16784:37;19246:2;19231:18;;19217:201;19425:531;30896:66;30885:78;;;;11004:36;;31504:42;31493:54;;;;19782:2;19767:18;;9197:37;30798:13;30791:21;19859:2;19844:18;;10889:34;31384;31373:46;19942:2;19927:18;;16784:37;19619:3;19604:19;;19590:366;19963:471;20155:2;20140:18;;32599:1;32589:12;;32579:2;;32605:9;32579:2;11838:68;;;20337:2;20322:18;;16894:37;;;;20420:2;20405:18;;;16894:37;20126:308;;20441:501;20648:2;20633:18;;32732:1;32722:12;;32712:2;;32738:9;20949:407;21140:2;21154:47;;;12342:2;21125:18;;;29883:19;12378:14;29923;;;12358:35;12412:12;;;21111:245;21363:407;21554:2;21568:47;;;12663:2;21539:18;;;29883:19;12699:30;29923:14;;;12679:51;12749:12;;;21525:245;21777:407;21968:2;21982:47;;;13000:2;21953:18;;;29883:19;13036:14;29923;;;13016:35;13070:12;;;21939:245;22191:407;22382:2;22396:47;;;13321:2;22367:18;;;29883:19;13357:22;29923:14;;;13337:43;13399:12;;;22353:245;22605:407;22796:2;22810:47;;;13650:2;22781:18;;;29883:19;13686:24;29923:14;;;13666:45;13730:12;;;22767:245;23019:407;23210:2;23224:47;;;13981:2;23195:18;;;29883:19;14017:17;29923:14;;;13997:38;14054:12;;;23181:245;23433:407;23624:2;23638:47;;;14305:2;23609:18;;;29883:19;14341:18;29923:14;;;14321:39;14379:12;;;23595:245;23847:407;24038:2;24052:47;;;14630:2;24023:18;;;29883:19;14666:24;29923:14;;;14646:45;14710:12;;;24009:245;24261:407;24452:2;24466:47;;;14961:2;24437:18;;;29883:19;14997:18;29923:14;;;14977:39;15035:12;;;24423:245;24675:407;24866:2;24880:47;;;15286:2;24851:18;;;29883:19;15322:20;29923:14;;;15302:41;15362:12;;;24837:245;25089:407;25280:2;25294:47;;;15613:2;25265:18;;;29883:19;15649:29;29923:14;;;15629:50;15698:12;;;25251:245;25503:407;25694:2;25708:47;;;15949:2;25679:18;;;29883:19;15985:25;29923:14;;;15965:46;16030:12;;;25665:245;25917:407;26108:2;26122:47;;;16281:2;26093:18;;;29883:19;16317:21;29923:14;;;16297:42;16358:12;;;26079:245;26331:407;26522:2;26536:47;;;16609:2;26507:18;;;29883:19;16645:22;29923:14;;;16625:43;16687:12;;;26493:245;26745:213;16894:37;;;26863:2;26848:18;;26834:124;26965:256;27027:2;27021:9;27053:17;;;27128:18;27113:34;;27149:22;;;27110:62;27107:2;;;27185:1;;27175:12;27107:2;27027;27194:22;27005:216;;-1:-1;27005:216;27228:300;;27383:18;27375:6;27372:30;27369:2;;;-1:-1;;27405:12;27369:2;-1:-1;27450:4;27438:17;;;27503:15;;27306:222;28154:317;;28293:18;28285:6;28282:30;28279:2;;;-1:-1;;28315:12;28279:2;-1:-1;28392:4;28369:17;28388:9;28365:33;28456:4;28446:15;;28216:255;32129:268;32194:1;32201:101;32215:6;32212:1;32209:13;32201:101;;;32282:11;;;32276:18;32263:11;;;32256:39;32237:2;32230:10;32201:101;;;32317:6;32314:1;32311:13;32308:2;;;-1:-1;;32194:1;32364:16;;32357:27;32178:219;32761:117;31504:42;32848:5;31493:54;32823:5;32820:35;32810:2;;32869:1;;32859:12;32810:2;32804:74;;32885:111;32966:5;30798:13;30791:21;32944:5;32941:32;32931:2;;32987:1;;32977:12;33003:115;30896:66;33088:5;30885:78;33064:5;33061:34;33051:2;;33109:1;;33099:12
Swarm Source
bzzr://a5597104875bc950ef7cc880adf23d12732ed641d3fb34a1157b7ffd5d5f13f2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ 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.