Source Code
View more zero value Internal Transactions in Advanced View mode
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ConfirmedTransactionModule
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at moonbeam.moonscan.io on 2022-05-02 */ /** *Submitted for verification at snowtrace.io on 2021-11-04 */ /** *Submitted for verification at moonriver.moonscan.io on 2021-11-04 */ pragma solidity >=0.5.0 <0.7.0; /// @title SelfAuthorized - authorizes current contract to perform actions /// @author Richard Meissner - <[email protected]> contract SelfAuthorized { modifier authorized() { require(msg.sender == address(this), "Method can only be called from this contract"); _; } } /// @title MasterCopy - Base for master copy contracts (should always be first super contract) /// This contract is tightly coupled to our proxy contract (see `proxies/GnosisSafeProxy.sol`) /// @author Richard Meissner - <[email protected]> contract MasterCopy is SelfAuthorized { event ChangedMasterCopy(address masterCopy); // masterCopy always needs to be first declared variable, to ensure that it is at the same location as in the Proxy contract. // It should also always be ensured that the address is stored alone (uses a full word) address private masterCopy; /// @dev Allows to upgrade the contract. This can only be done via a Safe transaction. /// @param _masterCopy New contract address. function changeMasterCopy(address _masterCopy) public authorized { // Master copy address cannot be null. require(_masterCopy != address(0), "Invalid master copy address provided"); masterCopy = _masterCopy; emit ChangedMasterCopy(_masterCopy); } } /// @title Enum - Collection of enums /// @author Richard Meissner - <[email protected]> contract Enum { enum Operation { Call, DelegateCall } } /// @title Executor - A contract that can execute transactions /// @author Richard Meissner - <[email protected]> contract Executor { function execute(address to, uint256 value, bytes memory data, Enum.Operation operation, uint256 txGas) internal returns (bool success) { if (operation == Enum.Operation.Call) success = executeCall(to, value, data, txGas); else if (operation == Enum.Operation.DelegateCall) success = executeDelegateCall(to, data, txGas); else success = false; } function executeCall(address to, uint256 value, bytes memory data, uint256 txGas) internal returns (bool success) { // solium-disable-next-line security/no-inline-assembly assembly { success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0) } } function executeDelegateCall(address to, bytes memory data, uint256 txGas) internal returns (bool success) { // solium-disable-next-line security/no-inline-assembly assembly { success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0) } } } /// @title Module - Base class for modules. /// @author Stefan George - <[email protected]> /// @author Richard Meissner - <[email protected]> contract Module is MasterCopy { ModuleManager public manager; modifier authorized() { require(msg.sender == address(manager), "Method can only be called from manager"); _; } function setManager() internal { // manager can only be 0 at initalization of contract. // Check ensures that setup function can only be called once. require(address(manager) == address(0), "Manager has already been set"); manager = ModuleManager(msg.sender); } } /// @title Module Manager - A contract that manages modules that can execute transactions via this contract /// @author Stefan George - <[email protected]> /// @author Richard Meissner - <[email protected]> contract ModuleManager is SelfAuthorized, Executor { event EnabledModule(Module module); event DisabledModule(Module module); event ExecutionFromModuleSuccess(address indexed module); event ExecutionFromModuleFailure(address indexed module); address internal constant SENTINEL_MODULES = address(0x1); mapping (address => address) internal modules; function setupModules(address to, bytes memory data) internal { require(modules[SENTINEL_MODULES] == address(0), "Modules have already been initialized"); modules[SENTINEL_MODULES] = SENTINEL_MODULES; if (to != address(0)) // Setup has to complete successfully or transaction fails. require(executeDelegateCall(to, data, gasleft()), "Could not finish initialization"); } /// @dev Allows to add a module to the whitelist. /// This can only be done via a Safe transaction. /// @notice Enables the module `module` for the Safe. /// @param module Module to be whitelisted. function enableModule(Module module) public authorized { // Module address cannot be null or sentinel. require(address(module) != address(0) && address(module) != SENTINEL_MODULES, "Invalid module address provided"); // Module cannot be added twice. require(modules[address(module)] == address(0), "Module has already been added"); modules[address(module)] = modules[SENTINEL_MODULES]; modules[SENTINEL_MODULES] = address(module); emit EnabledModule(module); } /// @dev Allows to remove a module from the whitelist. /// This can only be done via a Safe transaction. /// @notice Disables the module `module` for the Safe. /// @param prevModule Module that pointed to the module to be removed in the linked list /// @param module Module to be removed. function disableModule(Module prevModule, Module module) public authorized { // Validate module address and check that it corresponds to module index. require(address(module) != address(0) && address(module) != SENTINEL_MODULES, "Invalid module address provided"); require(modules[address(prevModule)] == address(module), "Invalid prevModule, module pair provided"); modules[address(prevModule)] = modules[address(module)]; modules[address(module)] = address(0); emit DisabledModule(module); } /// @dev Allows a Module to execute a Safe transaction without any further confirmations. /// @param to Destination address of module transaction. /// @param value Ether value of module transaction. /// @param data Data payload of module transaction. /// @param operation Operation type of module transaction. function execTransactionFromModule(address to, uint256 value, bytes memory data, Enum.Operation operation) public returns (bool success) { // Only whitelisted modules are allowed. require(msg.sender != SENTINEL_MODULES && modules[msg.sender] != address(0), "Method can only be called from an enabled module"); // Execute transaction without further confirmations. success = execute(to, value, data, operation, gasleft()); if (success) emit ExecutionFromModuleSuccess(msg.sender); else emit ExecutionFromModuleFailure(msg.sender); } /// @dev Allows a Module to execute a Safe transaction without any further confirmations and return data /// @param to Destination address of module transaction. /// @param value Ether value of module transaction. /// @param data Data payload of module transaction. /// @param operation Operation type of module transaction. function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, Enum.Operation operation) public returns (bool success, bytes memory returnData) { success = execTransactionFromModule(to, value, data, operation); // solium-disable-next-line security/no-inline-assembly assembly { // Load free memory location let ptr := mload(0x40) // We allocate memory for the return data by setting the free memory location to // current free memory location + data size + 32 bytes for data size value mstore(0x40, add(ptr, add(returndatasize(), 0x20))) // Store the size mstore(ptr, returndatasize()) // Store the data returndatacopy(add(ptr, 0x20), 0, returndatasize()) // Point the return data to the correct memory location returnData := ptr } } /// @dev Returns if an module is enabled /// @return True if the module is enabled function isModuleEnabled(Module module) public view returns (bool) { return SENTINEL_MODULES != address(module) && modules[address(module)] != address(0); } /// @dev Returns array of first 10 modules. /// @return Array of modules. function getModules() public view returns (address[] memory) { (address[] memory array,) = getModulesPaginated(SENTINEL_MODULES, 10); return array; } /// @dev Returns array of modules. /// @param start Start of the page. /// @param pageSize Maximum number of modules that should be returned. /// @return Array of modules. function getModulesPaginated(address start, uint256 pageSize) public view returns (address[] memory array, address next) { // Init array with max page size array = new address[](pageSize); // Populate return array uint256 moduleCount = 0; address currentModule = modules[start]; while(currentModule != address(0x0) && currentModule != SENTINEL_MODULES && moduleCount < pageSize) { array[moduleCount] = currentModule; currentModule = modules[currentModule]; moduleCount++; } next = currentModule; // Set correct size of returned array // solium-disable-next-line security/no-inline-assembly assembly { mstore(array, moduleCount) } } } /// @title OwnerManager - Manages a set of owners and a threshold to perform actions. /// @author Stefan George - <[email protected]> /// @author Richard Meissner - <[email protected]> contract OwnerManager is SelfAuthorized { event AddedOwner(address owner); event RemovedOwner(address owner); event ChangedThreshold(uint256 threshold); address internal constant SENTINEL_OWNERS = address(0x1); mapping(address => address) internal owners; uint256 ownerCount; uint256 internal threshold; /// @dev Setup function sets initial storage of contract. /// @param _owners List of Safe owners. /// @param _threshold Number of required confirmations for a Safe transaction. function setupOwners(address[] memory _owners, uint256 _threshold) internal { // Threshold can only be 0 at initialization. // Check ensures that setup function can only be called once. require(threshold == 0, "Owners have already been setup"); // Validate that threshold is smaller than number of added owners. require(_threshold <= _owners.length, "Threshold cannot exceed owner count"); // There has to be at least one Safe owner. require(_threshold >= 1, "Threshold needs to be greater than 0"); // Initializing Safe owners. address currentOwner = SENTINEL_OWNERS; for (uint256 i = 0; i < _owners.length; i++) { // Owner address cannot be null. address owner = _owners[i]; require(owner != address(0) && owner != SENTINEL_OWNERS, "Invalid owner address provided"); // No duplicate owners allowed. require(owners[owner] == address(0), "Duplicate owner address provided"); owners[currentOwner] = owner; currentOwner = owner; } owners[currentOwner] = SENTINEL_OWNERS; ownerCount = _owners.length; threshold = _threshold; } /// @dev Allows to add a new owner to the Safe and update the threshold at the same time. /// This can only be done via a Safe transaction. /// @notice Adds the owner `owner` to the Safe and updates the threshold to `_threshold`. /// @param owner New owner address. /// @param _threshold New threshold. function addOwnerWithThreshold(address owner, uint256 _threshold) public authorized { // Owner address cannot be null. require(owner != address(0) && owner != SENTINEL_OWNERS, "Invalid owner address provided"); // No duplicate owners allowed. require(owners[owner] == address(0), "Address is already an owner"); owners[owner] = owners[SENTINEL_OWNERS]; owners[SENTINEL_OWNERS] = owner; ownerCount++; emit AddedOwner(owner); // Change threshold if threshold was changed. if (threshold != _threshold) changeThreshold(_threshold); } /// @dev Allows to remove an owner from the Safe and update the threshold at the same time. /// This can only be done via a Safe transaction. /// @notice Removes the owner `owner` from the Safe and updates the threshold to `_threshold`. /// @param prevOwner Owner that pointed to the owner to be removed in the linked list /// @param owner Owner address to be removed. /// @param _threshold New threshold. function removeOwner(address prevOwner, address owner, uint256 _threshold) public authorized { // Only allow to remove an owner, if threshold can still be reached. require(ownerCount - 1 >= _threshold, "New owner count needs to be larger than new threshold"); // Validate owner address and check that it corresponds to owner index. require(owner != address(0) && owner != SENTINEL_OWNERS, "Invalid owner address provided"); require(owners[prevOwner] == owner, "Invalid prevOwner, owner pair provided"); owners[prevOwner] = owners[owner]; owners[owner] = address(0); ownerCount--; emit RemovedOwner(owner); // Change threshold if threshold was changed. if (threshold != _threshold) changeThreshold(_threshold); } /// @dev Allows to swap/replace an owner from the Safe with another address. /// This can only be done via a Safe transaction. /// @notice Replaces the owner `oldOwner` in the Safe with `newOwner`. /// @param prevOwner Owner that pointed to the owner to be replaced in the linked list /// @param oldOwner Owner address to be replaced. /// @param newOwner New owner address. function swapOwner(address prevOwner, address oldOwner, address newOwner) public authorized { // Owner address cannot be null. require(newOwner != address(0) && newOwner != SENTINEL_OWNERS, "Invalid owner address provided"); // No duplicate owners allowed. require(owners[newOwner] == address(0), "Address is already an owner"); // Validate oldOwner address and check that it corresponds to owner index. require(oldOwner != address(0) && oldOwner != SENTINEL_OWNERS, "Invalid owner address provided"); require(owners[prevOwner] == oldOwner, "Invalid prevOwner, owner pair provided"); owners[newOwner] = owners[oldOwner]; owners[prevOwner] = newOwner; owners[oldOwner] = address(0); emit RemovedOwner(oldOwner); emit AddedOwner(newOwner); } /// @dev Allows to update the number of required confirmations by Safe owners. /// This can only be done via a Safe transaction. /// @notice Changes the threshold of the Safe to `_threshold`. /// @param _threshold New threshold. function changeThreshold(uint256 _threshold) public authorized { // Validate that threshold is smaller than number of owners. require(_threshold <= ownerCount, "Threshold cannot exceed owner count"); // There has to be at least one Safe owner. require(_threshold >= 1, "Threshold needs to be greater than 0"); threshold = _threshold; emit ChangedThreshold(threshold); } function getThreshold() public view returns (uint256) { return threshold; } function isOwner(address owner) public view returns (bool) { return owner != SENTINEL_OWNERS && owners[owner] != address(0); } /// @dev Returns array of owners. /// @return Array of Safe owners. function getOwners() public view returns (address[] memory) { address[] memory array = new address[](ownerCount); // populate return array uint256 index = 0; address currentOwner = owners[SENTINEL_OWNERS]; while(currentOwner != SENTINEL_OWNERS) { array[index] = currentOwner; currentOwner = owners[currentOwner]; index ++; } return array; } } /// @title Confirmed Transaction Module - Enables the Safe to designate transactions that can be executed by an executor at any time. The set of executors is managed by the Safe. contract ConfirmedTransactionModule is Module { string public constant NAME = "Confirmed Transaction Module"; string public constant VERSION = "0.1.0"; event Confirmed( bytes32 indexed transactionHash, address indexed manager ); event Revoked( bytes32 indexed transactionHash, address indexed manager ); event Executed( bytes32 indexed transactionHash, address indexed executor ); event ExecutorUpdated( address indexed executor, bool allowed ); enum TransactionStatus { Unknown, Confirmed, Executed } // transactionStatus maps transactionsHashes to their status mapping (bytes32 => TransactionStatus) private transactionStatus; // isExecutor mapping maps executor's address to executor status. mapping (address => bool) public isExecutor; modifier onlyExecutor() { require(isExecutor[msg.sender], "only executor can call"); _; } /// @dev Setup function sets manager function setup() public { setManager(); } /// @dev Adds an address to the executor allowlist. This can only be done via a Safe transaction. /// @param executor Executor address. /// @param allowed true if executor should be allowed, false otherwise. function setExecutor(address executor, bool allowed) public authorized { if (isExecutor[executor] != allowed) { isExecutor[executor] = allowed; emit ExecutorUpdated(executor, allowed); } } /// @dev Confirms a transaction to make it executable. This can only be done via a Safe transaction. /// @param transactionHash Transaction hash to be confirmed. function confirmTransaction(bytes32 transactionHash) public authorized { require(transactionStatus[transactionHash] == TransactionStatus.Unknown, "tx already confirmed"); transactionStatus[transactionHash] = TransactionStatus.Confirmed; emit Confirmed(transactionHash, msg.sender); } /// @dev Revokes a previous confirmation. This can only be done via a Safe transaction. /// @param transactionHash Transaction hash to be revoked. function revokeTransaction(bytes32 transactionHash) public authorized { require(transactionStatus[transactionHash] == TransactionStatus.Confirmed, "tx unknown or already executed"); transactionStatus[transactionHash] = TransactionStatus.Unknown; emit Revoked(transactionHash, msg.sender); } /// @dev Executes a confirmed transaction. Only designated executors can execute. /// @param to Destination address. /// @param value Ether value. /// @param data Data payload. /// @param operation Operation type. /// @param witness Witness for hash commitment. function executeTransaction( address to, uint256 value, bytes memory data, Enum.Operation operation, bytes32 witness ) public onlyExecutor { bytes32 transactionHash = getTransactionHash(to, value, data, operation, witness); require(transactionStatus[transactionHash] == TransactionStatus.Confirmed, "tx unknown or already executed"); transactionStatus[transactionHash] = TransactionStatus.Executed; require(manager.execTransactionFromModule(to, value, data, operation), "execution failed"); emit Executed(transactionHash, msg.sender); } /// @dev Gets the status of a transaction. /// @param transactionHash Hash of transaction whose status is queried. /// @return A tuple of bools (confirmed, executed) indicating whether the /// transactions has been confirmed and executed. function getTransactionStatus( bytes32 transactionHash ) public view returns (bool confirmed, bool executed) { TransactionStatus status = transactionStatus[transactionHash]; if (status == TransactionStatus.Unknown) { return (false, false); } else if (status == TransactionStatus.Confirmed) { return (true, false); } else if (status == TransactionStatus.Executed) { return (true, true); } else { // We should never reach this case assert(false); } } /// @dev Returns hash to be signed by owners. /// @param to Destination address. /// @param value Ether value. /// @param data Data payload. /// @param operation Operation type. /// @param witness Witness for hash commitment. /// @return Transaction hash. function getTransactionHash( address to, uint256 value, bytes memory data, Enum.Operation operation, bytes32 witness ) public pure returns (bytes32) { require(operation == Enum.Operation.Call || operation == Enum.Operation.DelegateCall, "unknown operation"); return keccak256(abi.encode(to, value, data, operation, witness)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"masterCopy","type":"address"}],"name":"ChangedMasterCopy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"transactionHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"Confirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"transactionHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"executor","type":"address"}],"name":"Executed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"bool","name":"allowed","type":"bool"}],"name":"ExecutorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"transactionHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"Revoked","type":"event"},{"constant":true,"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_masterCopy","type":"address"}],"name":"changeMasterCopy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"transactionHash","type":"bytes32"}],"name":"confirmTransaction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"},{"internalType":"bytes32","name":"witness","type":"bytes32"}],"name":"executeTransaction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"enum Enum.Operation","name":"operation","type":"uint8"},{"internalType":"bytes32","name":"witness","type":"bytes32"}],"name":"getTransactionHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"transactionHash","type":"bytes32"}],"name":"getTransactionStatus","outputs":[{"internalType":"bool","name":"confirmed","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExecutor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"manager","outputs":[{"internalType":"contract ModuleManager","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"transactionHash","type":"bytes32"}],"name":"revokeTransaction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"executor","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setExecutor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setup","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b5061154b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80637de7edef116100715780637de7edef146103bb57806394407465146103ff578063a3f4df7e14610450578063ba0bba40146104d3578063debfda30146104dd578063ffa1ad7414610539576100b4565b80631e1bff3f146100b95780632c09b32914610109578063481c6a75146102055780634884ef741461024f57806379716e431461027d5780637b346ea1146102ab575b600080fd5b610107600480360360408110156100cf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506105bc565b005b610203600480360360a081101561011f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561016657600080fd5b82018360208201111561017857600080fd5b8035906020019184600183028401116401000000008311171561019a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff16906020019092919080359060200190929190505050610767565b005b61020d610b3c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61027b6004803603602081101561026557600080fd5b8101908080359060200190929190505050610b62565b005b6102a96004803603602081101561029357600080fd5b8101908080359060200190929190505050610d30565b005b6103a5600480360360a08110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561030857600080fd5b82018360208201111561031a57600080fd5b8035906020019184600183028401116401000000008311171561033c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff16906020019092919080359060200190929190505050610efe565b6040518082815260200191505060405180910390f35b6103fd600480360360208110156103d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061109c565b005b61042b6004803603602081101561041557600080fd5b810190808035906020019092919050505061126e565b6040518083151515158152602001821515151581526020019250505060405180910390f35b610458611329565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561049857808201518184015260208101905061047d565b50505050905090810190601f1680156104c55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104db611362565b005b61051f600480360360208110156104f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061136c565b604051808215151515815260200191505060405180910390f35b61054161138c565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610581578082015181840152602081019050610566565b50505050905090810190601f1680156105ae5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610662576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806114f16026913960400191505060405180910390fd5b801515600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146107635780600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9fdbc2d48b8a0db2f62663bf9312ad02f5b1f6414ad600b55a247d09aeec3ea282604051808215151515815260200191505060405180910390a25b5050565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610826576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6f6e6c79206578656375746f722063616e2063616c6c0000000000000000000081525060200191505060405180910390fd5b60006108358686868686610efe565b90506001600281111561084457fe5b6002600083815260200190815260200160002060009054906101000a900460ff16600281111561087057fe5b146108e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f747820756e6b6e6f776e206f7220616c7265616479206578656375746564000081525060200191505060405180910390fd5b600280600083815260200190815260200160002060006101000a81548160ff0219169083600281111561091257fe5b0217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663468721a7878787876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018360018111156109b457fe5b60ff168152602001828103825284818151815260200191508051906020019080838360005b838110156109f45780820151818401526020810190506109d9565b50505050905090810190601f168015610a215780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015610a4357600080fd5b505af1158015610a57573d6000803e3d6000fd5b505050506040513d6020811015610a6d57600080fd5b8101908080519060200190929190505050610af0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f657865637574696f6e206661696c65640000000000000000000000000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16817f59c3746e635078efc737fb3f37dd8188203b8df10bbad35878a7d156f4f51c4160405160405180910390a3505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806114f16026913960400191505060405180910390fd5b60016002811115610c1557fe5b6002600083815260200190815260200160002060009054906101000a900460ff166002811115610c4157fe5b14610cb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f747820756e6b6e6f776e206f7220616c7265616479206578656375746564000081525060200191505060405180910390fd5b60006002600083815260200190815260200160002060006101000a81548160ff02191690836002811115610ce457fe5b02179055503373ffffffffffffffffffffffffffffffffffffffff16817f5bc2baf870c5baf189838b5e0b0e3b04a3263e2df5d305d1c15f3e6022f5dc4560405160405180910390a350565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dd6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806114f16026913960400191505060405180910390fd5b60006002811115610de357fe5b6002600083815260200190815260200160002060009054906101000a900460ff166002811115610e0f57fe5b14610e82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f747820616c726561647920636f6e6669726d656400000000000000000000000081525060200191505060405180910390fd5b60016002600083815260200190815260200160002060006101000a81548160ff02191690836002811115610eb257fe5b02179055503373ffffffffffffffffffffffffffffffffffffffff16817fd4964a7cd99f5c1fa8f2420fb5e1d3bd26eadf16e2658cf2e29a67dfda38601e60405160405180910390a350565b6000806001811115610f0c57fe5b836001811115610f1857fe5b1480610f395750600180811115610f2b57fe5b836001811115610f3757fe5b145b610fab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f756e6b6e6f776e206f7065726174696f6e00000000000000000000000000000081525060200191505060405180910390fd5b8585858585604051602001808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200180602001846001811115610fff57fe5b60ff168152602001838152602001828103825285818151815260200191508051906020019080838360005b8381101561104557808201518184015260208101905061102a565b50505050905090810190601f1680156110725780820380516001836020036101000a031916815260200191505b50965050505050505060405160208183030381529060405280519060200120905095945050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611142576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806114f16026913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806114cd6024913960400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f75e41bc35ff1bf14d81d1d2f649c0084a0f974f9289c803ec9898eeec4c8d0b881604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60008060006002600085815260200190815260200160002060009054906101000a900460ff169050600060028111156112a357fe5b8160028111156112af57fe5b14156112c2576000809250925050611324565b600160028111156112cf57fe5b8160028111156112db57fe5b14156112ef57600160009250925050611324565b6002808111156112fb57fe5b81600281111561130757fe5b141561131a576001809250925050611324565b600061132257fe5b505b915091565b6040518060400160405280601c81526020017f436f6e6669726d6564205472616e73616374696f6e204d6f64756c650000000081525081565b61136a6113c5565b565b60036020528060005260406000206000915054906101000a900460ff1681565b6040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d616e616765722068617320616c7265616479206265656e207365740000000081525060200191505060405180910390fd5b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555056fe496e76616c6964206d617374657220636f707920616464726573732070726f76696465644d6574686f642063616e206f6e6c792062652063616c6c65642066726f6d206d616e61676572a265627a7a72315820ef088e400f8572fd885e36348bcc199d7e0dd5d5ff73d8a70906daebcbe5fbf764736f6c63430005110032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80637de7edef116100715780637de7edef146103bb57806394407465146103ff578063a3f4df7e14610450578063ba0bba40146104d3578063debfda30146104dd578063ffa1ad7414610539576100b4565b80631e1bff3f146100b95780632c09b32914610109578063481c6a75146102055780634884ef741461024f57806379716e431461027d5780637b346ea1146102ab575b600080fd5b610107600480360360408110156100cf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506105bc565b005b610203600480360360a081101561011f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561016657600080fd5b82018360208201111561017857600080fd5b8035906020019184600183028401116401000000008311171561019a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff16906020019092919080359060200190929190505050610767565b005b61020d610b3c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61027b6004803603602081101561026557600080fd5b8101908080359060200190929190505050610b62565b005b6102a96004803603602081101561029357600080fd5b8101908080359060200190929190505050610d30565b005b6103a5600480360360a08110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561030857600080fd5b82018360208201111561031a57600080fd5b8035906020019184600183028401116401000000008311171561033c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff16906020019092919080359060200190929190505050610efe565b6040518082815260200191505060405180910390f35b6103fd600480360360208110156103d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061109c565b005b61042b6004803603602081101561041557600080fd5b810190808035906020019092919050505061126e565b6040518083151515158152602001821515151581526020019250505060405180910390f35b610458611329565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561049857808201518184015260208101905061047d565b50505050905090810190601f1680156104c55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104db611362565b005b61051f600480360360208110156104f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061136c565b604051808215151515815260200191505060405180910390f35b61054161138c565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610581578082015181840152602081019050610566565b50505050905090810190601f1680156105ae5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610662576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806114f16026913960400191505060405180910390fd5b801515600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146107635780600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9fdbc2d48b8a0db2f62663bf9312ad02f5b1f6414ad600b55a247d09aeec3ea282604051808215151515815260200191505060405180910390a25b5050565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610826576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6f6e6c79206578656375746f722063616e2063616c6c0000000000000000000081525060200191505060405180910390fd5b60006108358686868686610efe565b90506001600281111561084457fe5b6002600083815260200190815260200160002060009054906101000a900460ff16600281111561087057fe5b146108e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f747820756e6b6e6f776e206f7220616c7265616479206578656375746564000081525060200191505060405180910390fd5b600280600083815260200190815260200160002060006101000a81548160ff0219169083600281111561091257fe5b0217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663468721a7878787876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018360018111156109b457fe5b60ff168152602001828103825284818151815260200191508051906020019080838360005b838110156109f45780820151818401526020810190506109d9565b50505050905090810190601f168015610a215780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015610a4357600080fd5b505af1158015610a57573d6000803e3d6000fd5b505050506040513d6020811015610a6d57600080fd5b8101908080519060200190929190505050610af0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f657865637574696f6e206661696c65640000000000000000000000000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16817f59c3746e635078efc737fb3f37dd8188203b8df10bbad35878a7d156f4f51c4160405160405180910390a3505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806114f16026913960400191505060405180910390fd5b60016002811115610c1557fe5b6002600083815260200190815260200160002060009054906101000a900460ff166002811115610c4157fe5b14610cb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f747820756e6b6e6f776e206f7220616c7265616479206578656375746564000081525060200191505060405180910390fd5b60006002600083815260200190815260200160002060006101000a81548160ff02191690836002811115610ce457fe5b02179055503373ffffffffffffffffffffffffffffffffffffffff16817f5bc2baf870c5baf189838b5e0b0e3b04a3263e2df5d305d1c15f3e6022f5dc4560405160405180910390a350565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dd6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806114f16026913960400191505060405180910390fd5b60006002811115610de357fe5b6002600083815260200190815260200160002060009054906101000a900460ff166002811115610e0f57fe5b14610e82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f747820616c726561647920636f6e6669726d656400000000000000000000000081525060200191505060405180910390fd5b60016002600083815260200190815260200160002060006101000a81548160ff02191690836002811115610eb257fe5b02179055503373ffffffffffffffffffffffffffffffffffffffff16817fd4964a7cd99f5c1fa8f2420fb5e1d3bd26eadf16e2658cf2e29a67dfda38601e60405160405180910390a350565b6000806001811115610f0c57fe5b836001811115610f1857fe5b1480610f395750600180811115610f2b57fe5b836001811115610f3757fe5b145b610fab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f756e6b6e6f776e206f7065726174696f6e00000000000000000000000000000081525060200191505060405180910390fd5b8585858585604051602001808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200180602001846001811115610fff57fe5b60ff168152602001838152602001828103825285818151815260200191508051906020019080838360005b8381101561104557808201518184015260208101905061102a565b50505050905090810190601f1680156110725780820380516001836020036101000a031916815260200191505b50965050505050505060405160208183030381529060405280519060200120905095945050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611142576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806114f16026913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806114cd6024913960400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f75e41bc35ff1bf14d81d1d2f649c0084a0f974f9289c803ec9898eeec4c8d0b881604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60008060006002600085815260200190815260200160002060009054906101000a900460ff169050600060028111156112a357fe5b8160028111156112af57fe5b14156112c2576000809250925050611324565b600160028111156112cf57fe5b8160028111156112db57fe5b14156112ef57600160009250925050611324565b6002808111156112fb57fe5b81600281111561130757fe5b141561131a576001809250925050611324565b600061132257fe5b505b915091565b6040518060400160405280601c81526020017f436f6e6669726d6564205472616e73616374696f6e204d6f64756c650000000081525081565b61136a6113c5565b565b60036020528060005260406000206000915054906101000a900460ff1681565b6040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d616e616765722068617320616c7265616479206265656e207365740000000081525060200191505060405180910390fd5b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555056fe496e76616c6964206d617374657220636f707920616464726573732070726f76696465644d6574686f642063616e206f6e6c792062652063616c6c65642066726f6d206d616e61676572a265627a7a72315820ef088e400f8572fd885e36348bcc199d7e0dd5d5ff73d8a70906daebcbe5fbf764736f6c63430005110032
Deployed Bytecode Sourcemap
17675:5266:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17675:5266:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19075:260;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19075:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20663:659;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;20663:659:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;20663:659:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;20663:659:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;20663:659:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;20663:659:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3170:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20018:345;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20018:345:0;;;;;;;;;;;;;;;;;:::i;:::-;;19515:338;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19515:338:0;;;;;;;;;;;;;;;;;:::i;:::-;;22506:432;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;22506:432:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;22506:432:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;22506:432:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;22506:432:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;22506:432:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1243:310;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1243:310:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;21589:618;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21589:618:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17730:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;17730:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18775:69;;;:::i;:::-;;18561:43;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18561:43:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17797:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;17797:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19075:260;3270:7;;;;;;;;;;;3248:30;;:10;:30;;;3240:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19208:7;19184:31;;:10;:20;19195:8;19184:20;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;19180:148;;19255:7;19232:10;:20;19243:8;19232:20;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;19298:8;19282:34;;;19308:7;19282:34;;;;;;;;;;;;;;;;;;;;;;19180:148;19075:260;;:::o;20663:659::-;18656:10;:22;18667:10;18656:22;;;;;;;;;;;;;;;;;;;;;;;;;18648:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20886:23;20912:55;20931:2;20935:5;20942:4;20948:9;20959:7;20912:18;:55::i;:::-;20886:81;;21024:27;20986:65;;;;;;;;:17;:34;21004:15;20986:34;;;;;;;;;;;;;;;;;;;;;:65;;;;;;;;;20978:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21134:26;21097:17;:34;21115:15;21097:34;;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;;;;;;;;21179:7;;;;;;;;;;;:33;;;21213:2;21217:5;21224:4;21230:9;21179:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;21179:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21179:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21179:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21179:61:0;;;;;;;;;;;;;;;;21171:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21303:10;21277:37;;21286:15;21277:37;;;;;;;;;;18716:1;20663:659;;;;;:::o;3170:28::-;;;;;;;;;;;;;:::o;20018:345::-;3270:7;;;;;;;;;;;3248:30;;:10;:30;;;3240:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20168:27;20130:65;;;;;;;;:17;:34;20148:15;20130:34;;;;;;;;;;;;;;;;;;;;;:65;;;;;;;;;20122:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20278:25;20241:17;:34;20259:15;20241:34;;;;;;;;;;;;:62;;;;;;;;;;;;;;;;;;;;;;;;20344:10;20319:36;;20327:15;20319:36;;;;;;;;;;20018:345;:::o;19515:338::-;3270:7;;;;;;;;;;;3248:30;;:10;:30;;;3240:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19666:25;19628:63;;;;;;;;:17;:34;19646:15;19628:34;;;;;;;;;;;;;;;;;;;;;:63;;;;;;;;;19620:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19764:27;19727:17;:34;19745:15;19727:34;;;;;;;;;;;;:64;;;;;;;;;;;;;;;;;;;;;;;;19834:10;19807:38;;19817:15;19807:38;;;;;;;;;;19515:338;:::o;22506:432::-;22723:7;22769:19;22756:32;;;;;;;;:9;:32;;;;;;;;;:76;;;;22805:27;22792:40;;;;;;;;:9;:40;;;;;;;;;22756:76;22748:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22893:2;22897:5;22904:4;22910:9;22921:7;22882:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;22882:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;22882:47:0;;;22872:58;;;;;;22865:65;;22506:432;;;;;;;:::o;1243:310::-;3270:7;;;;;;;;;;;3248:30;;:10;:30;;;3240:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1421:1;1398:25;;:11;:25;;;;1390:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1488:11;1475:10;;:24;;;;;;;;;;;;;;;;;;1515:30;1533:11;1515:30;;;;;;;;;;;;;;;;;;;;;;1243:310;:::o;21589:618::-;21708:14;21724:13;21755:24;21782:17;:34;21800:15;21782:34;;;;;;;;;;;;;;;;;;;;;21755:61;;21841:25;21831:35;;;;;;;;:6;:35;;;;;;;;;21827:373;;;21891:5;21898;21883:21;;;;;;;21827:373;21936:27;21926:37;;;;;;;;:6;:37;;;;;;;;;21922:278;;;21988:4;21994:5;21980:20;;;;;;;21922:278;22032:26;22022:36;;;;;;;;:6;:36;;;;;;;;;22018:182;;;22083:4;22089;22075:19;;;;;;;22018:182;22182:5;22175:13;;;;21589:618;;;;;:::o;17730:60::-;;;;;;;;;;;;;;;;;;;:::o;18775:69::-;18824:12;:10;:12::i;:::-;18775:69::o;18561:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;17797:40::-;;;;;;;;;;;;;;;;;;;:::o;3349:316::-;3576:1;3548:30;;3556:7;;;;;;;;;;;3548:30;;;3540:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:10;3622:7;;:35;;;;;;;;;;;;;;;;;;3349:316::o
Swarm Source
bzzr://ef088e400f8572fd885e36348bcc199d7e0dd5d5ff73d8a70906daebcbe5fbf7
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in GLMR
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.