Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
RvFMigration
Compiler Version
v0.8.2+commit.661d1103
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-06-02 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return recover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return recover(hash, r, vs); } else { revert("ECDSA: invalid signature length"); } } /** * @dev Overload of {ECDSA-recover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require( uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value" ); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @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#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (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?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * 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); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private 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); } } } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol pragma solidity ^0.8.0; /** * @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"); } } } // File: contracts/RvFMigration.sol pragma solidity 0.8.2; /** * @title RVFMigration * @dev Contract for swapping RVF tokens to RVFv2 tokens with added functionalities for liquidity management. */ contract RvFMigration is EIP712, Ownable, ReentrancyGuard { address public rvfToken; uint256 public swapFee; address public feeCollector; // Address to collect swap fees address public tokenCollector; // Address to collect swapped tokens // Mapping to keep track of liquidity added by each address mapping(address => uint256) public liquidity; // Storage for used salts to prevent replays mapping(bytes32 => bool) public usedSalt; mapping(address => bool) public signers; // Constants for EIP-712 string private constant SIGNING_DOMAIN = "RvFMigration"; string private constant SIGNATURE_VERSION = "1"; uint32 constant WEEK = 3600 * 24 * 7; bytes32 private constant TYPEHASH = keccak256( "Migrate(address token,address recipient,uint256 amount,bytes32 salt,uint256 expiry)" ); // This event logs the migrations that have occurred with a signature event MigrationBySignature( address indexed signer, address indexed recipient, address token, uint256 amount ); event LiquidityAdded(address indexed user, uint256 amount); event EmergencyWithdrawal(address indexed user, uint256 amount); event FeeCollectorChanged(address indexed newFeeCollector); event TokenCollectorChanged(address indexed newTokenCollector); /** * @dev Sets the initial addresses for RVF and RVFv2 tokens, swap fee, and fee collector upon contract deployment. * @param _rvfToken Address of the RVF token contract. * @param _feeCollector Address where collected fees will be sent. * @param _swapFee Initial swap fee in RVFv2 tokens (fee is configured in 10000). * @param _tokenCollector Address to collect swapped tokens. */ constructor( address _rvfToken, address _feeCollector, uint256 _swapFee, address _tokenCollector ) EIP712(SIGNING_DOMAIN, SIGNATURE_VERSION) { rvfToken = _rvfToken; feeCollector = _feeCollector; swapFee = _swapFee; tokenCollector = _tokenCollector; } /** * @dev Sets the swap fee. * @param _fee New swap fee in RVFv2 tokens (fee is configured in 10000). */ function setSwapFee(uint256 _fee) external onlyOwner { swapFee = _fee; } /** @dev sets the signer @param _signer is the address that generate signatures */ function addSigner(address _signer) public onlyOwner { require(_signer != address(0), "Bad signer"); signers[_signer] = true; } /** @dev removes the signer @param _signer is the address that generate signatures */ function removeSigner(address _signer) external onlyOwner { require(_signer != address(0), "Bad signer"); delete signers[_signer]; } /** * @dev Sets the fee collector address. * @param _feeCollector New address to collect swap fees. */ function setFeeCollector(address _feeCollector) external onlyOwner { require(_feeCollector != address(0), "Invalid address"); feeCollector = _feeCollector; emit FeeCollectorChanged(_feeCollector); } /** * @dev Sets the token collector address. * @param _tokenCollector New address to collect swapped tokens. */ function setTokenCollector(address _tokenCollector) external onlyOwner { require(_tokenCollector != address(0), "Invalid address"); tokenCollector = _tokenCollector; emit TokenCollectorChanged(_tokenCollector); } function swap( address token, address recipient, uint256 amount, bytes32 salt, uint256 expiry, bytes memory signature ) external nonReentrant { require(msg.sender == recipient, "Caller should be the recipient"); // Check if the caller is the recipient require(amount > 0, "Amount must be greater than zero"); uint256 feeAmount = (amount * swapFee) / 10000; // Calculate fee amount in RVFv2 tokens require(amount > feeAmount, "Amount must be greater than fee"); require(token != address(0), "Invalid token address"); require(recipient != address(0), "Invalid recipient address"); require(amount > 0, "Amount must be greater than 0"); require(expiry <= block.timestamp + WEEK, "Signature has expired"); require(!usedSalt[salt], "Salt has already been used"); // Encode the migration request as per EIP-712 bytes32 structHash = keccak256(abi.encode( TYPEHASH, token, recipient, amount, salt, expiry )); bytes32 digest = _hashTypedDataV4(structHash); address signer = ECDSA.recover(digest, signature); require(signer != address(0), "Invalid signature"); require(signers[signer], "Invalid signer"); usedSalt[salt] = true; // Transfer RVF tokens to token collector IERC20(rvfToken).transferFrom(recipient, tokenCollector, amount); // Transfer swap fee to fee collector IERC20(token).transfer(feeCollector, feeAmount); // Transfer RVFv2 tokens to user IERC20(token).transfer(recipient, amount - feeAmount); // Emit an event for the migration emit MigrationBySignature(signer, recipient, token, amount); } /** * @dev Allows users to add liquidity by transferring RVFv2 tokens to the contract. * @param amount Amount of RVFv2 tokens to add as liquidity. */ function addLiquidity(uint256 amount, address rvfV2Token) external nonReentrant { require(amount > 0, "Amount must be greater than zero"); // Transfer RVFv2 tokens from user to contract for liquidity IERC20(rvfV2Token).transferFrom(msg.sender, address(this), amount); liquidity[msg.sender] += amount; emit LiquidityAdded(msg.sender, amount); } /** * @dev Allows the owner to withdraw RVFv2 tokens from the contract in case of emergency. * @param amount Amount of RVFv2 tokens to withdraw. */ function emergencyWithdrawal(uint256 amount, address token) external onlyOwner nonReentrant { require(amount > 0, "Amount must be greater than zero"); // Transfer RVF tokens to owner IERC20(token).transfer(owner(), amount); emit EmergencyWithdrawal(msg.sender, amount); } /** * Verifies a migration signature without performing the migration. * @param token The token to be potentially transferred * @param recipient The intended recipient of the tokens * @param amount The amount of tokens to be potentially transferred * @param salt A unique identifier for the migration request * @param expiry The expiry time of the signature * @param signature The signature to verify * @return digest The EIP-712 compatible digest of the migration request * @return signer The address of the signer as recovered from the signature */ function verifyMigrationSignature( address token, address recipient, uint256 amount, bytes32 salt, uint256 expiry, bytes calldata signature ) external view returns (bytes32 digest, address signer) { // Encode the migration request as per EIP-712 bytes32 structHash = keccak256(abi.encode( TYPEHASH, token, recipient, amount, salt, expiry )); digest = _hashTypedDataV4(structHash); // Recover the signer from the signature signer = ECDSA.recover(digest, signature); return (digest, signer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_rvfToken","type":"address"},{"internalType":"address","name":"_feeCollector","type":"address"},{"internalType":"uint256","name":"_swapFee","type":"uint256"},{"internalType":"address","name":"_tokenCollector","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newFeeCollector","type":"address"}],"name":"FeeCollectorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"signer","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MigrationBySignature","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":"newTokenCollector","type":"address"}],"name":"TokenCollectorChanged","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"rvfV2Token","type":"address"}],"name":"addLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"addSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"emergencyWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"liquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"removeSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rvfToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_feeCollector","type":"address"}],"name":"setFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setSwapFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenCollector","type":"address"}],"name":"setTokenCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"signers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"usedSalt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"verifyMigrationSignature","outputs":[{"internalType":"bytes32","name":"digest","type":"bytes32"},{"internalType":"address","name":"signer","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101206040523480156200001257600080fd5b506040516200334738038062003347833981810160405281019062000038919062000352565b6040518060400160405280600c81526020017f5276464d6967726174696f6e00000000000000000000000000000000000000008152506040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260c081815250508160e081815250504660a081815250506200010c8184846200021c60201b60201c565b60808181525050806101008181525050505050505062000141620001356200025860201b60201c565b6200026060201b60201c565b6001808190555083600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160038190555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050620004ca565b6000838383463060405160200162000239959493929190620003f1565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050620003358162000496565b92915050565b6000815190506200034c81620004b0565b92915050565b600080600080608085870312156200036957600080fd5b6000620003798782880162000324565b94505060206200038c8782880162000324565b93505060406200039f878288016200033b565b9250506060620003b28782880162000324565b91505092959194509250565b620003c9816200044e565b82525050565b620003da8162000462565b82525050565b620003eb816200048c565b82525050565b600060a082019050620004086000830188620003cf565b620004176020830187620003cf565b620004266040830186620003cf565b620004356060830185620003e0565b620004446080830184620003be565b9695505050505050565b60006200045b826200046c565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b620004a1816200044e565b8114620004ad57600080fd5b50565b620004bb816200048c565b8114620004c757600080fd5b50565b60805160a05160c05160e05161010051612e386200050f60003960006119ce01526000611a10015260006119ef0152600061197b015260006119a30152612e386000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80639cd99dd5116100ad578063c415b95c11610071578063c415b95c146102e0578063c6984a68146102fe578063c95f9d0e1461032f578063eb12d61e1461034b578063f2fde38b1461036757610121565b80639cd99dd5146102405780639e2b53391461025c578063a42dce8014610278578063a9b0335a14610294578063b8c876b1146102b057610121565b806354cf2aeb116100f457806354cf2aeb1461019a578063715018a6146101b8578063736c0d5b146101c2578063816c1c62146101f25780638da5cb5b1461022257610121565b80630b353fc2146101265780630e316ab714610144578063271af8c11461016057806334e199071461017e575b600080fd5b61012e610383565b60405161013b91906122ff565b60405180910390f35b61015e60048036038101906101599190611d82565b6103a9565b005b6101686104e7565b60405161017591906122ff565b60405180910390f35b61019860048036038101906101939190611f45565b61050d565b005b6101a2610593565b6040516101af9190612717565b60405180910390f35b6101c0610599565b005b6101dc60048036038101906101d79190611d82565b610621565b6040516101e9919061237a565b60405180910390f35b61020c60048036038101906102079190611f1c565b610641565b604051610219919061237a565b60405180910390f35b61022a610661565b60405161023791906122ff565b60405180910390f35b61025a60048036038101906102559190611e52565b61068a565b005b61027660048036038101906102719190611f6e565b610df4565b005b610292600480360381019061028d9190611d82565b610fef565b005b6102ae60048036038101906102a99190611d82565b611162565b005b6102ca60048036038101906102c59190611d82565b6112d5565b6040516102d79190612717565b60405180910390f35b6102e86112ed565b6040516102f591906122ff565b60405180910390f35b61031860048036038101906103139190611dab565b611313565b604051610326929190612395565b60405180910390f35b61034960048036038101906103449190611f6e565b6113d3565b005b61036560048036038101906103609190611d82565b6115a3565b005b610381600480360381019061037c9190611d82565b6116ea565b005b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6103b16117e2565b73ffffffffffffffffffffffffffffffffffffffff166103cf610661565b73ffffffffffffffffffffffffffffffffffffffff1614610425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041c90612677565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161048c906125f7565b60405180910390fd5b600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6105156117e2565b73ffffffffffffffffffffffffffffffffffffffff16610533610661565b73ffffffffffffffffffffffffffffffffffffffff1614610589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090612677565b60405180910390fd5b8060038190555050565b60035481565b6105a16117e2565b73ffffffffffffffffffffffffffffffffffffffff166105bf610661565b73ffffffffffffffffffffffffffffffffffffffff1614610615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060c90612677565b60405180910390fd5b61061f60006117ea565b565b60086020528060005260406000206000915054906101000a900460ff1681565b60076020528060005260406000206000915054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600260015414156106d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c7906126f7565b60405180910390fd5b60026001819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073d90612637565b60405180910390fd5b60008411610789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078090612557565b60405180910390fd5b60006127106003548661079c919061282b565b6107a691906127fa565b90508085116107ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e1906126b7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16141561085a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610851906126d7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156108ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c190612657565b60405180910390fd5b6000851161090d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090490612577565b60405180910390fd5b62093a8063ffffffff164261092291906127a4565b831115610964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095b90612697565b60405180910390fd5b6007600085815260200190815260200160002060009054906101000a900460ff16156109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc90612537565b60405180910390fd5b60007ffd9014fb43ddbad6a665dfdc7ec78a778af22c72b228c3b89058c2862ddd1b5c8888888888604051602001610a02969594939291906123be565b6040516020818303038152906040528051906020012090506000610a25826118ae565b90506000610a3382866118c8565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9c90612597565b60405180910390fd5b600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890612617565b60405180910390fd5b60016007600089815260200190815260200160002060006101000a81548160ff021916908315150217905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8a600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168b6040518463ffffffff1660e01b8152600401610bde9392919061231a565b602060405180830381600087803b158015610bf857600080fd5b505af1158015610c0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c309190611ef3565b508973ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518363ffffffff1660e01b8152600401610c8e929190612351565b602060405180830381600087803b158015610ca857600080fd5b505af1158015610cbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce09190611ef3565b508973ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8a868b610d0a9190612885565b6040518363ffffffff1660e01b8152600401610d27929190612351565b602060405180830381600087803b158015610d4157600080fd5b505af1158015610d55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d799190611ef3565b508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f527d36191a6eb96f00471c097a529231027d0e6a04e5feaebb00af9166930daf8c8b604051610dd9929190612351565b60405180910390a35050505060018081905550505050505050565b610dfc6117e2565b73ffffffffffffffffffffffffffffffffffffffff16610e1a610661565b73ffffffffffffffffffffffffffffffffffffffff1614610e70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6790612677565b60405180910390fd5b60026001541415610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ead906126f7565b60405180910390fd5b600260018190555060008211610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef890612557565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610f25610661565b846040518363ffffffff1660e01b8152600401610f43929190612351565b602060405180830381600087803b158015610f5d57600080fd5b505af1158015610f71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f959190611ef3565b503373ffffffffffffffffffffffffffffffffffffffff167f23d6711a1d031134a36921253c75aa59e967d38e369ac625992824315e204f2083604051610fdc9190612717565b60405180910390a2600180819055505050565b610ff76117e2565b73ffffffffffffffffffffffffffffffffffffffff16611015610661565b73ffffffffffffffffffffffffffffffffffffffff161461106b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106290612677565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d2906124d7565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f9c1996a14d26c3ecd833c10222d012447ef07b09b15000f3a34318ff039c0bdc60405160405180910390a250565b61116a6117e2565b73ffffffffffffffffffffffffffffffffffffffff16611188610661565b73ffffffffffffffffffffffffffffffffffffffff16146111de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d590612677565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561124e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611245906124d7565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f6fd0acfc6ab484232ec6afc7d9e6bcb81f69264c9c3cd62f899e3ba3121844a560405160405180910390a250565b60066020528060005260406000206000915090505481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060007ffd9014fb43ddbad6a665dfdc7ec78a778af22c72b228c3b89058c2862ddd1b5c8a8a8a8a8a604051602001611353969594939291906123be565b604051602081830303815290604052805190602001209050611374816118ae565b92506113c48386868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506118c8565b91505097509795505050505050565b60026001541415611419576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611410906126f7565b60405180910390fd5b600260018190555060008211611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90612557565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016114a19392919061231a565b602060405180830381600087803b1580156114bb57600080fd5b505af11580156114cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f39190611ef3565b5081600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461154391906127a4565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fc17cea59c2955cb181b03393209566960365771dbba9dc3d510180e7cb312088836040516115909190612717565b60405180910390a2600180819055505050565b6115ab6117e2565b73ffffffffffffffffffffffffffffffffffffffff166115c9610661565b73ffffffffffffffffffffffffffffffffffffffff161461161f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161690612677565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561168f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611686906125f7565b60405180910390fd5b6001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6116f26117e2565b73ffffffffffffffffffffffffffffffffffffffff16611710610661565b73ffffffffffffffffffffffffffffffffffffffff1614611766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175d90612677565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90612517565b60405180910390fd5b6117df816117ea565b50565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006118c16118bb611977565b83611a3a565b9050919050565b60006041825114156119075760008060006020850151925060408501519150606085015160001a90506118fd86828585611a6d565b9350505050611971565b60408251141561193657600080602084015191506040840151905061192d858383611bf8565b92505050611971565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611968906124f7565b60405180910390fd5b92915050565b60007f00000000000000000000000000000000000000000000000000000000000000004614156119c9577f00000000000000000000000000000000000000000000000000000000000000009050611a37565b611a347f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611c42565b90505b90565b60008282604051602001611a4f9291906122c8565b60405160208183030381529060405280519060200120905092915050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115611ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acc906125b7565b60405180910390fd5b601b8460ff161480611aea5750601c8460ff16145b611b29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b20906125d7565b60405180910390fd5b600060018686868660405160008152602001604052604051611b4e9493929190612472565b6020604051602081039080840390855afa158015611b70573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be3906124b7565b60405180910390fd5b80915050949350505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84169150601b8460ff1c019050611c3786828785611a6d565b925050509392505050565b60008383834630604051602001611c5d95949392919061241f565b6040516020818303038152906040528051906020012090509392505050565b6000611c8f611c8a84612757565b612732565b905082815260208101848484011115611ca757600080fd5b611cb2848285612918565b509392505050565b600081359050611cc981612da6565b92915050565b600081519050611cde81612dbd565b92915050565b600081359050611cf381612dd4565b92915050565b60008083601f840112611d0b57600080fd5b8235905067ffffffffffffffff811115611d2457600080fd5b602083019150836001820283011115611d3c57600080fd5b9250929050565b600082601f830112611d5457600080fd5b8135611d64848260208601611c7c565b91505092915050565b600081359050611d7c81612deb565b92915050565b600060208284031215611d9457600080fd5b6000611da284828501611cba565b91505092915050565b600080600080600080600060c0888a031215611dc657600080fd5b6000611dd48a828b01611cba565b9750506020611de58a828b01611cba565b9650506040611df68a828b01611d6d565b9550506060611e078a828b01611ce4565b9450506080611e188a828b01611d6d565b93505060a088013567ffffffffffffffff811115611e3557600080fd5b611e418a828b01611cf9565b925092505092959891949750929550565b60008060008060008060c08789031215611e6b57600080fd5b6000611e7989828a01611cba565b9650506020611e8a89828a01611cba565b9550506040611e9b89828a01611d6d565b9450506060611eac89828a01611ce4565b9350506080611ebd89828a01611d6d565b92505060a087013567ffffffffffffffff811115611eda57600080fd5b611ee689828a01611d43565b9150509295509295509295565b600060208284031215611f0557600080fd5b6000611f1384828501611ccf565b91505092915050565b600060208284031215611f2e57600080fd5b6000611f3c84828501611ce4565b91505092915050565b600060208284031215611f5757600080fd5b6000611f6584828501611d6d565b91505092915050565b60008060408385031215611f8157600080fd5b6000611f8f85828601611d6d565b9250506020611fa085828601611cba565b9150509250929050565b611fb3816128b9565b82525050565b611fc2816128cb565b82525050565b611fd1816128d7565b82525050565b611fe8611fe3826128d7565b612958565b82525050565b6000611ffb601883612788565b915061200682612a00565b602082019050919050565b600061201e600f83612788565b915061202982612a29565b602082019050919050565b6000612041601f83612788565b915061204c82612a52565b602082019050919050565b6000612064602683612788565b915061206f82612a7b565b604082019050919050565b6000612087601a83612788565b915061209282612aca565b602082019050919050565b60006120aa600283612799565b91506120b582612af3565b600282019050919050565b60006120cd602083612788565b91506120d882612b1c565b602082019050919050565b60006120f0601d83612788565b91506120fb82612b45565b602082019050919050565b6000612113601183612788565b915061211e82612b6e565b602082019050919050565b6000612136602283612788565b915061214182612b97565b604082019050919050565b6000612159602283612788565b915061216482612be6565b604082019050919050565b600061217c600a83612788565b915061218782612c35565b602082019050919050565b600061219f600e83612788565b91506121aa82612c5e565b602082019050919050565b60006121c2601e83612788565b91506121cd82612c87565b602082019050919050565b60006121e5601983612788565b91506121f082612cb0565b602082019050919050565b6000612208602083612788565b915061221382612cd9565b602082019050919050565b600061222b601583612788565b915061223682612d02565b602082019050919050565b600061224e601f83612788565b915061225982612d2b565b602082019050919050565b6000612271601583612788565b915061227c82612d54565b602082019050919050565b6000612294601f83612788565b915061229f82612d7d565b602082019050919050565b6122b381612901565b82525050565b6122c28161290b565b82525050565b60006122d38261209d565b91506122df8285611fd7565b6020820191506122ef8284611fd7565b6020820191508190509392505050565b60006020820190506123146000830184611faa565b92915050565b600060608201905061232f6000830186611faa565b61233c6020830185611faa565b61234960408301846122aa565b949350505050565b60006040820190506123666000830185611faa565b61237360208301846122aa565b9392505050565b600060208201905061238f6000830184611fb9565b92915050565b60006040820190506123aa6000830185611fc8565b6123b76020830184611faa565b9392505050565b600060c0820190506123d36000830189611fc8565b6123e06020830188611faa565b6123ed6040830187611faa565b6123fa60608301866122aa565b6124076080830185611fc8565b61241460a08301846122aa565b979650505050505050565b600060a0820190506124346000830188611fc8565b6124416020830187611fc8565b61244e6040830186611fc8565b61245b60608301856122aa565b6124686080830184611faa565b9695505050505050565b60006080820190506124876000830187611fc8565b61249460208301866122b9565b6124a16040830185611fc8565b6124ae6060830184611fc8565b95945050505050565b600060208201905081810360008301526124d081611fee565b9050919050565b600060208201905081810360008301526124f081612011565b9050919050565b6000602082019050818103600083015261251081612034565b9050919050565b6000602082019050818103600083015261253081612057565b9050919050565b600060208201905081810360008301526125508161207a565b9050919050565b60006020820190508181036000830152612570816120c0565b9050919050565b60006020820190508181036000830152612590816120e3565b9050919050565b600060208201905081810360008301526125b081612106565b9050919050565b600060208201905081810360008301526125d081612129565b9050919050565b600060208201905081810360008301526125f08161214c565b9050919050565b600060208201905081810360008301526126108161216f565b9050919050565b6000602082019050818103600083015261263081612192565b9050919050565b60006020820190508181036000830152612650816121b5565b9050919050565b60006020820190508181036000830152612670816121d8565b9050919050565b60006020820190508181036000830152612690816121fb565b9050919050565b600060208201905081810360008301526126b08161221e565b9050919050565b600060208201905081810360008301526126d081612241565b9050919050565b600060208201905081810360008301526126f081612264565b9050919050565b6000602082019050818103600083015261271081612287565b9050919050565b600060208201905061272c60008301846122aa565b92915050565b600061273c61274d565b90506127488282612927565b919050565b6000604051905090565b600067ffffffffffffffff821115612772576127716129c0565b5b61277b826129ef565b9050602081019050919050565b600082825260208201905092915050565b600081905092915050565b60006127af82612901565b91506127ba83612901565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127ef576127ee612962565b5b828201905092915050565b600061280582612901565b915061281083612901565b9250826128205761281f612991565b5b828204905092915050565b600061283682612901565b915061284183612901565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561287a57612879612962565b5b828202905092915050565b600061289082612901565b915061289b83612901565b9250828210156128ae576128ad612962565b5b828203905092915050565b60006128c4826128e1565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b612930826129ef565b810181811067ffffffffffffffff8211171561294f5761294e6129c0565b5b80604052505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f496e76616c696420616464726573730000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53616c742068617320616c7265616479206265656e2075736564000000000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f416d6f756e74206d7573742062652067726561746572207468616e207a65726f600082015250565b7f416d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f426164207369676e657200000000000000000000000000000000000000000000600082015250565b7f496e76616c6964207369676e6572000000000000000000000000000000000000600082015250565b7f43616c6c65722073686f756c642062652074686520726563697069656e740000600082015250565b7f496e76616c696420726563697069656e74206164647265737300000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5369676e61747572652068617320657870697265640000000000000000000000600082015250565b7f416d6f756e74206d7573742062652067726561746572207468616e2066656500600082015250565b7f496e76616c696420746f6b656e20616464726573730000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b612daf816128b9565b8114612dba57600080fd5b50565b612dc6816128cb565b8114612dd157600080fd5b50565b612ddd816128d7565b8114612de857600080fd5b50565b612df481612901565b8114612dff57600080fd5b5056fea2646970667358221220e044f1321cc3f3582eeb28574483a0798ed5c9d0f3daf6bd733c98a4b710eeb564736f6c634300080200330000000000000000000000002fb652314c3d850e9049057bbe9813f1eee882d3000000000000000000000000521a83bb77a6b6b04817c999d0b8e811396247f90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000521a83bb77a6b6b04817c999d0b8e811396247f9
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101215760003560e01c80639cd99dd5116100ad578063c415b95c11610071578063c415b95c146102e0578063c6984a68146102fe578063c95f9d0e1461032f578063eb12d61e1461034b578063f2fde38b1461036757610121565b80639cd99dd5146102405780639e2b53391461025c578063a42dce8014610278578063a9b0335a14610294578063b8c876b1146102b057610121565b806354cf2aeb116100f457806354cf2aeb1461019a578063715018a6146101b8578063736c0d5b146101c2578063816c1c62146101f25780638da5cb5b1461022257610121565b80630b353fc2146101265780630e316ab714610144578063271af8c11461016057806334e199071461017e575b600080fd5b61012e610383565b60405161013b91906122ff565b60405180910390f35b61015e60048036038101906101599190611d82565b6103a9565b005b6101686104e7565b60405161017591906122ff565b60405180910390f35b61019860048036038101906101939190611f45565b61050d565b005b6101a2610593565b6040516101af9190612717565b60405180910390f35b6101c0610599565b005b6101dc60048036038101906101d79190611d82565b610621565b6040516101e9919061237a565b60405180910390f35b61020c60048036038101906102079190611f1c565b610641565b604051610219919061237a565b60405180910390f35b61022a610661565b60405161023791906122ff565b60405180910390f35b61025a60048036038101906102559190611e52565b61068a565b005b61027660048036038101906102719190611f6e565b610df4565b005b610292600480360381019061028d9190611d82565b610fef565b005b6102ae60048036038101906102a99190611d82565b611162565b005b6102ca60048036038101906102c59190611d82565b6112d5565b6040516102d79190612717565b60405180910390f35b6102e86112ed565b6040516102f591906122ff565b60405180910390f35b61031860048036038101906103139190611dab565b611313565b604051610326929190612395565b60405180910390f35b61034960048036038101906103449190611f6e565b6113d3565b005b61036560048036038101906103609190611d82565b6115a3565b005b610381600480360381019061037c9190611d82565b6116ea565b005b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6103b16117e2565b73ffffffffffffffffffffffffffffffffffffffff166103cf610661565b73ffffffffffffffffffffffffffffffffffffffff1614610425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041c90612677565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161048c906125f7565b60405180910390fd5b600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6105156117e2565b73ffffffffffffffffffffffffffffffffffffffff16610533610661565b73ffffffffffffffffffffffffffffffffffffffff1614610589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090612677565b60405180910390fd5b8060038190555050565b60035481565b6105a16117e2565b73ffffffffffffffffffffffffffffffffffffffff166105bf610661565b73ffffffffffffffffffffffffffffffffffffffff1614610615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060c90612677565b60405180910390fd5b61061f60006117ea565b565b60086020528060005260406000206000915054906101000a900460ff1681565b60076020528060005260406000206000915054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600260015414156106d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c7906126f7565b60405180910390fd5b60026001819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073d90612637565b60405180910390fd5b60008411610789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078090612557565b60405180910390fd5b60006127106003548661079c919061282b565b6107a691906127fa565b90508085116107ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e1906126b7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16141561085a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610851906126d7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156108ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c190612657565b60405180910390fd5b6000851161090d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090490612577565b60405180910390fd5b62093a8063ffffffff164261092291906127a4565b831115610964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095b90612697565b60405180910390fd5b6007600085815260200190815260200160002060009054906101000a900460ff16156109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc90612537565b60405180910390fd5b60007ffd9014fb43ddbad6a665dfdc7ec78a778af22c72b228c3b89058c2862ddd1b5c8888888888604051602001610a02969594939291906123be565b6040516020818303038152906040528051906020012090506000610a25826118ae565b90506000610a3382866118c8565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9c90612597565b60405180910390fd5b600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890612617565b60405180910390fd5b60016007600089815260200190815260200160002060006101000a81548160ff021916908315150217905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8a600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168b6040518463ffffffff1660e01b8152600401610bde9392919061231a565b602060405180830381600087803b158015610bf857600080fd5b505af1158015610c0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c309190611ef3565b508973ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518363ffffffff1660e01b8152600401610c8e929190612351565b602060405180830381600087803b158015610ca857600080fd5b505af1158015610cbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce09190611ef3565b508973ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8a868b610d0a9190612885565b6040518363ffffffff1660e01b8152600401610d27929190612351565b602060405180830381600087803b158015610d4157600080fd5b505af1158015610d55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d799190611ef3565b508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f527d36191a6eb96f00471c097a529231027d0e6a04e5feaebb00af9166930daf8c8b604051610dd9929190612351565b60405180910390a35050505060018081905550505050505050565b610dfc6117e2565b73ffffffffffffffffffffffffffffffffffffffff16610e1a610661565b73ffffffffffffffffffffffffffffffffffffffff1614610e70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6790612677565b60405180910390fd5b60026001541415610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ead906126f7565b60405180910390fd5b600260018190555060008211610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef890612557565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610f25610661565b846040518363ffffffff1660e01b8152600401610f43929190612351565b602060405180830381600087803b158015610f5d57600080fd5b505af1158015610f71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f959190611ef3565b503373ffffffffffffffffffffffffffffffffffffffff167f23d6711a1d031134a36921253c75aa59e967d38e369ac625992824315e204f2083604051610fdc9190612717565b60405180910390a2600180819055505050565b610ff76117e2565b73ffffffffffffffffffffffffffffffffffffffff16611015610661565b73ffffffffffffffffffffffffffffffffffffffff161461106b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106290612677565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d2906124d7565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f9c1996a14d26c3ecd833c10222d012447ef07b09b15000f3a34318ff039c0bdc60405160405180910390a250565b61116a6117e2565b73ffffffffffffffffffffffffffffffffffffffff16611188610661565b73ffffffffffffffffffffffffffffffffffffffff16146111de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d590612677565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561124e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611245906124d7565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f6fd0acfc6ab484232ec6afc7d9e6bcb81f69264c9c3cd62f899e3ba3121844a560405160405180910390a250565b60066020528060005260406000206000915090505481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060007ffd9014fb43ddbad6a665dfdc7ec78a778af22c72b228c3b89058c2862ddd1b5c8a8a8a8a8a604051602001611353969594939291906123be565b604051602081830303815290604052805190602001209050611374816118ae565b92506113c48386868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506118c8565b91505097509795505050505050565b60026001541415611419576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611410906126f7565b60405180910390fd5b600260018190555060008211611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90612557565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016114a19392919061231a565b602060405180830381600087803b1580156114bb57600080fd5b505af11580156114cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f39190611ef3565b5081600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461154391906127a4565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fc17cea59c2955cb181b03393209566960365771dbba9dc3d510180e7cb312088836040516115909190612717565b60405180910390a2600180819055505050565b6115ab6117e2565b73ffffffffffffffffffffffffffffffffffffffff166115c9610661565b73ffffffffffffffffffffffffffffffffffffffff161461161f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161690612677565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561168f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611686906125f7565b60405180910390fd5b6001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6116f26117e2565b73ffffffffffffffffffffffffffffffffffffffff16611710610661565b73ffffffffffffffffffffffffffffffffffffffff1614611766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175d90612677565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90612517565b60405180910390fd5b6117df816117ea565b50565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006118c16118bb611977565b83611a3a565b9050919050565b60006041825114156119075760008060006020850151925060408501519150606085015160001a90506118fd86828585611a6d565b9350505050611971565b60408251141561193657600080602084015191506040840151905061192d858383611bf8565b92505050611971565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611968906124f7565b60405180910390fd5b92915050565b60007f00000000000000000000000000000000000000000000000000000000000000014614156119c9577f5cab85301bd2ff7a3fe874ce4aeb3fd3f058d290f1ab2addb78b0814176784039050611a37565b611a347f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fa79e7d2473bf562892f7bb0be6f6084db8974f06275b93cdb731efdbf8666ae57fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6611c42565b90505b90565b60008282604051602001611a4f9291906122c8565b60405160208183030381529060405280519060200120905092915050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115611ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acc906125b7565b60405180910390fd5b601b8460ff161480611aea5750601c8460ff16145b611b29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b20906125d7565b60405180910390fd5b600060018686868660405160008152602001604052604051611b4e9493929190612472565b6020604051602081039080840390855afa158015611b70573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be3906124b7565b60405180910390fd5b80915050949350505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84169150601b8460ff1c019050611c3786828785611a6d565b925050509392505050565b60008383834630604051602001611c5d95949392919061241f565b6040516020818303038152906040528051906020012090509392505050565b6000611c8f611c8a84612757565b612732565b905082815260208101848484011115611ca757600080fd5b611cb2848285612918565b509392505050565b600081359050611cc981612da6565b92915050565b600081519050611cde81612dbd565b92915050565b600081359050611cf381612dd4565b92915050565b60008083601f840112611d0b57600080fd5b8235905067ffffffffffffffff811115611d2457600080fd5b602083019150836001820283011115611d3c57600080fd5b9250929050565b600082601f830112611d5457600080fd5b8135611d64848260208601611c7c565b91505092915050565b600081359050611d7c81612deb565b92915050565b600060208284031215611d9457600080fd5b6000611da284828501611cba565b91505092915050565b600080600080600080600060c0888a031215611dc657600080fd5b6000611dd48a828b01611cba565b9750506020611de58a828b01611cba565b9650506040611df68a828b01611d6d565b9550506060611e078a828b01611ce4565b9450506080611e188a828b01611d6d565b93505060a088013567ffffffffffffffff811115611e3557600080fd5b611e418a828b01611cf9565b925092505092959891949750929550565b60008060008060008060c08789031215611e6b57600080fd5b6000611e7989828a01611cba565b9650506020611e8a89828a01611cba565b9550506040611e9b89828a01611d6d565b9450506060611eac89828a01611ce4565b9350506080611ebd89828a01611d6d565b92505060a087013567ffffffffffffffff811115611eda57600080fd5b611ee689828a01611d43565b9150509295509295509295565b600060208284031215611f0557600080fd5b6000611f1384828501611ccf565b91505092915050565b600060208284031215611f2e57600080fd5b6000611f3c84828501611ce4565b91505092915050565b600060208284031215611f5757600080fd5b6000611f6584828501611d6d565b91505092915050565b60008060408385031215611f8157600080fd5b6000611f8f85828601611d6d565b9250506020611fa085828601611cba565b9150509250929050565b611fb3816128b9565b82525050565b611fc2816128cb565b82525050565b611fd1816128d7565b82525050565b611fe8611fe3826128d7565b612958565b82525050565b6000611ffb601883612788565b915061200682612a00565b602082019050919050565b600061201e600f83612788565b915061202982612a29565b602082019050919050565b6000612041601f83612788565b915061204c82612a52565b602082019050919050565b6000612064602683612788565b915061206f82612a7b565b604082019050919050565b6000612087601a83612788565b915061209282612aca565b602082019050919050565b60006120aa600283612799565b91506120b582612af3565b600282019050919050565b60006120cd602083612788565b91506120d882612b1c565b602082019050919050565b60006120f0601d83612788565b91506120fb82612b45565b602082019050919050565b6000612113601183612788565b915061211e82612b6e565b602082019050919050565b6000612136602283612788565b915061214182612b97565b604082019050919050565b6000612159602283612788565b915061216482612be6565b604082019050919050565b600061217c600a83612788565b915061218782612c35565b602082019050919050565b600061219f600e83612788565b91506121aa82612c5e565b602082019050919050565b60006121c2601e83612788565b91506121cd82612c87565b602082019050919050565b60006121e5601983612788565b91506121f082612cb0565b602082019050919050565b6000612208602083612788565b915061221382612cd9565b602082019050919050565b600061222b601583612788565b915061223682612d02565b602082019050919050565b600061224e601f83612788565b915061225982612d2b565b602082019050919050565b6000612271601583612788565b915061227c82612d54565b602082019050919050565b6000612294601f83612788565b915061229f82612d7d565b602082019050919050565b6122b381612901565b82525050565b6122c28161290b565b82525050565b60006122d38261209d565b91506122df8285611fd7565b6020820191506122ef8284611fd7565b6020820191508190509392505050565b60006020820190506123146000830184611faa565b92915050565b600060608201905061232f6000830186611faa565b61233c6020830185611faa565b61234960408301846122aa565b949350505050565b60006040820190506123666000830185611faa565b61237360208301846122aa565b9392505050565b600060208201905061238f6000830184611fb9565b92915050565b60006040820190506123aa6000830185611fc8565b6123b76020830184611faa565b9392505050565b600060c0820190506123d36000830189611fc8565b6123e06020830188611faa565b6123ed6040830187611faa565b6123fa60608301866122aa565b6124076080830185611fc8565b61241460a08301846122aa565b979650505050505050565b600060a0820190506124346000830188611fc8565b6124416020830187611fc8565b61244e6040830186611fc8565b61245b60608301856122aa565b6124686080830184611faa565b9695505050505050565b60006080820190506124876000830187611fc8565b61249460208301866122b9565b6124a16040830185611fc8565b6124ae6060830184611fc8565b95945050505050565b600060208201905081810360008301526124d081611fee565b9050919050565b600060208201905081810360008301526124f081612011565b9050919050565b6000602082019050818103600083015261251081612034565b9050919050565b6000602082019050818103600083015261253081612057565b9050919050565b600060208201905081810360008301526125508161207a565b9050919050565b60006020820190508181036000830152612570816120c0565b9050919050565b60006020820190508181036000830152612590816120e3565b9050919050565b600060208201905081810360008301526125b081612106565b9050919050565b600060208201905081810360008301526125d081612129565b9050919050565b600060208201905081810360008301526125f08161214c565b9050919050565b600060208201905081810360008301526126108161216f565b9050919050565b6000602082019050818103600083015261263081612192565b9050919050565b60006020820190508181036000830152612650816121b5565b9050919050565b60006020820190508181036000830152612670816121d8565b9050919050565b60006020820190508181036000830152612690816121fb565b9050919050565b600060208201905081810360008301526126b08161221e565b9050919050565b600060208201905081810360008301526126d081612241565b9050919050565b600060208201905081810360008301526126f081612264565b9050919050565b6000602082019050818103600083015261271081612287565b9050919050565b600060208201905061272c60008301846122aa565b92915050565b600061273c61274d565b90506127488282612927565b919050565b6000604051905090565b600067ffffffffffffffff821115612772576127716129c0565b5b61277b826129ef565b9050602081019050919050565b600082825260208201905092915050565b600081905092915050565b60006127af82612901565b91506127ba83612901565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127ef576127ee612962565b5b828201905092915050565b600061280582612901565b915061281083612901565b9250826128205761281f612991565b5b828204905092915050565b600061283682612901565b915061284183612901565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561287a57612879612962565b5b828202905092915050565b600061289082612901565b915061289b83612901565b9250828210156128ae576128ad612962565b5b828203905092915050565b60006128c4826128e1565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b612930826129ef565b810181811067ffffffffffffffff8211171561294f5761294e6129c0565b5b80604052505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f496e76616c696420616464726573730000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53616c742068617320616c7265616479206265656e2075736564000000000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f416d6f756e74206d7573742062652067726561746572207468616e207a65726f600082015250565b7f416d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f426164207369676e657200000000000000000000000000000000000000000000600082015250565b7f496e76616c6964207369676e6572000000000000000000000000000000000000600082015250565b7f43616c6c65722073686f756c642062652074686520726563697069656e740000600082015250565b7f496e76616c696420726563697069656e74206164647265737300000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5369676e61747572652068617320657870697265640000000000000000000000600082015250565b7f416d6f756e74206d7573742062652067726561746572207468616e2066656500600082015250565b7f496e76616c696420746f6b656e20616464726573730000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b612daf816128b9565b8114612dba57600080fd5b50565b612dc6816128cb565b8114612dd157600080fd5b50565b612ddd816128d7565b8114612de857600080fd5b50565b612df481612901565b8114612dff57600080fd5b5056fea2646970667358221220e044f1321cc3f3582eeb28574483a0798ed5c9d0f3daf6bd733c98a4b710eeb564736f6c63430008020033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002fb652314c3d850e9049057bbe9813f1eee882d3000000000000000000000000521a83bb77a6b6b04817c999d0b8e811396247f90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000521a83bb77a6b6b04817c999d0b8e811396247f9
-----Decoded View---------------
Arg [0] : _rvfToken (address): 0x2fb652314C3d850E9049057bBE9813F1eEe882d3
Arg [1] : _feeCollector (address): 0x521A83bb77a6B6B04817C999d0b8e811396247f9
Arg [2] : _swapFee (uint256): 0
Arg [3] : _tokenCollector (address): 0x521A83bb77a6B6B04817C999d0b8e811396247f9
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000002fb652314c3d850e9049057bbe9813f1eee882d3
Arg [1] : 000000000000000000000000521a83bb77a6b6b04817c999d0b8e811396247f9
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 000000000000000000000000521a83bb77a6b6b04817c999d0b8e811396247f9
Deployed Bytecode Sourcemap
31133:7986:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31198:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33889:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31323:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33418:86;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31228:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5179:94;;;:::i;:::-;;31611:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31564:40;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4528:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34803:1882;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37442:348;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34178:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34551:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31463:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31257:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38414:702;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;36866:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33622:150;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5428:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31198:23;;;;;;;;;;;;;:::o;33889:155::-;4759:12;:10;:12::i;:::-;4748:23;;:7;:5;:7::i;:::-;:23;;;4740:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33985:1:::1;33966:21;;:7;:21;;;;33958:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;34020:7;:16;34028:7;34020:16;;;;;;;;;;;;;;;;34013:23;;;;;;;;;;;33889:155:::0;:::o;31323:29::-;;;;;;;;;;;;;:::o;33418:86::-;4759:12;:10;:12::i;:::-;4748:23;;:7;:5;:7::i;:::-;:23;;;4740:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33492:4:::1;33482:7;:14;;;;33418:86:::0;:::o;31228:22::-;;;;:::o;5179:94::-;4759:12;:10;:12::i;:::-;4748:23;;:7;:5;:7::i;:::-;:23;;;4740:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5244:21:::1;5262:1;5244:9;:21::i;:::-;5179:94::o:0;31611:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;31564:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;4528:87::-;4574:7;4601:6;;;;;;;;;;;4594:13;;4528:87;:::o;34803:1882::-;1747:1;2343:7;;:19;;2335:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1747:1;2476:7;:18;;;;35037:9:::1;35023:23;;:10;:23;;;35015:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;35149:1;35140:6;:10;35132:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35198:17;35239:5;35228:7;;35219:6;:16;;;;:::i;:::-;35218:26;;;;:::i;:::-;35198:46;;35312:9;35303:6;:18;35295:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;35395:1;35378:19;;:5;:19;;;;35370:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;35463:1;35442:23;;:9;:23;;;;35434:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35523:1;35514:6;:10;35506:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;31828:13;35587:22;;:15;:22;;;;:::i;:::-;35577:6;:32;;35569:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;35655:8;:14;35664:4;35655:14;;;;;;;;;;;;;;;;;;;;;35654:15;35646:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;35775:18;31893:120;35854:5;35874:9;35898:6;35919:4;35938:6;35806:149;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35796:160;;;;;;35775:181;;35967:14;35984:28;36001:10;35984:16;:28::i;:::-;35967:45;;36023:14;36040:32;36054:6;36062:9;36040:13;:32::i;:::-;36023:49;;36109:1;36091:20;;:6;:20;;;;36083:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;36152:7;:15;36160:6;36152:15;;;;;;;;;;;;;;;;;;;;;;;;;36144:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;36214:4;36197:8;:14;36206:4;36197:14;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36289:8;;;;;;;;;;;36282:29;;;36312:9;36323:14;;;;;;;;;;;36339:6;36282:64;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36413:5;36406:22;;;36429:12;;;;;;;;;;;36443:9;36406:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36515:5;36508:22;;;36531:9;36551;36542:6;:18;;;;:::i;:::-;36508:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36652:9;36623:54;;36644:6;36623:54;;;36663:5;36670:6;36623:54;;;;;;;:::i;:::-;;;;;;;;2507:1;;;;1703::::0;2655:7;:22;;;;34803:1882;;;;;;:::o;37442:348::-;4759:12;:10;:12::i;:::-;4748:23;;:7;:5;:7::i;:::-;:23;;;4740:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1747:1:::1;2343:7;;:19;;2335:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1747:1;2476:7;:18;;;;37594:1:::2;37585:6;:10;37577:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;37693:5;37686:22;;;37709:7;:5;:7::i;:::-;37718:6;37686:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37763:10;37743:39;;;37775:6;37743:39;;;;;;:::i;:::-;;;;;;;;1703:1:::1;2655:7:::0;:22:::1;;;;37442:348:::0;;:::o;34178:230::-;4759:12;:10;:12::i;:::-;4748:23;;:7;:5;:7::i;:::-;:23;;;4740:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34289:1:::1;34264:27;;:13;:27;;;;34256:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;34337:13;34322:12;;:28;;;;;;;;;;;;;;;;;;34386:13;34366:34;;;;;;;;;;;;34178:230:::0;:::o;34551:244::-;4759:12;:10;:12::i;:::-;4748:23;;:7;:5;:7::i;:::-;:23;;;4740:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34668:1:::1;34641:29;;:15;:29;;;;34633:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;34718:15;34701:14;;:32;;;;;;;;;;;;;;;;;;34771:15;34749:38;;;;;;;;;;;;34551:244:::0;:::o;31463:44::-;;;;;;;;;;;;;;;;;:::o;31257:27::-;;;;;;;;;;;;;:::o;38414:702::-;38638:14;38654;38739:18;31893:120;38818:5;38838:9;38862:6;38883:4;38902:6;38770:149;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38760:160;;;;;;38739:181;;38940:28;38957:10;38940:16;:28::i;:::-;38931:37;;39040:32;39054:6;39062:9;;39040:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:32::i;:::-;39031:41;;39085:23;38414:702;;;;;;;;;;:::o;36866:397::-;1747:1;2343:7;;:19;;2335:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1747:1;2476:7;:18;;;;36974:1:::1;36965:6;:10;36957:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;37102:10;37095:31;;;37127:10;37147:4;37154:6;37095:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37197:6;37172:9;:21;37182:10;37172:21;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;37236:10;37221:34;;;37248:6;37221:34;;;;;;:::i;:::-;;;;;;;;1703:1:::0;2655:7;:22;;;;36866:397;;:::o;33622:150::-;4759:12;:10;:12::i;:::-;4748:23;;:7;:5;:7::i;:::-;:23;;;4740:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33713:1:::1;33694:21;;:7;:21;;;;33686:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;33760:4;33741:7;:16;33749:7;33741:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;33622:150:::0;:::o;5428:192::-;4759:12;:10;:12::i;:::-;4748:23;;:7;:5;:7::i;:::-;:23;;;4740:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5537:1:::1;5517:22;;:8;:22;;;;5509:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5593:19;5603:8;5593:9;:19::i;:::-;5428:192:::0;:::o;3316:98::-;3369:7;3396:10;3389:17;;3316:98;:::o;5628:173::-;5684:16;5703:6;;;;;;;;;;;5684:25;;5729:8;5720:6;;:17;;;;;;;;;;;;;;;;;;5784:8;5753:40;;5774:8;5753:40;;;;;;;;;;;;5628:173;;:::o;16093:167::-;16170:7;16197:55;16219:20;:18;:20::i;:::-;16241:10;16197:21;:55::i;:::-;16190:62;;16093:167;;;:::o;7159:1270::-;7237:7;7477:2;7457:9;:16;:22;7453:969;;;7496:9;7520;7544:7;7753:4;7742:9;7738:20;7732:27;7727:32;;7803:4;7792:9;7788:20;7782:27;7777:32;;7861:4;7850:9;7846:20;7840:27;7837:1;7832:36;7827:41;;7904:22;7912:4;7918:1;7921;7924;7904:7;:22::i;:::-;7897:29;;;;;;;7453:969;7968:2;7948:9;:16;:22;7944:478;;;7987:9;8011:10;8223:4;8212:9;8208:20;8202:27;8197:32;;8274:4;8263:9;8259:20;8253:27;8247:33;;8316:20;8324:4;8330:1;8333:2;8316:7;:20::i;:::-;8309:27;;;;;;7944:478;8369:41;;;;;;;;;;:::i;:::-;;;;;;;;7159:1270;;;;;:::o;14899:281::-;14952:7;14993:16;14976:13;:33;14972:201;;;15033:24;15026:31;;;;14972:201;15097:64;15119:10;15131:12;15145:15;15097:21;:64::i;:::-;15090:71;;14899:281;;:::o;11622:196::-;11715:7;11781:15;11798:10;11752:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11742:68;;;;;;11735:75;;11622:196;;;;:::o;9191:1512::-;9319:7;10258:66;10252:1;10244:10;;:80;;10222:164;;;;;;;;;;;;:::i;:::-;;;;;;;;;10410:2;10405:1;:7;;;:18;;;;10421:2;10416:1;:7;;;10405:18;10397:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10560:14;10577:24;10587:4;10593:1;10596;10599;10577:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10560:41;;10638:1;10620:20;;:6;:20;;;;10612:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;10689:6;10682:13;;;9191:1512;;;;;;:::o;8689:371::-;8800:7;8820:9;8840:7;8895:66;8891:2;8887:75;8882:80;;8999:2;8994;8989:3;8985:12;8981:21;8976:26;;9030:22;9038:4;9044:1;9047;9050;9030:7;:22::i;:::-;9023:29;;;;8689:371;;;;;:::o;15188:263::-;15332:7;15380:8;15390;15400:11;15413:13;15436:4;15369:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;15359:84;;;;;;15352:91;;15188:263;;;;;:::o;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:137::-;;586:6;580:13;571:22;;602:30;626:5;602:30;:::i;:::-;561:77;;;;:::o;644:139::-;;728:6;715:20;706:29;;744:33;771:5;744:33;:::i;:::-;696:87;;;;:::o;802:351::-;;;919:3;912:4;904:6;900:17;896:27;886:2;;937:1;934;927:12;886:2;973:6;960:20;950:30;;1003:18;995:6;992:30;989:2;;;1035:1;1032;1025:12;989:2;1072:4;1064:6;1060:17;1048:29;;1126:3;1118:4;1110:6;1106:17;1096:8;1092:32;1089:41;1086:2;;;1143:1;1140;1133:12;1086:2;876:277;;;;;:::o;1172:271::-;;1276:3;1269:4;1261:6;1257:17;1253:27;1243:2;;1294:1;1291;1284:12;1243:2;1334:6;1321:20;1359:78;1433:3;1425:6;1418:4;1410:6;1406:17;1359:78;:::i;:::-;1350:87;;1233:210;;;;;:::o;1449:139::-;;1533:6;1520:20;1511:29;;1549:33;1576:5;1549:33;:::i;:::-;1501:87;;;;:::o;1594:262::-;;1702:2;1690:9;1681:7;1677:23;1673:32;1670:2;;;1718:1;1715;1708:12;1670:2;1761:1;1786:53;1831:7;1822:6;1811:9;1807:22;1786:53;:::i;:::-;1776:63;;1732:117;1660:196;;;;:::o;1862:1121::-;;;;;;;;2074:3;2062:9;2053:7;2049:23;2045:33;2042:2;;;2091:1;2088;2081:12;2042:2;2134:1;2159:53;2204:7;2195:6;2184:9;2180:22;2159:53;:::i;:::-;2149:63;;2105:117;2261:2;2287:53;2332:7;2323:6;2312:9;2308:22;2287:53;:::i;:::-;2277:63;;2232:118;2389:2;2415:53;2460:7;2451:6;2440:9;2436:22;2415:53;:::i;:::-;2405:63;;2360:118;2517:2;2543:53;2588:7;2579:6;2568:9;2564:22;2543:53;:::i;:::-;2533:63;;2488:118;2645:3;2672:53;2717:7;2708:6;2697:9;2693:22;2672:53;:::i;:::-;2662:63;;2616:119;2802:3;2791:9;2787:19;2774:33;2834:18;2826:6;2823:30;2820:2;;;2866:1;2863;2856:12;2820:2;2902:64;2958:7;2949:6;2938:9;2934:22;2902:64;:::i;:::-;2884:82;;;;2745:231;2032:951;;;;;;;;;;:::o;2989:1101::-;;;;;;;3191:3;3179:9;3170:7;3166:23;3162:33;3159:2;;;3208:1;3205;3198:12;3159:2;3251:1;3276:53;3321:7;3312:6;3301:9;3297:22;3276:53;:::i;:::-;3266:63;;3222:117;3378:2;3404:53;3449:7;3440:6;3429:9;3425:22;3404:53;:::i;:::-;3394:63;;3349:118;3506:2;3532:53;3577:7;3568:6;3557:9;3553:22;3532:53;:::i;:::-;3522:63;;3477:118;3634:2;3660:53;3705:7;3696:6;3685:9;3681:22;3660:53;:::i;:::-;3650:63;;3605:118;3762:3;3789:53;3834:7;3825:6;3814:9;3810:22;3789:53;:::i;:::-;3779:63;;3733:119;3919:3;3908:9;3904:19;3891:33;3951:18;3943:6;3940:30;3937:2;;;3983:1;3980;3973:12;3937:2;4011:62;4065:7;4056:6;4045:9;4041:22;4011:62;:::i;:::-;4001:72;;3862:221;3149:941;;;;;;;;:::o;4096:278::-;;4212:2;4200:9;4191:7;4187:23;4183:32;4180:2;;;4228:1;4225;4218:12;4180:2;4271:1;4296:61;4349:7;4340:6;4329:9;4325:22;4296:61;:::i;:::-;4286:71;;4242:125;4170:204;;;;:::o;4380:262::-;;4488:2;4476:9;4467:7;4463:23;4459:32;4456:2;;;4504:1;4501;4494:12;4456:2;4547:1;4572:53;4617:7;4608:6;4597:9;4593:22;4572:53;:::i;:::-;4562:63;;4518:117;4446:196;;;;:::o;4648:262::-;;4756:2;4744:9;4735:7;4731:23;4727:32;4724:2;;;4772:1;4769;4762:12;4724:2;4815:1;4840:53;4885:7;4876:6;4865:9;4861:22;4840:53;:::i;:::-;4830:63;;4786:117;4714:196;;;;:::o;4916:407::-;;;5041:2;5029:9;5020:7;5016:23;5012:32;5009:2;;;5057:1;5054;5047:12;5009:2;5100:1;5125:53;5170:7;5161:6;5150:9;5146:22;5125:53;:::i;:::-;5115:63;;5071:117;5227:2;5253:53;5298:7;5289:6;5278:9;5274:22;5253:53;:::i;:::-;5243:63;;5198:118;4999:324;;;;;:::o;5329:118::-;5416:24;5434:5;5416:24;:::i;:::-;5411:3;5404:37;5394:53;;:::o;5453:109::-;5534:21;5549:5;5534:21;:::i;:::-;5529:3;5522:34;5512:50;;:::o;5568:118::-;5655:24;5673:5;5655:24;:::i;:::-;5650:3;5643:37;5633:53;;:::o;5692:157::-;5797:45;5817:24;5835:5;5817:24;:::i;:::-;5797:45;:::i;:::-;5792:3;5785:58;5775:74;;:::o;5855:366::-;;6018:67;6082:2;6077:3;6018:67;:::i;:::-;6011:74;;6094:93;6183:3;6094:93;:::i;:::-;6212:2;6207:3;6203:12;6196:19;;6001:220;;;:::o;6227:366::-;;6390:67;6454:2;6449:3;6390:67;:::i;:::-;6383:74;;6466:93;6555:3;6466:93;:::i;:::-;6584:2;6579:3;6575:12;6568:19;;6373:220;;;:::o;6599:366::-;;6762:67;6826:2;6821:3;6762:67;:::i;:::-;6755:74;;6838:93;6927:3;6838:93;:::i;:::-;6956:2;6951:3;6947:12;6940:19;;6745:220;;;:::o;6971:366::-;;7134:67;7198:2;7193:3;7134:67;:::i;:::-;7127:74;;7210:93;7299:3;7210:93;:::i;:::-;7328:2;7323:3;7319:12;7312:19;;7117:220;;;:::o;7343:366::-;;7506:67;7570:2;7565:3;7506:67;:::i;:::-;7499:74;;7582:93;7671:3;7582:93;:::i;:::-;7700:2;7695:3;7691:12;7684:19;;7489:220;;;:::o;7715:400::-;;7896:84;7978:1;7973:3;7896:84;:::i;:::-;7889:91;;7989:93;8078:3;7989:93;:::i;:::-;8107:1;8102:3;8098:11;8091:18;;7879:236;;;:::o;8121:366::-;;8284:67;8348:2;8343:3;8284:67;:::i;:::-;8277:74;;8360:93;8449:3;8360:93;:::i;:::-;8478:2;8473:3;8469:12;8462:19;;8267:220;;;:::o;8493:366::-;;8656:67;8720:2;8715:3;8656:67;:::i;:::-;8649:74;;8732:93;8821:3;8732:93;:::i;:::-;8850:2;8845:3;8841:12;8834:19;;8639:220;;;:::o;8865:366::-;;9028:67;9092:2;9087:3;9028:67;:::i;:::-;9021:74;;9104:93;9193:3;9104:93;:::i;:::-;9222:2;9217:3;9213:12;9206:19;;9011:220;;;:::o;9237:366::-;;9400:67;9464:2;9459:3;9400:67;:::i;:::-;9393:74;;9476:93;9565:3;9476:93;:::i;:::-;9594:2;9589:3;9585:12;9578:19;;9383:220;;;:::o;9609:366::-;;9772:67;9836:2;9831:3;9772:67;:::i;:::-;9765:74;;9848:93;9937:3;9848:93;:::i;:::-;9966:2;9961:3;9957:12;9950:19;;9755:220;;;:::o;9981:366::-;;10144:67;10208:2;10203:3;10144:67;:::i;:::-;10137:74;;10220:93;10309:3;10220:93;:::i;:::-;10338:2;10333:3;10329:12;10322:19;;10127:220;;;:::o;10353:366::-;;10516:67;10580:2;10575:3;10516:67;:::i;:::-;10509:74;;10592:93;10681:3;10592:93;:::i;:::-;10710:2;10705:3;10701:12;10694:19;;10499:220;;;:::o;10725:366::-;;10888:67;10952:2;10947:3;10888:67;:::i;:::-;10881:74;;10964:93;11053:3;10964:93;:::i;:::-;11082:2;11077:3;11073:12;11066:19;;10871:220;;;:::o;11097:366::-;;11260:67;11324:2;11319:3;11260:67;:::i;:::-;11253:74;;11336:93;11425:3;11336:93;:::i;:::-;11454:2;11449:3;11445:12;11438:19;;11243:220;;;:::o;11469:366::-;;11632:67;11696:2;11691:3;11632:67;:::i;:::-;11625:74;;11708:93;11797:3;11708:93;:::i;:::-;11826:2;11821:3;11817:12;11810:19;;11615:220;;;:::o;11841:366::-;;12004:67;12068:2;12063:3;12004:67;:::i;:::-;11997:74;;12080:93;12169:3;12080:93;:::i;:::-;12198:2;12193:3;12189:12;12182:19;;11987:220;;;:::o;12213:366::-;;12376:67;12440:2;12435:3;12376:67;:::i;:::-;12369:74;;12452:93;12541:3;12452:93;:::i;:::-;12570:2;12565:3;12561:12;12554:19;;12359:220;;;:::o;12585:366::-;;12748:67;12812:2;12807:3;12748:67;:::i;:::-;12741:74;;12824:93;12913:3;12824:93;:::i;:::-;12942:2;12937:3;12933:12;12926:19;;12731:220;;;:::o;12957:366::-;;13120:67;13184:2;13179:3;13120:67;:::i;:::-;13113:74;;13196:93;13285:3;13196:93;:::i;:::-;13314:2;13309:3;13305:12;13298:19;;13103:220;;;:::o;13329:118::-;13416:24;13434:5;13416:24;:::i;:::-;13411:3;13404:37;13394:53;;:::o;13453:112::-;13536:22;13552:5;13536:22;:::i;:::-;13531:3;13524:35;13514:51;;:::o;13571:663::-;;13834:148;13978:3;13834:148;:::i;:::-;13827:155;;13992:75;14063:3;14054:6;13992:75;:::i;:::-;14092:2;14087:3;14083:12;14076:19;;14105:75;14176:3;14167:6;14105:75;:::i;:::-;14205:2;14200:3;14196:12;14189:19;;14225:3;14218:10;;13816:418;;;;;:::o;14240:222::-;;14371:2;14360:9;14356:18;14348:26;;14384:71;14452:1;14441:9;14437:17;14428:6;14384:71;:::i;:::-;14338:124;;;;:::o;14468:442::-;;14655:2;14644:9;14640:18;14632:26;;14668:71;14736:1;14725:9;14721:17;14712:6;14668:71;:::i;:::-;14749:72;14817:2;14806:9;14802:18;14793:6;14749:72;:::i;:::-;14831;14899:2;14888:9;14884:18;14875:6;14831:72;:::i;:::-;14622:288;;;;;;:::o;14916:332::-;;15075:2;15064:9;15060:18;15052:26;;15088:71;15156:1;15145:9;15141:17;15132:6;15088:71;:::i;:::-;15169:72;15237:2;15226:9;15222:18;15213:6;15169:72;:::i;:::-;15042:206;;;;;:::o;15254:210::-;;15379:2;15368:9;15364:18;15356:26;;15392:65;15454:1;15443:9;15439:17;15430:6;15392:65;:::i;:::-;15346:118;;;;:::o;15470:332::-;;15629:2;15618:9;15614:18;15606:26;;15642:71;15710:1;15699:9;15695:17;15686:6;15642:71;:::i;:::-;15723:72;15791:2;15780:9;15776:18;15767:6;15723:72;:::i;:::-;15596:206;;;;;:::o;15808:775::-;;16079:3;16068:9;16064:19;16056:27;;16093:71;16161:1;16150:9;16146:17;16137:6;16093:71;:::i;:::-;16174:72;16242:2;16231:9;16227:18;16218:6;16174:72;:::i;:::-;16256;16324:2;16313:9;16309:18;16300:6;16256:72;:::i;:::-;16338;16406:2;16395:9;16391:18;16382:6;16338:72;:::i;:::-;16420:73;16488:3;16477:9;16473:19;16464:6;16420:73;:::i;:::-;16503;16571:3;16560:9;16556:19;16547:6;16503:73;:::i;:::-;16046:537;;;;;;;;;:::o;16589:664::-;;16832:3;16821:9;16817:19;16809:27;;16846:71;16914:1;16903:9;16899:17;16890:6;16846:71;:::i;:::-;16927:72;16995:2;16984:9;16980:18;16971:6;16927:72;:::i;:::-;17009;17077:2;17066:9;17062:18;17053:6;17009:72;:::i;:::-;17091;17159:2;17148:9;17144:18;17135:6;17091:72;:::i;:::-;17173:73;17241:3;17230:9;17226:19;17217:6;17173:73;:::i;:::-;16799:454;;;;;;;;:::o;17259:545::-;;17470:3;17459:9;17455:19;17447:27;;17484:71;17552:1;17541:9;17537:17;17528:6;17484:71;:::i;:::-;17565:68;17629:2;17618:9;17614:18;17605:6;17565:68;:::i;:::-;17643:72;17711:2;17700:9;17696:18;17687:6;17643:72;:::i;:::-;17725;17793:2;17782:9;17778:18;17769:6;17725:72;:::i;:::-;17437:367;;;;;;;:::o;17810:419::-;;18014:2;18003:9;17999:18;17991:26;;18063:9;18057:4;18053:20;18049:1;18038:9;18034:17;18027:47;18091:131;18217:4;18091:131;:::i;:::-;18083:139;;17981:248;;;:::o;18235:419::-;;18439:2;18428:9;18424:18;18416:26;;18488:9;18482:4;18478:20;18474:1;18463:9;18459:17;18452:47;18516:131;18642:4;18516:131;:::i;:::-;18508:139;;18406:248;;;:::o;18660:419::-;;18864:2;18853:9;18849:18;18841:26;;18913:9;18907:4;18903:20;18899:1;18888:9;18884:17;18877:47;18941:131;19067:4;18941:131;:::i;:::-;18933:139;;18831:248;;;:::o;19085:419::-;;19289:2;19278:9;19274:18;19266:26;;19338:9;19332:4;19328:20;19324:1;19313:9;19309:17;19302:47;19366:131;19492:4;19366:131;:::i;:::-;19358:139;;19256:248;;;:::o;19510:419::-;;19714:2;19703:9;19699:18;19691:26;;19763:9;19757:4;19753:20;19749:1;19738:9;19734:17;19727:47;19791:131;19917:4;19791:131;:::i;:::-;19783:139;;19681:248;;;:::o;19935:419::-;;20139:2;20128:9;20124:18;20116:26;;20188:9;20182:4;20178:20;20174:1;20163:9;20159:17;20152:47;20216:131;20342:4;20216:131;:::i;:::-;20208:139;;20106:248;;;:::o;20360:419::-;;20564:2;20553:9;20549:18;20541:26;;20613:9;20607:4;20603:20;20599:1;20588:9;20584:17;20577:47;20641:131;20767:4;20641:131;:::i;:::-;20633:139;;20531:248;;;:::o;20785:419::-;;20989:2;20978:9;20974:18;20966:26;;21038:9;21032:4;21028:20;21024:1;21013:9;21009:17;21002:47;21066:131;21192:4;21066:131;:::i;:::-;21058:139;;20956:248;;;:::o;21210:419::-;;21414:2;21403:9;21399:18;21391:26;;21463:9;21457:4;21453:20;21449:1;21438:9;21434:17;21427:47;21491:131;21617:4;21491:131;:::i;:::-;21483:139;;21381:248;;;:::o;21635:419::-;;21839:2;21828:9;21824:18;21816:26;;21888:9;21882:4;21878:20;21874:1;21863:9;21859:17;21852:47;21916:131;22042:4;21916:131;:::i;:::-;21908:139;;21806:248;;;:::o;22060:419::-;;22264:2;22253:9;22249:18;22241:26;;22313:9;22307:4;22303:20;22299:1;22288:9;22284:17;22277:47;22341:131;22467:4;22341:131;:::i;:::-;22333:139;;22231:248;;;:::o;22485:419::-;;22689:2;22678:9;22674:18;22666:26;;22738:9;22732:4;22728:20;22724:1;22713:9;22709:17;22702:47;22766:131;22892:4;22766:131;:::i;:::-;22758:139;;22656:248;;;:::o;22910:419::-;;23114:2;23103:9;23099:18;23091:26;;23163:9;23157:4;23153:20;23149:1;23138:9;23134:17;23127:47;23191:131;23317:4;23191:131;:::i;:::-;23183:139;;23081:248;;;:::o;23335:419::-;;23539:2;23528:9;23524:18;23516:26;;23588:9;23582:4;23578:20;23574:1;23563:9;23559:17;23552:47;23616:131;23742:4;23616:131;:::i;:::-;23608:139;;23506:248;;;:::o;23760:419::-;;23964:2;23953:9;23949:18;23941:26;;24013:9;24007:4;24003:20;23999:1;23988:9;23984:17;23977:47;24041:131;24167:4;24041:131;:::i;:::-;24033:139;;23931:248;;;:::o;24185:419::-;;24389:2;24378:9;24374:18;24366:26;;24438:9;24432:4;24428:20;24424:1;24413:9;24409:17;24402:47;24466:131;24592:4;24466:131;:::i;:::-;24458:139;;24356:248;;;:::o;24610:419::-;;24814:2;24803:9;24799:18;24791:26;;24863:9;24857:4;24853:20;24849:1;24838:9;24834:17;24827:47;24891:131;25017:4;24891:131;:::i;:::-;24883:139;;24781:248;;;:::o;25035:419::-;;25239:2;25228:9;25224:18;25216:26;;25288:9;25282:4;25278:20;25274:1;25263:9;25259:17;25252:47;25316:131;25442:4;25316:131;:::i;:::-;25308:139;;25206:248;;;:::o;25460:419::-;;25664:2;25653:9;25649:18;25641:26;;25713:9;25707:4;25703:20;25699:1;25688:9;25684:17;25677:47;25741:131;25867:4;25741:131;:::i;:::-;25733:139;;25631:248;;;:::o;25885:222::-;;26016:2;26005:9;26001:18;25993:26;;26029:71;26097:1;26086:9;26082:17;26073:6;26029:71;:::i;:::-;25983:124;;;;:::o;26113:129::-;;26174:20;;:::i;:::-;26164:30;;26203:33;26231:4;26223:6;26203:33;:::i;:::-;26154:88;;;:::o;26248:75::-;;26314:2;26308:9;26298:19;;26288:35;:::o;26329:307::-;;26480:18;26472:6;26469:30;26466:2;;;26502:18;;:::i;:::-;26466:2;26540:29;26562:6;26540:29;:::i;:::-;26532:37;;26624:4;26618;26614:15;26606:23;;26395:241;;;:::o;26642:169::-;;26760:6;26755:3;26748:19;26800:4;26795:3;26791:14;26776:29;;26738:73;;;;:::o;26817:148::-;;26956:3;26941:18;;26931:34;;;;:::o;26971:305::-;;27030:20;27048:1;27030:20;:::i;:::-;27025:25;;27064:20;27082:1;27064:20;:::i;:::-;27059:25;;27218:1;27150:66;27146:74;27143:1;27140:81;27137:2;;;27224:18;;:::i;:::-;27137:2;27268:1;27265;27261:9;27254:16;;27015:261;;;;:::o;27282:185::-;;27339:20;27357:1;27339:20;:::i;:::-;27334:25;;27373:20;27391:1;27373:20;:::i;:::-;27368:25;;27412:1;27402:2;;27417:18;;:::i;:::-;27402:2;27459:1;27456;27452:9;27447:14;;27324:143;;;;:::o;27473:348::-;;27536:20;27554:1;27536:20;:::i;:::-;27531:25;;27570:20;27588:1;27570:20;:::i;:::-;27565:25;;27758:1;27690:66;27686:74;27683:1;27680:81;27675:1;27668:9;27661:17;27657:105;27654:2;;;27765:18;;:::i;:::-;27654:2;27813:1;27810;27806:9;27795:20;;27521:300;;;;:::o;27827:191::-;;27887:20;27905:1;27887:20;:::i;:::-;27882:25;;27921:20;27939:1;27921:20;:::i;:::-;27916:25;;27960:1;27957;27954:8;27951:2;;;27965:18;;:::i;:::-;27951:2;28010:1;28007;28003:9;27995:17;;27872:146;;;;:::o;28024:96::-;;28090:24;28108:5;28090:24;:::i;:::-;28079:35;;28069:51;;;:::o;28126:90::-;;28203:5;28196:13;28189:21;28178:32;;28168:48;;;:::o;28222:77::-;;28288:5;28277:16;;28267:32;;;:::o;28305:126::-;;28382:42;28375:5;28371:54;28360:65;;28350:81;;;:::o;28437:77::-;;28503:5;28492:16;;28482:32;;;:::o;28520:86::-;;28595:4;28588:5;28584:16;28573:27;;28563:43;;;:::o;28612:154::-;28696:6;28691:3;28686;28673:30;28758:1;28749:6;28744:3;28740:16;28733:27;28663:103;;;:::o;28772:281::-;28855:27;28877:4;28855:27;:::i;:::-;28847:6;28843:40;28985:6;28973:10;28970:22;28949:18;28937:10;28934:34;28931:62;28928:2;;;28996:18;;:::i;:::-;28928:2;29036:10;29032:2;29025:22;28815:238;;;:::o;29059:79::-;;29127:5;29116:16;;29106:32;;;:::o;29144:180::-;29192:77;29189:1;29182:88;29289:4;29286:1;29279:15;29313:4;29310:1;29303:15;29330:180;29378:77;29375:1;29368:88;29475:4;29472:1;29465:15;29499:4;29496:1;29489:15;29516:180;29564:77;29561:1;29554:88;29661:4;29658:1;29651:15;29685:4;29682:1;29675:15;29702:102;;29794:2;29790:7;29785:2;29778:5;29774:14;29770:28;29760:38;;29750:54;;;:::o;29810:174::-;29950:26;29946:1;29938:6;29934:14;29927:50;29916:68;:::o;29990:165::-;30130:17;30126:1;30118:6;30114:14;30107:41;30096:59;:::o;30161:181::-;30301:33;30297:1;30289:6;30285:14;30278:57;30267:75;:::o;30348:225::-;30488:34;30484:1;30476:6;30472:14;30465:58;30557:8;30552:2;30544:6;30540:15;30533:33;30454:119;:::o;30579:176::-;30719:28;30715:1;30707:6;30703:14;30696:52;30685:70;:::o;30761:214::-;30901:66;30897:1;30889:6;30885:14;30878:90;30867:108;:::o;30981:182::-;31121:34;31117:1;31109:6;31105:14;31098:58;31087:76;:::o;31169:179::-;31309:31;31305:1;31297:6;31293:14;31286:55;31275:73;:::o;31354:167::-;31494:19;31490:1;31482:6;31478:14;31471:43;31460:61;:::o;31527:221::-;31667:34;31663:1;31655:6;31651:14;31644:58;31736:4;31731:2;31723:6;31719:15;31712:29;31633:115;:::o;31754:221::-;31894:34;31890:1;31882:6;31878:14;31871:58;31963:4;31958:2;31950:6;31946:15;31939:29;31860:115;:::o;31981:160::-;32121:12;32117:1;32109:6;32105:14;32098:36;32087:54;:::o;32147:164::-;32287:16;32283:1;32275:6;32271:14;32264:40;32253:58;:::o;32317:180::-;32457:32;32453:1;32445:6;32441:14;32434:56;32423:74;:::o;32503:175::-;32643:27;32639:1;32631:6;32627:14;32620:51;32609:69;:::o;32684:182::-;32824:34;32820:1;32812:6;32808:14;32801:58;32790:76;:::o;32872:171::-;33012:23;33008:1;33000:6;32996:14;32989:47;32978:65;:::o;33049:181::-;33189:33;33185:1;33177:6;33173:14;33166:57;33155:75;:::o;33236:171::-;33376:23;33372:1;33364:6;33360:14;33353:47;33342:65;:::o;33413:181::-;33553:33;33549:1;33541:6;33537:14;33530:57;33519:75;:::o;33600:122::-;33673:24;33691:5;33673:24;:::i;:::-;33666:5;33663:35;33653:2;;33712:1;33709;33702:12;33653:2;33643:79;:::o;33728:116::-;33798:21;33813:5;33798:21;:::i;:::-;33791:5;33788:32;33778:2;;33834:1;33831;33824:12;33778:2;33768:76;:::o;33850:122::-;33923:24;33941:5;33923:24;:::i;:::-;33916:5;33913:35;33903:2;;33962:1;33959;33952:12;33903:2;33893:79;:::o;33978:122::-;34051:24;34069:5;34051:24;:::i;:::-;34044:5;34041:35;34031:2;;34090:1;34087;34080:12;34031:2;34021:79;:::o
Swarm Source
ipfs://e044f1321cc3f3582eeb28574483a0798ed5c9d0f3daf6bd733c98a4b710eeb5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.