Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 1,386 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Execute | 10426384 | 2073 days ago | IN | 0 ETH | 0.00978752 | ||||
| Execute | 10398613 | 2077 days ago | IN | 0 ETH | 0.00428085 | ||||
| Execute | 10388535 | 2079 days ago | IN | 0 ETH | 0.00464772 | ||||
| Execute | 10382308 | 2080 days ago | IN | 0 ETH | 0.00441053 | ||||
| Execute | 10379591 | 2080 days ago | IN | 0 ETH | 0.006269 | ||||
| Execute | 10378874 | 2080 days ago | IN | 0 ETH | 0.00703478 | ||||
| Execute | 10376034 | 2081 days ago | IN | 0 ETH | 0.00412894 | ||||
| Execute | 10363172 | 2083 days ago | IN | 0 ETH | 0.00412951 | ||||
| Execute | 10304078 | 2092 days ago | IN | 0 ETH | 0.00355757 | ||||
| Execute | 10304039 | 2092 days ago | IN | 0 ETH | 0.00355678 | ||||
| Execute | 10303599 | 2092 days ago | IN | 0 ETH | 0.00446919 | ||||
| Execute | 10303058 | 2092 days ago | IN | 0 ETH | 0.0035034 | ||||
| Execute | 10196272 | 2109 days ago | IN | 0 ETH | 0.00218513 | ||||
| Execute | 10141377 | 2117 days ago | IN | 0 ETH | 0.00115131 | ||||
| Execute | 10123038 | 2120 days ago | IN | 0 ETH | 0.00357852 | ||||
| Execute | 10122522 | 2120 days ago | IN | 0 ETH | 0.00088473 | ||||
| Execute | 10108917 | 2122 days ago | IN | 0 ETH | 0.00163321 | ||||
| Execute | 10108887 | 2122 days ago | IN | 0 ETH | 0.01302152 | ||||
| Execute | 10097288 | 2124 days ago | IN | 0 ETH | 0.00541506 | ||||
| Execute | 10096453 | 2124 days ago | IN | 0 ETH | 0.00378408 | ||||
| Execute | 10096398 | 2124 days ago | IN | 0 ETH | 0.01348159 | ||||
| Execute | 10094133 | 2125 days ago | IN | 0 ETH | 0.0011415 | ||||
| Execute | 10092417 | 2125 days ago | IN | 0 ETH | 0.0013743 | ||||
| Execute | 10085043 | 2126 days ago | IN | 0 ETH | 0.00061626 | ||||
| Execute | 10084943 | 2126 days ago | IN | 0 ETH | 0.00147962 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ApprovedTransfer
Compiler Version
v0.5.4+commit.9549d8ff
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2019-12-02
*/
pragma solidity ^0.5.4;
/**
* ERC20 contract interface.
*/
contract ERC20 {
function totalSupply() public view returns (uint);
function decimals() public view returns (uint);
function balanceOf(address tokenOwner) public view returns (uint balance);
function allowance(address tokenOwner, address spender) public view returns (uint remaining);
function transfer(address to, uint tokens) public returns (bool success);
function approve(address spender, uint tokens) public returns (bool success);
function transferFrom(address from, address to, uint tokens) public returns (bool success);
}
/**
* @title Module
* @dev Interface for a module.
* A module MUST implement the addModule() method to ensure that a wallet with at least one module
* can never end up in a "frozen" state.
* @author Julien Niset - <[email protected]>
*/
interface Module {
function init(BaseWallet _wallet) external;
function addModule(BaseWallet _wallet, Module _module) external;
function recoverToken(address _token) external;
}
/**
* @title BaseWallet
* @dev Simple modular wallet that authorises modules to call its invoke() method.
* Based on https://gist.github.com/Arachnid/a619d31f6d32757a4328a428286da186 by
* @author Julien Niset - <[email protected]>
*/
contract BaseWallet {
address public implementation;
address public owner;
mapping (address => bool) public authorised;
mapping (bytes4 => address) public enabled;
uint public modules;
function init(address _owner, address[] calldata _modules) external;
function authoriseModule(address _module, bool _value) external;
function enableStaticCall(address _module, bytes4 _method) external;
function setOwner(address _newOwner) external;
function invoke(address _target, uint _value, bytes calldata _data) external returns (bytes memory _result);
}
/**
* @title ModuleRegistry
* @dev Registry of authorised modules.
* Modules must be registered before they can be authorised on a wallet.
* @author Julien Niset - <[email protected]>
*/
contract ModuleRegistry {
function registerModule(address _module, bytes32 _name) external;
function deregisterModule(address _module) external;
function registerUpgrader(address _upgrader, bytes32 _name) external;
function deregisterUpgrader(address _upgrader) external;
function recoverToken(address _token) external;
function moduleInfo(address _module) external view returns (bytes32);
function upgraderInfo(address _upgrader) external view returns (bytes32);
function isRegisteredModule(address _module) external view returns (bool);
function isRegisteredModule(address[] calldata _modules) external view returns (bool);
function isRegisteredUpgrader(address _upgrader) external view returns (bool);
}
contract TokenPriceProvider {
mapping(address => uint256) public cachedPrices;
function setPrice(ERC20 _token, uint256 _price) public;
function setPriceForTokenList(ERC20[] calldata _tokens, uint256[] calldata _prices) external;
function getEtherValue(uint256 _amount, address _token) external view returns (uint256);
}
/**
* @title GuardianStorage
* @dev Contract storing the state of wallets related to guardians and lock.
* The contract only defines basic setters and getters with no logic. Only modules authorised
* for a wallet can modify its state.
* @author Julien Niset - <[email protected]>
* @author Olivier Van Den Biggelaar - <[email protected]>
*/
contract GuardianStorage {
function addGuardian(BaseWallet _wallet, address _guardian) external;
function revokeGuardian(BaseWallet _wallet, address _guardian) external;
function guardianCount(BaseWallet _wallet) external view returns (uint256);
function getGuardians(BaseWallet _wallet) external view returns (address[] memory);
function isGuardian(BaseWallet _wallet, address _guardian) external view returns (bool);
function setLock(BaseWallet _wallet, uint256 _releaseAfter) external;
function isLocked(BaseWallet _wallet) external view returns (bool);
function getLock(BaseWallet _wallet) external view returns (uint256);
function getLocker(BaseWallet _wallet) external view returns (address);
}
/**
* @title TransferStorage
* @dev Contract storing the state of wallets related to transfers (limit and whitelist).
* The contract only defines basic setters and getters with no logic. Only modules authorised
* for a wallet can modify its state.
* @author Julien Niset - <[email protected]>
*/
contract TransferStorage {
function setWhitelist(BaseWallet _wallet, address _target, uint256 _value) external;
function getWhitelist(BaseWallet _wallet, address _target) external view returns (uint256);
}
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
library SafeMath {
/**
* @dev Multiplies two numbers, reverts on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0); // Solidity only automatically asserts when dividing by 0
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a);
uint256 c = a - b;
return c;
}
/**
* @dev Adds two numbers, reverts on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a);
return c;
}
/**
* @dev Divides two numbers and returns the remainder (unsigned integer modulo),
* reverts when dividing by zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b != 0);
return a % b;
}
/**
* @dev Returns ceil(a / b).
*/
function ceil(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a / b;
if(a % b == 0) {
return c;
}
else {
return c + 1;
}
}
}
library GuardianUtils {
/**
* @dev Checks if an address is an account guardian or an account authorised to sign on behalf of a smart-contract guardian
* given a list of guardians.
* @param _guardians the list of guardians
* @param _guardian the address to test
* @return true and the list of guardians minus the found guardian upon success, false and the original list of guardians if not found.
*/
function isGuardian(address[] memory _guardians, address _guardian) internal view returns (bool, address[] memory) {
if(_guardians.length == 0 || _guardian == address(0)) {
return (false, _guardians);
}
bool isFound = false;
address[] memory updatedGuardians = new address[](_guardians.length - 1);
uint256 index = 0;
for (uint256 i = 0; i < _guardians.length; i++) {
if(!isFound) {
// check if _guardian is an account guardian
if(_guardian == _guardians[i]) {
isFound = true;
continue;
}
// check if _guardian is the owner of a smart contract guardian
if(isContract(_guardians[i]) && isGuardianOwner(_guardians[i], _guardian)) {
isFound = true;
continue;
}
}
if(index < updatedGuardians.length) {
updatedGuardians[index] = _guardians[i];
index++;
}
}
return isFound ? (true, updatedGuardians) : (false, _guardians);
}
/**
* @dev Checks if an address is a contract.
* @param _addr The address.
*/
function isContract(address _addr) internal view returns (bool) {
uint32 size;
// solium-disable-next-line security/no-inline-assembly
assembly {
size := extcodesize(_addr)
}
return (size > 0);
}
/**
* @dev Checks if an address is the owner of a guardian contract.
* The method does not revert if the call to the owner() method consumes more then 5000 gas.
* @param _guardian The guardian contract
* @param _owner The owner to verify.
*/
function isGuardianOwner(address _guardian, address _owner) internal view returns (bool) {
address owner = address(0);
bytes4 sig = bytes4(keccak256("owner()"));
// solium-disable-next-line security/no-inline-assembly
assembly {
let ptr := mload(0x40)
mstore(ptr,sig)
let result := staticcall(5000, _guardian, ptr, 0x20, ptr, 0x20)
if eq(result, 1) {
owner := mload(ptr)
}
}
return owner == _owner;
}
}
/**
* @title BaseModule
* @dev Basic module that contains some methods common to all modules.
* @author Julien Niset - <[email protected]>
*/
contract BaseModule is Module {
// Empty calldata
bytes constant internal EMPTY_BYTES = "";
// The adddress of the module registry.
ModuleRegistry internal registry;
// The address of the Guardian storage
GuardianStorage internal guardianStorage;
/**
* @dev Throws if the wallet is locked.
*/
modifier onlyWhenUnlocked(BaseWallet _wallet) {
// solium-disable-next-line security/no-block-members
require(!guardianStorage.isLocked(_wallet), "BM: wallet must be unlocked");
_;
}
event ModuleCreated(bytes32 name);
event ModuleInitialised(address wallet);
constructor(ModuleRegistry _registry, GuardianStorage _guardianStorage, bytes32 _name) public {
registry = _registry;
guardianStorage = _guardianStorage;
emit ModuleCreated(_name);
}
/**
* @dev Throws if the sender is not the target wallet of the call.
*/
modifier onlyWallet(BaseWallet _wallet) {
require(msg.sender == address(_wallet), "BM: caller must be wallet");
_;
}
/**
* @dev Throws if the sender is not the owner of the target wallet or the module itself.
*/
modifier onlyWalletOwner(BaseWallet _wallet) {
require(msg.sender == address(this) || isOwner(_wallet, msg.sender), "BM: must be an owner for the wallet");
_;
}
/**
* @dev Throws if the sender is not the owner of the target wallet.
*/
modifier strictOnlyWalletOwner(BaseWallet _wallet) {
require(isOwner(_wallet, msg.sender), "BM: msg.sender must be an owner for the wallet");
_;
}
/**
* @dev Inits the module for a wallet by logging an event.
* The method can only be called by the wallet itself.
* @param _wallet The wallet.
*/
function init(BaseWallet _wallet) public onlyWallet(_wallet) {
emit ModuleInitialised(address(_wallet));
}
/**
* @dev Adds a module to a wallet. First checks that the module is registered.
* @param _wallet The target wallet.
* @param _module The modules to authorise.
*/
function addModule(BaseWallet _wallet, Module _module) external strictOnlyWalletOwner(_wallet) {
require(registry.isRegisteredModule(address(_module)), "BM: module is not registered");
_wallet.authoriseModule(address(_module), true);
}
/**
* @dev Utility method enbaling anyone to recover ERC20 token sent to the
* module by mistake and transfer them to the Module Registry.
* @param _token The token to recover.
*/
function recoverToken(address _token) external {
uint total = ERC20(_token).balanceOf(address(this));
ERC20(_token).transfer(address(registry), total);
}
/**
* @dev Helper method to check if an address is the owner of a target wallet.
* @param _wallet The target wallet.
* @param _addr The address.
*/
function isOwner(BaseWallet _wallet, address _addr) internal view returns (bool) {
return _wallet.owner() == _addr;
}
/**
* @dev Helper method to invoke a wallet.
* @param _wallet The target wallet.
* @param _to The target address for the transaction.
* @param _value The value of the transaction.
* @param _data The data of the transaction.
*/
function invokeWallet(address _wallet, address _to, uint256 _value, bytes memory _data) internal returns (bytes memory _res) {
bool success;
// solium-disable-next-line security/no-call-value
(success, _res) = _wallet.call(abi.encodeWithSignature("invoke(address,uint256,bytes)", _to, _value, _data));
if(success && _res.length > 0) { //_res is empty if _wallet is an "old" BaseWallet that can't return output values
(_res) = abi.decode(_res, (bytes));
} else if (_res.length > 0) {
// solium-disable-next-line security/no-inline-assembly
assembly {
returndatacopy(0, 0, returndatasize)
revert(0, returndatasize)
}
} else if(!success) {
revert("BM: wallet invoke reverted");
}
}
}
/**
* @title RelayerModule
* @dev Base module containing logic to execute transactions signed by eth-less accounts and sent by a relayer.
* @author Julien Niset - <[email protected]>
*/
contract RelayerModule is BaseModule {
uint256 constant internal BLOCKBOUND = 10000;
mapping (address => RelayerConfig) public relayer;
struct RelayerConfig {
uint256 nonce;
mapping (bytes32 => bool) executedTx;
}
event TransactionExecuted(address indexed wallet, bool indexed success, bytes32 signedHash);
/**
* @dev Throws if the call did not go through the execute() method.
*/
modifier onlyExecute {
require(msg.sender == address(this), "RM: must be called via execute()");
_;
}
/* ***************** Abstract method ************************* */
/**
* @dev Gets the number of valid signatures that must be provided to execute a
* specific relayed transaction.
* @param _wallet The target wallet.
* @param _data The data of the relayed transaction.
* @return The number of required signatures.
*/
function getRequiredSignatures(BaseWallet _wallet, bytes memory _data) internal view returns (uint256);
/**
* @dev Validates the signatures provided with a relayed transaction.
* The method MUST throw if one or more signatures are not valid.
* @param _wallet The target wallet.
* @param _data The data of the relayed transaction.
* @param _signHash The signed hash representing the relayed transaction.
* @param _signatures The signatures as a concatenated byte array.
*/
function validateSignatures(BaseWallet _wallet, bytes memory _data, bytes32 _signHash, bytes memory _signatures) internal view returns (bool);
/* ************************************************************ */
/**
* @dev Executes a relayed transaction.
* @param _wallet The target wallet.
* @param _data The data for the relayed transaction
* @param _nonce The nonce used to prevent replay attacks.
* @param _signatures The signatures as a concatenated byte array.
* @param _gasPrice The gas price to use for the gas refund.
* @param _gasLimit The gas limit to use for the gas refund.
*/
function execute(
BaseWallet _wallet,
bytes calldata _data,
uint256 _nonce,
bytes calldata _signatures,
uint256 _gasPrice,
uint256 _gasLimit
)
external
returns (bool success)
{
uint startGas = gasleft();
bytes32 signHash = getSignHash(address(this), address(_wallet), 0, _data, _nonce, _gasPrice, _gasLimit);
require(checkAndUpdateUniqueness(_wallet, _nonce, signHash), "RM: Duplicate request");
require(verifyData(address(_wallet), _data), "RM: the wallet authorized is different then the target of the relayed data");
uint256 requiredSignatures = getRequiredSignatures(_wallet, _data);
if((requiredSignatures * 65) == _signatures.length) {
if(verifyRefund(_wallet, _gasLimit, _gasPrice, requiredSignatures)) {
if(requiredSignatures == 0 || validateSignatures(_wallet, _data, signHash, _signatures)) {
// solium-disable-next-line security/no-call-value
(success,) = address(this).call(_data);
refund(_wallet, startGas - gasleft(), _gasPrice, _gasLimit, requiredSignatures, msg.sender);
}
}
}
emit TransactionExecuted(address(_wallet), success, signHash);
}
/**
* @dev Gets the current nonce for a wallet.
* @param _wallet The target wallet.
*/
function getNonce(BaseWallet _wallet) external view returns (uint256 nonce) {
return relayer[address(_wallet)].nonce;
}
/**
* @dev Generates the signed hash of a relayed transaction according to ERC 1077.
* @param _from The starting address for the relayed transaction (should be the module)
* @param _to The destination address for the relayed transaction (should be the wallet)
* @param _value The value for the relayed transaction
* @param _data The data for the relayed transaction
* @param _nonce The nonce used to prevent replay attacks.
* @param _gasPrice The gas price to use for the gas refund.
* @param _gasLimit The gas limit to use for the gas refund.
*/
function getSignHash(
address _from,
address _to,
uint256 _value,
bytes memory _data,
uint256 _nonce,
uint256 _gasPrice,
uint256 _gasLimit
)
internal
pure
returns (bytes32)
{
return keccak256(
abi.encodePacked(
"\x19Ethereum Signed Message:\n32",
keccak256(abi.encodePacked(byte(0x19), byte(0), _from, _to, _value, _data, _nonce, _gasPrice, _gasLimit))
));
}
/**
* @dev Checks if the relayed transaction is unique.
* @param _wallet The target wallet.
* @param _nonce The nonce
* @param _signHash The signed hash of the transaction
*/
function checkAndUpdateUniqueness(BaseWallet _wallet, uint256 _nonce, bytes32 _signHash) internal returns (bool) {
if(relayer[address(_wallet)].executedTx[_signHash] == true) {
return false;
}
relayer[address(_wallet)].executedTx[_signHash] = true;
return true;
}
/**
* @dev Checks that a nonce has the correct format and is valid.
* It must be constructed as nonce = {block number}{timestamp} where each component is 16 bytes.
* @param _wallet The target wallet.
* @param _nonce The nonce
*/
function checkAndUpdateNonce(BaseWallet _wallet, uint256 _nonce) internal returns (bool) {
if(_nonce <= relayer[address(_wallet)].nonce) {
return false;
}
uint256 nonceBlock = (_nonce & 0xffffffffffffffffffffffffffffffff00000000000000000000000000000000) >> 128;
if(nonceBlock > block.number + BLOCKBOUND) {
return false;
}
relayer[address(_wallet)].nonce = _nonce;
return true;
}
/**
* @dev Recovers the signer at a given position from a list of concatenated signatures.
* @param _signedHash The signed hash
* @param _signatures The concatenated signatures.
* @param _index The index of the signature to recover.
*/
function recoverSigner(bytes32 _signedHash, bytes memory _signatures, uint _index) internal pure returns (address) {
uint8 v;
bytes32 r;
bytes32 s;
// we jump 32 (0x20) as the first slot of bytes contains the length
// we jump 65 (0x41) per signature
// for v we load 32 bytes ending with v (the first 31 come from s) then apply a mask
// solium-disable-next-line security/no-inline-assembly
assembly {
r := mload(add(_signatures, add(0x20,mul(0x41,_index))))
s := mload(add(_signatures, add(0x40,mul(0x41,_index))))
v := and(mload(add(_signatures, add(0x41,mul(0x41,_index)))), 0xff)
}
require(v == 27 || v == 28);
return ecrecover(_signedHash, v, r, s);
}
/**
* @dev Refunds the gas used to the Relayer.
* For security reasons the default behavior is to not refund calls with 0 or 1 signatures.
* @param _wallet The target wallet.
* @param _gasUsed The gas used.
* @param _gasPrice The gas price for the refund.
* @param _gasLimit The gas limit for the refund.
* @param _signatures The number of signatures used in the call.
* @param _relayer The address of the Relayer.
*/
function refund(BaseWallet _wallet, uint _gasUsed, uint _gasPrice, uint _gasLimit, uint _signatures, address _relayer) internal {
uint256 amount = 29292 + _gasUsed; // 21000 (transaction) + 7620 (execution of refund) + 672 to log the event + _gasUsed
// only refund if gas price not null, more than 1 signatures, gas less than gasLimit
if(_gasPrice > 0 && _signatures > 1 && amount <= _gasLimit) {
if(_gasPrice > tx.gasprice) {
amount = amount * tx.gasprice;
}
else {
amount = amount * _gasPrice;
}
invokeWallet(address(_wallet), _relayer, amount, EMPTY_BYTES);
}
}
/**
* @dev Returns false if the refund is expected to fail.
* @param _wallet The target wallet.
* @param _gasUsed The expected gas used.
* @param _gasPrice The expected gas price for the refund.
*/
function verifyRefund(BaseWallet _wallet, uint _gasUsed, uint _gasPrice, uint _signatures) internal view returns (bool) {
if(_gasPrice > 0
&& _signatures > 1
&& (address(_wallet).balance < _gasUsed * _gasPrice || _wallet.authorised(address(this)) == false)) {
return false;
}
return true;
}
/**
* @dev Checks that the wallet address provided as the first parameter of the relayed data is the same
* as the wallet passed as the input of the execute() method.
@return false if the addresses are different.
*/
function verifyData(address _wallet, bytes memory _data) private pure returns (bool) {
require(_data.length >= 36, "RM: Invalid dataWallet");
address dataWallet;
// solium-disable-next-line security/no-inline-assembly
assembly {
//_data = {length:32}{sig:4}{_wallet:32}{...}
dataWallet := mload(add(_data, 0x24))
}
return dataWallet == _wallet;
}
/**
* @dev Parses the data to extract the method signature.
*/
function functionPrefix(bytes memory _data) internal pure returns (bytes4 prefix) {
require(_data.length >= 4, "RM: Invalid functionPrefix");
// solium-disable-next-line security/no-inline-assembly
assembly {
prefix := mload(add(_data, 0x20))
}
}
}
/**
* @title BaseTransfer
* @dev Module containing internal methods to execute or approve transfers
* @author Olivier VDB - <[email protected]>
*/
contract BaseTransfer is BaseModule {
// Mock token address for ETH
address constant internal ETH_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
// *************** Events *************************** //
event Transfer(address indexed wallet, address indexed token, uint256 indexed amount, address to, bytes data);
event Approved(address indexed wallet, address indexed token, uint256 amount, address spender);
event CalledContract(address indexed wallet, address indexed to, uint256 amount, bytes data);
// *************** Internal Functions ********************* //
/**
* @dev Helper method to transfer ETH or ERC20 for a wallet.
* @param _wallet The target wallet.
* @param _token The ERC20 address.
* @param _to The recipient.
* @param _value The amount of ETH to transfer
* @param _data The data to *log* with the transfer.
*/
function doTransfer(BaseWallet _wallet, address _token, address _to, uint256 _value, bytes memory _data) internal {
if(_token == ETH_TOKEN) {
invokeWallet(address(_wallet), _to, _value, EMPTY_BYTES);
}
else {
bytes memory methodData = abi.encodeWithSignature("transfer(address,uint256)", _to, _value);
invokeWallet(address(_wallet), _token, 0, methodData);
}
emit Transfer(address(_wallet), _token, _value, _to, _data);
}
/**
* @dev Helper method to approve spending the ERC20 of a wallet.
* @param _wallet The target wallet.
* @param _token The ERC20 address.
* @param _spender The spender address.
* @param _value The amount of token to transfer.
*/
function doApproveToken(BaseWallet _wallet, address _token, address _spender, uint256 _value) internal {
bytes memory methodData = abi.encodeWithSignature("approve(address,uint256)", _spender, _value);
invokeWallet(address(_wallet), _token, 0, methodData);
emit Approved(address(_wallet), _token, _value, _spender);
}
/**
* @dev Helper method to call an external contract.
* @param _wallet The target wallet.
* @param _contract The contract address.
* @param _value The ETH value to transfer.
* @param _data The method data.
*/
function doCallContract(BaseWallet _wallet, address _contract, uint256 _value, bytes memory _data) internal {
invokeWallet(address(_wallet), _contract, _value, _data);
emit CalledContract(address(_wallet), _contract, _value, _data);
}
}
/**
* @title ApprovedTransfer
* @dev Module to transfer tokens (ETH or ERC20) with the approval of guardians.
* @author Julien Niset - <[email protected]>
*/
contract ApprovedTransfer is BaseModule, RelayerModule, BaseTransfer {
bytes32 constant NAME = "ApprovedTransfer";
constructor(ModuleRegistry _registry, GuardianStorage _guardianStorage) BaseModule(_registry, _guardianStorage, NAME) public {
}
/**
* @dev transfers tokens (ETH or ERC20) from a wallet.
* @param _wallet The target wallet.
* @param _token The address of the token to transfer.
* @param _to The destination address
* @param _amount The amoutnof token to transfer
* @param _data The data for the transaction (only for ETH transfers)
*/
function transferToken(
BaseWallet _wallet,
address _token,
address _to,
uint256 _amount,
bytes calldata _data
)
external
onlyExecute
onlyWhenUnlocked(_wallet)
{
doTransfer(_wallet, _token, _to, _amount, _data);
}
/**
* @dev call a contract.
* @param _wallet The target wallet.
* @param _contract The address of the contract.
* @param _value The amount of ETH to transfer as part of call
* @param _data The encoded method data
*/
function callContract(
BaseWallet _wallet,
address _contract,
uint256 _value,
bytes calldata _data
)
external
onlyExecute
onlyWhenUnlocked(_wallet)
{
require(!_wallet.authorised(_contract) && _contract != address(_wallet), "AT: Forbidden contract");
doCallContract(_wallet, _contract, _value, _data);
}
// *************** Implementation of RelayerModule methods ********************* //
function validateSignatures(
BaseWallet _wallet,
bytes memory /* _data */,
bytes32 _signHash,
bytes memory _signatures
)
internal
view
returns (bool)
{
address lastSigner = address(0);
address[] memory guardians = guardianStorage.getGuardians(_wallet);
bool isGuardian = false;
for (uint8 i = 0; i < _signatures.length / 65; i++) {
address signer = recoverSigner(_signHash, _signatures, i);
if(i == 0) {
// AT: first signer must be owner
if(!isOwner(_wallet, signer)) {
return false;
}
}
else {
// "AT: signers must be different"
if(signer <= lastSigner) {
return false;
}
lastSigner = signer;
(isGuardian, guardians) = GuardianUtils.isGuardian(guardians, signer);
// "AT: signatures not valid"
if(!isGuardian) {
return false;
}
}
}
return true;
}
function getRequiredSignatures(BaseWallet _wallet, bytes memory /* _data */) internal view returns (uint256) {
// owner + [n/2] guardians
return 1 + SafeMath.ceil(guardianStorage.guardianCount(_wallet), 2);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"getNonce","outputs":[{"name":"nonce","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_token","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"transferToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_module","type":"address"}],"name":"addModule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"recoverToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_data","type":"bytes"},{"name":"_nonce","type":"uint256"},{"name":"_signatures","type":"bytes"},{"name":"_gasPrice","type":"uint256"},{"name":"_gasLimit","type":"uint256"}],"name":"execute","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"relayer","outputs":[{"name":"nonce","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_contract","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"callContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_registry","type":"address"},{"name":"_guardianStorage","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"token","type":"address"},{"indexed":true,"name":"amount","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"spender","type":"address"}],"name":"Approved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"}],"name":"CalledContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"success","type":"bool"},{"indexed":false,"name":"signedHash","type":"bytes32"}],"name":"TransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"bytes32"}],"name":"ModuleCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"wallet","type":"address"}],"name":"ModuleInitialised","type":"event"}]Contract Creation Code
608060405234801561001057600080fd5b50604051604080611e4a8339810180604052604081101561003057600080fd5b50805160209182015160008054600160a060020a03808516600160a060020a0319928316179092556001805492841692909116919091179055604080517f417070726f7665645472616e736665720000000000000000000000000000000080825291519394929385938593927f3019c8fc80239e3dff8f781212ae2004839c2cb61d6c70acd279ac65392145df929081900390910190a15050505050611d6f806100db6000396000f3fe608060405234801561001057600080fd5b50600436106100a5576000357c0100000000000000000000000000000000000000000000000000000000900480639be65a60116100785780639be65a60146101d0578063aacaaf88146101f6578063c9b5ef8e146102e6578063fd6ac3091461030c576100a5565b806319ab453c146100aa5780632d0335ab146100d25780632df546f41461010a5780635a1db8c4146101a2575b600080fd5b6100d0600480360360208110156100c057600080fd5b5035600160a060020a031661039c565b005b6100f8600480360360208110156100e857600080fd5b5035600160a060020a0316610442565b60408051918252519081900360200190f35b6100d0600480360360a081101561012057600080fd5b600160a060020a03823581169260208101358216926040820135909216916060820135919081019060a08101608082013564010000000081111561016357600080fd5b82018360208201111561017557600080fd5b8035906020019184600183028401116401000000008311171561019757600080fd5b50909250905061045d565b6100d0600480360360408110156101b857600080fd5b50600160a060020a03813581169160200135166105f4565b6100d0600480360360208110156101e657600080fd5b5035600160a060020a03166107b0565b6102d2600480360360c081101561020c57600080fd5b600160a060020a03823516919081019060408101602082013564010000000081111561023757600080fd5b82018360208201111561024957600080fd5b8035906020019184600183028401116401000000008311171561026b57600080fd5b9193909282359260408101906020013564010000000081111561028d57600080fd5b82018360208201111561029f57600080fd5b803590602001918460018302840111640100000000831117156102c157600080fd5b9193509150803590602001356108e3565b604080519115158252519081900360200190f35b6100f8600480360360208110156102fc57600080fd5b5035600160a060020a0316610bcb565b6100d06004803603608081101561032257600080fd5b600160a060020a0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561035d57600080fd5b82018360208201111561036f57600080fd5b8035906020019184600183028401116401000000008311171561039157600080fd5b509092509050610bdd565b8033600160a060020a038216146104025760408051600080516020611d24833981519152815260206004820152601960248201527f424d3a2063616c6c6572206d7573742062652077616c6c657400000000000000604482015290519081900360640190fd5b60408051600160a060020a038416815290517f9fcca3f73f85397e2bf03647abf243c20b753bd54463ff3cae74de2971c112fa9181900360200190a15050565b600160a060020a031660009081526002602052604090205490565b3330146104b95760408051600080516020611d24833981519152815260206004820181905260248201527f524d3a206d7573742062652063616c6c65642076696120657865637574652829604482015290519081900360640190fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a03808a166004830152915189939290921691634a4fbeec91602480820192602092909190829003018186803b15801561052257600080fd5b505afa158015610536573d6000803e3d6000fd5b505050506040513d602081101561054c57600080fd5b5051156105a85760408051600080516020611d24833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b6105eb8787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e8a92505050565b50505050505050565b816105ff8133611025565b151561064457604051600080516020611d24833981519152815260040180806020018281038252602e815260200180611cf6602e913960400191505060405180910390fd5b600054604080517f0bcd4ebb000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015291519190921691630bcd4ebb916024808301926020929190829003018186803b1580156106aa57600080fd5b505afa1580156106be573d6000803e3d6000fd5b505050506040513d60208110156106d457600080fd5b505115156107315760408051600080516020611d24833981519152815260206004820152601c60248201527f424d3a206d6f64756c65206973206e6f74207265676973746572656400000000604482015290519081900360640190fd5b604080517f1f17732d000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015260016024830152915191851691631f17732d9160448082019260009290919082900301818387803b15801561079c57600080fd5b505af11580156105eb573d6000803e3d6000fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600091600160a060020a038416916370a0823191602480820192602092909190829003018186803b15801561081357600080fd5b505afa158015610827573d6000803e3d6000fd5b505050506040513d602081101561083d57600080fd5b505160008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201526024810185905290519394509085169263a9059cbb92604480840193602093929083900390910190829087803b1580156108b357600080fd5b505af11580156108c7573d6000803e3d6000fd5b505050506040513d60208110156108dd57600080fd5b50505050565b6000805a90506000610933308c60008d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92508c91508b90506110c5565b90506109408b8983611208565b151561099b5760408051600080516020611d24833981519152815260206004820152601560248201527f524d3a204475706c696361746520726571756573740000000000000000000000604482015290519081900360640190fd5b6109db8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061128092505050565b1515610a2057604051600080516020611d24833981519152815260040180806020018281038252604a815260200180611cac604a913960600191505060405180910390fd5b6000610a628c8c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112f992505050565b905060418102871415610b7a57610a7b8c8688846113a0565b15610b7a57801580610afe5750610afe8c8c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815288935091508d908d908190840183828082843760009201919091525061147392505050565b15610b7a5730600160a060020a03168b8b604051808383808284376040519201945060009350909150508083038183865af19150503d8060008114610b5f576040519150601f19603f3d011682016040523d82523d6000602084013e610b64565b606091505b505080945050610b7a8c5a850388888533611620565b60408051838152905185151591600160a060020a038f16917f6bb0b384ce772133df63560651bc8c727c53306cec1d51e2cbf8ea35fb8f2ec19181900360200190a350505098975050505050505050565b60026020526000908152604090205481565b333014610c395760408051600080516020611d24833981519152815260206004820181905260248201527f524d3a206d7573742062652063616c6c65642076696120657865637574652829604482015290519081900360640190fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038089166004830152915188939290921691634a4fbeec91602480820192602092909190829003018186803b158015610ca257600080fd5b505afa158015610cb6573d6000803e3d6000fd5b505050506040513d6020811015610ccc57600080fd5b505115610d285760408051600080516020611d24833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b85600160a060020a031663d6eb1bbf866040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600160a060020a0316600160a060020a0316815260200191505060206040518083038186803b158015610d9a57600080fd5b505afa158015610dae573d6000803e3d6000fd5b505050506040513d6020811015610dc457600080fd5b5051158015610de5575085600160a060020a031685600160a060020a031614155b1515610e405760408051600080516020611d24833981519152815260206004820152601660248201527f41543a20466f7262696464656e20636f6e747261637400000000000000000000604482015290519081900360640190fd5b610e8286868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061167e92505050565b505050505050565b600160a060020a03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610ed157610ecb8584846020604051908101604052806000815250611746565b50610f56565b60408051600160a060020a038516602482015260448082018590528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610f538686600084611746565b50505b8184600160a060020a031686600160a060020a03167fd5c97f2e041b2046be3b4337472f05720760a198f4d7d84980b7155eec7cca6f86856040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610fe3578181015183820152602001610fcb565b50505050905090810190601f1680156110105780820380516001836020036101000a031916815260200191505b50935050505060405180910390a45050505050565b600081600160a060020a031683600160a060020a0316638da5cb5b6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561108657600080fd5b505afa15801561109a573d6000803e3d6000fd5b505050506040513d60208110156110b057600080fd5b5051600160a060020a03161490505b92915050565b6040517f190000000000000000000000000000000000000000000000000000000000000060208083018281526000602185018190526c01000000000000000000000000600160a060020a03808e16820260228801528c16026036860152604a85018a90528851909485938d938d938d938d938d938d938d939192606a909201918701908083835b6020831061116b5780518252601f19909201916020918201910161114c565b51815160209384036101000a600019018019909216911617905292019586525084810193909352506040808401919091528051808403820181526060840182528051908301207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006080850152609c808501919091528151808503909101815260bc909301905281519101209e9d5050505050505050505050505050565b600160a060020a0383166000908152600260209081526040808320848452600190810190925282205460ff161515141561124457506000611279565b50600160a060020a03831660009081526002602090815260408083208484526001908101909252909120805460ff1916821790555b9392505050565b600060248251101515156112e35760408051600080516020611d24833981519152815260206004820152601660248201527f524d3a20496e76616c6964206461746157616c6c657400000000000000000000604482015290519081900360640190fd5b5060240151600160a060020a0391821691161490565b600154604080517f5040fb76000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301529151600093611396931691635040fb76916024808301926020929190829003018186803b15801561136357600080fd5b505afa158015611377573d6000803e3d6000fd5b505050506040513d602081101561138d57600080fd5b505160026119ce565b6001019392505050565b600080831180156113b15750600182115b801561145a575082840285600160a060020a031631108061145a5750604080517fd6eb1bbf0000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a0387169163d6eb1bbf916024808301926020929190829003018186803b15801561142c57600080fd5b505afa158015611440573d6000803e3d6000fd5b505050506040513d602081101561145657600080fd5b5051155b156114675750600061146b565b5060015b949350505050565b600154604080517ff18858ab000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301529151600093849360609391169163f18858ab916024808201928792909190829003018186803b1580156114df57600080fd5b505afa1580156114f3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561151c57600080fd5b81019080805164010000000081111561153457600080fd5b8201602081018481111561154757600080fd5b815185602082028301116401000000008211171561156457600080fd5b509094506000935083925050505b8551604190048160ff16101561161157600061159288888460ff16611a02565b905060ff821615156115c1576115a88a82611025565b15156115bc5760009550505050505061146b565b611608565b600160a060020a03808616908216116115e25760009550505050505061146b565b8094506115ef8482611aac565b945092508215156116085760009550505050505061146b565b50600101611572565b50600198975050505050505050565b61726c85016000851180156116355750600183115b80156116415750838111155b156105eb573a851115611655573a02611658565b84025b6116748783836020604051908101604052806000815250611746565b5050505050505050565b61168a84848484611746565b5082600160a060020a031684600160a060020a03167fbfbd7fb6c6d7dd1ef01d18a7e98333f084363d82d5ce600328e8b941a53d665484846040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156117055781810151838201526020016116ed565b50505050905090810190601f1680156117325780820380516001836020036101000a031916815260200191505b50935050505060405180910390a350505050565b6060600085600160a060020a03168585856040516024018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156117b557818101518382015260200161179d565b50505050905090810190601f1680156117e25780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8f6f033200000000000000000000000000000000000000000000000000000000178152905182519297509550859450925090508083835b6020831061186e5780518252601f19909201916020918201910161184f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146118d0576040519150601f19603f3d011682016040523d82523d6000602084013e6118d5565b606091505b50925090508080156118e8575060008251115b156119555781806020019051602081101561190257600080fd5b81019080805164010000000081111561191a57600080fd5b8201602081018481111561192d57600080fd5b815164010000000081118282018710171561194757600080fd5b509095506119c59350505050565b600082511115611969573d6000803e3d6000fd5b8015156119c55760408051600080516020611d24833981519152815260206004820152601a60248201527f424d3a2077616c6c657420696e766f6b65207265766572746564000000000000604482015290519081900360640190fd5b50949350505050565b60008082848115156119dc57fe5b04905082848115156119ea57fe5b0615156119f85790506110bf565b60010190506110bf565b6041808202830160208101516040820151919092015160009260ff9190911691601b831480611a3457508260ff16601c145b1515611a3f57600080fd5b604080516000815260208082018084528a905260ff8616828401526060820185905260808201849052915160019260a0808401939192601f1981019281900390910190855afa158015611a96573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b60006060835160001480611ac75750600160a060020a038316155b15611ad757506000905082611c22565b600080905060606001865103604051908082528060200260200182016040528015611b0c578160200160208202803883390190505b5090506000805b8751811015611c0857831515611bb3578781815181101515611b3157fe5b90602001906020020151600160a060020a031687600160a060020a03161415611b5d5760019350611c00565b611b7d8882815181101515611b6e57fe5b90602001906020020151611c29565b8015611ba55750611ba58882815181101515611b9557fe5b9060200190602002015188611c37565b15611bb35760019350611c00565b8251821015611c00578781815181101515611bca57fe5b906020019060200201518383815181101515611be257fe5b600160a060020a039092166020928302909101909101526001909101905b600101611b13565b5082611c1657600087611c1a565b6001825b945094505050505b9250929050565b6000903b63ffffffff161190565b604080517f6f776e657228290000000000000000000000000000000000000000000000000081529051908190036007018120808252600091829190602081818189611388fa6001811415611c8a57815193505b505083600160a060020a031682600160a060020a031614925050509291505056fe524d3a207468652077616c6c657420617574686f72697a656420697320646966666572656e74207468656e2074686520746172676574206f66207468652072656c617965642064617461424d3a206d73672e73656e646572206d75737420626520616e206f776e657220666f72207468652077616c6c657408c379a000000000000000000000000000000000000000000000000000000000a165627a7a723058209943d0ee514d0d9bacea196bdcd09ebb8e636c1561c80dc0dfc986407799644c0029000000000000000000000000c17d432bd8e8850fd7b32b0270f5afac65db010500000000000000000000000044da3a8051ba88eab0440db3779cab9d679ae76f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100a5576000357c0100000000000000000000000000000000000000000000000000000000900480639be65a60116100785780639be65a60146101d0578063aacaaf88146101f6578063c9b5ef8e146102e6578063fd6ac3091461030c576100a5565b806319ab453c146100aa5780632d0335ab146100d25780632df546f41461010a5780635a1db8c4146101a2575b600080fd5b6100d0600480360360208110156100c057600080fd5b5035600160a060020a031661039c565b005b6100f8600480360360208110156100e857600080fd5b5035600160a060020a0316610442565b60408051918252519081900360200190f35b6100d0600480360360a081101561012057600080fd5b600160a060020a03823581169260208101358216926040820135909216916060820135919081019060a08101608082013564010000000081111561016357600080fd5b82018360208201111561017557600080fd5b8035906020019184600183028401116401000000008311171561019757600080fd5b50909250905061045d565b6100d0600480360360408110156101b857600080fd5b50600160a060020a03813581169160200135166105f4565b6100d0600480360360208110156101e657600080fd5b5035600160a060020a03166107b0565b6102d2600480360360c081101561020c57600080fd5b600160a060020a03823516919081019060408101602082013564010000000081111561023757600080fd5b82018360208201111561024957600080fd5b8035906020019184600183028401116401000000008311171561026b57600080fd5b9193909282359260408101906020013564010000000081111561028d57600080fd5b82018360208201111561029f57600080fd5b803590602001918460018302840111640100000000831117156102c157600080fd5b9193509150803590602001356108e3565b604080519115158252519081900360200190f35b6100f8600480360360208110156102fc57600080fd5b5035600160a060020a0316610bcb565b6100d06004803603608081101561032257600080fd5b600160a060020a0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561035d57600080fd5b82018360208201111561036f57600080fd5b8035906020019184600183028401116401000000008311171561039157600080fd5b509092509050610bdd565b8033600160a060020a038216146104025760408051600080516020611d24833981519152815260206004820152601960248201527f424d3a2063616c6c6572206d7573742062652077616c6c657400000000000000604482015290519081900360640190fd5b60408051600160a060020a038416815290517f9fcca3f73f85397e2bf03647abf243c20b753bd54463ff3cae74de2971c112fa9181900360200190a15050565b600160a060020a031660009081526002602052604090205490565b3330146104b95760408051600080516020611d24833981519152815260206004820181905260248201527f524d3a206d7573742062652063616c6c65642076696120657865637574652829604482015290519081900360640190fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a03808a166004830152915189939290921691634a4fbeec91602480820192602092909190829003018186803b15801561052257600080fd5b505afa158015610536573d6000803e3d6000fd5b505050506040513d602081101561054c57600080fd5b5051156105a85760408051600080516020611d24833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b6105eb8787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e8a92505050565b50505050505050565b816105ff8133611025565b151561064457604051600080516020611d24833981519152815260040180806020018281038252602e815260200180611cf6602e913960400191505060405180910390fd5b600054604080517f0bcd4ebb000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015291519190921691630bcd4ebb916024808301926020929190829003018186803b1580156106aa57600080fd5b505afa1580156106be573d6000803e3d6000fd5b505050506040513d60208110156106d457600080fd5b505115156107315760408051600080516020611d24833981519152815260206004820152601c60248201527f424d3a206d6f64756c65206973206e6f74207265676973746572656400000000604482015290519081900360640190fd5b604080517f1f17732d000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015260016024830152915191851691631f17732d9160448082019260009290919082900301818387803b15801561079c57600080fd5b505af11580156105eb573d6000803e3d6000fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600091600160a060020a038416916370a0823191602480820192602092909190829003018186803b15801561081357600080fd5b505afa158015610827573d6000803e3d6000fd5b505050506040513d602081101561083d57600080fd5b505160008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201526024810185905290519394509085169263a9059cbb92604480840193602093929083900390910190829087803b1580156108b357600080fd5b505af11580156108c7573d6000803e3d6000fd5b505050506040513d60208110156108dd57600080fd5b50505050565b6000805a90506000610933308c60008d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92508c91508b90506110c5565b90506109408b8983611208565b151561099b5760408051600080516020611d24833981519152815260206004820152601560248201527f524d3a204475706c696361746520726571756573740000000000000000000000604482015290519081900360640190fd5b6109db8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061128092505050565b1515610a2057604051600080516020611d24833981519152815260040180806020018281038252604a815260200180611cac604a913960600191505060405180910390fd5b6000610a628c8c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112f992505050565b905060418102871415610b7a57610a7b8c8688846113a0565b15610b7a57801580610afe5750610afe8c8c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815288935091508d908d908190840183828082843760009201919091525061147392505050565b15610b7a5730600160a060020a03168b8b604051808383808284376040519201945060009350909150508083038183865af19150503d8060008114610b5f576040519150601f19603f3d011682016040523d82523d6000602084013e610b64565b606091505b505080945050610b7a8c5a850388888533611620565b60408051838152905185151591600160a060020a038f16917f6bb0b384ce772133df63560651bc8c727c53306cec1d51e2cbf8ea35fb8f2ec19181900360200190a350505098975050505050505050565b60026020526000908152604090205481565b333014610c395760408051600080516020611d24833981519152815260206004820181905260248201527f524d3a206d7573742062652063616c6c65642076696120657865637574652829604482015290519081900360640190fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038089166004830152915188939290921691634a4fbeec91602480820192602092909190829003018186803b158015610ca257600080fd5b505afa158015610cb6573d6000803e3d6000fd5b505050506040513d6020811015610ccc57600080fd5b505115610d285760408051600080516020611d24833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b85600160a060020a031663d6eb1bbf866040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600160a060020a0316600160a060020a0316815260200191505060206040518083038186803b158015610d9a57600080fd5b505afa158015610dae573d6000803e3d6000fd5b505050506040513d6020811015610dc457600080fd5b5051158015610de5575085600160a060020a031685600160a060020a031614155b1515610e405760408051600080516020611d24833981519152815260206004820152601660248201527f41543a20466f7262696464656e20636f6e747261637400000000000000000000604482015290519081900360640190fd5b610e8286868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061167e92505050565b505050505050565b600160a060020a03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610ed157610ecb8584846020604051908101604052806000815250611746565b50610f56565b60408051600160a060020a038516602482015260448082018590528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610f538686600084611746565b50505b8184600160a060020a031686600160a060020a03167fd5c97f2e041b2046be3b4337472f05720760a198f4d7d84980b7155eec7cca6f86856040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610fe3578181015183820152602001610fcb565b50505050905090810190601f1680156110105780820380516001836020036101000a031916815260200191505b50935050505060405180910390a45050505050565b600081600160a060020a031683600160a060020a0316638da5cb5b6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561108657600080fd5b505afa15801561109a573d6000803e3d6000fd5b505050506040513d60208110156110b057600080fd5b5051600160a060020a03161490505b92915050565b6040517f190000000000000000000000000000000000000000000000000000000000000060208083018281526000602185018190526c01000000000000000000000000600160a060020a03808e16820260228801528c16026036860152604a85018a90528851909485938d938d938d938d938d938d938d939192606a909201918701908083835b6020831061116b5780518252601f19909201916020918201910161114c565b51815160209384036101000a600019018019909216911617905292019586525084810193909352506040808401919091528051808403820181526060840182528051908301207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006080850152609c808501919091528151808503909101815260bc909301905281519101209e9d5050505050505050505050505050565b600160a060020a0383166000908152600260209081526040808320848452600190810190925282205460ff161515141561124457506000611279565b50600160a060020a03831660009081526002602090815260408083208484526001908101909252909120805460ff1916821790555b9392505050565b600060248251101515156112e35760408051600080516020611d24833981519152815260206004820152601660248201527f524d3a20496e76616c6964206461746157616c6c657400000000000000000000604482015290519081900360640190fd5b5060240151600160a060020a0391821691161490565b600154604080517f5040fb76000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301529151600093611396931691635040fb76916024808301926020929190829003018186803b15801561136357600080fd5b505afa158015611377573d6000803e3d6000fd5b505050506040513d602081101561138d57600080fd5b505160026119ce565b6001019392505050565b600080831180156113b15750600182115b801561145a575082840285600160a060020a031631108061145a5750604080517fd6eb1bbf0000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a0387169163d6eb1bbf916024808301926020929190829003018186803b15801561142c57600080fd5b505afa158015611440573d6000803e3d6000fd5b505050506040513d602081101561145657600080fd5b5051155b156114675750600061146b565b5060015b949350505050565b600154604080517ff18858ab000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301529151600093849360609391169163f18858ab916024808201928792909190829003018186803b1580156114df57600080fd5b505afa1580156114f3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561151c57600080fd5b81019080805164010000000081111561153457600080fd5b8201602081018481111561154757600080fd5b815185602082028301116401000000008211171561156457600080fd5b509094506000935083925050505b8551604190048160ff16101561161157600061159288888460ff16611a02565b905060ff821615156115c1576115a88a82611025565b15156115bc5760009550505050505061146b565b611608565b600160a060020a03808616908216116115e25760009550505050505061146b565b8094506115ef8482611aac565b945092508215156116085760009550505050505061146b565b50600101611572565b50600198975050505050505050565b61726c85016000851180156116355750600183115b80156116415750838111155b156105eb573a851115611655573a02611658565b84025b6116748783836020604051908101604052806000815250611746565b5050505050505050565b61168a84848484611746565b5082600160a060020a031684600160a060020a03167fbfbd7fb6c6d7dd1ef01d18a7e98333f084363d82d5ce600328e8b941a53d665484846040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156117055781810151838201526020016116ed565b50505050905090810190601f1680156117325780820380516001836020036101000a031916815260200191505b50935050505060405180910390a350505050565b6060600085600160a060020a03168585856040516024018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156117b557818101518382015260200161179d565b50505050905090810190601f1680156117e25780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8f6f033200000000000000000000000000000000000000000000000000000000178152905182519297509550859450925090508083835b6020831061186e5780518252601f19909201916020918201910161184f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146118d0576040519150601f19603f3d011682016040523d82523d6000602084013e6118d5565b606091505b50925090508080156118e8575060008251115b156119555781806020019051602081101561190257600080fd5b81019080805164010000000081111561191a57600080fd5b8201602081018481111561192d57600080fd5b815164010000000081118282018710171561194757600080fd5b509095506119c59350505050565b600082511115611969573d6000803e3d6000fd5b8015156119c55760408051600080516020611d24833981519152815260206004820152601a60248201527f424d3a2077616c6c657420696e766f6b65207265766572746564000000000000604482015290519081900360640190fd5b50949350505050565b60008082848115156119dc57fe5b04905082848115156119ea57fe5b0615156119f85790506110bf565b60010190506110bf565b6041808202830160208101516040820151919092015160009260ff9190911691601b831480611a3457508260ff16601c145b1515611a3f57600080fd5b604080516000815260208082018084528a905260ff8616828401526060820185905260808201849052915160019260a0808401939192601f1981019281900390910190855afa158015611a96573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b60006060835160001480611ac75750600160a060020a038316155b15611ad757506000905082611c22565b600080905060606001865103604051908082528060200260200182016040528015611b0c578160200160208202803883390190505b5090506000805b8751811015611c0857831515611bb3578781815181101515611b3157fe5b90602001906020020151600160a060020a031687600160a060020a03161415611b5d5760019350611c00565b611b7d8882815181101515611b6e57fe5b90602001906020020151611c29565b8015611ba55750611ba58882815181101515611b9557fe5b9060200190602002015188611c37565b15611bb35760019350611c00565b8251821015611c00578781815181101515611bca57fe5b906020019060200201518383815181101515611be257fe5b600160a060020a039092166020928302909101909101526001909101905b600101611b13565b5082611c1657600087611c1a565b6001825b945094505050505b9250929050565b6000903b63ffffffff161190565b604080517f6f776e657228290000000000000000000000000000000000000000000000000081529051908190036007018120808252600091829190602081818189611388fa6001811415611c8a57815193505b505083600160a060020a031682600160a060020a031614925050509291505056fe524d3a207468652077616c6c657420617574686f72697a656420697320646966666572656e74207468656e2074686520746172676574206f66207468652072656c617965642064617461424d3a206d73672e73656e646572206d75737420626520616e206f776e657220666f72207468652077616c6c657408c379a000000000000000000000000000000000000000000000000000000000a165627a7a723058209943d0ee514d0d9bacea196bdcd09ebb8e636c1561c80dc0dfc986407799644c0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c17d432bd8e8850fd7b32b0270f5afac65db010500000000000000000000000044da3a8051ba88eab0440db3779cab9d679ae76f
-----Decoded View---------------
Arg [0] : _registry (address): 0xc17D432Bd8e8850Fd7b32B0270f5AfAc65DB0105
Arg [1] : _guardianStorage (address): 0x44DA3A8051bA88EAB0440DB3779cAB9D679ae76f
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c17d432bd8e8850fd7b32b0270f5afac65db0105
Arg [1] : 00000000000000000000000044da3a8051ba88eab0440db3779cab9d679ae76f
Deployed Bytecode Sourcemap
27339:3121:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27339:3121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11805:120;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11805:120:0;-1:-1:-1;;;;;11805:120:0;;:::i;:::-;;17978:133;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17978:133:0;-1:-1:-1;;;;;17978:133:0;;:::i;:::-;;;;;;;;;;;;;;;;27957:309;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;27957:309:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;27957:309:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;27957:309: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;-1:-1;27957:309:0;;-1:-1:-1;27957:309:0;-1:-1:-1;27957:309:0;:::i;12126:258::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12126:258:0;;;;;;;;;;:::i;12598:176::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12598:176:0;-1:-1:-1;;;;;12598:176:0;;:::i;16524:1339::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;16524:1339:0;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;16524:1339:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;16524:1339: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;16524:1339:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;16524:1339:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;16524:1339: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;16524:1339:0;;-1:-1:-1;16524:1339:0;-1:-1:-1;16524:1339:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;14511:49;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14511:49:0;-1:-1:-1;;;;;14511:49:0;;:::i;28525:398::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;28525:398:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;28525:398:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;28525:398: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;-1:-1;28525:398:0;;-1:-1:-1;28525:398:0;-1:-1:-1;28525:398:0;:::i;11805:120::-;11857:7;10969:10;-1:-1:-1;;;;;10969:30:0;;;10961:68;;;;;-1:-1:-1;;;;;;;;;;;10961:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11882:35;;;-1:-1:-1;;;;;11882:35:0;;;;;;;;;;;;;;;11805:120;;:::o;17978:133::-;-1:-1:-1;;;;;18072:25:0;18039:13;18072:25;;;:7;:25;;;;;:31;;17978:133::o;27957:309::-;14908:10;14930:4;14908:27;14900:72;;;;;-1:-1:-1;;;;;;;;;;;14900:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10417:15;;:33;;;;;;-1:-1:-1;;;;;10417:33:0;;;;;;;;;28185:7;;10417:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;10417:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10417:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10417:33:0;10416:34;10408:74;;;;;-1:-1:-1;;;;;;;;;;;10408:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28210:48;28221:7;28230:6;28238:3;28243:7;28252:5;;28210:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;28210:10:0;;-1:-1:-1;;;28210:48:0:i;:::-;14983:1;27957:309;;;;;;:::o;12126:258::-;12212:7;11521:28;11529:7;11538:10;11521:7;:28::i;:::-;11513:87;;;;;;-1:-1:-1;;;;;;;;;;;11513:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12240:8;;:45;;;;;;-1:-1:-1;;;;;12240:45:0;;;;;;;;;:8;;;;;:27;;:45;;;;;;;;;;;;;;:8;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;12240:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12240:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12240:45:0;12232:86;;;;;;;-1:-1:-1;;;;;;;;;;;12232:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12329:47;;;;;;-1:-1:-1;;;;;12329:47:0;;;;;;;12371:4;12329:47;;;;;;:23;;;;;;:47;;;;;-1:-1:-1;;12329:47:0;;;;;;;;-1:-1:-1;12329:23:0;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;12329:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;12598:176:0;12669:38;;;;;;12701:4;12669:38;;;;;;12656:10;;-1:-1:-1;;;;;12669:23:0;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;12669:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12669:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12669:38:0;12749:8;;;12718:48;;;;;;-1:-1:-1;;;;;12749:8:0;;;12718:48;;;;;;;;;;;;12669:38;;-1:-1:-1;12718:22:0;;;;;;:48;;;;;12669:38;;12718:48;;;;;;;;;;;:22;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;12718:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12718:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;12598:176:0:o;16524:1339::-;16762:12;16792:13;16808:9;16792:25;;16828:16;16847:84;16867:4;16882:7;16892:1;16895:5;;16847:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;16902:6:0;;-1:-1:-1;16910:9:0;;-1:-1:-1;16921:9:0;;-1:-1:-1;16847:11:0;:84::i;:::-;16828:103;;16950:51;16975:7;16984:6;16992:8;16950:24;:51::i;:::-;16942:85;;;;;;;-1:-1:-1;;;;;;;;;;;16942:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17046:35;17065:7;17075:5;;17046:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;17046:10:0;;-1:-1:-1;;;17046:35:0:i;:::-;17038:122;;;;;;-1:-1:-1;;;;;;;;;;;17038:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17171:26;17200:37;17222:7;17231:5;;17200:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;17200:21:0;;-1:-1:-1;;;17200:37:0:i;:::-;17171:66;-1:-1:-1;17273:2:0;17252:23;;17251:47;;17248:536;;;17318:63;17331:7;17340:9;17351;17362:18;17318:12;:63::i;:::-;17315:458;;;17405:23;;;:84;;;17432:57;17451:7;17460:5;;17432:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;17432:57:0;;;;137:4:-1;17432:57:0;;;;;;;;;;;;;;;;;17467:8;;-1:-1:-1;17432:57:0;-1:-1:-1;17477:11:0;;;;;;17432:57;;17477:11;;;;17432:57;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;17432:18:0;;-1:-1:-1;;;17432:57:0:i;:::-;17402:356;;;17607:4;-1:-1:-1;;;;;17599:18:0;17618:5;;17599:25;;;;;30:3:-1;22:6;14;1:33;17599:25:0;;45:16:-1;;;-1:-1;17599:25:0;;-1:-1:-1;17599:25:0;;-1:-1:-1;;17599:25:0;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;17586:38:0;;;;;17647:91;17654:7;17674:9;17663:8;:20;17685:9;17696;17707:18;17727:10;17647:6;:91::i;:::-;17799:56;;;;;;;;;;;;-1:-1:-1;;;;;17799:56:0;;;;;;;;;;;;16524:1339;;;;;;;;;;;;;:::o;14511:49::-;;;;;;;;;;;;;:::o;28525:398::-;14908:10;14930:4;14908:27;14900:72;;;;;-1:-1:-1;;;;;;;;;;;14900:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10417:15;;:33;;;;;;-1:-1:-1;;;;;10417:33:0;;;;;;;;;28732:7;;10417:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;10417:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10417:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10417:33:0;10416:34;10408:74;;;;;-1:-1:-1;;;;;;;;;;;10408:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28766:7;-1:-1:-1;;;;;28766:18:0;;28785:9;28766:29;;;;;;;;;;;;;-1:-1:-1;;;;;28766:29:0;-1:-1:-1;;;;;28766:29:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28766:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28766:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28766:29:0;28765:30;:63;;;;;28820:7;-1:-1:-1;;;;;28799:29:0;:9;-1:-1:-1;;;;;28799:29:0;;;28765:63;28757:98;;;;;;;-1:-1:-1;;;;;;;;;;;28757:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28866:49;28881:7;28890:9;28901:6;28909:5;;28866:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;28866:14:0;;-1:-1:-1;;;28866:49:0:i;:::-;14983:1;28525:398;;;;;:::o;25524:510::-;-1:-1:-1;;;;;25652:19:0;;24717:42;25652:19;25649:308;;;25688:56;25709:7;25719:3;25724:6;25732:11;;;;;;;;;;;;;25688:12;:56::i;:::-;;25649:308;;;25812:65;;;-1:-1:-1;;;;;25812:65:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;25812:65:0;;;;;;;;25:18:-1;;61:17;;25812:65:0;182:15:-1;25812:65:0;179:29:-1;160:49;;25892:53:0;25913:7;25923:6;-1:-1:-1;25812:65:0;25892:12;:53::i;:::-;;25649:308;;26007:6;25999;-1:-1:-1;;;;;25972:54:0;25989:7;-1:-1:-1;;;;;25972:54:0;;26015:3;26020:5;25972:54;;;;-1:-1:-1;;;;;25972:54:0;-1:-1:-1;;;;;25972:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;25972:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25524:510;;;;;:::o;12959:131::-;13034:4;13077:5;-1:-1:-1;;;;;13058:24:0;:7;-1:-1:-1;;;;;13058:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13058:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13058:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13058:15:0;-1:-1:-1;;;;;13058:24:0;;;-1:-1:-1;12959:131:0;;;;;:::o;18716:528::-;19129:94;;19146:10;19129:94;;;;;;;18975:7;19129:94;;;;;;;-1:-1:-1;;;;;19129:94:0;;;;;;;;;;;;;;;;;;;;;;;;18975:7;;;;19167:5;;19174:3;;19179:6;;19187:5;;19194:6;;19202:9;;19213;;19129:94;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;19129:94:0;;;;;-1:-1:-1;19129:94:0;;;;;;;-1:-1:-1;19129:94:0;;;;;;;;;;26:21:-1;;;22:32;;6:49;;19129:94:0;;;;;19119:105;;;;;;19031:204;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;19031:204:0;;;;;;19007:229;;;;;;18716:528;-1:-1:-1;;;;;;;;;;;;;;18716:528:0:o;19457:317::-;-1:-1:-1;;;;;19584:25:0;;19564:4;19584:25;;;:7;:25;;;;;;;;:47;;;:36;;;;:47;;;;;;;;:55;;;19581:99;;;-1:-1:-1;19663:5:0;19656:12;;19581:99;-1:-1:-1;;;;;;19690:25:0;;;;;;:7;:25;;;;;;;;:47;;;19740:4;19690:36;;;:47;;;;;;:54;;-1:-1:-1;;19690:54:0;;;;;19457:317;;;;;;:::o;23618:431::-;23697:4;23738:2;23722:5;:12;:18;;23714:53;;;;;;;-1:-1:-1;;;;;;;;;;;23714:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23986:4:0;23975:16;23969:23;-1:-1:-1;;;;;24020:21:0;;;;;;;23618:431::o;30224:233::-;30407:15;;:38;;;;;;-1:-1:-1;;;;;30407:38:0;;;;;;;;;30324:7;;30393:56;;30407:15;;:29;;:38;;;;;;;;;;;;;;:15;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;30407:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30407:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30407:38:0;30447:1;30393:13;:56::i;:::-;30389:1;:60;;30224:233;-1:-1:-1;;;30224:233:0:o;23007:361::-;23121:4;23153:1;23141:9;:13;:45;;;;;23185:1;23171:11;:15;23141:45;:157;;;;;23242:9;23231:8;:20;23212:7;-1:-1:-1;;;;;23204:24:0;;:47;:93;;;-1:-1:-1;23255:33:0;;;;;;23282:4;23255:33;;;;;;-1:-1:-1;;;;;23255:18:0;;;;;:33;;;;;;;;;;;;;;:18;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;23255:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23255:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23255:33:0;:42;23204:93;23138:201;;;-1:-1:-1;23322:5:0;23315:12;;23138:201;-1:-1:-1;23356:4:0;23007:361;;;;;;;:::o;29022:1194::-;29327:15;;:37;;;;;;-1:-1:-1;;;;;29327:37:0;;;;;;;;;29234:4;;;;29298:26;;29327:15;;;:28;;:37;;;;;29234:4;;29327:37;;;;;;;;:15;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;29327:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29327:37:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;29327:37:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;29327:37:0;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;-1:-1;29327:37:0;;-1:-1:-1;29375:15:0;;-1:-1:-1;29375:15:0;;-1:-1:-1;;;29409:778:0;29431:18;;29452:2;;29431:23;29427:1;:27;;;29409:778;;;29476:14;29493:40;29507:9;29518:11;29531:1;29493:40;;:13;:40::i;:::-;29476:57;-1:-1:-1;29551:6:0;;;;29548:628;;;29633:24;29641:7;29650:6;29633:7;:24::i;:::-;29632:25;29629:85;;;29689:5;29682:12;;;;;;;;;29629:85;29548:628;;;-1:-1:-1;;;;;29822:20:0;;;;;;;29819:80;;29874:5;29867:12;;;;;;;;;29819:80;29930:6;29917:19;;29981:43;30006:9;30017:6;29981:24;:43::i;:::-;29955:69;-1:-1:-1;29955:69:0;-1:-1:-1;30093:11:0;;30090:71;;;30136:5;30129:12;;;;;;;;;30090:71;-1:-1:-1;29456:3:0;;29409:778;;;-1:-1:-1;30204:4:0;;29022:1194;-1:-1:-1;;;;;;;;29022:1194:0:o;22066:705::-;22222:5;:16;;22205:14;22432:13;;:32;;;;;22463:1;22449:11;:15;22432:32;:55;;;;;22478:9;22468:6;:19;;22432:55;22429:335;;;22519:11;22507:9;:23;22504:173;;;22569:11;22560:20;22504:173;;;22643:18;;22504:173;22691:61;22712:7;22722:8;22732:6;22740:11;;;;;;;;;;;;;22691:12;:61::i;:::-;;22066:705;;;;;;;:::o;26909:257::-;27028:56;27049:7;27059:9;27070:6;27078:5;27028:12;:56::i;:::-;;27133:9;-1:-1:-1;;;;;27100:58:0;27123:7;-1:-1:-1;;;;;27100:58:0;;27144:6;27152:5;27100:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27100:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26909:257;;;;:::o;13366:845::-;13472:17;13502:12;13603:7;-1:-1:-1;;;;;13603:12:0;13673:3;13678:6;13686:5;13616:76;;;;;;-1:-1:-1;;;;;13616:76:0;-1:-1:-1;;;;;13616:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;13616:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13616:76:0;;;-1:-1:-1;;26:21;;;22:32;6:49;;13616:76:0;;;49:4:-1;25:18;;61:17;;13616:76:0;182:15:-1;13616:76:0;179:29:-1;160:49;;13603:90:0;;;;13616:76;;-1:-1:-1;13603:90:0;-1:-1:-1;13603:90:0;;-1:-1:-1;25:18;-1:-1;13603:90:0;-1:-1:-1;13603:90:0;;25:18:-1;36:153;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;13603:90:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;13585:108:0;-1:-1:-1;13585:108:0;-1:-1:-1;13585:108:0;13707:26;;;;;13732:1;13718:4;:11;:15;13707:26;13704:500;;;13852:4;13841:25;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13841:25:0;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;261:11;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;-1:-1;13841:25:0;;-1:-1:-1;13704:500:0;;-1:-1:-1;;;;13704:500:0;;13902:1;13888:4;:11;:15;13884:320;;;14038:14;14035:1;14032;14017:36;14081:14;14078:1;14071:25;13998:113;14132:7;14131:8;14128:76;;;14156:36;;;-1:-1:-1;;;;;;;;;;;14156:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;14128:76;13366:845;;;;;;;:::o;6747:218::-;6806:7;6826:9;6842:1;6838;:5;;;;;;;;6826:17;;6861:1;6857;:5;;;;;;;;:10;6854:104;;;6891:1;-1:-1:-1;6884:8:0;;6854:104;6945:1;6941:5;;-1:-1:-1;6934:12:0;;20788:800;21317:4;21313:16;;;21287:44;;21308:4;21287:44;;21281:51;21378:4;21357:44;;21351:51;21431:44;;;;21425:51;20894:7;;21478:4;21421:62;;;;;21517:2;21512:7;;;:18;;;21523:1;:7;;21528:2;21523:7;21512:18;21504:27;;;;;;;;21549:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21549:31:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;21549:31:0;;-1:-1:-1;;21549:31:0;;;20788:800;-1:-1:-1;;;;;;;;20788:800:0:o;7413:1180::-;7504:4;7510:16;7542:10;:17;7563:1;7542:22;:49;;;-1:-1:-1;;;;;;7568:23:0;;;7542:49;7539:107;;;-1:-1:-1;7616:5:0;;-1:-1:-1;7623:10:0;7608:26;;7539:107;7656:12;7671:5;7656:20;;7687:33;7757:1;7737:10;:17;:21;7723:36;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;7723:36:0;-1:-1:-1;7687:72:0;-1:-1:-1;7770:13:0;;7798:714;7822:10;:17;7818:1;:21;7798:714;;;7865:7;7864:8;7861:490;;;7971:10;7982:1;7971:13;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7958:26:0;:9;-1:-1:-1;;;;;7958:26:0;;7955:119;;;8019:4;8009:14;;8046:8;;7955:119;8176:25;8187:10;8198:1;8187:13;;;;;;;;;;;;;;;;;;8176:10;:25::i;:::-;:70;;;;;8205:41;8221:10;8232:1;8221:13;;;;;;;;;;;;;;;;;;8236:9;8205:15;:41::i;:::-;8173:163;;;8281:4;8271:14;;8308:8;;8173:163;8376:16;:23;8368:5;:31;8365:136;;;8446:10;8457:1;8446:13;;;;;;;;;;;;;;;;;;8420:16;8437:5;8420:23;;;;;;;;;;-1:-1:-1;;;;;8420:39:0;;;:23;;;;;;;;;;:39;8478:7;;;;;8365:136;7841:3;;7798:714;;;;8529:7;:56;;8567:5;8574:10;8529:56;;;8540:4;8546:16;8529:56;8522:63;;;;;;;7413:1180;;;;;;:::o;8698:258::-;8756:4;8892:18;;8939:8;;;;8698:258::o;9238:541::-;9395:20;;;;;;;;;;;;;;;;9552:15;;;9321:4;;;;9395:20;9639:4;9395:20;9639:4;9395:20;9612:9;9606:4;9595:49;9672:1;9664:6;9661:13;9658:2;;;9709:3;9703:10;9694:19;;9658:2;9501:238;;9765:6;-1:-1:-1;;;;;9756:15:0;:5;-1:-1:-1;;;;;9756:15:0;;9749:22;;;;9238:541;;;;:::o
Swarm Source
bzzr://9943d0ee514d0d9bacea196bdcd09ebb8e636c1561c80dc0dfc986407799644c
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
[ 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.