Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 5,858 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Execute | 10826629 | 2011 days ago | IN | 0 ETH | 0.01319241 | ||||
| Execute | 10580815 | 2049 days ago | IN | 0 ETH | 0.01099516 | ||||
| Execute | 10580450 | 2049 days ago | IN | 0 ETH | 0.01283513 | ||||
| Execute | 10358573 | 2084 days ago | IN | 0 ETH | 0.00808912 | ||||
| Execute | 10330559 | 2088 days ago | IN | 0 ETH | 0.00890032 | ||||
| Execute | 10330552 | 2088 days ago | IN | 0 ETH | 0.00957402 | ||||
| Execute | 10243195 | 2101 days ago | IN | 0 ETH | 0.00783276 | ||||
| Execute | 10241510 | 2102 days ago | IN | 0 ETH | 0.00796876 | ||||
| Execute | 10217582 | 2105 days ago | IN | 0 ETH | 0.00995492 | ||||
| Execute | 10213007 | 2106 days ago | IN | 0 ETH | 0.01971739 | ||||
| Execute | 10175402 | 2112 days ago | IN | 0 ETH | 0.00436172 | ||||
| Execute | 10168878 | 2113 days ago | IN | 0 ETH | 0.00604801 | ||||
| Execute | 10167025 | 2113 days ago | IN | 0 ETH | 0.00894216 | ||||
| Execute | 10166074 | 2113 days ago | IN | 0 ETH | 0.01176105 | ||||
| Execute | 10165555 | 2113 days ago | IN | 0 ETH | 0.00236649 | ||||
| Execute | 10165555 | 2113 days ago | IN | 0 ETH | 0.00776846 | ||||
| Execute | 10164864 | 2114 days ago | IN | 0 ETH | 0.00613858 | ||||
| Execute | 10135545 | 2118 days ago | IN | 0 ETH | 0.00887888 | ||||
| Execute | 10114632 | 2121 days ago | IN | 0 ETH | 0.00897311 | ||||
| Execute | 10102661 | 2123 days ago | IN | 0 ETH | 0.0104051 | ||||
| Execute | 10101550 | 2123 days ago | IN | 0 ETH | 0.00781517 | ||||
| Execute | 10101547 | 2123 days ago | IN | 0 ETH | 0.00977325 | ||||
| Execute | 10101015 | 2123 days ago | IN | 0 ETH | 0.00959138 | ||||
| Execute | 10100134 | 2124 days ago | IN | 0 ETH | 0.00691136 | ||||
| Execute | 10098420 | 2124 days ago | IN | 0 ETH | 0.00404649 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MakerV2Manager
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 Interface for a contract that can invest tokens in order to earn an interest.
* @author Julien Niset - <[email protected]>
*/
interface Invest {
event InvestmentAdded(address indexed _wallet, address _token, uint256 _invested, uint256 _period);
event InvestmentRemoved(address indexed _wallet, address _token, uint256 _fraction);
function addInvestment(
BaseWallet _wallet,
address _token,
uint256 _amount,
uint256 _period
)
external
returns (uint256 _invested);
function removeInvestment(
BaseWallet _wallet,
address _token,
uint256 _fraction
)
external;
function getInvestment(
BaseWallet _wallet,
address _token
)
external
view
returns (uint256 _tokenValue, uint256 _periodEnd);
}
contract VatLike {
function can(address, address) public view returns (uint);
function dai(address) public view returns (uint);
function hope(address) public;
}
contract JoinLike {
function gem() public returns (GemLike);
function dai() public returns (GemLike);
function join(address, uint) public;
function exit(address, uint) public;
VatLike public vat;
}
contract PotLike {
function chi() public view returns (uint);
function pie(address) public view returns (uint);
function drip() public;
}
contract ScdMcdMigration {
function swapSaiToDai(uint wad) external;
function swapDaiToSai(uint wad) external;
JoinLike public saiJoin;
JoinLike public wethJoin;
JoinLike public daiJoin;
}
contract GemLike {
function balanceOf(address) public view returns (uint);
function transferFrom(address, address, uint) public returns (bool);
}
/**
* @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;
}
}
}
/**
* @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 OnlyOwnerModule
* @dev Module that extends BaseModule and RelayerModule for modules where the execute() method
* must be called with one signature frm the owner.
* @author Julien Niset - <[email protected]>
*/
contract OnlyOwnerModule is BaseModule, RelayerModule {
// bytes4 private constant IS_ONLY_OWNER_MODULE = bytes4(keccak256("isOnlyOwnerModule()"));
/**
* @dev Returns a constant that indicates that the module is an OnlyOwnerModule.
* @return The constant bytes4(keccak256("isOnlyOwnerModule()"))
*/
function isOnlyOwnerModule() external pure returns (bytes4) {
// return IS_ONLY_OWNER_MODULE;
return this.isOnlyOwnerModule.selector;
}
/**
* @dev Adds a module to a wallet. First checks that the module is registered.
* Unlike its overrided parent, this method can be called via the RelayerModule's execute()
* @param _wallet The target wallet.
* @param _module The modules to authorise.
*/
function addModule(BaseWallet _wallet, Module _module) external onlyWalletOwner(_wallet) {
require(registry.isRegisteredModule(address(_module)), "BM: module is not registered");
_wallet.authoriseModule(address(_module), true);
}
// *************** Implementation of RelayerModule methods ********************* //
// Overrides to use the incremental nonce and save some gas
function checkAndUpdateUniqueness(BaseWallet _wallet, uint256 _nonce, bytes32 /* _signHash */) internal returns (bool) {
return checkAndUpdateNonce(_wallet, _nonce);
}
function validateSignatures(
BaseWallet _wallet,
bytes memory /* _data */,
bytes32 _signHash,
bytes memory _signatures
)
internal
view
returns (bool)
{
address signer = recoverSigner(_signHash, _signatures, 0);
return isOwner(_wallet, signer); // "OOM: signer must be owner"
}
function getRequiredSignatures(BaseWallet /* _wallet */, bytes memory /* _data */) internal view returns (uint256) {
return 1;
}
}
/**
* @title LimitManager
* @dev Module to manage a daily spending limit
* @author Julien Niset - <[email protected]>
*/
contract LimitManager is BaseModule {
// large limit when the limit can be considered disabled
uint128 constant private LIMIT_DISABLED = uint128(-1); // 3.40282366920938463463374607431768211455e+38
using SafeMath for uint256;
struct LimitManagerConfig {
// The daily limit
Limit limit;
// The current usage
DailySpent dailySpent;
}
struct Limit {
// the current limit
uint128 current;
// the pending limit if any
uint128 pending;
// when the pending limit becomes the current limit
uint64 changeAfter;
}
struct DailySpent {
// The amount already spent during the current period
uint128 alreadySpent;
// The end of the current period
uint64 periodEnd;
}
// wallet specific storage
mapping (address => LimitManagerConfig) internal limits;
// The default limit
uint256 public defaultLimit;
// *************** Events *************************** //
event LimitChanged(address indexed wallet, uint indexed newLimit, uint64 indexed startAfter);
// *************** Constructor ********************** //
constructor(uint256 _defaultLimit) public {
defaultLimit = _defaultLimit;
}
// *************** External/Public Functions ********************* //
/**
* @dev Inits the module for a wallet by setting the limit to the default value.
* @param _wallet The target wallet.
*/
function init(BaseWallet _wallet) public onlyWallet(_wallet) {
Limit storage limit = limits[address(_wallet)].limit;
if(limit.current == 0 && limit.changeAfter == 0) {
limit.current = uint128(defaultLimit);
}
}
// *************** Internal Functions ********************* //
/**
* @dev Changes the daily limit.
* The limit is expressed in ETH and the change is pending for the security period.
* @param _wallet The target wallet.
* @param _newLimit The new limit.
* @param _securityPeriod The security period.
*/
function changeLimit(BaseWallet _wallet, uint256 _newLimit, uint256 _securityPeriod) internal {
Limit storage limit = limits[address(_wallet)].limit;
// solium-disable-next-line security/no-block-members
uint128 current = (limit.changeAfter > 0 && limit.changeAfter < now) ? limit.pending : limit.current;
limit.current = current;
limit.pending = uint128(_newLimit);
// solium-disable-next-line security/no-block-members
limit.changeAfter = uint64(now.add(_securityPeriod));
// solium-disable-next-line security/no-block-members
emit LimitChanged(address(_wallet), _newLimit, uint64(now.add(_securityPeriod)));
}
/**
* @dev Disable the daily limit.
* The change is pending for the security period.
* @param _wallet The target wallet.
* @param _securityPeriod The security period.
*/
function disableLimit(BaseWallet _wallet, uint256 _securityPeriod) internal {
changeLimit(_wallet, LIMIT_DISABLED, _securityPeriod);
}
/**
* @dev Gets the current daily limit for a wallet.
* @param _wallet The target wallet.
* @return the current limit expressed in ETH.
*/
function getCurrentLimit(BaseWallet _wallet) public view returns (uint256 _currentLimit) {
Limit storage limit = limits[address(_wallet)].limit;
_currentLimit = uint256(currentLimit(limit.current, limit.pending, limit.changeAfter));
}
/**
* @dev Returns whether the daily limit is disabled for a wallet.
* @param _wallet The target wallet.
* @return true if the daily limit is disabled, false otherwise.
*/
function isLimitDisabled(BaseWallet _wallet) public view returns (bool _limitDisabled) {
uint256 currentLimit = getCurrentLimit(_wallet);
_limitDisabled = currentLimit == LIMIT_DISABLED;
}
/**
* @dev Gets a pending limit for a wallet if any.
* @param _wallet The target wallet.
* @return the pending limit (in ETH) and the time at chich it will become effective.
*/
function getPendingLimit(BaseWallet _wallet) external view returns (uint256 _pendingLimit, uint64 _changeAfter) {
Limit storage limit = limits[address(_wallet)].limit;
// solium-disable-next-line security/no-block-members
return ((now < limit.changeAfter)? (uint256(limit.pending), limit.changeAfter) : (0,0));
}
/**
* @dev Gets the amount of tokens that has not yet been spent during the current period.
* @param _wallet The target wallet.
* @return the amount of tokens (in ETH) that has not been spent yet and the end of the period.
*/
function getDailyUnspent(BaseWallet _wallet) external view returns (uint256 _unspent, uint64 _periodEnd) {
uint256 limit = getCurrentLimit(_wallet);
DailySpent storage expense = limits[address(_wallet)].dailySpent;
// solium-disable-next-line security/no-block-members
if(now > expense.periodEnd) {
_unspent = limit;
// solium-disable-next-line security/no-block-members
_periodEnd = uint64(now + 24 hours);
}
else {
_periodEnd = expense.periodEnd;
if(expense.alreadySpent < limit) {
_unspent = limit - expense.alreadySpent;
}
}
}
/**
* @dev Helper method to check if a transfer is within the limit.
* If yes the daily unspent for the current period is updated.
* @param _wallet The target wallet.
* @param _amount The amount for the transfer
*/
function checkAndUpdateDailySpent(BaseWallet _wallet, uint _amount) internal returns (bool) {
if(_amount == 0) return true;
Limit storage limit = limits[address(_wallet)].limit;
uint128 current = currentLimit(limit.current, limit.pending, limit.changeAfter);
if(isWithinDailyLimit(_wallet, current, _amount)) {
updateDailySpent(_wallet, current, _amount);
return true;
}
return false;
}
/**
* @dev Helper method to update the daily spent for the current period.
* @param _wallet The target wallet.
* @param _limit The current limit for the wallet.
* @param _amount The amount to add to the daily spent.
*/
function updateDailySpent(BaseWallet _wallet, uint128 _limit, uint _amount) internal {
if(_limit != LIMIT_DISABLED) {
DailySpent storage expense = limits[address(_wallet)].dailySpent;
// solium-disable-next-line security/no-block-members
if (expense.periodEnd < now) {
// solium-disable-next-line security/no-block-members
expense.periodEnd = uint64(now + 24 hours);
expense.alreadySpent = uint128(_amount);
}
else {
expense.alreadySpent += uint128(_amount);
}
}
}
/**
* @dev Checks if a transfer amount is withing the daily limit for a wallet.
* @param _wallet The target wallet.
* @param _limit The current limit for the wallet.
* @param _amount The transfer amount.
* @return true if the transfer amount is withing the daily limit.
*/
function isWithinDailyLimit(BaseWallet _wallet, uint _limit, uint _amount) internal view returns (bool) {
if(_limit == LIMIT_DISABLED) {
return true;
}
DailySpent storage expense = limits[address(_wallet)].dailySpent;
// solium-disable-next-line security/no-block-members
if (expense.periodEnd < now) {
return (_amount <= _limit);
} else {
return (expense.alreadySpent + _amount <= _limit && expense.alreadySpent + _amount >= expense.alreadySpent);
}
}
/**
* @dev Helper method to get the current limit from a Limit struct.
* @param _current The value of the current parameter
* @param _pending The value of the pending parameter
* @param _changeAfter The value of the changeAfter parameter
*/
function currentLimit(uint128 _current, uint128 _pending, uint64 _changeAfter) internal view returns (uint128) {
// solium-disable-next-line security/no-block-members
if(_changeAfter > 0 && _changeAfter < now) {
return _pending;
}
return _current;
}
}
/**
* @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 MakerV2Manager
* @dev Module to convert SAI <-> DAI and lock/unlock MCD DAI into/from Maker's Pot,
* @author Olivier VDB - <[email protected]>
*/
contract MakerV2Manager is Invest, BaseModule, RelayerModule, OnlyOwnerModule {
bytes32 constant NAME = "MakerV2Manager";
// The address of the SAI token
GemLike public saiToken;
// The address of the (MCD) DAI token
GemLike public daiToken;
// The address of the SAI <-> DAI migration contract
address public scdMcdMigration;
// The address of the Pot
PotLike public pot;
// The address of the Dai Adapter
JoinLike public daiJoin;
// The address of the Vat
VatLike public vat;
// Method signatures to reduce gas cost at depoyment
bytes4 constant internal ERC20_APPROVE = bytes4(keccak256("approve(address,uint256)"));
bytes4 constant internal SWAP_SAI_DAI = bytes4(keccak256("swapSaiToDai(uint256)"));
bytes4 constant internal SWAP_DAI_SAI = bytes4(keccak256("swapDaiToSai(uint256)"));
bytes4 constant internal ADAPTER_JOIN = bytes4(keccak256("join(address,uint256)"));
bytes4 constant internal ADAPTER_EXIT = bytes4(keccak256("exit(address,uint256)"));
bytes4 constant internal VAT_HOPE = bytes4(keccak256("hope(address)"));
bytes4 constant internal POT_JOIN = bytes4(keccak256("join(uint256)"));
bytes4 constant internal POT_EXIT = bytes4(keccak256("exit(uint256)"));
uint256 constant internal RAY = 10 ** 27;
using SafeMath for uint256;
// ****************** Events *************************** //
event TokenConverted(address indexed _wallet, address _srcToken, uint _srcAmount, address _destToken, uint _destAmount);
// *************** Constructor ********************** //
constructor(
ModuleRegistry _registry,
GuardianStorage _guardianStorage,
ScdMcdMigration _scdMcdMigration,
PotLike _pot
)
BaseModule(_registry, _guardianStorage, NAME)
public
{
scdMcdMigration = address(_scdMcdMigration);
saiToken = _scdMcdMigration.saiJoin().gem();
daiJoin = _scdMcdMigration.daiJoin();
vat = daiJoin.vat();
daiToken = daiJoin.dai();
pot = _pot;
}
// *************** External/Public Functions ********************* //
/* ********************************** Implementation of Invest ************************************* */
/**
* @dev Invest tokens for a given period.
* @param _wallet The target wallet.
* @param _token The token address.
* @param _amount The amount of tokens to invest.
* @param _period The period over which the tokens may be locked in the investment (optional).
* @return The exact amount of tokens that have been invested.
*/
function addInvestment(
BaseWallet _wallet,
address _token,
uint256 _amount,
uint256 _period
)
external
returns (uint256 _invested)
{
require(_token == address(daiToken), "DM: token should be DAI");
joinDsr(_wallet, _amount);
_invested = _amount;
emit InvestmentAdded(address(_wallet), address(daiToken), _amount, _period);
}
/**
* @dev Exit invested postions.
* @param _wallet The target wallet.
* @param _token The token address.
* @param _fraction The fraction of invested tokens to exit in per 10000.
*/
function removeInvestment(
BaseWallet _wallet,
address _token,
uint256 _fraction
)
external
{
require(_token == address(daiToken), "DM: token should be DAI");
require(_fraction <= 10000, "DM: invalid fraction value");
exitDsr(_wallet, dsrBalance(_wallet).mul(_fraction) / 10000);
emit InvestmentRemoved(address(_wallet), _token, _fraction);
}
/**
* @dev Get the amount of investment in a given token.
* @param _wallet The target wallet.
* @param _token The token address.
* @return The value in tokens of the investment (including interests) and the time at which the investment can be removed.
*/
function getInvestment(
BaseWallet _wallet,
address _token
)
external
view
returns (uint256 _tokenValue, uint256 _periodEnd)
{
_tokenValue = _token == address(daiToken) ? dsrBalance(_wallet) : 0;
_periodEnd = 0;
}
/* ****************************************** DSR wrappers ******************************************* */
function dsrBalance(BaseWallet _wallet) public view returns (uint256) {
return pot.chi().mul(pot.pie(address(_wallet))) / RAY;
}
/**
* @dev lets the owner deposit MCD DAI into the DSR Pot.
* @param _wallet The target wallet.
* @param _amount The amount of DAI to deposit
*/
function joinDsr(
BaseWallet _wallet,
uint256 _amount
)
public
onlyWalletOwner(_wallet)
onlyWhenUnlocked(_wallet)
{
if (daiToken.balanceOf(address(_wallet)) < _amount) {
swapSaiToDai(_wallet, _amount - daiToken.balanceOf(address(_wallet)));
}
// Execute drip to get the chi rate updated to rho == now, otherwise join will fail
pot.drip();
// Approve DAI adapter to take the DAI amount
invokeWallet(address(_wallet), address(daiToken), 0, abi.encodeWithSelector(ERC20_APPROVE, address(daiJoin), _amount));
// Join DAI into the vat (_amount of external DAI is burned and the vat transfers _amount of internal DAI from the adapter to the _wallet)
invokeWallet(address(_wallet), address(daiJoin), 0, abi.encodeWithSelector(ADAPTER_JOIN, address(_wallet), _amount));
// Approve the pot to take out (internal) DAI from the wallet's balance in the vat
if (vat.can(address(_wallet), address(pot)) == 0) {
invokeWallet(address(_wallet), address(vat), 0, abi.encodeWithSelector(VAT_HOPE, address(pot)));
}
// Compute the pie value in the pot
uint256 pie = _amount.mul(RAY) / pot.chi();
// Join the pie value to the pot
invokeWallet(address(_wallet), address(pot), 0, abi.encodeWithSelector(POT_JOIN, pie));
}
/**
* @dev lets the owner withdraw MCD DAI from the DSR Pot.
* @param _wallet The target wallet.
* @param _amount The amount of DAI to withdraw
*/
function exitDsr(
BaseWallet _wallet,
uint256 _amount
)
public
onlyWalletOwner(_wallet)
onlyWhenUnlocked(_wallet)
{
// Execute drip to count the savings accumulated until this moment
pot.drip();
// Calculates the pie value in the pot equivalent to the DAI wad amount
uint256 pie = _amount.mul(RAY) / pot.chi();
// Exit DAI from the pot
invokeWallet(address(_wallet), address(pot), 0, abi.encodeWithSelector(POT_EXIT, pie));
// Allow adapter to access the _wallet's DAI balance in the vat
if (vat.can(address(_wallet), address(daiJoin)) == 0) {
invokeWallet(address(_wallet), address(vat), 0, abi.encodeWithSelector(VAT_HOPE, address(daiJoin)));
}
// Check the actual balance of DAI in the vat after the pot exit
uint bal = vat.dai(address(_wallet));
// It is necessary to check if due to rounding the exact _amount can be exited by the adapter.
// Otherwise it will do the maximum DAI balance in the vat
uint256 withdrawn = bal >= _amount.mul(RAY) ? _amount : bal / RAY;
invokeWallet(address(_wallet), address(daiJoin), 0, abi.encodeWithSelector(ADAPTER_EXIT, address(_wallet), withdrawn));
}
function exitAllDsr(
BaseWallet _wallet
)
external
onlyWalletOwner(_wallet)
onlyWhenUnlocked(_wallet)
{
// Execute drip to count the savings accumulated until this moment
pot.drip();
// Gets the total pie belonging to the _wallet
uint256 pie = pot.pie(address(_wallet));
// Exit DAI from the pot
invokeWallet(address(_wallet), address(pot), 0, abi.encodeWithSelector(POT_EXIT, pie));
// Allow adapter to access the _wallet's DAI balance in the vat
if (vat.can(address(_wallet), address(daiJoin)) == 0) {
invokeWallet(address(_wallet), address(vat), 0, abi.encodeWithSelector(VAT_HOPE, address(daiJoin)));
}
// Exits the DAI amount corresponding to the value of pie
uint256 withdrawn = pot.chi().mul(pie) / RAY;
invokeWallet(address(_wallet), address(daiJoin), 0, abi.encodeWithSelector(ADAPTER_EXIT, address(_wallet), withdrawn));
}
/**
* @dev lets the owner convert SCD SAI into MCD DAI.
* @param _wallet The target wallet.
* @param _amount The amount of SAI to convert
*/
function swapSaiToDai(
BaseWallet _wallet,
uint256 _amount
)
public
onlyWalletOwner(_wallet)
onlyWhenUnlocked(_wallet)
{
require(saiToken.balanceOf(address(_wallet)) >= _amount, "DM: insufficient SAI");
invokeWallet(address(_wallet), address(saiToken), 0, abi.encodeWithSelector(ERC20_APPROVE, scdMcdMigration, _amount));
invokeWallet(address(_wallet), scdMcdMigration, 0, abi.encodeWithSelector(SWAP_SAI_DAI, _amount));
emit TokenConverted(address(_wallet), address(saiToken), _amount, address(daiToken), _amount);
}
/**
* @dev lets the owner convert MCD DAI into SCD SAI.
* @param _wallet The target wallet.
* @param _amount The amount of DAI to convert
*/
function swapDaiToSai(
BaseWallet _wallet,
uint256 _amount
)
external
onlyWalletOwner(_wallet)
onlyWhenUnlocked(_wallet)
{
require(daiToken.balanceOf(address(_wallet)) >= _amount, "DM: insufficient DAI");
invokeWallet(address(_wallet), address(daiToken), 0, abi.encodeWithSelector(ERC20_APPROVE, scdMcdMigration, _amount));
invokeWallet(address(_wallet), scdMcdMigration, 0, abi.encodeWithSelector(SWAP_DAI_SAI, _amount));
emit TokenConverted(address(_wallet), address(daiToken), _amount, address(saiToken), _amount);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_amount","type":"uint256"}],"name":"exitDsr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_amount","type":"uint256"}],"name":"swapDaiToSai","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"exitAllDsr","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":true,"inputs":[],"name":"vat","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pot","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","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":"_wallet","type":"address"},{"name":"_amount","type":"uint256"}],"name":"swapSaiToDai","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_amount","type":"uint256"}],"name":"joinDsr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_token","type":"address"},{"name":"_fraction","type":"uint256"}],"name":"removeInvestment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"recoverToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"saiToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","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":"_wallet","type":"address"}],"name":"dsrBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"daiToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"daiJoin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"relayer","outputs":[{"name":"nonce","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"},{"name":"_token","type":"address"}],"name":"getInvestment","outputs":[{"name":"_tokenValue","type":"uint256"},{"name":"_periodEnd","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOnlyOwnerModule","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"scdMcdMigration","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_token","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_period","type":"uint256"}],"name":"addInvestment","outputs":[{"name":"_invested","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_registry","type":"address"},{"name":"_guardianStorage","type":"address"},{"name":"_scdMcdMigration","type":"address"},{"name":"_pot","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_wallet","type":"address"},{"indexed":false,"name":"_srcToken","type":"address"},{"indexed":false,"name":"_srcAmount","type":"uint256"},{"indexed":false,"name":"_destToken","type":"address"},{"indexed":false,"name":"_destAmount","type":"uint256"}],"name":"TokenConverted","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"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_wallet","type":"address"},{"indexed":false,"name":"_token","type":"address"},{"indexed":false,"name":"_invested","type":"uint256"},{"indexed":false,"name":"_period","type":"uint256"}],"name":"InvestmentAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_wallet","type":"address"},{"indexed":false,"name":"_token","type":"address"},{"indexed":false,"name":"_fraction","type":"uint256"}],"name":"InvestmentRemoved","type":"event"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405160808062003704833981018060405260808110156200003357600080fd5b50805160208083015160408085015160609095015160008054600160a060020a03808816600160a060020a031992831617909255600180549286169290911691909117905581517f4d616b657256324d616e61676572000000000000000000000000000000000000808252925195969395939491938793879390927f3019c8fc80239e3dff8f781212ae2004839c2cb61d6c70acd279ac65392145df929081900390910190a1505060058054600160a060020a031916600160a060020a038516908117909155604080517f0b14408f0000000000000000000000000000000000000000000000000000000081529051919250630b14408f916004808301926020929190829003018186803b1580156200014b57600080fd5b505afa15801562000160573d6000803e3d6000fd5b505050506040513d60208110156200017757600080fd5b5051604080517f7bd2bea70000000000000000000000000000000000000000000000000000000081529051600160a060020a0390921691637bd2bea7916004808201926020929091908290030181600087803b158015620001d757600080fd5b505af1158015620001ec573d6000803e3d6000fd5b505050506040513d60208110156200020357600080fd5b505160038054600160a060020a031916600160a060020a03928316179055604080517fc11645bc00000000000000000000000000000000000000000000000000000000815290519184169163c11645bc91600480820192602092909190829003018186803b1580156200027557600080fd5b505afa1580156200028a573d6000803e3d6000fd5b505050506040513d6020811015620002a157600080fd5b505160078054600160a060020a031916600160a060020a039283161790819055604080517f36569e77000000000000000000000000000000000000000000000000000000008152905191909216916336569e77916004808301926020929190829003018186803b1580156200031557600080fd5b505afa1580156200032a573d6000803e3d6000fd5b505050506040513d60208110156200034157600080fd5b505160088054600160a060020a031916600160a060020a03928316179055600754604080517ff4b9fa750000000000000000000000000000000000000000000000000000000081529051919092169163f4b9fa759160048083019260209291908290030181600087803b158015620003b857600080fd5b505af1158015620003cd573d6000803e3d6000fd5b505050506040513d6020811015620003e457600080fd5b505160048054600160a060020a03928316600160a060020a031991821617909155600680549390921692169190911790555050506132dc80620004286000396000f3fe608060405234801561001057600080fd5b506004361061019f576000357c0100000000000000000000000000000000000000000000000000000000900480639be65a60116100f5578063c11645bc116100a9578063d490da4d11610083578063d490da4d1461052b578063d9b6ccbf14610556578063ec9e13aa1461055e5761019f565b8063c11645bc146104b6578063c9b5ef8e146104be578063cac7495c146104e45761019f565b8063aacaaf88116100da578063aacaaf8814610398578063ae8d246814610488578063be22f546146104ae5761019f565b80639be65a601461036a578063a30184de146103905761019f565b806336569e77116101575780638c544246116101315780638c544246146102dc5780638d3e0a691461030857806398d53428146103345761019f565b806336569e77146102825780634ba2363a146102a65780635a1db8c4146102ae5761019f565b8063288596a611610188578063288596a6146101f85780632c5ba768146102245780632d0335ab1461024a5761019f565b80630227efa2146101a457806319ab453c146101d2575b600080fd5b6101d0600480360360408110156101ba57600080fd5b50600160a060020a03813516906020013561059a565b005b6101d0600480360360208110156101e857600080fd5b5035600160a060020a0316610b84565b6101d06004803603604081101561020e57600080fd5b50600160a060020a038135169060200135610c2a565b6101d06004803603602081101561023a57600080fd5b5035600160a060020a0316610fff565b6102706004803603602081101561026057600080fd5b5035600160a060020a03166115a7565b60408051918252519081900360200190f35b61028a6115c2565b60408051600160a060020a039092168252519081900360200190f35b61028a6115d1565b6101d0600480360360408110156102c457600080fd5b50600160a060020a03813581169160200135166115e0565b6101d0600480360360408110156102f257600080fd5b50600160a060020a0381351690602001356117ae565b6101d06004803603604081101561031e57600080fd5b50600160a060020a038135169060200135611b81565b6101d06004803603606081101561034a57600080fd5b50600160a060020a03813581169160208101359091169060400135612258565b6101d06004803603602081101561038057600080fd5b5035600160a060020a031661239b565b61028a6124ce565b610474600480360360c08110156103ae57600080fd5b600160a060020a0382351691908101906040810160208201356401000000008111156103d957600080fd5b8201836020820111156103eb57600080fd5b8035906020019184600183028401116401000000008311171561040d57600080fd5b9193909282359260408101906020013564010000000081111561042f57600080fd5b82018360208201111561044157600080fd5b8035906020019184600183028401116401000000008311171561046357600080fd5b9193509150803590602001356124dd565b604080519115158252519081900360200190f35b6102706004803603602081101561049e57600080fd5b5035600160a060020a03166127c5565b61028a6128d9565b61028a6128e8565b610270600480360360208110156104d457600080fd5b5035600160a060020a03166128f7565b610512600480360360408110156104fa57600080fd5b50600160a060020a0381358116916020013516612909565b6040805192835260208301919091528051918290030190f35b61053361293e565b6040805160008051602061322e8339815191529092168252519081900360200190f35b61028a612962565b6102706004803603608081101561057457600080fd5b50600160a060020a03813581169160208101359091169060408101359060600135612971565b81333014806105ae57506105ae8133612a44565b15156105f35760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b15801561065c57600080fd5b505afa158015610670573d6000803e3d6000fd5b505050506040513d602081101561068657600080fd5b5051156106e2576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b600660009054906101000a9004600160a060020a0316600160a060020a0316639f678cca6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15801561074e57600080fd5b505af1158015610762573d6000803e3d6000fd5b505050506000600660009054906101000a9004600160a060020a0316600160a060020a031663c92aecc46040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156107d257600080fd5b505afa1580156107e6573d6000803e3d6000fd5b505050506040513d60208110156107fc57600080fd5b505161081a856b033b2e3c9fd0803ce800000063ffffffff612ae416565b81151561082357fe5b600654604080517f657869742875696e7432353629000000000000000000000000000000000000008152815190819003600d0181209490930460248085018290528251808603909101815260449094019091526020830180516000805160206132918339815191521660008051602061322e833981519152909516949094179093529192506108c2918791600160a060020a0390911690600090612b16565b50600854600754604080517f4538c4eb000000000000000000000000000000000000000000000000000000008152600160a060020a038981166004830152928316602482015290519190921691634538c4eb916044808301926020929190829003018186803b15801561093457600080fd5b505afa158015610948573d6000803e3d6000fd5b505050506040513d602081101561095e57600080fd5b50511515610a0457600854604080517f686f7065286164647265737329000000000000000000000000000000000000008152815190819003600d018120600754600160a060020a039081166024808501919091528451808503909101815260449093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052610a029288921690600090612b16565b505b600854604080517f6c25b346000000000000000000000000000000000000000000000000000000008152600160a060020a03888116600483015291516000939290921691636c25b34691602480820192602092909190829003018186803b158015610a6e57600080fd5b505afa158015610a82573d6000803e3d6000fd5b505050506040513d6020811015610a9857600080fd5b505190506000610aba866b033b2e3c9fd0803ce800000063ffffffff612ae416565b821015610ad5576b033b2e3c9fd0803ce80000008204610ad7565b855b600754604080517f6578697428616464726573732c75696e7432353629000000000000000000000081528151908190036015018120600160a060020a03808d16602484015260448084018790528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052929350610b7a928a929190911690600090612b16565b5050505050505050565b8033600160a060020a03821614610bea576040805160008051602061324e833981519152815260206004820152601960248201527f424d3a2063616c6c6572206d7573742062652077616c6c657400000000000000604482015290519081900360640190fd5b60408051600160a060020a038416815290517f9fcca3f73f85397e2bf03647abf243c20b753bd54463ff3cae74de2971c112fa9181900360200190a15050565b8133301480610c3e5750610c3e8133612a44565b1515610c835760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b158015610cec57600080fd5b505afa158015610d00573d6000803e3d6000fd5b505050506040513d6020811015610d1657600080fd5b505115610d72576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b60048054604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038881169482019490945290518693909216916370a0823191602480820192602092909190829003018186803b158015610ddd57600080fd5b505afa158015610df1573d6000803e3d6000fd5b505050506040513d6020811015610e0757600080fd5b50511015610e64576040805160008051602061324e833981519152815260206004820152601460248201527f444d3a20696e73756666696369656e7420444149000000000000000000000000604482015290519081900360640190fd5b600454604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600554600160a060020a03908116602484015260448084018990528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052610f049287921690600090612b16565b50600554604080517f73776170446169546f5361692875696e743235362900000000000000000000008152815190819003601501812060248083018890528351808403909101815260449092019092526020810180516000805160206132918339815191521660008051602061322e83398151915290931692909217909152610f9d918691600160a060020a0390911690600090612b16565b5060045460035460408051600160a060020a03938416815260208101879052918316828201526060820186905251918616917fe0aebc0b49a57880fff1a14cdb8f71331347f88fedf9f4a251ff97b31061d8289181900360800190a250505050565b803330148061101357506110138133612a44565b15156110585760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038086166004830152915185939290921691634a4fbeec91602480820192602092909190829003018186803b1580156110c157600080fd5b505afa1580156110d5573d6000803e3d6000fd5b505050506040513d60208110156110eb57600080fd5b505115611147576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b600660009054906101000a9004600160a060020a0316600160a060020a0316639f678cca6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1580156111b357600080fd5b505af11580156111c7573d6000803e3d6000fd5b5050600654604080517f0bebac86000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915160009550919092169250630bebac8691602480820192602092909190829003018186803b15801561123557600080fd5b505afa158015611249573d6000803e3d6000fd5b505050506040513d602081101561125f57600080fd5b5051600654604080517f657869742875696e7432353629000000000000000000000000000000000000008152815190819003600d01812060248083018690528351808403909101815260449092019092526020810180516000805160206132918339815191521660008051602061322e833981519152909316929092179091529192506112fa918691600160a060020a031690600090612b16565b50600854600754604080517f4538c4eb000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152928316602482015290519190921691634538c4eb916044808301926020929190829003018186803b15801561136c57600080fd5b505afa158015611380573d6000803e3d6000fd5b505050506040513d602081101561139657600080fd5b5051151561143c57600854604080517f686f7065286164647265737329000000000000000000000000000000000000008152815190819003600d018120600754600160a060020a039081166024808501919091528451808503909101815260449093019093526020820180516000805160206132918339815191521660008051602061322e83398151915290921691909117905261143a9287921690600090612b16565b505b60006b033b2e3c9fd0803ce80000006114f183600660009054906101000a9004600160a060020a0316600160a060020a031663c92aecc46040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156114b957600080fd5b505afa1580156114cd573d6000803e3d6000fd5b505050506040513d60208110156114e357600080fd5b50519063ffffffff612ae416565b8115156114fa57fe5b600754604080517f6578697428616464726573732c75696e7432353629000000000000000000000081528151908190036015018120600160a060020a03808c1660248401529590940460448083018290528351808403909101815260649092019092526020810180516000805160206132918339815191521660008051602061322e83398151915290951694909417909352935061159f928892911690600090612b16565b505050505050565b600160a060020a031660009081526002602052604090205490565b600854600160a060020a031681565b600654600160a060020a031681565b81333014806115f457506115f48133612a44565b15156116395760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600054604080517f0bcd4ebb000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015291519190921691630bcd4ebb916024808301926020929190829003018186803b15801561169f57600080fd5b505afa1580156116b3573d6000803e3d6000fd5b505050506040513d60208110156116c957600080fd5b50511515611726576040805160008051602061324e833981519152815260206004820152601c60248201527f424d3a206d6f64756c65206973206e6f74207265676973746572656400000000604482015290519081900360640190fd5b604080517f1f17732d000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015260016024830152915191851691631f17732d9160448082019260009290919082900301818387803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b50505050505050565b81333014806117c257506117c28133612a44565b15156118075760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b15801561187057600080fd5b505afa158015611884573d6000803e3d6000fd5b505050506040513d602081101561189a57600080fd5b5051156118f6576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b600354604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301529151869392909216916370a0823191602480820192602092909190829003018186803b15801561195f57600080fd5b505afa158015611973573d6000803e3d6000fd5b505050506040513d602081101561198957600080fd5b505110156119e6576040805160008051602061324e833981519152815260206004820152601460248201527f444d3a20696e73756666696369656e7420534149000000000000000000000000604482015290519081900360640190fd5b600354604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600554600160a060020a03908116602484015260448084018990528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052611a869287921690600090612b16565b50600554604080517f73776170536169546f4461692875696e743235362900000000000000000000008152815190819003601501812060248083018890528351808403909101815260449092019092526020810180516000805160206132918339815191521660008051602061322e83398151915290931692909217909152611b1f918691600160a060020a0390911690600090612b16565b5060035460045460408051600160a060020a03938416815260208101879052918316828201526060820186905251918616917fe0aebc0b49a57880fff1a14cdb8f71331347f88fedf9f4a251ff97b31061d8289181900360800190a250505050565b8133301480611b955750611b958133612a44565b1515611bda5760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b158015611c4357600080fd5b505afa158015611c57573d6000803e3d6000fd5b505050506040513d6020811015611c6d57600080fd5b505115611cc9576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b60048054604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038881169482019490945290518693909216916370a0823191602480820192602092909190829003018186803b158015611d3457600080fd5b505afa158015611d48573d6000803e3d6000fd5b505050506040513d6020811015611d5e57600080fd5b50511015611e055760048054604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a03808916948201949094529051611e0593889316916370a08231916024808301926020929190829003018186803b158015611dd257600080fd5b505afa158015611de6573d6000803e3d6000fd5b505050506040513d6020811015611dfc57600080fd5b505185036117ae565b600660009054906101000a9004600160a060020a0316600160a060020a0316639f678cca6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b158015611e7157600080fd5b505af1158015611e85573d6000803e3d6000fd5b5050600454604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600754600160a060020a03908116602484015260448084018b90528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052611f2a9450889350911690600090612b16565b50600754604080517f6a6f696e28616464726573732c75696e7432353629000000000000000000000081528151908190036015018120600160a060020a03808916602484015260448084018990528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052611fc89287921690600090612b16565b50600854600654604080517f4538c4eb000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152928316602482015290519190921691634538c4eb916044808301926020929190829003018186803b15801561203a57600080fd5b505afa15801561204e573d6000803e3d6000fd5b505050506040513d602081101561206457600080fd5b5051151561210a57600854604080517f686f7065286164647265737329000000000000000000000000000000000000008152815190819003600d018120600654600160a060020a039081166024808501919091528451808503909101815260449093019093526020820180516000805160206132918339815191521660008051602061322e8339815191529092169190911790526121089287921690600090612b16565b505b600654604080517fc92aecc40000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163c92aecc4916004808301926020929190829003018186803b15801561216857600080fd5b505afa15801561217c573d6000803e3d6000fd5b505050506040513d602081101561219257600080fd5b50516121b0856b033b2e3c9fd0803ce800000063ffffffff612ae416565b8115156121b957fe5b600654604080517f6a6f696e2875696e7432353629000000000000000000000000000000000000008152815190819003600d0181209490930460248085018290528251808603909101815260449094019091526020830180516000805160206132918339815191521660008051602061322e8339815191529095169490941790935291925061159f918791600160a060020a0390911690600090612b16565b600454600160a060020a038381169116146122c2576040805160008051602061324e833981519152815260206004820152601760248201527f444d3a20746f6b656e2073686f756c6420626520444149000000000000000000604482015290519081900360640190fd5b612710811115612321576040805160008051602061324e833981519152815260206004820152601a60248201527f444d3a20696e76616c6964206672616374696f6e2076616c7565000000000000604482015290519081900360640190fd5b6123508361271061234184612335886127c5565b9063ffffffff612ae416565b81151561234a57fe5b0461059a565b60408051600160a060020a038481168252602082018490528251908616927f9aa275f858ea6286ee2cacd32cd2ae55f918a310ee6d0320caad244ee9d6109e928290030190a2505050565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600091600160a060020a038416916370a0823191602480820192602092909190829003018186803b1580156123fe57600080fd5b505afa158015612412573d6000803e3d6000fd5b505050506040513d602081101561242857600080fd5b505160008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201526024810185905290519394509085169263a9059cbb92604480840193602093929083900390910190829087803b15801561249e57600080fd5b505af11580156124b2573d6000803e3d6000fd5b505050506040513d60208110156124c857600080fd5b50505050565b600354600160a060020a031681565b6000805a9050600061252d308c60008d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92508c91508b9050612d90565b905061253a8b8983612ed3565b1515612595576040805160008051602061324e833981519152815260206004820152601560248201527f524d3a204475706c696361746520726571756573740000000000000000000000604482015290519081900360640190fd5b6125d58b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612ee792505050565b151561261a5760405160008051602061324e833981519152815260040180806020018281038252604a8152602001806131e4604a913960600191505060405180910390fd5b600061265c8c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f6092505050565b905060418102871415612774576126758c868884612f68565b15612774578015806126f857506126f88c8c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815288935091508d908d908190840183828082843760009201919091525061303a92505050565b156127745730600160a060020a03168b8b604051808383808284376040519201945060009350909150508083038183865af19150503d8060008114612759576040519150601f19603f3d011682016040523d82523d6000602084013e61275e565b606091505b5050809450506127748c5a85038888853361305f565b60408051838152905185151591600160a060020a038f16917f6bb0b384ce772133df63560651bc8c727c53306cec1d51e2cbf8ea35fb8f2ec19181900360200190a350505098975050505050505050565b600654604080517f0bebac86000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015291516000936b033b2e3c9fd0803ce8000000936128c993911691630bebac8691602480820192602092909190829003018186803b15801561283f57600080fd5b505afa158015612853573d6000803e3d6000fd5b505050506040513d602081101561286957600080fd5b5051600654604080517fc92aecc40000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169163c92aecc491600480820192602092909190829003018186803b1580156114b957600080fd5b8115156128d257fe5b0492915050565b600454600160a060020a031681565b600754600160a060020a031681565b60026020526000908152604090205481565b6004546000908190600160a060020a0384811691161461292a576000612933565b612933846127c5565b946000945092505050565b7fd490da4d0000000000000000000000000000000000000000000000000000000090565b600554600160a060020a031681565b600454600090600160a060020a038581169116146129de576040805160008051602061324e833981519152815260206004820152601760248201527f444d3a20746f6b656e2073686f756c6420626520444149000000000000000000604482015290519081900360640190fd5b6129e88584611b81565b5060045460408051600160a060020a03928316815260208101859052808201849052905184928716917ff8eece150ed2126815122a6def9737751aecd814379d4ce8c9edd07133a49cdb919081900360600190a2949350505050565b600081600160a060020a031683600160a060020a0316638da5cb5b6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015612aa557600080fd5b505afa158015612ab9573d6000803e3d6000fd5b505050506040513d6020811015612acf57600080fd5b5051600160a060020a03161490505b92915050565b6000821515612af557506000612ade565b828202828482811515612b0457fe5b0414612b0f57600080fd5b9392505050565b6060600085600160a060020a03168585856040516024018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612b85578181015183820152602001612b6d565b50505050905090810190601f168015612bb25780820380516001836020036101000a031916815260200191505b5060408051601f19818403018152918152602082018051600080516020613291833981519152167f8f6f033200000000000000000000000000000000000000000000000000000000178152905182519297509550859450925090508083835b60208310612c305780518252601f199092019160209182019101612c11565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612c92576040519150601f19603f3d011682016040523d82523d6000602084013e612c97565b606091505b5092509050808015612caa575060008251115b15612d1757818060200190516020811015612cc457600080fd5b810190808051640100000000811115612cdc57600080fd5b82016020810184811115612cef57600080fd5b8151640100000000811182820187101715612d0957600080fd5b50909550612d879350505050565b600082511115612d2b573d6000803e3d6000fd5b801515612d87576040805160008051602061324e833981519152815260206004820152601a60248201527f424d3a2077616c6c657420696e766f6b65207265766572746564000000000000604482015290519081900360640190fd5b50949350505050565b6040517f190000000000000000000000000000000000000000000000000000000000000060208083018281526000602185018190526c01000000000000000000000000600160a060020a03808e16820260228801528c16026036860152604a85018a90528851909485938d938d938d938d938d938d938d939192606a909201918701908083835b60208310612e365780518252601f199092019160209182019101612e17565b51815160209384036101000a600019018019909216911617905292019586525084810193909352506040808401919091528051808403820181526060840182528051908301207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006080850152609c808501919091528151808503909101815260bc909301905281519101209e9d5050505050505050505050505050565b6000612edf84846130b3565b949350505050565b60006024825110151515612f4a576040805160008051602061324e833981519152815260206004820152601660248201527f524d3a20496e76616c6964206461746157616c6c657400000000000000000000604482015290519081900360640190fd5b5060240151600160a060020a0391821691161490565b600192915050565b60008083118015612f795750600182115b8015613022575082840285600160a060020a03163110806130225750604080517fd6eb1bbf0000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a0387169163d6eb1bbf916024808301926020929190829003018186803b158015612ff457600080fd5b505afa158015613008573d6000803e3d6000fd5b505050506040513d602081101561301e57600080fd5b5051155b1561302f57506000612edf565b506001949350505050565b60008061304984846000613139565b90506130558682612a44565b9695505050505050565b61726c85016000851180156130745750600183115b80156130805750838111155b156117a5573a851115613094573a02613097565b84025b610b7a8783836020604051908101604052806000815250612b16565b600160a060020a03821660009081526002602052604081205482116130da57506000612ade565b7001000000000000000000000000000000006fffffffffffffffffffffffffffffffff198316044361271001811115613117576000915050612ade565b5050600160a060020a0391909116600090815260026020526040902055600190565b6041808202830160208101516040820151919092015160009260ff9190911691601b83148061316b57508260ff16601c145b151561317657600080fd5b604080516000815260208082018084528a905260ff8616828401526060820185905260808201849052915160019260a0808401939192601f1981019281900390910190855afa1580156131cd573d6000803e3d6000fd5b5050604051601f1901519897505050505050505056fe524d3a207468652077616c6c657420617574686f72697a656420697320646966666572656e74207468656e2074686520746172676574206f66207468652072656c617965642064617461ffffffff0000000000000000000000000000000000000000000000000000000008c379a000000000000000000000000000000000000000000000000000000000424d3a206d75737420626520616e206f776e657220666f72207468652077616c6c657400000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffa165627a7a723058204799972ba6ce61a3bd48380a6917b63dfcff5c5db122ea9ca64e20f611e3eea60029000000000000000000000000c17d432bd8e8850fd7b32b0270f5afac65db010500000000000000000000000044da3a8051ba88eab0440db3779cab9d679ae76f000000000000000000000000c73e0383f3aff3215e6f04b0331d58cecf0ab849000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf7
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061019f576000357c0100000000000000000000000000000000000000000000000000000000900480639be65a60116100f5578063c11645bc116100a9578063d490da4d11610083578063d490da4d1461052b578063d9b6ccbf14610556578063ec9e13aa1461055e5761019f565b8063c11645bc146104b6578063c9b5ef8e146104be578063cac7495c146104e45761019f565b8063aacaaf88116100da578063aacaaf8814610398578063ae8d246814610488578063be22f546146104ae5761019f565b80639be65a601461036a578063a30184de146103905761019f565b806336569e77116101575780638c544246116101315780638c544246146102dc5780638d3e0a691461030857806398d53428146103345761019f565b806336569e77146102825780634ba2363a146102a65780635a1db8c4146102ae5761019f565b8063288596a611610188578063288596a6146101f85780632c5ba768146102245780632d0335ab1461024a5761019f565b80630227efa2146101a457806319ab453c146101d2575b600080fd5b6101d0600480360360408110156101ba57600080fd5b50600160a060020a03813516906020013561059a565b005b6101d0600480360360208110156101e857600080fd5b5035600160a060020a0316610b84565b6101d06004803603604081101561020e57600080fd5b50600160a060020a038135169060200135610c2a565b6101d06004803603602081101561023a57600080fd5b5035600160a060020a0316610fff565b6102706004803603602081101561026057600080fd5b5035600160a060020a03166115a7565b60408051918252519081900360200190f35b61028a6115c2565b60408051600160a060020a039092168252519081900360200190f35b61028a6115d1565b6101d0600480360360408110156102c457600080fd5b50600160a060020a03813581169160200135166115e0565b6101d0600480360360408110156102f257600080fd5b50600160a060020a0381351690602001356117ae565b6101d06004803603604081101561031e57600080fd5b50600160a060020a038135169060200135611b81565b6101d06004803603606081101561034a57600080fd5b50600160a060020a03813581169160208101359091169060400135612258565b6101d06004803603602081101561038057600080fd5b5035600160a060020a031661239b565b61028a6124ce565b610474600480360360c08110156103ae57600080fd5b600160a060020a0382351691908101906040810160208201356401000000008111156103d957600080fd5b8201836020820111156103eb57600080fd5b8035906020019184600183028401116401000000008311171561040d57600080fd5b9193909282359260408101906020013564010000000081111561042f57600080fd5b82018360208201111561044157600080fd5b8035906020019184600183028401116401000000008311171561046357600080fd5b9193509150803590602001356124dd565b604080519115158252519081900360200190f35b6102706004803603602081101561049e57600080fd5b5035600160a060020a03166127c5565b61028a6128d9565b61028a6128e8565b610270600480360360208110156104d457600080fd5b5035600160a060020a03166128f7565b610512600480360360408110156104fa57600080fd5b50600160a060020a0381358116916020013516612909565b6040805192835260208301919091528051918290030190f35b61053361293e565b6040805160008051602061322e8339815191529092168252519081900360200190f35b61028a612962565b6102706004803603608081101561057457600080fd5b50600160a060020a03813581169160208101359091169060408101359060600135612971565b81333014806105ae57506105ae8133612a44565b15156105f35760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b15801561065c57600080fd5b505afa158015610670573d6000803e3d6000fd5b505050506040513d602081101561068657600080fd5b5051156106e2576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b600660009054906101000a9004600160a060020a0316600160a060020a0316639f678cca6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15801561074e57600080fd5b505af1158015610762573d6000803e3d6000fd5b505050506000600660009054906101000a9004600160a060020a0316600160a060020a031663c92aecc46040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156107d257600080fd5b505afa1580156107e6573d6000803e3d6000fd5b505050506040513d60208110156107fc57600080fd5b505161081a856b033b2e3c9fd0803ce800000063ffffffff612ae416565b81151561082357fe5b600654604080517f657869742875696e7432353629000000000000000000000000000000000000008152815190819003600d0181209490930460248085018290528251808603909101815260449094019091526020830180516000805160206132918339815191521660008051602061322e833981519152909516949094179093529192506108c2918791600160a060020a0390911690600090612b16565b50600854600754604080517f4538c4eb000000000000000000000000000000000000000000000000000000008152600160a060020a038981166004830152928316602482015290519190921691634538c4eb916044808301926020929190829003018186803b15801561093457600080fd5b505afa158015610948573d6000803e3d6000fd5b505050506040513d602081101561095e57600080fd5b50511515610a0457600854604080517f686f7065286164647265737329000000000000000000000000000000000000008152815190819003600d018120600754600160a060020a039081166024808501919091528451808503909101815260449093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052610a029288921690600090612b16565b505b600854604080517f6c25b346000000000000000000000000000000000000000000000000000000008152600160a060020a03888116600483015291516000939290921691636c25b34691602480820192602092909190829003018186803b158015610a6e57600080fd5b505afa158015610a82573d6000803e3d6000fd5b505050506040513d6020811015610a9857600080fd5b505190506000610aba866b033b2e3c9fd0803ce800000063ffffffff612ae416565b821015610ad5576b033b2e3c9fd0803ce80000008204610ad7565b855b600754604080517f6578697428616464726573732c75696e7432353629000000000000000000000081528151908190036015018120600160a060020a03808d16602484015260448084018790528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052929350610b7a928a929190911690600090612b16565b5050505050505050565b8033600160a060020a03821614610bea576040805160008051602061324e833981519152815260206004820152601960248201527f424d3a2063616c6c6572206d7573742062652077616c6c657400000000000000604482015290519081900360640190fd5b60408051600160a060020a038416815290517f9fcca3f73f85397e2bf03647abf243c20b753bd54463ff3cae74de2971c112fa9181900360200190a15050565b8133301480610c3e5750610c3e8133612a44565b1515610c835760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b158015610cec57600080fd5b505afa158015610d00573d6000803e3d6000fd5b505050506040513d6020811015610d1657600080fd5b505115610d72576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b60048054604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038881169482019490945290518693909216916370a0823191602480820192602092909190829003018186803b158015610ddd57600080fd5b505afa158015610df1573d6000803e3d6000fd5b505050506040513d6020811015610e0757600080fd5b50511015610e64576040805160008051602061324e833981519152815260206004820152601460248201527f444d3a20696e73756666696369656e7420444149000000000000000000000000604482015290519081900360640190fd5b600454604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600554600160a060020a03908116602484015260448084018990528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052610f049287921690600090612b16565b50600554604080517f73776170446169546f5361692875696e743235362900000000000000000000008152815190819003601501812060248083018890528351808403909101815260449092019092526020810180516000805160206132918339815191521660008051602061322e83398151915290931692909217909152610f9d918691600160a060020a0390911690600090612b16565b5060045460035460408051600160a060020a03938416815260208101879052918316828201526060820186905251918616917fe0aebc0b49a57880fff1a14cdb8f71331347f88fedf9f4a251ff97b31061d8289181900360800190a250505050565b803330148061101357506110138133612a44565b15156110585760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038086166004830152915185939290921691634a4fbeec91602480820192602092909190829003018186803b1580156110c157600080fd5b505afa1580156110d5573d6000803e3d6000fd5b505050506040513d60208110156110eb57600080fd5b505115611147576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b600660009054906101000a9004600160a060020a0316600160a060020a0316639f678cca6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1580156111b357600080fd5b505af11580156111c7573d6000803e3d6000fd5b5050600654604080517f0bebac86000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915160009550919092169250630bebac8691602480820192602092909190829003018186803b15801561123557600080fd5b505afa158015611249573d6000803e3d6000fd5b505050506040513d602081101561125f57600080fd5b5051600654604080517f657869742875696e7432353629000000000000000000000000000000000000008152815190819003600d01812060248083018690528351808403909101815260449092019092526020810180516000805160206132918339815191521660008051602061322e833981519152909316929092179091529192506112fa918691600160a060020a031690600090612b16565b50600854600754604080517f4538c4eb000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152928316602482015290519190921691634538c4eb916044808301926020929190829003018186803b15801561136c57600080fd5b505afa158015611380573d6000803e3d6000fd5b505050506040513d602081101561139657600080fd5b5051151561143c57600854604080517f686f7065286164647265737329000000000000000000000000000000000000008152815190819003600d018120600754600160a060020a039081166024808501919091528451808503909101815260449093019093526020820180516000805160206132918339815191521660008051602061322e83398151915290921691909117905261143a9287921690600090612b16565b505b60006b033b2e3c9fd0803ce80000006114f183600660009054906101000a9004600160a060020a0316600160a060020a031663c92aecc46040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156114b957600080fd5b505afa1580156114cd573d6000803e3d6000fd5b505050506040513d60208110156114e357600080fd5b50519063ffffffff612ae416565b8115156114fa57fe5b600754604080517f6578697428616464726573732c75696e7432353629000000000000000000000081528151908190036015018120600160a060020a03808c1660248401529590940460448083018290528351808403909101815260649092019092526020810180516000805160206132918339815191521660008051602061322e83398151915290951694909417909352935061159f928892911690600090612b16565b505050505050565b600160a060020a031660009081526002602052604090205490565b600854600160a060020a031681565b600654600160a060020a031681565b81333014806115f457506115f48133612a44565b15156116395760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600054604080517f0bcd4ebb000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015291519190921691630bcd4ebb916024808301926020929190829003018186803b15801561169f57600080fd5b505afa1580156116b3573d6000803e3d6000fd5b505050506040513d60208110156116c957600080fd5b50511515611726576040805160008051602061324e833981519152815260206004820152601c60248201527f424d3a206d6f64756c65206973206e6f74207265676973746572656400000000604482015290519081900360640190fd5b604080517f1f17732d000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015260016024830152915191851691631f17732d9160448082019260009290919082900301818387803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b50505050505050565b81333014806117c257506117c28133612a44565b15156118075760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b15801561187057600080fd5b505afa158015611884573d6000803e3d6000fd5b505050506040513d602081101561189a57600080fd5b5051156118f6576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b600354604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301529151869392909216916370a0823191602480820192602092909190829003018186803b15801561195f57600080fd5b505afa158015611973573d6000803e3d6000fd5b505050506040513d602081101561198957600080fd5b505110156119e6576040805160008051602061324e833981519152815260206004820152601460248201527f444d3a20696e73756666696369656e7420534149000000000000000000000000604482015290519081900360640190fd5b600354604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600554600160a060020a03908116602484015260448084018990528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052611a869287921690600090612b16565b50600554604080517f73776170536169546f4461692875696e743235362900000000000000000000008152815190819003601501812060248083018890528351808403909101815260449092019092526020810180516000805160206132918339815191521660008051602061322e83398151915290931692909217909152611b1f918691600160a060020a0390911690600090612b16565b5060035460045460408051600160a060020a03938416815260208101879052918316828201526060820186905251918616917fe0aebc0b49a57880fff1a14cdb8f71331347f88fedf9f4a251ff97b31061d8289181900360800190a250505050565b8133301480611b955750611b958133612a44565b1515611bda5760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b158015611c4357600080fd5b505afa158015611c57573d6000803e3d6000fd5b505050506040513d6020811015611c6d57600080fd5b505115611cc9576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b60048054604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038881169482019490945290518693909216916370a0823191602480820192602092909190829003018186803b158015611d3457600080fd5b505afa158015611d48573d6000803e3d6000fd5b505050506040513d6020811015611d5e57600080fd5b50511015611e055760048054604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a03808916948201949094529051611e0593889316916370a08231916024808301926020929190829003018186803b158015611dd257600080fd5b505afa158015611de6573d6000803e3d6000fd5b505050506040513d6020811015611dfc57600080fd5b505185036117ae565b600660009054906101000a9004600160a060020a0316600160a060020a0316639f678cca6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b158015611e7157600080fd5b505af1158015611e85573d6000803e3d6000fd5b5050600454604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600754600160a060020a03908116602484015260448084018b90528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052611f2a9450889350911690600090612b16565b50600754604080517f6a6f696e28616464726573732c75696e7432353629000000000000000000000081528151908190036015018120600160a060020a03808916602484015260448084018990528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052611fc89287921690600090612b16565b50600854600654604080517f4538c4eb000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152928316602482015290519190921691634538c4eb916044808301926020929190829003018186803b15801561203a57600080fd5b505afa15801561204e573d6000803e3d6000fd5b505050506040513d602081101561206457600080fd5b5051151561210a57600854604080517f686f7065286164647265737329000000000000000000000000000000000000008152815190819003600d018120600654600160a060020a039081166024808501919091528451808503909101815260449093019093526020820180516000805160206132918339815191521660008051602061322e8339815191529092169190911790526121089287921690600090612b16565b505b600654604080517fc92aecc40000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163c92aecc4916004808301926020929190829003018186803b15801561216857600080fd5b505afa15801561217c573d6000803e3d6000fd5b505050506040513d602081101561219257600080fd5b50516121b0856b033b2e3c9fd0803ce800000063ffffffff612ae416565b8115156121b957fe5b600654604080517f6a6f696e2875696e7432353629000000000000000000000000000000000000008152815190819003600d0181209490930460248085018290528251808603909101815260449094019091526020830180516000805160206132918339815191521660008051602061322e8339815191529095169490941790935291925061159f918791600160a060020a0390911690600090612b16565b600454600160a060020a038381169116146122c2576040805160008051602061324e833981519152815260206004820152601760248201527f444d3a20746f6b656e2073686f756c6420626520444149000000000000000000604482015290519081900360640190fd5b612710811115612321576040805160008051602061324e833981519152815260206004820152601a60248201527f444d3a20696e76616c6964206672616374696f6e2076616c7565000000000000604482015290519081900360640190fd5b6123508361271061234184612335886127c5565b9063ffffffff612ae416565b81151561234a57fe5b0461059a565b60408051600160a060020a038481168252602082018490528251908616927f9aa275f858ea6286ee2cacd32cd2ae55f918a310ee6d0320caad244ee9d6109e928290030190a2505050565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600091600160a060020a038416916370a0823191602480820192602092909190829003018186803b1580156123fe57600080fd5b505afa158015612412573d6000803e3d6000fd5b505050506040513d602081101561242857600080fd5b505160008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201526024810185905290519394509085169263a9059cbb92604480840193602093929083900390910190829087803b15801561249e57600080fd5b505af11580156124b2573d6000803e3d6000fd5b505050506040513d60208110156124c857600080fd5b50505050565b600354600160a060020a031681565b6000805a9050600061252d308c60008d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92508c91508b9050612d90565b905061253a8b8983612ed3565b1515612595576040805160008051602061324e833981519152815260206004820152601560248201527f524d3a204475706c696361746520726571756573740000000000000000000000604482015290519081900360640190fd5b6125d58b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612ee792505050565b151561261a5760405160008051602061324e833981519152815260040180806020018281038252604a8152602001806131e4604a913960600191505060405180910390fd5b600061265c8c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f6092505050565b905060418102871415612774576126758c868884612f68565b15612774578015806126f857506126f88c8c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815288935091508d908d908190840183828082843760009201919091525061303a92505050565b156127745730600160a060020a03168b8b604051808383808284376040519201945060009350909150508083038183865af19150503d8060008114612759576040519150601f19603f3d011682016040523d82523d6000602084013e61275e565b606091505b5050809450506127748c5a85038888853361305f565b60408051838152905185151591600160a060020a038f16917f6bb0b384ce772133df63560651bc8c727c53306cec1d51e2cbf8ea35fb8f2ec19181900360200190a350505098975050505050505050565b600654604080517f0bebac86000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015291516000936b033b2e3c9fd0803ce8000000936128c993911691630bebac8691602480820192602092909190829003018186803b15801561283f57600080fd5b505afa158015612853573d6000803e3d6000fd5b505050506040513d602081101561286957600080fd5b5051600654604080517fc92aecc40000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169163c92aecc491600480820192602092909190829003018186803b1580156114b957600080fd5b8115156128d257fe5b0492915050565b600454600160a060020a031681565b600754600160a060020a031681565b60026020526000908152604090205481565b6004546000908190600160a060020a0384811691161461292a576000612933565b612933846127c5565b946000945092505050565b7fd490da4d0000000000000000000000000000000000000000000000000000000090565b600554600160a060020a031681565b600454600090600160a060020a038581169116146129de576040805160008051602061324e833981519152815260206004820152601760248201527f444d3a20746f6b656e2073686f756c6420626520444149000000000000000000604482015290519081900360640190fd5b6129e88584611b81565b5060045460408051600160a060020a03928316815260208101859052808201849052905184928716917ff8eece150ed2126815122a6def9737751aecd814379d4ce8c9edd07133a49cdb919081900360600190a2949350505050565b600081600160a060020a031683600160a060020a0316638da5cb5b6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015612aa557600080fd5b505afa158015612ab9573d6000803e3d6000fd5b505050506040513d6020811015612acf57600080fd5b5051600160a060020a03161490505b92915050565b6000821515612af557506000612ade565b828202828482811515612b0457fe5b0414612b0f57600080fd5b9392505050565b6060600085600160a060020a03168585856040516024018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612b85578181015183820152602001612b6d565b50505050905090810190601f168015612bb25780820380516001836020036101000a031916815260200191505b5060408051601f19818403018152918152602082018051600080516020613291833981519152167f8f6f033200000000000000000000000000000000000000000000000000000000178152905182519297509550859450925090508083835b60208310612c305780518252601f199092019160209182019101612c11565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612c92576040519150601f19603f3d011682016040523d82523d6000602084013e612c97565b606091505b5092509050808015612caa575060008251115b15612d1757818060200190516020811015612cc457600080fd5b810190808051640100000000811115612cdc57600080fd5b82016020810184811115612cef57600080fd5b8151640100000000811182820187101715612d0957600080fd5b50909550612d879350505050565b600082511115612d2b573d6000803e3d6000fd5b801515612d87576040805160008051602061324e833981519152815260206004820152601a60248201527f424d3a2077616c6c657420696e766f6b65207265766572746564000000000000604482015290519081900360640190fd5b50949350505050565b6040517f190000000000000000000000000000000000000000000000000000000000000060208083018281526000602185018190526c01000000000000000000000000600160a060020a03808e16820260228801528c16026036860152604a85018a90528851909485938d938d938d938d938d938d938d939192606a909201918701908083835b60208310612e365780518252601f199092019160209182019101612e17565b51815160209384036101000a600019018019909216911617905292019586525084810193909352506040808401919091528051808403820181526060840182528051908301207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006080850152609c808501919091528151808503909101815260bc909301905281519101209e9d5050505050505050505050505050565b6000612edf84846130b3565b949350505050565b60006024825110151515612f4a576040805160008051602061324e833981519152815260206004820152601660248201527f524d3a20496e76616c6964206461746157616c6c657400000000000000000000604482015290519081900360640190fd5b5060240151600160a060020a0391821691161490565b600192915050565b60008083118015612f795750600182115b8015613022575082840285600160a060020a03163110806130225750604080517fd6eb1bbf0000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a0387169163d6eb1bbf916024808301926020929190829003018186803b158015612ff457600080fd5b505afa158015613008573d6000803e3d6000fd5b505050506040513d602081101561301e57600080fd5b5051155b1561302f57506000612edf565b506001949350505050565b60008061304984846000613139565b90506130558682612a44565b9695505050505050565b61726c85016000851180156130745750600183115b80156130805750838111155b156117a5573a851115613094573a02613097565b84025b610b7a8783836020604051908101604052806000815250612b16565b600160a060020a03821660009081526002602052604081205482116130da57506000612ade565b7001000000000000000000000000000000006fffffffffffffffffffffffffffffffff198316044361271001811115613117576000915050612ade565b5050600160a060020a0391909116600090815260026020526040902055600190565b6041808202830160208101516040820151919092015160009260ff9190911691601b83148061316b57508260ff16601c145b151561317657600080fd5b604080516000815260208082018084528a905260ff8616828401526060820185905260808201849052915160019260a0808401939192601f1981019281900390910190855afa1580156131cd573d6000803e3d6000fd5b5050604051601f1901519897505050505050505056fe524d3a207468652077616c6c657420617574686f72697a656420697320646966666572656e74207468656e2074686520746172676574206f66207468652072656c617965642064617461ffffffff0000000000000000000000000000000000000000000000000000000008c379a000000000000000000000000000000000000000000000000000000000424d3a206d75737420626520616e206f776e657220666f72207468652077616c6c657400000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffa165627a7a723058204799972ba6ce61a3bd48380a6917b63dfcff5c5db122ea9ca64e20f611e3eea60029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c17d432bd8e8850fd7b32b0270f5afac65db010500000000000000000000000044da3a8051ba88eab0440db3779cab9d679ae76f000000000000000000000000c73e0383f3aff3215e6f04b0331d58cecf0ab849000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf7
-----Decoded View---------------
Arg [0] : _registry (address): 0xc17D432Bd8e8850Fd7b32B0270f5AfAc65DB0105
Arg [1] : _guardianStorage (address): 0x44DA3A8051bA88EAB0440DB3779cAB9D679ae76f
Arg [2] : _scdMcdMigration (address): 0xc73e0383F3Aff3215E6f04B0331D58CeCf0Ab849
Arg [3] : _pot (address): 0x197E90f9FAD81970bA7976f33CbD77088E5D7cf7
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000c17d432bd8e8850fd7b32b0270f5afac65db0105
Arg [1] : 00000000000000000000000044da3a8051ba88eab0440db3779cab9d679ae76f
Arg [2] : 000000000000000000000000c73e0383f3aff3215e6f04b0331d58cecf0ab849
Arg [3] : 000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf7
Deployed Bytecode Sourcemap
37301:10298:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37301:10298:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43708:1300;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;43708:1300:0;;;;;;;;:::i;:::-;;10830:120;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10830:120:0;-1:-1:-1;;;;;10830:120:0;;:::i;46981:615::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;46981:615:0;;;;;;;;:::i;45016:1004::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45016:1004:0;-1:-1:-1;;;;;45016:1004:0;;:::i;17003:133::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17003:133:0;-1:-1:-1;;;;;17003:133:0;;:::i;:::-;;;;;;;;;;;;;;;;37828:18;;;:::i;:::-;;;;-1:-1:-1;;;;;37828:18:0;;;;;;;;;;;;;;37703;;;:::i;24488:252::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24488:252:0;;;;;;;;;;:::i;46194:613::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;46194:613:0;;;;;;;;:::i;42107:1421::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;42107:1421:0;;;;;;;;:::i;40648:429::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;40648:429:0;;;;;;;;;;;;;;;;;:::i;11623:176::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11623:176:0;-1:-1:-1;;;;;11623:176:0;;:::i;37474:23::-;;;:::i;15549:1339::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;15549:1339:0;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;15549:1339:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;15549: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;15549:1339:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;15549:1339:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;15549: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;15549:1339:0;;-1:-1:-1;15549:1339:0;-1:-1:-1;15549:1339:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;41787:142;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41787:142:0;-1:-1:-1;;;;;41787:142:0;;:::i;37547:23::-;;;:::i;37767:::-;;;:::i;13536:49::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13536:49:0;-1:-1:-1;;;;;13536:49:0;;:::i;41375:291::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;41375:291:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24032:158;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;;;;24032:158:0;;;;;;;;;;;;;;37635:30;;;:::i;39993:430::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;39993:430:0;;;;;;;;;;;;;;;;;;;;;;:::i;43708:1300::-;43828:7;10258:10;10280:4;10258:27;;:59;;;10289:28;10297:7;10306:10;10289:7;:28::i;:::-;10250:107;;;;;;-1:-1:-1;;;;;;;;;;;10250:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9442:15;;:33;;;;;;-1:-1:-1;;;;;9442:33:0;;;;;;;;;43863:7;;9442:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;9442:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9442:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9442:33:0;9441:34;9433:74;;;;;-1:-1:-1;;;;;;;;;;;9433:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43964:3;;;;;;;;;-1:-1:-1;;;;;43964:3:0;-1:-1:-1;;;;;43964:8:0;;:10;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43964:10:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43964:10:0;;;;44066:11;44099:3;;;;;;;;;-1:-1:-1;;;;;44099:3:0;-1:-1:-1;;;;;44099:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;44099:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44099:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44099:9:0;44080:16;:7;38627:8;44080:16;:11;:16;:::i;:::-;:28;;;;;;;44192:3;;38559:26;;;;;;;;;;;;;;;;44080:28;;;;44201:37;;;;;;;;;26:21:-1;;;22:32;;;6:49;;44201:37:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;44201:37:0;;;179:29:-1;;;;160:49;;;44080:28:0;;-1:-1:-1;44153:86:0;;44174:7;;-1:-1:-1;;;;;44192:3:0;;;;;;44153:12;:86::i;:::-;-1:-1:-1;44327:3:0;;44361:7;;44327:43;;;;;;-1:-1:-1;;;;;44327:43:0;;;;;;;44361:7;;;44327:43;;;;;;:3;;;;;:7;;:43;;;;;;;;;;;;;;:3;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;44327:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44327:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44327:43:0;:48;44323:180;;;44431:3;;38405:26;;;;;;;;;;;;;;;;44481:7;;-1:-1:-1;;;;;44481:7:0;;;44440:50;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;44440:50:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;44440:50:0;;;179:29:-1;;;;160:49;;44392:99:0;;44413:7;;44431:3;;;;44392:12;:99::i;:::-;;44323:180;44598:3;;:25;;;;;;-1:-1:-1;;;;;44598:25:0;;;;;;;;;44587:8;;44598:3;;;;;:7;;:25;;;;;;;;;;;;;;;:3;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;44598:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44598:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44598:25:0;;-1:-1:-1;44806:17:0;44833:16;:7;38627:8;44833:16;:11;:16;:::i;:::-;44826:3;:23;;:45;;38627:8;44862:3;:9;44826:45;;;44852:7;44826:45;44921:7;;38320:34;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44934:65:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;44934:65:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;44934:65:0;;;179:29:-1;;;;160:49;;44806:65:0;;-1:-1:-1;44882:118:0;;44903:7;;44921;;;;;;;44882:12;:118::i;:::-;;9518:1;;;10368;43708:1300;;;:::o;10830:120::-;10882:7;9994:10;-1:-1:-1;;;;;9994:30:0;;;9986:68;;;;;-1:-1:-1;;;;;;;;;;;9986:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10907:35;;;-1:-1:-1;;;;;10907:35:0;;;;;;;;;;;;;;;10830:120;;:::o;46981:615::-;47108:7;10258:10;10280:4;10258:27;;:59;;;10289:28;10297:7;10306:10;10289:7;:28::i;:::-;10250:107;;;;;;-1:-1:-1;;;;;;;;;;;10250:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9442:15;;:33;;;;;;-1:-1:-1;;;;;9442:33:0;;;;;;;;;47143:7;;9442:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;9442:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9442:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9442:33:0;9441:34;9433:74;;;;;-1:-1:-1;;;;;;;;;;;9433:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47176:8;;;:36;;;;;;-1:-1:-1;;;;;47176:36:0;;;;;;;;;;;;47216:7;;47176:8;;;;:18;;:36;;;;;;;;;;;;;;;:8;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;47176:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47176:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47176:36:0;:47;;47168:80;;;;;-1:-1:-1;;;;;;;;;;;47168:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47298:8;;37961:37;;;;;;;;;;;;;;;;47350:15;;-1:-1:-1;;;;;47350:15:0;;;47312:63;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;47312:63:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;47312:63:0;;;179:29:-1;;;;160:49;;47259:117:0;;47280:7;;47298:8;;;;47259:12;:117::i;:::-;-1:-1:-1;47418:15:0;;38142:34;;;;;;;;;;;;;;;;47438:45;;;;;;;;;26:21:-1;;;22:32;;;6:49;;47438:45:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;47438:45:0;;;179:29:-1;;;;160:49;;;47387:97:0;;47408:7;;-1:-1:-1;;;;;47418:15:0;;;;;;47387:12;:97::i;:::-;-1:-1:-1;47541:8:0;;47569;;47500:88;;;-1:-1:-1;;;;;47541:8:0;;;47500:88;;;;;;;;47569:8;;;47500:88;;;;;;;;;;;;;;;;;;;;;;;;10368:1;46981:615;;;:::o;45016:1004::-;45115:7;10258:10;10280:4;10258:27;;:59;;;10289:28;10297:7;10306:10;10289:7;:28::i;:::-;10250:107;;;;;;-1:-1:-1;;;;;;;;;;;10250:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9442:15;;:33;;;;;;-1:-1:-1;;;;;9442:33:0;;;;;;;;;45150:7;;9442:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;9442:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9442:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9442:33:0;9441:34;9433:74;;;;;-1:-1:-1;;;;;;;;;;;9433:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45251:3;;;;;;;;;-1:-1:-1;;;;;45251:3:0;-1:-1:-1;;;;;45251:8:0;;:10;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45251:10:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;45342:3:0;;:25;;;;;;-1:-1:-1;;;;;45342:25:0;;;;;;;;;45328:11;;-1:-1:-1;45342:3:0;;;;;-1:-1:-1;45342:7:0;;:25;;;;;;;;;;;;;;;:3;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;45342:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45342:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45342:25:0;45451:3;;38559:26;;;;;;;;;;;;;;;;45460:37;;;;;;;;;26:21:-1;;;22:32;;;6:49;;45460:37:0;;;;;;;45342:25;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;45460:37:0;;;179:29:-1;;;;160:49;;;45342:25:0;;-1:-1:-1;45412:86:0;;45433:7;;-1:-1:-1;;;;;45451:3:0;;;;45412:12;:86::i;:::-;-1:-1:-1;45586:3:0;;45620:7;;45586:43;;;;;;-1:-1:-1;;;;;45586:43:0;;;;;;;45620:7;;;45586:43;;;;;;:3;;;;;:7;;:43;;;;;;;;;;;;;;:3;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;45586:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45586:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45586:43:0;:48;45582:180;;;45690:3;;38405:26;;;;;;;;;;;;;;;;45740:7;;-1:-1:-1;;;;;45740:7:0;;;45699:50;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;45699:50:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;45699:50:0;;;179:29:-1;;;;160:49;;45651:99:0;;45672:7;;45690:3;;;;45651:12;:99::i;:::-;;45582:180;45839:17;38627:8;45859:18;45873:3;45859;;;;;;;;;-1:-1:-1;;;;;45859:3:0;-1:-1:-1;;;;;45859:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;45859:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45859:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45859:9:0;;:18;:13;:18;:::i;:::-;:24;;;;;;;45933:7;;38320:34;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45946:65:0;;;;;;;45859:24;;;;45946:65;;;;;;;;;26:21:-1;;;22:32;;;6:49;;45946:65:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;45946:65:0;;;179:29:-1;;;;160:49;;;45859:24:0;-1:-1:-1;45894:118:0;;45915:7;;45933;;;;;45894:12;:118::i;:::-;;9518:1;;10368;45016:1004;;:::o;17003:133::-;-1:-1:-1;;;;;17097:25:0;17064:13;17097:25;;;:7;:25;;;;;:31;;17003:133::o;37828:18::-;;;-1:-1:-1;;;;;37828:18:0;;:::o;37703:::-;;;-1:-1:-1;;;;;37703:18:0;;:::o;24488:252::-;24568:7;10258:10;10280:4;10258:27;;:59;;;10289:28;10297:7;10306:10;10289:7;:28::i;:::-;10250:107;;;;;;-1:-1:-1;;;;;;;;;;;10250:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24596:8;;:45;;;;;;-1:-1:-1;;;;;24596:45:0;;;;;;;;;:8;;;;;:27;;:45;;;;;;;;;;;;;;:8;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;24596:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24596:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24596:45:0;24588:86;;;;;;;-1:-1:-1;;;;;;;;;;;24588:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24685:47;;;;;;-1:-1:-1;;;;;24685:47:0;;;;;;;24727:4;24685:47;;;;;;:23;;;;;;:47;;;;;-1:-1:-1;;24685:47:0;;;;;;;;-1:-1:-1;24685:23:0;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;24685:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24685:47:0;;;;24488:252;;;:::o;46194:613::-;46319:7;10258:10;10280:4;10258:27;;:59;;;10289:28;10297:7;10306:10;10289:7;:28::i;:::-;10250:107;;;;;;-1:-1:-1;;;;;;;;;;;10250:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9442:15;;:33;;;;;;-1:-1:-1;;;;;9442:33:0;;;;;;;;;46354:7;;9442:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;9442:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9442:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9442:33:0;9441:34;9433:74;;;;;-1:-1:-1;;;;;;;;;;;9433:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46387:8;;:36;;;;;;-1:-1:-1;;;;;46387:36:0;;;;;;;;;46427:7;;46387:8;;;;;:18;;:36;;;;;;;;;;;;;;;:8;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;46387:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46387:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46387:36:0;:47;;46379:80;;;;;-1:-1:-1;;;;;;;;;;;46379:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46509:8;;37961:37;;;;;;;;;;;;;;;;46561:15;;-1:-1:-1;;;;;46561:15:0;;;46523:63;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;46523:63:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;46523:63:0;;;179:29:-1;;;;160:49;;46470:117:0;;46491:7;;46509:8;;;;46470:12;:117::i;:::-;-1:-1:-1;46629:15:0;;38053:34;;;;;;;;;;;;;;;;46649:45;;;;;;;;;26:21:-1;;;22:32;;;6:49;;46649:45:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;46649:45:0;;;179:29:-1;;;;160:49;;;46598:97:0;;46619:7;;-1:-1:-1;;;;;46629:15:0;;;;;;46598:12;:97::i;:::-;-1:-1:-1;46752:8:0;;46780;;46711:88;;;-1:-1:-1;;;;;46752:8:0;;;46711:88;;;;;;;;46780:8;;;46711:88;;;;;;;;;;;;;;;;;;;;;;;;10368:1;46194:613;;;:::o;42107:1421::-;42227:7;10258:10;10280:4;10258:27;;:59;;;10289:28;10297:7;10306:10;10289:7;:28::i;:::-;10250:107;;;;;;-1:-1:-1;;;;;;;;;;;10250:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9442:15;;:33;;;;;;-1:-1:-1;;;;;9442:33:0;;;;;;;;;42262:7;;9442:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;9442:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9442:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9442:33:0;9441:34;9433:74;;;;;-1:-1:-1;;;;;;;;;;;9433:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42291:8;;;:36;;;;;;-1:-1:-1;;;;;42291:36:0;;;;;;;;;;;;42330:7;;42291:8;;;;:18;;:36;;;;;;;;;;;;;;;:8;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;42291:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42291:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42291:36:0;:46;42287:148;;;42386:8;;;:36;;;;;;-1:-1:-1;;;;;42386:36:0;;;;;;;;;;;;42354:69;;42367:7;;42386:8;;:18;;:36;;;;;;;;;;;;;;:8;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;42386:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42386:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42386:36:0;42376:46;;42354:12;:69::i;:::-;42540:3;;;;;;;;;-1:-1:-1;;;;;42540:3:0;-1:-1:-1;;;;;42540:8:0;;:10;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42540:10:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;42655:8:0;;37961:37;;;;;;;;;;;;;;;;42715:7;;-1:-1:-1;;;;;42715:7:0;;;42669:64;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;42669:64:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;42669:64:0;;;179:29:-1;;;;160:49;;42616:118:0;;-1:-1:-1;42637:7:0;;-1:-1:-1;42655:8:0;;;;;42616:12;:118::i;:::-;-1:-1:-1;42932:7:0;;38231:34;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42945:63:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;42945:63:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;42945:63:0;;;179:29:-1;;;;160:49;;42893:116:0;;42914:7;;42932;;;;42893:12;:116::i;:::-;-1:-1:-1;43116:3:0;;43150;;43116:39;;;;;;-1:-1:-1;;;;;43116:39:0;;;;;;;43150:3;;;43116:39;;;;;;:3;;;;;:7;;:39;;;;;;;;;;;;;;:3;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;43116:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43116:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43116:39:0;:44;43112:172;;;43216:3;;38405:26;;;;;;;;;;;;;;;;43266:3;;-1:-1:-1;;;;;43266:3:0;;;43225:46;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;43225:46:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;43225:46:0;;;179:29:-1;;;;160:49;;43177:95:0;;43198:7;;43216:3;;;;43177:12;:95::i;:::-;;43112:172;43372:3;;:9;;;;;;;;43339:11;;-1:-1:-1;;;;;43372:3:0;;:7;;:9;;;;;;;;;;;;;;:3;:9;;;5:2:-1;;;;30:1;27;20:12;5:2;43372:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43372:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43372:9:0;43353:16;:7;38627:8;43353:16;:11;:16;:::i;:::-;:28;;;;;;;43473:3;;38482:26;;;;;;;;;;;;;;;;43353:28;;;;43482:37;;;;;;;;;26:21:-1;;;22:32;;;6:49;;43482:37:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;43482:37:0;;;179:29:-1;;;;160:49;;;43353:28:0;;-1:-1:-1;43434:86:0;;43455:7;;-1:-1:-1;;;;;43473:3:0;;;;;;43434:12;:86::i;40648:429::-;40823:8;;-1:-1:-1;;;;;40805:27:0;;;40823:8;;40805:27;40797:63;;;;;-1:-1:-1;;;;;;;;;;;40797:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40892:5;40879:18;;;40871:57;;;;;-1:-1:-1;;;;;;;;;;;40871:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40939:60;40947:7;40993:5;40956:34;40980:9;40956:19;40967:7;40956:10;:19::i;:::-;:23;:34;:23;:34;:::i;:::-;:42;;;;;;;;40939:7;:60::i;:::-;41015:54;;;-1:-1:-1;;;;;41015:54:0;;;;;;;;;;;;;;;;;;;;;;;;;40648:429;;;:::o;11623:176::-;11694:38;;;;;;11726:4;11694:38;;;;;;11681:10;;-1:-1:-1;;;;;11694:23:0;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;11694:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11694:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11694:38:0;11774:8;;;11743:48;;;;;;-1:-1:-1;;;;;11774:8:0;;;11743:48;;;;;;;;;;;;11694:38;;-1:-1:-1;11743:22:0;;;;;;:48;;;;;11694:38;;11743:48;;;;;;;;;;;:22;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;11743:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11743:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;11623:176:0:o;37474:23::-;;;-1:-1:-1;;;;;37474:23:0;;:::o;15549:1339::-;15787:12;15817:13;15833:9;15817:25;;15853:16;15872:84;15892:4;15907:7;15917:1;15920:5;;15872:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;15927:6:0;;-1:-1:-1;15935:9:0;;-1:-1:-1;15946:9:0;;-1:-1:-1;15872:11:0;:84::i;:::-;15853:103;;15975:51;16000:7;16009:6;16017:8;15975:24;:51::i;:::-;15967:85;;;;;;;-1:-1:-1;;;;;;;;;;;15967:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16071:35;16090:7;16100:5;;16071:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;16071:10:0;;-1:-1:-1;;;16071:35:0:i;:::-;16063:122;;;;;;-1:-1:-1;;;;;;;;;;;16063:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16196:26;16225:37;16247:7;16256:5;;16225:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;16225:21:0;;-1:-1:-1;;;16225:37:0:i;:::-;16196:66;-1:-1:-1;16298:2:0;16277:23;;16276:47;;16273:536;;;16343:63;16356:7;16365:9;16376;16387:18;16343:12;:63::i;:::-;16340:458;;;16430:23;;;:84;;;16457:57;16476:7;16485:5;;16457:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;16457:57:0;;;;137:4:-1;16457:57:0;;;;;;;;;;;;;;;;;16492:8;;-1:-1:-1;16457:57:0;-1:-1:-1;16502:11:0;;;;;;16457:57;;16502:11;;;;16457:57;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;16457:18:0;;-1:-1:-1;;;16457:57:0:i;:::-;16427:356;;;16632:4;-1:-1:-1;;;;;16624:18:0;16643:5;;16624:25;;;;;30:3:-1;22:6;14;1:33;16624:25:0;;45:16:-1;;;-1:-1;16624:25:0;;-1:-1:-1;16624:25:0;;-1:-1:-1;;16624: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;;16611:38:0;;;;;16672:91;16679:7;16699:9;16688:8;:20;16710:9;16721;16732:18;16752:10;16672:6;:91::i;:::-;16824:56;;;;;;;;;;;;-1:-1:-1;;;;;16824:56:0;;;;;;;;;;;;15549:1339;;;;;;;;;;;;;:::o;41787:142::-;41889:3;;:25;;;;;;-1:-1:-1;;;;;41889:25:0;;;;;;;;;41848:7;;38627:8;;41875:40;;41889:3;;;:7;;:25;;;;;;;;;;;;;;;:3;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;41889:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41889:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41889:25:0;41875:3;;:9;;;;;;;;-1:-1:-1;;;;;41875:3:0;;;;:7;;:9;;;;;41889:25;;41875:9;;;;;;;;:3;:9;;;5:2:-1;;;;30:1;27;20:12;41875:40:0;:46;;;;;;;;;41787:142;-1:-1:-1;;41787:142:0:o;37547:23::-;;;-1:-1:-1;;;;;37547:23:0;;:::o;37767:::-;;;-1:-1:-1;;;;;37767:23:0;;:::o;13536:49::-;;;;;;;;;;;;;:::o;41375:291::-;41598:8;;41509:19;;;;-1:-1:-1;;;;;41580:27:0;;;41598:8;;41580:27;:53;;41632:1;41580:53;;;41610:19;41621:7;41610:10;:19::i;:::-;41566:67;41657:1;;-1:-1:-1;41375:291:0;-1:-1:-1;;;41375:291:0:o;24032:158::-;24151:31;24032:158;:::o;37635:30::-;;;-1:-1:-1;;;;;37635:30:0;;:::o;39993:430::-;40226:8;;40165:17;;-1:-1:-1;;;;;40208:27:0;;;40226:8;;40208:27;40200:63;;;;;-1:-1:-1;;;;;;;;;;;40200:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40274:25;40282:7;40291;40274;:25::i;:::-;-1:-1:-1;40387:8:0;;40345:70;;;-1:-1:-1;;;;;40387:8:0;;;40345:70;;;;;;;;;;;;;;;;40322:7;;40345:70;;;;;;;;;;;;;39993:430;;;;;;:::o;11984:131::-;12059:4;12102:5;-1:-1:-1;;;;;12083:24:0;:7;-1:-1:-1;;;;;12083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12083:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12083:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12083:15:0;-1:-1:-1;;;;;12083:24:0;;;-1:-1:-1;11984:131:0;;;;;:::o;6905:433::-;6963:7;7207:6;;7203:47;;;-1:-1:-1;7237:1:0;7230:8;;7203:47;7274:5;;;7278:1;7274;:5;7298;;;;;;;;:10;7290:19;;;;;;7329:1;6905:433;-1:-1:-1;;;6905:433:0:o;12391:845::-;12497:17;12527:12;12628:7;-1:-1:-1;;;;;12628:12:0;12698:3;12703:6;12711:5;12641:76;;;;;;-1:-1:-1;;;;;12641:76:0;-1:-1:-1;;;;;12641: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;12641:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12641:76:0;;;-1:-1:-1;;26:21;;;22:32;6:49;;12641:76:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;;;;;;;182:15;12641:76:0;179:29:-1;160:49;;12628:90:0;;;;12641:76;;-1:-1:-1;12628:90:0;-1:-1:-1;12628:90:0;;-1:-1:-1;25:18;-1:-1;12628:90:0;-1:-1:-1;12628: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;;;12628: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;12610:108:0;-1:-1:-1;12610:108:0;-1:-1:-1;12610:108:0;12732:26;;;;;12757:1;12743:4;:11;:15;12732:26;12729:500;;;12877:4;12866:25;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12866: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;12866:25:0;;-1:-1:-1;12729:500:0;;-1:-1:-1;;;;12729:500:0;;12927:1;12913:4;:11;:15;12909:320;;;13063:14;13060:1;13057;13042:36;13106:14;13103:1;13096:25;13023:113;13157:7;13156:8;13153:76;;;13181:36;;;-1:-1:-1;;;;;;;;;;;13181:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;13153:76;12391:845;;;;;;;:::o;17741:528::-;18154:94;;18171:10;18154:94;;;;;;;18000:7;18154:94;;;;;;;-1:-1:-1;;;;;18154:94:0;;;;;;;;;;;;;;;;;;;;;;;;18000:7;;;;18192:5;;18199:3;;18204:6;;18212:5;;18219:6;;18227:9;;18238;;18154: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;;18154:94:0;;;;;-1:-1:-1;18154:94:0;;;;;;;-1:-1:-1;18154:94:0;;;;;;;;;;26:21:-1;;;22:32;;6:49;;18154:94:0;;;;;18144:105;;;;;;18056:204;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18056:204:0;;;;;;18032:229;;;;;;17741:528;-1:-1:-1;;;;;;;;;;;;;;17741:528:0:o;24904:181::-;25017:4;25041:36;25061:7;25070:6;25041:19;:36::i;:::-;25034:43;24904:181;-1:-1:-1;;;;24904:181:0:o;22643:431::-;22722:4;22763:2;22747:5;:12;:18;;22739:53;;;;;;;-1:-1:-1;;;;;;;;;;;22739:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23011:4:0;23000:16;22994:23;-1:-1:-1;;;;;23045:21:0;;;;;;;22643:431::o;25473:142::-;25606:1;25473:142;;;;:::o;22032:361::-;22146:4;22178:1;22166:9;:13;:45;;;;;22210:1;22196:11;:15;22166:45;:157;;;;;22267:9;22256:8;:20;22237:7;-1:-1:-1;;;;;22229:24:0;;:47;:93;;;-1:-1:-1;22280:33:0;;;;;;22307:4;22280:33;;;;;;-1:-1:-1;;;;;22280:18:0;;;;;:33;;;;;;;;;;;;;;:18;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;22280:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22280:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22280:33:0;:42;22229:93;22163:201;;;-1:-1:-1;22347:5:0;22340:12;;22163:201;-1:-1:-1;22381:4:0;22032:361;;;;;;:::o;25093:372::-;25305:4;25327:14;25344:40;25358:9;25369:11;25382:1;25344:13;:40::i;:::-;25327:57;;25402:24;25410:7;25419:6;25402:7;:24::i;:::-;25395:31;25093:372;-1:-1:-1;;;;;;25093:372:0:o;21091:705::-;21247:5;:16;;21230:14;21457:13;;:32;;;;;21488:1;21474:11;:15;21457:32;:55;;;;;21503:9;21493:6;:19;;21457:55;21454:335;;;21544:11;21532:9;:23;21529:173;;;21594:11;21585:20;21529:173;;;21668:18;;21529:173;21716:61;21737:7;21747:8;21757:6;21765:11;;;;;;;;;;;;;21716:12;:61::i;19066:473::-;-1:-1:-1;;;;;19179:25:0;;19149:4;19179:25;;;:7;:25;;;;;:31;19169:41;;19166:85;;-1:-1:-1;19234:5:0;19227:12;;19166:85;45:20:-1;-1:-1;;19283:75:0;;25:41:-1;19393:12:0;13522:5;19393:25;19380:38;;19377:82;;;19442:5;19435:12;;;;;19377:82;-1:-1:-1;;;;;;;19469:25:0;;;;;;;;:7;:25;;;;;:40;19527:4;;19066:473::o;19813:800::-;20342:4;20338:16;;;20312:44;;20333:4;20312:44;;20306:51;20403:4;20382:44;;20376:51;20456:44;;;;20450:51;19919:7;;20503:4;20446:62;;;;;20542:2;20537:7;;;:18;;;20548:1;:7;;20553:2;20548:7;20537:18;20529:27;;;;;;;;20574:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20574:31:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;20574:31:0;;-1:-1:-1;;20574:31:0;;;19813:800;-1:-1:-1;;;;;;;;19813:800:0:o
Swarm Source
bzzr://4799972ba6ce61a3bd48380a6917b63dfcff5c5db122ea9ca64e20f611e3eea6
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.