Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Init | 16196988 | 756 days ago | IN | 0 ETH | 0.0017517 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
WalletSimple
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.5; import './TransferHelper.sol'; import './Forwarder.sol'; import './ERC20Interface.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 { // 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 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 Deposited(msg.sender, msg.value, msg.data); } } /** * 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 { Forwarder forwarder = Forwarder(forwarderAddress); forwarder.flushTokens(tokenContractAddress); } /** * 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; } /** * Irrevocably puts contract into safe mode. When in this mode, transactions may only be sent to signing addresses. */ function activateSafeMode() external onlySigner { safeMode = true; 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() public 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: UNLICENSED pragma solidity 0.7.5; /** * 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); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.5; import './TransferHelper.sol'; import './ERC20Interface.sol'; /** * Contract that will forward any incoming Ether to the creator of the contract * */ contract Forwarder { // Address to which any funds sent to this contract will be forwarded address public parentAddress; event ForwarderDeposited(address from, uint256 value, bytes data); /** * Initialize the contract, and sets the destination address to that of the creator */ function init(address _parentAddress) external onlyUninitialized { parentAddress = _parentAddress; uint256 value = address(this).balance; if (value == 0) { return; } (bool success, ) = parentAddress.call{ value: value }(''); require(success, 'Flush failed'); // NOTE: since we are forwarding on initialization, // we don't have the context of the original sender. // We still emit an event about the forwarding but set // the sender to the forwarder itself emit ForwarderDeposited(address(this), value, msg.data); } /** * Modifier that will execute internal code block only if the sender is the parent address */ modifier onlyParent { require(msg.sender == parentAddress, 'Only Parent'); _; } /** * Modifier that will execute internal code block only if the contract has not been initialized yet */ modifier onlyUninitialized { require(parentAddress == address(0x0), 'Already initialized'); _; } /** * Default function; Gets called when data is sent but does not match any other function */ fallback() external payable { flush(); } /** * Default function; Gets called when Ether is deposited with no data, and forwards it to the parent address */ receive() external payable { flush(); } /** * 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 onlyParent { ERC20Interface instance = ERC20Interface(tokenContractAddress); address forwarderAddress = address(this); uint256 forwarderBalance = instance.balanceOf(forwarderAddress); if (forwarderBalance == 0) { return; } TransferHelper.safeTransfer( tokenContractAddress, parentAddress, forwarderBalance ); } /** * Flush the entire balance of the contract to the parent address. */ function flush() public { uint256 value = address(this).balance; if (value == 0) { return; } (bool success, ) = parentAddress.call{ value: value }(''); require(success, 'Flush failed'); emit ForwarderDeposited(msg.sender, value, msg.data); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity >=0.7.5; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeApprove: approve failed' ); } 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 data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::transferFrom: transferFrom failed' ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'TransferHelper::safeTransferETH: ETH transfer failed'); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}],"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":[],"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":"","type":"address"}],"name":"signers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526000600160006101000a81548160ff02191690831515021790555060006001806101000a81548160ff02191690831515021790555034801561004557600080fd5b5061218d806100556000396000f3fe6080604052600436106100a05760003560e01c80637df73e27116100645780637df73e27146104d3578063a0b7967b1461053a578063abe3219c14610565578063ad3ad70914610592578063c6044c46146106d6578063fc0f392d1461075c5761013b565b80630dcd7a6c146101d1578063158ef93e146102b55780632da03409146102e25780633912521514610353578063736c0d5b1461046c5761013b565b3661013b576000341115610139577f6e89d517057028190560dd200cf6bf792842861353d1173761dfa362e1c133f03334600036604051808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509550505050505060405180910390a15b005b60003411156101cf577f6e89d517057028190560dd200cf6bf792842861353d1173761dfa362e1c133f03334600036604051808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509550505050505060405180910390a15b005b3480156101dd57600080fd5b506102b3600480360360c08110156101f457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561026f57600080fd5b82018360208201111561028157600080fd5b803590602001918460018302840111640100000000831117156102a357600080fd5b9091929391929390505050610773565b005b3480156102c157600080fd5b506102ca6108e9565b60405180821515815260200191505060405180910390f35b3480156102ee57600080fd5b506103516004803603604081101561030557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108fa565b005b34801561035f57600080fd5b5061046a600480360360c081101561037657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156103bd57600080fd5b8201836020820111156103cf57600080fd5b803590602001918460018302840111640100000000831117156103f157600080fd5b909192939192939080359060200190929190803590602001909291908035906020019064010000000081111561042657600080fd5b82018360208201111561043857600080fd5b8035906020019184600183028401116401000000008311171561045a57600080fd5b9091929391929390505050610a00565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d18565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d38565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f610d8d565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b5061057a610de0565b60405180821515815260200191505060405180910390f35b34801561059e57600080fd5b506106d4600480360360a08110156105b557600080fd5b81019080803590602001906401000000008111156105d257600080fd5b8201836020820111156105e457600080fd5b8035906020019184602083028401116401000000008311171561060657600080fd5b90919293919293908035906020019064010000000081111561062757600080fd5b82018360208201111561063957600080fd5b8035906020019184602083028401116401000000008311171561065b57600080fd5b909192939192939080359060200190929190803590602001909291908035906020019064010000000081111561069057600080fd5b8201836020820111156106a257600080fd5b803590602001918460018302840111640100000000831117156106c457600080fd5b9091929391929390505050610df3565b005b3480156106e257600080fd5b5061075a600480360360208110156106f957600080fd5b810190808035906020019064010000000081111561071657600080fd5b82018360208201111561072857600080fd5b8035906020019184602083028401116401000000008311171561074a57600080fd5b90919293919293905050506111b3565b005b34801561076857600080fd5b5061077161143a565b005b61077c33610d38565b6107ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b60006107f861151e565b88888888886040516020018087805190602001908083835b602083106108335780518252602082019150602081019050602083039250610810565b6001836020036101000a0380198251168184511680821785525050505050509050018673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1660601b815260140183815260200182815260200196505050505050506040516020818303038152906040528051906020012090506108d388828585898961155b565b506108df8689896117eb565b5050505050505050565b60018054906101000a900460ff1681565b61090333610d38565b610975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff16633ef13367836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156109e357600080fd5b505af11580156109f7573d6000803e3d6000fd5b50505050505050565b610a0933610d38565b610a7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b6000610a856119b1565b8989898989896040516020018088805190602001908083835b60208310610ac15780518252602082019150602081019050602083039250610a9e565b6001836020036101000a0380198251168184511680821785525050505050509050018773ffffffffffffffffffffffffffffffffffffffff1660601b8152601401868152602001858580828437808301925050508381526020018281526020019750505050505050506040516020818303038152906040528051906020012090506000610b528a8386868a8a61155b565b905060008a73ffffffffffffffffffffffffffffffffffffffff168a8a8a60405180838380828437808301925050509250505060006040518083038185875af1925050503d8060008114610bc2576040519150601f19603f3d011682016040523d82523d6000602084013e610bc7565b606091505b5050905080610c3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f43616c6c20657865637574696f6e206661696c6564000000000000000000000081525060200191505060405180910390fd5b7f59bed9ab5d78073465dd642a9e3e76dfdb7d53bcae9d09df7d0b8f5234d5a8063383858e8e8e8e604051808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509850505050505050505060405180910390a15050505050505050505050565b60006020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000806000905060005b600a811015610dd55781600282600a8110610dae57fe5b01541115610dc857600281600a8110610dc357fe5b015491505b8080600101915050610d97565b506001810191505090565b600160009054906101000a900460ff1681565b610dfc33610d38565b610e6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b6000888890501415610ee8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f7420656e6f75676820726563697069656e7473000000000000000000000081525060200191505060405180910390fd5b858590508888905014610f63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f556e657175616c20726563697069656e747320616e642076616c75657300000081525060200191505060405180910390fd5b6101008888905010610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546f6f206d616e7920726563697069656e74732c206d6178203235350000000081525060200191505060405180910390fd5b6000610fe76119ee565b8989898989896040516020018088805190602001908083835b602083106110235780518252602082019150602081019050602083039250611000565b6001836020036101000a0380198251168184511680821785525050505050509050018787602002808284378083019250505085856020028082843780830192505050838152602001828152602001975050505050505050604051602081830303815290604052805190602001209050600160009054906101000a900460ff1615611115576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f426174636820696e2073616665206d6f6465000000000000000000000000000081525060200191505060405180910390fd5b600061112660008386868a8a61155b565b90506111348a8a8a8a611a2b565b7fe4c9047a729726b729cf4fa62c95ef9a434bbaf206a7ea0c7c77515db1584022338284604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a150505050505050505050565b60018054906101000a900460ff1615611234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f436f6e747261637420616c726561647920696e697469616c697a65640000000081525060200191505060405180910390fd5b600382829050146112ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f496e76616c6964206e756d626572206f66207369676e6572730000000000000081525060200191505060405180910390fd5b60005b828290508160ff16101561141b57600073ffffffffffffffffffffffffffffffffffffffff1683838360ff168181106112e557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561138c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c6964207369676e657200000000000000000000000000000000000081525060200191505060405180910390fd5b600160008085858560ff168181106113a057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806001019150506112b0565b5060018060016101000a81548160ff0219169083151502179055505050565b61144333610d38565b6114b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b60018060006101000a81548160ff0219169083151502179055507f0909e8f76a4fd3e970f2eaef56c0ee6dfaf8b87c5b8d3f56ffce78e825a9115733604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b60606040518060400160405280600581526020017f4552433230000000000000000000000000000000000000000000000000000000815250905090565b6000806115ac8787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611c99565b9050600160009054906101000a900460ff1615806115cf57506115ce88610d38565b5b611641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f45787465726e616c207472616e7366657220696e2073616665206d6f6465000081525060200191505060405180910390fd5b428410156116b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5472616e73616374696f6e20657870697265640000000000000000000000000081525060200191505060405180910390fd5b6116c083611e2d565b6116c981610d38565b61173b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c6964207369676e657200000000000000000000000000000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f5369676e6572732063616e6e6f7420626520657175616c00000000000000000081525060200191505060405180910390fd5b809150509695505050505050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106118ae578051825260208201915060208101905060208303925061188b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611910576040519150601f19603f3d011682016040523d82523d6000602084013e611915565b606091505b50915091508180156119555750600081511480611954575080806020019051602081101561194257600080fd5b81019080805190602001909291905050505b5b6119aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061212b602d913960400191505060405180910390fd5b5050505050565b60606040518060400160405280600581526020017f4554484552000000000000000000000000000000000000000000000000000000815250905090565b60606040518060400160405280600b81526020017f45544845522d4261746368000000000000000000000000000000000000000000815250905090565b60005b84849050811015611c9257828282818110611a4557fe5b90506020020135471015611ac1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f496e73756666696369656e742066756e6473000000000000000000000000000081525060200191505060405180910390fd5b6000858583818110611acf57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16848484818110611b0e57fe5b9050602002013560405180600001905060006040518083038185875af1925050503d8060008114611b5b576040519150601f19603f3d011682016040523d82523d6000602084013e611b60565b606091505b5050905080611bd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f43616c6c206661696c656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b7fc42fa155158786a1dd6ccc3a785f35845467353c3cc700e0e31a79f90e22227d33878785818110611c0557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16868686818110611c2e57fe5b90506020020135604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1508080600101915050611a2e565b5050505050565b60006041825114611d12576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f496e76616c6964207369676e6174757265202d2077726f6e67206c656e67746881525060200191505060405180910390fd5b6000806000602085015192506040850151915060ff6041860151169050601b8160ff161015611d4257601b810190505b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115611dbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806121096022913960400191505060405180910390fd5b60018682858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611e18573d6000803e3d6000fd5b50505060206040510351935050505092915050565b611e3633610d38565b611ea8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b6000611eb26120e5565b6002600a806020026040519081016040528092919082600a8015611eeb576020028201915b815481526020019060010190808311611ed7575b5050505050905060005b600a811015611fbd57838282600a8110611f0b57fe5b60200201511415611f84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f53657175656e636520494420616c72656164792075736564000000000000000081525060200191505060405180910390fd5b8183600a8110611f9057fe5b60200201518282600a8110611fa157fe5b60200201511015611fb0578092505b8080600101915050611ef5565b508082600a8110611fca57fe5b60200201518311612043576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f53657175656e63652049442062656c6f772077696e646f77000000000000000081525060200191505060405180910390fd5b6127108183600a811061205257fe5b6020020151018311156120cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53657175656e63652049442061626f7665206d6178696d756d0000000000000081525060200191505060405180910390fd5b82600283600a81106120db57fe5b0181905550505050565b604051806101400160405280600a9060208202803683378082019150509050509056fe45434453413a20696e76616c6964207369676e6174757265202773272076616c75655472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564a26469706673582212209b7ea50863af632fc27d59c62d10655bfb3d600b53df38b8806ca46c7752498064736f6c63430007050033
Deployed Bytecode
0x6080604052600436106100a05760003560e01c80637df73e27116100645780637df73e27146104d3578063a0b7967b1461053a578063abe3219c14610565578063ad3ad70914610592578063c6044c46146106d6578063fc0f392d1461075c5761013b565b80630dcd7a6c146101d1578063158ef93e146102b55780632da03409146102e25780633912521514610353578063736c0d5b1461046c5761013b565b3661013b576000341115610139577f6e89d517057028190560dd200cf6bf792842861353d1173761dfa362e1c133f03334600036604051808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509550505050505060405180910390a15b005b60003411156101cf577f6e89d517057028190560dd200cf6bf792842861353d1173761dfa362e1c133f03334600036604051808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509550505050505060405180910390a15b005b3480156101dd57600080fd5b506102b3600480360360c08110156101f457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561026f57600080fd5b82018360208201111561028157600080fd5b803590602001918460018302840111640100000000831117156102a357600080fd5b9091929391929390505050610773565b005b3480156102c157600080fd5b506102ca6108e9565b60405180821515815260200191505060405180910390f35b3480156102ee57600080fd5b506103516004803603604081101561030557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108fa565b005b34801561035f57600080fd5b5061046a600480360360c081101561037657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156103bd57600080fd5b8201836020820111156103cf57600080fd5b803590602001918460018302840111640100000000831117156103f157600080fd5b909192939192939080359060200190929190803590602001909291908035906020019064010000000081111561042657600080fd5b82018360208201111561043857600080fd5b8035906020019184600183028401116401000000008311171561045a57600080fd5b9091929391929390505050610a00565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d18565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d38565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f610d8d565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b5061057a610de0565b60405180821515815260200191505060405180910390f35b34801561059e57600080fd5b506106d4600480360360a08110156105b557600080fd5b81019080803590602001906401000000008111156105d257600080fd5b8201836020820111156105e457600080fd5b8035906020019184602083028401116401000000008311171561060657600080fd5b90919293919293908035906020019064010000000081111561062757600080fd5b82018360208201111561063957600080fd5b8035906020019184602083028401116401000000008311171561065b57600080fd5b909192939192939080359060200190929190803590602001909291908035906020019064010000000081111561069057600080fd5b8201836020820111156106a257600080fd5b803590602001918460018302840111640100000000831117156106c457600080fd5b9091929391929390505050610df3565b005b3480156106e257600080fd5b5061075a600480360360208110156106f957600080fd5b810190808035906020019064010000000081111561071657600080fd5b82018360208201111561072857600080fd5b8035906020019184602083028401116401000000008311171561074a57600080fd5b90919293919293905050506111b3565b005b34801561076857600080fd5b5061077161143a565b005b61077c33610d38565b6107ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b60006107f861151e565b88888888886040516020018087805190602001908083835b602083106108335780518252602082019150602081019050602083039250610810565b6001836020036101000a0380198251168184511680821785525050505050509050018673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1660601b815260140183815260200182815260200196505050505050506040516020818303038152906040528051906020012090506108d388828585898961155b565b506108df8689896117eb565b5050505050505050565b60018054906101000a900460ff1681565b61090333610d38565b610975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff16633ef13367836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156109e357600080fd5b505af11580156109f7573d6000803e3d6000fd5b50505050505050565b610a0933610d38565b610a7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b6000610a856119b1565b8989898989896040516020018088805190602001908083835b60208310610ac15780518252602082019150602081019050602083039250610a9e565b6001836020036101000a0380198251168184511680821785525050505050509050018773ffffffffffffffffffffffffffffffffffffffff1660601b8152601401868152602001858580828437808301925050508381526020018281526020019750505050505050506040516020818303038152906040528051906020012090506000610b528a8386868a8a61155b565b905060008a73ffffffffffffffffffffffffffffffffffffffff168a8a8a60405180838380828437808301925050509250505060006040518083038185875af1925050503d8060008114610bc2576040519150601f19603f3d011682016040523d82523d6000602084013e610bc7565b606091505b5050905080610c3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f43616c6c20657865637574696f6e206661696c6564000000000000000000000081525060200191505060405180910390fd5b7f59bed9ab5d78073465dd642a9e3e76dfdb7d53bcae9d09df7d0b8f5234d5a8063383858e8e8e8e604051808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509850505050505050505060405180910390a15050505050505050505050565b60006020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000806000905060005b600a811015610dd55781600282600a8110610dae57fe5b01541115610dc857600281600a8110610dc357fe5b015491505b8080600101915050610d97565b506001810191505090565b600160009054906101000a900460ff1681565b610dfc33610d38565b610e6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b6000888890501415610ee8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f7420656e6f75676820726563697069656e7473000000000000000000000081525060200191505060405180910390fd5b858590508888905014610f63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f556e657175616c20726563697069656e747320616e642076616c75657300000081525060200191505060405180910390fd5b6101008888905010610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546f6f206d616e7920726563697069656e74732c206d6178203235350000000081525060200191505060405180910390fd5b6000610fe76119ee565b8989898989896040516020018088805190602001908083835b602083106110235780518252602082019150602081019050602083039250611000565b6001836020036101000a0380198251168184511680821785525050505050509050018787602002808284378083019250505085856020028082843780830192505050838152602001828152602001975050505050505050604051602081830303815290604052805190602001209050600160009054906101000a900460ff1615611115576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f426174636820696e2073616665206d6f6465000000000000000000000000000081525060200191505060405180910390fd5b600061112660008386868a8a61155b565b90506111348a8a8a8a611a2b565b7fe4c9047a729726b729cf4fa62c95ef9a434bbaf206a7ea0c7c77515db1584022338284604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a150505050505050505050565b60018054906101000a900460ff1615611234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f436f6e747261637420616c726561647920696e697469616c697a65640000000081525060200191505060405180910390fd5b600382829050146112ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f496e76616c6964206e756d626572206f66207369676e6572730000000000000081525060200191505060405180910390fd5b60005b828290508160ff16101561141b57600073ffffffffffffffffffffffffffffffffffffffff1683838360ff168181106112e557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561138c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c6964207369676e657200000000000000000000000000000000000081525060200191505060405180910390fd5b600160008085858560ff168181106113a057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806001019150506112b0565b5060018060016101000a81548160ff0219169083151502179055505050565b61144333610d38565b6114b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b60018060006101000a81548160ff0219169083151502179055507f0909e8f76a4fd3e970f2eaef56c0ee6dfaf8b87c5b8d3f56ffce78e825a9115733604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b60606040518060400160405280600581526020017f4552433230000000000000000000000000000000000000000000000000000000815250905090565b6000806115ac8787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611c99565b9050600160009054906101000a900460ff1615806115cf57506115ce88610d38565b5b611641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f45787465726e616c207472616e7366657220696e2073616665206d6f6465000081525060200191505060405180910390fd5b428410156116b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5472616e73616374696f6e20657870697265640000000000000000000000000081525060200191505060405180910390fd5b6116c083611e2d565b6116c981610d38565b61173b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c6964207369676e657200000000000000000000000000000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f5369676e6572732063616e6e6f7420626520657175616c00000000000000000081525060200191505060405180910390fd5b809150509695505050505050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106118ae578051825260208201915060208101905060208303925061188b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611910576040519150601f19603f3d011682016040523d82523d6000602084013e611915565b606091505b50915091508180156119555750600081511480611954575080806020019051602081101561194257600080fd5b81019080805190602001909291905050505b5b6119aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061212b602d913960400191505060405180910390fd5b5050505050565b60606040518060400160405280600581526020017f4554484552000000000000000000000000000000000000000000000000000000815250905090565b60606040518060400160405280600b81526020017f45544845522d4261746368000000000000000000000000000000000000000000815250905090565b60005b84849050811015611c9257828282818110611a4557fe5b90506020020135471015611ac1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f496e73756666696369656e742066756e6473000000000000000000000000000081525060200191505060405180910390fd5b6000858583818110611acf57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16848484818110611b0e57fe5b9050602002013560405180600001905060006040518083038185875af1925050503d8060008114611b5b576040519150601f19603f3d011682016040523d82523d6000602084013e611b60565b606091505b5050905080611bd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f43616c6c206661696c656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b7fc42fa155158786a1dd6ccc3a785f35845467353c3cc700e0e31a79f90e22227d33878785818110611c0557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16868686818110611c2e57fe5b90506020020135604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1508080600101915050611a2e565b5050505050565b60006041825114611d12576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f496e76616c6964207369676e6174757265202d2077726f6e67206c656e67746881525060200191505060405180910390fd5b6000806000602085015192506040850151915060ff6041860151169050601b8160ff161015611d4257601b810190505b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115611dbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806121096022913960400191505060405180910390fd5b60018682858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611e18573d6000803e3d6000fd5b50505060206040510351935050505092915050565b611e3633610d38565b611ea8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b6000611eb26120e5565b6002600a806020026040519081016040528092919082600a8015611eeb576020028201915b815481526020019060010190808311611ed7575b5050505050905060005b600a811015611fbd57838282600a8110611f0b57fe5b60200201511415611f84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f53657175656e636520494420616c72656164792075736564000000000000000081525060200191505060405180910390fd5b8183600a8110611f9057fe5b60200201518282600a8110611fa157fe5b60200201511015611fb0578092505b8080600101915050611ef5565b508082600a8110611fca57fe5b60200201518311612043576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f53657175656e63652049442062656c6f772077696e646f77000000000000000081525060200191505060405180910390fd5b6127108183600a811061205257fe5b6020020151018311156120cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53657175656e63652049442061626f7665206d6178696d756d0000000000000081525060200191505060405180910390fd5b82600283600a81106120db57fe5b0181905550505050565b604051806101400160405280600a9060208202803683378082019150509050509056fe45434453413a20696e76616c6964207369676e6174757265202773272076616c75655472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564a26469706673582212209b7ea50863af632fc27d59c62d10655bfb3d600b53df38b8806ca46c7752498064736f6c63430007050033
Deployed Bytecode Sourcemap
1189:16239:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6211:1;6199:9;:13;6195:132;;;6278:42;6288:10;6300:9;6311:8;;6278:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6195:132;1189:16239;;5955:1;5943:9;:13;5939:132;;;6022:42;6032:10;6044:9;6055:8;;6022:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5939:132;1189:16239;11118:607;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2496:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12048:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;7008:830;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2303:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;5256:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;17115:311;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2407:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;8546:1161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3134:345;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13727:109;;;;;;;;;;;;;:::i;:::-;;11118:607;5510:20;5519:10;5510:8;:20::i;:::-;5502:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11360:21:::1;11427:19;:17;:19::i;:::-;11456:9;11475:5;11490:20;11520:10;11540;11401:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11384:180;;;;;;11360:204;;11571:75;11586:9;11597:13;11612:9;;11623:10;11635;11571:14;:75::i;:::-;;11653:67;11681:20;11703:9;11714:5;11653:27;:67::i;:::-;5572:1;11118:607:::0;;;;;;;:::o;2496:31::-;;;;;;;;;;;;:::o;12048:235::-;5510:20;5519:10;5510:8;:20::i;:::-;5502:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12180:19:::1;12212:16;12180:49;;12235:9;:21;;;12257:20;12235:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;5572:1;12048:235:::0;;:::o;7008:830::-;5510:20;5519:10;5510:8;:20::i;:::-;5502:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7236:21:::1;7303:14;:12;:14::i;:::-;7327:9;7346:5;7361:4;;7375:10;7395;7277:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7260:159;;;;;;7236:183;;7426:19;7448:111;7470:9;7487:13;7508:9;;7525:10;7543;7448:14;:111::i;:::-;7426:133;;7604:12;7622:9;:14;;7645:5;7653:4;;7622:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7603:55;;;7672:7;7664:41;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;7717:116;7735:10;7753:11;7772:13;7793:9;7810:5;7823:4;;7717:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5572:1;;;7008:830:::0;;;;;;;;:::o;2303:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;5256:94::-;5311:4;5330:7;:15;5338:6;5330:15;;;;;;;;;;;;;;;;;;;;;;;;;5323:22;;5256:94;;;:::o;17115:311::-;17165:7;17180:25;17208:1;17180:29;;17220:9;17215:173;2702:2;17235:1;:27;17215:173;;;17304:17;17281;17299:1;17281:20;;;;;;;;;:40;17277:105;;;17353:17;17371:1;17353:20;;;;;;;;;17333:40;;17277:105;17264:3;;;;;;;17215:173;;;;17420:1;17400:17;:21;17393:28;;;17115:311;:::o;2407:28::-;;;;;;;;;;;;;:::o;8546:1161::-;5510:20;5519:10;5510:8;:20::i;:::-;5502:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8776:1:::1;8755:10;;:17;;:22;;8747:56;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;8845:6;;:13;;8824:10;;:17;;:34;8809:94;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;8937:3;8917:10;;:17;;:23;8909:64;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;9011:21;9078:19;:17;:19::i;:::-;9107:10;;9127:6;;9143:10;9163;9052:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9035:152;;;;;;9011:176;;9423:8;;;;;;;;;;;9422:9;9414:40;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;9460:19;9482:114;9512:3;9524:13;9545:9;;9562:10;9580;9482:14;:114::i;:::-;9460:136;;9603:33;9617:10;;9629:6;;9603:13;:33::i;:::-;9647:55;9663:10;9675:11;9688:13;9647:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5572:1;;8546:1161:::0;;;;;;;;:::o;3134:345::-;5738:11;;;;;;;;;;5737:12;5729:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3249:1:::1;3224:14;;:21;;:26;3216:64;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;3292:7;3287:164;3309:14;;:21;;3305:1;:25;;;3287:164;;;3382:1;3353:31;;:14;;3368:1;3353:17;;;;;;;;;;;;;;;;;:31;;;;3345:58;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;3440:4;3411:7;:26:::0;3419:14:::1;;3434:1;3419:17;;;;;;;;;;;;;;;;;3411:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;3332:3;;;;;;;3287:164;;;;3470:4;3456:11:::0;::::1;:18;;;;;;;;;;;;;;;;;;3134:345:::0;;:::o;13727:109::-;5510:20;5519:10;5510:8;:20::i;:::-;5502:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13792:4:::1;13781:8:::0;::::1;:15;;;;;;;;;;;;;;;;;;13802:29;13820:10;13802:29;;;;;;;;;;;;;;;;;;;;13727:109::o:0;4436:100::-;4496:13;4517:14;;;;;;;;;;;;;;;;;;;4436:100;:::o;12769:824::-;12942:7;12957:19;12979:53;13007:13;13022:9;;12979:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:27;:53::i;:::-;12957:75;;13136:8;;;;;;;;;;;13135:9;:32;;;;13148:19;13157:9;13148:8;:19::i;:::-;13135:32;13127:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13282:15;13268:10;:29;;13260:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13409:31;13429:10;13409:19;:31::i;:::-;13455:21;13464:11;13455:8;:21::i;:::-;13447:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13525:10;13510:25;;:11;:25;;;;13502:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13577:11;13570:18;;;12769:824;;;;;;;;:::o;646:438:2:-;826:12;840:17;861:5;:10;;895;907:2;911:5;872:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;861:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;825:93;;;;949:7;:57;;;;;976:1;961:4;:11;:16;:44;;;;992:4;981:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;961:44;949:57;928:149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;646:438;;;;;:::o;3900:95:3:-;3955:13;3976:14;;;;;;;;;;;;;;;;;;;3900:95;:::o;4977:106::-;5037:13;5058:20;;;;;;;;;;;;;;;;;;;4977:106;:::o;10029:414::-;10142:9;10137:302;10161:10;;:17;;10157:1;:21;10137:302;;;10226:6;;10233:1;10226:9;;;;;;;;;;;;;10201:21;:34;;10193:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10268:12;10286:10;;10297:1;10286:13;;;;;;;;;;;;;;;:18;;10313:6;;10320:1;10313:9;;;;;;;;;;;;;10286:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10267:61;;;10344:7;10336:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10381:51;10395:10;10407;;10418:1;10407:13;;;;;;;;;;;;;;;10422:6;;10429:1;10422:9;;;;;;;;;;;;;10381:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10137:302;10180:3;;;;;;;10137:302;;;;10029:414;;;;:::o;14027:1334::-;14145:7;14188:2;14168:9;:16;:22;14160:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14329:9;14344;14359:7;14449:2;14438:9;14434:18;14428:25;14423:30;;14486:2;14475:9;14471:18;14465:25;14460:30;;14533:3;14527:2;14516:9;14512:18;14506:25;14502:35;14497:40;;14556:2;14552:1;:6;;;14548:129;;;14573:2;14568:7;;;;14548:129;14970:66;14956:1;14948:10;;:88;;14933:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15323:33;15333:13;15348:1;15351;15354;15323:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15316:40;;;;;14027:1334;;;;:::o;15720:1224::-;5510:20;5519:10;5510:8;:20::i;:::-;5502:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15858:24:::1;15984:58;;:::i;:::-;16045:17;15984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16073:9;16068:254;2702:2;16088:1;:27;16068:254;;;16163:10;16138:18;16157:1;16138:21;;;;;;;;;;;:35;;16130:72;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;16239:18;16258:16;16239:36;;;;;;;;;;;16215:18;16234:1;16215:21;;;;;;;;;;;:60;16211:105;;;16306:1;16287:20;;16211:105;16117:3;;;;;;;16068:254;;;;16497:18;16516:16;16497:36;;;;;;;;;;;16484:10;:49;16469:104;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;2650:5;16779:18;16798:16;16779:36;;;;;;;;;;;:63;16756:10;:87;;16741:143;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;16929:10;16891:17;16909:16;16891:35;;;;;;;;:48;;;;5572:1;;15720:1224:::0;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://9b7ea50863af632fc27d59c62d10655bfb3d600b53df38b8806ca46c77524980
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.