Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
FeesWallet
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-04 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/math/Math.sol pragma solidity ^0.6.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot 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-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: contracts/spec_interfaces/IMigratableFeesWallet.sol pragma solidity 0.6.12; /// @title An interface for Fee wallets that support bucket migration. interface IMigratableFeesWallet { /// Accepts a bucket fees from a old fees wallet as part of a migration /// @dev Called by the old FeesWallet contract. /// @dev Part of the IMigratableFeesWallet interface. /// @dev assumes the caller approved the transfer of the amount prior to calling /// @param bucketStartTime is the start time of the bucket to migration, must be a bucket's valid start time /// @param amount is the amount to migrate (transfer) to the bucket function acceptBucketMigration(uint256 bucketStartTime, uint256 amount) external; } // File: contracts/spec_interfaces/IFeesWallet.sol pragma solidity 0.6.12; /// @title Fees Wallet contract interface, manages the fee buckets interface IFeesWallet { event FeesWithdrawnFromBucket(uint256 bucketId, uint256 withdrawn, uint256 total); event FeesAddedToBucket(uint256 bucketId, uint256 added, uint256 total); /* * External methods */ /// Top-ups the fee pool with the given amount at the given rate /// @dev Called by: subscriptions contract. (not enforced) /// @dev fills the rewards in 30 days buckets based on the monthlyRate /// @param amount is the amount to fill /// @param monthlyRate is the monthly rate /// @param fromTimestamp is the to start fill the buckets, determines the first bucket to fill and the amount filled in the first bucket. function fillFeeBuckets(uint256 amount, uint256 monthlyRate, uint256 fromTimestamp) external; /// Collect fees from the buckets since the last call and transfers the amount back. /// @dev Called by: only FeesAndBootstrapRewards contract /// @dev The amount to collect may be queried before collect by calling getOutstandingFees /// @return collectedFees the amount of fees collected and transferred function collectFees() external returns (uint256 collectedFees) /* onlyRewardsContract */; /// Returns the amount of fees that are currently available for withdrawal /// @param currentTime is the time to check the pending fees for /// @return outstandingFees is the amount of pending fees to collect at time currentTime function getOutstandingFees(uint256 currentTime) external view returns (uint256 outstandingFees); /* * General governance */ event EmergencyWithdrawal(address addr, address token); /// Migrates the fees of a bucket starting at startTimestamp. /// @dev governance function called only by the migration manager /// @dev Calls acceptBucketMigration in the destination contract. /// @param destination is the address of the new FeesWallet contract /// @param bucketStartTime is the start time of the bucket to migration, must be a bucket's valid start time function migrateBucket(IMigratableFeesWallet destination, uint256 bucketStartTime) external /* onlyMigrationManager */; /// Accepts a fees bucket balance from a old fees wallet as part of the fees wallet migration /// @dev Called by the old FeesWallet contract. /// @dev Part of the IMigratableFeesWallet interface. /// @dev assumes the caller approved the amount prior to calling /// @param bucketStartTime is the start time of the bucket to migration, must be a bucket's valid start time /// @param amount is the amount to migrate (transfer) to the bucket function acceptBucketMigration(uint256 bucketStartTime, uint256 amount) external; /// Emergency withdraw the contract funds /// @dev governance function called only by the migration manager /// @dev used in emergencies only, where migrateBucket is not a suitable solution /// @param erc20 is the erc20 address of the token to withdraw function emergencyWithdraw(address erc20) external /* onlyMigrationManager */; } // File: contracts/spec_interfaces/IManagedContract.sol pragma solidity 0.6.12; /// @title managed contract interface, used by the contracts registry to notify the contract on updates interface IManagedContract /* is ILockable, IContractRegistryAccessor, Initializable */ { /// Refreshes the address of the other contracts the contract interacts with /// @dev called by the registry contract upon an update of a contract in the registry function refreshContracts() external; } // File: contracts/spec_interfaces/IContractRegistry.sol pragma solidity 0.6.12; /// @title Contract registry contract interface /// @dev The contract registry holds Orbs PoS contracts and managers lists /// @dev The contract registry updates the managed contracts on changes in the contract list /// @dev Governance functions restricted to managers access the registry to retrieve the manager address /// @dev The contract registry represents the source of truth for Orbs Ethereum contracts /// @dev By tracking the registry events or query before interaction, one can access the up to date contracts interface IContractRegistry { event ContractAddressUpdated(string contractName, address addr, bool managedContract); event ManagerChanged(string role, address newManager); event ContractRegistryUpdated(address newContractRegistry); /* * External functions */ /// Updates the contracts address and emits a corresponding event /// @dev governance function called only by the migrationManager or registryAdmin /// @param contractName is the contract name, used to identify it /// @param addr is the contract updated address /// @param managedContract indicates whether the contract is managed by the registry and notified on changes function setContract(string calldata contractName, address addr, bool managedContract) external /* onlyAdminOrMigrationManager */; /// Returns the current address of the given contracts /// @param contractName is the contract name, used to identify it /// @return addr is the contract updated address function getContract(string calldata contractName) external view returns (address); /// Returns the list of contract addresses managed by the registry /// @dev Managed contracts are updated on changes in the registry contracts addresses /// @return addrs is the list of managed contracts function getManagedContracts() external view returns (address[] memory); /// Locks all the managed contracts /// @dev governance function called only by the migrationManager or registryAdmin /// @dev When set all onlyWhenActive functions will revert function lockContracts() external /* onlyAdminOrMigrationManager */; /// Unlocks all the managed contracts /// @dev governance function called only by the migrationManager or registryAdmin function unlockContracts() external /* onlyAdminOrMigrationManager */; /// Updates a manager address and emits a corresponding event /// @dev governance function called only by the registryAdmin /// @dev the managers list is a flexible list of role to the manager's address /// @param role is the managers' role name, for example "functionalManager" /// @param manager is the manager updated address function setManager(string calldata role, address manager) external /* onlyAdmin */; /// Returns the current address of the given manager /// @param role is the manager name, used to identify it /// @return addr is the manager updated address function getManager(string calldata role) external view returns (address); /// Sets a new contract registry to migrate to /// @dev governance function called only by the registryAdmin /// @dev updates the registry address record in all the managed contracts /// @dev by tracking the emitted ContractRegistryUpdated, tools can track the up to date contracts /// @param newRegistry is the new registry contract function setNewContractRegistry(IContractRegistry newRegistry) external /* onlyAdmin */; /// Returns the previous contract registry address /// @dev used when the setting the contract as a new registry to assure a valid registry /// @return previousContractRegistry is the previous contract registry function getPreviousContractRegistry() external view returns (address); } // File: contracts/spec_interfaces/IContractRegistryAccessor.sol pragma solidity 0.6.12; interface IContractRegistryAccessor { /// Sets the contract registry address /// @dev governance function called only by an admin /// @param newRegistry is the new registry contract function setContractRegistry(IContractRegistry newRegistry) external /* onlyAdmin */; /// Returns the contract registry address /// @return contractRegistry is the contract registry address function getContractRegistry() external view returns (IContractRegistry contractRegistry); function setRegistryAdmin(address _registryAdmin) external /* onlyInitializationAdmin */; } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: contracts/WithClaimableRegistryManagement.sol pragma solidity 0.6.12; /** * @title Claimable * @dev Extension for the Ownable contract, where the ownership needs to be claimed. * This allows the new owner to accept the transfer. */ contract WithClaimableRegistryManagement is Context { address private _registryAdmin; address private _pendingRegistryAdmin; event RegistryManagementTransferred(address indexed previousRegistryAdmin, address indexed newRegistryAdmin); /** * @dev Initializes the contract setting the deployer as the initial registryRegistryAdmin. */ constructor () internal { address msgSender = _msgSender(); _registryAdmin = msgSender; emit RegistryManagementTransferred(address(0), msgSender); } /** * @dev Returns the address of the current registryAdmin. */ function registryAdmin() public view returns (address) { return _registryAdmin; } /** * @dev Throws if called by any account other than the registryAdmin. */ modifier onlyRegistryAdmin() { require(isRegistryAdmin(), "WithClaimableRegistryManagement: caller is not the registryAdmin"); _; } /** * @dev Returns true if the caller is the current registryAdmin. */ function isRegistryAdmin() public view returns (bool) { return _msgSender() == _registryAdmin; } /** * @dev Leaves the contract without registryAdmin. It will not be possible to call * `onlyManager` functions anymore. Can only be called by the current registryAdmin. * * NOTE: Renouncing registryManagement will leave the contract without an registryAdmin, * thereby removing any functionality that is only available to the registryAdmin. */ function renounceRegistryManagement() public onlyRegistryAdmin { emit RegistryManagementTransferred(_registryAdmin, address(0)); _registryAdmin = address(0); } /** * @dev Transfers registryManagement of the contract to a new account (`newManager`). */ function _transferRegistryManagement(address newRegistryAdmin) internal { require(newRegistryAdmin != address(0), "RegistryAdmin: new registryAdmin is the zero address"); emit RegistryManagementTransferred(_registryAdmin, newRegistryAdmin); _registryAdmin = newRegistryAdmin; } /** * @dev Modifier throws if called by any account other than the pendingManager. */ modifier onlyPendingRegistryAdmin() { require(msg.sender == _pendingRegistryAdmin, "Caller is not the pending registryAdmin"); _; } /** * @dev Allows the current registryAdmin to set the pendingManager address. * @param newRegistryAdmin The address to transfer registryManagement to. */ function transferRegistryManagement(address newRegistryAdmin) public onlyRegistryAdmin { _pendingRegistryAdmin = newRegistryAdmin; } /** * @dev Allows the _pendingRegistryAdmin address to finalize the transfer. */ function claimRegistryManagement() external onlyPendingRegistryAdmin { _transferRegistryManagement(_pendingRegistryAdmin); _pendingRegistryAdmin = address(0); } /** * @dev Returns the current pendingRegistryAdmin */ function pendingRegistryAdmin() public view returns (address) { return _pendingRegistryAdmin; } } // File: contracts/Initializable.sol pragma solidity 0.6.12; contract Initializable { address private _initializationAdmin; event InitializationComplete(); /// Constructor /// Sets the initializationAdmin to the contract deployer /// The initialization admin may call any manager only function until initializationComplete constructor() public{ _initializationAdmin = msg.sender; } modifier onlyInitializationAdmin() { require(msg.sender == initializationAdmin(), "sender is not the initialization admin"); _; } /* * External functions */ /// Returns the initializationAdmin address function initializationAdmin() public view returns (address) { return _initializationAdmin; } /// Finalizes the initialization and revokes the initializationAdmin role function initializationComplete() external onlyInitializationAdmin { _initializationAdmin = address(0); emit InitializationComplete(); } /// Checks if the initialization was completed function isInitializationComplete() public view returns (bool) { return _initializationAdmin == address(0); } } // File: contracts/ContractRegistryAccessor.sol pragma solidity 0.6.12; contract ContractRegistryAccessor is IContractRegistryAccessor, WithClaimableRegistryManagement, Initializable { IContractRegistry private contractRegistry; /// Constructor /// @param _contractRegistry is the contract registry address /// @param _registryAdmin is the registry admin address constructor(IContractRegistry _contractRegistry, address _registryAdmin) public { require(address(_contractRegistry) != address(0), "_contractRegistry cannot be 0"); setContractRegistry(_contractRegistry); _transferRegistryManagement(_registryAdmin); } modifier onlyAdmin { require(isAdmin(), "sender is not an admin (registryManger or initializationAdmin)"); _; } modifier onlyMigrationManager { require(isMigrationManager(), "sender is not the migration manager"); _; } modifier onlyFunctionalManager { require(isFunctionalManager(), "sender is not the functional manager"); _; } /// Checks whether the caller is Admin: either the contract registry, the registry admin, or the initialization admin function isAdmin() internal view returns (bool) { return msg.sender == address(contractRegistry) || msg.sender == registryAdmin() || msg.sender == initializationAdmin(); } /// Checks whether the caller is a specific manager role or and Admin /// @dev queries the registry contract for the up to date manager assignment function isManager(string memory role) internal view returns (bool) { IContractRegistry _contractRegistry = contractRegistry; return isAdmin() || _contractRegistry != IContractRegistry(0) && contractRegistry.getManager(role) == msg.sender; } /// Checks whether the caller is the migration manager function isMigrationManager() internal view returns (bool) { return isManager('migrationManager'); } /// Checks whether the caller is the functional manager function isFunctionalManager() internal view returns (bool) { return isManager('functionalManager'); } /* * Contract getters, return the address of a contract by calling the contract registry */ function getProtocolContract() internal view returns (address) { return contractRegistry.getContract("protocol"); } function getStakingRewardsContract() internal view returns (address) { return contractRegistry.getContract("stakingRewards"); } function getFeesAndBootstrapRewardsContract() internal view returns (address) { return contractRegistry.getContract("feesAndBootstrapRewards"); } function getCommitteeContract() internal view returns (address) { return contractRegistry.getContract("committee"); } function getElectionsContract() internal view returns (address) { return contractRegistry.getContract("elections"); } function getDelegationsContract() internal view returns (address) { return contractRegistry.getContract("delegations"); } function getGuardiansRegistrationContract() internal view returns (address) { return contractRegistry.getContract("guardiansRegistration"); } function getCertificationContract() internal view returns (address) { return contractRegistry.getContract("certification"); } function getStakingContract() internal view returns (address) { return contractRegistry.getContract("staking"); } function getSubscriptionsContract() internal view returns (address) { return contractRegistry.getContract("subscriptions"); } function getStakingRewardsWallet() internal view returns (address) { return contractRegistry.getContract("stakingRewardsWallet"); } function getBootstrapRewardsWallet() internal view returns (address) { return contractRegistry.getContract("bootstrapRewardsWallet"); } function getGeneralFeesWallet() internal view returns (address) { return contractRegistry.getContract("generalFeesWallet"); } function getCertifiedFeesWallet() internal view returns (address) { return contractRegistry.getContract("certifiedFeesWallet"); } function getStakingContractHandler() internal view returns (address) { return contractRegistry.getContract("stakingContractHandler"); } /* * Governance functions */ event ContractRegistryAddressUpdated(address addr); /// Sets the contract registry address /// @dev governance function called only by an admin /// @param newContractRegistry is the new registry contract function setContractRegistry(IContractRegistry newContractRegistry) public override onlyAdmin { require(newContractRegistry.getPreviousContractRegistry() == address(contractRegistry), "new contract registry must provide the previous contract registry"); contractRegistry = newContractRegistry; emit ContractRegistryAddressUpdated(address(newContractRegistry)); } /// Returns the contract registry that the contract is set to use /// @return contractRegistry is the registry contract address function getContractRegistry() public override view returns (IContractRegistry) { return contractRegistry; } function setRegistryAdmin(address _registryAdmin) external override onlyInitializationAdmin { _transferRegistryManagement(_registryAdmin); } } // File: contracts/spec_interfaces/ILockable.sol pragma solidity 0.6.12; /// @title lockable contract interface, allows to lock a contract interface ILockable { event Locked(); event Unlocked(); /// Locks the contract to external non-governance function calls /// @dev governance function called only by the migration manager or an admin /// @dev typically called by the registry contract upon locking all managed contracts /// @dev getters and migration functions remain active also for locked contracts /// @dev checked by the onlyWhenActive modifier function lock() external /* onlyMigrationManager */; /// Unlocks the contract /// @dev governance function called only by the migration manager or an admin /// @dev typically called by the registry contract upon unlocking all managed contracts function unlock() external /* onlyMigrationManager */; /// Returns the contract locking status /// @return isLocked is a bool indicating the contract is locked function isLocked() view external returns (bool); } // File: contracts/Lockable.sol pragma solidity 0.6.12; /// @title lockable contract contract Lockable is ILockable, ContractRegistryAccessor { bool public locked; /// Constructor /// @param _contractRegistry is the contract registry address /// @param _registryAdmin is the registry admin address constructor(IContractRegistry _contractRegistry, address _registryAdmin) ContractRegistryAccessor(_contractRegistry, _registryAdmin) public {} /// Locks the contract to external non-governance function calls /// @dev governance function called only by the migration manager or an admin /// @dev typically called by the registry contract upon locking all managed contracts /// @dev getters and migration functions remain active also for locked contracts /// @dev checked by the onlyWhenActive modifier function lock() external override onlyMigrationManager { locked = true; emit Locked(); } /// Unlocks the contract /// @dev governance function called only by the migration manager or an admin /// @dev typically called by the registry contract upon unlocking all managed contracts function unlock() external override onlyMigrationManager { locked = false; emit Unlocked(); } /// Returns the contract locking status /// @return isLocked is a bool indicating the contract is locked function isLocked() external override view returns (bool) { return locked; } modifier onlyWhenActive() { require(!locked, "contract is locked for this operation"); _; } } // File: contracts/ManagedContract.sol pragma solidity 0.6.12; /// @title managed contract contract ManagedContract is IManagedContract, Lockable { /// @param _contractRegistry is the contract registry address /// @param _registryAdmin is the registry admin address constructor(IContractRegistry _contractRegistry, address _registryAdmin) Lockable(_contractRegistry, _registryAdmin) public {} /// Refreshes the address of the other contracts the contract interacts with /// @dev called by the registry contract upon an update of a contract in the registry function refreshContracts() virtual override external {} } // File: contracts/FeesWallet.sol pragma solidity 0.6.12; /// @title Fees Wallet contract interface, manages the fee buckets contract FeesWallet is IFeesWallet, ManagedContract { using SafeMath for uint256; uint256 constant BUCKET_TIME_PERIOD = 30 days; uint constant MAX_FEE_BUCKET_ITERATIONS = 24; IERC20 public token; mapping(uint256 => uint256) public buckets; uint256 public lastCollectedAt; /// Constructor /// @param _contractRegistry is the contract registry address /// @param _registryAdmin is the registry admin address /// @param _token is the token used for virtual chains fees constructor(IContractRegistry _contractRegistry, address _registryAdmin, IERC20 _token) ManagedContract(_contractRegistry, _registryAdmin) public { token = _token; lastCollectedAt = block.timestamp; } modifier onlyRewardsContract() { require(msg.sender == rewardsContract, "caller is not the rewards contract"); _; } /* * External methods */ /// Top-ups the fee pool with the given amount at the given rate /// @dev Called by: subscriptions contract. (not enforced) /// @dev fills the rewards in 30 days buckets based on the monthlyRate /// @param amount is the amount to fill /// @param monthlyRate is the monthly rate /// @param fromTimestamp is the to start fill the buckets, determines the first bucket to fill and the amount filled in the first bucket. function fillFeeBuckets(uint256 amount, uint256 monthlyRate, uint256 fromTimestamp) external override onlyWhenActive { uint256 bucket = _bucketTime(fromTimestamp); require(bucket >= _bucketTime(block.timestamp), "FeeWallet::cannot fill bucket from the past"); uint256 _amount = amount; // add the partial amount to the first bucket uint256 bucketAmount = Math.min(amount, monthlyRate.mul(BUCKET_TIME_PERIOD.sub(fromTimestamp % BUCKET_TIME_PERIOD)).div(BUCKET_TIME_PERIOD)); fillFeeBucket(bucket, bucketAmount); _amount = _amount.sub(bucketAmount); // following buckets are added with the monthly rate while (_amount > 0) { bucket = bucket.add(BUCKET_TIME_PERIOD); bucketAmount = Math.min(monthlyRate, _amount); fillFeeBucket(bucket, bucketAmount); _amount = _amount.sub(bucketAmount); } require(token.transferFrom(msg.sender, address(this), amount), "failed to transfer fees into fee wallet"); } /// Collect fees from the buckets since the last call and transfers the amount back. /// @dev Called by: only FeesAndBootstrapRewards contract /// @dev The amount to collect may be queried before collect by calling getOutstandingFees /// @return collectedFees the amount of fees collected and transferred function collectFees() external override onlyRewardsContract returns (uint256 collectedFees) { (uint256 _collectedFees, uint[] memory bucketsWithdrawn, uint[] memory amountsWithdrawn, uint[] memory newTotals) = _getOutstandingFees(block.timestamp); for (uint i = 0; i < bucketsWithdrawn.length; i++) { buckets[bucketsWithdrawn[i]] = newTotals[i]; emit FeesWithdrawnFromBucket(bucketsWithdrawn[i], amountsWithdrawn[i], newTotals[i]); } lastCollectedAt = block.timestamp; require(token.transfer(msg.sender, _collectedFees), "FeesWallet::failed to transfer collected fees to rewards"); return _collectedFees; } /// Returns the amount of fees that are currently available for withdrawal /// @param currentTime is the time to check the pending fees for /// @return outstandingFees is the amount of pending fees to collect at time currentTime function getOutstandingFees(uint256 currentTime) external override view returns (uint256 outstandingFees) { require(currentTime >= block.timestamp, "currentTime must not be in the past"); (outstandingFees,,,) = _getOutstandingFees(currentTime); } /* * Governance functions */ /// Migrates the fees of a bucket starting at startTimestamp. /// @dev governance function called only by the migration manager /// @dev Calls acceptBucketMigration in the destination contract. /// @param destination is the address of the new FeesWallet contract /// @param bucketStartTime is the start time of the bucket to migration, must be a bucket's valid start time function migrateBucket(IMigratableFeesWallet destination, uint256 bucketStartTime) external override onlyMigrationManager { require(_bucketTime(bucketStartTime) == bucketStartTime, "bucketStartTime must be the start time of a bucket"); uint bucketAmount = buckets[bucketStartTime]; if (bucketAmount == 0) return; buckets[bucketStartTime] = 0; emit FeesWithdrawnFromBucket(bucketStartTime, bucketAmount, 0); token.approve(address(destination), bucketAmount); destination.acceptBucketMigration(bucketStartTime, bucketAmount); } /// Accepts a fees bucket balance from a previous fees wallet as part of the fees wallet migration /// @dev Called by the old FeesWallet contract. /// @dev Part of the IMigratableFeesWallet interface. /// @dev assumes the caller approved the amount prior to calling /// @param bucketStartTime is the start time of the bucket to migration, must be a bucket's valid start time /// @param amount is the amount to migrate (transfer) to the bucket function acceptBucketMigration(uint256 bucketStartTime, uint256 amount) external override { require(_bucketTime(bucketStartTime) == bucketStartTime, "bucketStartTime must be the start time of a bucket"); fillFeeBucket(bucketStartTime, amount); require(token.transferFrom(msg.sender, address(this), amount), "failed to transfer fees into fee wallet on bucket migration"); } /// Emergency withdraw the contract funds /// @dev governance function called only by the migration manager /// @dev used in emergencies only, where migrateBucket is not a suitable solution /// @param erc20 is the erc20 address of the token to withdraw function emergencyWithdraw(address erc20) external override onlyMigrationManager { IERC20 _token = IERC20(erc20); emit EmergencyWithdrawal(msg.sender, address(_token)); require(_token.transfer(msg.sender, _token.balanceOf(address(this))), "FeesWallet::emergencyWithdraw - transfer failed"); } /* * Private methods */ /// Fills a bucket with the given amount and emits a corresponding event function fillFeeBucket(uint256 bucketId, uint256 amount) private { uint256 bucketTotal = buckets[bucketId].add(amount); buckets[bucketId] = bucketTotal; emit FeesAddedToBucket(bucketId, amount, bucketTotal); } /// Returns the amount of fees that are currently available for withdrawal /// Private function utilized by collectFees and getOutstandingFees /// @dev the buckets details returned by the function are used for the corresponding events generation /// @param currentTime is the time to check the pending fees for /// @return outstandingFees is the amount of pending fees to collect at time currentTime /// @return bucketsWithdrawn is the list of buckets that fees were withdrawn from /// @return withdrawnAmounts is the list of amounts withdrawn from the buckets /// @return newTotals is the updated total of the buckets function _getOutstandingFees(uint256 currentTime) private view returns (uint256 outstandingFees, uint[] memory bucketsWithdrawn, uint[] memory withdrawnAmounts, uint[] memory newTotals) { uint _lastCollectedAt = lastCollectedAt; uint nUpdatedBuckets = _bucketTime(currentTime).sub(_bucketTime(_lastCollectedAt)).div(BUCKET_TIME_PERIOD).add(1); bucketsWithdrawn = new uint[](nUpdatedBuckets); withdrawnAmounts = new uint[](nUpdatedBuckets); newTotals = new uint[](nUpdatedBuckets); uint bucketsPayed = 0; while (bucketsPayed < MAX_FEE_BUCKET_ITERATIONS && _lastCollectedAt < currentTime) { uint256 bucketStart = _bucketTime(_lastCollectedAt); uint256 bucketEnd = bucketStart.add(BUCKET_TIME_PERIOD); uint256 payUntil = Math.min(bucketEnd, currentTime); uint256 bucketDuration = payUntil.sub(_lastCollectedAt); uint256 remainingBucketTime = bucketEnd.sub(_lastCollectedAt); uint256 bucketTotal = buckets[bucketStart]; uint256 amount = bucketTotal.mul(bucketDuration).div(remainingBucketTime); outstandingFees = outstandingFees.add(amount); bucketTotal = bucketTotal.sub(amount); bucketsWithdrawn[bucketsPayed] = bucketStart; withdrawnAmounts[bucketsPayed] = amount; newTotals[bucketsPayed] = bucketTotal; _lastCollectedAt = payUntil; bucketsPayed++; } } /// Returns the start time of a bucket, used also to identify the bucket function _bucketTime(uint256 time) private pure returns (uint256) { return time.sub(time % BUCKET_TIME_PERIOD); } /* * Contracts topology / registry interface */ address rewardsContract; /// Refreshes the address of the other contracts the contract interacts with /// @dev called by the registry contract upon an update of a contract in the registry function refreshContracts() external override { rewardsContract = getFeesAndBootstrapRewardsContract(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IContractRegistry","name":"_contractRegistry","type":"address"},{"internalType":"address","name":"_registryAdmin","type":"address"},{"internalType":"contract IERC20","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"ContractRegistryAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"EmergencyWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bucketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"added","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"FeesAddedToBucket","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bucketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"FeesWithdrawnFromBucket","type":"event"},{"anonymous":false,"inputs":[],"name":"InitializationComplete","type":"event"},{"anonymous":false,"inputs":[],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousRegistryAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newRegistryAdmin","type":"address"}],"name":"RegistryManagementTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"Unlocked","type":"event"},{"inputs":[{"internalType":"uint256","name":"bucketStartTime","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"acceptBucketMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"buckets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRegistryManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectFees","outputs":[{"internalType":"uint256","name":"collectedFees","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"monthlyRate","type":"uint256"},{"internalType":"uint256","name":"fromTimestamp","type":"uint256"}],"name":"fillFeeBuckets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getContractRegistry","outputs":[{"internalType":"contract IContractRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"currentTime","type":"uint256"}],"name":"getOutstandingFees","outputs":[{"internalType":"uint256","name":"outstandingFees","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initializationAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initializationComplete","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitializationComplete","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRegistryAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastCollectedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IMigratableFeesWallet","name":"destination","type":"address"},{"internalType":"uint256","name":"bucketStartTime","type":"uint256"}],"name":"migrateBucket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pendingRegistryAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refreshContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registryAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceRegistryManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IContractRegistry","name":"newContractRegistry","type":"address"}],"name":"setContractRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_registryAdmin","type":"address"}],"name":"setRegistryAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistryAdmin","type":"address"}],"name":"transferRegistryManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200241838038062002418833981810160405260608110156200003757600080fd5b508051602082015160409092015190919082828181818160006200005a6200014b565b600080546001600160a01b0319166001600160a01b038316908117825560405192935091600080516020620023f8833981519152908290a350600280546001600160a01b031916331790556001600160a01b03821662000101576040805162461bcd60e51b815260206004820152601d60248201527f5f636f6e747261637452656769737472792063616e6e6f742062652030000000604482015290519081900360640190fd5b6200010c826200014f565b6200011781620002a7565b5050600480546001600160a01b0319166001600160a01b03969096169590951790945550504260065550620003b892505050565b3390565b6200015962000338565b620001965760405162461bcd60e51b815260040180806020018281038252603e81526020018062002345603e913960400191505060405180910390fd5b600354604080516301e32edf60e21b815290516001600160a01b039283169284169163078cbb7c916004808301926020929190829003018186803b158015620001de57600080fd5b505afa158015620001f3573d6000803e3d6000fd5b505050506040513d60208110156200020a57600080fd5b50516001600160a01b031614620002535760405162461bcd60e51b8152600401808060200182810382526041815260200180620023836041913960600191505060405180910390fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517ffea2d033438b968078a6264409d0104b5f3d2ce7b795afc74918e70f3534f22b9181900360200190a150565b6001600160a01b038116620002ee5760405162461bcd60e51b8152600401808060200182810382526034815260200180620023c46034913960400191505060405180910390fd5b600080546040516001600160a01b0380851693921691600080516020620023f883398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6003546000906001600160a01b03163314806200036f57506200035a6200039a565b6001600160a01b0316336001600160a01b0316145b8062000395575062000380620003a9565b6001600160a01b0316336001600160a01b0316145b905090565b6000546001600160a01b031690565b6002546001600160a01b031690565b611f7d80620003c86000396000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80639b51fb0d116100ee578063cf30901211610097578063eec0701f11610071578063eec0701f1461038b578063f83d08ba14610393578063fc0c546a1461039b578063fcd13d65146103a3576101ae565b8063cf30901214610373578063d25235261461037b578063e4e9922214610383576101ae565b8063acdb8e04116100c8578063acdb8e0414610346578063b20a09521461034e578063c87965721461036b576101ae565b80639b51fb0d14610319578063a4e2d63414610336578063a69df4b51461033e576101ae565b806339069d8c1161015b5780636ff1c9bc116101355780636ff1c9bc146102a8578063732852e0146102ce57806374c16b23146102f757806374c3583e146102ff576101ae565b806339069d8c1461027257806348106fe3146102985780635f94cd9c146102a0576101ae565b80632987cea01161018c5780632987cea0146102205780632a1fac7214610246578063333df1541461024e576101ae565b8063133afda3146101b35780631a0b2c4f146101e1578063209ab43e146101fd575b600080fd5b6101df600480360360408110156101c957600080fd5b506001600160a01b0381351690602001356103c9565b005b6101e96105e3565b604080519115158252519081900360200190f35b6101df6004803603604081101561021357600080fd5b5080359060200135610607565b6101df6004803603602081101561023657600080fd5b50356001600160a01b0316610732565b6101df6107af565b610256610859565b604080516001600160a01b039092168252519081900360200190f35b6101df6004803603602081101561028857600080fd5b50356001600160a01b0316610868565b6101e96108cb565b6102566108db565b6101df600480360360208110156102be57600080fd5b50356001600160a01b03166108ea565b6101df600480360360608110156102e457600080fd5b5080359060208101359060400135610ac6565b610256610cdb565b610307610cea565b60408051918252519081900360200190f35b6103076004803603602081101561032f57600080fd5b5035610cf0565b6101e9610d02565b6101df610d23565b6101df610db9565b6103076004803603602081101561036457600080fd5b5035610e5e565b610307610eb2565b6101e96110cb565b6101df6110ec565b610256611174565b6101df611183565b6101df6111c5565b610256611272565b6101df600480360360208110156103b957600080fd5b50356001600160a01b0316611281565b6103d1611401565b61040c5760405162461bcd60e51b8152600401808060200182810382526023815260200180611e556023913960400191505060405180910390fd5b8061041682611446565b146104525760405162461bcd60e51b8152600401808060200182810382526033815260200180611c6b6033913960400191505060405180910390fd5b6000818152600560205260409020548061046c57506105df565b600082815260056020908152604080832083905580518581529182018490528181019290925290517ff7cf471b1a70d08124afae779569878256f4d0fd4729dc55cfb0025571dcf4999181900360600190a160048054604080517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0387811694820194909452602481018590529051929091169163095ea7b3916044808201926020929091908290030181600087803b15801561053157600080fd5b505af1158015610545573d6000803e3d6000fd5b505050506040513d602081101561055b57600080fd5b5050604080517f209ab43e000000000000000000000000000000000000000000000000000000008152600481018490526024810183905290516001600160a01b0385169163209ab43e91604480830192600092919082900301818387803b1580156105c557600080fd5b505af11580156105d9573d6000803e3d6000fd5b50505050505b5050565b600080546001600160a01b03166105f861145d565b6001600160a01b031614905090565b8161061183611446565b1461064d5760405162461bcd60e51b8152600401808060200182810382526033815260200180611c6b6033913960400191505060405180910390fd5b6106578282611461565b60048054604080517f23b872dd000000000000000000000000000000000000000000000000000000008152339381019390935230602484015260448301849052516001600160a01b03909116916323b872dd9160648083019260209291908290030181600087803b1580156106cb57600080fd5b505af11580156106df573d6000803e3d6000fd5b505050506040513d60208110156106f557600080fd5b50516105df5760405162461bcd60e51b815260040180806020018281038252603b815260200180611f0d603b913960400191505060405180910390fd5b61073a6105e3565b6107755760405162461bcd60e51b8152600401808060200182810382526040815260200180611ecd6040913960400191505060405180910390fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6107b7610859565b6001600160a01b0316336001600160a01b0316146108065760405162461bcd60e51b8152600401808060200182810382526026815260200180611dd56026913960400191505060405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556040517f2a2b3ea974fb057582c3b210ef8b5f81492d15673f49d4384bfa3b896a964c3c90600090a1565b6002546001600160a01b031690565b610870610859565b6001600160a01b0316336001600160a01b0316146108bf5760405162461bcd60e51b8152600401808060200182810382526026815260200180611dd56026913960400191505060405180910390fd5b6108c8816114d5565b50565b6002546001600160a01b03161590565b6001546001600160a01b031690565b6108f2611401565b61092d5760405162461bcd60e51b8152600401808060200182810382526023815260200180611e556023913960400191505060405180910390fd5b604080513381526001600160a01b0383166020820152815183927ff5b6d8b404f034718f55a370884db03c4e27e9652e2636d4adcd0540d7c4203f928290030190a1806001600160a01b031663a9059cbb33836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156109cc57600080fd5b505afa1580156109e0573d6000803e3d6000fd5b505050506040513d60208110156109f657600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b158015610a5f57600080fd5b505af1158015610a73573d6000803e3d6000fd5b505050506040513d6020811015610a8957600080fd5b50516105df5760405162461bcd60e51b815260040180806020018281038252602f815260200180611dfb602f913960400191505060405180910390fd5b60035474010000000000000000000000000000000000000000900460ff1615610b205760405162461bcd60e51b8152600401808060200182810382526025815260200180611c9e6025913960400191505060405180910390fd5b6000610b2b82611446565b9050610b3642611446565b811015610b745760405162461bcd60e51b815260040180806020018281038252602b815260200180611e2a602b913960400191505060405180910390fd5b836000610ba382610b9e62278d00610b98610b9182808b0661158d565b8a906115d6565b9061162f565b611671565b9050610baf8382611461565b610bb9828261158d565b91505b8115610bf857610bcf8362278d00611687565b9250610bdb8583611671565b9050610be78382611461565b610bf1828261158d565b9150610bbc565b60048054604080517f23b872dd000000000000000000000000000000000000000000000000000000008152339381019390935230602484015260448301899052516001600160a01b03909116916323b872dd9160648083019260209291908290030181600087803b158015610c6c57600080fd5b505af1158015610c80573d6000803e3d6000fd5b505050506040513d6020811015610c9657600080fd5b5051610cd35760405162461bcd60e51b8152600401808060200182810382526027815260200180611d646027913960400191505060405180910390fd5b505050505050565b6000546001600160a01b031690565b60065481565b60056020526000908152604090205481565b60035474010000000000000000000000000000000000000000900460ff1690565b610d2b611401565b610d665760405162461bcd60e51b8152600401808060200182810382526023815260200180611e556023913960400191505060405180910390fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f19aad37188a1d3921e29eb3c66acf43d81975e107cb650d58cca878627955fd690600090a1565b610dc16105e3565b610dfc5760405162461bcd60e51b8152600401808060200182810382526040815260200180611ecd6040913960400191505060405180910390fd5b600080546040516001600160a01b03909116907f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600042821015610e9f5760405162461bcd60e51b8152600401808060200182810382526023815260200180611db26023913960400191505060405180910390fd5b610ea8826116e1565b5091949350505050565b6007546000906001600160a01b03163314610efe5760405162461bcd60e51b8152600401808060200182810382526022815260200180611d426022913960400191505060405180910390fd5b60006060806060610f0e426116e1565b935093509350935060005b8351811015610fe857818181518110610f2e57fe5b602002602001015160056000868481518110610f4657fe5b60200260200101518152602001908152602001600020819055507ff7cf471b1a70d08124afae779569878256f4d0fd4729dc55cfb0025571dcf499848281518110610f8d57fe5b6020026020010151848381518110610fa157fe5b6020026020010151848481518110610fb557fe5b602002602001015160405180848152602001838152602001828152602001935050505060405180910390a1600101610f19565b504260065560048054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152339381019390935260248301879052516001600160a01b039091169163a9059cbb9160448083019260209291908290030181600087803b15801561105b57600080fd5b505af115801561106f573d6000803e3d6000fd5b505050506040513d602081101561108557600080fd5b50516110c25760405162461bcd60e51b8152600401808060200182810382526038815260200180611c336038913960400191505060405180910390fd5b50919250505090565b60035474010000000000000000000000000000000000000000900460ff1681565b6001546001600160a01b031633146111355760405162461bcd60e51b8152600401808060200182810382526027815260200180611d8b6027913960400191505060405180910390fd5b60015461114a906001600160a01b03166114d5565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6003546001600160a01b031690565b61118b6118ec565b600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6111cd611401565b6112085760405162461bcd60e51b8152600401808060200182810382526023815260200180611e556023913960400191505060405180910390fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f0f2e5b6c72c6a4491efd919a9f9a409f324ef0708c11ee57d410c2cb06c0992b90600090a1565b6004546001600160a01b031681565b6112896119ad565b6112c45760405162461bcd60e51b815260040180806020018281038252603e815260200180611cc3603e913960400191505060405180910390fd5b600354604080517f078cbb7c00000000000000000000000000000000000000000000000000000000815290516001600160a01b039283169284169163078cbb7c916004808301926020929190829003018186803b15801561132457600080fd5b505afa158015611338573d6000803e3d6000fd5b505050506040513d602081101561134e57600080fd5b50516001600160a01b0316146113955760405162461bcd60e51b8152600401808060200182810382526041815260200180611d016041913960600191505060405180910390fd5b600380546001600160a01b0383167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517ffea2d033438b968078a6264409d0104b5f3d2ce7b795afc74918e70f3534f22b9181900360200190a150565b60006114416040518060400160405280601081526020017f6d6967726174696f6e4d616e6167657200000000000000000000000000000000815250611a08565b905090565b60006114578262278d00810661158d565b92915050565b3390565b60008281526005602052604081205461147a9083611687565b600084815260056020908152604091829020839055815186815290810185905280820183905290519192507fbf684526d3d5800fd3b7102cd676719792b58d33c1cfbf2518df4c3737a500e8919081900360600190a1505050565b6001600160a01b03811661151a5760405162461bcd60e51b8152600401808060200182810382526034815260200180611e996034913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e91a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60006115cf83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b36565b9392505050565b6000826115e557506000611457565b828202828482816115f257fe5b04146115cf5760405162461bcd60e51b8152600401808060200182810382526021815260200180611e786021913960400191505060405180910390fd5b60006115cf83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611bcd565b600081831061168057816115cf565b5090919050565b6000828201838110156115cf576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000606080606060006006549050600061171e600161171862278d00610b9861170987611446565b6117128d611446565b9061158d565b90611687565b90508067ffffffffffffffff8111801561173757600080fd5b50604051908082528060200260200182016040528015611761578160200160208202803683370190505b5094508067ffffffffffffffff8111801561177b57600080fd5b506040519080825280602002602001820160405280156117a5578160200160208202803683370190505b5093508067ffffffffffffffff811180156117bf57600080fd5b506040519080825280602002602001820160405280156117e9578160200160208202803683370190505b50925060005b6018811080156117fe57508783105b156118e257600061180e84611446565b9050600061181f8262278d00611687565b9050600061182d828c611671565b9050600061183b828861158d565b90506000611849848961158d565b60008681526005602052604081205491925061186983610b9884876115d6565b90506118758e82611687565b9d50611881828261158d565b9150868d898151811061189057fe5b602002602001018181525050808c89815181106118a957fe5b602002602001018181525050818b89815181106118c257fe5b60209081029190910101525092975050600190940193506117ef92505050565b5050509193509193565b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052601760248301527f66656573416e64426f6f74737472617052657761726473000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b15801561197c57600080fd5b505afa158015611990573d6000803e3d6000fd5b505050506040513d60208110156119a657600080fd5b5051905090565b6003546000906001600160a01b03163314806119e157506119cc610cdb565b6001600160a01b0316336001600160a01b0316145b8061144157506119ef610859565b6001600160a01b0316336001600160a01b031614905090565b6003546000906001600160a01b0316611a1f6119ad565b806115cf57506001600160a01b038116158015906115cf57506003546040517f1ee441e900000000000000000000000000000000000000000000000000000000815260206004820181815286516024840152865133946001600160a01b031693631ee441e99389939283926044019185019080838360005b83811015611aaf578181015183820152602001611a97565b50505050905090810190601f168015611adc5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015611af957600080fd5b505afa158015611b0d573d6000803e3d6000fd5b505050506040513d6020811015611b2357600080fd5b50516001600160a01b0316149392505050565b60008184841115611bc55760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611b8a578181015183820152602001611b72565b50505050905090810190601f168015611bb75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183611c1c5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611b8a578181015183820152602001611b72565b506000838581611c2857fe5b049594505050505056fe4665657357616c6c65743a3a6661696c656420746f207472616e7366657220636f6c6c6563746564206665657320746f20726577617264736275636b6574537461727454696d65206d75737420626520746865202073746172742074696d65206f662061206275636b6574636f6e7472616374206973206c6f636b656420666f722074686973206f7065726174696f6e73656e646572206973206e6f7420616e2061646d696e202872656769737472794d616e676572206f7220696e697469616c697a6174696f6e41646d696e296e657720636f6e7472616374207265676973747279206d7573742070726f76696465207468652070726576696f757320636f6e747261637420726567697374727963616c6c6572206973206e6f7420746865207265776172647320636f6e74726163746661696c656420746f207472616e73666572206665657320696e746f206665652077616c6c657443616c6c6572206973206e6f74207468652070656e64696e6720726567697374727941646d696e63757272656e7454696d65206d757374206e6f7420626520696e20746865207061737473656e646572206973206e6f742074686520696e697469616c697a6174696f6e2061646d696e4665657357616c6c65743a3a656d657267656e63795769746864726177202d207472616e73666572206661696c656446656557616c6c65743a3a63616e6e6f742066696c6c206275636b65742066726f6d20746865207061737473656e646572206973206e6f7420746865206d6967726174696f6e206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77526567697374727941646d696e3a206e657720726567697374727941646d696e20697320746865207a65726f206164647265737357697468436c61696d61626c6552656769737472794d616e6167656d656e743a2063616c6c6572206973206e6f742074686520726567697374727941646d696e6661696c656420746f207472616e73666572206665657320696e746f206665652077616c6c6574206f6e206275636b6574206d6967726174696f6ea2646970667358221220e0d0ecc073f70ce69b00d64bcfd3a5d074a3c7a76dd2c8731477e9995413eda364736f6c634300060c003373656e646572206973206e6f7420616e2061646d696e202872656769737472794d616e676572206f7220696e697469616c697a6174696f6e41646d696e296e657720636f6e7472616374207265676973747279206d7573742070726f76696465207468652070726576696f757320636f6e7472616374207265676973747279526567697374727941646d696e3a206e657720726567697374727941646d696e20697320746865207a65726f20616464726573731f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e000000000000000000000000d859701c81119ab12a1e62af6270ad2ae05c7ab3000000000000000000000000f1fd5233e60e7ef797025fe9dd066d60d59bcb92000000000000000000000000ff56cc6b1e6ded347aa0b7676c85ab0b3d08b0fa
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101ae5760003560e01c80639b51fb0d116100ee578063cf30901211610097578063eec0701f11610071578063eec0701f1461038b578063f83d08ba14610393578063fc0c546a1461039b578063fcd13d65146103a3576101ae565b8063cf30901214610373578063d25235261461037b578063e4e9922214610383576101ae565b8063acdb8e04116100c8578063acdb8e0414610346578063b20a09521461034e578063c87965721461036b576101ae565b80639b51fb0d14610319578063a4e2d63414610336578063a69df4b51461033e576101ae565b806339069d8c1161015b5780636ff1c9bc116101355780636ff1c9bc146102a8578063732852e0146102ce57806374c16b23146102f757806374c3583e146102ff576101ae565b806339069d8c1461027257806348106fe3146102985780635f94cd9c146102a0576101ae565b80632987cea01161018c5780632987cea0146102205780632a1fac7214610246578063333df1541461024e576101ae565b8063133afda3146101b35780631a0b2c4f146101e1578063209ab43e146101fd575b600080fd5b6101df600480360360408110156101c957600080fd5b506001600160a01b0381351690602001356103c9565b005b6101e96105e3565b604080519115158252519081900360200190f35b6101df6004803603604081101561021357600080fd5b5080359060200135610607565b6101df6004803603602081101561023657600080fd5b50356001600160a01b0316610732565b6101df6107af565b610256610859565b604080516001600160a01b039092168252519081900360200190f35b6101df6004803603602081101561028857600080fd5b50356001600160a01b0316610868565b6101e96108cb565b6102566108db565b6101df600480360360208110156102be57600080fd5b50356001600160a01b03166108ea565b6101df600480360360608110156102e457600080fd5b5080359060208101359060400135610ac6565b610256610cdb565b610307610cea565b60408051918252519081900360200190f35b6103076004803603602081101561032f57600080fd5b5035610cf0565b6101e9610d02565b6101df610d23565b6101df610db9565b6103076004803603602081101561036457600080fd5b5035610e5e565b610307610eb2565b6101e96110cb565b6101df6110ec565b610256611174565b6101df611183565b6101df6111c5565b610256611272565b6101df600480360360208110156103b957600080fd5b50356001600160a01b0316611281565b6103d1611401565b61040c5760405162461bcd60e51b8152600401808060200182810382526023815260200180611e556023913960400191505060405180910390fd5b8061041682611446565b146104525760405162461bcd60e51b8152600401808060200182810382526033815260200180611c6b6033913960400191505060405180910390fd5b6000818152600560205260409020548061046c57506105df565b600082815260056020908152604080832083905580518581529182018490528181019290925290517ff7cf471b1a70d08124afae779569878256f4d0fd4729dc55cfb0025571dcf4999181900360600190a160048054604080517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0387811694820194909452602481018590529051929091169163095ea7b3916044808201926020929091908290030181600087803b15801561053157600080fd5b505af1158015610545573d6000803e3d6000fd5b505050506040513d602081101561055b57600080fd5b5050604080517f209ab43e000000000000000000000000000000000000000000000000000000008152600481018490526024810183905290516001600160a01b0385169163209ab43e91604480830192600092919082900301818387803b1580156105c557600080fd5b505af11580156105d9573d6000803e3d6000fd5b50505050505b5050565b600080546001600160a01b03166105f861145d565b6001600160a01b031614905090565b8161061183611446565b1461064d5760405162461bcd60e51b8152600401808060200182810382526033815260200180611c6b6033913960400191505060405180910390fd5b6106578282611461565b60048054604080517f23b872dd000000000000000000000000000000000000000000000000000000008152339381019390935230602484015260448301849052516001600160a01b03909116916323b872dd9160648083019260209291908290030181600087803b1580156106cb57600080fd5b505af11580156106df573d6000803e3d6000fd5b505050506040513d60208110156106f557600080fd5b50516105df5760405162461bcd60e51b815260040180806020018281038252603b815260200180611f0d603b913960400191505060405180910390fd5b61073a6105e3565b6107755760405162461bcd60e51b8152600401808060200182810382526040815260200180611ecd6040913960400191505060405180910390fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6107b7610859565b6001600160a01b0316336001600160a01b0316146108065760405162461bcd60e51b8152600401808060200182810382526026815260200180611dd56026913960400191505060405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556040517f2a2b3ea974fb057582c3b210ef8b5f81492d15673f49d4384bfa3b896a964c3c90600090a1565b6002546001600160a01b031690565b610870610859565b6001600160a01b0316336001600160a01b0316146108bf5760405162461bcd60e51b8152600401808060200182810382526026815260200180611dd56026913960400191505060405180910390fd5b6108c8816114d5565b50565b6002546001600160a01b03161590565b6001546001600160a01b031690565b6108f2611401565b61092d5760405162461bcd60e51b8152600401808060200182810382526023815260200180611e556023913960400191505060405180910390fd5b604080513381526001600160a01b0383166020820152815183927ff5b6d8b404f034718f55a370884db03c4e27e9652e2636d4adcd0540d7c4203f928290030190a1806001600160a01b031663a9059cbb33836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156109cc57600080fd5b505afa1580156109e0573d6000803e3d6000fd5b505050506040513d60208110156109f657600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b158015610a5f57600080fd5b505af1158015610a73573d6000803e3d6000fd5b505050506040513d6020811015610a8957600080fd5b50516105df5760405162461bcd60e51b815260040180806020018281038252602f815260200180611dfb602f913960400191505060405180910390fd5b60035474010000000000000000000000000000000000000000900460ff1615610b205760405162461bcd60e51b8152600401808060200182810382526025815260200180611c9e6025913960400191505060405180910390fd5b6000610b2b82611446565b9050610b3642611446565b811015610b745760405162461bcd60e51b815260040180806020018281038252602b815260200180611e2a602b913960400191505060405180910390fd5b836000610ba382610b9e62278d00610b98610b9182808b0661158d565b8a906115d6565b9061162f565b611671565b9050610baf8382611461565b610bb9828261158d565b91505b8115610bf857610bcf8362278d00611687565b9250610bdb8583611671565b9050610be78382611461565b610bf1828261158d565b9150610bbc565b60048054604080517f23b872dd000000000000000000000000000000000000000000000000000000008152339381019390935230602484015260448301899052516001600160a01b03909116916323b872dd9160648083019260209291908290030181600087803b158015610c6c57600080fd5b505af1158015610c80573d6000803e3d6000fd5b505050506040513d6020811015610c9657600080fd5b5051610cd35760405162461bcd60e51b8152600401808060200182810382526027815260200180611d646027913960400191505060405180910390fd5b505050505050565b6000546001600160a01b031690565b60065481565b60056020526000908152604090205481565b60035474010000000000000000000000000000000000000000900460ff1690565b610d2b611401565b610d665760405162461bcd60e51b8152600401808060200182810382526023815260200180611e556023913960400191505060405180910390fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f19aad37188a1d3921e29eb3c66acf43d81975e107cb650d58cca878627955fd690600090a1565b610dc16105e3565b610dfc5760405162461bcd60e51b8152600401808060200182810382526040815260200180611ecd6040913960400191505060405180910390fd5b600080546040516001600160a01b03909116907f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600042821015610e9f5760405162461bcd60e51b8152600401808060200182810382526023815260200180611db26023913960400191505060405180910390fd5b610ea8826116e1565b5091949350505050565b6007546000906001600160a01b03163314610efe5760405162461bcd60e51b8152600401808060200182810382526022815260200180611d426022913960400191505060405180910390fd5b60006060806060610f0e426116e1565b935093509350935060005b8351811015610fe857818181518110610f2e57fe5b602002602001015160056000868481518110610f4657fe5b60200260200101518152602001908152602001600020819055507ff7cf471b1a70d08124afae779569878256f4d0fd4729dc55cfb0025571dcf499848281518110610f8d57fe5b6020026020010151848381518110610fa157fe5b6020026020010151848481518110610fb557fe5b602002602001015160405180848152602001838152602001828152602001935050505060405180910390a1600101610f19565b504260065560048054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152339381019390935260248301879052516001600160a01b039091169163a9059cbb9160448083019260209291908290030181600087803b15801561105b57600080fd5b505af115801561106f573d6000803e3d6000fd5b505050506040513d602081101561108557600080fd5b50516110c25760405162461bcd60e51b8152600401808060200182810382526038815260200180611c336038913960400191505060405180910390fd5b50919250505090565b60035474010000000000000000000000000000000000000000900460ff1681565b6001546001600160a01b031633146111355760405162461bcd60e51b8152600401808060200182810382526027815260200180611d8b6027913960400191505060405180910390fd5b60015461114a906001600160a01b03166114d5565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6003546001600160a01b031690565b61118b6118ec565b600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6111cd611401565b6112085760405162461bcd60e51b8152600401808060200182810382526023815260200180611e556023913960400191505060405180910390fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f0f2e5b6c72c6a4491efd919a9f9a409f324ef0708c11ee57d410c2cb06c0992b90600090a1565b6004546001600160a01b031681565b6112896119ad565b6112c45760405162461bcd60e51b815260040180806020018281038252603e815260200180611cc3603e913960400191505060405180910390fd5b600354604080517f078cbb7c00000000000000000000000000000000000000000000000000000000815290516001600160a01b039283169284169163078cbb7c916004808301926020929190829003018186803b15801561132457600080fd5b505afa158015611338573d6000803e3d6000fd5b505050506040513d602081101561134e57600080fd5b50516001600160a01b0316146113955760405162461bcd60e51b8152600401808060200182810382526041815260200180611d016041913960600191505060405180910390fd5b600380546001600160a01b0383167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517ffea2d033438b968078a6264409d0104b5f3d2ce7b795afc74918e70f3534f22b9181900360200190a150565b60006114416040518060400160405280601081526020017f6d6967726174696f6e4d616e6167657200000000000000000000000000000000815250611a08565b905090565b60006114578262278d00810661158d565b92915050565b3390565b60008281526005602052604081205461147a9083611687565b600084815260056020908152604091829020839055815186815290810185905280820183905290519192507fbf684526d3d5800fd3b7102cd676719792b58d33c1cfbf2518df4c3737a500e8919081900360600190a1505050565b6001600160a01b03811661151a5760405162461bcd60e51b8152600401808060200182810382526034815260200180611e996034913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e91a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60006115cf83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b36565b9392505050565b6000826115e557506000611457565b828202828482816115f257fe5b04146115cf5760405162461bcd60e51b8152600401808060200182810382526021815260200180611e786021913960400191505060405180910390fd5b60006115cf83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611bcd565b600081831061168057816115cf565b5090919050565b6000828201838110156115cf576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000606080606060006006549050600061171e600161171862278d00610b9861170987611446565b6117128d611446565b9061158d565b90611687565b90508067ffffffffffffffff8111801561173757600080fd5b50604051908082528060200260200182016040528015611761578160200160208202803683370190505b5094508067ffffffffffffffff8111801561177b57600080fd5b506040519080825280602002602001820160405280156117a5578160200160208202803683370190505b5093508067ffffffffffffffff811180156117bf57600080fd5b506040519080825280602002602001820160405280156117e9578160200160208202803683370190505b50925060005b6018811080156117fe57508783105b156118e257600061180e84611446565b9050600061181f8262278d00611687565b9050600061182d828c611671565b9050600061183b828861158d565b90506000611849848961158d565b60008681526005602052604081205491925061186983610b9884876115d6565b90506118758e82611687565b9d50611881828261158d565b9150868d898151811061189057fe5b602002602001018181525050808c89815181106118a957fe5b602002602001018181525050818b89815181106118c257fe5b60209081029190910101525092975050600190940193506117ef92505050565b5050509193509193565b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052601760248301527f66656573416e64426f6f74737472617052657761726473000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b15801561197c57600080fd5b505afa158015611990573d6000803e3d6000fd5b505050506040513d60208110156119a657600080fd5b5051905090565b6003546000906001600160a01b03163314806119e157506119cc610cdb565b6001600160a01b0316336001600160a01b0316145b8061144157506119ef610859565b6001600160a01b0316336001600160a01b031614905090565b6003546000906001600160a01b0316611a1f6119ad565b806115cf57506001600160a01b038116158015906115cf57506003546040517f1ee441e900000000000000000000000000000000000000000000000000000000815260206004820181815286516024840152865133946001600160a01b031693631ee441e99389939283926044019185019080838360005b83811015611aaf578181015183820152602001611a97565b50505050905090810190601f168015611adc5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015611af957600080fd5b505afa158015611b0d573d6000803e3d6000fd5b505050506040513d6020811015611b2357600080fd5b50516001600160a01b0316149392505050565b60008184841115611bc55760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611b8a578181015183820152602001611b72565b50505050905090810190601f168015611bb75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183611c1c5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611b8a578181015183820152602001611b72565b506000838581611c2857fe5b049594505050505056fe4665657357616c6c65743a3a6661696c656420746f207472616e7366657220636f6c6c6563746564206665657320746f20726577617264736275636b6574537461727454696d65206d75737420626520746865202073746172742074696d65206f662061206275636b6574636f6e7472616374206973206c6f636b656420666f722074686973206f7065726174696f6e73656e646572206973206e6f7420616e2061646d696e202872656769737472794d616e676572206f7220696e697469616c697a6174696f6e41646d696e296e657720636f6e7472616374207265676973747279206d7573742070726f76696465207468652070726576696f757320636f6e747261637420726567697374727963616c6c6572206973206e6f7420746865207265776172647320636f6e74726163746661696c656420746f207472616e73666572206665657320696e746f206665652077616c6c657443616c6c6572206973206e6f74207468652070656e64696e6720726567697374727941646d696e63757272656e7454696d65206d757374206e6f7420626520696e20746865207061737473656e646572206973206e6f742074686520696e697469616c697a6174696f6e2061646d696e4665657357616c6c65743a3a656d657267656e63795769746864726177202d207472616e73666572206661696c656446656557616c6c65743a3a63616e6e6f742066696c6c206275636b65742066726f6d20746865207061737473656e646572206973206e6f7420746865206d6967726174696f6e206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77526567697374727941646d696e3a206e657720726567697374727941646d696e20697320746865207a65726f206164647265737357697468436c61696d61626c6552656769737472794d616e6167656d656e743a2063616c6c6572206973206e6f742074686520726567697374727941646d696e6661696c656420746f207472616e73666572206665657320696e746f206665652077616c6c6574206f6e206275636b6574206d6967726174696f6ea2646970667358221220e0d0ecc073f70ce69b00d64bcfd3a5d074a3c7a76dd2c8731477e9995413eda364736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d859701c81119ab12a1e62af6270ad2ae05c7ab3000000000000000000000000f1fd5233e60e7ef797025fe9dd066d60d59bcb92000000000000000000000000ff56cc6b1e6ded347aa0b7676c85ab0b3d08b0fa
-----Decoded View---------------
Arg [0] : _contractRegistry (address): 0xD859701C81119aB12A1e62AF6270aD2AE05c7AB3
Arg [1] : _registryAdmin (address): 0xf1fD5233E60E7Ef797025FE9DD066d60d59BcB92
Arg [2] : _token (address): 0xff56Cc6b1E6dEd347aA0B7676C85AB0B3D08B0FA
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000d859701c81119ab12a1e62af6270ad2ae05c7ab3
Arg [1] : 000000000000000000000000f1fd5233e60e7ef797025fe9dd066d60d59bcb92
Arg [2] : 000000000000000000000000ff56cc6b1e6ded347aa0b7676c85ab0b3d08b0fa
Deployed Bytecode Sourcemap
33240:9726:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37706:601;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37706:601:0;;;;;;;;:::i;:::-;;20541:110;;;:::i;:::-;;;;;;;;;;;;;;;;;;38788:406;;;;;;;;;;;;;;;;-1:-1:-1;38788:406:0;;;;;;;:::i;22102:146::-;;;;;;;;;;;;;;;;-1:-1:-1;22102:146:0;-1:-1:-1;;;;;22102:146:0;;:::i;23628:159::-;;;:::i;23433:107::-;;;:::i;:::-;;;;-1:-1:-1;;;;;23433:107:0;;;;;;;;;;;;;;29502:154;;;;;;;;;;;;;;;;-1:-1:-1;29502:154:0;-1:-1:-1;;;;;29502:154:0;;:::i;23847:123::-;;;:::i;22616:110::-;;;:::i;39475:324::-;;;;;;;;;;;;;;;;-1:-1:-1;39475:324:0;-1:-1:-1;;;;;39475:324:0;;:::i;34638:1061::-;;;;;;;;;;;;;;;;-1:-1:-1;34638:1061:0;;;;;;;;;;;;:::i;20095:95::-;;;:::i;33514:30::-;;;:::i;:::-;;;;;;;;;;;;;;;;33465:42;;;;;;;;;;;;;;;;-1:-1:-1;33465:42:0;;:::i;32209:90::-;;;:::i;31969:116::-;;;:::i;21045:182::-;;;:::i;36983:270::-;;;;;;;;;;;;;;;;-1:-1:-1;36983:270:0;;:::i;36032:699::-;;;:::i;30934:18::-;;;:::i;22354:183::-;;;:::i;29372:122::-;;;:::i;42844:119::-;;;:::i;31643:111::-;;;:::i;33439:19::-;;;:::i;28832:394::-;;;;;;;;;;;;;;;;-1:-1:-1;28832:394:0;-1:-1:-1;;;;;28832:394:0;;:::i;37706:601::-;24870:20;:18;:20::i;:::-;24862:68;;;;-1:-1:-1;;;24862:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37879:15:::1;37847:28;37859:15;37847:11;:28::i;:::-;:47;37839:112;;;;-1:-1:-1::0;;;37839:112:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37964:17;37984:24:::0;;;:7:::1;:24;::::0;;;;;38023:17;38019:30:::1;;38042:7;;;38019:30;38088:1;38061:24:::0;;;:7:::1;:24;::::0;;;;;;;:28;;;38105:57;;;;;;;::::1;::::0;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;38175:5;::::0;;:49:::1;::::0;;;;;-1:-1:-1;;;;;38175:49:0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;:5;;;::::1;::::0;:13:::1;::::0;:49;;;;;::::1;::::0;;;;;;;;;:5:::1;::::0;:49;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;38235:64:0::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;38235:33:0;::::1;::::0;::::1;::::0;:64;;;;;-1:-1:-1;;38235:64:0;;;;;;;-1:-1:-1;38235:33:0;:64;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24943:1;;37706:601:::0;;:::o;20541:110::-;20589:4;20629:14;;-1:-1:-1;;;;;20629:14:0;20613:12;:10;:12::i;:::-;-1:-1:-1;;;;;20613:30:0;;20606:37;;20541:110;:::o;38788:406::-;38929:15;38897:28;38909:15;38897:11;:28::i;:::-;:47;38889:112;;;;-1:-1:-1;;;38889:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39012:38;39026:15;39043:6;39012:13;:38::i;:::-;39069:5;;;:53;;;;;;39088:10;39069:53;;;;;;;39108:4;39069:53;;;;;;;;;;;-1:-1:-1;;;;;39069:5:0;;;;:18;;:53;;;;;;;;;;;;;;:5;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39069:53:0;39061:125;;;;-1:-1:-1;;;39061:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22102:146;20339:17;:15;:17::i;:::-;20331:94;;;;-1:-1:-1;;;20331:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22200:21:::1;:40:::0;;;::::1;-1:-1:-1::0;;;;;22200:40:0;;;::::1;::::0;;;::::1;::::0;;22102:146::o;23628:159::-;23246:21;:19;:21::i;:::-;-1:-1:-1;;;;;23232:35:0;:10;-1:-1:-1;;;;;23232:35:0;;23224:86;;;;-1:-1:-1;;;23224:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23706:20:::1;:33:::0;;;::::1;::::0;;23755:24:::1;::::0;::::1;::::0;23737:1:::1;::::0;23755:24:::1;23628:159::o:0;23433:107::-;23512:20;;-1:-1:-1;;;;;23512:20:0;23433:107;:::o;29502:154::-;23246:21;:19;:21::i;:::-;-1:-1:-1;;;;;23232:35:0;:10;-1:-1:-1;;;;;23232:35:0;;23224:86;;;;-1:-1:-1;;;23224:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29605:43:::1;29633:14;29605:27;:43::i;:::-;29502:154:::0;:::o;23847:123::-;23928:20;;-1:-1:-1;;;;;23928:20:0;:34;23847:123;:::o;22616:110::-;22695:21;;-1:-1:-1;;;;;22695:21:0;22616:110;:::o;39475:324::-;24870:20;:18;:20::i;:::-;24862:68;;;;-1:-1:-1;;;24862:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39612:48:::1;::::0;;39632:10:::1;39612:48:::0;;-1:-1:-1;;;;;39612:48:0;::::1;;::::0;::::1;::::0;;;39590:5;;39612:48:::1;::::0;;;;;;::::1;39679:6;-1:-1:-1::0;;;;;39679:15:0::1;;39695:10;39707:6;-1:-1:-1::0;;;;;39707:16:0::1;;39732:4;39707:31;;;;;;;;;;;;;-1:-1:-1::0;;;;;39707:31:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;39707:31:0;39679:60:::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;;;;;39679:60:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;39707:31:::1;::::0;39679:60;;;;;;;-1:-1:-1;39679:60:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;39679:60:0;39671:120:::1;;;;-1:-1:-1::0;;;39671:120:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34638:1061:::0;32353:6;;;;;;;32352:7;32344:57;;;;-1:-1:-1;;;32344:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34766:14:::1;34783:26;34795:13;34783:11;:26::i;:::-;34766:43;;34838:28;34850:15;34838:11;:28::i;:::-;34828:6;:38;;34820:94;;;;-1:-1:-1::0;;;34820:94:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34945:6:::0;34927:15:::1;35042:117;34945:6:::0;35059:99:::1;33372:7;35059:75;35075:58;33372:7:::0;35098:34;;::::1;35075:22;:58::i;:::-;35059:11:::0;;:15:::1;:75::i;:::-;:79:::0;::::1;:99::i;:::-;35042:8;:117::i;:::-;35019:140;;35170:35;35184:6;35192:12;35170:13;:35::i;:::-;35226:25;:7:::0;35238:12;35226:11:::1;:25::i;:::-;35216:35;;35326:248;35333:11:::0;;35326:248:::1;;35370:30;:6:::0;33372:7:::1;35370:10;:30::i;:::-;35361:39;;35430:30;35439:11;35452:7;35430:8;:30::i;:::-;35415:45;;35475:35;35489:6;35497:12;35475:13;:35::i;:::-;35537:25;:7:::0;35549:12;35537:11:::1;:25::i;:::-;35527:35;;35326:248;;;35594:5;::::0;;:53:::1;::::0;;;;;35613:10:::1;35594:53:::0;;::::1;::::0;;;;35633:4:::1;35594:53:::0;;;;;;;;;;;-1:-1:-1;;;;;35594:5:0;;::::1;::::0;:18:::1;::::0;:53;;;;;::::1;::::0;;;;;;;;:5:::1;::::0;:53;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;35594:53:0;35586:105:::1;;;;-1:-1:-1::0;;;35586:105:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32414:1;;;34638:1061:::0;;;:::o;20095:95::-;20141:7;20168:14;-1:-1:-1;;;;;20168:14:0;20095:95;:::o;33514:30::-;;;;:::o;33465:42::-;;;;;;;;;;;;;:::o;32209:90::-;32285:6;;;;;;;;32209:90::o;31969:116::-;24870:20;:18;:20::i;:::-;24862:68;;;;-1:-1:-1;;;24862:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32037:6:::1;:14:::0;;;::::1;::::0;;32067:10:::1;::::0;::::1;::::0;32046:5:::1;::::0;32067:10:::1;31969:116::o:0;21045:182::-;20339:17;:15;:17::i;:::-;20331:94;;;;-1:-1:-1;;;20331:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21178:1:::1;21154:14:::0;;21124:57:::1;::::0;-1:-1:-1;;;;;21154:14:0;;::::1;::::0;21124:57:::1;::::0;21178:1;;21124:57:::1;21217:1;21192:27:::0;;;::::1;::::0;;21045:182::o;36983:270::-;37064:23;37124:15;37109:11;:30;;37101:78;;;;-1:-1:-1;;;37101:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37213:32;37233:11;37213:19;:32::i;:::-;-1:-1:-1;37190:55:0;;36983:270;-1:-1:-1;;;;36983:270:0:o;36032:699::-;34062:15;;36102:21;;-1:-1:-1;;;;;34062:15:0;34048:10;:29;34040:76;;;;-1:-1:-1;;;34040:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36138:22:::1;36162:30;36194::::0;36226:23:::1;36253:36;36273:15;36253:19;:36::i;:::-;36137:152;;;;;;;;36307:6;36302:220;36323:16;:23;36319:1;:27;36302:220;;;36399:9;36409:1;36399:12;;;;;;;;;;;;;;36368:7;:28;36376:16;36393:1;36376:19;;;;;;;;;;;;;;36368:28;;;;;;;;;;;:43;;;;36431:79;36455:16;36472:1;36455:19;;;;;;;;;;;;;;36476:16;36493:1;36476:19;;;;;;;;;;;;;;36497:9;36507:1;36497:12;;;;;;;;;;;;;;36431:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36348:3;;36302:220;;;-1:-1:-1::0;36552:15:0::1;36534;:33:::0;36588:5:::1;::::0;;:42:::1;::::0;;;;;36603:10:::1;36588:42:::0;;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;36588:5:0;;::::1;::::0;:14:::1;::::0;:42;;;;;::::1;::::0;;;;;;;;:5:::1;::::0;:42;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;36588:42:0;36580:111:::1;;;;-1:-1:-1::0;;;36580:111:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;36709:14:0;;-1:-1:-1;;;36032:699:0;:::o;30934:18::-;;;;;;;;;:::o;22354:183::-;21833:21;;-1:-1:-1;;;;;21833:21:0;21819:10;:35;21811:87;;;;-1:-1:-1;;;21811:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22462:21:::1;::::0;22434:50:::1;::::0;-1:-1:-1;;;;;22462:21:0::1;22434:27;:50::i;:::-;22495:21;:34:::0;;;::::1;::::0;;22354:183::o;29372:122::-;29470:16;;-1:-1:-1;;;;;29470:16:0;29372:122;:::o;42844:119::-;42919:36;:34;:36::i;:::-;42901:15;:54;;;;-1:-1:-1;;;;;42901:54:0;;;;;;;;;;42844:119::o;31643:111::-;24870:20;:18;:20::i;:::-;24862:68;;;;-1:-1:-1;;;24862:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31709:6:::1;:13:::0;;;::::1;::::0;::::1;::::0;;31738:8:::1;::::0;::::1;::::0;31709:13;;31738:8:::1;31643:111::o:0;33439:19::-;;;-1:-1:-1;;;;;33439:19:0;;:::o;28832:394::-;24715:9;:7;:9::i;:::-;24707:84;;;;-1:-1:-1;;;24707:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29006:16:::1;::::0;28945:49:::1;::::0;;;;;;;-1:-1:-1;;;;;29006:16:0;;::::1;::::0;28945:47;::::1;::::0;::::1;::::0;:49:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:47;:49;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28945:49:0;-1:-1:-1;;;;;28945:78:0::1;;28937:156;;;;-1:-1:-1::0;;;28937:156:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29104:16;:38:::0;;-1:-1:-1;;;;;29104:38:0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;29158:60:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;28832:394:::0;:::o;25907:114::-;25960:4;25984:29;;;;;;;;;;;;;;;;;;:9;:29::i;:::-;25977:36;;25907:114;:::o;42437:127::-;42494:7;42521:35;42530:4;33372:7;42530:25;;42521:8;:35::i;:::-;42514:42;42437:127;-1:-1:-1;;42437:127:0:o;18840:106::-;18928:10;18840:106;:::o;39926:241::-;40002:19;40024:17;;;:7;:17;;;;;;:29;;40046:6;40024:21;:29::i;:::-;40064:17;;;;:7;:17;;;;;;;;;:31;;;40111:48;;;;;;;;;;;;;;;;;;;40002:51;;-1:-1:-1;40111:48:0;;;;;;;;;;39926:241;;;:::o;21344:309::-;-1:-1:-1;;;;;21435:30:0;;21427:95;;;;-1:-1:-1;;;21427:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21568:14;;;21538:63;;-1:-1:-1;;;;;21538:63:0;;;;21568:14;;;21538:63;;;21612:14;:33;;;;-1:-1:-1;;;;;21612:33:0;;;;;;;;;;21344:309::o;5068:136::-;5126:7;5153:43;5157:1;5160;5153:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5146:50;5068:136;-1:-1:-1;;;5068:136:0:o;5958:471::-;6016:7;6261:6;6257:47;;-1:-1:-1;6291:1:0;6284:8;;6257:47;6328:5;;;6332:1;6328;:5;:1;6352:5;;;;;:10;6344:56;;;;-1:-1:-1;;;6344:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6905:132;6963:7;6990:39;6994:1;6997;6990:39;;;;;;;;;;;;;;;;;:3;:39::i;3258:106::-;3316:7;3347:1;3343;:5;:13;;3355:1;3343:13;;;-1:-1:-1;3351:1:0;;3258:106;-1:-1:-1;3258:106:0:o;4604:181::-;4662:7;4694:5;;;4718:6;;;;4710:46;;;;;-1:-1:-1;;;4710:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;40834:1517;40906:23;40931:30;40963;40995:23;41032:21;41056:15;;41032:39;;41082:20;41105:90;41193:1;41105:83;33372:7;41105:59;41134:29;41146:16;41134:11;:29::i;:::-;41105:24;41117:11;41105;:24::i;:::-;:28;;:59::i;:83::-;:87;;:90::i;:::-;41082:113;;41236:15;41225:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41225:27:0;;41206:46;;41293:15;41282:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41282:27:0;;41263:46;;41343:15;41332:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41332:27:0;;41320:39;;41370:17;41402:942;33428:2;41409:12;:40;:74;;;;;41472:11;41453:16;:30;41409:74;41402:942;;;41500:19;41522:29;41534:16;41522:11;:29::i;:::-;41500:51;-1:-1:-1;41566:17:0;41586:35;41500:51;33372:7;41586:15;:35::i;:::-;41566:55;;41636:16;41655:32;41664:9;41675:11;41655:8;:32::i;:::-;41636:51;-1:-1:-1;41702:22:0;41727:30;41636:51;41740:16;41727:12;:30::i;:::-;41702:55;-1:-1:-1;41772:27:0;41802:31;:9;41816:16;41802:13;:31::i;:::-;41850:19;41872:20;;;:7;:20;;;;;;41772:61;;-1:-1:-1;41924:56:0;41772:61;41924:31;41872:20;41940:14;41924:15;:31::i;:56::-;41907:73;-1:-1:-1;42013:27:0;:15;41907:73;42013:19;:27::i;:::-;41995:45;-1:-1:-1;42069:23:0;:11;42085:6;42069:15;:23::i;:::-;42055:37;;42142:11;42109:16;42126:12;42109:30;;;;;;;;;;;;;:44;;;;;42201:6;42168:16;42185:12;42168:30;;;;;;;;;;;;;:39;;;;;42248:11;42222:9;42232:12;42222:23;;;;;;;;;;;;;;;;;:37;-1:-1:-1;42295:8:0;;-1:-1:-1;;42318:14:0;;;;;-1:-1:-1;41402:942:0;;-1:-1:-1;;;41402:942:0;;40834:1517;;;;;;;;:::o;26614:159::-;26710:16;;:55;;;;;;;;;;;;;;;;;;;;;;;;;26683:7;;-1:-1:-1;;;;;26710:16:0;;:28;;:55;;;;;;;;;;;:16;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26710:55:0;;-1:-1:-1;26614:159:0;:::o;25225:185::-;25313:16;;25267:4;;-1:-1:-1;;;;;25313:16:0;25291:10;:39;;:72;;;25348:15;:13;:15::i;:::-;-1:-1:-1;;;;;25334:29:0;:10;-1:-1:-1;;;;;25334:29:0;;25291:72;:111;;;;25381:21;:19;:21::i;:::-;-1:-1:-1;;;;;25367:35:0;:10;-1:-1:-1;;;;;25367:35:0;;25284:118;;25225:185;:::o;25575:264::-;25692:16;;25637:4;;-1:-1:-1;;;;;25692:16:0;25726:9;:7;:9::i;:::-;:105;;;-1:-1:-1;;;;;;25739:41:0;;;;;;:92;;-1:-1:-1;25784:16:0;;:33;;;;;;;;;;;;;;;;;;;;25821:10;;-1:-1:-1;;;;;25784:16:0;;:27;;25812:4;;25784:33;;;;;;;;;;;;:16;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25784:33:0;-1:-1:-1;;;;;25784:47:0;;25719:112;25575:264;-1:-1:-1;;;25575:264:0:o;5507:192::-;5593:7;5629:12;5621:6;;;;5613:29;;;;-1:-1:-1;;;5613:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5665:5:0;;;5507:192::o;7533:278::-;7619:7;7654:12;7647:5;7639:28;;;;-1:-1:-1;;;7639:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7678:9;7694:1;7690;:5;;;;;;;7533:278;-1:-1:-1;;;;;7533:278:0:o
Swarm Source
ipfs://e0d0ecc073f70ce69b00d64bcfd3a5d074a3c7a76dd2c8731477e9995413eda3
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.