Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0.002151464325498106 ETH
Eth Value
$3.54 (@ $1,645.87/ETH)More Info
Private Name Tags
ContractCreator
Latest 6 from a total of 6 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Flush Forwarder ... | 18623189 | 510 days ago | IN | 0 ETH | 0.00175736 | ||||
Flush Forwarder ... | 18623024 | 510 days ago | IN | 0 ETH | 0.00198388 | ||||
Transfer | 18127499 | 579 days ago | IN | 0.00015146 ETH | 0.00069456 | ||||
Init | 18008287 | 596 days ago | IN | 0 ETH | 0.00128039 | ||||
Transfer | 18007959 | 596 days ago | IN | 0.001 ETH | 0.00035536 | ||||
Transfer | 18007947 | 596 days ago | IN | 0.001 ETH | 0.00033273 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
WalletSimple
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.8.10; import './TransferHelper.sol'; import './ERC20Interface.sol'; import './IForwarder.sol'; /** ERC721, ERC1155 imports */ import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol'; import '@openzeppelin/contracts/token/ERC1155/utils/ERC1155Receiver.sol'; /** * * WalletSimple * ============ * * Basic multi-signer wallet designed for use in a co-signing environment where 2 signatures are required to move funds. * Typically used in a 2-of-3 signing configuration. Uses ecrecover to allow for 2 signatures in a single transaction. * * The first signature is created on the operation hash (see Data Formats) and passed to sendMultiSig/sendMultiSigToken * The signer is determined by verifyMultiSig(). * * The second signature is created by the submitter of the transaction and determined by msg.signer. * * Data Formats * ============ * * The signature is created with ethereumjs-util.ecsign(operationHash). * Like the eth_sign RPC call, it packs the values as a 65-byte array of [r, s, v]. * Unlike eth_sign, the message is not prefixed. * * The operationHash the result of keccak256(prefix, toAddress, value, data, expireTime). * For ether transactions, `prefix` is "ETHER". * For token transaction, `prefix` is "ERC20" and `data` is the tokenContractAddress. * * */ contract WalletSimple is IERC721Receiver, ERC1155Receiver { // Events event Deposited(address from, uint256 value, bytes data); event SafeModeActivated(address msgSender); event Transacted( address msgSender, // Address of the sender of the message initiating the transaction address otherSigner, // Address of the signer (second signature) used to initiate the transaction bytes32 operation, // Operation hash (see Data Formats) address toAddress, // The address the transaction was sent to uint256 value, // Amount of Wei sent to the address bytes data // Data sent when invoking the transaction ); event BatchTransfer(address sender, address recipient, uint256 value); // this event shows the other signer and the operation hash that they signed // specific batch transfer events are emitted in Batcher event BatchTransacted( address msgSender, // Address of the sender of the message initiating the transaction address otherSigner, // Address of the signer (second signature) used to initiate the transaction bytes32 operation // Operation hash (see Data Formats) ); // Public fields mapping(address => bool) public signers; // The addresses that can co-sign transactions on the wallet bool public safeMode = false; // When active, wallet may only send to signer addresses bool public initialized = false; // True if the contract has been initialized // Internal fields uint256 private constant MAX_SEQUENCE_ID_INCREASE = 10000; uint256 constant SEQUENCE_ID_WINDOW_SIZE = 10; uint256[SEQUENCE_ID_WINDOW_SIZE] recentSequenceIds; /** * Set up a simple multi-sig wallet by specifying the signers allowed to be used on this wallet. * 2 signers will be required to send a transaction from this wallet. * Note: The sender is NOT automatically added to the list of signers. * Signers CANNOT be changed once they are set * * @param allowedSigners An array of signers on the wallet */ function init(address[] calldata allowedSigners) external onlyUninitialized { require(allowedSigners.length == 3, 'Invalid number of signers'); for (uint8 i = 0; i < allowedSigners.length; i++) { require(allowedSigners[i] != address(0), 'Invalid signer'); signers[allowedSigners[i]] = true; } initialized = true; } /** * Get the network identifier that signers must sign over * This provides protection signatures being replayed on other chains * This must be a virtual function because chain-specific contracts will need * to override with their own network ids. It also can't be a field * to allow this contract to be used by proxy with delegatecall, which will * not pick up on state variables */ function getNetworkId() internal virtual pure returns (string memory) { return 'ETHER'; } /** * Get the network identifier that signers must sign over for token transfers * This provides protection signatures being replayed on other chains * This must be a virtual function because chain-specific contracts will need * to override with their own network ids. It also can't be a field * to allow this contract to be used by proxy with delegatecall, which will * not pick up on state variables */ function getTokenNetworkId() internal virtual pure returns (string memory) { return 'ERC20'; } /** * Get the network identifier that signers must sign over for batch transfers * This provides protection signatures being replayed on other chains * This must be a virtual function because chain-specific contracts will need * to override with their own network ids. It also can't be a field * to allow this contract to be used by proxy with delegatecall, which will * not pick up on state variables */ function getBatchNetworkId() internal virtual pure returns (string memory) { return 'ETHER-Batch'; } /** * Determine if an address is a signer on this wallet * @param signer address to check * returns boolean indicating whether address is signer or not */ function isSigner(address signer) public view returns (bool) { return signers[signer]; } /** * Modifier that will execute internal code block only if the sender is an authorized signer on this wallet */ modifier onlySigner { require(isSigner(msg.sender), 'Non-signer in onlySigner method'); _; } /** * Modifier that will execute internal code block only if the contract has not been initialized yet */ modifier onlyUninitialized { require(!initialized, 'Contract already initialized'); _; } /** * Gets called when a transaction is received with data that does not match any other method */ fallback() external payable { if (msg.value > 0) { // Fire deposited event if we are receiving funds emit Deposited(msg.sender, msg.value, msg.data); } } /** * Gets called when a transaction is received with ether and no data */ receive() external payable { if (msg.value > 0) { // Fire deposited event if we are receiving funds // message data is always empty for receive. If there is data it is sent to fallback function. emit Deposited(msg.sender, msg.value, ''); } } /** * Execute a multi-signature transaction from this wallet using 2 signers: one from msg.sender and the other from ecrecover. * Sequence IDs are numbers starting from 1. They are used to prevent replay attacks and may not be repeated. * * @param toAddress the destination address to send an outgoing transaction * @param value the amount in Wei to be sent * @param data the data to send to the toAddress when invoking the transaction * @param expireTime the number of seconds since 1970 for which this transaction is valid * @param sequenceId the unique sequence id obtainable from getNextSequenceId * @param signature see Data Formats */ function sendMultiSig( address toAddress, uint256 value, bytes calldata data, uint256 expireTime, uint256 sequenceId, bytes calldata signature ) external onlySigner { // Verify the other signer bytes32 operationHash = keccak256( abi.encodePacked( getNetworkId(), toAddress, value, data, expireTime, sequenceId ) ); address otherSigner = verifyMultiSig( toAddress, operationHash, signature, expireTime, sequenceId ); // Success, send the transaction (bool success, ) = toAddress.call{ value: value }(data); require(success, 'Call execution failed'); emit Transacted( msg.sender, otherSigner, operationHash, toAddress, value, data ); } /** * Execute a batched multi-signature transaction from this wallet using 2 signers: one from msg.sender and the other from ecrecover. * Sequence IDs are numbers starting from 1. They are used to prevent replay attacks and may not be repeated. * The recipients and values to send are encoded in two arrays, where for index i, recipients[i] will be sent values[i]. * * @param recipients The list of recipients to send to * @param values The list of values to send to * @param expireTime the number of seconds since 1970 for which this transaction is valid * @param sequenceId the unique sequence id obtainable from getNextSequenceId * @param signature see Data Formats */ function sendMultiSigBatch( address[] calldata recipients, uint256[] calldata values, uint256 expireTime, uint256 sequenceId, bytes calldata signature ) external onlySigner { require(recipients.length != 0, 'Not enough recipients'); require( recipients.length == values.length, 'Unequal recipients and values' ); require(recipients.length < 256, 'Too many recipients, max 255'); // Verify the other signer bytes32 operationHash = keccak256( abi.encodePacked( getBatchNetworkId(), recipients, values, expireTime, sequenceId ) ); // the first parameter (toAddress) is used to ensure transactions in safe mode only go to a signer // if in safe mode, we should use normal sendMultiSig to recover, so this check will always fail if in safe mode require(!safeMode, 'Batch in safe mode'); address otherSigner = verifyMultiSig( address(0x0), operationHash, signature, expireTime, sequenceId ); batchTransfer(recipients, values); emit BatchTransacted(msg.sender, otherSigner, operationHash); } /** * Transfer funds in a batch to each of recipients * @param recipients The list of recipients to send to * @param values The list of values to send to recipients. * The recipient with index i in recipients array will be sent values[i]. * Thus, recipients and values must be the same length */ function batchTransfer( address[] calldata recipients, uint256[] calldata values ) internal { for (uint256 i = 0; i < recipients.length; i++) { require(address(this).balance >= values[i], 'Insufficient funds'); (bool success, ) = recipients[i].call{ value: values[i] }(''); require(success, 'Call failed'); emit BatchTransfer(msg.sender, recipients[i], values[i]); } } /** * Execute a multi-signature token transfer from this wallet using 2 signers: one from msg.sender and the other from ecrecover. * Sequence IDs are numbers starting from 1. They are used to prevent replay attacks and may not be repeated. * * @param toAddress the destination address to send an outgoing transaction * @param value the amount in tokens to be sent * @param tokenContractAddress the address of the erc20 token contract * @param expireTime the number of seconds since 1970 for which this transaction is valid * @param sequenceId the unique sequence id obtainable from getNextSequenceId * @param signature see Data Formats */ function sendMultiSigToken( address toAddress, uint256 value, address tokenContractAddress, uint256 expireTime, uint256 sequenceId, bytes calldata signature ) external onlySigner { // Verify the other signer bytes32 operationHash = keccak256( abi.encodePacked( getTokenNetworkId(), toAddress, value, tokenContractAddress, expireTime, sequenceId ) ); verifyMultiSig(toAddress, operationHash, signature, expireTime, sequenceId); TransferHelper.safeTransfer(tokenContractAddress, toAddress, value); } /** * Execute a token flush from one of the forwarder addresses. This transfer needs only a single signature and can be done by any signer * * @param forwarderAddress the address of the forwarder address to flush the tokens from * @param tokenContractAddress the address of the erc20 token contract */ function flushForwarderTokens( address payable forwarderAddress, address tokenContractAddress ) external onlySigner { IForwarder forwarder = IForwarder(forwarderAddress); forwarder.flushTokens(tokenContractAddress); } /** * Execute a ERC721 token flush from one of the forwarder addresses. This transfer needs only a single signature and can be done by any signer * * @param forwarderAddress the address of the forwarder address to flush the tokens from * @param tokenContractAddress the address of the erc20 token contract */ function flushERC721ForwarderTokens( address payable forwarderAddress, address tokenContractAddress, uint256 tokenId ) external onlySigner { IForwarder forwarder = IForwarder(forwarderAddress); forwarder.flushERC721Token(tokenContractAddress, tokenId); } /** * Execute a ERC1155 batch token flush from one of the forwarder addresses. * This transfer needs only a single signature and can be done by any signer. * * @param forwarderAddress the address of the forwarder address to flush the tokens from * @param tokenContractAddress the address of the erc1155 token contract */ function batchFlushERC1155ForwarderTokens( address payable forwarderAddress, address tokenContractAddress, uint256[] calldata tokenIds ) external onlySigner { IForwarder forwarder = IForwarder(forwarderAddress); forwarder.batchFlushERC1155Tokens(tokenContractAddress, tokenIds); } /** * Execute a ERC1155 token flush from one of the forwarder addresses. * This transfer needs only a single signature and can be done by any signer. * * @param forwarderAddress the address of the forwarder address to flush the tokens from * @param tokenContractAddress the address of the erc1155 token contract * @param tokenId the token id associated with the ERC1155 */ function flushERC1155ForwarderTokens( address payable forwarderAddress, address tokenContractAddress, uint256 tokenId ) external onlySigner { IForwarder forwarder = IForwarder(forwarderAddress); forwarder.flushERC1155Tokens(tokenContractAddress, tokenId); } /** * Sets the autoflush 721 parameter on the forwarder. * * @param forwarderAddress the address of the forwarder to toggle. * @param autoFlush whether to autoflush erc721 tokens */ function setAutoFlush721(address forwarderAddress, bool autoFlush) external onlySigner { IForwarder forwarder = IForwarder(forwarderAddress); forwarder.setAutoFlush721(autoFlush); } /** * Sets the autoflush 721 parameter on the forwarder. * * @param forwarderAddress the address of the forwarder to toggle. * @param autoFlush whether to autoflush erc1155 tokens */ function setAutoFlush1155(address forwarderAddress, bool autoFlush) external onlySigner { IForwarder forwarder = IForwarder(forwarderAddress); forwarder.setAutoFlush1155(autoFlush); } /** * Do common multisig verification for both eth sends and erc20token transfers * * @param toAddress the destination address to send an outgoing transaction * @param operationHash see Data Formats * @param signature see Data Formats * @param expireTime the number of seconds since 1970 for which this transaction is valid * @param sequenceId the unique sequence id obtainable from getNextSequenceId * returns address that has created the signature */ function verifyMultiSig( address toAddress, bytes32 operationHash, bytes calldata signature, uint256 expireTime, uint256 sequenceId ) private returns (address) { address otherSigner = recoverAddressFromSignature(operationHash, signature); // Verify if we are in safe mode. In safe mode, the wallet can only send to signers require(!safeMode || isSigner(toAddress), 'External transfer in safe mode'); // Verify that the transaction has not expired require(expireTime >= block.timestamp, 'Transaction expired'); // Try to insert the sequence ID. Will revert if the sequence id was invalid tryInsertSequenceId(sequenceId); require(isSigner(otherSigner), 'Invalid signer'); require(otherSigner != msg.sender, 'Signers cannot be equal'); return otherSigner; } /** * ERC721 standard callback function for when a ERC721 is transfered. * * @param _operator The address of the nft contract * @param _from The address of the sender * @param _tokenId The token id of the nft * @param _data Additional data with no specified format, sent in call to `_to` */ function onERC721Received( address _operator, address _from, uint256 _tokenId, bytes memory _data ) external virtual override returns (bytes4) { return this.onERC721Received.selector; } /** * @inheritdoc IERC1155Receiver */ function onERC1155Received( address _operator, address _from, uint256 id, uint256 value, bytes calldata data ) external virtual override returns (bytes4) { return this.onERC1155Received.selector; } /** * @inheritdoc IERC1155Receiver */ function onERC1155BatchReceived( address _operator, address _from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } /** * Irrevocably puts contract into safe mode. When in this mode, transactions may only be sent to signing addresses. */ function activateSafeMode() external onlySigner { safeMode = true; emit SafeModeActivated(msg.sender); } /** * Gets signer's address using ecrecover * @param operationHash see Data Formats * @param signature see Data Formats * returns address recovered from the signature */ function recoverAddressFromSignature( bytes32 operationHash, bytes memory signature ) private pure returns (address) { require(signature.length == 65, 'Invalid signature - wrong length'); // We need to unpack the signature, which is given as an array of 65 bytes (like eth.sign) bytes32 r; bytes32 s; uint8 v; // solhint-disable-next-line assembly { r := mload(add(signature, 32)) s := mload(add(signature, 64)) v := and(mload(add(signature, 65)), 255) } if (v < 27) { v += 27; // Ethereum versions are 27 or 28 as opposed to 0 or 1 which is submitted by some signing libs } // protect against signature malleability // S value must be in the lower half orader // reference: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/051d340171a93a3d401aaaea46b4b62fa81e5d7c/contracts/cryptography/ECDSA.sol#L53 require( uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value" ); // note that this returns 0 if the signature is invalid // Since 0x0 can never be a signer, when the recovered signer address // is checked against our signer list, that 0x0 will cause an invalid signer failure return ecrecover(operationHash, v, r, s); } /** * Verify that the sequence id has not been used before and inserts it. Throws if the sequence ID was not accepted. * We collect a window of up to 10 recent sequence ids, and allow any sequence id that is not in the window and * greater than the minimum element in the window. * @param sequenceId to insert into array of stored ids */ function tryInsertSequenceId(uint256 sequenceId) private onlySigner { // Keep a pointer to the lowest value element in the window uint256 lowestValueIndex = 0; // fetch recentSequenceIds into memory for function context to avoid unnecessary sloads uint256[SEQUENCE_ID_WINDOW_SIZE] memory _recentSequenceIds = recentSequenceIds; for (uint256 i = 0; i < SEQUENCE_ID_WINDOW_SIZE; i++) { require(_recentSequenceIds[i] != sequenceId, 'Sequence ID already used'); if (_recentSequenceIds[i] < _recentSequenceIds[lowestValueIndex]) { lowestValueIndex = i; } } // The sequence ID being used is lower than the lowest value in the window // so we cannot accept it as it may have been used before require( sequenceId > _recentSequenceIds[lowestValueIndex], 'Sequence ID below window' ); // Block sequence IDs which are much higher than the lowest value // This prevents people blocking the contract by using very large sequence IDs quickly require( sequenceId <= (_recentSequenceIds[lowestValueIndex] + MAX_SEQUENCE_ID_INCREASE), 'Sequence ID above maximum' ); recentSequenceIds[lowestValueIndex] = sequenceId; } /** * Gets the next available sequence ID for signing when using executeAndConfirm * returns the sequenceId one higher than the highest currently stored */ function getNextSequenceId() external view returns (uint256) { uint256 highestSequenceId = 0; for (uint256 i = 0; i < SEQUENCE_ID_WINDOW_SIZE; i++) { if (recentSequenceIds[i] > highestSequenceId) { highestSequenceId = recentSequenceIds[i]; } } return highestSequenceId + 1; } }
// SPDX-License-Identifier: GPL-3.0-or-later // source: https://github.com/Uniswap/solidity-lib/blob/master/contracts/libraries/TransferHelper.sol pragma solidity 0.8.10; import '@openzeppelin/contracts/utils/Address.sol'; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(0xa9059cbb, to, value) ); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeTransfer: transfer failed' ); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory returndata) = token.call( abi.encodeWithSelector(0x23b872dd, from, to, value) ); Address.verifyCallResult( success, returndata, 'TransferHelper::transferFrom: transferFrom failed' ); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.10; /** * Contract that exposes the needed erc20 token functions */ abstract contract ERC20Interface { // Send _value amount of tokens to address _to function transfer(address _to, uint256 _value) public virtual returns (bool success); // Get the account balance of another account with address _owner function balanceOf(address _owner) public virtual view returns (uint256 balance); }
pragma solidity ^0.8.0; import '@openzeppelin/contracts/utils/introspection/IERC165.sol'; interface IForwarder is IERC165 { /** * Sets the autoflush721 parameter. * * @param autoFlush whether to autoflush erc721 tokens */ function setAutoFlush721(bool autoFlush) external; /** * Sets the autoflush1155 parameter. * * @param autoFlush whether to autoflush erc1155 tokens */ function setAutoFlush1155(bool autoFlush) external; /** * Execute a token transfer of the full balance from the forwarder token to the parent address * * @param tokenContractAddress the address of the erc20 token contract */ function flushTokens(address tokenContractAddress) external; /** * Execute a nft transfer from the forwarder to the parent address * * @param tokenContractAddress the address of the ERC721 NFT contract * @param tokenId The token id of the nft */ function flushERC721Token(address tokenContractAddress, uint256 tokenId) external; /** * Execute a nft transfer from the forwarder to the parent address. * * @param tokenContractAddress the address of the ERC1155 NFT contract * @param tokenId The token id of the nft */ function flushERC1155Tokens(address tokenContractAddress, uint256 tokenId) external; /** * Execute a batch nft transfer from the forwarder to the parent address. * * @param tokenContractAddress the address of the ERC1155 NFT contract * @param tokenIds The token ids of the nfts */ function batchFlushERC1155Tokens( address tokenContractAddress, uint256[] calldata tokenIds ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol) pragma solidity ^0.8.0; import "../IERC1155Receiver.sol"; import "../../../utils/introspection/ERC165.sol"; /** * @dev _Available since v3.1._ */ abstract contract ERC1155Receiver is ERC165, IERC1155Receiver { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"msgSender","type":"address"},{"indexed":false,"internalType":"address","name":"otherSigner","type":"address"},{"indexed":false,"internalType":"bytes32","name":"operation","type":"bytes32"}],"name":"BatchTransacted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"BatchTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"msgSender","type":"address"}],"name":"SafeModeActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"msgSender","type":"address"},{"indexed":false,"internalType":"address","name":"otherSigner","type":"address"},{"indexed":false,"internalType":"bytes32","name":"operation","type":"bytes32"},{"indexed":false,"internalType":"address","name":"toAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Transacted","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"activateSafeMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"forwarderAddress","type":"address"},{"internalType":"address","name":"tokenContractAddress","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchFlushERC1155ForwarderTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"forwarderAddress","type":"address"},{"internalType":"address","name":"tokenContractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"flushERC1155ForwarderTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"forwarderAddress","type":"address"},{"internalType":"address","name":"tokenContractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"flushERC721ForwarderTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"forwarderAddress","type":"address"},{"internalType":"address","name":"tokenContractAddress","type":"address"}],"name":"flushForwarderTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getNextSequenceId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"allowedSigners","type":"address[]"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"isSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"safeMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"expireTime","type":"uint256"},{"internalType":"uint256","name":"sequenceId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"sendMultiSig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"uint256","name":"expireTime","type":"uint256"},{"internalType":"uint256","name":"sequenceId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"sendMultiSigBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address","name":"tokenContractAddress","type":"address"},{"internalType":"uint256","name":"expireTime","type":"uint256"},{"internalType":"uint256","name":"sequenceId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"sendMultiSigToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarderAddress","type":"address"},{"internalType":"bool","name":"autoFlush","type":"bool"}],"name":"setAutoFlush1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarderAddress","type":"address"},{"internalType":"bool","name":"autoFlush","type":"bool"}],"name":"setAutoFlush721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"signers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526000600160006101000a81548160ff02191690831515021790555060006001806101000a81548160ff02191690831515021790555034801561004557600080fd5b50613834806100556000396000f3fe6080604052600436106101235760003560e01c806392467776116100a0578063c137878411610064578063c137878414610488578063c6044c46146104b1578063e6bd0aa4146104da578063f23a6e6114610503578063fc0f392d146105405761016d565b806392467776146103a3578063a0b7967b146103cc578063abe3219c146103f7578063ad3ad70914610422578063bc197c811461044b5761016d565b806334f94047116100e757806334f94047146102ae57806339125215146102d75780635a953d0a14610300578063736c0d5b146103295780637df73e27146103665761016d565b806301ffc9a7146101b75780630dcd7a6c146101f4578063150b7a021461021d578063158ef93e1461025a5780632da03409146102855761016d565b3661016d57600034111561016b577f6e89d517057028190560dd200cf6bf792842861353d1173761dfa362e1c133f03334604051610162929190611c6a565b60405180910390a15b005b60003411156101b5577f6e89d517057028190560dd200cf6bf792842861353d1173761dfa362e1c133f033346000366040516101ac9493929190611cf3565b60405180910390a15b005b3480156101c357600080fd5b506101de60048036038101906101d99190611d9f565b610557565b6040516101eb9190611de7565b60405180910390f35b34801561020057600080fd5b5061021b60048036038101906102169190611ebf565b6105d1565b005b34801561022957600080fd5b50610244600480360381019061023f919061208f565b610679565b6040516102519190612121565b60405180910390f35b34801561026657600080fd5b5061026f61068d565b60405161027c9190611de7565b60405180910390f35b34801561029157600080fd5b506102ac60048036038101906102a7919061217a565b61069e565b005b3480156102ba57600080fd5b506102d560048036038101906102d09190612210565b61075b565b005b3480156102e357600080fd5b506102fe60048036038101906102f99190612284565b61081e565b005b34801561030c57600080fd5b5061032760048036038101906103229190612353565b6109b6565b005b34801561033557600080fd5b50610350600480360381019061034b91906123a6565b610a76565b60405161035d9190611de7565b60405180910390f35b34801561037257600080fd5b5061038d600480360381019061038891906123a6565b610a96565b60405161039a9190611de7565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c591906123ff565b610aeb565b005b3480156103d857600080fd5b506103e1610ba8565b6040516103ee919061243f565b60405180910390f35b34801561040357600080fd5b5061040c610c18565b6040516104199190611de7565b60405180910390f35b34801561042e57600080fd5b50610449600480360381019061044491906124b0565b610c2b565b005b34801561045757600080fd5b50610472600480360381019061046d919061258c565b610e3d565b60405161047f9190612121565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa91906123ff565b610e55565b005b3480156104bd57600080fd5b506104d860048036038101906104d39190612668565b610f12565b005b3480156104e657600080fd5b5061050160048036038101906104fc9190612353565b611104565b005b34801561050f57600080fd5b5061052a600480360381019061052591906126b5565b6111c4565b6040516105379190612121565b60405180910390f35b34801561054c57600080fd5b506105556111da565b005b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105ca57506105c982611275565b5b9050919050565b6105da33610a96565b610619576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610610906127ac565b60405180910390fd5b60006106236112df565b888888888860405160200161063d969594939291906128af565b60405160208183030381529060405280519060200120905061066388828585898961131c565b5061066f8689896114e0565b5050505050505050565b600063150b7a0260e01b9050949350505050565b60018054906101000a900460ff1681565b6106a733610a96565b6106e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106dd906127ac565b60405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff16633ef13367836040518263ffffffff1660e01b8152600401610724919061291b565b600060405180830381600087803b15801561073e57600080fd5b505af1158015610752573d6000803e3d6000fd5b50505050505050565b61076433610a96565b6107a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079a906127ac565b60405180910390fd5b60008490508073ffffffffffffffffffffffffffffffffffffffff1663c6a2dd248585856040518463ffffffff1660e01b81526004016107e5939291906129a8565b600060405180830381600087803b1580156107ff57600080fd5b505af1158015610813573d6000803e3d6000fd5b505050505050505050565b61082733610a96565b610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085d906127ac565b60405180910390fd5b6000610870611616565b89898989898960405160200161088c9796959493929190612a0a565b60405160208183030381529060405280519060200120905060006108b48a8386868a8a61131c565b905060008a73ffffffffffffffffffffffffffffffffffffffff168a8a8a6040516108e0929190612a74565b60006040518083038185875af1925050503d806000811461091d576040519150601f19603f3d011682016040523d82523d6000602084013e610922565b606091505b5050905080610966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095d90612ad9565b60405180910390fd5b7f59bed9ab5d78073465dd642a9e3e76dfdb7d53bcae9d09df7d0b8f5234d5a8063383858e8e8e8e6040516109a19796959493929190612b12565b60405180910390a15050505050505050505050565b6109bf33610a96565b6109fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f5906127ac565b60405180910390fd5b60008390508073ffffffffffffffffffffffffffffffffffffffff1663159e44d784846040518363ffffffff1660e01b8152600401610a3e929190612b7c565b600060405180830381600087803b158015610a5857600080fd5b505af1158015610a6c573d6000803e3d6000fd5b5050505050505050565b60006020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610af433610a96565b610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a906127ac565b60405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff16638acc01be836040518263ffffffff1660e01b8152600401610b719190611de7565b600060405180830381600087803b158015610b8b57600080fd5b505af1158015610b9f573d6000803e3d6000fd5b50505050505050565b6000806000905060005b600a811015610c045781600282600a8110610bd057610bcf612ba5565b5b01541115610bf157600281600a8110610bec57610beb612ba5565b5b015491505b8080610bfc90612c03565b915050610bb2565b50600181610c129190612c4c565b91505090565b600160009054906101000a900460ff1681565b610c3433610a96565b610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a906127ac565b60405180910390fd5b6000888890501415610cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb190612cee565b60405180910390fd5b858590508888905014610d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf990612d5a565b60405180910390fd5b6101008888905010610d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4090612dc6565b60405180910390fd5b6000610d53611653565b898989898989604051602001610d6f9796959493929190612f0a565b604051602081830303815290604052805190602001209050600160009054906101000a900460ff1615610dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dce90612fad565b60405180910390fd5b6000610de860008386868a8a61131c565b9050610df68a8a8a8a611690565b7fe4c9047a729726b729cf4fa62c95ef9a434bbaf206a7ea0c7c77515db1584022338284604051610e2993929190612fcd565b60405180910390a150505050505050505050565b600063bc197c8160e01b905098975050505050505050565b610e5e33610a96565b610e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e94906127ac565b60405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff1663c59f9f19836040518263ffffffff1660e01b8152600401610edb9190611de7565b600060405180830381600087803b158015610ef557600080fd5b505af1158015610f09573d6000803e3d6000fd5b50505050505050565b60018054906101000a900460ff1615610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5790613050565b60405180910390fd5b60038282905014610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d906130bc565b60405180910390fd5b60005b828290508160ff1610156110e557600073ffffffffffffffffffffffffffffffffffffffff1683838360ff16818110610fe557610fe4612ba5565b5b9050602002016020810190610ffa91906123a6565b73ffffffffffffffffffffffffffffffffffffffff161415611051576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104890613128565b60405180910390fd5b600160008085858560ff1681811061106c5761106b612ba5565b5b905060200201602081019061108191906123a6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806110dd90613155565b915050610fa9565b5060018060016101000a81548160ff0219169083151502179055505050565b61110d33610a96565b61114c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611143906127ac565b60405180910390fd5b60008390508073ffffffffffffffffffffffffffffffffffffffff16638972c17c84846040518363ffffffff1660e01b815260040161118c929190612b7c565b600060405180830381600087803b1580156111a657600080fd5b505af11580156111ba573d6000803e3d6000fd5b5050505050505050565b600063f23a6e6160e01b90509695505050505050565b6111e333610a96565b611222576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611219906127ac565b60405180910390fd5b60018060006101000a81548160ff0219169083151502179055507f0909e8f76a4fd3e970f2eaef56c0ee6dfaf8b87c5b8d3f56ffce78e825a911573360405161126b919061291b565b60405180910390a1565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606040518060400160405280600581526020017f4552433230000000000000000000000000000000000000000000000000000000815250905090565b60008061136d8787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061187c565b9050600160009054906101000a900460ff161580611390575061138f88610a96565b5b6113cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c6906131cb565b60405180910390fd5b42841015611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140990613237565b60405180910390fd5b61141b836119bb565b61142481610a96565b611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90613128565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c9906132a3565b60405180910390fd5b809150509695505050505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401611512929190612b7c565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161156091906132ff565b6000604051808303816000865af19150503d806000811461159d576040519150601f19603f3d011682016040523d82523d6000602084013e6115a2565b606091505b50915091508180156115d057506000815114806115cf5750808060200190518101906115ce919061332b565b5b5b61160f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611606906133ca565b60405180910390fd5b5050505050565b60606040518060400160405280600581526020017f4554484552000000000000000000000000000000000000000000000000000000815250905090565b60606040518060400160405280600b81526020017f45544845522d4261746368000000000000000000000000000000000000000000815250905090565b60005b84849050811015611875578282828181106116b1576116b0612ba5565b5b905060200201354710156116fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f190613436565b60405180910390fd5b600085858381811061170f5761170e612ba5565b5b905060200201602081019061172491906123a6565b73ffffffffffffffffffffffffffffffffffffffff1684848481811061174d5761174c612ba5565b5b9050602002013560405161176090613479565b60006040518083038185875af1925050503d806000811461179d576040519150601f19603f3d011682016040523d82523d6000602084013e6117a2565b606091505b50509050806117e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117dd906134da565b60405180910390fd5b7fc42fa155158786a1dd6ccc3a785f35845467353c3cc700e0e31a79f90e22227d3387878581811061181b5761181a612ba5565b5b905060200201602081019061183091906123a6565b86868681811061184357611842612ba5565b5b90506020020135604051611859939291906134fa565b60405180910390a150808061186d90612c03565b915050611693565b5050505050565b600060418251146118c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b99061357d565b60405180910390fd5b6000806000602085015192506040850151915060ff6041860151169050601b8160ff1610156118fb57601b816118f8919061359d565b90505b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115611961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195890613646565b60405180910390fd5b600186828585604051600081526020016040526040516119849493929190613675565b6020604051602081039080840390855afa1580156119a6573d6000803e3d6000fd5b50505060206040510351935050505092915050565b6119c433610a96565b611a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fa906127ac565b60405180910390fd5b6000806002600a806020026040519081016040528092919082600a8015611a3f576020028201915b815481526020019060010190808311611a2b575b5050505050905060005b600a811015611af957838282600a8110611a6657611a65612ba5565b5b60200201511415611aac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa390613706565b60405180910390fd5b8183600a8110611abf57611abe612ba5565b5b60200201518282600a8110611ad757611ad6612ba5565b5b60200201511015611ae6578092505b8080611af190612c03565b915050611a49565b508082600a8110611b0d57611b0c612ba5565b5b60200201518311611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a90613772565b60405180910390fd5b6127108183600a8110611b6957611b68612ba5565b5b6020020151611b789190612c4c565b831115611bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb1906137de565b60405180910390fd5b82600283600a8110611bcf57611bce612ba5565b5b0181905550505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611c0482611bd9565b9050919050565b611c1481611bf9565b82525050565b6000819050919050565b611c2d81611c1a565b82525050565b600082825260208201905092915050565b50565b6000611c54600083611c33565b9150611c5f82611c44565b600082019050919050565b6000606082019050611c7f6000830185611c0b565b611c8c6020830184611c24565b8181036040830152611c9d81611c47565b90509392505050565b82818337600083830152505050565b6000601f19601f8301169050919050565b6000611cd28385611c33565b9350611cdf838584611ca6565b611ce883611cb5565b840190509392505050565b6000606082019050611d086000830187611c0b565b611d156020830186611c24565b8181036040830152611d28818486611cc6565b905095945050505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d7c81611d47565b8114611d8757600080fd5b50565b600081359050611d9981611d73565b92915050565b600060208284031215611db557611db4611d3d565b5b6000611dc384828501611d8a565b91505092915050565b60008115159050919050565b611de181611dcc565b82525050565b6000602082019050611dfc6000830184611dd8565b92915050565b611e0b81611bf9565b8114611e1657600080fd5b50565b600081359050611e2881611e02565b92915050565b611e3781611c1a565b8114611e4257600080fd5b50565b600081359050611e5481611e2e565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611e7f57611e7e611e5a565b5b8235905067ffffffffffffffff811115611e9c57611e9b611e5f565b5b602083019150836001820283011115611eb857611eb7611e64565b5b9250929050565b600080600080600080600060c0888a031215611ede57611edd611d3d565b5b6000611eec8a828b01611e19565b9750506020611efd8a828b01611e45565b9650506040611f0e8a828b01611e19565b9550506060611f1f8a828b01611e45565b9450506080611f308a828b01611e45565b93505060a088013567ffffffffffffffff811115611f5157611f50611d42565b5b611f5d8a828b01611e69565b925092505092959891949750929550565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611fab82611cb5565b810181811067ffffffffffffffff82111715611fca57611fc9611f73565b5b80604052505050565b6000611fdd611d33565b9050611fe98282611fa2565b919050565b600067ffffffffffffffff82111561200957612008611f73565b5b61201282611cb5565b9050602081019050919050565b600061203261202d84611fee565b611fd3565b90508281526020810184848401111561204e5761204d611f6e565b5b612059848285611ca6565b509392505050565b600082601f83011261207657612075611e5a565b5b813561208684826020860161201f565b91505092915050565b600080600080608085870312156120a9576120a8611d3d565b5b60006120b787828801611e19565b94505060206120c887828801611e19565b93505060406120d987828801611e45565b925050606085013567ffffffffffffffff8111156120fa576120f9611d42565b5b61210687828801612061565b91505092959194509250565b61211b81611d47565b82525050565b60006020820190506121366000830184612112565b92915050565b600061214782611bd9565b9050919050565b6121578161213c565b811461216257600080fd5b50565b6000813590506121748161214e565b92915050565b6000806040838503121561219157612190611d3d565b5b600061219f85828601612165565b92505060206121b085828601611e19565b9150509250929050565b60008083601f8401126121d0576121cf611e5a565b5b8235905067ffffffffffffffff8111156121ed576121ec611e5f565b5b60208301915083602082028301111561220957612208611e64565b5b9250929050565b6000806000806060858703121561222a57612229611d3d565b5b600061223887828801612165565b945050602061224987828801611e19565b935050604085013567ffffffffffffffff81111561226a57612269611d42565b5b612276878288016121ba565b925092505092959194509250565b60008060008060008060008060c0898b0312156122a4576122a3611d3d565b5b60006122b28b828c01611e19565b98505060206122c38b828c01611e45565b975050604089013567ffffffffffffffff8111156122e4576122e3611d42565b5b6122f08b828c01611e69565b965096505060606123038b828c01611e45565b94505060806123148b828c01611e45565b93505060a089013567ffffffffffffffff81111561233557612334611d42565b5b6123418b828c01611e69565b92509250509295985092959890939650565b60008060006060848603121561236c5761236b611d3d565b5b600061237a86828701612165565b935050602061238b86828701611e19565b925050604061239c86828701611e45565b9150509250925092565b6000602082840312156123bc576123bb611d3d565b5b60006123ca84828501611e19565b91505092915050565b6123dc81611dcc565b81146123e757600080fd5b50565b6000813590506123f9816123d3565b92915050565b6000806040838503121561241657612415611d3d565b5b600061242485828601611e19565b9250506020612435858286016123ea565b9150509250929050565b60006020820190506124546000830184611c24565b92915050565b60008083601f8401126124705761246f611e5a565b5b8235905067ffffffffffffffff81111561248d5761248c611e5f565b5b6020830191508360208202830111156124a9576124a8611e64565b5b9250929050565b60008060008060008060008060a0898b0312156124d0576124cf611d3d565b5b600089013567ffffffffffffffff8111156124ee576124ed611d42565b5b6124fa8b828c0161245a565b9850985050602089013567ffffffffffffffff81111561251d5761251c611d42565b5b6125298b828c016121ba565b9650965050604061253c8b828c01611e45565b945050606061254d8b828c01611e45565b935050608089013567ffffffffffffffff81111561256e5761256d611d42565b5b61257a8b828c01611e69565b92509250509295985092959890939650565b60008060008060008060008060a0898b0312156125ac576125ab611d3d565b5b60006125ba8b828c01611e19565b98505060206125cb8b828c01611e19565b975050604089013567ffffffffffffffff8111156125ec576125eb611d42565b5b6125f88b828c016121ba565b9650965050606089013567ffffffffffffffff81111561261b5761261a611d42565b5b6126278b828c016121ba565b9450945050608089013567ffffffffffffffff81111561264a57612649611d42565b5b6126568b828c01611e69565b92509250509295985092959890939650565b6000806020838503121561267f5761267e611d3d565b5b600083013567ffffffffffffffff81111561269d5761269c611d42565b5b6126a98582860161245a565b92509250509250929050565b60008060008060008060a087890312156126d2576126d1611d3d565b5b60006126e089828a01611e19565b96505060206126f189828a01611e19565b955050604061270289828a01611e45565b945050606061271389828a01611e45565b935050608087013567ffffffffffffffff81111561273457612733611d42565b5b61274089828a01611e69565b92509250509295509295509295565b600082825260208201905092915050565b7f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f6400600082015250565b6000612796601f8361274f565b91506127a182612760565b602082019050919050565b600060208201905081810360008301526127c581612789565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156128005780820151818401526020810190506127e5565b8381111561280f576000848401525b50505050565b6000612820826127cc565b61282a81856127d7565b935061283a8185602086016127e2565b80840191505092915050565b60008160601b9050919050565b600061285e82612846565b9050919050565b600061287082612853565b9050919050565b61288861288382611bf9565b612865565b82525050565b6000819050919050565b6128a96128a482611c1a565b61288e565b82525050565b60006128bb8289612815565b91506128c78288612877565b6014820191506128d78287612898565b6020820191506128e78286612877565b6014820191506128f78285612898565b6020820191506129078284612898565b602082019150819050979650505050505050565b60006020820190506129306000830184611c0b565b92915050565b600082825260208201905092915050565b600080fd5b60006129588385612936565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561298b5761298a612947565b5b60208302925061299c838584611ca6565b82840190509392505050565b60006040820190506129bd6000830186611c0b565b81810360208301526129d081848661294c565b9050949350505050565b600081905092915050565b60006129f183856129da565b93506129fe838584611ca6565b82840190509392505050565b6000612a16828a612815565b9150612a228289612877565b601482019150612a328288612898565b602082019150612a438286886129e5565b9150612a4f8285612898565b602082019150612a5f8284612898565b60208201915081905098975050505050505050565b6000612a818284866129e5565b91508190509392505050565b7f43616c6c20657865637574696f6e206661696c65640000000000000000000000600082015250565b6000612ac360158361274f565b9150612ace82612a8d565b602082019050919050565b60006020820190508181036000830152612af281612ab6565b9050919050565b6000819050919050565b612b0c81612af9565b82525050565b600060c082019050612b27600083018a611c0b565b612b346020830189611c0b565b612b416040830188612b03565b612b4e6060830187611c0b565b612b5b6080830186611c24565b81810360a0830152612b6e818486611cc6565b905098975050505050505050565b6000604082019050612b916000830185611c0b565b612b9e6020830184611c24565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612c0e82611c1a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612c4157612c40612bd4565b5b600182019050919050565b6000612c5782611c1a565b9150612c6283611c1a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c9757612c96612bd4565b5b828201905092915050565b7f4e6f7420656e6f75676820726563697069656e74730000000000000000000000600082015250565b6000612cd860158361274f565b9150612ce382612ca2565b602082019050919050565b60006020820190508181036000830152612d0781612ccb565b9050919050565b7f556e657175616c20726563697069656e747320616e642076616c756573000000600082015250565b6000612d44601d8361274f565b9150612d4f82612d0e565b602082019050919050565b60006020820190508181036000830152612d7381612d37565b9050919050565b7f546f6f206d616e7920726563697069656e74732c206d61782032353500000000600082015250565b6000612db0601c8361274f565b9150612dbb82612d7a565b602082019050919050565b60006020820190508181036000830152612ddf81612da3565b9050919050565b600081905092915050565b6000819050919050565b612e0481611bf9565b82525050565b6000612e168383612dfb565b60208301905092915050565b6000612e316020840184611e19565b905092915050565b6000602082019050919050565b6000612e528385612de6565b9350612e5d82612df1565b8060005b85811015612e9657612e738284612e22565b612e7d8882612e0a565b9750612e8883612e39565b925050600181019050612e61565b5085925050509392505050565b600081905092915050565b6000612eba8385612ea3565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115612eed57612eec612947565b5b602083029250612efe838584611ca6565b82840190509392505050565b6000612f16828a612815565b9150612f2382888a612e46565b9150612f30828688612eae565b9150612f3c8285612898565b602082019150612f4c8284612898565b60208201915081905098975050505050505050565b7f426174636820696e2073616665206d6f64650000000000000000000000000000600082015250565b6000612f9760128361274f565b9150612fa282612f61565b602082019050919050565b60006020820190508181036000830152612fc681612f8a565b9050919050565b6000606082019050612fe26000830186611c0b565b612fef6020830185611c0b565b612ffc6040830184612b03565b949350505050565b7f436f6e747261637420616c726561647920696e697469616c697a656400000000600082015250565b600061303a601c8361274f565b915061304582613004565b602082019050919050565b600060208201905081810360008301526130698161302d565b9050919050565b7f496e76616c6964206e756d626572206f66207369676e65727300000000000000600082015250565b60006130a660198361274f565b91506130b182613070565b602082019050919050565b600060208201905081810360008301526130d581613099565b9050919050565b7f496e76616c6964207369676e6572000000000000000000000000000000000000600082015250565b6000613112600e8361274f565b915061311d826130dc565b602082019050919050565b6000602082019050818103600083015261314181613105565b9050919050565b600060ff82169050919050565b600061316082613148565b915060ff82141561317457613173612bd4565b5b600182019050919050565b7f45787465726e616c207472616e7366657220696e2073616665206d6f64650000600082015250565b60006131b5601e8361274f565b91506131c08261317f565b602082019050919050565b600060208201905081810360008301526131e4816131a8565b9050919050565b7f5472616e73616374696f6e206578706972656400000000000000000000000000600082015250565b600061322160138361274f565b915061322c826131eb565b602082019050919050565b6000602082019050818103600083015261325081613214565b9050919050565b7f5369676e6572732063616e6e6f7420626520657175616c000000000000000000600082015250565b600061328d60178361274f565b915061329882613257565b602082019050919050565b600060208201905081810360008301526132bc81613280565b9050919050565b600081519050919050565b60006132d9826132c3565b6132e381856129da565b93506132f38185602086016127e2565b80840191505092915050565b600061330b82846132ce565b915081905092915050565b600081519050613325816123d3565b92915050565b60006020828403121561334157613340611d3d565b5b600061334f84828501613316565b91505092915050565b7f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260008201527f616e73666572206661696c656400000000000000000000000000000000000000602082015250565b60006133b4602d8361274f565b91506133bf82613358565b604082019050919050565b600060208201905081810360008301526133e3816133a7565b9050919050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b600061342060128361274f565b915061342b826133ea565b602082019050919050565b6000602082019050818103600083015261344f81613413565b9050919050565b60006134636000836129da565b915061346e82611c44565b600082019050919050565b600061348482613456565b9150819050919050565b7f43616c6c206661696c6564000000000000000000000000000000000000000000600082015250565b60006134c4600b8361274f565b91506134cf8261348e565b602082019050919050565b600060208201905081810360008301526134f3816134b7565b9050919050565b600060608201905061350f6000830186611c0b565b61351c6020830185611c0b565b6135296040830184611c24565b949350505050565b7f496e76616c6964207369676e6174757265202d2077726f6e67206c656e677468600082015250565b600061356760208361274f565b915061357282613531565b602082019050919050565b600060208201905081810360008301526135968161355a565b9050919050565b60006135a882613148565b91506135b383613148565b92508260ff038211156135c9576135c8612bd4565b5b828201905092915050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061363060228361274f565b915061363b826135d4565b604082019050919050565b6000602082019050818103600083015261365f81613623565b9050919050565b61366f81613148565b82525050565b600060808201905061368a6000830187612b03565b6136976020830186613666565b6136a46040830185612b03565b6136b16060830184612b03565b95945050505050565b7f53657175656e636520494420616c726561647920757365640000000000000000600082015250565b60006136f060188361274f565b91506136fb826136ba565b602082019050919050565b6000602082019050818103600083015261371f816136e3565b9050919050565b7f53657175656e63652049442062656c6f772077696e646f770000000000000000600082015250565b600061375c60188361274f565b915061376782613726565b602082019050919050565b6000602082019050818103600083015261378b8161374f565b9050919050565b7f53657175656e63652049442061626f7665206d6178696d756d00000000000000600082015250565b60006137c860198361274f565b91506137d382613792565b602082019050919050565b600060208201905081810360008301526137f7816137bb565b905091905056fea2646970667358221220178603fdb348c356f71796769d40c84f783182ebdc2185f66f6cef39bb6b4c9464736f6c634300080a0033
Deployed Bytecode
0x6080604052600436106101235760003560e01c806392467776116100a0578063c137878411610064578063c137878414610488578063c6044c46146104b1578063e6bd0aa4146104da578063f23a6e6114610503578063fc0f392d146105405761016d565b806392467776146103a3578063a0b7967b146103cc578063abe3219c146103f7578063ad3ad70914610422578063bc197c811461044b5761016d565b806334f94047116100e757806334f94047146102ae57806339125215146102d75780635a953d0a14610300578063736c0d5b146103295780637df73e27146103665761016d565b806301ffc9a7146101b75780630dcd7a6c146101f4578063150b7a021461021d578063158ef93e1461025a5780632da03409146102855761016d565b3661016d57600034111561016b577f6e89d517057028190560dd200cf6bf792842861353d1173761dfa362e1c133f03334604051610162929190611c6a565b60405180910390a15b005b60003411156101b5577f6e89d517057028190560dd200cf6bf792842861353d1173761dfa362e1c133f033346000366040516101ac9493929190611cf3565b60405180910390a15b005b3480156101c357600080fd5b506101de60048036038101906101d99190611d9f565b610557565b6040516101eb9190611de7565b60405180910390f35b34801561020057600080fd5b5061021b60048036038101906102169190611ebf565b6105d1565b005b34801561022957600080fd5b50610244600480360381019061023f919061208f565b610679565b6040516102519190612121565b60405180910390f35b34801561026657600080fd5b5061026f61068d565b60405161027c9190611de7565b60405180910390f35b34801561029157600080fd5b506102ac60048036038101906102a7919061217a565b61069e565b005b3480156102ba57600080fd5b506102d560048036038101906102d09190612210565b61075b565b005b3480156102e357600080fd5b506102fe60048036038101906102f99190612284565b61081e565b005b34801561030c57600080fd5b5061032760048036038101906103229190612353565b6109b6565b005b34801561033557600080fd5b50610350600480360381019061034b91906123a6565b610a76565b60405161035d9190611de7565b60405180910390f35b34801561037257600080fd5b5061038d600480360381019061038891906123a6565b610a96565b60405161039a9190611de7565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c591906123ff565b610aeb565b005b3480156103d857600080fd5b506103e1610ba8565b6040516103ee919061243f565b60405180910390f35b34801561040357600080fd5b5061040c610c18565b6040516104199190611de7565b60405180910390f35b34801561042e57600080fd5b50610449600480360381019061044491906124b0565b610c2b565b005b34801561045757600080fd5b50610472600480360381019061046d919061258c565b610e3d565b60405161047f9190612121565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa91906123ff565b610e55565b005b3480156104bd57600080fd5b506104d860048036038101906104d39190612668565b610f12565b005b3480156104e657600080fd5b5061050160048036038101906104fc9190612353565b611104565b005b34801561050f57600080fd5b5061052a600480360381019061052591906126b5565b6111c4565b6040516105379190612121565b60405180910390f35b34801561054c57600080fd5b506105556111da565b005b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105ca57506105c982611275565b5b9050919050565b6105da33610a96565b610619576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610610906127ac565b60405180910390fd5b60006106236112df565b888888888860405160200161063d969594939291906128af565b60405160208183030381529060405280519060200120905061066388828585898961131c565b5061066f8689896114e0565b5050505050505050565b600063150b7a0260e01b9050949350505050565b60018054906101000a900460ff1681565b6106a733610a96565b6106e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106dd906127ac565b60405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff16633ef13367836040518263ffffffff1660e01b8152600401610724919061291b565b600060405180830381600087803b15801561073e57600080fd5b505af1158015610752573d6000803e3d6000fd5b50505050505050565b61076433610a96565b6107a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079a906127ac565b60405180910390fd5b60008490508073ffffffffffffffffffffffffffffffffffffffff1663c6a2dd248585856040518463ffffffff1660e01b81526004016107e5939291906129a8565b600060405180830381600087803b1580156107ff57600080fd5b505af1158015610813573d6000803e3d6000fd5b505050505050505050565b61082733610a96565b610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085d906127ac565b60405180910390fd5b6000610870611616565b89898989898960405160200161088c9796959493929190612a0a565b60405160208183030381529060405280519060200120905060006108b48a8386868a8a61131c565b905060008a73ffffffffffffffffffffffffffffffffffffffff168a8a8a6040516108e0929190612a74565b60006040518083038185875af1925050503d806000811461091d576040519150601f19603f3d011682016040523d82523d6000602084013e610922565b606091505b5050905080610966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095d90612ad9565b60405180910390fd5b7f59bed9ab5d78073465dd642a9e3e76dfdb7d53bcae9d09df7d0b8f5234d5a8063383858e8e8e8e6040516109a19796959493929190612b12565b60405180910390a15050505050505050505050565b6109bf33610a96565b6109fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f5906127ac565b60405180910390fd5b60008390508073ffffffffffffffffffffffffffffffffffffffff1663159e44d784846040518363ffffffff1660e01b8152600401610a3e929190612b7c565b600060405180830381600087803b158015610a5857600080fd5b505af1158015610a6c573d6000803e3d6000fd5b5050505050505050565b60006020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610af433610a96565b610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a906127ac565b60405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff16638acc01be836040518263ffffffff1660e01b8152600401610b719190611de7565b600060405180830381600087803b158015610b8b57600080fd5b505af1158015610b9f573d6000803e3d6000fd5b50505050505050565b6000806000905060005b600a811015610c045781600282600a8110610bd057610bcf612ba5565b5b01541115610bf157600281600a8110610bec57610beb612ba5565b5b015491505b8080610bfc90612c03565b915050610bb2565b50600181610c129190612c4c565b91505090565b600160009054906101000a900460ff1681565b610c3433610a96565b610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a906127ac565b60405180910390fd5b6000888890501415610cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb190612cee565b60405180910390fd5b858590508888905014610d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf990612d5a565b60405180910390fd5b6101008888905010610d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4090612dc6565b60405180910390fd5b6000610d53611653565b898989898989604051602001610d6f9796959493929190612f0a565b604051602081830303815290604052805190602001209050600160009054906101000a900460ff1615610dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dce90612fad565b60405180910390fd5b6000610de860008386868a8a61131c565b9050610df68a8a8a8a611690565b7fe4c9047a729726b729cf4fa62c95ef9a434bbaf206a7ea0c7c77515db1584022338284604051610e2993929190612fcd565b60405180910390a150505050505050505050565b600063bc197c8160e01b905098975050505050505050565b610e5e33610a96565b610e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e94906127ac565b60405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff1663c59f9f19836040518263ffffffff1660e01b8152600401610edb9190611de7565b600060405180830381600087803b158015610ef557600080fd5b505af1158015610f09573d6000803e3d6000fd5b50505050505050565b60018054906101000a900460ff1615610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5790613050565b60405180910390fd5b60038282905014610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d906130bc565b60405180910390fd5b60005b828290508160ff1610156110e557600073ffffffffffffffffffffffffffffffffffffffff1683838360ff16818110610fe557610fe4612ba5565b5b9050602002016020810190610ffa91906123a6565b73ffffffffffffffffffffffffffffffffffffffff161415611051576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104890613128565b60405180910390fd5b600160008085858560ff1681811061106c5761106b612ba5565b5b905060200201602081019061108191906123a6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806110dd90613155565b915050610fa9565b5060018060016101000a81548160ff0219169083151502179055505050565b61110d33610a96565b61114c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611143906127ac565b60405180910390fd5b60008390508073ffffffffffffffffffffffffffffffffffffffff16638972c17c84846040518363ffffffff1660e01b815260040161118c929190612b7c565b600060405180830381600087803b1580156111a657600080fd5b505af11580156111ba573d6000803e3d6000fd5b5050505050505050565b600063f23a6e6160e01b90509695505050505050565b6111e333610a96565b611222576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611219906127ac565b60405180910390fd5b60018060006101000a81548160ff0219169083151502179055507f0909e8f76a4fd3e970f2eaef56c0ee6dfaf8b87c5b8d3f56ffce78e825a911573360405161126b919061291b565b60405180910390a1565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606040518060400160405280600581526020017f4552433230000000000000000000000000000000000000000000000000000000815250905090565b60008061136d8787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061187c565b9050600160009054906101000a900460ff161580611390575061138f88610a96565b5b6113cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c6906131cb565b60405180910390fd5b42841015611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140990613237565b60405180910390fd5b61141b836119bb565b61142481610a96565b611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90613128565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c9906132a3565b60405180910390fd5b809150509695505050505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401611512929190612b7c565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161156091906132ff565b6000604051808303816000865af19150503d806000811461159d576040519150601f19603f3d011682016040523d82523d6000602084013e6115a2565b606091505b50915091508180156115d057506000815114806115cf5750808060200190518101906115ce919061332b565b5b5b61160f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611606906133ca565b60405180910390fd5b5050505050565b60606040518060400160405280600581526020017f4554484552000000000000000000000000000000000000000000000000000000815250905090565b60606040518060400160405280600b81526020017f45544845522d4261746368000000000000000000000000000000000000000000815250905090565b60005b84849050811015611875578282828181106116b1576116b0612ba5565b5b905060200201354710156116fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f190613436565b60405180910390fd5b600085858381811061170f5761170e612ba5565b5b905060200201602081019061172491906123a6565b73ffffffffffffffffffffffffffffffffffffffff1684848481811061174d5761174c612ba5565b5b9050602002013560405161176090613479565b60006040518083038185875af1925050503d806000811461179d576040519150601f19603f3d011682016040523d82523d6000602084013e6117a2565b606091505b50509050806117e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117dd906134da565b60405180910390fd5b7fc42fa155158786a1dd6ccc3a785f35845467353c3cc700e0e31a79f90e22227d3387878581811061181b5761181a612ba5565b5b905060200201602081019061183091906123a6565b86868681811061184357611842612ba5565b5b90506020020135604051611859939291906134fa565b60405180910390a150808061186d90612c03565b915050611693565b5050505050565b600060418251146118c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b99061357d565b60405180910390fd5b6000806000602085015192506040850151915060ff6041860151169050601b8160ff1610156118fb57601b816118f8919061359d565b90505b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115611961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195890613646565b60405180910390fd5b600186828585604051600081526020016040526040516119849493929190613675565b6020604051602081039080840390855afa1580156119a6573d6000803e3d6000fd5b50505060206040510351935050505092915050565b6119c433610a96565b611a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fa906127ac565b60405180910390fd5b6000806002600a806020026040519081016040528092919082600a8015611a3f576020028201915b815481526020019060010190808311611a2b575b5050505050905060005b600a811015611af957838282600a8110611a6657611a65612ba5565b5b60200201511415611aac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa390613706565b60405180910390fd5b8183600a8110611abf57611abe612ba5565b5b60200201518282600a8110611ad757611ad6612ba5565b5b60200201511015611ae6578092505b8080611af190612c03565b915050611a49565b508082600a8110611b0d57611b0c612ba5565b5b60200201518311611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a90613772565b60405180910390fd5b6127108183600a8110611b6957611b68612ba5565b5b6020020151611b789190612c4c565b831115611bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb1906137de565b60405180910390fd5b82600283600a8110611bcf57611bce612ba5565b5b0181905550505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611c0482611bd9565b9050919050565b611c1481611bf9565b82525050565b6000819050919050565b611c2d81611c1a565b82525050565b600082825260208201905092915050565b50565b6000611c54600083611c33565b9150611c5f82611c44565b600082019050919050565b6000606082019050611c7f6000830185611c0b565b611c8c6020830184611c24565b8181036040830152611c9d81611c47565b90509392505050565b82818337600083830152505050565b6000601f19601f8301169050919050565b6000611cd28385611c33565b9350611cdf838584611ca6565b611ce883611cb5565b840190509392505050565b6000606082019050611d086000830187611c0b565b611d156020830186611c24565b8181036040830152611d28818486611cc6565b905095945050505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d7c81611d47565b8114611d8757600080fd5b50565b600081359050611d9981611d73565b92915050565b600060208284031215611db557611db4611d3d565b5b6000611dc384828501611d8a565b91505092915050565b60008115159050919050565b611de181611dcc565b82525050565b6000602082019050611dfc6000830184611dd8565b92915050565b611e0b81611bf9565b8114611e1657600080fd5b50565b600081359050611e2881611e02565b92915050565b611e3781611c1a565b8114611e4257600080fd5b50565b600081359050611e5481611e2e565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611e7f57611e7e611e5a565b5b8235905067ffffffffffffffff811115611e9c57611e9b611e5f565b5b602083019150836001820283011115611eb857611eb7611e64565b5b9250929050565b600080600080600080600060c0888a031215611ede57611edd611d3d565b5b6000611eec8a828b01611e19565b9750506020611efd8a828b01611e45565b9650506040611f0e8a828b01611e19565b9550506060611f1f8a828b01611e45565b9450506080611f308a828b01611e45565b93505060a088013567ffffffffffffffff811115611f5157611f50611d42565b5b611f5d8a828b01611e69565b925092505092959891949750929550565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611fab82611cb5565b810181811067ffffffffffffffff82111715611fca57611fc9611f73565b5b80604052505050565b6000611fdd611d33565b9050611fe98282611fa2565b919050565b600067ffffffffffffffff82111561200957612008611f73565b5b61201282611cb5565b9050602081019050919050565b600061203261202d84611fee565b611fd3565b90508281526020810184848401111561204e5761204d611f6e565b5b612059848285611ca6565b509392505050565b600082601f83011261207657612075611e5a565b5b813561208684826020860161201f565b91505092915050565b600080600080608085870312156120a9576120a8611d3d565b5b60006120b787828801611e19565b94505060206120c887828801611e19565b93505060406120d987828801611e45565b925050606085013567ffffffffffffffff8111156120fa576120f9611d42565b5b61210687828801612061565b91505092959194509250565b61211b81611d47565b82525050565b60006020820190506121366000830184612112565b92915050565b600061214782611bd9565b9050919050565b6121578161213c565b811461216257600080fd5b50565b6000813590506121748161214e565b92915050565b6000806040838503121561219157612190611d3d565b5b600061219f85828601612165565b92505060206121b085828601611e19565b9150509250929050565b60008083601f8401126121d0576121cf611e5a565b5b8235905067ffffffffffffffff8111156121ed576121ec611e5f565b5b60208301915083602082028301111561220957612208611e64565b5b9250929050565b6000806000806060858703121561222a57612229611d3d565b5b600061223887828801612165565b945050602061224987828801611e19565b935050604085013567ffffffffffffffff81111561226a57612269611d42565b5b612276878288016121ba565b925092505092959194509250565b60008060008060008060008060c0898b0312156122a4576122a3611d3d565b5b60006122b28b828c01611e19565b98505060206122c38b828c01611e45565b975050604089013567ffffffffffffffff8111156122e4576122e3611d42565b5b6122f08b828c01611e69565b965096505060606123038b828c01611e45565b94505060806123148b828c01611e45565b93505060a089013567ffffffffffffffff81111561233557612334611d42565b5b6123418b828c01611e69565b92509250509295985092959890939650565b60008060006060848603121561236c5761236b611d3d565b5b600061237a86828701612165565b935050602061238b86828701611e19565b925050604061239c86828701611e45565b9150509250925092565b6000602082840312156123bc576123bb611d3d565b5b60006123ca84828501611e19565b91505092915050565b6123dc81611dcc565b81146123e757600080fd5b50565b6000813590506123f9816123d3565b92915050565b6000806040838503121561241657612415611d3d565b5b600061242485828601611e19565b9250506020612435858286016123ea565b9150509250929050565b60006020820190506124546000830184611c24565b92915050565b60008083601f8401126124705761246f611e5a565b5b8235905067ffffffffffffffff81111561248d5761248c611e5f565b5b6020830191508360208202830111156124a9576124a8611e64565b5b9250929050565b60008060008060008060008060a0898b0312156124d0576124cf611d3d565b5b600089013567ffffffffffffffff8111156124ee576124ed611d42565b5b6124fa8b828c0161245a565b9850985050602089013567ffffffffffffffff81111561251d5761251c611d42565b5b6125298b828c016121ba565b9650965050604061253c8b828c01611e45565b945050606061254d8b828c01611e45565b935050608089013567ffffffffffffffff81111561256e5761256d611d42565b5b61257a8b828c01611e69565b92509250509295985092959890939650565b60008060008060008060008060a0898b0312156125ac576125ab611d3d565b5b60006125ba8b828c01611e19565b98505060206125cb8b828c01611e19565b975050604089013567ffffffffffffffff8111156125ec576125eb611d42565b5b6125f88b828c016121ba565b9650965050606089013567ffffffffffffffff81111561261b5761261a611d42565b5b6126278b828c016121ba565b9450945050608089013567ffffffffffffffff81111561264a57612649611d42565b5b6126568b828c01611e69565b92509250509295985092959890939650565b6000806020838503121561267f5761267e611d3d565b5b600083013567ffffffffffffffff81111561269d5761269c611d42565b5b6126a98582860161245a565b92509250509250929050565b60008060008060008060a087890312156126d2576126d1611d3d565b5b60006126e089828a01611e19565b96505060206126f189828a01611e19565b955050604061270289828a01611e45565b945050606061271389828a01611e45565b935050608087013567ffffffffffffffff81111561273457612733611d42565b5b61274089828a01611e69565b92509250509295509295509295565b600082825260208201905092915050565b7f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f6400600082015250565b6000612796601f8361274f565b91506127a182612760565b602082019050919050565b600060208201905081810360008301526127c581612789565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156128005780820151818401526020810190506127e5565b8381111561280f576000848401525b50505050565b6000612820826127cc565b61282a81856127d7565b935061283a8185602086016127e2565b80840191505092915050565b60008160601b9050919050565b600061285e82612846565b9050919050565b600061287082612853565b9050919050565b61288861288382611bf9565b612865565b82525050565b6000819050919050565b6128a96128a482611c1a565b61288e565b82525050565b60006128bb8289612815565b91506128c78288612877565b6014820191506128d78287612898565b6020820191506128e78286612877565b6014820191506128f78285612898565b6020820191506129078284612898565b602082019150819050979650505050505050565b60006020820190506129306000830184611c0b565b92915050565b600082825260208201905092915050565b600080fd5b60006129588385612936565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561298b5761298a612947565b5b60208302925061299c838584611ca6565b82840190509392505050565b60006040820190506129bd6000830186611c0b565b81810360208301526129d081848661294c565b9050949350505050565b600081905092915050565b60006129f183856129da565b93506129fe838584611ca6565b82840190509392505050565b6000612a16828a612815565b9150612a228289612877565b601482019150612a328288612898565b602082019150612a438286886129e5565b9150612a4f8285612898565b602082019150612a5f8284612898565b60208201915081905098975050505050505050565b6000612a818284866129e5565b91508190509392505050565b7f43616c6c20657865637574696f6e206661696c65640000000000000000000000600082015250565b6000612ac360158361274f565b9150612ace82612a8d565b602082019050919050565b60006020820190508181036000830152612af281612ab6565b9050919050565b6000819050919050565b612b0c81612af9565b82525050565b600060c082019050612b27600083018a611c0b565b612b346020830189611c0b565b612b416040830188612b03565b612b4e6060830187611c0b565b612b5b6080830186611c24565b81810360a0830152612b6e818486611cc6565b905098975050505050505050565b6000604082019050612b916000830185611c0b565b612b9e6020830184611c24565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612c0e82611c1a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612c4157612c40612bd4565b5b600182019050919050565b6000612c5782611c1a565b9150612c6283611c1a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c9757612c96612bd4565b5b828201905092915050565b7f4e6f7420656e6f75676820726563697069656e74730000000000000000000000600082015250565b6000612cd860158361274f565b9150612ce382612ca2565b602082019050919050565b60006020820190508181036000830152612d0781612ccb565b9050919050565b7f556e657175616c20726563697069656e747320616e642076616c756573000000600082015250565b6000612d44601d8361274f565b9150612d4f82612d0e565b602082019050919050565b60006020820190508181036000830152612d7381612d37565b9050919050565b7f546f6f206d616e7920726563697069656e74732c206d61782032353500000000600082015250565b6000612db0601c8361274f565b9150612dbb82612d7a565b602082019050919050565b60006020820190508181036000830152612ddf81612da3565b9050919050565b600081905092915050565b6000819050919050565b612e0481611bf9565b82525050565b6000612e168383612dfb565b60208301905092915050565b6000612e316020840184611e19565b905092915050565b6000602082019050919050565b6000612e528385612de6565b9350612e5d82612df1565b8060005b85811015612e9657612e738284612e22565b612e7d8882612e0a565b9750612e8883612e39565b925050600181019050612e61565b5085925050509392505050565b600081905092915050565b6000612eba8385612ea3565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115612eed57612eec612947565b5b602083029250612efe838584611ca6565b82840190509392505050565b6000612f16828a612815565b9150612f2382888a612e46565b9150612f30828688612eae565b9150612f3c8285612898565b602082019150612f4c8284612898565b60208201915081905098975050505050505050565b7f426174636820696e2073616665206d6f64650000000000000000000000000000600082015250565b6000612f9760128361274f565b9150612fa282612f61565b602082019050919050565b60006020820190508181036000830152612fc681612f8a565b9050919050565b6000606082019050612fe26000830186611c0b565b612fef6020830185611c0b565b612ffc6040830184612b03565b949350505050565b7f436f6e747261637420616c726561647920696e697469616c697a656400000000600082015250565b600061303a601c8361274f565b915061304582613004565b602082019050919050565b600060208201905081810360008301526130698161302d565b9050919050565b7f496e76616c6964206e756d626572206f66207369676e65727300000000000000600082015250565b60006130a660198361274f565b91506130b182613070565b602082019050919050565b600060208201905081810360008301526130d581613099565b9050919050565b7f496e76616c6964207369676e6572000000000000000000000000000000000000600082015250565b6000613112600e8361274f565b915061311d826130dc565b602082019050919050565b6000602082019050818103600083015261314181613105565b9050919050565b600060ff82169050919050565b600061316082613148565b915060ff82141561317457613173612bd4565b5b600182019050919050565b7f45787465726e616c207472616e7366657220696e2073616665206d6f64650000600082015250565b60006131b5601e8361274f565b91506131c08261317f565b602082019050919050565b600060208201905081810360008301526131e4816131a8565b9050919050565b7f5472616e73616374696f6e206578706972656400000000000000000000000000600082015250565b600061322160138361274f565b915061322c826131eb565b602082019050919050565b6000602082019050818103600083015261325081613214565b9050919050565b7f5369676e6572732063616e6e6f7420626520657175616c000000000000000000600082015250565b600061328d60178361274f565b915061329882613257565b602082019050919050565b600060208201905081810360008301526132bc81613280565b9050919050565b600081519050919050565b60006132d9826132c3565b6132e381856129da565b93506132f38185602086016127e2565b80840191505092915050565b600061330b82846132ce565b915081905092915050565b600081519050613325816123d3565b92915050565b60006020828403121561334157613340611d3d565b5b600061334f84828501613316565b91505092915050565b7f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260008201527f616e73666572206661696c656400000000000000000000000000000000000000602082015250565b60006133b4602d8361274f565b91506133bf82613358565b604082019050919050565b600060208201905081810360008301526133e3816133a7565b9050919050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b600061342060128361274f565b915061342b826133ea565b602082019050919050565b6000602082019050818103600083015261344f81613413565b9050919050565b60006134636000836129da565b915061346e82611c44565b600082019050919050565b600061348482613456565b9150819050919050565b7f43616c6c206661696c6564000000000000000000000000000000000000000000600082015250565b60006134c4600b8361274f565b91506134cf8261348e565b602082019050919050565b600060208201905081810360008301526134f3816134b7565b9050919050565b600060608201905061350f6000830186611c0b565b61351c6020830185611c0b565b6135296040830184611c24565b949350505050565b7f496e76616c6964207369676e6174757265202d2077726f6e67206c656e677468600082015250565b600061356760208361274f565b915061357282613531565b602082019050919050565b600060208201905081810360008301526135968161355a565b9050919050565b60006135a882613148565b91506135b383613148565b92508260ff038211156135c9576135c8612bd4565b5b828201905092915050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061363060228361274f565b915061363b826135d4565b604082019050919050565b6000602082019050818103600083015261365f81613623565b9050919050565b61366f81613148565b82525050565b600060808201905061368a6000830187612b03565b6136976020830186613666565b6136a46040830185612b03565b6136b16060830184612b03565b95945050505050565b7f53657175656e636520494420616c726561647920757365640000000000000000600082015250565b60006136f060188361274f565b91506136fb826136ba565b602082019050919050565b6000602082019050818103600083015261371f816136e3565b9050919050565b7f53657175656e63652049442062656c6f772077696e646f770000000000000000600082015250565b600061375c60188361274f565b915061376782613726565b602082019050919050565b6000602082019050818103600083015261378b8161374f565b9050919050565b7f53657175656e63652049442061626f7665206d6178696d756d00000000000000600082015250565b60006137c860198361274f565b91506137d382613792565b602082019050919050565b600060208201905081810360008301526137f7816137bb565b905091905056fea2646970667358221220178603fdb348c356f71796769d40c84f783182ebdc2185f66f6cef39bb6b4c9464736f6c634300080a0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $1,645.87 | 0.00215146 | $3.54 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.