Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 810 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Register Proxy | 20453205 | 159 days ago | IN | 0 ETH | 0.0004164 | ||||
Register Proxy | 17747453 | 538 days ago | IN | 0 ETH | 0.00650236 | ||||
Register Proxy | 14816762 | 965 days ago | IN | 0 ETH | 0.00416273 | ||||
Register Proxy | 14760323 | 974 days ago | IN | 0 ETH | 0.0712113 | ||||
Register Proxy | 14753117 | 975 days ago | IN | 0 ETH | 0.01875883 | ||||
Register Proxy | 14728082 | 979 days ago | IN | 0 ETH | 0.01257722 | ||||
Register Proxy | 14716026 | 981 days ago | IN | 0 ETH | 0.01414009 | ||||
Register Proxy | 14696623 | 984 days ago | IN | 0 ETH | 0.0224498 | ||||
Register Proxy | 14695931 | 984 days ago | IN | 0 ETH | 0.02289501 | ||||
Register Proxy | 14641731 | 993 days ago | IN | 0 ETH | 0.02011718 | ||||
Register Proxy | 14612463 | 997 days ago | IN | 0 ETH | 0.00876215 | ||||
Register Proxy | 14591378 | 1001 days ago | IN | 0 ETH | 0.01271378 | ||||
Register Proxy | 14570731 | 1004 days ago | IN | 0 ETH | 0.01799167 | ||||
Register Proxy | 14563176 | 1005 days ago | IN | 0 ETH | 0.0082093 | ||||
Register Proxy | 14556758 | 1006 days ago | IN | 0 ETH | 0.01123937 | ||||
Register Proxy | 14555775 | 1006 days ago | IN | 0 ETH | 0.00922272 | ||||
Register Proxy | 14486590 | 1017 days ago | IN | 0 ETH | 0.01058771 | ||||
Register Proxy | 14481679 | 1018 days ago | IN | 0 ETH | 0.02144088 | ||||
Register Proxy | 14480520 | 1018 days ago | IN | 0 ETH | 0.01181415 | ||||
Register Proxy | 14469208 | 1020 days ago | IN | 0 ETH | 0.01384192 | ||||
Register Proxy | 14461475 | 1021 days ago | IN | 0 ETH | 0.00784201 | ||||
Register Proxy | 14449166 | 1023 days ago | IN | 0 ETH | 0.01178917 | ||||
Register Proxy | 14448876 | 1023 days ago | IN | 0 ETH | 0.00836762 | ||||
Register Proxy | 14447177 | 1023 days ago | IN | 0 ETH | 0.01204782 | ||||
Register Proxy | 14447102 | 1023 days ago | IN | 0 ETH | 0.01688675 |
Latest 25 internal transactions (View All)
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
ElementixProxyRegistry
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-08 */ // File: dependencies/openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.8.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: dependencies/openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: dependencies/openzeppelin/contracts/utils/math/SafeMath.sol pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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) { return a + b; } /** * @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 a - b; } /** * @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) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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 a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards 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). * * 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) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: elementix/libraries/SaleKindInterface.sol pragma solidity ^0.8.0; library SaleKindInterface { /** * Side: buy or sell. */ enum Side { Buy, Sell } /** * Currently supported kinds of sale: fixed price, Dutch auction. * English auctions cannot be supported without stronger escrow guarantees. * Future interesting options: Vickrey auction, nonlinear Dutch auctions. */ enum SaleKind { FixedPrice, DutchAuction } /** * @dev Check whether the parameters of a sale are valid * @param saleKind Kind of sale * @param expirationTime Order expiration time * @return Whether the parameters were valid */ function validateParameters(SaleKind saleKind, uint256 expirationTime) pure internal returns (bool) { /* Auctions must have a set expiration date. */ return (saleKind == SaleKind.FixedPrice || expirationTime > 0); } /** * @dev Return whether or not an order can be settled * @dev Precondition: parameters have passed validateParameters * @param listingTime Order listing time * @param expirationTime Order expiration time */ function canSettleOrder(uint256 listingTime, uint256 expirationTime) view internal returns (bool) { return (listingTime < block.timestamp) && (expirationTime == 0 || block.timestamp < expirationTime); } /** * @dev Calculate the settlement price of an order * @dev Precondition: parameters have passed validateParameters. * @param side Order side * @param saleKind Method of sale * @param basePrice Order base price * @param extra Order extra price data * @param listingTime Order listing time * @param expirationTime Order expiration time */ function calculateFinalPrice(Side side, SaleKind saleKind, uint256 basePrice, uint256 extra, uint256 listingTime, uint256 expirationTime) view internal returns (uint256 finalPrice) { if (saleKind == SaleKind.FixedPrice) { return basePrice; } else if (saleKind == SaleKind.DutchAuction) { uint256 diff = SafeMath.div(SafeMath.mul(extra, SafeMath.sub(block.timestamp, listingTime)), SafeMath.sub(expirationTime, listingTime)); if (side == Side.Sell) { /* Sell-side - start price: basePrice. End price: basePrice - extra. */ return SafeMath.sub(basePrice, diff); } else { /* Buy-side - start price: basePrice. End price: basePrice + extra. */ return SafeMath.add(basePrice, diff); } } } } // File: elementix/libraries/DataType.sol pragma solidity ^0.8.0; library DataType { /* An ECDSA signature. */ struct Sig { /* v parameter */ uint8 v; /* r parameter */ bytes32 r; /* s parameter */ bytes32 s; } /* Fee method: protocol fee or split fee. */ enum FeeMethod { ProtocolFee, SplitFee } /* Delegate call could be used to atomically transfer multiple assets owned by the proxy contract with one order. */ enum HowToCall { Call, DelegateCall } /* An order on the exchange. */ struct Order { /* Exchange address, intended as a versioning mechanism. */ address exchange; /* Order maker address. */ address maker; /* Order taker address, if specified. */ address taker; /* Maker relayer fee of the order, unused for taker order. */ uint256 makerRelayerFee; /* Taker relayer fee of the order, or maximum taker fee for a taker order. */ uint256 takerRelayerFee; /* Maker protocol fee of the order, unused for taker order. */ uint256 makerProtocolFee; /* Taker protocol fee of the order, or maximum taker fee for a taker order. */ uint256 takerProtocolFee; /* Order fee recipient or zero address for taker order. */ address feeRecipient; /* Fee method (protocol token or split fee). */ FeeMethod feeMethod; /* Side (buy/sell). */ SaleKindInterface.Side side; /* Kind of sale. */ SaleKindInterface.SaleKind saleKind; /* Target. */ address target; /* HowToCall. */ HowToCall howToCall; /* Calldata. */ bytes dataToCall; /* Calldata replacement pattern, or an empty byte array for no replacement. */ bytes replacementPattern; /* Static call target, zero-address for no static call. */ address staticTarget; /* Static call extra data. */ bytes staticExtradata; /* Token used to pay for the order, or the zero-address as a sentinel value for Ether. */ address paymentToken; /* Base price of the order (in paymentTokens). */ uint256 basePrice; /* Auction extra parameter - minimum bid increment for English auctions, starting/ending price difference. */ uint256 extra; /* Listing timestamp. */ uint256 listingTime; /* Expiration timestamp - 0 for no expiry. */ uint256 expirationTime; /* Order salt, used to prevent duplicate hashes. */ uint256 salt; } } // File: elementix/interfaces/IAuthenticatedProxy.sol pragma solidity ^0.8.0; interface IAuthenticatedProxy { /** * Execute a message call from the proxy contract * * @dev Can be called by the user, or by a contract authorized by the registry as long as the user has not revoked access * @param dest Address to which the call will be sent * @param howToCall Which kind of call to make * @param data Calldata to send * @return result Result of the call (success or failure) */ function proxy(address dest, DataType.HowToCall howToCall, bytes calldata data) external returns (bool result); /** * Execute a message call and assert success * * @dev Same functionality as `proxy`, just asserts the return value * @param dest Address to which the call will be sent * @param howToCall What kind of call to make * @param data Calldata to send */ function proxyAssert(address dest, DataType.HowToCall howToCall, bytes calldata data) external; } // File: elementix/OwnedUpgradeabilityStorage.sol pragma solidity ^0.8.0; abstract contract OwnedUpgradeabilityStorage { // Current implementation address internal _implementation; // Owner of the contract address private _upgradeabilityOwner; /** * @dev Tells the address of the owner * @return the address of the owner */ function upgradeabilityOwner() public view returns (address) { return _upgradeabilityOwner; } /** * @dev Sets the address of the owner */ function setUpgradeabilityOwner(address newUpgradeabilityOwner) internal { _upgradeabilityOwner = newUpgradeabilityOwner; } /** * @dev Tells the address of the current implementation * @return address of the current implementation */ function implementation() public view returns (address) { return _implementation; } /** * @dev Tells the proxy type (EIP 897) * @return proxyTypeId Proxy type, 2 for forwarding proxy */ function proxyType() public pure returns (uint256 proxyTypeId) { return 2; } } // File: elementix/OwnedUpgradeabilityProxy.sol pragma solidity ^0.8.0; abstract contract OwnedUpgradeabilityProxy is OwnedUpgradeabilityStorage { /** * @dev Event to show ownership has been transferred * @param previousOwner representing the address of the previous owner * @param newOwner representing the address of the new owner */ event ProxyOwnershipTransferred(address previousOwner, address newOwner); /** * @dev This event will be emitted every time the implementation gets upgraded * @param implementation representing the address of the upgraded implementation */ event Upgraded(address indexed implementation); /** * @dev Upgrades the implementation address * @param implementation representing the address of the new implementation to be set */ function _upgradeTo(address implementation) internal { require(_implementation != implementation); _implementation = implementation; emit Upgraded(implementation); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyProxyOwner() { require(msg.sender == proxyOwner()); _; } /** * @dev Tells the address of the proxy owner * @return the address of the proxy owner */ function proxyOwner() public view returns (address) { return upgradeabilityOwner(); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferProxyOwnership(address newOwner) public onlyProxyOwner { require(newOwner != address(0)); emit ProxyOwnershipTransferred(proxyOwner(), newOwner); setUpgradeabilityOwner(newOwner); } /** * @dev Allows the upgradeability owner to upgrade the current implementation of the proxy. * @param implementation representing the address of the new implementation to be set. */ function upgradeTo(address implementation) public onlyProxyOwner { _upgradeTo(implementation); } /** * @dev Allows the upgradeability owner to upgrade the current implementation of the proxy * and delegatecall the new implementation for initialization. * @param implementation representing the address of the new implementation to be set. * @param data represents the msg.data to bet sent in the low level call. This parameter may include the function * signature of the implementation to be called with the needed payload */ function upgradeToAndCall(address implementation, bytes calldata data) payable public onlyProxyOwner { upgradeTo(implementation); (bool success, ) = address(this).delegatecall(data); require(success); } /** * @dev Fallback function allowing to perform a delegatecall to the given implementation. * This function will return whatever the implementation call returns */ fallback() payable external { address _impl = implementation(); require(_impl != address(0)); assembly { let ptr := mload(0x40) calldatacopy(ptr, 0, calldatasize()) let result := delegatecall(gas(), _impl, ptr, calldatasize(), 0, 0) let size := returndatasize() returndatacopy(ptr, 0, size) switch result case 0 { revert(ptr, size) } default { return(ptr, size) } } } } // File: elementix/OwnableDelegateProxy.sol pragma solidity ^0.8.0; contract OwnableDelegateProxy is OwnedUpgradeabilityProxy { constructor(address owner, address initialImplementation, bytes memory dataToCall) { setUpgradeabilityOwner(owner); _upgradeTo(initialImplementation); (bool success, ) = initialImplementation.delegatecall(dataToCall); require(success); } } // File: dependencies/openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.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 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) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: dependencies/openzeppelin/contracts/token/ERC20/ERC20.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The defaut value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); _approve(sender, _msgSender(), currentAllowance - amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); _approve(_msgSender(), spender, currentAllowance - subtractedValue); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); _balances[sender] = senderBalance - amount; _balances[recipient] += amount; emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } // File: elementix/TokenRecipient.sol pragma solidity ^0.8.0; contract TokenRecipient { event ReceivedEther(address indexed sender, uint256 amount); event ReceivedTokens(address indexed from, uint256 value, address indexed token, bytes extraData); /** * @dev Receive tokens and generate a log event * @param from Address from which to transfer tokens * @param value Amount of tokens to transfer * @param token Address of token * @param extraData Additional data to log */ function receiveApproval(address from, uint256 value, address token, bytes memory extraData) public { ERC20 t = ERC20(token); require(t.transferFrom(from, address(this), value)); emit ReceivedTokens(from, value, token, extraData); } /** * @dev Receive Ether and generate a log event */ receive() payable external { emit ReceivedEther(msg.sender, msg.value); } } // File: dependencies/openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: elementix/ProxyRegistry.sol pragma solidity ^0.8.0; contract ProxyRegistry is Ownable { /* DelegateProxy implementation contract. Must be initialized. */ address public delegateProxyImplementation; /* Authenticated proxies by user. */ mapping(address => OwnableDelegateProxy) public proxies; /* Contracts pending access. */ mapping(address => uint256) public pending; /* Contracts allowed to call those proxies. */ mapping(address => bool) public contracts; /* Delay period for adding an authenticated contract. This mitigates a particular class of potential attack on the Elementix DAO (which owns this registry) - if at any point the value of assets held by proxy contracts exceeded the value of half the ELT supply (votes in the DAO), a malicious but rational attacker could buy half the Elementix and grant themselves access to all the proxy contracts. A delay period renders this attack nonthreatening - given one weeks, if that happened, users would have plenty of time to notice and transfer their assets. */ uint256 public DELAY_PERIOD = 7 days; // event event RegisterProxy(address indexed sender, address proxyAddr); event AuthenticationOperation(address indexed addr, bool opt); /** * Start the process to enable access for specified contract. Subject to delay period. * * @dev ProxyRegistry owner only * @param addr Address to which to grant permissions */ function startGrantAuthentication (address addr) public onlyOwner { require(!contracts[addr] && pending[addr] == 0); pending[addr] = block.timestamp; } /** * End the process to nable access for specified contract after delay period has passed. * * @dev ProxyRegistry owner only * @param addr Address to which to grant permissions */ function endGrantAuthentication (address addr) public onlyOwner { require(!contracts[addr] && pending[addr] != 0 && ((pending[addr] + DELAY_PERIOD) < block.timestamp)); pending[addr] = 0; contracts[addr] = true; emit AuthenticationOperation(addr, true); } /** * Revoke access for specified contract. Can be done instantly. * * @dev ProxyRegistry owner only * @param addr Address of which to revoke permissions */ function revokeAuthentication (address addr) public onlyOwner { contracts[addr] = false; emit AuthenticationOperation(addr, false); } /** * Register a proxy contract with this registry * * @dev Must be called by the user which the proxy is for, creates a new AuthenticatedProxy * @return proxy New AuthenticatedProxy contract */ function registerProxy() public returns (OwnableDelegateProxy proxy) { require(address(proxies[msg.sender]) == address(0),"dup register"); proxy = new OwnableDelegateProxy(msg.sender, delegateProxyImplementation, abi.encodeWithSignature("initialize(address,address)", msg.sender, address(this))); proxies[msg.sender] = proxy; emit RegisterProxy(msg.sender, address(proxy)); return proxy; } } // File: elementix/AuthenticatedProxy.sol pragma solidity ^0.8.0; contract AuthenticatedProxy is TokenRecipient, OwnedUpgradeabilityStorage, IAuthenticatedProxy { /* Whether initialized. */ bool initialized = false; /* Address which owns this proxy. */ address public user; /* Associated registry with contract authentication information. */ ProxyRegistry public registry; /* Whether access has been revoked. */ bool public revoked; string public constant version = "1.0"; /* Delegate call could be used to atomically transfer multiple assets owned by the proxy contract with one order. */ // enum HowToCall { Call, DelegateCall } /* Event fired when the proxy access is revoked or unrevoked. */ event Revoked(bool revoked); /** * Initialize an AuthenticatedProxy * * @param addrUser Address of user on whose behalf this proxy will act * @param addrRegistry Address of ProxyRegistry contract which will manage this proxy */ function initialize (address addrUser, ProxyRegistry addrRegistry) public { require(!initialized); initialized = true; user = addrUser; registry = addrRegistry; } /** * Set the revoked flag (allows a user to revoke ProxyRegistry access) * * @dev Can be called by the user only * @param revoke Whether or not to revoke access */ function setRevoke(bool revoke) public { require(msg.sender == user); revoked = revoke; emit Revoked(revoke); } /** * Execute a message call from the proxy contract * * @dev Can be called by the user, or by a contract authorized by the registry as long as the user has not revoked access * @param dest Address to which the call will be sent * @param howToCall Which kind of call to make * @param data Calldata to send * @return result Result of the call (success or failure) */ function proxy(address dest, DataType.HowToCall howToCall, bytes calldata data) public override returns (bool result) { require(msg.sender == user || (!revoked && registry.contracts(msg.sender)), "!valid proxy sender"); if (howToCall == DataType.HowToCall.Call) { (result,) = dest.call(data); } else if (howToCall == DataType.HowToCall.DelegateCall) { (result,) = dest.delegatecall(data); } return result; } /** * Execute a message call and assert success * * @dev Same functionality as `proxy`, just asserts the return value * @param dest Address to which the call will be sent * @param howToCall What kind of call to make * @param data Calldata to send */ function proxyAssert(address dest, DataType.HowToCall howToCall, bytes calldata data) public override { require(proxy(dest, howToCall, data)); } } // File: elementix/ElementixRegistry.sol pragma solidity ^0.8.0; contract ElementixProxyRegistry is ProxyRegistry { string public constant name = "Elementix Proxy Registry"; string public constant version = "1.0"; /* Whether the initial auth address has been set. */ bool public initialAddressSet = false; constructor () { delegateProxyImplementation = address(new AuthenticatedProxy()); } /** * Grant authentication to the initial Exchange protocol contract * * @dev No delay, can only be called once - after that the standard registry process with a delay must be used * @param authAddress Address of the contract to grant authentication */ function grantInitialAuthentication (address authAddress) onlyOwner public { require(!initialAddressSet,"!initialed"); initialAddressSet = true; contracts[authAddress] = true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"opt","type":"bool"}],"name":"AuthenticationOperation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"proxyAddr","type":"address"}],"name":"RegisterProxy","type":"event"},{"inputs":[],"name":"DELAY_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contracts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delegateProxyImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"endGrantAuthentication","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"authAddress","type":"address"}],"name":"grantInitialAuthentication","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialAddressSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"proxies","outputs":[{"internalType":"contract OwnableDelegateProxy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registerProxy","outputs":[{"internalType":"contract OwnableDelegateProxy","name":"proxy","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"revokeAuthentication","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"startGrantAuthentication","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405262093a806005556006805460ff1916905534801561002157600080fd5b5060006100356401000000006100cd810204565b60008054600160a060020a031916600160a060020a0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060405161008b906100d1565b604051809103906000f0801580156100a7573d6000803e3d6000fd5b5060018054600160a060020a031916600160a060020a03929092169190911790556100de565b3390565b610a968061133383390190565b611246806100ed6000396000f3fe60806040523480156200001157600080fd5b506004361062000132576000357c0100000000000000000000000000000000000000000000000000000000900480638da5cb5b11620000c0578063ddd81f82116200008b578063ddd81f8214620002f7578063e71a02e11462000301578063ef7f3834146200030b578063f2fde38b146200032257600080fd5b80638da5cb5b146200027a57806397204d8e14620002a0578063c455279114620002b4578063d4e8e06314620002e057600080fd5b806354fd4d50116200010157806354fd4d5014620001db5780635eebea20146200021857806369dc9ff3146200024a578063715018a6146200027057600080fd5b806306fdde0314620001375780631a86ac4f146200018c57806338b6e40714620001ab57806353376d1f14620001c4575b600080fd5b620001746040518060400160405280601881526020017f456c656d656e7469782050726f7879205265676973747279000000000000000081525081565b60405162000183919062000a1f565b60405180910390f35b6006546200019a9060ff1681565b604051901515815260200162000183565b620001c2620001bc3660046200096a565b62000339565b005b620001c2620001d53660046200096a565b62000458565b620001746040518060400160405280600381526020017f312e30000000000000000000000000000000000000000000000000000000000081525081565b6200023b620002293660046200096a565b60036020526000908152604090205481565b60405190815260200162000183565b6200019a6200025b3660046200096a565b60046020526000908152604090205460ff1681565b620001c2620004d8565b600054600160a060020a03165b604051600160a060020a03909116815260200162000183565b6001546200028790600160a060020a031681565b62000287620002c53660046200096a565b600260205260009081526040902054600160a060020a031681565b620001c2620002f13660046200096a565b6200055f565b62000287620005f5565b6200023b60055481565b620001c26200031c3660046200096a565b62000786565b620001c2620003333660046200096a565b62000843565b600054600160a060020a03163314620003725760405160e560020a62461bcd028152600401620003699062000a34565b60405180910390fd5b600160a060020a03811660009081526004602052604090205460ff16158015620003b35750600160a060020a03811660009081526003602052604090205415155b8015620003e65750600554600160a060020a0382166000908152600360205260409020544291620003e49162000a69565b105b620003f057600080fd5b600160a060020a03811660008181526003602090815260408083208390556004825291829020805460ff1916600190811790915591519182527f0aaff445881d512ee8dd1532abd9df22338e84715cbd7f031ecba02b7a57da9e91015b60405180910390a250565b600054600160a060020a03163314620004885760405160e560020a62461bcd028152600401620003699062000a34565b600160a060020a0381166000818152600460209081526040808320805460ff19169055519182527f0aaff445881d512ee8dd1532abd9df22338e84715cbd7f031ecba02b7a57da9e91016200044d565b600054600160a060020a03163314620005085760405160e560020a62461bcd028152600401620003699062000a34565b60008054604051600160a060020a03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600054600160a060020a031633146200058f5760405160e560020a62461bcd028152600401620003699062000a34565b600160a060020a03811660009081526004602052604090205460ff16158015620005cf5750600160a060020a038116600090815260036020526040902054155b620005d957600080fd5b600160a060020a03166000908152600360205260409020429055565b33600090815260026020526040812054600160a060020a031615620006605760405160e560020a62461bcd02815260206004820152600c60248201527f6475702072656769737465720000000000000000000000000000000000000000604482015260640162000369565b600154604051336024820181905230604483015291600160a060020a03169060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f485cc9550000000000000000000000000000000000000000000000000000000017905251620006e6906200095c565b620006f493929190620009e8565b604051809103906000f08015801562000711573d6000803e3d6000fd5b5033600081815260026020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038616908117909155915191825292935090917fd9764ce22a20ed64544405a3ad75ec9e807367ddc7bb3a08a7838debf314c2c7910160405180910390a290565b600054600160a060020a03163314620007b65760405160e560020a62461bcd028152600401620003699062000a34565b60065460ff16156200080e5760405160e560020a62461bcd02815260206004820152600a60248201527f21696e697469616c656400000000000000000000000000000000000000000000604482015260640162000369565b6006805460ff199081166001908117909255600160a060020a0390921660009081526004602052604090208054909216179055565b600054600160a060020a03163314620008735760405160e560020a62461bcd028152600401620003699062000a34565b600160a060020a038116620008f45760405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840162000369565b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6107698062000aa883390190565b6000602082840312156200097c578081fd5b8135600160a060020a038116811462000993578182fd5b9392505050565b60008151808452815b81811015620009c157602081850181015186830182015201620009a3565b81811115620009d35782602083870101525b50601f01601f19169290920160200192915050565b6000600160a060020a0380861683528085166020840152506060604083015262000a1660608301846200099a565b95945050505050565b6020815260006200099360208301846200099a565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111562000aa2577f4e487b710000000000000000000000000000000000000000000000000000000081526011600452602481fd5b50019056fe608060405234801561001057600080fd5b5060405161076938038061076983398101604081905261002f91610165565b610041836401000000006100c4810204565b610053826401000000006100e6810204565b600082600160a060020a03168260405161006d9190610231565b600060405180830381855af49150503d80600081146100a8576040519150601f19603f3d011682016040523d82523d6000602084013e6100ad565b606091505b50509050806100bb57600080fd5b505050506102ac565b60018054600160a060020a031916600160a060020a0392909216919091179055565b600054600160a060020a038281169116141561010157600080fd5b60008054600160a060020a031916600160a060020a038316908117825560405190917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b91a250565b8051600160a060020a038116811461016057600080fd5b919050565b600080600060608486031215610179578283fd5b61018284610149565b925061019060208501610149565b9150604084015167ffffffffffffffff808211156101ac578283fd5b818601915086601f8301126101bf578283fd5b8151818111156101d1576101d161027d565b604051601f8201601f19908116603f011681019083821181831017156101f9576101f961027d565b81604052828152896020848701011115610211578586fd5b61022283602083016020880161024d565b80955050505050509250925092565b6000825161024381846020870161024d565b9190910192915050565b60005b83811015610268578181015183820152602001610250565b83811115610277576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6104ae806102bb6000396000f3fe60806040526004361061008d576000357c0100000000000000000000000000000000000000000000000000000000900480634f1ef2861161006b5780634f1ef286146101385780635c60da1b1461014b5780636fde820214610169578063f1739cae146101875761008d565b8063025313a2146100c85780633659cfe6146100fa5780634555d5c91461011c575b600054600160a060020a0316806100a357600080fd5b60405136600082376000803683855af43d806000843e8180156100c4578184f35b8184fd5b3480156100d457600080fd5b506100dd6101a7565b604051600160a060020a0390911681526020015b60405180910390f35b34801561010657600080fd5b5061011a6101153660046103c9565b6101c0565b005b34801561012857600080fd5b50604051600281526020016100f1565b61011a6101463660046103ea565b6101f1565b34801561015757600080fd5b50600054600160a060020a03166100dd565b34801561017557600080fd5b50600154600160a060020a03166100dd565b34801561019357600080fd5b5061011a6101a23660046103c9565b61028f565b60006101bb600154600160a060020a031690565b905090565b6101c86101a7565b600160a060020a031633600160a060020a0316146101e557600080fd5b6101ee8161033d565b50565b6101f96101a7565b600160a060020a031633600160a060020a03161461021657600080fd5b61021f836101c0565b600030600160a060020a0316838360405161023b929190610468565b600060405180830381855af49150503d8060008114610276576040519150601f19603f3d011682016040523d82523d6000602084013e61027b565b606091505b505090508061028957600080fd5b50505050565b6102976101a7565b600160a060020a031633600160a060020a0316146102b457600080fd5b600160a060020a0381166102c757600080fd5b7f5a3e66efaa1e445ebd894728a69d6959842ea1e97bd79b892797106e270efcd96102f06101a7565b60408051600160a060020a03928316815291841660208301520160405180910390a16001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03831617905550565b600054600160a060020a038281169116141561035857600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038316908117825560405190917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b91a250565b8035600160a060020a03811681146103c457600080fd5b919050565b6000602082840312156103da578081fd5b6103e3826103ad565b9392505050565b6000806000604084860312156103fe578182fd5b610407846103ad565b9250602084013567ffffffffffffffff80821115610423578384fd5b818601915086601f830112610436578384fd5b813581811115610444578485fd5b876020828501011115610455578485fd5b6020830194508093505050509250925092565b818382376000910190815291905056fea2646970667358221220c4f2f25ac1e2f38cb6dae3c0d103ccab6d47aaffc09d0bd69daa6e414f659c7764736f6c63430008040033a264697066735822122065cc2e29d49355c0a3ade4d8b73119eaca7917e8a09b4e7a6aef662039b47a4264736f6c6343000804003360806040526001805460a060020a60ff021916905534801561002057600080fd5b50610a66806100306000396000f3fe6080604052600436106100c8576000357c01000000000000000000000000000000000000000000000000000000009004806354fd4d501161008157806354fd4d50146101f45780635c60da1b1461024a57806363d256ce146102685780636fde8202146102895780637b103999146102a75780638f4ffcb1146102c757600080fd5b80631b0f7ba9146101095780633f801f911461013e5780634555d5c914610160578063485cc9551461017c5780634c93505f1461019c5780634f8632ba146101bc57600080fd5b366101045760405134815233907fa419615bc8fda4c87663805ee2a3597a6d71c1d476911d9892f340d965bc7bf19060200160405180910390a2005b600080fd5b34801561011557600080fd5b506101296101243660046107ac565b6102e7565b60405190151581526020015b60405180910390f35b34801561014a57600080fd5b5061015e6101593660046107ac565b610562565b005b34801561016c57600080fd5b5060405160028152602001610135565b34801561018857600080fd5b5061015e610197366004610774565b61057d565b3480156101a857600080fd5b5061015e6101b7366004610915565b6105f3565b3480156101c857600080fd5b506002546101dc90600160a060020a031681565b604051600160a060020a039091168152602001610135565b34801561020057600080fd5b5061023d6040518060400160405280600381526020017f312e30000000000000000000000000000000000000000000000000000000000081525081565b60405161013591906109af565b34801561025657600080fd5b50600054600160a060020a03166101dc565b34801561027457600080fd5b506003546101299060a060020a900460ff1681565b34801561029557600080fd5b50600154600160a060020a03166101dc565b3480156102b357600080fd5b506003546101dc90600160a060020a031681565b3480156102d357600080fd5b5061015e6102e236600461083c565b610673565b600254600090600160a060020a03163314806103a7575060035460a060020a900460ff161580156103a757506003546040517f69dc9ff3000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a03909116906369dc9ff39060240160206040518083038186803b15801561036f57600080fd5b505afa158015610383573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a79190610938565b610411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f2176616c69642070726f78792073656e64657200000000000000000000000000604482015260640160405180910390fd5b600084600181111561044c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156104b95784600160a060020a0316838360405161046c92919061099f565b6000604051808303816000865af19150503d80600081146104a9576040519150601f19603f3d011682016040523d82523d6000602084013e6104ae565b606091505b50508091505061055a565b60018460018111156104f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561055a5784600160a060020a0316838360405161051492919061099f565b600060405180830381855af49150503d806000811461054f576040519150601f19603f3d011682016040523d82523d6000602084013e610554565b606091505b50909150505b949350505050565b61056e848484846102e7565b61057757600080fd5b50505050565b60015460a060020a900460ff161561059457600080fd5b6001805474ff0000000000000000000000000000000000000000191660a060020a17905560028054600160a060020a0393841673ffffffffffffffffffffffffffffffffffffffff199182161790915560038054929093169116179055565b600254600160a060020a0316331461060a57600080fd5b6003805482151560a060020a0274ff0000000000000000000000000000000000000000199091161790556040517f2165014523a6f4135deffed62d70149aad59b64de5aac51e3abbcbe2a83e2f7e9061066890831515815260200190565b60405180910390a150565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152306024830152604482018590528391908216906323b872dd90606401602060405180830381600087803b1580156106df57600080fd5b505af11580156106f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107179190610938565b61072057600080fd5b82600160a060020a031685600160a060020a03167fd65b48fd35864b3528d38e44760be5553248f89bf3ff6b06cca57817cc2650bf86856040516107659291906109c2565b60405180910390a35050505050565b60008060408385031215610786578182fd5b823561079181610a0a565b915060208301356107a181610a0a565b809150509250929050565b600080600080606085870312156107c1578182fd5b84356107cc81610a0a565b93506020850135600281106107df578283fd5b9250604085013567ffffffffffffffff808211156107fb578384fd5b818701915087601f83011261080e578384fd5b81358181111561081c578485fd5b88602082850101111561082d578485fd5b95989497505060200194505050565b60008060008060808587031215610851578384fd5b843561085c81610a0a565b935060208501359250604085013561087381610a0a565b9150606085013567ffffffffffffffff8082111561088f578283fd5b818701915087601f8301126108a2578283fd5b8135818111156108b4576108b46109db565b604051601f8201601f19908116603f011681019083821181831017156108dc576108dc6109db565b816040528281528a60208487010111156108f4578586fd5b82602086016020830137918201602001949094529598949750929550505050565b600060208284031215610926578081fd5b813561093181610a22565b9392505050565b600060208284031215610949578081fd5b815161093181610a22565b60008151808452815b818110156109795760208185018101518683018201520161095d565b8181111561098a5782602083870101525b50601f01601f19169290920160200192915050565b8183823760009101908152919050565b6020815260006109316020830184610954565b82815260406020820152600061055a6040830184610954565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600160a060020a0381168114610a1f57600080fd5b50565b8015158114610a1f57600080fdfea2646970667358221220df53d6fcf8845c4a1a73f7dd990a29a0b133fd53a6ad88cf20b97b1001569d0664736f6c63430008040033
Deployed Bytecode
0x60806040523480156200001157600080fd5b506004361062000132576000357c0100000000000000000000000000000000000000000000000000000000900480638da5cb5b11620000c0578063ddd81f82116200008b578063ddd81f8214620002f7578063e71a02e11462000301578063ef7f3834146200030b578063f2fde38b146200032257600080fd5b80638da5cb5b146200027a57806397204d8e14620002a0578063c455279114620002b4578063d4e8e06314620002e057600080fd5b806354fd4d50116200010157806354fd4d5014620001db5780635eebea20146200021857806369dc9ff3146200024a578063715018a6146200027057600080fd5b806306fdde0314620001375780631a86ac4f146200018c57806338b6e40714620001ab57806353376d1f14620001c4575b600080fd5b620001746040518060400160405280601881526020017f456c656d656e7469782050726f7879205265676973747279000000000000000081525081565b60405162000183919062000a1f565b60405180910390f35b6006546200019a9060ff1681565b604051901515815260200162000183565b620001c2620001bc3660046200096a565b62000339565b005b620001c2620001d53660046200096a565b62000458565b620001746040518060400160405280600381526020017f312e30000000000000000000000000000000000000000000000000000000000081525081565b6200023b620002293660046200096a565b60036020526000908152604090205481565b60405190815260200162000183565b6200019a6200025b3660046200096a565b60046020526000908152604090205460ff1681565b620001c2620004d8565b600054600160a060020a03165b604051600160a060020a03909116815260200162000183565b6001546200028790600160a060020a031681565b62000287620002c53660046200096a565b600260205260009081526040902054600160a060020a031681565b620001c2620002f13660046200096a565b6200055f565b62000287620005f5565b6200023b60055481565b620001c26200031c3660046200096a565b62000786565b620001c2620003333660046200096a565b62000843565b600054600160a060020a03163314620003725760405160e560020a62461bcd028152600401620003699062000a34565b60405180910390fd5b600160a060020a03811660009081526004602052604090205460ff16158015620003b35750600160a060020a03811660009081526003602052604090205415155b8015620003e65750600554600160a060020a0382166000908152600360205260409020544291620003e49162000a69565b105b620003f057600080fd5b600160a060020a03811660008181526003602090815260408083208390556004825291829020805460ff1916600190811790915591519182527f0aaff445881d512ee8dd1532abd9df22338e84715cbd7f031ecba02b7a57da9e91015b60405180910390a250565b600054600160a060020a03163314620004885760405160e560020a62461bcd028152600401620003699062000a34565b600160a060020a0381166000818152600460209081526040808320805460ff19169055519182527f0aaff445881d512ee8dd1532abd9df22338e84715cbd7f031ecba02b7a57da9e91016200044d565b600054600160a060020a03163314620005085760405160e560020a62461bcd028152600401620003699062000a34565b60008054604051600160a060020a03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600054600160a060020a031633146200058f5760405160e560020a62461bcd028152600401620003699062000a34565b600160a060020a03811660009081526004602052604090205460ff16158015620005cf5750600160a060020a038116600090815260036020526040902054155b620005d957600080fd5b600160a060020a03166000908152600360205260409020429055565b33600090815260026020526040812054600160a060020a031615620006605760405160e560020a62461bcd02815260206004820152600c60248201527f6475702072656769737465720000000000000000000000000000000000000000604482015260640162000369565b600154604051336024820181905230604483015291600160a060020a03169060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f485cc9550000000000000000000000000000000000000000000000000000000017905251620006e6906200095c565b620006f493929190620009e8565b604051809103906000f08015801562000711573d6000803e3d6000fd5b5033600081815260026020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038616908117909155915191825292935090917fd9764ce22a20ed64544405a3ad75ec9e807367ddc7bb3a08a7838debf314c2c7910160405180910390a290565b600054600160a060020a03163314620007b65760405160e560020a62461bcd028152600401620003699062000a34565b60065460ff16156200080e5760405160e560020a62461bcd02815260206004820152600a60248201527f21696e697469616c656400000000000000000000000000000000000000000000604482015260640162000369565b6006805460ff199081166001908117909255600160a060020a0390921660009081526004602052604090208054909216179055565b600054600160a060020a03163314620008735760405160e560020a62461bcd028152600401620003699062000a34565b600160a060020a038116620008f45760405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840162000369565b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6107698062000aa883390190565b6000602082840312156200097c578081fd5b8135600160a060020a038116811462000993578182fd5b9392505050565b60008151808452815b81811015620009c157602081850181015186830182015201620009a3565b81811115620009d35782602083870101525b50601f01601f19169290920160200192915050565b6000600160a060020a0380861683528085166020840152506060604083015262000a1660608301846200099a565b95945050505050565b6020815260006200099360208301846200099a565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111562000aa2577f4e487b710000000000000000000000000000000000000000000000000000000081526011600452602481fd5b50019056fe608060405234801561001057600080fd5b5060405161076938038061076983398101604081905261002f91610165565b610041836401000000006100c4810204565b610053826401000000006100e6810204565b600082600160a060020a03168260405161006d9190610231565b600060405180830381855af49150503d80600081146100a8576040519150601f19603f3d011682016040523d82523d6000602084013e6100ad565b606091505b50509050806100bb57600080fd5b505050506102ac565b60018054600160a060020a031916600160a060020a0392909216919091179055565b600054600160a060020a038281169116141561010157600080fd5b60008054600160a060020a031916600160a060020a038316908117825560405190917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b91a250565b8051600160a060020a038116811461016057600080fd5b919050565b600080600060608486031215610179578283fd5b61018284610149565b925061019060208501610149565b9150604084015167ffffffffffffffff808211156101ac578283fd5b818601915086601f8301126101bf578283fd5b8151818111156101d1576101d161027d565b604051601f8201601f19908116603f011681019083821181831017156101f9576101f961027d565b81604052828152896020848701011115610211578586fd5b61022283602083016020880161024d565b80955050505050509250925092565b6000825161024381846020870161024d565b9190910192915050565b60005b83811015610268578181015183820152602001610250565b83811115610277576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6104ae806102bb6000396000f3fe60806040526004361061008d576000357c0100000000000000000000000000000000000000000000000000000000900480634f1ef2861161006b5780634f1ef286146101385780635c60da1b1461014b5780636fde820214610169578063f1739cae146101875761008d565b8063025313a2146100c85780633659cfe6146100fa5780634555d5c91461011c575b600054600160a060020a0316806100a357600080fd5b60405136600082376000803683855af43d806000843e8180156100c4578184f35b8184fd5b3480156100d457600080fd5b506100dd6101a7565b604051600160a060020a0390911681526020015b60405180910390f35b34801561010657600080fd5b5061011a6101153660046103c9565b6101c0565b005b34801561012857600080fd5b50604051600281526020016100f1565b61011a6101463660046103ea565b6101f1565b34801561015757600080fd5b50600054600160a060020a03166100dd565b34801561017557600080fd5b50600154600160a060020a03166100dd565b34801561019357600080fd5b5061011a6101a23660046103c9565b61028f565b60006101bb600154600160a060020a031690565b905090565b6101c86101a7565b600160a060020a031633600160a060020a0316146101e557600080fd5b6101ee8161033d565b50565b6101f96101a7565b600160a060020a031633600160a060020a03161461021657600080fd5b61021f836101c0565b600030600160a060020a0316838360405161023b929190610468565b600060405180830381855af49150503d8060008114610276576040519150601f19603f3d011682016040523d82523d6000602084013e61027b565b606091505b505090508061028957600080fd5b50505050565b6102976101a7565b600160a060020a031633600160a060020a0316146102b457600080fd5b600160a060020a0381166102c757600080fd5b7f5a3e66efaa1e445ebd894728a69d6959842ea1e97bd79b892797106e270efcd96102f06101a7565b60408051600160a060020a03928316815291841660208301520160405180910390a16001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03831617905550565b600054600160a060020a038281169116141561035857600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038316908117825560405190917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b91a250565b8035600160a060020a03811681146103c457600080fd5b919050565b6000602082840312156103da578081fd5b6103e3826103ad565b9392505050565b6000806000604084860312156103fe578182fd5b610407846103ad565b9250602084013567ffffffffffffffff80821115610423578384fd5b818601915086601f830112610436578384fd5b813581811115610444578485fd5b876020828501011115610455578485fd5b6020830194508093505050509250925092565b818382376000910190815291905056fea2646970667358221220c4f2f25ac1e2f38cb6dae3c0d103ccab6d47aaffc09d0bd69daa6e414f659c7764736f6c63430008040033a264697066735822122065cc2e29d49355c0a3ade4d8b73119eaca7917e8a09b4e7a6aef662039b47a4264736f6c63430008040033
Deployed Bytecode Sourcemap
43722:908:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43780:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;43948:37;;;;;;;;;;;;1999:14:1;;1992:22;1974:41;;1962:2;1947:18;43948:37:0;1929:92:1;39147:319:0;;;;;;:::i;:::-;;:::i;:::-;;39670:179;;;;;;:::i;:::-;;:::i;43843:38::-;;;;;;;;;;;;;;;;;;;;;37569:42;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;4111:25:1;;;4099:2;4084:18;37569:42:0;4066:76:1;37672:41:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;36632:148;;;:::i;35981:87::-;36027:7;36054:6;-1:-1:-1;;;;;36054:6:0;35981:87;;;-1:-1:-1;;;;;992:55:1;;;974:74;;962:2;947:18;35981:87:0;929:125:1;37375:42:0;;;;;-1:-1:-1;;;;;37375:42:0;;;37468:55;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;37468:55:0;;;38726:197;;;;;;:::i;:::-;;:::i;40087:462::-;;;:::i;38314:36::-;;;;;;44393:232;;;;;;:::i;:::-;;:::i;36935:244::-;;;;;;:::i;:::-;;:::i;39147:319::-;36027:7;36054:6;-1:-1:-1;;;;;36054:6:0;22781:10;36201:23;36193:68;;;;-1:-1:-1;;;;;36193:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;39254:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;::::1;;39253:16;:38:::0;::::1;;;-1:-1:-1::0;;;;;;39273:13:0;::::1;;::::0;;;:7:::1;:13;::::0;;;;;:18;::::1;39253:38;:92;;;;-1:-1:-1::0;39313:12:0::1;::::0;-1:-1:-1;;;;;39297:13:0;::::1;;::::0;;;:7:::1;:13;::::0;;;;;39329:15:::1;::::0;39297:28:::1;::::0;::::1;:::i;:::-;39296:48;39253:92;39245:101;;;::::0;::::1;;-1:-1:-1::0;;;;;39357:13:0;::::1;39373:1;39357:13:::0;;;:7:::1;:13;::::0;;;;;;;:17;;;39385:9:::1;:15:::0;;;;;;:22;;-1:-1:-1;;39385:22:0::1;39403:4;39385:22:::0;;::::1;::::0;;;39423:35;;1974:41:1;;;39423:35:0::1;::::0;1947:18:1;39423:35:0::1;;;;;;;;39147:319:::0;:::o;39670:179::-;36027:7;36054:6;-1:-1:-1;;;;;36054:6:0;22781:10;36201:23;36193:68;;;;-1:-1:-1;;;;;36193:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39766:15:0;::::1;39784:5;39766:15:::0;;;:9:::1;:15;::::0;;;;;;;:23;;-1:-1:-1;;39766:23:0::1;::::0;;39805:36;1974:41:1;;;39805:36:0::1;::::0;1947:18:1;39805:36:0::1;1929:92:1::0;36632:148:0;36027:7;36054:6;-1:-1:-1;;;;;36054:6:0;22781:10;36201:23;36193:68;;;;-1:-1:-1;;;;;36193:68:0;;;;;;;:::i;:::-;36739:1:::1;36723:6:::0;;36702:40:::1;::::0;-1:-1:-1;;;;;36723:6:0;;::::1;::::0;36702:40:::1;::::0;36739:1;;36702:40:::1;36770:1;36753:19:::0;;-1:-1:-1;;36753:19:0::1;::::0;;36632:148::o;38726:197::-;36027:7;36054:6;-1:-1:-1;;;;;36054:6:0;22781:10;36201:23;36193:68;;;;-1:-1:-1;;;;;36193:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38835:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;::::1;;38834:16;:38:::0;::::1;;;-1:-1:-1::0;;;;;;38854:13:0;::::1;;::::0;;;:7:::1;:13;::::0;;;;;:18;38834:38:::1;38826:47;;;::::0;::::1;;-1:-1:-1::0;;;;;38884:13:0::1;;::::0;;;:7:::1;:13;::::0;;;;38900:15:::1;38884:31:::0;;38726:197::o;40087:462::-;40214:10;40146:26;40206:19;;;:7;:19;;;;;;-1:-1:-1;;;;;40206:19:0;40198:42;40190:66;;;;-1:-1:-1;;;;;40190:66:0;;3826:2:1;40190:66:0;;;3808:21:1;3865:2;3845:18;;;3838:30;3904:14;3884:18;;;3877:42;3936:18;;40190:66:0;3798:162:1;40190:66:0;40312:27;;40341:81;;40300:10;40341:81;;;1294:34:1;;;40416:4:0;1344:18:1;;;1337:43;40300:10:0;-1:-1:-1;;;;;40312:27:0;;1206:18:1;;40341:81:0;;;-1:-1:-1;;40341:81:0;;;;;;;;;;;;;;;;;;;;40275:148;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40442:10:0;40434:19;;;;:7;:19;;;;;;;;;:27;;-1:-1:-1;;40434:27:0;-1:-1:-1;;;;;40434:27:0;;;;;;;;40477:41;;974:74:1;;;40434:27:0;;-1:-1:-1;40442:10:0;;40477:41;;947:18:1;40477:41:0;;;;;;;40087:462;:::o;44393:232::-;36027:7;36054:6;-1:-1:-1;;;;;36054:6:0;22781:10;36201:23;36193:68;;;;-1:-1:-1;;;;;36193:68:0;;;;;;;:::i;:::-;44511:17:::1;::::0;::::1;;44510:18;44502:40;;;::::0;-1:-1:-1;;;;;44502:40:0;;2719:2:1;44502:40:0::1;::::0;::::1;2701:21:1::0;2758:2;2738:18;;;2731:30;2797:12;2777:18;;;2770:40;2827:18;;44502:40:0::1;2691:160:1::0;44502:40:0::1;44553:17;:24:::0;;-1:-1:-1;;44553:24:0;;::::1;44573:4;44553:24:::0;;::::1;::::0;;;-1:-1:-1;;;;;44588:22:0;;::::1;44553:17;44588:22:::0;;;:9:::1;:22;::::0;;;;:29;;;;::::1;;::::0;;44393:232::o;36935:244::-;36027:7;36054:6;-1:-1:-1;;;;;36054:6:0;22781:10;36201:23;36193:68;;;;-1:-1:-1;;;;;36193:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37024:22:0;::::1;37016:73;;;::::0;-1:-1:-1;;;;;37016:73:0;;3058:2:1;37016:73:0::1;::::0;::::1;3040:21:1::0;3097:2;3077:18;;;3070:30;3136:34;3116:18;;;3109:62;3207:8;3187:18;;;3180:36;3233:19;;37016:73:0::1;3030:228:1::0;37016:73:0::1;37126:6;::::0;;37105:38:::1;::::0;-1:-1:-1;;;;;37105:38:0;;::::1;::::0;37126:6;::::1;::::0;37105:38:::1;::::0;::::1;37154:6;:17:::0;;-1:-1:-1;;37154:17:0::1;-1:-1:-1::0;;;;;37154:17:0;;;::::1;::::0;;;::::1;::::0;;36935:244::o;-1:-1:-1:-;;;;;;;;:::o;14:329:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;-1:-1:-1;;;;;234:5:1;230:54;223:5;220:65;210:2;;304:6;296;289:22;210:2;332:5;84:259;-1:-1:-1;;;84:259:1:o;348:475::-;389:3;427:5;421:12;454:6;449:3;442:19;479:3;491:162;505:6;502:1;499:13;491:162;;;567:4;623:13;;;619:22;;613:29;595:11;;;591:20;;584:59;520:12;491:162;;;671:6;668:1;665:13;662:2;;;737:3;730:4;721:6;716:3;712:16;708:27;701:40;662:2;-1:-1:-1;805:2:1;784:15;-1:-1:-1;;780:29:1;771:39;;;;812:4;767:50;;397:426;-1:-1:-1;;397:426:1:o;1391:438::-;1557:4;-1:-1:-1;;;;;1667:2:1;1659:6;1655:15;1644:9;1637:34;1719:2;1711:6;1707:15;1702:2;1691:9;1687:18;1680:43;;1759:2;1754;1743:9;1739:18;1732:30;1779:44;1819:2;1808:9;1804:18;1796:6;1779:44;:::i;:::-;1771:52;1566:263;-1:-1:-1;;;;;1566:263:1:o;2293:219::-;2442:2;2431:9;2424:21;2405:4;2462:44;2502:2;2491:9;2487:18;2479:6;2462:44;:::i;3263:356::-;3465:2;3447:21;;;3484:18;;;3477:30;3543:34;3538:2;3523:18;;3516:62;3610:2;3595:18;;3437:182::o;4147:286::-;4187:3;4218:1;4214:6;4211:1;4208:13;4205:2;;;4256:77;4251:3;4244:90;4357:4;4354:1;4347:15;4387:4;4382:3;4375:17;4205:2;-1:-1:-1;4418:9:1;;4195:238::o
Swarm Source
ipfs://df53d6fcf8845c4a1a73f7dd990a29a0b133fd53a6ad88cf20b97b1001569d06
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.