Latest 25 from a total of 11,991 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 60190935 | 10 days ago | IN | 0 AVAX | 0.00007333 | ||||
Approve | 59885757 | 15 days ago | IN | 0 AVAX | 0.00006652 | ||||
Approve | 59626066 | 20 days ago | IN | 0 AVAX | 0.00003378 | ||||
Approve | 59626050 | 20 days ago | IN | 0 AVAX | 0.00006174 | ||||
Approve | 59491903 | 23 days ago | IN | 0 AVAX | 0.00007281 | ||||
Approve | 59491779 | 23 days ago | IN | 0 AVAX | 0.00011724 | ||||
Approve | 58272551 | 48 days ago | IN | 0 AVAX | 0.00007281 | ||||
Approve | 58272543 | 48 days ago | IN | 0 AVAX | 0.00007368 | ||||
Approve | 58248097 | 49 days ago | IN | 0 AVAX | 0.00004805 | ||||
Approve | 58248089 | 49 days ago | IN | 0 AVAX | 0.0000731 | ||||
Approve | 58103010 | 52 days ago | IN | 0 AVAX | 0.00013983 | ||||
Transfer | 58093803 | 52 days ago | IN | 0 AVAX | 0.00028676 | ||||
Approve | 57739748 | 59 days ago | IN | 0 AVAX | 0.00006991 | ||||
Approve | 57464490 | 64 days ago | IN | 0 AVAX | 0.00006996 | ||||
Approve | 57431289 | 65 days ago | IN | 0 AVAX | 0.00007281 | ||||
Approve | 57256474 | 69 days ago | IN | 0 AVAX | 0.00002941 | ||||
Approve | 57256471 | 69 days ago | IN | 0 AVAX | 0.00003495 | ||||
Approve | 57256461 | 69 days ago | IN | 0 AVAX | 0.00003495 | ||||
Approve | 57256458 | 69 days ago | IN | 0 AVAX | 0.00003231 | ||||
Approve | 57256453 | 69 days ago | IN | 0 AVAX | 0.0000364 | ||||
Transfer | 57231834 | 69 days ago | IN | 0 AVAX | 0.00009117 | ||||
Approve | 57171761 | 70 days ago | IN | 0 AVAX | 0.00023161 | ||||
Approve | 57132790 | 71 days ago | IN | 0 AVAX | 0.00003669 | ||||
Transfer | 56591709 | 82 days ago | IN | 0 AVAX | 0.00014038 | ||||
Transfer | 56591673 | 82 days ago | IN | 0 AVAX | 0.00012643 |
Loading...
Loading
Contract Name:
BOOFI
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at snowscan.xyz on 2021-11-04 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.6; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Collection of functions related to the address type */ 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) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @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 */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @title SafeERC20 * @dev 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 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)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' 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 safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } /** * @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 Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(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: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be 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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () { _owner = msg.sender; emit OwnershipTransferred(address(0), msg.sender); } function owner() public view virtual returns (address) { return _owner; } modifier onlyOwner() { require(owner() == msg.sender, "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract ERC20WithVoting is ERC20 { constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_) { DOMAIN_SEPARATOR = getDomainSeparator(); } /// @notice A record of each accounts delegate mapping (address => address) internal _delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @notice A record of votes checkpoints for each account, by index mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping (address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); /// @notice EIP-712 Domain separator bytes32 public immutable DOMAIN_SEPARATOR; /// @notice A record of states for signing / validating signatures mapping (address => uint) public nonces; /// @notice An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); function getDelegationDigest(address delegatee, uint nonce, uint expiry) public view returns(bytes32) { bytes32 structHash = keccak256( abi.encode( DELEGATION_TYPEHASH, delegatee, nonce, expiry ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, structHash ) ); return digest; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegator The address to get delegatee for */ function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes 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, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 structHash = keccak256( abi.encode( DELEGATION_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), "ERC20WithVoting::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "ERC20WithVoting::delegateBySig: invalid nonce"); require(block.timestamp <= expiry, "ERC20WithVoting::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint blockNumber) external view returns (uint256) { require(blockNumber < block.number, "ERC20WithVoting::getPriorVotes: not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); // balance of underlying token (not scaled); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = (srcRepOld - amount); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = (dstRepOld + amount); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint32 blockNumber = safe32(block.number, "ERC20WithVoting::_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } /** * @notice EIP-712 Domain separator * @return Separator */ function getDomainSeparator() internal view returns (bytes32) { return keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), _getChainId(), address(this) ) ); } function _getChainId() internal view returns (uint256) { return block.chainid; } function _mint(address account, uint256 amount) internal override { super._mint(account, amount); _moveDelegates(address(0), _delegates[account], amount); } function _burn(address account, uint256 amount) internal override { super._burn(account, amount); _moveDelegates(_delegates[account], address(0), amount); } function _transfer(address sender, address recipient, uint256 amount) internal virtual override { super._transfer(sender, recipient, amount); _moveDelegates(_delegates[sender], _delegates[recipient], amount); } } contract ERC20WithVotingAndPermit is ERC20WithVoting { bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; mapping(address => uint) public permitNonces; constructor(string memory name_, string memory symbol_) ERC20WithVoting(name_, symbol_) { } function getPermitDigest(address owner, address spender, uint256 nonce, uint256 value, uint256 deadline) public view returns(bytes32) { bytes32 encodeData = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonce, deadline)); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, encodeData ) ); return digest; } /** * @notice Triggers an approval from owner to spender * @param owner The address to approve from * @param spender The address to be approved * @param value The number of tokens that are approved (2^256-1 means infinite) * @param deadline 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 permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external { require(deadline >= block.timestamp, "permit::expired"); bytes32 encodeData = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, permitNonces[owner]++, deadline)); _validateSignedData(owner, encodeData, v, r, s); _approve(owner, spender, value); } /** * @notice Recovers address from signed data and validates the signature * @param signer Address that signed the data * @param encodeData Data signed by the address * @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 _validateSignedData(address signer, bytes32 encodeData, uint8 v, bytes32 r, bytes32 s) internal view { bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, encodeData ) ); address recoveredAddress = ecrecover(digest, v, r, s); // Explicitly disallow authorizations for address(0) as ecrecover returns address(0) on malformed messages require(recoveredAddress != address(0) && recoveredAddress == signer, "Arch::validateSig: invalid signature"); } } contract BOOFI is ERC20WithVotingAndPermit("Boo Finance Token", "BOOFI"), Ownable { uint256 public constant YEAR_ONE_CAP = 10e24; //10 million tokens uint256 public immutable END_OF_YEAR_ONE; constructor() { END_OF_YEAR_ONE = block.timestamp + 365 days; } function mint(address account, uint256 amount) external onlyOwner { if(block.timestamp < END_OF_YEAR_ONE) { require((totalSupply() + amount) <= YEAR_ONE_CAP, "mint would exceed cap."); } _mint(account, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"DELEGATION_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":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"END_OF_YEAR_ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YEAR_ONE_CAP","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":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","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":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"}],"name":"getDelegationDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"getPermitDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address","name":"","type":"address"}],"name":"permitNonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b50604051806040016040528060118152602001702137b7902334b730b731b2902a37b5b2b760791b81525060405180604001604052806005815260200164424f4f464960d81b8152508181818181600390805190602001906200007692919062000207565b5080516200008c90600490602084019062000207565b506200009a915050620000fc565b6080525050600a80546001600160a01b03191633908117909155604051909250600091507f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3620000f3426301e13380620002ad565b60a05262000311565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866620001296200016d565b805160209091012046604080516020810194909452830191909152606082015230608082015260a00160405160208183030381529060405280519060200120905090565b6060600380546200017e90620002d4565b80601f0160208091040260200160405190810160405280929190818152602001828054620001ac90620002d4565b8015620001fd5780601f10620001d157610100808354040283529160200191620001fd565b820191906000526020600020905b815481529060010190602001808311620001df57829003601f168201915b5050505050905090565b8280546200021590620002d4565b90600052602060002090601f01602090048101928262000239576000855562000284565b82601f106200025457805160ff191683800117855562000284565b8280016001018555821562000284579182015b828111156200028457825182559160200191906001019062000267565b506200029292915062000296565b5090565b5b8082111562000292576000815560010162000297565b60008219821115620002cf57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620002e957607f821691505b602082108114156200030b57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05161203d6200035a600039600081816104ca015261086a0152600081816102fb0152818161079e01528181610d2701528181610e5a0152611496015261203d6000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063715018a61161011a578063b4b5ea57116100ad578063d505accf1161007c578063d505accf146104ec578063dd62ed3e146104ff578063e7a324dc14610538578063f1127ed81461055f578063f2fde38b146105b657600080fd5b8063b4b5ea571461048d578063b57862d9146104a0578063c3cda520146104b2578063c6857ebd146104c557600080fd5b806395d89b41116100e957806395d89b411461044c578063a457c2d714610454578063a9059cbb14610467578063ac9ebbd01461047a57600080fd5b8063715018a614610400578063782d6fe1146104085780637ecebe001461041b5780638da5cb5b1461043b57600080fd5b8063313ce56711610192578063587cde1e11610161578063587cde1e146103455780635c19a95c146103895780636fcfff451461039c57806370a08231146103d757600080fd5b8063313ce567146102e75780633644e515146102f6578063395093511461031d57806340c10f191461033057600080fd5b806320606b70116101ce57806320606b701461027357806323b872dd1461029a5780632c19e8b5146102ad57806330adf81f146102c057600080fd5b806306fdde0314610200578063095ea7b31461021e57806318160ddd14610241578063191d0ffc14610253575b600080fd5b6102086105c9565b6040516102159190611e25565b60405180910390f35b61023161022c366004611d15565b61065b565b6040519015158152602001610215565b6002545b604051908152602001610215565b610245610261366004611bd4565b60096020526000908152604090205481565b6102457f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6102316102a8366004611c22565b610672565b6102456102bb366004611c5e565b610721565b6102457f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160128152602001610215565b6102457f000000000000000000000000000000000000000000000000000000000000000081565b61023161032b366004611d15565b6107f3565b61034361033e366004611d15565b61082f565b005b610371610353366004611bd4565b6001600160a01b039081166000908152600560205260409020541690565b6040516001600160a01b039091168152602001610215565b610343610397366004611bd4565b610905565b6103c26103aa366004611bd4565b60076020526000908152604090205463ffffffff1681565b60405163ffffffff9091168152602001610215565b6102456103e5366004611bd4565b6001600160a01b031660009081526020819052604090205490565b610343610912565b610245610416366004611d15565b610995565b610245610429366004611bd4565b60086020526000908152604090205481565b600a546001600160a01b0316610371565b610208610c05565b610231610462366004611d15565b610c14565b610231610475366004611d15565b610cad565b610245610488366004611d3f565b610cba565b61024561049b366004611bd4565b610d7a565b6102456a084595161401484a00000081565b6103436104c0366004611d72565b610def565b6102457f000000000000000000000000000000000000000000000000000000000000000081565b6103436104fa366004611cab565b61107f565b61024561050d366004611bef565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102457fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b61059a61056d366004611dca565b60066020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6040805163ffffffff9093168352602083019190915201610215565b6103436105c4366004611bd4565b611184565b6060600380546105d890611f5c565b80601f016020809104026020016040519081016040528092919081815260200182805461060490611f5c565b80156106515780601f1061062657610100808354040283529160200191610651565b820191906000526020600020905b81548152906001019060200180831161063457829003601f168201915b5050505050905090565b600061066833848461127e565b5060015b92915050565b600061067f8484846113a2565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156107095760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b610716853385840361127e565b506001949350505050565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960208201526001600160a01b038088169282019290925290851660608201526080810183905260a0810184905260c08101829052600090819060e00160405160208183030381529060405280519060200120905060007f0000000000000000000000000000000000000000000000000000000000000000826040516020016107cf929190611e0a565b60408051808303601f19018152919052805160209091012098975050505050505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161066891859061082a908690611eaf565b61127e565b33610842600a546001600160a01b031690565b6001600160a01b0316146108685760405162461bcd60e51b815260040161070090611e7a565b7f00000000000000000000000000000000000000000000000000000000000000004210156108f7576a084595161401484a000000816108a660025490565b6108b09190611eaf565b11156108f75760405162461bcd60e51b815260206004820152601660248201527536b4b73a103bb7bab6321032bc31b2b2b21031b0b81760511b6044820152606401610700565b61090182826113e4565b5050565b61090f3382611413565b50565b33610925600a546001600160a01b031690565b6001600160a01b03161461094b5760405162461bcd60e51b815260040161070090611e7a565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b6000438210610a015760405162461bcd60e51b815260206004820152603260248201527f455243323057697468566f74696e673a3a6765745072696f72566f7465733a206044820152711b9bdd081e595d0819195d195c9b5a5b995960721b6064820152608401610700565b6001600160a01b03831660009081526007602052604090205463ffffffff1680610a2f57600091505061066c565b6001600160a01b03841660009081526006602052604081208491610a54600185611f37565b63ffffffff90811682526020820192909252604001600020541611610abd576001600160a01b038416600090815260066020526040812090610a97600184611f37565b63ffffffff1663ffffffff1681526020019081526020016000206001015491505061066c565b6001600160a01b038416600090815260066020908152604080832083805290915290205463ffffffff16831015610af857600091505061066c565b600080610b06600184611f37565b90505b8163ffffffff168163ffffffff161115610bce5760006002610b2b8484611f37565b610b359190611eef565b610b3f9083611f37565b6001600160a01b038816600090815260066020908152604080832063ffffffff8086168552908352928190208151808301909252805490931680825260019093015491810191909152919250871415610ba25760200151945061066c9350505050565b805163ffffffff16871115610bb957819350610bc7565b610bc4600183611f37565b92505b5050610b09565b506001600160a01b038516600090815260066020908152604080832063ffffffff9094168352929052206001015491505092915050565b6060600480546105d890611f5c565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610c965760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610700565b610ca3338585840361127e565b5060019392505050565b60006106683384846113a2565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038516918101919091526060810183905260808101829052600090819060a00160405160208183030381529060405280519060200120905060007f000000000000000000000000000000000000000000000000000000000000000082604051602001610d58929190611e0a565b60408051808303601f1901815291905280516020909101209695505050505050565b6001600160a01b03811660009081526007602052604081205463ffffffff1680610da5576000610de8565b6001600160a01b038316600090815260066020526040812090610dc9600184611f37565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b03881691810191909152606081018690526080810185905260009060a00160405160208183030381529060405280519060200120905060007f000000000000000000000000000000000000000000000000000000000000000082604051602001610e8b929190611e0a565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610ef6573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610f735760405162461bcd60e51b815260206004820152603160248201527f455243323057697468566f74696e673a3a64656c656761746542795369673a20604482015270696e76616c6964207369676e617475726560781b6064820152608401610700565b6001600160a01b0381166000908152600860205260408120805491610f9783611f97565b919050558814610fff5760405162461bcd60e51b815260206004820152602d60248201527f455243323057697468566f74696e673a3a64656c656761746542795369673a2060448201526c696e76616c6964206e6f6e636560981b6064820152608401610700565b864211156110695760405162461bcd60e51b815260206004820152603160248201527f455243323057697468566f74696e673a3a64656c656761746542795369673a206044820152701cda59db985d1d5c9948195e1c1a5c9959607a1b6064820152608401610700565b611073818a611413565b5050505b505050505050565b428410156110c15760405162461bcd60e51b815260206004820152600f60248201526e1c195c9b5a5d0e8e995e1c1a5c9959608a1b6044820152606401610700565b6001600160a01b038716600090815260096020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661110e83611f97565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905061116f8882868686611492565b61117a88888861127e565b5050505050505050565b33611197600a546001600160a01b031690565b6001600160a01b0316146111bd5760405162461bcd60e51b815260040161070090611e7a565b6001600160a01b0381166112225760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610700565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166112e05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610700565b6001600160a01b0382166113415760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610700565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6113ad8383836115c9565b6001600160a01b038084166000908152600560205260408082205485841683529120546113df92918216911683611797565b505050565b6113ee82826118f6565b6001600160a01b03808316600090815260056020526040812054610901921683611797565b6001600160a01b038281166000818152600560208181526040808420805485845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461148c828483611797565b50505050565b60007f0000000000000000000000000000000000000000000000000000000000000000856040516020016114c7929190611e0a565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611532573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906115685750866001600160a01b0316816001600160a01b0316145b6115c05760405162461bcd60e51b8152602060048201526024808201527f417263683a3a76616c69646174655369673a20696e76616c6964207369676e616044820152637475726560e01b6064820152608401610700565b50505050505050565b6001600160a01b03831661162d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610700565b6001600160a01b03821661168f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610700565b6001600160a01b038316600090815260208190526040902054818110156117075760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610700565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061173e908490611eaf565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161178a91815260200190565b60405180910390a361148c565b816001600160a01b0316836001600160a01b0316141580156117b95750600081115b156113df576001600160a01b0383161561185c576001600160a01b03831660009081526007602052604081205463ffffffff1690816117f957600061183c565b6001600160a01b03851660009081526006602052604081209061181d600185611f37565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9050600061184a8483611f20565b9050611858868484846119d5565b5050505b6001600160a01b038216156113df576001600160a01b03821660009081526007602052604081205463ffffffff1690816118975760006118da565b6001600160a01b0384166000908152600660205260408120906118bb600185611f37565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006118e88483611eaf565b9050611077858484846119d5565b6001600160a01b03821661194c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610700565b806002600082825461195e9190611eaf565b90915550506001600160a01b0382166000908152602081905260408120805483929061198b908490611eaf565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60006119f9436040518060600160405280603f8152602001611fc9603f9139611b77565b905060008463ffffffff16118015611a5357506001600160a01b038516600090815260066020526040812063ffffffff831691611a37600188611f37565b63ffffffff908116825260208201929092526040016000205416145b15611a9c576001600160a01b03851660009081526006602052604081208391611a7d600188611f37565b63ffffffff168152602081019190915260400160002060010155611b2c565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152600683528581208a851682529092529390209151825463ffffffff191691161781559051600191820155611afb908590611ec7565b6001600160a01b0386166000908152600760205260409020805463ffffffff191663ffffffff929092169190911790555b60408051848152602081018490526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b6000816401000000008410611b9f5760405162461bcd60e51b81526004016107009190611e25565b509192915050565b80356001600160a01b0381168114611bbe57600080fd5b919050565b803560ff81168114611bbe57600080fd5b600060208284031215611be657600080fd5b610de882611ba7565b60008060408385031215611c0257600080fd5b611c0b83611ba7565b9150611c1960208401611ba7565b90509250929050565b600080600060608486031215611c3757600080fd5b611c4084611ba7565b9250611c4e60208501611ba7565b9150604084013590509250925092565b600080600080600060a08688031215611c7657600080fd5b611c7f86611ba7565b9450611c8d60208701611ba7565b94979496505050506040830135926060810135926080909101359150565b600080600080600080600060e0888a031215611cc657600080fd5b611ccf88611ba7565b9650611cdd60208901611ba7565b95506040880135945060608801359350611cf960808901611bc3565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215611d2857600080fd5b611d3183611ba7565b946020939093013593505050565b600080600060608486031215611d5457600080fd5b611d5d84611ba7565b95602085013595506040909401359392505050565b60008060008060008060c08789031215611d8b57600080fd5b611d9487611ba7565b95506020870135945060408701359350611db060608801611bc3565b92506080870135915060a087013590509295509295509295565b60008060408385031215611ddd57600080fd5b611de683611ba7565b9150602083013563ffffffff81168114611dff57600080fd5b809150509250929050565b61190160f01b81526002810192909252602282015260420190565b600060208083528351808285015260005b81811015611e5257858101830151858201604001528201611e36565b81811115611e64576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611ec257611ec2611fb2565b500190565b600063ffffffff808316818516808303821115611ee657611ee6611fb2565b01949350505050565b600063ffffffff80841680611f1457634e487b7160e01b600052601260045260246000fd5b92169190910492915050565b600082821015611f3257611f32611fb2565b500390565b600063ffffffff83811690831681811015611f5457611f54611fb2565b039392505050565b600181811c90821680611f7057607f821691505b60208210811415611f9157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611fab57611fab611fb2565b5060010190565b634e487b7160e01b600052601160045260246000fdfe455243323057697468566f74696e673a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a2646970667358221220ee4ca8142bfac243e133bab2cfefb28b9e89286b4a20189a5d62d444956f16ac64736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063715018a61161011a578063b4b5ea57116100ad578063d505accf1161007c578063d505accf146104ec578063dd62ed3e146104ff578063e7a324dc14610538578063f1127ed81461055f578063f2fde38b146105b657600080fd5b8063b4b5ea571461048d578063b57862d9146104a0578063c3cda520146104b2578063c6857ebd146104c557600080fd5b806395d89b41116100e957806395d89b411461044c578063a457c2d714610454578063a9059cbb14610467578063ac9ebbd01461047a57600080fd5b8063715018a614610400578063782d6fe1146104085780637ecebe001461041b5780638da5cb5b1461043b57600080fd5b8063313ce56711610192578063587cde1e11610161578063587cde1e146103455780635c19a95c146103895780636fcfff451461039c57806370a08231146103d757600080fd5b8063313ce567146102e75780633644e515146102f6578063395093511461031d57806340c10f191461033057600080fd5b806320606b70116101ce57806320606b701461027357806323b872dd1461029a5780632c19e8b5146102ad57806330adf81f146102c057600080fd5b806306fdde0314610200578063095ea7b31461021e57806318160ddd14610241578063191d0ffc14610253575b600080fd5b6102086105c9565b6040516102159190611e25565b60405180910390f35b61023161022c366004611d15565b61065b565b6040519015158152602001610215565b6002545b604051908152602001610215565b610245610261366004611bd4565b60096020526000908152604090205481565b6102457f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6102316102a8366004611c22565b610672565b6102456102bb366004611c5e565b610721565b6102457f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160128152602001610215565b6102457f27298ed754f4136551736880b04c4956d73f2bdbc3b9b8369b4e6537772034c181565b61023161032b366004611d15565b6107f3565b61034361033e366004611d15565b61082f565b005b610371610353366004611bd4565b6001600160a01b039081166000908152600560205260409020541690565b6040516001600160a01b039091168152602001610215565b610343610397366004611bd4565b610905565b6103c26103aa366004611bd4565b60076020526000908152604090205463ffffffff1681565b60405163ffffffff9091168152602001610215565b6102456103e5366004611bd4565b6001600160a01b031660009081526020819052604090205490565b610343610912565b610245610416366004611d15565b610995565b610245610429366004611bd4565b60086020526000908152604090205481565b600a546001600160a01b0316610371565b610208610c05565b610231610462366004611d15565b610c14565b610231610475366004611d15565b610cad565b610245610488366004611d3f565b610cba565b61024561049b366004611bd4565b610d7a565b6102456a084595161401484a00000081565b6103436104c0366004611d72565b610def565b6102457f00000000000000000000000000000000000000000000000000000000633645a781565b6103436104fa366004611cab565b61107f565b61024561050d366004611bef565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102457fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b61059a61056d366004611dca565b60066020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6040805163ffffffff9093168352602083019190915201610215565b6103436105c4366004611bd4565b611184565b6060600380546105d890611f5c565b80601f016020809104026020016040519081016040528092919081815260200182805461060490611f5c565b80156106515780601f1061062657610100808354040283529160200191610651565b820191906000526020600020905b81548152906001019060200180831161063457829003601f168201915b5050505050905090565b600061066833848461127e565b5060015b92915050565b600061067f8484846113a2565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156107095760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b610716853385840361127e565b506001949350505050565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960208201526001600160a01b038088169282019290925290851660608201526080810183905260a0810184905260c08101829052600090819060e00160405160208183030381529060405280519060200120905060007f27298ed754f4136551736880b04c4956d73f2bdbc3b9b8369b4e6537772034c1826040516020016107cf929190611e0a565b60408051808303601f19018152919052805160209091012098975050505050505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161066891859061082a908690611eaf565b61127e565b33610842600a546001600160a01b031690565b6001600160a01b0316146108685760405162461bcd60e51b815260040161070090611e7a565b7f00000000000000000000000000000000000000000000000000000000633645a74210156108f7576a084595161401484a000000816108a660025490565b6108b09190611eaf565b11156108f75760405162461bcd60e51b815260206004820152601660248201527536b4b73a103bb7bab6321032bc31b2b2b21031b0b81760511b6044820152606401610700565b61090182826113e4565b5050565b61090f3382611413565b50565b33610925600a546001600160a01b031690565b6001600160a01b03161461094b5760405162461bcd60e51b815260040161070090611e7a565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b6000438210610a015760405162461bcd60e51b815260206004820152603260248201527f455243323057697468566f74696e673a3a6765745072696f72566f7465733a206044820152711b9bdd081e595d0819195d195c9b5a5b995960721b6064820152608401610700565b6001600160a01b03831660009081526007602052604090205463ffffffff1680610a2f57600091505061066c565b6001600160a01b03841660009081526006602052604081208491610a54600185611f37565b63ffffffff90811682526020820192909252604001600020541611610abd576001600160a01b038416600090815260066020526040812090610a97600184611f37565b63ffffffff1663ffffffff1681526020019081526020016000206001015491505061066c565b6001600160a01b038416600090815260066020908152604080832083805290915290205463ffffffff16831015610af857600091505061066c565b600080610b06600184611f37565b90505b8163ffffffff168163ffffffff161115610bce5760006002610b2b8484611f37565b610b359190611eef565b610b3f9083611f37565b6001600160a01b038816600090815260066020908152604080832063ffffffff8086168552908352928190208151808301909252805490931680825260019093015491810191909152919250871415610ba25760200151945061066c9350505050565b805163ffffffff16871115610bb957819350610bc7565b610bc4600183611f37565b92505b5050610b09565b506001600160a01b038516600090815260066020908152604080832063ffffffff9094168352929052206001015491505092915050565b6060600480546105d890611f5c565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610c965760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610700565b610ca3338585840361127e565b5060019392505050565b60006106683384846113a2565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038516918101919091526060810183905260808101829052600090819060a00160405160208183030381529060405280519060200120905060007f27298ed754f4136551736880b04c4956d73f2bdbc3b9b8369b4e6537772034c182604051602001610d58929190611e0a565b60408051808303601f1901815291905280516020909101209695505050505050565b6001600160a01b03811660009081526007602052604081205463ffffffff1680610da5576000610de8565b6001600160a01b038316600090815260066020526040812090610dc9600184611f37565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b03881691810191909152606081018690526080810185905260009060a00160405160208183030381529060405280519060200120905060007f27298ed754f4136551736880b04c4956d73f2bdbc3b9b8369b4e6537772034c182604051602001610e8b929190611e0a565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610ef6573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610f735760405162461bcd60e51b815260206004820152603160248201527f455243323057697468566f74696e673a3a64656c656761746542795369673a20604482015270696e76616c6964207369676e617475726560781b6064820152608401610700565b6001600160a01b0381166000908152600860205260408120805491610f9783611f97565b919050558814610fff5760405162461bcd60e51b815260206004820152602d60248201527f455243323057697468566f74696e673a3a64656c656761746542795369673a2060448201526c696e76616c6964206e6f6e636560981b6064820152608401610700565b864211156110695760405162461bcd60e51b815260206004820152603160248201527f455243323057697468566f74696e673a3a64656c656761746542795369673a206044820152701cda59db985d1d5c9948195e1c1a5c9959607a1b6064820152608401610700565b611073818a611413565b5050505b505050505050565b428410156110c15760405162461bcd60e51b815260206004820152600f60248201526e1c195c9b5a5d0e8e995e1c1a5c9959608a1b6044820152606401610700565b6001600160a01b038716600090815260096020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661110e83611f97565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905061116f8882868686611492565b61117a88888861127e565b5050505050505050565b33611197600a546001600160a01b031690565b6001600160a01b0316146111bd5760405162461bcd60e51b815260040161070090611e7a565b6001600160a01b0381166112225760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610700565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166112e05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610700565b6001600160a01b0382166113415760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610700565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6113ad8383836115c9565b6001600160a01b038084166000908152600560205260408082205485841683529120546113df92918216911683611797565b505050565b6113ee82826118f6565b6001600160a01b03808316600090815260056020526040812054610901921683611797565b6001600160a01b038281166000818152600560208181526040808420805485845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461148c828483611797565b50505050565b60007f27298ed754f4136551736880b04c4956d73f2bdbc3b9b8369b4e6537772034c1856040516020016114c7929190611e0a565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611532573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906115685750866001600160a01b0316816001600160a01b0316145b6115c05760405162461bcd60e51b8152602060048201526024808201527f417263683a3a76616c69646174655369673a20696e76616c6964207369676e616044820152637475726560e01b6064820152608401610700565b50505050505050565b6001600160a01b03831661162d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610700565b6001600160a01b03821661168f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610700565b6001600160a01b038316600090815260208190526040902054818110156117075760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610700565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061173e908490611eaf565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161178a91815260200190565b60405180910390a361148c565b816001600160a01b0316836001600160a01b0316141580156117b95750600081115b156113df576001600160a01b0383161561185c576001600160a01b03831660009081526007602052604081205463ffffffff1690816117f957600061183c565b6001600160a01b03851660009081526006602052604081209061181d600185611f37565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9050600061184a8483611f20565b9050611858868484846119d5565b5050505b6001600160a01b038216156113df576001600160a01b03821660009081526007602052604081205463ffffffff1690816118975760006118da565b6001600160a01b0384166000908152600660205260408120906118bb600185611f37565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006118e88483611eaf565b9050611077858484846119d5565b6001600160a01b03821661194c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610700565b806002600082825461195e9190611eaf565b90915550506001600160a01b0382166000908152602081905260408120805483929061198b908490611eaf565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60006119f9436040518060600160405280603f8152602001611fc9603f9139611b77565b905060008463ffffffff16118015611a5357506001600160a01b038516600090815260066020526040812063ffffffff831691611a37600188611f37565b63ffffffff908116825260208201929092526040016000205416145b15611a9c576001600160a01b03851660009081526006602052604081208391611a7d600188611f37565b63ffffffff168152602081019190915260400160002060010155611b2c565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152600683528581208a851682529092529390209151825463ffffffff191691161781559051600191820155611afb908590611ec7565b6001600160a01b0386166000908152600760205260409020805463ffffffff191663ffffffff929092169190911790555b60408051848152602081018490526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b6000816401000000008410611b9f5760405162461bcd60e51b81526004016107009190611e25565b509192915050565b80356001600160a01b0381168114611bbe57600080fd5b919050565b803560ff81168114611bbe57600080fd5b600060208284031215611be657600080fd5b610de882611ba7565b60008060408385031215611c0257600080fd5b611c0b83611ba7565b9150611c1960208401611ba7565b90509250929050565b600080600060608486031215611c3757600080fd5b611c4084611ba7565b9250611c4e60208501611ba7565b9150604084013590509250925092565b600080600080600060a08688031215611c7657600080fd5b611c7f86611ba7565b9450611c8d60208701611ba7565b94979496505050506040830135926060810135926080909101359150565b600080600080600080600060e0888a031215611cc657600080fd5b611ccf88611ba7565b9650611cdd60208901611ba7565b95506040880135945060608801359350611cf960808901611bc3565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215611d2857600080fd5b611d3183611ba7565b946020939093013593505050565b600080600060608486031215611d5457600080fd5b611d5d84611ba7565b95602085013595506040909401359392505050565b60008060008060008060c08789031215611d8b57600080fd5b611d9487611ba7565b95506020870135945060408701359350611db060608801611bc3565b92506080870135915060a087013590509295509295509295565b60008060408385031215611ddd57600080fd5b611de683611ba7565b9150602083013563ffffffff81168114611dff57600080fd5b809150509250929050565b61190160f01b81526002810192909252602282015260420190565b600060208083528351808285015260005b81811015611e5257858101830151858201604001528201611e36565b81811115611e64576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611ec257611ec2611fb2565b500190565b600063ffffffff808316818516808303821115611ee657611ee6611fb2565b01949350505050565b600063ffffffff80841680611f1457634e487b7160e01b600052601260045260246000fd5b92169190910492915050565b600082821015611f3257611f32611fb2565b500390565b600063ffffffff83811690831681811015611f5457611f54611fb2565b039392505050565b600181811c90821680611f7057607f821691505b60208210811415611f9157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611fab57611fab611fb2565b5060010190565b634e487b7160e01b600052601160045260246000fdfe455243323057697468566f74696e673a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a2646970667358221220ee4ca8142bfac243e133bab2cfefb28b9e89286b4a20189a5d62d444956f16ac64736f6c63430008070033
Deployed Bytecode Sourcemap
39018:550:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15695:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17862:169;;;;;;:::i;:::-;;:::i;:::-;;;4471:14:1;;4464:22;4446:41;;4434:2;4419:18;17862:169:0;4306:187:1;16815:108:0;16903:12;;16815:108;;;4644:25:1;;;4632:2;4617:18;16815:108:0;4498:177:1;36499:44:0;;;;;;:::i;:::-;;;;;;;;;;;;;;27348:122;;27390:80;27348:122;;18513:492;;;;;;:::i;:::-;;:::i;36671:463::-;;;;;;:::i;:::-;;:::i;36382:108::-;;36424:66;36382:108;;16657:93;;;16740:2;14482:36:1;;14470:2;14455:18;16657:93:0;14340:184:1;27732:41:0;;;;;19414:215;;;;;;:::i;:::-;;:::i;39308:257::-;;;;;;:::i;:::-;;:::i;:::-;;28959:149;;;;;;:::i;:::-;-1:-1:-1;;;;;29079:21:0;;;29047:7;29079:21;;;:10;:21;;;;;;;;28959:149;;;;-1:-1:-1;;;;;4262:32:1;;;4244:51;;4232:2;4217:18;28959:149:0;4098:203:1;29251:104:0;;;;;;:::i;:::-;;:::i;27226:49::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14049:10:1;14037:23;;;14019:42;;14007:2;13992:18;27226:49:0;13875:192:1;16986:127:0;;;;;;:::i;:::-;-1:-1:-1;;;;;17087:18:0;17060:7;17087:18;;;;;;;;;;;;16986:127;26135:148;;;:::i;31661:1264::-;;;;;;:::i;:::-;;:::i;27854:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;25918:87;25991:6;;-1:-1:-1;;;;;25991:6:0;25918:87;;15914:104;;;:::i;20132:413::-;;;;;;:::i;:::-;;:::i;17326:175::-;;;;;;:::i;:::-;;:::i;28283:528::-;;;;;;:::i;:::-;;:::i;30975:255::-;;;;;;:::i;:::-;;:::i;39107:44::-;;39146:5;39107:44;;29789:985;;;;;;:::i;:::-;;:::i;39178:40::-;;;;;37621:425;;;;;;:::i;:::-;;:::i;17564:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;17680:18:0;;;17653:7;17680:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17564:151;27564:117;;27610:71;27564:117;;27087:70;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14274:10:1;14262:23;;;14244:42;;14317:2;14302:18;;14295:34;;;;14217:18;27087:70:0;14072:263:1;26289:244:0;;;;;;:::i;:::-;;:::i;15695:100::-;15749:13;15782:5;15775:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15695:100;:::o;17862:169::-;17945:4;17962:39;13037:10;17985:7;17994:6;17962:8;:39::i;:::-;-1:-1:-1;18019:4:0;17862:169;;;;;:::o;18513:492::-;18653:4;18670:36;18680:6;18688:9;18699:6;18670:9;:36::i;:::-;-1:-1:-1;;;;;18746:19:0;;18719:24;18746:19;;;:11;:19;;;;;;;;13037:10;18746:33;;;;;;;;18798:26;;;;18790:79;;;;-1:-1:-1;;;18790:79:0;;10463:2:1;18790:79:0;;;10445:21:1;10502:2;10482:18;;;10475:30;10541:34;10521:18;;;10514:62;-1:-1:-1;;;10592:18:1;;;10585:38;10640:19;;18790:79:0;;;;;;;;;18905:57;18914:6;13037:10;18955:6;18936:16;:25;18905:8;:57::i;:::-;-1:-1:-1;18993:4:0;;18513:492;-1:-1:-1;;;;18513:492:0:o;36671:463::-;36847:67;;;36424:66;36847:67;;;4967:25:1;-1:-1:-1;;;;;5066:15:1;;;5046:18;;;5039:43;;;;5118:15;;;5098:18;;;5091:43;5150:18;;;5143:34;;;5193:19;;;5186:35;;;5237:19;;;5230:35;;;36796:7:0;;;;4939:19:1;;36847:67:0;;;;;;;;;;;;36837:78;;;;;;36816:99;;36926:14;37031:16;37066:10;36967:124;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;36967:124:0;;;;;;36943:159;;36967:124;36943:159;;;;;36671:463;-1:-1:-1;;;;;;;;36671:463:0:o;19414:215::-;13037:10;19502:4;19551:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19551:34:0;;;;;;;;;;19502:4;;19519:80;;19542:7;;19551:47;;19588:10;;19551:47;:::i;:::-;19519:8;:80::i;39308:257::-;26062:10;26051:7;25991:6;;-1:-1:-1;;;;;25991:6:0;;25918:87;26051:7;-1:-1:-1;;;;;26051:21:0;;26043:66;;;;-1:-1:-1;;;26043:66:0;;;;;;;:::i;:::-;39406:15:::1;39388;:33;39385:140;;;39146:5;39463:6;39447:13;16903:12:::0;;;16815:108;39447:13:::1;:22;;;;:::i;:::-;39446:40;;39438:75;;;::::0;-1:-1:-1;;;39438:75:0;;10112:2:1;39438:75:0::1;::::0;::::1;10094:21:1::0;10151:2;10131:18;;;10124:30;-1:-1:-1;;;10170:18:1;;;10163:52;10232:18;;39438:75:0::1;9910:346:1::0;39438:75:0::1;39535:22;39541:7;39550:6;39535:5;:22::i;:::-;39308:257:::0;;:::o;29251:104::-;29315:32;29325:10;29337:9;29315;:32::i;:::-;29251:104;:::o;26135:148::-;26062:10;26051:7;25991:6;;-1:-1:-1;;;;;25991:6:0;;25918:87;26051:7;-1:-1:-1;;;;;26051:21:0;;26043:66;;;;-1:-1:-1;;;26043:66:0;;;;;;;:::i;:::-;26226:6:::1;::::0;26205:40:::1;::::0;26242:1:::1;::::0;-1:-1:-1;;;;;26226:6:0::1;::::0;26205:40:::1;::::0;26242:1;;26205:40:::1;26256:6;:19:::0;;-1:-1:-1;;;;;;26256:19:0::1;::::0;;26135:148::o;31661:1264::-;31769:7;31816:12;31802:11;:26;31794:89;;;;-1:-1:-1;;;31794:89:0;;9693:2:1;31794:89:0;;;9675:21:1;9732:2;9712:18;;;9705:30;9771:34;9751:18;;;9744:62;-1:-1:-1;;;9822:18:1;;;9815:48;9880:19;;31794:89:0;9491:414:1;31794:89:0;-1:-1:-1;;;;;31918:23:0;;31896:19;31918:23;;;:14;:23;;;;;;;;31956:17;31952:58;;31997:1;31990:8;;;;;31952:58;-1:-1:-1;;;;;32070:20:0;;;;;;:11;:20;;;;;32122:11;;32091:16;32106:1;32091:12;:16;:::i;:::-;32070:38;;;;;;;;;;;;;;;-1:-1:-1;32070:38:0;:48;;:63;32066:147;;-1:-1:-1;;;;;32157:20:0;;;;;;:11;:20;;;;;;32178:16;32193:1;32178:12;:16;:::i;:::-;32157:38;;;;;;;;;;;;;;;:44;;;32150:51;;;;;32066:147;-1:-1:-1;;;;;32274:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;32270:88:0;;;32345:1;32338:8;;;;;32270:88;32370:12;;32412:16;32427:1;32412:12;:16;:::i;:::-;32397:31;;32439:428;32454:5;32446:13;;:5;:13;;;32439:428;;;32476:13;32518:1;32501:13;32509:5;32501;:13;:::i;:::-;32500:19;;;;:::i;:::-;32492:27;;:5;:27;:::i;:::-;-1:-1:-1;;;;;32584:20:0;;32561;32584;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;32561:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;32476:43;;-1:-1:-1;32631:27:0;;32627:229;;;32686:8;;;;-1:-1:-1;32679:15:0;;-1:-1:-1;;;;32679:15:0;32627:229;32720:12;;:26;;;-1:-1:-1;32716:140:0;;;32775:6;32767:14;;32716:140;;;32830:10;32839:1;32830:6;:10;:::i;:::-;32822:18;;32716:140;32461:406;;32439:428;;;-1:-1:-1;;;;;;32884:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;31661:1264:0;;;;:::o;15914:104::-;15970:13;16003:7;15996:14;;;;;:::i;20132:413::-;13037:10;20225:4;20269:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;20269:34:0;;;;;;;;;;20322:35;;;;20314:85;;;;-1:-1:-1;;;20314:85:0;;12876:2:1;20314:85:0;;;12858:21:1;12915:2;12895:18;;;12888:30;12954:34;12934:18;;;12927:62;-1:-1:-1;;;13005:18:1;;;12998:35;13050:19;;20314:85:0;12674:401:1;20314:85:0;20435:67;13037:10;20458:7;20486:15;20467:16;:34;20435:8;:67::i;:::-;-1:-1:-1;20533:4:0;;20132:413;-1:-1:-1;;;20132:413:0:o;17326:175::-;17412:4;17429:42;13037:10;17453:9;17464:6;17429:9;:42::i;28283:528::-;28441:140;;;27610:71;28441:140;;;5507:25:1;-1:-1:-1;;;;;5568:32:1;;5548:18;;;5541:60;;;;5617:18;;;5610:34;;;5660:18;;;5653:34;;;28376:7:0;;;;5479:19:1;;28441:140:0;;;;;;;;;;;;28417:175;;;;;;28396:196;;28603:14;28708:16;28743:10;28644:124;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;28644:124:0;;;;;;28620:159;;28644:124;28620:159;;;;;28283:528;-1:-1:-1;;;;;;28283:528:0:o;30975:255::-;-1:-1:-1;;;;;31114:23:0;;31067:7;31114:23;;;:14;:23;;;;;;;;31155:16;:67;;31221:1;31155:67;;;-1:-1:-1;;;;;31174:20:0;;;;;;:11;:20;;;;;;31195:16;31210:1;31195:12;:16;:::i;:::-;31174:38;;;;;;;;;;;;;;;:44;;;31155:67;31148:74;30975:255;-1:-1:-1;;;30975:255:0:o;29789:985::-;30027:140;;;27610:71;30027:140;;;5507:25:1;-1:-1:-1;;;;;5568:32:1;;5548:18;;;5541:60;;;;5617:18;;;5610:34;;;5660:18;;;5653:34;;;29982:18:0;;5479:19:1;;30027:140:0;;;;;;;;;;;;30003:175;;;;;;29982:196;;30191:14;30296:16;30331:10;30232:124;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;30232:124:0;;;;;;;;;30208:159;;30232:124;30208:159;;;;30380:17;30400:26;;;;;;;;;5925:25:1;;;5998:4;5986:17;;5966:18;;;5959:45;;;;6020:18;;;6013:34;;;6063:18;;;6056:34;;;30208:159:0;;-1:-1:-1;30380:17:0;30400:26;;5897:19:1;;30400:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30400:26:0;;-1:-1:-1;;30400:26:0;;;-1:-1:-1;;;;;;;30445:23:0;;30437:85;;;;-1:-1:-1;;;30437:85:0;;11647:2:1;30437:85:0;;;11629:21:1;11686:2;11666:18;;;11659:30;11725:34;11705:18;;;11698:62;-1:-1:-1;;;11776:18:1;;;11769:47;11833:19;;30437:85:0;11445:413:1;30437:85:0;-1:-1:-1;;;;;30550:17:0;;;;;;:6;:17;;;;;:19;;;;;;:::i;:::-;;;;;30541:5;:28;30533:86;;;;-1:-1:-1;;;30533:86:0;;11233:2:1;30533:86:0;;;11215:21:1;11272:2;11252:18;;;11245:30;11311:34;11291:18;;;11284:62;-1:-1:-1;;;11362:18:1;;;11355:43;11415:19;;30533:86:0;11031:409:1;30533:86:0;30657:6;30638:15;:25;;30630:87;;;;-1:-1:-1;;;30630:87:0;;8931:2:1;30630:87:0;;;8913:21:1;8970:2;8950:18;;;8943:30;9009:34;8989:18;;;8982:62;-1:-1:-1;;;9060:18:1;;;9053:47;9117:19;;30630:87:0;8729:413:1;30630:87:0;30735:31;30745:9;30756;30735;:31::i;:::-;30728:38;;;29789:985;;;;;;;:::o;37621:425::-;37773:15;37761:8;:27;;37753:55;;;;-1:-1:-1;;;37753:55:0;;9349:2:1;37753:55:0;;;9331:21:1;9388:2;9368:18;;;9361:30;-1:-1:-1;;;9407:18:1;;;9400:45;9462:18;;37753:55:0;9147:339:1;37753:55:0;-1:-1:-1;;;;;37903:19:0;;37821:18;37903:19;;;:12;:19;;;;;:21;;36424:66;;37880:5;;37887:7;;37896:5;;37903:21;37821:18;37903:21;;;:::i;:::-;;;;-1:-1:-1;37852:83:0;;;;;;4967:25:1;;;;-1:-1:-1;;;;;5066:15:1;;;5046:18;;;5039:43;5118:15;;;;5098:18;;;5091:43;5150:18;;;5143:34;5193:19;;;5186:35;5237:19;;;5230:35;;;4939:19;;37852:83:0;;;;;;;;;;;;37842:94;;;;;;37821:115;;37947:47;37967:5;37974:10;37986:1;37989;37992;37947:19;:47::i;:::-;38007:31;38016:5;38023:7;38032:5;38007:8;:31::i;:::-;37742:304;37621:425;;;;;;;:::o;26289:244::-;26062:10;26051:7;25991:6;;-1:-1:-1;;;;;25991:6:0;;25918:87;26051:7;-1:-1:-1;;;;;26051:21:0;;26043:66;;;;-1:-1:-1;;;26043:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26378:22:0;::::1;26370:73;;;::::0;-1:-1:-1;;;26370:73:0;;7309:2:1;26370:73:0::1;::::0;::::1;7291:21:1::0;7348:2;7328:18;;;7321:30;7387:34;7367:18;;;7360:62;-1:-1:-1;;;7438:18:1;;;7431:36;7484:19;;26370:73:0::1;7107:402:1::0;26370:73:0::1;26480:6;::::0;26459:38:::1;::::0;-1:-1:-1;;;;;26459:38:0;;::::1;::::0;26480:6:::1;::::0;26459:38:::1;::::0;26480:6:::1;::::0;26459:38:::1;26508:6;:17:::0;;-1:-1:-1;;;;;;26508:17:0::1;-1:-1:-1::0;;;;;26508:17:0;;;::::1;::::0;;;::::1;::::0;;26289:244::o;23816:380::-;-1:-1:-1;;;;;23952:19:0;;23944:68;;;;-1:-1:-1;;;23944:68:0;;12471:2:1;23944:68:0;;;12453:21:1;12510:2;12490:18;;;12483:30;12549:34;12529:18;;;12522:62;-1:-1:-1;;;12600:18:1;;;12593:34;12644:19;;23944:68:0;12269:400:1;23944:68:0;-1:-1:-1;;;;;24031:21:0;;24023:68;;;;-1:-1:-1;;;24023:68:0;;7716:2:1;24023:68:0;;;7698:21:1;7755:2;7735:18;;;7728:30;7794:34;7774:18;;;7767:62;-1:-1:-1;;;7845:18:1;;;7838:32;7887:19;;24023:68:0;7514:398:1;24023:68:0;-1:-1:-1;;;;;24104:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24156:32;;4644:25:1;;;24156:32:0;;4617:18:1;24156:32:0;;;;;;;23816:380;;;:::o;36082:233::-;36189:42;36205:6;36213:9;36224:6;36189:15;:42::i;:::-;-1:-1:-1;;;;;36257:18:0;;;;;;;:10;:18;;;;;;;36277:21;;;;;;;;36242:65;;36257:18;;;;36277:21;36300:6;36242:14;:65::i;:::-;36082:233;;;:::o;35708:179::-;35785:28;35797:7;35806:6;35785:11;:28::i;:::-;-1:-1:-1;;;;;35851:19:0;;;35847:1;35851:19;;;:10;:19;;;;;;35824:55;;35851:19;35872:6;35824:14;:55::i;32933:438::-;-1:-1:-1;;;;;33050:21:0;;;33024:23;33050:21;;;:10;:21;;;;;;;;;;17087:18;;;;;;;33185:21;;;;:33;;;-1:-1:-1;;;;;;33185:33:0;;;;;;;33236:54;;33050:21;;;;;17087:18;;33185:33;;33050:21;;;33236:54;;33024:23;33236:54;33303:60;33318:15;33335:9;33346:16;33303:14;:60::i;:::-;33013:358;;32933:438;;:::o;38406:605::-;38527:14;38632:16;38667:10;38568:124;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;38568:124:0;;;;;;;;;38544:159;;38568:124;38544:159;;;;38714:24;38741:26;;;;;;;;;5925:25:1;;;5998:4;5986:17;;5966:18;;;5959:45;;;;6020:18;;;6013:34;;;6063:18;;;6056:34;;;38544:159:0;;-1:-1:-1;38714:24:0;38741:26;;5897:19:1;;38741:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38741:26:0;;-1:-1:-1;;38741:26:0;;;-1:-1:-1;;;;;;;38902:30:0;;;;;;:60;;;38956:6;-1:-1:-1;;;;;38936:26:0;:16;-1:-1:-1;;;;;38936:26:0;;38902:60;38894:109;;;;-1:-1:-1;;;38894:109:0;;8119:2:1;38894:109:0;;;8101:21:1;8158:2;8138:18;;;8131:30;8197:34;8177:18;;;8170:62;-1:-1:-1;;;8248:18:1;;;8241:34;8292:19;;38894:109:0;7917:400:1;38894:109:0;38516:495;;38406:605;;;;;:::o;21035:733::-;-1:-1:-1;;;;;21175:20:0;;21167:70;;;;-1:-1:-1;;;21167:70:0;;12065:2:1;21167:70:0;;;12047:21:1;12104:2;12084:18;;;12077:30;12143:34;12123:18;;;12116:62;-1:-1:-1;;;12194:18:1;;;12187:35;12239:19;;21167:70:0;11863:401:1;21167:70:0;-1:-1:-1;;;;;21256:23:0;;21248:71;;;;-1:-1:-1;;;21248:71:0;;6905:2:1;21248:71:0;;;6887:21:1;6944:2;6924:18;;;6917:30;6983:34;6963:18;;;6956:62;-1:-1:-1;;;7034:18:1;;;7027:33;7077:19;;21248:71:0;6703:399:1;21248:71:0;-1:-1:-1;;;;;21416:17:0;;21392:21;21416:17;;;;;;;;;;;21452:23;;;;21444:74;;;;-1:-1:-1;;;21444:74:0;;8524:2:1;21444:74:0;;;8506:21:1;8563:2;8543:18;;;8536:30;8602:34;8582:18;;;8575:62;-1:-1:-1;;;8653:18:1;;;8646:36;8699:19;;21444:74:0;8322:402:1;21444:74:0;-1:-1:-1;;;;;21554:17:0;;;:9;:17;;;;;;;;;;;21574:22;;;21554:42;;21618:20;;;;;;;;:30;;21590:6;;21554:9;21618:30;;21590:6;;21618:30;:::i;:::-;;;;;;;;21683:9;-1:-1:-1;;;;;21666:35:0;21675:6;-1:-1:-1;;;;;21666:35:0;;21694:6;21666:35;;;;4644:25:1;;4632:2;4617:18;;4498:177;21666:35:0;;;;;;;;21714:46;36082:233;33379:945;33485:6;-1:-1:-1;;;;;33475:16:0;:6;-1:-1:-1;;;;;33475:16:0;;;:30;;;;;33504:1;33495:6;:10;33475:30;33471:846;;;-1:-1:-1;;;;;33526:20:0;;;33522:384;;-1:-1:-1;;;;;33634:22:0;;33615:16;33634:22;;;:14;:22;;;;;;;;;33695:13;:60;;33754:1;33695:60;;;-1:-1:-1;;;;;33711:19:0;;;;;;:11;:19;;;;;;33731:13;33743:1;33731:9;:13;:::i;:::-;33711:34;;;;;;;;;;;;;;;:40;;;33695:60;33675:80;-1:-1:-1;33774:17:0;33795:18;33807:6;33675:80;33795:18;:::i;:::-;33774:40;;33833:57;33850:6;33858:9;33869;33880;33833:16;:57::i;:::-;33548:358;;;33522:384;-1:-1:-1;;;;;33926:20:0;;;33922:384;;-1:-1:-1;;;;;34034:22:0;;34015:16;34034:22;;;:14;:22;;;;;;;;;34095:13;:60;;34154:1;34095:60;;;-1:-1:-1;;;;;34111:19:0;;;;;;:11;:19;;;;;;34131:13;34143:1;34131:9;:13;:::i;:::-;34111:34;;;;;;;;;;;;;;;:40;;;34095:60;34075:80;-1:-1:-1;34174:17:0;34195:18;34207:6;34075:80;34195:18;:::i;:::-;34174:40;;34233:57;34250:6;34258:9;34269;34280;34233:16;:57::i;22055:399::-;-1:-1:-1;;;;;22139:21:0;;22131:65;;;;-1:-1:-1;;;22131:65:0;;13282:2:1;22131:65:0;;;13264:21:1;13321:2;13301:18;;;13294:30;13360:33;13340:18;;;13333:61;13411:18;;22131:65:0;13080:355:1;22131:65:0;22287:6;22271:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;22304:18:0;;:9;:18;;;;;;;;;;:28;;22326:6;;22304:9;:28;;22326:6;;22304:28;:::i;:::-;;;;-1:-1:-1;;22348:37:0;;4644:25:1;;;-1:-1:-1;;;;;22348:37:0;;;22365:1;;22348:37;;4632:2:1;4617:18;22348:37:0;;;;;;;39308:257;;:::o;34332:715::-;34511:18;34532:87;34539:12;34532:87;;;;;;;;;;;;;;;;;:6;:87::i;:::-;34511:108;;34651:1;34636:12;:16;;;:85;;;;-1:-1:-1;;;;;;34656:22:0;;;;;;:11;:22;;;;;:65;;;;34679:16;34694:1;34679:12;:16;:::i;:::-;34656:40;;;;;;;;;;;;;;;-1:-1:-1;34656:40:0;:50;;:65;34636:85;34632:339;;;-1:-1:-1;;;;;34738:22:0;;;;;;:11;:22;;;;;34787:8;;34761:16;34776:1;34761:12;:16;:::i;:::-;34738:40;;;;;;;;;;;;;-1:-1:-1;34738:40:0;:46;;:57;34632:339;;;34867:33;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34828:22:0;;-1:-1:-1;34828:22:0;;;:11;:22;;;;;:36;;;;;;;;;;;:72;;;;-1:-1:-1;;34828:72:0;;;;;;;;-1:-1:-1;34828:72:0;;;;34943:16;;34828:36;;34943:16;:::i;:::-;-1:-1:-1;;;;;34915:25:0;;;;;;:14;:25;;;;;:44;;-1:-1:-1;;34915:44:0;;;;;;;;;;;;34632:339;34988:51;;;13796:25:1;;;13852:2;13837:18;;13830:34;;;-1:-1:-1;;;;;34988:51:0;;;;;13769:18:1;34988:51:0;;;;;;;34500:547;34332:715;;;;:::o;35055:161::-;35130:6;35168:12;35161:5;35157:9;;35149:32;;;;-1:-1:-1;;;35149:32:0;;;;;;;;:::i;:::-;-1:-1:-1;35206:1:0;;35055:161;-1:-1:-1;;35055:161:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:156::-;258:20;;318:4;307:16;;297:27;;287:55;;338:1;335;328:12;353:186;412:6;465:2;453:9;444:7;440:23;436:32;433:52;;;481:1;478;471:12;433:52;504:29;523:9;504:29;:::i;544:260::-;612:6;620;673:2;661:9;652:7;648:23;644:32;641:52;;;689:1;686;679:12;641:52;712:29;731:9;712:29;:::i;:::-;702:39;;760:38;794:2;783:9;779:18;760:38;:::i;:::-;750:48;;544:260;;;;;:::o;809:328::-;886:6;894;902;955:2;943:9;934:7;930:23;926:32;923:52;;;971:1;968;961:12;923:52;994:29;1013:9;994:29;:::i;:::-;984:39;;1042:38;1076:2;1065:9;1061:18;1042:38;:::i;:::-;1032:48;;1127:2;1116:9;1112:18;1099:32;1089:42;;809:328;;;;;:::o;1142:466::-;1237:6;1245;1253;1261;1269;1322:3;1310:9;1301:7;1297:23;1293:33;1290:53;;;1339:1;1336;1329:12;1290:53;1362:29;1381:9;1362:29;:::i;:::-;1352:39;;1410:38;1444:2;1433:9;1429:18;1410:38;:::i;:::-;1142:466;;1400:48;;-1:-1:-1;;;;1495:2:1;1480:18;;1467:32;;1546:2;1531:18;;1518:32;;1597:3;1582:19;;;1569:33;;-1:-1:-1;1142:466:1:o;1613:606::-;1724:6;1732;1740;1748;1756;1764;1772;1825:3;1813:9;1804:7;1800:23;1796:33;1793:53;;;1842:1;1839;1832:12;1793:53;1865:29;1884:9;1865:29;:::i;:::-;1855:39;;1913:38;1947:2;1936:9;1932:18;1913:38;:::i;:::-;1903:48;;1998:2;1987:9;1983:18;1970:32;1960:42;;2049:2;2038:9;2034:18;2021:32;2011:42;;2072:37;2104:3;2093:9;2089:19;2072:37;:::i;:::-;2062:47;;2156:3;2145:9;2141:19;2128:33;2118:43;;2208:3;2197:9;2193:19;2180:33;2170:43;;1613:606;;;;;;;;;;:::o;2224:254::-;2292:6;2300;2353:2;2341:9;2332:7;2328:23;2324:32;2321:52;;;2369:1;2366;2359:12;2321:52;2392:29;2411:9;2392:29;:::i;:::-;2382:39;2468:2;2453:18;;;;2440:32;;-1:-1:-1;;;2224:254:1:o;2483:322::-;2560:6;2568;2576;2629:2;2617:9;2608:7;2604:23;2600:32;2597:52;;;2645:1;2642;2635:12;2597:52;2668:29;2687:9;2668:29;:::i;:::-;2658:39;2744:2;2729:18;;2716:32;;-1:-1:-1;2795:2:1;2780:18;;;2767:32;;2483:322;-1:-1:-1;;;2483:322:1:o;2810:531::-;2912:6;2920;2928;2936;2944;2952;3005:3;2993:9;2984:7;2980:23;2976:33;2973:53;;;3022:1;3019;3012:12;2973:53;3045:29;3064:9;3045:29;:::i;:::-;3035:39;;3121:2;3110:9;3106:18;3093:32;3083:42;;3172:2;3161:9;3157:18;3144:32;3134:42;;3195:36;3227:2;3216:9;3212:18;3195:36;:::i;:::-;3185:46;;3278:3;3267:9;3263:19;3250:33;3240:43;;3330:3;3319:9;3315:19;3302:33;3292:43;;2810:531;;;;;;;;:::o;3346:350::-;3413:6;3421;3474:2;3462:9;3453:7;3449:23;3445:32;3442:52;;;3490:1;3487;3480:12;3442:52;3513:29;3532:9;3513:29;:::i;:::-;3503:39;;3592:2;3581:9;3577:18;3564:32;3636:10;3629:5;3625:22;3618:5;3615:33;3605:61;;3662:1;3659;3652:12;3605:61;3685:5;3675:15;;;3346:350;;;;;:::o;3701:392::-;-1:-1:-1;;;3959:27:1;;4011:1;4002:11;;3995:27;;;;4047:2;4038:12;;4031:28;4084:2;4075:12;;3701:392::o;6101:597::-;6213:4;6242:2;6271;6260:9;6253:21;6303:6;6297:13;6346:6;6341:2;6330:9;6326:18;6319:34;6371:1;6381:140;6395:6;6392:1;6389:13;6381:140;;;6490:14;;;6486:23;;6480:30;6456:17;;;6475:2;6452:26;6445:66;6410:10;;6381:140;;;6539:6;6536:1;6533:13;6530:91;;;6609:1;6604:2;6595:6;6584:9;6580:22;6576:31;6569:42;6530:91;-1:-1:-1;6682:2:1;6661:15;-1:-1:-1;;6657:29:1;6642:45;;;;6689:2;6638:54;;6101:597;-1:-1:-1;;;6101:597:1:o;10670:356::-;10872:2;10854:21;;;10891:18;;;10884:30;10950:34;10945:2;10930:18;;10923:62;11017:2;11002:18;;10670:356::o;14529:128::-;14569:3;14600:1;14596:6;14593:1;14590:13;14587:39;;;14606:18;;:::i;:::-;-1:-1:-1;14642:9:1;;14529:128::o;14662:228::-;14701:3;14729:10;14766:2;14763:1;14759:10;14796:2;14793:1;14789:10;14827:3;14823:2;14819:12;14814:3;14811:21;14808:47;;;14835:18;;:::i;:::-;14871:13;;14662:228;-1:-1:-1;;;;14662:228:1:o;14895:288::-;14934:1;14960:10;14997:2;14994:1;14990:10;15019:3;15009:134;;15065:10;15060:3;15056:20;15053:1;15046:31;15100:4;15097:1;15090:15;15128:4;15125:1;15118:15;15009:134;15161:10;;15157:20;;;;;14895:288;-1:-1:-1;;14895:288:1:o;15188:125::-;15228:4;15256:1;15253;15250:8;15247:34;;;15261:18;;:::i;:::-;-1:-1:-1;15298:9:1;;15188:125::o;15318:221::-;15357:4;15386:10;15446;;;;15416;;15468:12;;;15465:38;;;15483:18;;:::i;:::-;15520:13;;15318:221;-1:-1:-1;;;15318:221:1:o;15544:380::-;15623:1;15619:12;;;;15666;;;15687:61;;15741:4;15733:6;15729:17;15719:27;;15687:61;15794:2;15786:6;15783:14;15763:18;15760:38;15757:161;;;15840:10;15835:3;15831:20;15828:1;15821:31;15875:4;15872:1;15865:15;15903:4;15900:1;15893:15;15757:161;;15544:380;;;:::o;15929:135::-;15968:3;-1:-1:-1;;15989:17:1;;15986:43;;;16009:18;;:::i;:::-;-1:-1:-1;16056:1:1;16045:13;;15929:135::o;16069:127::-;16130:10;16125:3;16121:20;16118:1;16111:31;16161:4;16158:1;16151:15;16185:4;16182:1;16175:15
Swarm Source
ipfs://ee4ca8142bfac243e133bab2cfefb28b9e89286b4a20189a5d62d444956f16ac
Loading...
Loading
OVERVIEW
The Boo Finance Protocol is pioneering DeFi 3.0 with optimized, competitive yield-farming and staking with deflationary NFTs and DAO on the Avalanche Network.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.