Source Code
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
WalletSimple
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-01-13
*/
// SPDX-License-Identifier: Apache-2.0
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);
}
/**
* 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;
this.flush();
}
/**
* 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 {
this.flush();
}
/**
* Default function; Gets called when Ether is deposited with no data, and forwards it to the parent address
*/
receive() external payable {
this.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;
}
require(
instance.transfer(parentAddress, forwarderBalance),
"Token flush failed"
);
}
/**
* Flush the entire balance of the contract to the parent address.
*/
function flush() external {
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);
}
}
/**
*
* 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 lastSequenceId;
uint256 private constant MAX_SEQUENCE_ID_INCREASE = 10000;
/**
* 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
);
ERC20Interface instance = ERC20Interface(tokenContractAddress);
require(instance.transfer(toAddress, value), "ERC20 Transfer call failed");
}
/**
* 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
tryUpdateSequenceId(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 is greater than the currently stored value and updates the stored value.
* By requiring sequence IDs to always increase, we ensure that the same signature can't be used twice.
* @param sequenceId The new sequenceId to use
*/
function tryUpdateSequenceId(uint256 sequenceId) private onlySigner {
require(sequenceId > lastSequenceId, "sequenceId is too low");
// Block sequence IDs which are much higher than the current
// This prevents people blocking the contract by using very large sequence IDs quickly
require(
sequenceId <= lastSequenceId + MAX_SEQUENCE_ID_INCREASE,
"sequenceId is too high"
);
lastSequenceId = sequenceId;
}
/**
* Gets the next available sequence ID for signing when using executeAndConfirm
* returns the sequenceId one higher than the one currently stored
*/
function getNextSequenceId() external view returns (uint256) {
return lastSequenceId + 1;
}
}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"}],"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
60806040526000600160006101000a81548160ff02191690831515021790555060006001806101000a81548160ff02191690831515021790555034801561004557600080fd5b50611f0a806100556000396000f3fe6080604052600436106100a05760003560e01c80637df73e27116100645780637df73e27146104d3578063a0b7967b1461053a578063abe3219c14610565578063ad3ad70914610592578063c6044c46146106d6578063fc0f392d1461075c5761013b565b80630dcd7a6c146101d1578063158ef93e146102b55780632da03409146102e25780633912521514610353578063736c0d5b1461046c5761013b565b3661013b576000341115610139577f6e89d517057028190560dd200cf6bf792842861353d1173761dfa362e1c133f03334600036604051808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509550505050505060405180910390a15b005b60003411156101cf577f6e89d517057028190560dd200cf6bf792842861353d1173761dfa362e1c133f03334600036604051808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509550505050505060405180910390a15b005b3480156101dd57600080fd5b506102b3600480360360c08110156101f457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561026f57600080fd5b82018360208201111561028157600080fd5b803590602001918460018302840111640100000000831117156102a357600080fd5b9091929391929390505050610773565b005b3480156102c157600080fd5b506102ca610a02565b60405180821515815260200191505060405180910390f35b3480156102ee57600080fd5b506103516004803603604081101561030557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a13565b005b34801561035f57600080fd5b5061046a600480360360c081101561037657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156103bd57600080fd5b8201836020820111156103cf57600080fd5b803590602001918460018302840111640100000000831117156103f157600080fd5b909192939192939080359060200190929190803590602001909291908035906020019064010000000081111561042657600080fd5b82018360208201111561043857600080fd5b8035906020019184600183028401116401000000008311171561045a57600080fd5b9091929391929390505050610b19565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e31565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e51565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f610ea6565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b5061057a610eb3565b60405180821515815260200191505060405180910390f35b34801561059e57600080fd5b506106d4600480360360a08110156105b557600080fd5b81019080803590602001906401000000008111156105d257600080fd5b8201836020820111156105e457600080fd5b8035906020019184602083028401116401000000008311171561060657600080fd5b90919293919293908035906020019064010000000081111561062757600080fd5b82018360208201111561063957600080fd5b8035906020019184602083028401116401000000008311171561065b57600080fd5b909192939192939080359060200190929190803590602001909291908035906020019064010000000081111561069057600080fd5b8201836020820111156106a257600080fd5b803590602001918460018302840111640100000000831117156106c457600080fd5b9091929391929390505050610ec6565b005b3480156106e257600080fd5b5061075a600480360360208110156106f957600080fd5b810190808035906020019064010000000081111561071657600080fd5b82018360208201111561072857600080fd5b8035906020019184602083028401116401000000008311171561074a57600080fd5b9091929391929390505050611286565b005b34801561076857600080fd5b5061077161150d565b005b61077c33610e51565b6107ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b60006107f86115f1565b88888888886040516020018087805190602001908083835b602083106108335780518252602082019150602081019050602083039250610810565b6001836020036101000a0380198251168184511680821785525050505050509050018673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1660601b815260140183815260200182815260200196505050505050506040516020818303038152906040528051906020012090506108d388828585898961162e565b5060008690508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8a8a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561094a57600080fd5b505af115801561095e573d6000803e3d6000fd5b505050506040513d602081101561097457600080fd5b81019080805190602001909291905050506109f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4552433230205472616e736665722063616c6c206661696c656400000000000081525060200191505060405180910390fd5b505050505050505050565b60018054906101000a900460ff1681565b610a1c33610e51565b610a8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff16633ef13367836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b158015610afc57600080fd5b505af1158015610b10573d6000803e3d6000fd5b50505050505050565b610b2233610e51565b610b94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b6000610b9e6118be565b8989898989896040516020018088805190602001908083835b60208310610bda5780518252602082019150602081019050602083039250610bb7565b6001836020036101000a0380198251168184511680821785525050505050509050018773ffffffffffffffffffffffffffffffffffffffff1660601b8152601401868152602001858580828437808301925050508381526020018281526020019750505050505050506040516020818303038152906040528051906020012090506000610c6b8a8386868a8a61162e565b905060008a73ffffffffffffffffffffffffffffffffffffffff168a8a8a60405180838380828437808301925050509250505060006040518083038185875af1925050503d8060008114610cdb576040519150601f19603f3d011682016040523d82523d6000602084013e610ce0565b606091505b5050905080610d57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f43616c6c20657865637574696f6e206661696c6564000000000000000000000081525060200191505060405180910390fd5b7f59bed9ab5d78073465dd642a9e3e76dfdb7d53bcae9d09df7d0b8f5234d5a8063383858e8e8e8e604051808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509850505050505050505060405180910390a15050505050505050505050565b60006020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600160025401905090565b600160009054906101000a900460ff1681565b610ecf33610e51565b610f41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b6000888890501415610fbb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f7420656e6f75676820726563697069656e7473000000000000000000000081525060200191505060405180910390fd5b858590508888905014611036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f556e657175616c20726563697069656e747320616e642076616c75657300000081525060200191505060405180910390fd5b61010088889050106110b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546f6f206d616e7920726563697069656e74732c206d6178203235350000000081525060200191505060405180910390fd5b60006110ba6118fb565b8989898989896040516020018088805190602001908083835b602083106110f657805182526020820191506020810190506020830392506110d3565b6001836020036101000a0380198251168184511680821785525050505050509050018787602002808284378083019250505085856020028082843780830192505050838152602001828152602001975050505050505050604051602081830303815290604052805190602001209050600160009054906101000a900460ff16156111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f426174636820696e2073616665206d6f6465000000000000000000000000000081525060200191505060405180910390fd5b60006111f960008386868a8a61162e565b90506112078a8a8a8a611938565b7fe4c9047a729726b729cf4fa62c95ef9a434bbaf206a7ea0c7c77515db1584022338284604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a150505050505050505050565b60018054906101000a900460ff1615611307576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f436f6e747261637420616c726561647920696e697469616c697a65640000000081525060200191505060405180910390fd5b60038282905014611380576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f496e76616c6964206e756d626572206f66207369676e6572730000000000000081525060200191505060405180910390fd5b60005b828290508160ff1610156114ee57600073ffffffffffffffffffffffffffffffffffffffff1683838360ff168181106113b857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561145f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c6964207369676e657200000000000000000000000000000000000081525060200191505060405180910390fd5b600160008085858560ff1681811061147357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050611383565b5060018060016101000a81548160ff0219169083151502179055505050565b61151633610e51565b611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b60018060006101000a81548160ff0219169083151502179055507f0909e8f76a4fd3e970f2eaef56c0ee6dfaf8b87c5b8d3f56ffce78e825a9115733604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b60606040518060400160405280600581526020017f4552433230000000000000000000000000000000000000000000000000000000815250905090565b60008061167f8787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611ba6565b9050600160009054906101000a900460ff1615806116a257506116a188610e51565b5b611714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f45787465726e616c207472616e7366657220696e2073616665206d6f6465000081525060200191505060405180910390fd5b4284101561178a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5472616e73616374696f6e20657870697265640000000000000000000000000081525060200191505060405180910390fd5b61179383611d3a565b61179c81610e51565b61180e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c6964207369676e657200000000000000000000000000000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f5369676e6572732063616e6e6f7420626520657175616c00000000000000000081525060200191505060405180910390fd5b809150509695505050505050565b60606040518060400160405280600581526020017f4554484552000000000000000000000000000000000000000000000000000000815250905090565b60606040518060400160405280600b81526020017f45544845522d4261746368000000000000000000000000000000000000000000815250905090565b60005b84849050811015611b9f5782828281811061195257fe5b905060200201354710156119ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f496e73756666696369656e742066756e6473000000000000000000000000000081525060200191505060405180910390fd5b60008585838181106119dc57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16848484818110611a1b57fe5b9050602002013560405180600001905060006040518083038185875af1925050503d8060008114611a68576040519150601f19603f3d011682016040523d82523d6000602084013e611a6d565b606091505b5050905080611ae4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f43616c6c206661696c656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b7fc42fa155158786a1dd6ccc3a785f35845467353c3cc700e0e31a79f90e22227d33878785818110611b1257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16868686818110611b3b57fe5b90506020020135604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a150808060010191505061193b565b5050505050565b60006041825114611c1f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f496e76616c6964207369676e6174757265202d2077726f6e67206c656e67746881525060200191505060405180910390fd5b6000806000602085015192506040850151915060ff6041860151169050601b8160ff161015611c4f57601b810190505b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115611ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180611eb36022913960400191505060405180910390fd5b60018682858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611d25573d6000803e3d6000fd5b50505060206040510351935050505092915050565b611d4333610e51565b611db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b6002548111611e2c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f73657175656e6365496420697320746f6f206c6f77000000000000000000000081525060200191505060405180910390fd5b61271060025401811115611ea8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f73657175656e6365496420697320746f6f20686967680000000000000000000081525060200191505060405180910390fd5b806002819055505056fe45434453413a20696e76616c6964207369676e6174757265202773272076616c7565a26469706673582212200d8e1954b0b963b53633e58e824197763c659ea924c53c07544930fb991f7b4264736f6c63430007050033
Deployed Bytecode
0x6080604052600436106100a05760003560e01c80637df73e27116100645780637df73e27146104d3578063a0b7967b1461053a578063abe3219c14610565578063ad3ad70914610592578063c6044c46146106d6578063fc0f392d1461075c5761013b565b80630dcd7a6c146101d1578063158ef93e146102b55780632da03409146102e25780633912521514610353578063736c0d5b1461046c5761013b565b3661013b576000341115610139577f6e89d517057028190560dd200cf6bf792842861353d1173761dfa362e1c133f03334600036604051808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509550505050505060405180910390a15b005b60003411156101cf577f6e89d517057028190560dd200cf6bf792842861353d1173761dfa362e1c133f03334600036604051808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509550505050505060405180910390a15b005b3480156101dd57600080fd5b506102b3600480360360c08110156101f457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561026f57600080fd5b82018360208201111561028157600080fd5b803590602001918460018302840111640100000000831117156102a357600080fd5b9091929391929390505050610773565b005b3480156102c157600080fd5b506102ca610a02565b60405180821515815260200191505060405180910390f35b3480156102ee57600080fd5b506103516004803603604081101561030557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a13565b005b34801561035f57600080fd5b5061046a600480360360c081101561037657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156103bd57600080fd5b8201836020820111156103cf57600080fd5b803590602001918460018302840111640100000000831117156103f157600080fd5b909192939192939080359060200190929190803590602001909291908035906020019064010000000081111561042657600080fd5b82018360208201111561043857600080fd5b8035906020019184600183028401116401000000008311171561045a57600080fd5b9091929391929390505050610b19565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e31565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e51565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f610ea6565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b5061057a610eb3565b60405180821515815260200191505060405180910390f35b34801561059e57600080fd5b506106d4600480360360a08110156105b557600080fd5b81019080803590602001906401000000008111156105d257600080fd5b8201836020820111156105e457600080fd5b8035906020019184602083028401116401000000008311171561060657600080fd5b90919293919293908035906020019064010000000081111561062757600080fd5b82018360208201111561063957600080fd5b8035906020019184602083028401116401000000008311171561065b57600080fd5b909192939192939080359060200190929190803590602001909291908035906020019064010000000081111561069057600080fd5b8201836020820111156106a257600080fd5b803590602001918460018302840111640100000000831117156106c457600080fd5b9091929391929390505050610ec6565b005b3480156106e257600080fd5b5061075a600480360360208110156106f957600080fd5b810190808035906020019064010000000081111561071657600080fd5b82018360208201111561072857600080fd5b8035906020019184602083028401116401000000008311171561074a57600080fd5b9091929391929390505050611286565b005b34801561076857600080fd5b5061077161150d565b005b61077c33610e51565b6107ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b60006107f86115f1565b88888888886040516020018087805190602001908083835b602083106108335780518252602082019150602081019050602083039250610810565b6001836020036101000a0380198251168184511680821785525050505050509050018673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1660601b815260140183815260200182815260200196505050505050506040516020818303038152906040528051906020012090506108d388828585898961162e565b5060008690508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8a8a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561094a57600080fd5b505af115801561095e573d6000803e3d6000fd5b505050506040513d602081101561097457600080fd5b81019080805190602001909291905050506109f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4552433230205472616e736665722063616c6c206661696c656400000000000081525060200191505060405180910390fd5b505050505050505050565b60018054906101000a900460ff1681565b610a1c33610e51565b610a8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff16633ef13367836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b158015610afc57600080fd5b505af1158015610b10573d6000803e3d6000fd5b50505050505050565b610b2233610e51565b610b94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b6000610b9e6118be565b8989898989896040516020018088805190602001908083835b60208310610bda5780518252602082019150602081019050602083039250610bb7565b6001836020036101000a0380198251168184511680821785525050505050509050018773ffffffffffffffffffffffffffffffffffffffff1660601b8152601401868152602001858580828437808301925050508381526020018281526020019750505050505050506040516020818303038152906040528051906020012090506000610c6b8a8386868a8a61162e565b905060008a73ffffffffffffffffffffffffffffffffffffffff168a8a8a60405180838380828437808301925050509250505060006040518083038185875af1925050503d8060008114610cdb576040519150601f19603f3d011682016040523d82523d6000602084013e610ce0565b606091505b5050905080610d57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f43616c6c20657865637574696f6e206661696c6564000000000000000000000081525060200191505060405180910390fd5b7f59bed9ab5d78073465dd642a9e3e76dfdb7d53bcae9d09df7d0b8f5234d5a8063383858e8e8e8e604051808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509850505050505050505060405180910390a15050505050505050505050565b60006020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600160025401905090565b600160009054906101000a900460ff1681565b610ecf33610e51565b610f41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b6000888890501415610fbb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f7420656e6f75676820726563697069656e7473000000000000000000000081525060200191505060405180910390fd5b858590508888905014611036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f556e657175616c20726563697069656e747320616e642076616c75657300000081525060200191505060405180910390fd5b61010088889050106110b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546f6f206d616e7920726563697069656e74732c206d6178203235350000000081525060200191505060405180910390fd5b60006110ba6118fb565b8989898989896040516020018088805190602001908083835b602083106110f657805182526020820191506020810190506020830392506110d3565b6001836020036101000a0380198251168184511680821785525050505050509050018787602002808284378083019250505085856020028082843780830192505050838152602001828152602001975050505050505050604051602081830303815290604052805190602001209050600160009054906101000a900460ff16156111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f426174636820696e2073616665206d6f6465000000000000000000000000000081525060200191505060405180910390fd5b60006111f960008386868a8a61162e565b90506112078a8a8a8a611938565b7fe4c9047a729726b729cf4fa62c95ef9a434bbaf206a7ea0c7c77515db1584022338284604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a150505050505050505050565b60018054906101000a900460ff1615611307576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f436f6e747261637420616c726561647920696e697469616c697a65640000000081525060200191505060405180910390fd5b60038282905014611380576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f496e76616c6964206e756d626572206f66207369676e6572730000000000000081525060200191505060405180910390fd5b60005b828290508160ff1610156114ee57600073ffffffffffffffffffffffffffffffffffffffff1683838360ff168181106113b857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561145f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c6964207369676e657200000000000000000000000000000000000081525060200191505060405180910390fd5b600160008085858560ff1681811061147357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050611383565b5060018060016101000a81548160ff0219169083151502179055505050565b61151633610e51565b611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b60018060006101000a81548160ff0219169083151502179055507f0909e8f76a4fd3e970f2eaef56c0ee6dfaf8b87c5b8d3f56ffce78e825a9115733604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b60606040518060400160405280600581526020017f4552433230000000000000000000000000000000000000000000000000000000815250905090565b60008061167f8787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611ba6565b9050600160009054906101000a900460ff1615806116a257506116a188610e51565b5b611714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f45787465726e616c207472616e7366657220696e2073616665206d6f6465000081525060200191505060405180910390fd5b4284101561178a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5472616e73616374696f6e20657870697265640000000000000000000000000081525060200191505060405180910390fd5b61179383611d3a565b61179c81610e51565b61180e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c6964207369676e657200000000000000000000000000000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f5369676e6572732063616e6e6f7420626520657175616c00000000000000000081525060200191505060405180910390fd5b809150509695505050505050565b60606040518060400160405280600581526020017f4554484552000000000000000000000000000000000000000000000000000000815250905090565b60606040518060400160405280600b81526020017f45544845522d4261746368000000000000000000000000000000000000000000815250905090565b60005b84849050811015611b9f5782828281811061195257fe5b905060200201354710156119ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f496e73756666696369656e742066756e6473000000000000000000000000000081525060200191505060405180910390fd5b60008585838181106119dc57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16848484818110611a1b57fe5b9050602002013560405180600001905060006040518083038185875af1925050503d8060008114611a68576040519150601f19603f3d011682016040523d82523d6000602084013e611a6d565b606091505b5050905080611ae4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f43616c6c206661696c656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b7fc42fa155158786a1dd6ccc3a785f35845467353c3cc700e0e31a79f90e22227d33878785818110611b1257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16868686818110611b3b57fe5b90506020020135604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a150808060010191505061193b565b5050505050565b60006041825114611c1f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f496e76616c6964207369676e6174757265202d2077726f6e67206c656e67746881525060200191505060405180910390fd5b6000806000602085015192506040850151915060ff6041860151169050601b8160ff161015611c4f57601b810190505b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115611ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180611eb36022913960400191505060405180910390fd5b60018682858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611d25573d6000803e3d6000fd5b50505060206040510351935050505092915050565b611d4333610e51565b611db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f640081525060200191505060405180910390fd5b6002548111611e2c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f73657175656e6365496420697320746f6f206c6f77000000000000000000000081525060200191505060405180910390fd5b61271060025401811115611ea8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f73657175656e6365496420697320746f6f20686967680000000000000000000081525060200191505060405180910390fd5b806002819055505056fe45434453413a20696e76616c6964207369676e6174757265202773272076616c7565a26469706673582212200d8e1954b0b963b53633e58e824197763c659ea924c53c07544930fb991f7b4264736f6c63430007050033
Deployed Bytecode Sourcemap
3890:15594:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8967:1;8955:9;:13;8951:135;;;9036:42;9046:10;9058:9;9069:8;;9036:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8951:135;3890:15594;;8701:1;8689:9;:13;8685:135;;;8770:42;8780:10;8792:9;8803:8;;8770:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8685:135;3890:15594;14016:748;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5222:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;15095:241;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9781:870;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5027:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;7978:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;19382:99;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5132:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11372:1199;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5805:353;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16820:112;;;;;;;;;;;;;:::i;:::-;;14016:748;8240:20;8249:10;8240:8;:20::i;:::-;8232:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14267:21:::1;14336:19;:17;:19::i;:::-;14366:9;14386:5;14402:20;14433:10;14454;14309:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14291:189;;;;;;14267:213;;14489:117;14512:9;14530:13;14552:9;;14570:10;14589;14489:14;:117::i;:::-;;14615:23;14656:20;14615:62;;14692:8;:17;;;14710:9;14721:5;14692:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;14684:74;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;8303:1;;14016:748:::0;;;;;;;:::o;5222:31::-;;;;;;;;;;;;:::o;15095:241::-;8240:20;8249:10;8240:8;:20::i;:::-;8232:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15231:19:::1;15263:16;15231:49;;15287:9;:21;;;15309:20;15287:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;8303:1;15095:241:::0;;:::o;9781:870::-;8240:20;8249:10;8240:8;:20::i;:::-;8232:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10018:21:::1;10087:14;:12;:14::i;:::-;10112:9;10132:5;10148:4;;10163:10;10184;10060:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10042:168;;;;;;10018:192;;10219:19;10241:117;10264:9;10282:13;10304:9;;10322:10;10341;10241:14;:117::i;:::-;10219:139;;10406:12;10424:9;:14;;10447:5;10455:4;;10424:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10405:55;;;10475:7;10467:41;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;10522:123;10541:10;10560:11;10580:13;10602:9;10620:5;10634:4;;10522:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8303:1;;;9781:870:::0;;;;;;;;:::o;5027:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;7978:96::-;8033:4;8053:7;:15;8061:6;8053:15;;;;;;;;;;;;;;;;;;;;;;;;;8046:22;;7978:96;;;:::o;19382:99::-;19434:7;19474:1;19457:14;;:18;19450:25;;19382:99;:::o;5132:28::-;;;;;;;;;;;;;:::o;11372:1199::-;8240:20;8249:10;8240:8;:20::i;:::-;8232:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11609:1:::1;11588:10;;:17;;:22;;11580:56;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;11680:6;;:13;;11659:10;;:17;;:34;11643:97;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;11775:3;11755:10;;:17;;:23;11747:64;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;11852:21;11921:19;:17;:19::i;:::-;11951:10;;11972:6;;11989:10;12010;11894:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11876:160;;;;;;11852:184;;12276:8;;;;;;;;;;;12275:9;12267:40;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;12314:19;12336:120;12367:3;12380:13;12402:9;;12420:10;12439;12336:14;:120::i;:::-;12314:142;;12465:33;12479:10;;12491:6;;12465:13;:33::i;:::-;12510:55;12526:10;12538:11;12551:13;12510:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8303:1;;11372:1199:::0;;;;;;;;:::o;5805:353::-;8476:11;;;;;;;;;;8475:12;8467:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5921:1:::1;5896:14;;:21;;:26;5888:64;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;5966:7;5961:167;5983:14;;:21;;5979:1;:25;;;5961:167;;;6057:1;6028:31;;:14;;6043:1;6028:17;;;;;;;;;;;;;;;;;:31;;;;6020:58;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;6116:4;6087:7;:26:::0;6095:14:::1;;6110:1;6095:17;;;;;;;;;;;;;;;;;6087:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;6006:3;;;;;;;5961:167;;;;6148:4;6134:11:::0;::::1;:18;;;;;;;;;;;;;;;;;;5805:353:::0;;:::o;16820:112::-;8240:20;8249:10;8240:8;:20::i;:::-;8232:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16886:4:::1;16875:8:::0;::::1;:15;;;;;;;;;;;;;;;;;;16897:29;16915:10;16897:29;;;;;;;;;;;;;;;;;;;;16820:112::o:0;7137:102::-;7197:13;7219:14;;;;;;;;;;;;;;;;;;;7137:102;:::o;15834:847::-;16013:7;16029:19;16051:53;16079:13;16094:9;;16051:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:27;:53::i;:::-;16029:75;;16211:8;;;;;;;;;;;16210:9;:32;;;;16223:19;16232:9;16223:8;:19::i;:::-;16210:32;16202:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16360:15;16346:10;:29;;16338:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16490:31;16510:10;16490:19;:31::i;:::-;16538:21;16547:11;16538:8;:21::i;:::-;16530:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16610:10;16595:25;;:11;:25;;;;16587:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16664:11;16657:18;;;15834:847;;;;;;;;:::o;6589:97::-;6644:13;6666:14;;;;;;;;;;;;;;;;;;;6589:97;:::o;7690:108::-;7750:13;7772:20;;;;;;;;;;;;;;;;;;;7690:108;:::o;12902:426::-;13019:9;13014:309;13038:10;;:17;;13034:1;:21;13014:309;;;13104:6;;13111:1;13104:9;;;;;;;;;;;;;13079:21;:34;;13071:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13148:12;13166:10;;13177:1;13166:13;;;;;;;;;;;;;;;:18;;13193:6;;13200:1;13193:9;;;;;;;;;;;;;13166:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13147:61;;;13225:7;13217:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13264:51;13278:10;13290;;13301:1;13290:13;;;;;;;;;;;;;;;13305:6;;13312:1;13305:9;;;;;;;;;;;;;13264:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13014:309;13057:3;;;;;;;13014:309;;;;12902:426;;;;:::o;17131:1338::-;17252:7;17296:2;17276:9;:16;:22;17268:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17440:9;17456;17472:7;17566:2;17555:9;17551:18;17545:25;17540:30;;17604:2;17593:9;17589:18;17583:25;17578:30;;17652:3;17646:2;17635:9;17631:18;17625:25;17621:35;17616:40;;17677:2;17673:1;:6;;;17669:131;;;17695:2;17690:7;;;;17669:131;18083:66;18077:1;18069:10;;:80;;18061:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18430:33;18440:13;18455:1;18458;18461;18430:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18423:40;;;;;17131:1338;;;;:::o;18753:456::-;8240:20;8249:10;8240:8;:20::i;:::-;8232:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18849:14:::1;;18836:10;:27;18828:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;5414:5;19086:14;;:41;19072:10;:55;;19056:111;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;19193:10;19176:14;:27;;;;18753:456:::0;:::o
Swarm Source
ipfs://0d8e1954b0b963b53633e58e824197763c659ea924c53c07544930fb991f7b42
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.