Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 62 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer From | 16808990 | 625 days ago | IN | 0 ETH | 0.00045951 | ||||
Approve | 16665556 | 646 days ago | IN | 0 ETH | 0.00092145 | ||||
Increase Allowan... | 16335254 | 692 days ago | IN | 0 ETH | 0.00096445 | ||||
Delegate | 15522167 | 806 days ago | IN | 0 ETH | 0.0013539 | ||||
Delegate | 15319194 | 838 days ago | IN | 0 ETH | 0.00076914 | ||||
Delegate | 15308060 | 840 days ago | IN | 0 ETH | 0.00115335 | ||||
Delegate | 15204364 | 856 days ago | IN | 0 ETH | 0.00050179 | ||||
Delegate | 15204269 | 856 days ago | IN | 0 ETH | 0.00055984 | ||||
Delegate | 15204249 | 856 days ago | IN | 0 ETH | 0.0005491 | ||||
Delegate | 15204145 | 856 days ago | IN | 0 ETH | 0.00051436 | ||||
Delegate | 15196381 | 857 days ago | IN | 0 ETH | 0.00054409 | ||||
Delegate | 15159462 | 863 days ago | IN | 0 ETH | 0.00059277 | ||||
Delegate | 15159252 | 863 days ago | IN | 0 ETH | 0.00072431 | ||||
Delegate | 15159211 | 863 days ago | IN | 0 ETH | 0.00069145 | ||||
Delegate | 15133564 | 867 days ago | IN | 0 ETH | 0.00096127 | ||||
Delegate | 15133564 | 867 days ago | IN | 0 ETH | 0.00096127 | ||||
Delegate | 14943694 | 899 days ago | IN | 0 ETH | 0.00189076 | ||||
Delegate | 14865723 | 912 days ago | IN | 0 ETH | 0.00071938 | ||||
Delegate | 14865373 | 912 days ago | IN | 0 ETH | 0.00077196 | ||||
Delegate | 14865044 | 912 days ago | IN | 0 ETH | 0.00038475 | ||||
Delegate | 14865024 | 912 days ago | IN | 0 ETH | 0.00103079 | ||||
Delegate | 14859175 | 913 days ago | IN | 0 ETH | 0.00151585 | ||||
Delegate | 14858848 | 913 days ago | IN | 0 ETH | 0.00109569 | ||||
Delegate | 14857796 | 913 days ago | IN | 0 ETH | 0.00211342 | ||||
Delegate | 14853641 | 914 days ago | IN | 0 ETH | 0.00111067 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AaveTokenV2
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-10 */ // SPDX-License-Identifier: agpl-3.0 pragma solidity 0.7.5; pragma experimental ABIEncoderV2; interface IGovernancePowerDelegationToken { enum DelegationType {VOTING_POWER, PROPOSITION_POWER} /** * @dev emitted when a user delegates to another * @param delegator the delegator * @param delegatee the delegatee * @param delegationType the type of delegation (VOTING_POWER, PROPOSITION_POWER) **/ event DelegateChanged( address indexed delegator, address indexed delegatee, DelegationType delegationType ); /** * @dev emitted when an action changes the delegated power of a user * @param user the user which delegated power has changed * @param amount the amount of delegated power for the user * @param delegationType the type of delegation (VOTING_POWER, PROPOSITION_POWER) **/ event DelegatedPowerChanged(address indexed user, uint256 amount, DelegationType delegationType); /** * @dev delegates the specific power to a delegatee * @param delegatee the user which delegated power has changed * @param delegationType the type of delegation (VOTING_POWER, PROPOSITION_POWER) **/ function delegateByType(address delegatee, DelegationType delegationType) external virtual; /** * @dev delegates all the powers to a specific user * @param delegatee the user to which the power will be delegated **/ function delegate(address delegatee) external virtual; /** * @dev returns the delegatee of an user * @param delegator the address of the delegator **/ function getDelegateeByType(address delegator, DelegationType delegationType) external virtual view returns (address); /** * @dev returns the current delegated power of a user. The current power is the * power delegated at the time of the last snapshot * @param user the user **/ function getPowerCurrent(address user, DelegationType delegationType) external virtual view returns (uint256); /** * @dev returns the delegated power of a user at a certain block * @param user the user **/ function getPowerAtBlock( address user, uint256 blockNumber, DelegationType delegationType ) external virtual view returns (uint256); /** * @dev returns the total supply at a certain block number **/ function totalSupplyAt(uint256 blockNumber) external virtual view returns (uint256); } /** * @dev From https://github.com/OpenZeppelin/openzeppelin-contracts * 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; } } /** * @dev Interface of the ERC20 standard as defined in the EIP. * From https://github.com/OpenZeppelin/openzeppelin-contracts */ 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); } /** * @dev From https://github.com/OpenZeppelin/openzeppelin-contracts * 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) { // Solidity only automatically asserts when dividing by 0 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; } } /** * @dev Collection of functions related to the address type * From https://github.com/OpenZeppelin/openzeppelin-contracts */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, 'Address: insufficient balance'); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(''); require(success, 'Address: unable to send value, recipient may have reverted'); } } /** * @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 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string internal _name; string internal _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view 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 {_setupDecimals} is * called. * * 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 returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view 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); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); 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].add(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) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); 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); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(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 = _totalSupply.add(amount); _balances[account] = _balances[account].add(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); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is 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 Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @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 { } } interface ITransferHook { function onTransfer( address from, address to, uint256 amount ) external; } /** * @title SafeERC20 * @dev From https://github.com/OpenZeppelin/openzeppelin-contracts * Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { require( (value == 0) || (token.allowance(address(this), spender) == 0), 'SafeERC20: approve from non-zero to non-zero allowance' ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function callOptionalReturn(IERC20 token, bytes memory data) private { require(address(token).isContract(), 'SafeERC20: call to non-contract'); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, 'SafeERC20: low-level call failed'); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), 'SafeERC20: ERC20 operation did not succeed'); } } } /** * @title VersionedInitializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. * * @author Aave, inspired by the OpenZeppelin Initializable contract */ abstract contract VersionedInitializable { /** * @dev Indicates that the contract has been initialized. */ uint256 internal lastInitializedRevision = 0; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { uint256 revision = getRevision(); require(revision > lastInitializedRevision, 'Contract instance has already been initialized'); lastInitializedRevision = revision; _; } /// @dev returns the revision number of the contract. /// Needs to be defined in the inherited class as a constant. function getRevision() internal pure virtual returns (uint256); // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } /** * @notice implementation of the AAVE token contract * @author Aave */ abstract contract GovernancePowerDelegationERC20 is ERC20, IGovernancePowerDelegationToken { using SafeMath for uint256; /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATE_BY_TYPE_TYPEHASH = keccak256( 'DelegateByType(address delegatee,uint256 type,uint256 nonce,uint256 expiry)' ); bytes32 public constant DELEGATE_TYPEHASH = keccak256( 'Delegate(address delegatee,uint256 nonce,uint256 expiry)' ); /// @dev snapshot of a value on a specific block, used for votes struct Snapshot { uint128 blockNumber; uint128 value; } /** * @dev delegates one specific power to a delegatee * @param delegatee the user which delegated power has changed * @param delegationType the type of delegation (VOTING_POWER, PROPOSITION_POWER) **/ function delegateByType(address delegatee, DelegationType delegationType) external override { _delegateByType(msg.sender, delegatee, delegationType); } /** * @dev delegates all the powers to a specific user * @param delegatee the user to which the power will be delegated **/ function delegate(address delegatee) external override { _delegateByType(msg.sender, delegatee, DelegationType.VOTING_POWER); _delegateByType(msg.sender, delegatee, DelegationType.PROPOSITION_POWER); } /** * @dev returns the delegatee of an user * @param delegator the address of the delegator **/ function getDelegateeByType(address delegator, DelegationType delegationType) external override view returns (address) { (, , mapping(address => address) storage delegates) = _getDelegationDataByType(delegationType); return _getDelegatee(delegator, delegates); } /** * @dev returns the current delegated power of a user. The current power is the * power delegated at the time of the last snapshot * @param user the user **/ function getPowerCurrent(address user, DelegationType delegationType) external override view returns (uint256) { ( mapping(address => mapping(uint256 => Snapshot)) storage snapshots, mapping(address => uint256) storage snapshotsCounts, ) = _getDelegationDataByType(delegationType); return _searchByBlockNumber(snapshots, snapshotsCounts, user, block.number); } /** * @dev returns the delegated power of a user at a certain block * @param user the user **/ function getPowerAtBlock( address user, uint256 blockNumber, DelegationType delegationType ) external override view returns (uint256) { ( mapping(address => mapping(uint256 => Snapshot)) storage snapshots, mapping(address => uint256) storage snapshotsCounts, ) = _getDelegationDataByType(delegationType); return _searchByBlockNumber(snapshots, snapshotsCounts, user, blockNumber); } /** * @dev returns the total supply at a certain block number * used by the voting strategy contracts to calculate the total votes needed for threshold/quorum * In this initial implementation with no AAVE minting, simply returns the current supply * A snapshots mapping will need to be added in case a mint function is added to the AAVE token in the future **/ function totalSupplyAt(uint256 blockNumber) external override view returns (uint256) { return super.totalSupply(); } /** * @dev delegates the specific power to a delegatee * @param delegatee the user which delegated power has changed * @param delegationType the type of delegation (VOTING_POWER, PROPOSITION_POWER) **/ function _delegateByType( address delegator, address delegatee, DelegationType delegationType ) internal { require(delegatee != address(0), 'INVALID_DELEGATEE'); (, , mapping(address => address) storage delegates) = _getDelegationDataByType(delegationType); uint256 delegatorBalance = balanceOf(delegator); address previousDelegatee = _getDelegatee(delegator, delegates); delegates[delegator] = delegatee; _moveDelegatesByType(previousDelegatee, delegatee, delegatorBalance, delegationType); emit DelegateChanged(delegator, delegatee, delegationType); } /** * @dev moves delegated power from one user to another * @param from the user from which delegated power is moved * @param to the user that will receive the delegated power * @param amount the amount of delegated power to be moved * @param delegationType the type of delegation (VOTING_POWER, PROPOSITION_POWER) **/ function _moveDelegatesByType( address from, address to, uint256 amount, DelegationType delegationType ) internal { if (from == to) { return; } ( mapping(address => mapping(uint256 => Snapshot)) storage snapshots, mapping(address => uint256) storage snapshotsCounts, ) = _getDelegationDataByType(delegationType); if (from != address(0)) { uint256 previous = 0; uint256 fromSnapshotsCount = snapshotsCounts[from]; if (fromSnapshotsCount != 0) { previous = snapshots[from][fromSnapshotsCount - 1].value; } else { previous = balanceOf(from); } _writeSnapshot( snapshots, snapshotsCounts, from, uint128(previous), uint128(previous.sub(amount)) ); emit DelegatedPowerChanged(from, previous.sub(amount), delegationType); } if (to != address(0)) { uint256 previous = 0; uint256 toSnapshotsCount = snapshotsCounts[to]; if (toSnapshotsCount != 0) { previous = snapshots[to][toSnapshotsCount - 1].value; } else { previous = balanceOf(to); } _writeSnapshot( snapshots, snapshotsCounts, to, uint128(previous), uint128(previous.add(amount)) ); emit DelegatedPowerChanged(to, previous.add(amount), delegationType); } } /** * @dev searches a snapshot by block number. Uses binary search. * @param snapshots the snapshots mapping * @param snapshotsCounts the number of snapshots * @param user the user for which the snapshot is being searched * @param blockNumber the block number being searched **/ function _searchByBlockNumber( mapping(address => mapping(uint256 => Snapshot)) storage snapshots, mapping(address => uint256) storage snapshotsCounts, address user, uint256 blockNumber ) internal view returns (uint256) { require(blockNumber <= block.number, 'INVALID_BLOCK_NUMBER'); uint256 snapshotsCount = snapshotsCounts[user]; if (snapshotsCount == 0) { return balanceOf(user); } // First check most recent balance if (snapshots[user][snapshotsCount - 1].blockNumber <= blockNumber) { return snapshots[user][snapshotsCount - 1].value; } // Next check implicit zero balance if (snapshots[user][0].blockNumber > blockNumber) { return 0; } uint256 lower = 0; uint256 upper = snapshotsCount - 1; while (upper > lower) { uint256 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Snapshot memory snapshot = snapshots[user][center]; if (snapshot.blockNumber == blockNumber) { return snapshot.value; } else if (snapshot.blockNumber < blockNumber) { lower = center; } else { upper = center - 1; } } return snapshots[user][lower].value; } /** * @dev returns the delegation data (snapshot, snapshotsCount, list of delegates) by delegation type * NOTE: Ideal implementation would have mapped this in a struct by delegation type. Unfortunately, * the AAVE token and StakeToken already include a mapping for the snapshots, so we require contracts * who inherit from this to provide access to the delegation data by overriding this method. * @param delegationType the type of delegation **/ function _getDelegationDataByType(DelegationType delegationType) internal virtual view returns ( mapping(address => mapping(uint256 => Snapshot)) storage, //snapshots mapping(address => uint256) storage, //snapshots count mapping(address => address) storage //delegatees list ); /** * @dev Writes a snapshot for an owner of tokens * @param owner The owner of the tokens * @param oldValue The value before the operation that is gonna be executed after the snapshot * @param newValue The value after the operation */ function _writeSnapshot( mapping(address => mapping(uint256 => Snapshot)) storage snapshots, mapping(address => uint256) storage snapshotsCounts, address owner, uint128 oldValue, uint128 newValue ) internal { uint128 currentBlock = uint128(block.number); uint256 ownerSnapshotsCount = snapshotsCounts[owner]; mapping(uint256 => Snapshot) storage snapshotsOwner = snapshots[owner]; // Doing multiple operations in the same block if ( ownerSnapshotsCount != 0 && snapshotsOwner[ownerSnapshotsCount - 1].blockNumber == currentBlock ) { snapshotsOwner[ownerSnapshotsCount - 1].value = newValue; } else { snapshotsOwner[ownerSnapshotsCount] = Snapshot(currentBlock, newValue); snapshotsCounts[owner] = ownerSnapshotsCount + 1; } } /** * @dev returns the user delegatee. If a user never performed any delegation, * his delegated address will be 0x0. In that case we simply return the user itself * @param delegator the address of the user for which return the delegatee * @param delegates the array of delegates for a particular type of delegation **/ function _getDelegatee(address delegator, mapping(address => address) storage delegates) internal view returns (address) { address previousDelegatee = delegates[delegator]; if (previousDelegatee == address(0)) { return delegator; } return previousDelegatee; } } /** * @notice implementation of the AAVE token contract * @author Aave */ contract AaveTokenV2 is GovernancePowerDelegationERC20, VersionedInitializable { using SafeMath for uint256; string internal constant NAME = 'Aave Token'; string internal constant SYMBOL = 'AAVE'; uint8 internal constant DECIMALS = 18; uint256 public constant REVISION = 2; /// @dev owner => next valid nonce to submit with permit() mapping(address => uint256) public _nonces; mapping(address => mapping(uint256 => Snapshot)) public _votingSnapshots; mapping(address => uint256) public _votingSnapshotsCounts; /// @dev reference to the Aave governance contract to call (if initialized) on _beforeTokenTransfer /// !!! IMPORTANT The Aave governance is considered a trustable contract, being its responsibility /// to control all potential reentrancies by calling back the AaveToken ITransferHook public _aaveGovernance; bytes32 public DOMAIN_SEPARATOR; bytes public constant EIP712_REVISION = bytes('1'); bytes32 internal constant EIP712_DOMAIN = keccak256( 'EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)' ); bytes32 public constant PERMIT_TYPEHASH = keccak256( 'Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)' ); mapping(address => address) internal _votingDelegates; mapping(address => mapping(uint256 => Snapshot)) internal _propositionPowerSnapshots; mapping(address => uint256) internal _propositionPowerSnapshotsCounts; mapping(address => address) internal _propositionPowerDelegates; constructor() public ERC20(NAME, SYMBOL) {} /** * @dev initializes the contract upon assignment to the InitializableAdminUpgradeabilityProxy */ function initialize() external initializer {} /** * @dev implements the permit function as for https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md * @param owner the owner of the funds * @param spender the spender * @param value the amount * @param deadline the deadline timestamp, type(uint256).max for no deadline * @param v signature param * @param s signature param * @param r signature param */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external { require(owner != address(0), 'INVALID_OWNER'); //solium-disable-next-line require(block.timestamp <= deadline, 'INVALID_EXPIRATION'); uint256 currentValidNonce = _nonces[owner]; bytes32 digest = keccak256( abi.encodePacked( '\x19\x01', DOMAIN_SEPARATOR, keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, currentValidNonce, deadline)) ) ); require(owner == ecrecover(digest, v, r, s), 'INVALID_SIGNATURE'); _nonces[owner] = currentValidNonce.add(1); _approve(owner, spender, value); } /** * @dev returns the revision of the implementation contract */ function getRevision() internal override pure returns (uint256) { return REVISION; } /** * @dev Writes a snapshot before any operation involving transfer of value: _transfer, _mint and _burn * - On _transfer, it writes snapshots for both "from" and "to" * - On _mint, only for _to * - On _burn, only for _from * @param from the from address * @param to the to address * @param amount the amount to transfer */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal override { address votingFromDelegatee = _getDelegatee(from, _votingDelegates); address votingToDelegatee = _getDelegatee(to, _votingDelegates); _moveDelegatesByType( votingFromDelegatee, votingToDelegatee, amount, DelegationType.VOTING_POWER ); address propPowerFromDelegatee = _getDelegatee(from, _propositionPowerDelegates); address propPowerToDelegatee = _getDelegatee(to, _propositionPowerDelegates); _moveDelegatesByType( propPowerFromDelegatee, propPowerToDelegatee, amount, DelegationType.PROPOSITION_POWER ); // caching the aave governance address to avoid multiple state loads ITransferHook aaveGovernance = _aaveGovernance; if (aaveGovernance != ITransferHook(0)) { aaveGovernance.onTransfer(from, to, amount); } } function _getDelegationDataByType(DelegationType delegationType) internal override view returns ( mapping(address => mapping(uint256 => Snapshot)) storage, //snapshots mapping(address => uint256) storage, //snapshots count mapping(address => address) storage //delegatees list ) { if (delegationType == DelegationType.VOTING_POWER) { return (_votingSnapshots, _votingSnapshotsCounts, _votingDelegates); } else { return ( _propositionPowerSnapshots, _propositionPowerSnapshotsCounts, _propositionPowerDelegates ); } } /** * @dev Delegates power from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param delegationType the type of delegation (VOTING_POWER, PROPOSITION_POWER) * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateByTypeBySig( address delegatee, DelegationType delegationType, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) public { bytes32 structHash = keccak256( abi.encode(DELEGATE_BY_TYPE_TYPEHASH, delegatee, uint256(delegationType), nonce, expiry) ); bytes32 digest = keccak256(abi.encodePacked('\x19\x01', DOMAIN_SEPARATOR, structHash)); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), 'INVALID_SIGNATURE'); require(nonce == _nonces[signatory]++, 'INVALID_NONCE'); require(block.timestamp <= expiry, 'INVALID_EXPIRATION'); _delegateByType(signatory, delegatee, delegationType); } /** * @dev Delegates power from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) public { bytes32 structHash = keccak256(abi.encode(DELEGATE_TYPEHASH, delegatee, nonce, expiry)); bytes32 digest = keccak256(abi.encodePacked('\x19\x01', DOMAIN_SEPARATOR, structHash)); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), 'INVALID_SIGNATURE'); require(nonce == _nonces[signatory]++, 'INVALID_NONCE'); require(block.timestamp <= expiry, 'INVALID_EXPIRATION'); _delegateByType(signatory, delegatee, DelegationType.VOTING_POWER); _delegateByType(signatory, delegatee, DelegationType.PROPOSITION_POWER); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"delegatee","type":"address"},{"indexed":false,"internalType":"enum IGovernancePowerDelegationToken.DelegationType","name":"delegationType","type":"uint8"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"enum IGovernancePowerDelegationToken.DelegationType","name":"delegationType","type":"uint8"}],"name":"DelegatedPowerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATE_BY_TYPE_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DELEGATE_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EIP712_REVISION","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_aaveGovernance","outputs":[{"internalType":"contract ITransferHook","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_votingSnapshots","outputs":[{"internalType":"uint128","name":"blockNumber","type":"uint128"},{"internalType":"uint128","name":"value","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_votingSnapshotsCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"enum IGovernancePowerDelegationToken.DelegationType","name":"delegationType","type":"uint8"}],"name":"delegateByType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"enum IGovernancePowerDelegationToken.DelegationType","name":"delegationType","type":"uint8"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateByTypeBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"},{"internalType":"enum IGovernancePowerDelegationToken.DelegationType","name":"delegationType","type":"uint8"}],"name":"getDelegateeByType","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"enum IGovernancePowerDelegationToken.DelegationType","name":"delegationType","type":"uint8"}],"name":"getPowerAtBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"enum IGovernancePowerDelegationToken.DelegationType","name":"delegationType","type":"uint8"}],"name":"getPowerCurrent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006006553480156200001657600080fd5b50604080518082018252600a81526920b0bb32902a37b5b2b760b11b6020808301918252835180850190945260048452634141564560e01b908401528151919291620000659160039162000091565b5080516200007b90600490602084019062000091565b50506005805460ff19166012179055506200013d565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620000c9576000855562000114565b82601f10620000e457805160ff191683800117855562000114565b8280016001018555821562000114579182015b8281111562000114578251825591602001919060010190620000f7565b506200012292915062000126565b5090565b5b8082111562000122576000815560010162000127565b611df0806200014d6000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80638129fc1c1161010f578063c2ffbb91116100a2578063dc937e1c11610071578063dc937e1c146103cc578063dd62ed3e146103df578063dde43cba146103f2578063f713d8a8146103fa576101e5565b8063c2ffbb911461038b578063c3863ada1461039e578063c3cda520146103a6578063d505accf146103b9576101e5565b8063a9059cbb116100de578063a9059cbb1461034a578063aa9fbe021461035d578063b2f4201d14610365578063b9844d8d14610378576101e5565b80638129fc1c1461031457806395d89b411461031c578063981b24d014610324578063a457c2d714610337576101e5565b806339509351116101875780636f50458d116101565780636f50458d146102c657806370a08231146102e657806378160376146102f95780637bb73c9714610301576101e5565b8063395093511461027557806341cbf54a146102885780635b3cc0cf146102905780635c19a95c146102b1576101e5565b806323b872dd116101c357806323b872dd1461023d57806330adf81f14610250578063313ce567146102585780633644e5151461026d576101e5565b806306fdde03146101ea578063095ea7b31461020857806318160ddd14610228575b600080fd5b6101f261040d565b6040516101ff9190611a59565b60405180910390f35b61021b610216366004611824565b6104a3565b6040516101ff91906119a3565b6102306104c1565b6040516101ff91906119ae565b61021b61024b366004611726565b6104c7565b61023061054f565b610260610573565b6040516101ff9190611d39565b61023061057c565b61021b610283366004611824565b610582565b6102306105d0565b6102a361029e366004611824565b6105f4565b6040516101ff929190611d0b565b6102c46102bf3660046116da565b610625565b005b6102d96102d43660046117ca565b610640565b6040516101ff919061196b565b6102306102f43660046116da565b610662565b6101f2610681565b61023061030f3660046116da565b61069e565b6102c46106b0565b6101f26106eb565b6102306103323660046118df565b61074c565b61021b610345366004611824565b610756565b61021b610358366004611824565b6107be565b6102306107d2565b6102306103733660046117ca565b6107f6565b6102306103863660046116da565b61081e565b61023061039936600461184d565b610830565b6102d9610859565b6102c46103b4366004611888565b610868565b6102c46103c7366004611761565b6109e4565b6102c46103da3660046117ca565b610b71565b6102306103ed3660046116f4565b610b80565b610230610bab565b6102c46104083660046117f3565b610bb0565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104995780601f1061046e57610100808354040283529160200191610499565b820191906000526020600020905b81548152906001019060200180831161047c57829003601f168201915b5050505050905090565b60006104b76104b0610d2d565b8484610d31565b5060015b92915050565b60025490565b60006104d4848484610de5565b610544846104e0610d2d565b61053f85604051806060016040528060288152602001611d6e602891396001600160a01b038a1660009081526001602052604081209061051e610d2d565b6001600160a01b031681526020810191909152604001600020549190610efa565b610d31565b5060015b9392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60055460ff1690565b603d5481565b60006104b761058f610d2d565b8461053f85600160006105a0610d2d565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610f26565b7f9a9a49b990ba9bb39f8048c490a40ab25c18f55d208d5fbcf958261a9b48716d81565b603a6020908152600092835260408084209091529082529020546001600160801b0380821691600160801b90041682565b61063133826000610f4b565b61063d33826001610f4b565b50565b60008061064c83611028565b9250505061065a8482611062565b949350505050565b6001600160a01b0381166000908152602081905260409020545b919050565b604051806040016040528060018152602001603160f81b81525081565b603b6020526000908152604090205481565b60006106ba61108d565b905060065481116106e65760405162461bcd60e51b81526004016106dd90611b61565b60405180910390fd5b600655565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104995780601f1061046e57610100808354040283529160200191610499565b60006104bb6104c1565b60006104b7610763610d2d565b8461053f85604051806060016040528060258152602001611d96602591396001600061078d610d2d565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190610efa565b60006104b76107cb610d2d565b8484610de5565b7f10d8d059343739efce7dad10d09f0806da52b252b3e6a7951920d2d6ec4102e581565b600080600061080484611028565b509150915061081582828743611092565b95945050505050565b60396020526000908152604090205481565b600080600061083e84611028565b509150915061084f82828888611092565b9695505050505050565b603c546001600160a01b031681565b60007f9a9a49b990ba9bb39f8048c490a40ab25c18f55d208d5fbcf958261a9b48716d8787876040516020016108a194939291906119eb565b6040516020818303038152906040528051906020012090506000603d54826040516020016108d0929190611950565b60405160208183030381529060405280519060200120905060006001828787876040516000815260200160405260405161090d9493929190611a3b565b6020604051602081039080840390855afa15801561092f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166109625760405162461bcd60e51b81526004016106dd90611b36565b6001600160a01b038116600090815260396020526040902080546001810190915588146109a15760405162461bcd60e51b81526004016106dd90611bdb565b864211156109c15760405162461bcd60e51b81526004016106dd90611baf565b6109cd818a6000610f4b565b6109d9818a6001610f4b565b505050505050505050565b6001600160a01b038716610a0a5760405162461bcd60e51b81526004016106dd90611c02565b83421115610a2a5760405162461bcd60e51b81526004016106dd90611baf565b6001600160a01b038716600090815260396020908152604080832054603d549151909392610a84917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918d918d918d9189918e91016119b7565b60405160208183030381529060405280519060200120604051602001610aab929190611950565b60405160208183030381529060405280519060200120905060018186868660405160008152602001604052604051610ae69493929190611a3b565b6020604051602081039080840390855afa158015610b08573d6000803e3d6000fd5b505050602060405103516001600160a01b0316896001600160a01b031614610b425760405162461bcd60e51b81526004016106dd90611b36565b610b4d826001610f26565b6001600160a01b038a166000908152603960205260409020556109d9898989610d31565b610b7c338383610f4b565b5050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600281565b60007f10d8d059343739efce7dad10d09f0806da52b252b3e6a7951920d2d6ec4102e588886001811115610be057fe5b8888604051602001610bf6959493929190611a0f565b6040516020818303038152906040528051906020012090506000603d5482604051602001610c25929190611950565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051610c629493929190611a3b565b6020604051602081039080840390855afa158015610c84573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610cb75760405162461bcd60e51b81526004016106dd90611b36565b6001600160a01b03811660009081526039602052604090208054600181019091558814610cf65760405162461bcd60e51b81526004016106dd90611bdb565b86421115610d165760405162461bcd60e51b81526004016106dd90611baf565b610d21818b8b610f4b565b50505050505050505050565b3390565b6001600160a01b038316610d575760405162461bcd60e51b81526004016106dd90611c6e565b6001600160a01b038216610d7d5760405162461bcd60e51b81526004016106dd90611abd565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610dd89085906119ae565b60405180910390a3505050565b6001600160a01b038316610e0b5760405162461bcd60e51b81526004016106dd90611c29565b6001600160a01b038216610e315760405162461bcd60e51b81526004016106dd90611a7a565b610e3c838383611281565b610e7981604051806060016040528060268152602001611d48602691396001600160a01b0386166000908152602081905260409020549190610efa565b6001600160a01b038085166000908152602081905260408082209390935590841681522054610ea89082610f26565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610dd89085906119ae565b60008184841115610f1e5760405162461bcd60e51b81526004016106dd9190611a59565b505050900390565b6000828201838110156105485760405162461bcd60e51b81526004016106dd90611aff565b6001600160a01b038216610f715760405162461bcd60e51b81526004016106dd90611ce0565b6000610f7c82611028565b925050506000610f8b85610662565b90506000610f998684611062565b6001600160a01b03878116600090815260208690526040902080546001600160a01b0319169188169190911790559050610fd581868487611356565b846001600160a01b0316866001600160a01b03167fe8d51c8e11bd570db1734c8ec775785330e77007feed45c43b608ef33ff914bd866040516110189190611a6c565b60405180910390a3505050505050565b600080808084600181111561103957fe5b141561104f5750603a9150603b9050603e61105b565b50603f91506040905060415b9193909250565b6001600160a01b038083166000908152602083905260408120549091168061054857839150506104bb565b600290565b6000438211156110b45760405162461bcd60e51b81526004016106dd90611cb2565b6001600160a01b038316600090815260208590526040902054806110e3576110db84610662565b91505061065a565b6001600160a01b038416600090815260208781526040808320600019850184529091529020546001600160801b03168310611156576001600160a01b038416600090815260208781526040808320600019909401835292905220546001600160801b03600160801b90910416905061065a565b6001600160a01b0384166000908152602087815260408083208380529091529020546001600160801b031683101561119257600091505061065a565b600060001982015b818111156112445760028282030481036111b261168c565b506001600160a01b038716600090815260208a815260408083208484528252918290208251808401909352546001600160801b03808216808552600160801b909204169183019190915287141561121c57602001516001600160801b0316945061065a9350505050565b80516001600160801b03168711156112365781935061123d565b6001820392505b505061119a565b506001600160a01b0385166000908152602088815260408083209383529290522054600160801b90046001600160801b0316915050949350505050565b600061128e84603e611062565b9050600061129d84603e611062565b90506112ac8282856000611356565b60006112b9866041611062565b905060006112c8866041611062565b90506112d78282876001611356565b603c546001600160a01b0316801561134c57604051634a39314960e01b81526001600160a01b03821690634a39314990611319908b908b908b9060040161197f565b600060405180830381600087803b15801561133357600080fd5b505af1158015611347573d6000803e3d6000fd5b505050505b5050505050505050565b826001600160a01b0316846001600160a01b031614156113755761153d565b60008061138183611028565b5090925090506001600160a01b03861615611463576001600160a01b03861660009081526020829052604081205480156113f2576001600160a01b03881660009081526020858152604080832060001985018452909152902054600160801b90046001600160801b031691506113fe565b6113fb88610662565b91505b61141484848a8561140f818c611543565b611585565b6001600160a01b0388167fa0a19463ee116110c9b282012d9b65cc5522dc38a9520340cbaf3142e550127f6114498489611543565b87604051611458929190611d25565b60405180910390a250505b6001600160a01b0385161561153a576001600160a01b03851660009081526020829052604081205480156114ce576001600160a01b03871660009081526020858152604080832060001985018452909152902054600160801b90046001600160801b031691506114da565b6114d787610662565b91505b6114eb8484898561140f818c610f26565b6001600160a01b0387167fa0a19463ee116110c9b282012d9b65cc5522dc38a9520340cbaf3142e550127f6115208489610f26565b8760405161152f929190611d25565b60405180910390a250505b50505b50505050565b600061054883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610efa565b6001600160a01b038316600090815260208581526040808320549188905290912043919081158015906115d6575060001982016000908152602082905260409020546001600160801b038481169116145b1561160b576000198201600090815260208290526040902080546001600160801b03808716600160801b02911617905561134c565b6040805180820182526001600160801b038086168252868116602080840191825260008781528682528581209451855493518516600160801b029085166fffffffffffffffffffffffffffffffff1990941693909317909316919091179092556001600160a01b038916815290899052206001830190555050505050505050565b604080518082019091526000808252602082015290565b80356001600160a01b038116811461067c57600080fd5b80356002811061067c57600080fd5b803560ff8116811461067c57600080fd5b6000602082840312156116eb578081fd5b610548826116a3565b60008060408385031215611706578081fd5b61170f836116a3565b915061171d602084016116a3565b90509250929050565b60008060006060848603121561173a578081fd5b611743846116a3565b9250611751602085016116a3565b9150604084013590509250925092565b600080600080600080600060e0888a03121561177b578283fd5b611784886116a3565b9650611792602089016116a3565b955060408801359450606088013593506117ae608089016116c9565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156117dc578182fd5b6117e5836116a3565b915061171d602084016116ba565b600080600080600080600060e0888a03121561180d578283fd5b611816886116a3565b9650611792602089016116ba565b60008060408385031215611836578182fd5b61183f836116a3565b946020939093013593505050565b600080600060608486031215611861578283fd5b61186a846116a3565b92506020840135915061187f604085016116ba565b90509250925092565b60008060008060008060c087890312156118a0578182fd5b6118a9876116a3565b955060208701359450604087013593506118c5606088016116c9565b92506080870135915060a087013590509295509295509295565b6000602082840312156118f0578081fd5b5035919050565b60008151808452815b8181101561191c57602081850181015186830182015201611900565b8181111561192d5782602083870101525b50601f01601f19169290920160200192915050565b6002811061194c57fe5b9052565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b9485526001600160a01b0393909316602085015260408401919091526060830152608082015260a00190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825261054860208301846118f7565b602081016104bb8284611942565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b602080825260119082015270494e56414c49445f5349474e415455524560781b604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526012908201527124a72b20a624a22fa2ac2824a920aa24a7a760711b604082015260600190565b6020808252600d908201526c494e56414c49445f4e4f4e434560981b604082015260600190565b6020808252600d908201526c24a72b20a624a22fa7aba722a960991b604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526014908201527324a72b20a624a22fa12627a1a5afa72aa6a122a960611b604082015260600190565b602080825260119082015270494e56414c49445f44454c45474154454560781b604082015260600190565b6001600160801b0392831681529116602082015260400190565b828152604081016105486020830184611942565b60ff9190911681526020019056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122046f7baae87c03ea00503a474d3a010f9f2d5439071189052edccd2db1168edb164736f6c63430007050033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c80638129fc1c1161010f578063c2ffbb91116100a2578063dc937e1c11610071578063dc937e1c146103cc578063dd62ed3e146103df578063dde43cba146103f2578063f713d8a8146103fa576101e5565b8063c2ffbb911461038b578063c3863ada1461039e578063c3cda520146103a6578063d505accf146103b9576101e5565b8063a9059cbb116100de578063a9059cbb1461034a578063aa9fbe021461035d578063b2f4201d14610365578063b9844d8d14610378576101e5565b80638129fc1c1461031457806395d89b411461031c578063981b24d014610324578063a457c2d714610337576101e5565b806339509351116101875780636f50458d116101565780636f50458d146102c657806370a08231146102e657806378160376146102f95780637bb73c9714610301576101e5565b8063395093511461027557806341cbf54a146102885780635b3cc0cf146102905780635c19a95c146102b1576101e5565b806323b872dd116101c357806323b872dd1461023d57806330adf81f14610250578063313ce567146102585780633644e5151461026d576101e5565b806306fdde03146101ea578063095ea7b31461020857806318160ddd14610228575b600080fd5b6101f261040d565b6040516101ff9190611a59565b60405180910390f35b61021b610216366004611824565b6104a3565b6040516101ff91906119a3565b6102306104c1565b6040516101ff91906119ae565b61021b61024b366004611726565b6104c7565b61023061054f565b610260610573565b6040516101ff9190611d39565b61023061057c565b61021b610283366004611824565b610582565b6102306105d0565b6102a361029e366004611824565b6105f4565b6040516101ff929190611d0b565b6102c46102bf3660046116da565b610625565b005b6102d96102d43660046117ca565b610640565b6040516101ff919061196b565b6102306102f43660046116da565b610662565b6101f2610681565b61023061030f3660046116da565b61069e565b6102c46106b0565b6101f26106eb565b6102306103323660046118df565b61074c565b61021b610345366004611824565b610756565b61021b610358366004611824565b6107be565b6102306107d2565b6102306103733660046117ca565b6107f6565b6102306103863660046116da565b61081e565b61023061039936600461184d565b610830565b6102d9610859565b6102c46103b4366004611888565b610868565b6102c46103c7366004611761565b6109e4565b6102c46103da3660046117ca565b610b71565b6102306103ed3660046116f4565b610b80565b610230610bab565b6102c46104083660046117f3565b610bb0565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104995780601f1061046e57610100808354040283529160200191610499565b820191906000526020600020905b81548152906001019060200180831161047c57829003601f168201915b5050505050905090565b60006104b76104b0610d2d565b8484610d31565b5060015b92915050565b60025490565b60006104d4848484610de5565b610544846104e0610d2d565b61053f85604051806060016040528060288152602001611d6e602891396001600160a01b038a1660009081526001602052604081209061051e610d2d565b6001600160a01b031681526020810191909152604001600020549190610efa565b610d31565b5060015b9392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60055460ff1690565b603d5481565b60006104b761058f610d2d565b8461053f85600160006105a0610d2d565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610f26565b7f9a9a49b990ba9bb39f8048c490a40ab25c18f55d208d5fbcf958261a9b48716d81565b603a6020908152600092835260408084209091529082529020546001600160801b0380821691600160801b90041682565b61063133826000610f4b565b61063d33826001610f4b565b50565b60008061064c83611028565b9250505061065a8482611062565b949350505050565b6001600160a01b0381166000908152602081905260409020545b919050565b604051806040016040528060018152602001603160f81b81525081565b603b6020526000908152604090205481565b60006106ba61108d565b905060065481116106e65760405162461bcd60e51b81526004016106dd90611b61565b60405180910390fd5b600655565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104995780601f1061046e57610100808354040283529160200191610499565b60006104bb6104c1565b60006104b7610763610d2d565b8461053f85604051806060016040528060258152602001611d96602591396001600061078d610d2d565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190610efa565b60006104b76107cb610d2d565b8484610de5565b7f10d8d059343739efce7dad10d09f0806da52b252b3e6a7951920d2d6ec4102e581565b600080600061080484611028565b509150915061081582828743611092565b95945050505050565b60396020526000908152604090205481565b600080600061083e84611028565b509150915061084f82828888611092565b9695505050505050565b603c546001600160a01b031681565b60007f9a9a49b990ba9bb39f8048c490a40ab25c18f55d208d5fbcf958261a9b48716d8787876040516020016108a194939291906119eb565b6040516020818303038152906040528051906020012090506000603d54826040516020016108d0929190611950565b60405160208183030381529060405280519060200120905060006001828787876040516000815260200160405260405161090d9493929190611a3b565b6020604051602081039080840390855afa15801561092f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166109625760405162461bcd60e51b81526004016106dd90611b36565b6001600160a01b038116600090815260396020526040902080546001810190915588146109a15760405162461bcd60e51b81526004016106dd90611bdb565b864211156109c15760405162461bcd60e51b81526004016106dd90611baf565b6109cd818a6000610f4b565b6109d9818a6001610f4b565b505050505050505050565b6001600160a01b038716610a0a5760405162461bcd60e51b81526004016106dd90611c02565b83421115610a2a5760405162461bcd60e51b81526004016106dd90611baf565b6001600160a01b038716600090815260396020908152604080832054603d549151909392610a84917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918d918d918d9189918e91016119b7565b60405160208183030381529060405280519060200120604051602001610aab929190611950565b60405160208183030381529060405280519060200120905060018186868660405160008152602001604052604051610ae69493929190611a3b565b6020604051602081039080840390855afa158015610b08573d6000803e3d6000fd5b505050602060405103516001600160a01b0316896001600160a01b031614610b425760405162461bcd60e51b81526004016106dd90611b36565b610b4d826001610f26565b6001600160a01b038a166000908152603960205260409020556109d9898989610d31565b610b7c338383610f4b565b5050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600281565b60007f10d8d059343739efce7dad10d09f0806da52b252b3e6a7951920d2d6ec4102e588886001811115610be057fe5b8888604051602001610bf6959493929190611a0f565b6040516020818303038152906040528051906020012090506000603d5482604051602001610c25929190611950565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051610c629493929190611a3b565b6020604051602081039080840390855afa158015610c84573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610cb75760405162461bcd60e51b81526004016106dd90611b36565b6001600160a01b03811660009081526039602052604090208054600181019091558814610cf65760405162461bcd60e51b81526004016106dd90611bdb565b86421115610d165760405162461bcd60e51b81526004016106dd90611baf565b610d21818b8b610f4b565b50505050505050505050565b3390565b6001600160a01b038316610d575760405162461bcd60e51b81526004016106dd90611c6e565b6001600160a01b038216610d7d5760405162461bcd60e51b81526004016106dd90611abd565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610dd89085906119ae565b60405180910390a3505050565b6001600160a01b038316610e0b5760405162461bcd60e51b81526004016106dd90611c29565b6001600160a01b038216610e315760405162461bcd60e51b81526004016106dd90611a7a565b610e3c838383611281565b610e7981604051806060016040528060268152602001611d48602691396001600160a01b0386166000908152602081905260409020549190610efa565b6001600160a01b038085166000908152602081905260408082209390935590841681522054610ea89082610f26565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610dd89085906119ae565b60008184841115610f1e5760405162461bcd60e51b81526004016106dd9190611a59565b505050900390565b6000828201838110156105485760405162461bcd60e51b81526004016106dd90611aff565b6001600160a01b038216610f715760405162461bcd60e51b81526004016106dd90611ce0565b6000610f7c82611028565b925050506000610f8b85610662565b90506000610f998684611062565b6001600160a01b03878116600090815260208690526040902080546001600160a01b0319169188169190911790559050610fd581868487611356565b846001600160a01b0316866001600160a01b03167fe8d51c8e11bd570db1734c8ec775785330e77007feed45c43b608ef33ff914bd866040516110189190611a6c565b60405180910390a3505050505050565b600080808084600181111561103957fe5b141561104f5750603a9150603b9050603e61105b565b50603f91506040905060415b9193909250565b6001600160a01b038083166000908152602083905260408120549091168061054857839150506104bb565b600290565b6000438211156110b45760405162461bcd60e51b81526004016106dd90611cb2565b6001600160a01b038316600090815260208590526040902054806110e3576110db84610662565b91505061065a565b6001600160a01b038416600090815260208781526040808320600019850184529091529020546001600160801b03168310611156576001600160a01b038416600090815260208781526040808320600019909401835292905220546001600160801b03600160801b90910416905061065a565b6001600160a01b0384166000908152602087815260408083208380529091529020546001600160801b031683101561119257600091505061065a565b600060001982015b818111156112445760028282030481036111b261168c565b506001600160a01b038716600090815260208a815260408083208484528252918290208251808401909352546001600160801b03808216808552600160801b909204169183019190915287141561121c57602001516001600160801b0316945061065a9350505050565b80516001600160801b03168711156112365781935061123d565b6001820392505b505061119a565b506001600160a01b0385166000908152602088815260408083209383529290522054600160801b90046001600160801b0316915050949350505050565b600061128e84603e611062565b9050600061129d84603e611062565b90506112ac8282856000611356565b60006112b9866041611062565b905060006112c8866041611062565b90506112d78282876001611356565b603c546001600160a01b0316801561134c57604051634a39314960e01b81526001600160a01b03821690634a39314990611319908b908b908b9060040161197f565b600060405180830381600087803b15801561133357600080fd5b505af1158015611347573d6000803e3d6000fd5b505050505b5050505050505050565b826001600160a01b0316846001600160a01b031614156113755761153d565b60008061138183611028565b5090925090506001600160a01b03861615611463576001600160a01b03861660009081526020829052604081205480156113f2576001600160a01b03881660009081526020858152604080832060001985018452909152902054600160801b90046001600160801b031691506113fe565b6113fb88610662565b91505b61141484848a8561140f818c611543565b611585565b6001600160a01b0388167fa0a19463ee116110c9b282012d9b65cc5522dc38a9520340cbaf3142e550127f6114498489611543565b87604051611458929190611d25565b60405180910390a250505b6001600160a01b0385161561153a576001600160a01b03851660009081526020829052604081205480156114ce576001600160a01b03871660009081526020858152604080832060001985018452909152902054600160801b90046001600160801b031691506114da565b6114d787610662565b91505b6114eb8484898561140f818c610f26565b6001600160a01b0387167fa0a19463ee116110c9b282012d9b65cc5522dc38a9520340cbaf3142e550127f6115208489610f26565b8760405161152f929190611d25565b60405180910390a250505b50505b50505050565b600061054883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610efa565b6001600160a01b038316600090815260208581526040808320549188905290912043919081158015906115d6575060001982016000908152602082905260409020546001600160801b038481169116145b1561160b576000198201600090815260208290526040902080546001600160801b03808716600160801b02911617905561134c565b6040805180820182526001600160801b038086168252868116602080840191825260008781528682528581209451855493518516600160801b029085166fffffffffffffffffffffffffffffffff1990941693909317909316919091179092556001600160a01b038916815290899052206001830190555050505050505050565b604080518082019091526000808252602082015290565b80356001600160a01b038116811461067c57600080fd5b80356002811061067c57600080fd5b803560ff8116811461067c57600080fd5b6000602082840312156116eb578081fd5b610548826116a3565b60008060408385031215611706578081fd5b61170f836116a3565b915061171d602084016116a3565b90509250929050565b60008060006060848603121561173a578081fd5b611743846116a3565b9250611751602085016116a3565b9150604084013590509250925092565b600080600080600080600060e0888a03121561177b578283fd5b611784886116a3565b9650611792602089016116a3565b955060408801359450606088013593506117ae608089016116c9565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156117dc578182fd5b6117e5836116a3565b915061171d602084016116ba565b600080600080600080600060e0888a03121561180d578283fd5b611816886116a3565b9650611792602089016116ba565b60008060408385031215611836578182fd5b61183f836116a3565b946020939093013593505050565b600080600060608486031215611861578283fd5b61186a846116a3565b92506020840135915061187f604085016116ba565b90509250925092565b60008060008060008060c087890312156118a0578182fd5b6118a9876116a3565b955060208701359450604087013593506118c5606088016116c9565b92506080870135915060a087013590509295509295509295565b6000602082840312156118f0578081fd5b5035919050565b60008151808452815b8181101561191c57602081850181015186830182015201611900565b8181111561192d5782602083870101525b50601f01601f19169290920160200192915050565b6002811061194c57fe5b9052565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b9485526001600160a01b0393909316602085015260408401919091526060830152608082015260a00190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825261054860208301846118f7565b602081016104bb8284611942565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b602080825260119082015270494e56414c49445f5349474e415455524560781b604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526012908201527124a72b20a624a22fa2ac2824a920aa24a7a760711b604082015260600190565b6020808252600d908201526c494e56414c49445f4e4f4e434560981b604082015260600190565b6020808252600d908201526c24a72b20a624a22fa7aba722a960991b604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526014908201527324a72b20a624a22fa12627a1a5afa72aa6a122a960611b604082015260600190565b602080825260119082015270494e56414c49445f44454c45474154454560781b604082015260600190565b6001600160801b0392831681529116602082015260400190565b828152604081016105486020830184611942565b60ff9190911681526020019056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122046f7baae87c03ea00503a474d3a010f9f2d5439071189052edccd2db1168edb164736f6c63430007050033
Deployed Bytecode Sourcemap
38765:7467:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15933:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18039:169;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;17008:100::-;;;:::i;:::-;;;;;;;:::i;18682:321::-;;;;;;:::i;:::-;;:::i;39883:147::-;;;:::i;16860:83::-;;;:::i;:::-;;;;;;;:::i;39640:31::-;;;:::i;19412:218::-;;;;;;:::i;:::-;;:::i;28810:123::-;;;:::i;39174:72::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;29607:214::-;;;;;;:::i;:::-;;:::i;:::-;;29938:300;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;17171:119::-;;;;;;:::i;:::-;;:::i;39676:50::-;;;:::i;39253:57::-;;;;;;:::i;:::-;;:::i;40492:45::-;;;:::i;16135:87::-;;;:::i;31785:124::-;;;;;;:::i;:::-;;:::i;20133:269::-;;;;;;:::i;:::-;;:::i;17503:175::-;;;;;;:::i;:::-;;:::i;28653:150::-;;;:::i;30424:419::-;;;;;;:::i;:::-;;:::i;39125:42::-;;;;;;:::i;:::-;;:::i;30959:436::-;;;;;;:::i;:::-;;:::i;39597:36::-;;;:::i;45501:728::-;;;;;;:::i;:::-;;:::i;40982:748::-;;;;;;:::i;:::-;;:::i;29303:159::-;;;;;;:::i;:::-;;:::i;17741:151::-;;;;;;:::i;:::-;;:::i;39020:36::-;;;:::i;44364:726::-;;;;;;:::i;:::-;;:::i;15933:83::-;16003:5;15996:12;;;;;;;;-1:-1:-1;;15996:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15970:13;;15996:12;;16003:5;;15996:12;;16003:5;15996:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15933:83;:::o;18039:169::-;18122:4;18139:39;18148:12;:10;:12::i;:::-;18162:7;18171:6;18139:8;:39::i;:::-;-1:-1:-1;18196:4:0;18039:169;;;;;:::o;17008:100::-;17088:12;;17008:100;:::o;18682:321::-;18788:4;18805:36;18815:6;18823:9;18834:6;18805:9;:36::i;:::-;18852:121;18861:6;18869:12;:10;:12::i;:::-;18883:89;18921:6;18883:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18883:19:0;;;;;;:11;:19;;;;;;18903:12;:10;:12::i;:::-;-1:-1:-1;;;;;18883:33:0;;;;;;;;;;;;-1:-1:-1;18883:33:0;;;:89;:37;:89::i;:::-;18852:8;:121::i;:::-;-1:-1:-1;18991:4:0;18682:321;;;;;;:::o;39883:147::-;39925:105;39883:147;:::o;16860:83::-;16926:9;;;;16860:83;:::o;39640:31::-;;;;:::o;19412:218::-;19500:4;19517:83;19526:12;:10;:12::i;:::-;19540:7;19549:50;19588:10;19549:11;:25;19561:12;:10;:12::i;:::-;-1:-1:-1;;;;;19549:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;19549:25:0;;;:34;;;;;;;;;;;:38;:50::i;28810:123::-;28854:79;28810:123;:::o;39174:72::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39174:72:0;;;;-1:-1:-1;;;39174:72:0;;;;:::o;29607:214::-;29669:67;29685:10;29697:9;29708:27;29669:15;:67::i;:::-;29743:72;29759:10;29771:9;29782:32;29743:15;:72::i;:::-;29607:214;:::o;29938:300::-;30068:7;30092:45;30141:40;30166:14;30141:24;:40::i;:::-;30087:94;;;;30197:35;30211:9;30222;30197:13;:35::i;:::-;30190:42;29938:300;-1:-1:-1;;;;29938:300:0:o;17171:119::-;-1:-1:-1;;;;;17264:18:0;;17237:7;17264:18;;;;;;;;;;;17171:119;;;;:::o;39676:50::-;39716:10;;;;;;;;;;;;;-1:-1:-1;;;39716:10:0;;;39676:50;:::o;39253:57::-;;;;;;;;;;;;;:::o;40492:45::-;27859:16;27878:13;:11;:13::i;:::-;27859:32;;27917:23;;27906:8;:34;27898:93;;;;-1:-1:-1;;;27898:93:0;;;;;;;:::i;:::-;;;;;;;;;28000:23;:34;40492:45::o;16135:87::-;16207:7;16200:14;;;;;;;;-1:-1:-1;;16200:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16174:13;;16200:14;;16207:7;;16200:14;;16207:7;16200:14;;;;;;;;;;;;;;;;;;;;;;;;31785:124;31861:7;31884:19;:17;:19::i;20133:269::-;20226:4;20243:129;20252:12;:10;:12::i;:::-;20266:7;20275:96;20314:15;20275:96;;;;;;;;;;;;;;;;;:11;:25;20287:12;:10;:12::i;:::-;-1:-1:-1;;;;;20275:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;20275:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;17503:175::-;17589:4;17606:42;17616:12;:10;:12::i;:::-;17630:9;17641:6;17606:9;:42::i;28653:150::-;28705:98;28653:150;:::o;30424:419::-;30546:7;30574:66;30649:51;30713:40;30738:14;30713:24;:40::i;:::-;30565:188;;;;;30769:68;30790:9;30801:15;30818:4;30824:12;30769:20;:68::i;:::-;30762:75;30424:419;-1:-1:-1;;;;;30424:419:0:o;39125:42::-;;;;;;;;;;;;;:::o;30959:436::-;31102:7;31127:66;31202:51;31266:40;31291:14;31266:24;:40::i;:::-;31118:188;;;;;31322:67;31343:9;31354:15;31371:4;31377:11;31322:20;:67::i;:::-;31315:74;30959:436;-1:-1:-1;;;;;;30959:436:0:o;39597:36::-;;;-1:-1:-1;;;;;39597:36:0;;:::o;45501:728::-;45654:18;28854:79;45715:9;45726:5;45733:6;45685:55;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45675:66;;;;;;45654:87;;45748:14;45804:16;;45822:10;45775:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45765:69;;;;;;45748:86;;45841:17;45861:26;45871:6;45879:1;45882;45885;45861:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45861:26:0;;-1:-1:-1;;45861:26:0;;;-1:-1:-1;;;;;;;45902:23:0;;45894:53;;;;-1:-1:-1;;;45894:53:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45971:18:0;;;;;;:7;:18;;;;;:20;;;;;;;;45962:29;;45954:55;;;;-1:-1:-1;;;45954:55:0;;;;;;;:::i;:::-;46043:6;46024:15;:25;;46016:56;;;;-1:-1:-1;;;46016:56:0;;;;;;;:::i;:::-;46079:66;46095:9;46106;46117:27;46079:15;:66::i;:::-;46152:71;46168:9;46179;46190:32;46152:15;:71::i;:::-;45501:728;;;;;;;;;:::o;40982:748::-;-1:-1:-1;;;;;41158:19:0;;41150:45;;;;-1:-1:-1;;;41150:45:0;;;;;;;:::i;:::-;41261:8;41242:15;:27;;41234:58;;;;-1:-1:-1;;;41234:58:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41327:14:0;;41299:25;41327:14;;;:7;:14;;;;;;;;;41431:16;;41468:79;;41327:14;;41299:25;41468:79;;39925:105;;41335:5;;41503:7;;41512:5;;41327:14;;41538:8;;41468:79;;:::i;:::-;;;;;;;;;;;;;41458:90;;;;;;41383:174;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41365:199;;;;;;41348:216;;41590:26;41600:6;41608:1;41611;41614;41590:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41581:35:0;:5;-1:-1:-1;;;;;41581:35:0;;41573:65;;;;-1:-1:-1;;;41573:65:0;;;;;;;:::i;:::-;41662:24;:17;41684:1;41662:21;:24::i;:::-;-1:-1:-1;;;;;41645:14:0;;;;;;:7;:14;;;;;:41;41693:31;41653:5;41709:7;41718:5;41693:8;:31::i;29303:159::-;29402:54;29418:10;29430:9;29441:14;29402:15;:54::i;:::-;29303:159;;:::o;17741:151::-;-1:-1:-1;;;;;17857:18:0;;;17830:7;17857:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17741:151::o;39020:36::-;39055:1;39020:36;:::o;44364:726::-;44559:18;28705:98;44636:9;44655:14;44647:23;;;;;;;;44672:5;44679:6;44598:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44580:113;;;;;;44559:134;;44700:14;44756:16;;44774:10;44727:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44717:69;;;;;;44700:86;;44793:17;44813:26;44823:6;44831:1;44834;44837;44813:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44813:26:0;;-1:-1:-1;;44813:26:0;;;-1:-1:-1;;;;;;;44854:23:0;;44846:53;;;;-1:-1:-1;;;44846:53:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44923:18:0;;;;;;:7;:18;;;;;:20;;;;;;;;44914:29;;44906:55;;;;-1:-1:-1;;;44906:55:0;;;;;;;:::i;:::-;44995:6;44976:15;:25;;44968:56;;;;-1:-1:-1;;;44968:56:0;;;;;;;:::i;:::-;45031:53;45047:9;45058;45069:14;45031:15;:53::i;:::-;44364:726;;;;;;;;;;:::o;3093:100::-;3177:10;3093:100;:::o;23280:346::-;-1:-1:-1;;;;;23382:19:0;;23374:68;;;;-1:-1:-1;;;23374:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23461:21:0;;23453:68;;;;-1:-1:-1;;;23453:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23534:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;23586:32;;;;;23564:6;;23586:32;:::i;:::-;;;;;;;;23280:346;;;:::o;20892:539::-;-1:-1:-1;;;;;20998:20:0;;20990:70;;;;-1:-1:-1;;;20990:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21079:23:0;;21071:71;;;;-1:-1:-1;;;21071:71:0;;;;;;;:::i;:::-;21155:47;21176:6;21184:9;21195:6;21155:20;:47::i;:::-;21235:71;21257:6;21235:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21235:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;21215:17:0;;;:9;:17;;;;;;;;;;;:91;;;;21340:20;;;;;;;:32;;21365:6;21340:24;:32::i;:::-;-1:-1:-1;;;;;21317:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;21388:35;;;;;;;;;;21416:6;;21388:35;:::i;7813:198::-;7919:7;7951:12;7943:6;;;;7935:29;;;;-1:-1:-1;;;7935:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;7983:5:0;;;7813:198::o;6986:167::-;7044:7;7072:5;;;7092:6;;;;7084:46;;;;-1:-1:-1;;;7084:46:0;;;;;;;:::i;32136:619::-;-1:-1:-1;;;;;32274:23:0;;32266:53;;;;-1:-1:-1;;;32266:53:0;;;;;;;:::i;:::-;32333:45;32382:40;32407:14;32382:24;:40::i;:::-;32328:94;;;;32431:24;32458:20;32468:9;32458;:20::i;:::-;32431:47;;32487:25;32515:35;32529:9;32540;32515:13;:35::i;:::-;-1:-1:-1;;;;;32559:20:0;;;;;;;;;;;;;;:32;;-1:-1:-1;;;;;;32559:32:0;;;;;;;;;;32487:63;-1:-1:-1;32600:84:0;32487:63;32559:32;32651:16;32669:14;32600:20;:84::i;:::-;32723:9;-1:-1:-1;;;;;32696:53:0;32712:9;-1:-1:-1;;;;;32696:53:0;;32734:14;32696:53;;;;;;:::i;:::-;;;;;;;;32136:619;;;;;;:::o;43237:631::-;43362:56;;;;43576:14;:45;;;;;;;;;43572:291;;;-1:-1:-1;43640:16:0;;-1:-1:-1;43658:22:0;;-1:-1:-1;43682:16:0;43632:67;;43572:291;-1:-1:-1;43740:26:0;;-1:-1:-1;43777:32:0;;-1:-1:-1;43820:26:0;43572:291;43237:631;;;;;:::o;38366:311::-;-1:-1:-1;;;;;38540:20:0;;;38493:7;38540:20;;;;;;;;;;;38493:7;;38540:20;38573:31;38569:70;;38622:9;38615:16;;;;;41813:92;39055:1;41813:92;:::o;34864:1249::-;35098:7;35137:12;35122:11;:27;;35114:60;;;;-1:-1:-1;;;35114:60:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35208:21:0;;35183:22;35208:21;;;;;;;;;;;35242:19;35238:64;;35279:15;35289:4;35279:9;:15::i;:::-;35272:22;;;;;35238:64;-1:-1:-1;;;;;35354:15:0;;;;;;;;;;;;;;-1:-1:-1;;35370:18:0;;35354:35;;;;;;;:47;-1:-1:-1;;;;;35354:47:0;:62;-1:-1:-1;35350:133:0;;-1:-1:-1;;;;;35434:15:0;;;;;;;;;;;;;;-1:-1:-1;;35450:18:0;;;35434:35;;;;;;:41;-1:-1:-1;;;;;;;;35434:41:0;;;;;-1:-1:-1;35427:48:0;;35350:133;-1:-1:-1;;;;;35536:15:0;;;;;;;;;;;;;;:18;;;;;;;;:30;-1:-1:-1;;;;;35536:30:0;:44;-1:-1:-1;35532:75:0;;;35598:1;35591:8;;;;;35532:75;35615:13;-1:-1:-1;;35655:18:0;;35680:386;35695:5;35687;:13;35680:386;;;35754:1;35737:13;;;35736:19;35728:27;;35791:24;;:::i;:::-;-1:-1:-1;;;;;;35818:15:0;;;;;;;;;;;;;;:23;;;;;;;;;35791:50;;;;;;;;;-1:-1:-1;;;;;35791:50:0;;;;;;-1:-1:-1;;;35791:50:0;;;;;;;;;;;35854:35;;35850:209;;;35909:14;;;-1:-1:-1;;;;;35902:21:0;;-1:-1:-1;35902:21:0;;-1:-1:-1;;;;35902:21:0;35850:209;35943:20;;-1:-1:-1;;;;;35943:34:0;;-1:-1:-1;35939:120:0;;;35998:6;35990:14;;35939:120;;;36048:1;36039:6;:10;36031:18;;35939:120;35680:386;;;;;-1:-1:-1;;;;;;36079:15:0;;;;;;;;;;;;;;:22;;;;;;;:28;-1:-1:-1;;;36079:28:0;;-1:-1:-1;;;;;36079:28:0;;-1:-1:-1;;34864:1249:0;;;;;;:::o;42271:960::-;42388:27;42418:37;42432:4;42438:16;42418:13;:37::i;:::-;42388:67;;42462:25;42490:35;42504:2;42508:16;42490:13;:35::i;:::-;42462:63;;42534:132;42563:19;42591:17;42617:6;42632:27;42534:20;:132::i;:::-;42675:30;42708:47;42722:4;42728:26;42708:13;:47::i;:::-;42675:80;;42762:28;42793:45;42807:2;42811:26;42793:13;:45::i;:::-;42762:76;;42847:143;42876:22;42907:20;42936:6;42951:32;42847:20;:143::i;:::-;43104:15;;-1:-1:-1;;;;;43104:15:0;43130:34;;43126:100;;43175:43;;-1:-1:-1;;;43175:43:0;;-1:-1:-1;;;;;43175:25:0;;;;;:43;;43201:4;;43207:2;;43211:6;;43175:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43126:100;42271:960;;;;;;;;:::o;33107:1445::-;33263:2;-1:-1:-1;;;;;33255:10:0;:4;-1:-1:-1;;;;;33255:10:0;;33251:39;;;33276:7;;33251:39;33307:66;33382:51;33446:40;33471:14;33446:24;:40::i;:::-;-1:-1:-1;33298:188:0;;-1:-1:-1;33298:188:0;-1:-1:-1;;;;;;33499:18:0;;;33495:533;;-1:-1:-1;;;;;33586:21:0;;33528:16;33586:21;;;;;;;;;;;33622:23;;33618:159;;-1:-1:-1;;;;;33669:15:0;;;;;;;;;;;;;;-1:-1:-1;;33685:22:0;;33669:39;;;;;;;:45;-1:-1:-1;;;33669:45:0;;-1:-1:-1;;;;;33669:45:0;;-1:-1:-1;33618:159:0;;;33752:15;33762:4;33752:9;:15::i;:::-;33741:26;;33618:159;33787:152;33812:9;33832:15;33858:4;33881:8;33909:20;33881:8;33922:6;33909:12;:20::i;:::-;33787:14;:152::i;:::-;-1:-1:-1;;;;;33955:65:0;;;33983:20;:8;33996:6;33983:12;:20::i;:::-;34005:14;33955:65;;;;;;;:::i;:::-;;;;;;;;33495:533;;;-1:-1:-1;;;;;34038:16:0;;;34034:513;;-1:-1:-1;;;;;34121:19:0;;34065:16;34121:19;;;;;;;;;;;34153:21;;34149:151;;-1:-1:-1;;;;;34198:13:0;;;;;;;;;;;;;;-1:-1:-1;;34212:20:0;;34198:35;;;;;;;:41;-1:-1:-1;;;34198:41:0;;-1:-1:-1;;;;;34198:41:0;;-1:-1:-1;34149:151:0;;;34277:13;34287:2;34277:9;:13::i;:::-;34266:24;;34149:151;34310:150;34335:9;34355:15;34381:2;34402:8;34430:20;34402:8;34443:6;34430:12;:20::i;34310:150::-;-1:-1:-1;;;;;34476:63:0;;;34502:20;:8;34515:6;34502:12;:20::i;:::-;34524:14;34476:63;;;;;;;:::i;:::-;;;;;;;;34034:513;;;33107:1445;;;;;;;:::o;7408:130::-;7466:7;7489:43;7493:1;7496;7489:43;;;;;;;;;;;;;;;;;:3;:43::i;37182:835::-;-1:-1:-1;;;;;37507:22:0;;37424:20;37507:22;;;;;;;;;;;;37590:16;;;;;;;37455:12;;37507:22;37679:24;;;;;:102;;-1:-1:-1;;;37729:23:0;;37714:39;;;;;;;;;;;:51;-1:-1:-1;;;;;37714:67:0;;;:51;;:67;37679:102;37667:345;;;-1:-1:-1;;37813:23:0;;37798:39;;;;;;;;;;;:56;;-1:-1:-1;;;;;37798:56:0;;;-1:-1:-1;;;37798:56:0;;;;;;37667:345;;;37915:32;;;;;;;;-1:-1:-1;;;;;37915:32:0;;;;;;;;;;;;;;;-1:-1:-1;37877:35:0;;;;;;;;;:70;;;;;;;;-1:-1:-1;;;37877:70:0;;;;-1:-1:-1;;37877:70:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37956:22:0;;;;;;;;;37877:70;37981:23;;37956:48;;37182:835;;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;14:175:1:-;84:20;;-1:-1:-1;;;;;133:31:1;;123:42;;113:2;;179:1;176;169:12;194:158;277:20;;326:1;316:12;;306:2;;342:1;339;332:12;357:158;425:20;;485:4;474:16;;464:27;;454:2;;505:1;502;495:12;520:198;;632:2;620:9;611:7;607:23;603:32;600:2;;;653:6;645;638:22;600:2;681:31;702:9;681:31;:::i;723:274::-;;;852:2;840:9;831:7;827:23;823:32;820:2;;;873:6;865;858:22;820:2;901:31;922:9;901:31;:::i;:::-;891:41;;951:40;987:2;976:9;972:18;951:40;:::i;:::-;941:50;;810:187;;;;;:::o;1002:342::-;;;;1148:2;1136:9;1127:7;1123:23;1119:32;1116:2;;;1169:6;1161;1154:22;1116:2;1197:31;1218:9;1197:31;:::i;:::-;1187:41;;1247:40;1283:2;1272:9;1268:18;1247:40;:::i;:::-;1237:50;;1334:2;1323:9;1319:18;1306:32;1296:42;;1106:238;;;;;:::o;1349:622::-;;;;;;;;1561:3;1549:9;1540:7;1536:23;1532:33;1529:2;;;1583:6;1575;1568:22;1529:2;1611:31;1632:9;1611:31;:::i;:::-;1601:41;;1661:40;1697:2;1686:9;1682:18;1661:40;:::i;:::-;1651:50;;1748:2;1737:9;1733:18;1720:32;1710:42;;1799:2;1788:9;1784:18;1771:32;1761:42;;1822:39;1856:3;1845:9;1841:19;1822:39;:::i;:::-;1812:49;;1908:3;1897:9;1893:19;1880:33;1870:43;;1960:3;1949:9;1945:19;1932:33;1922:43;;1519:452;;;;;;;;;;:::o;1976:303::-;;;2121:2;2109:9;2100:7;2096:23;2092:32;2089:2;;;2142:6;2134;2127:22;2089:2;2170:31;2191:9;2170:31;:::i;:::-;2160:41;;2220:53;2269:2;2258:9;2254:18;2220:53;:::i;2284:651::-;;;;;;;;2512:3;2500:9;2491:7;2487:23;2483:33;2480:2;;;2534:6;2526;2519:22;2480:2;2562:31;2583:9;2562:31;:::i;:::-;2552:41;;2612:53;2661:2;2650:9;2646:18;2612:53;:::i;2940:266::-;;;3069:2;3057:9;3048:7;3044:23;3040:32;3037:2;;;3090:6;3082;3075:22;3037:2;3118:31;3139:9;3118:31;:::i;:::-;3108:41;3196:2;3181:18;;;;3168:32;;-1:-1:-1;;;3027:179:1:o;3211:371::-;;;;3373:2;3361:9;3352:7;3348:23;3344:32;3341:2;;;3394:6;3386;3379:22;3341:2;3422:31;3443:9;3422:31;:::i;:::-;3412:41;;3500:2;3489:9;3485:18;3472:32;3462:42;;3523:53;3572:2;3561:9;3557:18;3523:53;:::i;:::-;3513:63;;3331:251;;;;;:::o;3587:545::-;;;;;;;3782:3;3770:9;3761:7;3757:23;3753:33;3750:2;;;3804:6;3796;3789:22;3750:2;3832:31;3853:9;3832:31;:::i;:::-;3822:41;;3910:2;3899:9;3895:18;3882:32;3872:42;;3961:2;3950:9;3946:18;3933:32;3923:42;;3984:38;4018:2;4007:9;4003:18;3984:38;:::i;:::-;3974:48;;4069:3;4058:9;4054:19;4041:33;4031:43;;4121:3;4110:9;4106:19;4093:33;4083:43;;3740:392;;;;;;;;:::o;4137:190::-;;4249:2;4237:9;4228:7;4224:23;4220:32;4217:2;;;4270:6;4262;4255:22;4217:2;-1:-1:-1;4298:23:1;;4207:120;-1:-1:-1;4207:120:1:o;4332:477::-;;4413:5;4407:12;4440:6;4435:3;4428:19;4465:3;4477:162;4491:6;4488:1;4485:13;4477:162;;;4553:4;4609:13;;;4605:22;;4599:29;4581:11;;;4577:20;;4570:59;4506:12;4477:162;;;4657:6;4654:1;4651:13;4648:2;;;4723:3;4716:4;4707:6;4702:3;4698:16;4694:27;4687:40;4648:2;-1:-1:-1;4791:2:1;4770:15;-1:-1:-1;;4766:29:1;4757:39;;;;4798:4;4753:50;;4383:426;-1:-1:-1;;4383:426:1:o;4814:139::-;4903:1;4896:5;4893:12;4883:2;;4909:9;4883:2;4929:18;;4873:80::o;4958:392::-;-1:-1:-1;;;5216:27:1;;5268:1;5259:11;;5252:27;;;;5304:2;5295:12;;5288:28;5341:2;5332:12;;5206:144::o;5355:203::-;-1:-1:-1;;;;;5519:32:1;;;;5501:51;;5489:2;5474:18;;5456:102::o;5563:375::-;-1:-1:-1;;;;;5821:15:1;;;5803:34;;5873:15;;;;5868:2;5853:18;;5846:43;5920:2;5905:18;;5898:34;;;;5753:2;5738:18;;5720:218::o;5943:187::-;6108:14;;6101:22;6083:41;;6071:2;6056:18;;6038:92::o;6135:177::-;6281:25;;;6269:2;6254:18;;6236:76::o;6317:591::-;6604:25;;;-1:-1:-1;;;;;6703:15:1;;;6698:2;6683:18;;6676:43;6755:15;;;;6750:2;6735:18;;6728:43;6802:2;6787:18;;6780:34;6845:3;6830:19;;6823:35;;;;6656:3;6874:19;;6867:35;6591:3;6576:19;;6558:350::o;6913:417::-;7144:25;;;-1:-1:-1;;;;;7205:32:1;;;;7200:2;7185:18;;7178:60;7269:2;7254:18;;7247:34;7312:2;7297:18;;7290:34;7131:3;7116:19;;7098:232::o;7335:489::-;7594:25;;;-1:-1:-1;;;;;7655:32:1;;;;7650:2;7635:18;;7628:60;7719:2;7704:18;;7697:34;;;;7762:2;7747:18;;7740:34;7805:3;7790:19;;7783:35;7581:3;7566:19;;7548:276::o;7829:398::-;8056:25;;;8129:4;8117:17;;;;8112:2;8097:18;;8090:45;8166:2;8151:18;;8144:34;8209:2;8194:18;;8187:34;8043:3;8028:19;;8010:217::o;8232:219::-;;8379:2;8368:9;8361:21;8399:46;8441:2;8430:9;8426:18;8418:6;8399:46;:::i;8685:218::-;8833:2;8818:18;;8845:52;8822:9;8879:6;8845:52;:::i;9134:399::-;9336:2;9318:21;;;9375:2;9355:18;;;9348:30;9414:34;9409:2;9394:18;;9387:62;-1:-1:-1;;;9480:2:1;9465:18;;9458:33;9523:3;9508:19;;9308:225::o;9538:398::-;9740:2;9722:21;;;9779:2;9759:18;;;9752:30;9818:34;9813:2;9798:18;;9791:62;-1:-1:-1;;;9884:2:1;9869:18;;9862:32;9926:3;9911:19;;9712:224::o;9941:351::-;10143:2;10125:21;;;10182:2;10162:18;;;10155:30;10221:29;10216:2;10201:18;;10194:57;10283:2;10268:18;;10115:177::o;10297:341::-;10499:2;10481:21;;;10538:2;10518:18;;;10511:30;-1:-1:-1;;;10572:2:1;10557:18;;10550:47;10629:2;10614:18;;10471:167::o;10643:410::-;10845:2;10827:21;;;10884:2;10864:18;;;10857:30;10923:34;10918:2;10903:18;;10896:62;-1:-1:-1;;;10989:2:1;10974:18;;10967:44;11043:3;11028:19;;10817:236::o;11058:342::-;11260:2;11242:21;;;11299:2;11279:18;;;11272:30;-1:-1:-1;;;11333:2:1;11318:18;;11311:48;11391:2;11376:18;;11232:168::o;11405:337::-;11607:2;11589:21;;;11646:2;11626:18;;;11619:30;-1:-1:-1;;;11680:2:1;11665:18;;11658:43;11733:2;11718:18;;11579:163::o;11747:337::-;11949:2;11931:21;;;11988:2;11968:18;;;11961:30;-1:-1:-1;;;12022:2:1;12007:18;;12000:43;12075:2;12060:18;;11921:163::o;12089:401::-;12291:2;12273:21;;;12330:2;12310:18;;;12303:30;12369:34;12364:2;12349:18;;12342:62;-1:-1:-1;;;12435:2:1;12420:18;;12413:35;12480:3;12465:19;;12263:227::o;12495:400::-;12697:2;12679:21;;;12736:2;12716:18;;;12709:30;12775:34;12770:2;12755:18;;12748:62;-1:-1:-1;;;12841:2:1;12826:18;;12819:34;12885:3;12870:19;;12669:226::o;12900:344::-;13102:2;13084:21;;;13141:2;13121:18;;;13114:30;-1:-1:-1;;;13175:2:1;13160:18;;13153:50;13235:2;13220:18;;13074:170::o;13249:341::-;13451:2;13433:21;;;13490:2;13470:18;;;13463:30;-1:-1:-1;;;13524:2:1;13509:18;;13502:47;13581:2;13566:18;;13423:167::o;13595:319::-;-1:-1:-1;;;;;13840:15:1;;;13822:34;;13892:15;;13887:2;13872:18;;13865:43;13757:2;13742:18;;13724:190::o;14101:289::-;14289:25;;;14277:2;14262:18;;14323:61;14380:2;14365:18;;14357:6;14323:61;:::i;14395:184::-;14567:4;14555:17;;;;14537:36;;14525:2;14510:18;;14492:87::o
Swarm Source
ipfs://46f7baae87c03ea00503a474d3a010f9f2d5439071189052edccd2db1168edb1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.