Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 333 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint | 22294681 | 8 hrs ago | IN | 0 ETH | 0.00014837 | ||||
Mint | 22292987 | 14 hrs ago | IN | 0 ETH | 0.00011974 | ||||
Mint | 22289580 | 25 hrs ago | IN | 0 ETH | 0.00042058 | ||||
Mint | 22286934 | 34 hrs ago | IN | 0 ETH | 0.00013158 | ||||
Mint | 22286609 | 35 hrs ago | IN | 0 ETH | 0.00017995 | ||||
Mint | 22284563 | 42 hrs ago | IN | 0 ETH | 0.00026375 | ||||
Mint | 22280961 | 2 days ago | IN | 0 ETH | 0.00025444 | ||||
Mint | 22276384 | 2 days ago | IN | 0 ETH | 0.00021658 | ||||
Mint | 22276062 | 2 days ago | IN | 0 ETH | 0.00033051 | ||||
Mint | 22275277 | 3 days ago | IN | 0 ETH | 0.00033204 | ||||
Mint | 22275033 | 3 days ago | IN | 0 ETH | 0.00048966 | ||||
Mint | 22274046 | 3 days ago | IN | 0 ETH | 0.00013191 | ||||
Mint | 22274013 | 3 days ago | IN | 0 ETH | 0.00011956 | ||||
Mint | 22273522 | 3 days ago | IN | 0 ETH | 0.00027198 | ||||
Mint | 22273132 | 3 days ago | IN | 0 ETH | 0.00010681 | ||||
Mint | 22272266 | 3 days ago | IN | 0 ETH | 0.00014532 | ||||
Mint | 22272097 | 3 days ago | IN | 0 ETH | 0.00011383 | ||||
Mint | 22272080 | 3 days ago | IN | 0 ETH | 0.00011999 | ||||
Mint | 22268757 | 3 days ago | IN | 0 ETH | 0.00064012 | ||||
Mint | 22268646 | 3 days ago | IN | 0 ETH | 0.0008625 | ||||
Mint | 22268636 | 3 days ago | IN | 0 ETH | 0.00107565 | ||||
Mint | 22267773 | 4 days ago | IN | 0 ETH | 0.00082135 | ||||
Mint | 22266494 | 4 days ago | IN | 0 ETH | 0.00021214 | ||||
Mint | 22260220 | 5 days ago | IN | 0 ETH | 0.00026707 | ||||
Mint | 22255447 | 5 days ago | IN | 0 ETH | 0.00012511 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Minter
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.3; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "./interfaces/chainlink/IAggregatorV3.sol"; import "./interfaces/compound/ICompound.sol"; import "./interfaces/IVUSD.sol"; /// @title Minter contract which will mint VUSD 1:1, less minting fee, with DAI, USDC or USDT. contract Minter is Context, ReentrancyGuard { using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.AddressSet; string public constant NAME = "VUSD-Minter"; string public constant VERSION = "1.4.1"; IVUSD public immutable vusd; uint256 public mintingFee; // Default no fee uint256 public maxMintLimit; // Maximum VUSD can be minted uint256 public constant MAX_BPS = 10_000; // 10_000 = 100% uint256 public priceTolerance = 100; // 1% based on BPS // Token => cToken mapping mapping(address => address) public cTokens; // Token => oracle mapping mapping(address => address) public oracles; EnumerableSet.AddressSet private _whitelistedTokens; // Default whitelist token addresses address private constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F; address private constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; address private constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7; // cToken addresses for default whitelisted tokens //solhint-disable const-name-snakecase address private constant cDAI = 0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643; address private constant cUSDC = 0x39AA39c021dfbaE8faC545936693aC917d5E7563; address private constant cUSDT = 0xf650C3d88D12dB855b8bf7D11Be6C55A4e07dCC9; // Chainlink price oracle for default whitelisted tokens address private constant DAI_USD = 0xAed0c38402a5d19df6E4c03F4E2DceD6e29c1ee9; address private constant USDC_USD = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; address private constant USDT_USD = 0x3E7d1eAB13ad0104d2750B8863b489D65364e32D; event UpdatedMintingFee(uint256 previousMintingFee, uint256 newMintingFee); event UpdatedPriceTolerance(uint256 previousPriceTolerance, uint256 newPriceTolerance); event MintingLimitUpdated(uint256 previousMintLimit, uint256 newMintLimit); event Mint( address indexed tokenIn, uint256 amountIn, uint256 amountInAfterTransferFee, uint256 mintage, address receiver ); event WhitelistedTokenAdded(address indexed token, address cToken, address oracle); event WhitelistedTokenRemoved(address indexed token); constructor(address _vusd, uint256 _maxMintLimit) { require(_vusd != address(0), "vusd-address-is-zero"); vusd = IVUSD(_vusd); maxMintLimit = _maxMintLimit; // Add token into the list, add oracle and cToken into the mapping and approve cToken to spend token _addToken(DAI, cDAI, DAI_USD); _addToken(USDC, cUSDC, USDC_USD); _addToken(USDT, cUSDT, USDT_USD); } modifier onlyGovernor() { require(_msgSender() == governor(), "caller-is-not-the-governor"); _; } ////////////////////////////// Only Governor ////////////////////////////// /** * @notice Add token as whitelisted token for VUSD system * @dev Add token address in whitelistedTokens list and add cToken in mapping * @param _token address which we want to add in token list. * @param _cToken CToken address correspond to _token * @param _oracle Chainlink oracle address for token/USD feed */ function addWhitelistedToken( address _token, address _cToken, address _oracle ) external onlyGovernor { require(_token != address(0), "token-address-is-zero"); require(_cToken != address(0), "cToken-address-is-zero"); require(_oracle != address(0), "oracle-address-is-zero"); _addToken(_token, _cToken, _oracle); } /** * @notice Remove token from whitelisted tokens * @param _token address which we want to remove from token list. */ function removeWhitelistedToken(address _token) external onlyGovernor { require(_whitelistedTokens.remove(_token), "remove-from-list-failed"); IERC20(_token).safeApprove(cTokens[_token], 0); delete cTokens[_token]; delete oracles[_token]; emit WhitelistedTokenRemoved(_token); } /** * @notice Mint request amount of VUSD and use minted VUSD to add liquidity * @param _amount Amount of VUSD to mint */ function mint(uint256 _amount) external onlyGovernor { uint256 _availableMintage = availableMintage(); require(_availableMintage >= _amount, "mint-limit-reached"); vusd.mint(_msgSender(), _amount); } /// @notice Update minting fee function updateMintingFee(uint256 _newMintingFee) external onlyGovernor { require(_newMintingFee <= MAX_BPS, "minting-fee-limit-reached"); require(mintingFee != _newMintingFee, "same-minting-fee"); emit UpdatedMintingFee(mintingFee, _newMintingFee); mintingFee = _newMintingFee; } function updateMaxMintAmount(uint256 _newMintLimit) external onlyGovernor { uint256 _currentMintLimit = maxMintLimit; require(_currentMintLimit != _newMintLimit, "same-mint-limit"); emit MintingLimitUpdated(_currentMintLimit, _newMintLimit); maxMintLimit = _newMintLimit; } /// @notice Update price deviation limit function updatePriceTolerance(uint256 _newPriceTolerance) external onlyGovernor { require(_newPriceTolerance <= MAX_BPS, "price-deviation-is-invalid"); uint256 _currentPriceTolerance = priceTolerance; require(_currentPriceTolerance != _newPriceTolerance, "same-price-deviation-limit"); emit UpdatedPriceTolerance(_currentPriceTolerance, _newPriceTolerance); priceTolerance = _newPriceTolerance; } /////////////////////////////////////////////////////////////////////////// /** * @notice Mint VUSD * @param _token Address of token being deposited * @param _amountIn Amount of _token being sent to mint VUSD amount. */ function mint(address _token, uint256 _amountIn) external nonReentrant { _mint(_token, _amountIn, _msgSender()); } /** * @notice Mint VUSD * @param _token Address of token being deposited * @param _amountIn Amount of _token * @param _receiver Address of VUSD receiver */ function mint( address _token, uint256 _amountIn, address _receiver ) external nonReentrant { _mint(_token, _amountIn, _receiver); } /** * @notice Calculate minting amount of VUSD for given _token and its amountIn. * @param _token Address of token which will be deposited for this mintage * @param _amountIn Amount of _token being sent to calculate VUSD mintage. * @return _mintage VUSD mintage based on given input * @dev _amountIn is amount received after transfer fee if there is any. */ function calculateMintage(address _token, uint256 _amountIn) external view returns (uint256 _mintage) { if (_whitelistedTokens.contains(_token)) { _mintage = _calculateMintage(_token, _amountIn); } } /// @notice Returns whether given address is whitelisted or not function isWhitelistedToken(address _address) external view returns (bool) { return _whitelistedTokens.contains(_address); } /// @notice Return list of whitelisted tokens function whitelistedTokens() external view returns (address[] memory) { return _whitelistedTokens.values(); } /// @notice Check available mintage based on mint limit function availableMintage() public view returns (uint256 _mintage) { uint256 _totalSupply = vusd.totalSupply(); uint256 _mintageLimit = maxMintLimit; if (_mintageLimit > _totalSupply) { _mintage = _mintageLimit - _totalSupply; } } /// @dev Treasury is defined in VUSD token contract only function treasury() public view returns (address) { return vusd.treasury(); } /// @dev Governor is defined in VUSD token contract only function governor() public view returns (address) { return vusd.governor(); } /** * @dev Add _token into the list, add _cToken in mapping and * approve cToken to spend token */ function _addToken( address _token, address _cToken, address _oracle ) internal { require(_whitelistedTokens.add(_token), "add-in-list-failed"); uint8 _oracleDecimal = IAggregatorV3(_oracle).decimals(); (, int256 _price, , , ) = IAggregatorV3(_oracle).latestRoundData(); uint256 _latestPrice = uint256(_price); // Token is expected to be stable coin only. Ideal price is 1 USD uint256 _oneUSD = 10**_oracleDecimal; uint256 _priceTolerance = (_oneUSD * priceTolerance) / MAX_BPS; uint256 _priceUpperBound = _oneUSD + _priceTolerance; uint256 _priceLowerBound = _oneUSD - _priceTolerance; // Avoid accidentally add wrong oracle or non-stable coin. require(_latestPrice <= _priceUpperBound && _latestPrice >= _priceLowerBound, "price-is-invalid"); oracles[_token] = _oracle; cTokens[_token] = _cToken; IERC20(_token).safeApprove(_cToken, type(uint256).max); emit WhitelistedTokenAdded(_token, _cToken, _oracle); } /** * @notice Mint VUSD * @param _token Address of token being deposited * @param _amountIn Amount of _token * @param _receiver Address of VUSD receiver */ function _mint( address _token, uint256 _amountIn, address _receiver ) internal returns (uint256 _mintage) { require(_whitelistedTokens.contains(_token), "token-is-not-supported"); uint256 _balanceBefore = IERC20(_token).balanceOf(address(this)); IERC20(_token).safeTransferFrom(_msgSender(), address(this), _amountIn); uint256 _balanceAfter = IERC20(_token).balanceOf(address(this)); uint256 _actualAmountIn = _balanceAfter - _balanceBefore; _mintage = _calculateMintage(_token, _actualAmountIn); address _cToken = cTokens[_token]; require(CToken(_cToken).mint(_balanceAfter) == 0, "cToken-mint-failed"); IERC20(_cToken).safeTransfer(treasury(), IERC20(_cToken).balanceOf(address(this))); vusd.mint(_receiver, _mintage); emit Mint(_token, _amountIn, _actualAmountIn, _mintage, _receiver); } /** * @notice Calculate mintage based on mintingFee, if any. * Also covert _token defined decimal amount to 18 decimal amount * @return _mintage VUSD mintage based on given input */ function _calculateMintage(address _token, uint256 _amountIn) internal view returns (uint256 _mintage) { IAggregatorV3 _oracle = IAggregatorV3(oracles[_token]); uint8 _oracleDecimal = IAggregatorV3(_oracle).decimals(); (, int256 _price, , , ) = IAggregatorV3(_oracle).latestRoundData(); uint256 _latestPrice = uint256(_price); // Token is expected to be stable coin only. Ideal price is 1 USD uint256 _oneUSD = 10**_oracleDecimal; uint256 _priceTolerance = (_oneUSD * priceTolerance) / MAX_BPS; uint256 _priceUpperBound = _oneUSD + _priceTolerance; uint256 _priceLowerBound = _oneUSD - _priceTolerance; require(_latestPrice <= _priceUpperBound && _latestPrice >= _priceLowerBound, "oracle-price-exceed-tolerance"); uint256 _actualAmountIn = (_amountIn * (MAX_BPS - mintingFee)) / MAX_BPS; _mintage = (_actualAmountIn * _latestPrice) / _oneUSD; _mintage = _mintage * 10**(18 - IERC20Metadata(_token).decimals()); uint256 _availableMintage = availableMintage(); require(_availableMintage >= _mintage, "mint-limit-reached"); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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 making 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @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"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.3; import "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IVUSD is IERC20, IERC20Permit { function burnFrom(address _user, uint256 _amount) external; function mint(address _to, uint256 _amount) external; function multiTransfer(address[] memory _recipients, uint256[] memory _amounts) external returns (bool); function updateMinter(address _newMinter) external; function updateTreasury(address _newTreasury) external; function governor() external view returns (address _governor); function minter() external view returns (address _minter); function treasury() external view returns (address _treasury); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.3; interface IAggregatorV3 { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); // getRoundData and latestRoundData should both raise "No data present" // if they do not have data to report, instead of returning unset values // which could be misinterpreted as actual reported values. function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.3; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface CToken is IERC20 { function accrueInterest() external returns (uint256); function balanceOfUnderlying(address owner) external returns (uint256); function exchangeRateCurrent() external returns (uint256); function exchangeRateStored() external view returns (uint256); function mint() external payable; // For ETH function mint(uint256 mintAmount) external returns (uint256); // For ERC20 function redeem(uint256 redeemTokens) external returns (uint256); function redeemUnderlying(uint256 redeemAmount) external returns (uint256); } interface Comptroller { function claimComp(address holder, address[] memory) external; function compAccrued(address holder) external view returns (uint256); }
{ "evmVersion": "istanbul", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": false, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_vusd","type":"address"},{"internalType":"uint256","name":"_maxMintLimit","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountInAfterTransferFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintage","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousMintLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMintLimit","type":"uint256"}],"name":"MintingLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousMintingFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMintingFee","type":"uint256"}],"name":"UpdatedMintingFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousPriceTolerance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPriceTolerance","type":"uint256"}],"name":"UpdatedPriceTolerance","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"cToken","type":"address"},{"indexed":false,"internalType":"address","name":"oracle","type":"address"}],"name":"WhitelistedTokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"WhitelistedTokenRemoved","type":"event"},{"inputs":[],"name":"MAX_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_cToken","type":"address"},{"internalType":"address","name":"_oracle","type":"address"}],"name":"addWhitelistedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableMintage","outputs":[{"internalType":"uint256","name":"_mintage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"cTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"name":"calculateMintage","outputs":[{"internalType":"uint256","name":"_mintage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelistedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"oracles","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceTolerance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"removeWhitelistedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMintLimit","type":"uint256"}],"name":"updateMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMintingFee","type":"uint256"}],"name":"updateMintingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPriceTolerance","type":"uint256"}],"name":"updatePriceTolerance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vusd","outputs":[{"internalType":"contract IVUSD","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistedTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a060405260646003553480156200001657600080fd5b5060405162004ff338038062004ff383398181016040528101906200003c919062000b27565b6001600081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620000b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000ae9062000eb0565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250508060028190555062000144736b175474e89094c44da98b954eedeac495271d0f735d3a536e4d6dbd6114cc1ead35777bab948e364373aed0c38402a5d19df6e4c03f4e2dced6e29c1ee9620001ea60201b60201c565b6200019373a0b86991c6218b36c1d19d4a2e9eb0ce3606eb487339aa39c021dfbae8fac545936693ac917d5e7563738fffffd4afb6115b954bd326cbe7b4ba576818f6620001ea60201b60201c565b620001e273dac17f958d2ee523a2206206994597c13d831ec773f650c3d88d12db855b8bf7d11be6c55a4e07dcc9733e7d1eab13ad0104d2750b8863b489d65364e32d620001ea60201b60201c565b5050620015ef565b62000205836006620005b560201b620011d71790919060201c565b62000247576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200023e9062000ef4565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200029057600080fd5b505afa158015620002a5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002cb919062000c42565b905060008273ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156200031657600080fd5b505afa1580156200032b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000351919062000bc0565b5050509150506000819050600083600a6200036d9190620010c0565b9050600061271060035483620003849190620011fd565b6200039091906200102d565b905060008183620003a2919062000fd0565b905060008284620003b491906200125e565b9050818511158015620003c75750808510155b62000409576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004009062000f16565b60405180910390fd5b87600560008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000557897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c73ffffffffffffffffffffffffffffffffffffffff16620005ed60201b62001207179092919060201c565b8973ffffffffffffffffffffffffffffffffffffffff167ff264178f70a222c6991bf4849b98c3722e9f54b6e89d1fb550509113e60ae0b78a8a604051620005a192919062000e32565b60405180910390a250505050505050505050565b6000620005e5836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200075f60201b60201c565b905092915050565b60008114806200068d575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b81526004016200063792919062000e32565b60206040518083038186803b1580156200065057600080fd5b505afa15801562000665573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200068b919062000b94565b145b620006cf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006c69062000f7c565b60405180910390fd5b6200075a8363095ea7b360e01b8484604051602401620006f192919062000e5f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050620007d960201b60201c565b505050565b6000620007738383620008ad60201b60201c565b620007ce578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050620007d3565b600090505b92915050565b600062000842826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620008d060201b62001365179092919060201c565b9050600081511115620008a8578080602001905181019062000865919062000b68565b620008a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200089e9062000f5a565b60405180910390fd5b5b505050565b600080836001016000848152602001908152602001600020541415905092915050565b6060620008e78484600085620008f060201b60201c565b90509392505050565b60608247101562000938576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200092f9062000ed2565b60405180910390fd5b620009498562000a1e60201b60201c565b6200098b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009829062000f38565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051620009b6919062000e19565b60006040518083038185875af1925050503d8060008114620009f5576040519150601f19603f3d011682016040523d82523d6000602084013e620009fa565b606091505b509150915062000a1282828662000a3160201b60201c565b92505050949350505050565b600080823b905060008111915050919050565b6060831562000a435782905062000a96565b60008351111562000a575782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a8d919062000e8c565b60405180910390fd5b9392505050565b60008151905062000aae8162001553565b92915050565b60008151905062000ac5816200156d565b92915050565b60008151905062000adc8162001587565b92915050565b60008151905062000af381620015a1565b92915050565b60008151905062000b0a81620015d5565b92915050565b60008151905062000b2181620015bb565b92915050565b6000806040838503121562000b3b57600080fd5b600062000b4b8582860162000a9d565b925050602062000b5e8582860162000ae2565b9150509250929050565b60006020828403121562000b7b57600080fd5b600062000b8b8482850162000ab4565b91505092915050565b60006020828403121562000ba757600080fd5b600062000bb78482850162000ae2565b91505092915050565b600080600080600060a0868803121562000bd957600080fd5b600062000be98882890162000af9565b955050602062000bfc8882890162000acb565b945050604062000c0f8882890162000ae2565b935050606062000c228882890162000ae2565b925050608062000c358882890162000af9565b9150509295509295909350565b60006020828403121562000c5557600080fd5b600062000c658482850162000b10565b91505092915050565b62000c798162001299565b82525050565b600062000c8c8262000f9e565b62000c98818562000fb4565b935062000caa81856020860162001310565b80840191505092915050565b600062000cc38262000fa9565b62000ccf818562000fbf565b935062000ce181856020860162001310565b62000cec81620013a4565b840191505092915050565b600062000d0660148362000fbf565b915062000d1382620013c2565b602082019050919050565b600062000d2d60268362000fbf565b915062000d3a82620013eb565b604082019050919050565b600062000d5460128362000fbf565b915062000d61826200143a565b602082019050919050565b600062000d7b60108362000fbf565b915062000d888262001463565b602082019050919050565b600062000da2601d8362000fbf565b915062000daf826200148c565b602082019050919050565b600062000dc9602a8362000fbf565b915062000dd682620014b5565b604082019050919050565b600062000df060368362000fbf565b915062000dfd8262001504565b604082019050919050565b62000e1381620012e3565b82525050565b600062000e27828462000c7f565b915081905092915050565b600060408201905062000e49600083018562000c6e565b62000e58602083018462000c6e565b9392505050565b600060408201905062000e76600083018562000c6e565b62000e85602083018462000e08565b9392505050565b6000602082019050818103600083015262000ea8818462000cb6565b905092915050565b6000602082019050818103600083015262000ecb8162000cf7565b9050919050565b6000602082019050818103600083015262000eed8162000d1e565b9050919050565b6000602082019050818103600083015262000f0f8162000d45565b9050919050565b6000602082019050818103600083015262000f318162000d6c565b9050919050565b6000602082019050818103600083015262000f538162000d93565b9050919050565b6000602082019050818103600083015262000f758162000dba565b9050919050565b6000602082019050818103600083015262000f978162000de1565b9050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600062000fdd82620012e3565b915062000fea83620012e3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562001022576200102162001346565b5b828201905092915050565b60006200103a82620012e3565b91506200104783620012e3565b9250826200105a576200105962001375565b5b828204905092915050565b6000808291508390505b6001851115620010b7578086048111156200108f576200108e62001346565b5b60018516156200109f5780820291505b8081029050620010af85620013b5565b94506200106f565b94509492505050565b6000620010cd82620012e3565b9150620010da83620012ed565b9250620011097fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462001111565b905092915050565b600082620011235760019050620011f6565b81620011335760009050620011f6565b81600181146200114c576002811462001157576200118d565b6001915050620011f6565b60ff8411156200116c576200116b62001346565b5b8360020a91508482111562001186576200118562001346565b5b50620011f6565b5060208310610133831016604e8410600b8410161715620011c75782820a905083811115620011c157620011c062001346565b5b620011f6565b620011d6848484600162001065565b92509050818404811115620011f057620011ef62001346565b5b81810290505b9392505050565b60006200120a82620012e3565b91506200121783620012e3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562001253576200125262001346565b5b828202905092915050565b60006200126b82620012e3565b91506200127883620012e3565b9250828210156200128e576200128d62001346565b5b828203905092915050565b6000620012a682620012c3565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600069ffffffffffffffffffff82169050919050565b60005b838110156200133057808201518184015260208101905062001313565b8381111562001340576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f767573642d616464726573732d69732d7a65726f000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f6164642d696e2d6c6973742d6661696c65640000000000000000000000000000600082015250565b7f70726963652d69732d696e76616c696400000000000000000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b6200155e8162001299565b81146200156a57600080fd5b50565b6200157881620012ad565b81146200158457600080fd5b50565b6200159281620012b9565b81146200159e57600080fd5b50565b620015ac81620012e3565b8114620015b857600080fd5b50565b620015c681620012ed565b8114620015d257600080fd5b50565b620015e081620012fa565b8114620015ec57600080fd5b50565b60805160601c6139c2620016316000396000818161044001528181610b3201528181610c1401528181610dbb01528181611176015261172901526139c26000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806361d027b3116100c3578063addd50991161007c578063addd50991461037a578063c0275a25146103aa578063c760af5c146103c6578063edac5203146103e2578063fd967f4714610400578063ffa1ad741461041e5761014d565b806361d027b3146102a457806370e2f827146102c25780638c0b09d0146102e0578063a0712d6814610310578063a3f4df7e1461032c578063ab37f4861461034a5761014d565b806340c10f191161011557806340c10f19146101e0578063482b6014146101fc5780635166c96a1461022c57806359011cd11461024a5780635a64ad95146102685780635e1762a0146102865761014d565b80630c340a24146101525780630d4d1513146101705780631c88705d1461018c57806320ab954e146101a8578063380a0df2146101c4575b600080fd5b61015a61043c565b6040516101679190612c7f565b60405180910390f35b61018a600480360381019061018591906126f4565b6104e1565b005b6101a660048036038101906101a19190612617565b610548565b005b6101c260048036038101906101bd9190612669565b6107ac565b005b6101de60048036038101906101d9919061276c565b610988565b005b6101fa60048036038101906101f591906126b8565b610a92565b005b610216600480360381019061021191906126b8565b610aff565b604051610223919061303d565b60405180910390f35b610234610b2d565b604051610241919061303d565b60405180910390f35b610252610bf3565b60405161025f919061303d565b60405180910390f35b610270610bf9565b60405161027d919061303d565b60405180910390f35b61028e610bff565b60405161029b9190612d23565b60405180910390f35b6102ac610c10565b6040516102b99190612c7f565b60405180910390f35b6102ca610cb5565b6040516102d7919061303d565b60405180910390f35b6102fa60048036038101906102f59190612617565b610cbb565b6040516103079190612c7f565b60405180910390f35b61032a6004803603810190610325919061276c565b610cee565b005b610334610e51565b6040516103419190612d7b565b60405180910390f35b610364600480360381019061035f9190612617565b610e8a565b6040516103719190612d45565b60405180910390f35b610394600480360381019061038f9190612617565b610ea7565b6040516103a19190612c7f565b60405180910390f35b6103c460048036038101906103bf919061276c565b610eda565b005b6103e060048036038101906103db919061276c565b611025565b005b6103ea611174565b6040516103f79190612d60565b60405180910390f35b610408611198565b604051610415919061303d565b60405180910390f35b61042661119e565b6040516104339190612d7b565b60405180910390f35b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156104a457600080fd5b505afa1580156104b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104dc9190612640565b905090565b60026000541415610527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051e90612ffd565b60405180910390fd5b600260008190555061053a83838361137d565b506001600081905550505050565b61055061043c565b73ffffffffffffffffffffffffffffffffffffffff1661056e611813565b73ffffffffffffffffffffffffffffffffffffffff16146105c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bb90612dfd565b60405180910390fd5b6105d881600661181b90919063ffffffff16565b610617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060e90612e9d565b60405180910390fd5b6106a2600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660008373ffffffffffffffffffffffffffffffffffffffff166112079092919063ffffffff16565b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558073ffffffffffffffffffffffffffffffffffffffff167f3e4130008265a57fa3e4f3cc37bc1d691652b77b4407bd08ddea997b2eda436760405160405180910390a250565b6107b461043c565b73ffffffffffffffffffffffffffffffffffffffff166107d2611813565b73ffffffffffffffffffffffffffffffffffffffff1614610828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081f90612dfd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088f90612e1d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ff90612d9d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f90612efd565b60405180910390fd5b61098383838361184b565b505050565b61099061043c565b73ffffffffffffffffffffffffffffffffffffffff166109ae611813565b73ffffffffffffffffffffffffffffffffffffffff1614610a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fb90612dfd565b60405180910390fd5b6000600254905081811415610a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4590612dbd565b60405180910390fd5b7f8353d6f6057b53994c31faf6112674bd84b37caab3af81c269080ae9904ebbeb8183604051610a7f929190613058565b60405180910390a1816002819055505050565b60026000541415610ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acf90612ffd565b60405180910390fd5b6002600081905550610af28282610aed611813565b61137d565b5060016000819055505050565b6000610b15836006611bed90919063ffffffff16565b15610b2757610b248383611c1d565b90505b92915050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b9657600080fd5b505afa158015610baa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bce9190612795565b90506000600254905081811115610bee578181610beb9190613383565b92505b505090565b60035481565b60015481565b6060610c0b6006611f75565b905090565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b158015610c7857600080fd5b505afa158015610c8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb09190612640565b905090565b60025481565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610cf661043c565b73ffffffffffffffffffffffffffffffffffffffff16610d14611813565b73ffffffffffffffffffffffffffffffffffffffff1614610d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6190612dfd565b60405180910390fd5b6000610d74610b2d565b905081811015610db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db090612f1d565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f19610dfd611813565b846040518363ffffffff1660e01b8152600401610e1b929190612cfa565b600060405180830381600087803b158015610e3557600080fd5b505af1158015610e49573d6000803e3d6000fd5b505050505050565b6040518060400160405280600b81526020017f565553442d4d696e74657200000000000000000000000000000000000000000081525081565b6000610ea0826006611bed90919063ffffffff16565b9050919050565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ee261043c565b73ffffffffffffffffffffffffffffffffffffffff16610f00611813565b73ffffffffffffffffffffffffffffffffffffffff1614610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d90612dfd565b60405180910390fd5b612710811115610f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9290612f3d565b60405180910390fd5b806001541415610fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd790612fdd565b60405180910390fd5b7f85735a3ef929fdaaf946ddf4b97deec396e7347cbb47fea3d6a8f3934e1b02e360015482604051611013929190613058565b60405180910390a18060018190555050565b61102d61043c565b73ffffffffffffffffffffffffffffffffffffffff1661104b611813565b73ffffffffffffffffffffffffffffffffffffffff16146110a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109890612dfd565b60405180910390fd5b6127108111156110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd90612edd565b60405180910390fd5b6000600354905081811415611130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112790612f5d565b60405180910390fd5b7f3cb23ae97dcd603618548f333b96dbb9e41059b6fd0eb7face59058c5ac3b11b8183604051611161929190613058565b60405180910390a1816003819055505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61271081565b6040518060400160405280600581526020017f312e342e3100000000000000000000000000000000000000000000000000000081525081565b60006111ff836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611f96565b905092915050565b60008114806112a0575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b815260040161124e929190612c9a565b60206040518083038186803b15801561126657600080fd5b505afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e9190612795565b145b6112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d69061301d565b60405180910390fd5b6113608363095ea7b360e01b84846040516024016112fe929190612cfa565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612006565b505050565b606061137484846000856120cd565b90509392505050565b6000611393846006611bed90919063ffffffff16565b6113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c990612e3d565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161140d9190612c7f565b60206040518083038186803b15801561142557600080fd5b505afa158015611439573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145d9190612795565b905061149361146a611813565b30868873ffffffffffffffffffffffffffffffffffffffff166121e1909392919063ffffffff16565b60008573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114ce9190612c7f565b60206040518083038186803b1580156114e657600080fd5b505afa1580156114fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151e9190612795565b90506000828261152e9190613383565b905061153a8782611c1d565b93506000600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663a0712d68856040518263ffffffff1660e01b81526004016115db919061303d565b602060405180830381600087803b1580156115f557600080fd5b505af1158015611609573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162d9190612795565b1461166d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166490612fbd565b60405180910390fd5b611727611678610c10565b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116b19190612c7f565b60206040518083038186803b1580156116c957600080fd5b505afa1580156116dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117019190612795565b8373ffffffffffffffffffffffffffffffffffffffff1661226a9092919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f1987876040518363ffffffff1660e01b8152600401611782929190612cfa565b600060405180830381600087803b15801561179c57600080fd5b505af11580156117b0573d6000803e3d6000fd5b505050508773ffffffffffffffffffffffffffffffffffffffff167fa8137fff86647d8a402117b9c5dbda627f721d3773338fb9678c83e54ed390808884888a6040516118009493929190613081565b60405180910390a2505050509392505050565b600033905090565b6000611843836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6122f0565b905092915050565b61185f8360066111d790919063ffffffff16565b61189e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189590612e7d565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156118e657600080fd5b505afa1580156118fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191e9190612835565b905060008273ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561196857600080fd5b505afa15801561197c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a091906127be565b5050509150506000819050600083600a6119ba919061320b565b90506000612710600354836119cf9190613329565b6119d99190613187565b9050600081836119e99190613131565b9050600082846119f99190613383565b9050818511158015611a0b5750808510155b611a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4190612ebd565b60405180910390fd5b87600560008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b91897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c73ffffffffffffffffffffffffffffffffffffffff166112079092919063ffffffff16565b8973ffffffffffffffffffffffffffffffffffffffff167ff264178f70a222c6991bf4849b98c3722e9f54b6e89d1fb550509113e60ae0b78a8a604051611bd9929190612c9a565b60405180910390a250505050505050505050565b6000611c15836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612476565b905092915050565b600080600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611cca57600080fd5b505afa158015611cde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d029190612835565b905060008273ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015611d4c57600080fd5b505afa158015611d60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8491906127be565b5050509150506000819050600083600a611d9e919061320b565b9050600061271060035483611db39190613329565b611dbd9190613187565b905060008183611dcd9190613131565b905060008284611ddd9190613383565b9050818511158015611def5750808510155b611e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2590612e5d565b60405180910390fd5b6000612710600154612710611e439190613383565b8c611e4e9190613329565b611e589190613187565b9050848682611e679190613329565b611e719190613187565b99508b73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611eb957600080fd5b505afa158015611ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef19190612835565b6012611efd91906133b7565b600a611f09919061320b565b8a611f149190613329565b99506000611f20610b2d565b90508a811015611f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5c90612f1d565b60405180910390fd5b5050505050505050505092915050565b60606000611f8583600001612499565b905060608190508092505050919050565b6000611fa28383612476565b611ffb578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612000565b600090505b92915050565b6000612068826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166113659092919063ffffffff16565b90506000815111156120c857808060200190518101906120889190612743565b6120c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120be90612f9d565b60405180910390fd5b5b505050565b606082471015612112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210990612ddd565b60405180910390fd5b61211b856124f5565b61215a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215190612f7d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516121839190612c68565b60006040518083038185875af1925050503d80600081146121c0576040519150601f19603f3d011682016040523d82523d6000602084013e6121c5565b606091505b50915091506121d5828286612508565b92505050949350505050565b612264846323b872dd60e01b85858560405160240161220293929190612cc3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612006565b50505050565b6122eb8363a9059cbb60e01b8484604051602401612289929190612cfa565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612006565b505050565b6000808360010160008481526020019081526020016000205490506000811461246a5760006001826123229190613383565b905060006001866000018054905061233a9190613383565b90508181146123f5576000866000018281548110612381577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050808760000184815481106123cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061242f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612470565b60009150505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6060816000018054806020026020016040519081016040528092919081815260200182805480156124e957602002820191906000526020600020905b8154815260200190600101908083116124d5575b50505050509050919050565b600080823b905060008111915050919050565b6060831561251857829050612568565b60008351111561252b5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255f9190612d7b565b60405180910390fd5b9392505050565b60008135905061257e81613902565b92915050565b60008151905061259381613902565b92915050565b6000815190506125a881613919565b92915050565b6000815190506125bd81613930565b92915050565b6000813590506125d281613947565b92915050565b6000815190506125e781613947565b92915050565b6000815190506125fc81613975565b92915050565b6000815190506126118161395e565b92915050565b60006020828403121561262957600080fd5b60006126378482850161256f565b91505092915050565b60006020828403121561265257600080fd5b600061266084828501612584565b91505092915050565b60008060006060848603121561267e57600080fd5b600061268c8682870161256f565b935050602061269d8682870161256f565b92505060406126ae8682870161256f565b9150509250925092565b600080604083850312156126cb57600080fd5b60006126d98582860161256f565b92505060206126ea858286016125c3565b9150509250929050565b60008060006060848603121561270957600080fd5b60006127178682870161256f565b9350506020612728868287016125c3565b92505060406127398682870161256f565b9150509250925092565b60006020828403121561275557600080fd5b600061276384828501612599565b91505092915050565b60006020828403121561277e57600080fd5b600061278c848285016125c3565b91505092915050565b6000602082840312156127a757600080fd5b60006127b5848285016125d8565b91505092915050565b600080600080600060a086880312156127d657600080fd5b60006127e4888289016125ed565b95505060206127f5888289016125ae565b9450506040612806888289016125d8565b9350506060612817888289016125d8565b9250506080612828888289016125ed565b9150509295509295909350565b60006020828403121561284757600080fd5b600061285584828501612602565b91505092915050565b600061286a8383612876565b60208301905092915050565b61287f816133eb565b82525050565b61288e816133eb565b82525050565b600061289f826130d6565b6128a98185613104565b93506128b4836130c6565b8060005b838110156128e55781516128cc888261285e565b97506128d7836130f7565b9250506001810190506128b8565b5085935050505092915050565b6128fb816133fd565b82525050565b600061290c826130e1565b6129168185613115565b9350612926818560208601613484565b80840191505092915050565b61293b81613460565b82525050565b600061294c826130ec565b6129568185613120565b9350612966818560208601613484565b61296f81613515565b840191505092915050565b6000612987601683613120565b915061299282613533565b602082019050919050565b60006129aa600f83613120565b91506129b58261355c565b602082019050919050565b60006129cd602683613120565b91506129d882613585565b604082019050919050565b60006129f0601a83613120565b91506129fb826135d4565b602082019050919050565b6000612a13601583613120565b9150612a1e826135fd565b602082019050919050565b6000612a36601683613120565b9150612a4182613626565b602082019050919050565b6000612a59601d83613120565b9150612a648261364f565b602082019050919050565b6000612a7c601283613120565b9150612a8782613678565b602082019050919050565b6000612a9f601783613120565b9150612aaa826136a1565b602082019050919050565b6000612ac2601083613120565b9150612acd826136ca565b602082019050919050565b6000612ae5601a83613120565b9150612af0826136f3565b602082019050919050565b6000612b08601683613120565b9150612b138261371c565b602082019050919050565b6000612b2b601283613120565b9150612b3682613745565b602082019050919050565b6000612b4e601983613120565b9150612b598261376e565b602082019050919050565b6000612b71601a83613120565b9150612b7c82613797565b602082019050919050565b6000612b94601d83613120565b9150612b9f826137c0565b602082019050919050565b6000612bb7602a83613120565b9150612bc2826137e9565b604082019050919050565b6000612bda601283613120565b9150612be582613838565b602082019050919050565b6000612bfd601083613120565b9150612c0882613861565b602082019050919050565b6000612c20601f83613120565b9150612c2b8261388a565b602082019050919050565b6000612c43603683613120565b9150612c4e826138b3565b604082019050919050565b612c6281613433565b82525050565b6000612c748284612901565b915081905092915050565b6000602082019050612c946000830184612885565b92915050565b6000604082019050612caf6000830185612885565b612cbc6020830184612885565b9392505050565b6000606082019050612cd86000830186612885565b612ce56020830185612885565b612cf26040830184612c59565b949350505050565b6000604082019050612d0f6000830185612885565b612d1c6020830184612c59565b9392505050565b60006020820190508181036000830152612d3d8184612894565b905092915050565b6000602082019050612d5a60008301846128f2565b92915050565b6000602082019050612d756000830184612932565b92915050565b60006020820190508181036000830152612d958184612941565b905092915050565b60006020820190508181036000830152612db68161297a565b9050919050565b60006020820190508181036000830152612dd68161299d565b9050919050565b60006020820190508181036000830152612df6816129c0565b9050919050565b60006020820190508181036000830152612e16816129e3565b9050919050565b60006020820190508181036000830152612e3681612a06565b9050919050565b60006020820190508181036000830152612e5681612a29565b9050919050565b60006020820190508181036000830152612e7681612a4c565b9050919050565b60006020820190508181036000830152612e9681612a6f565b9050919050565b60006020820190508181036000830152612eb681612a92565b9050919050565b60006020820190508181036000830152612ed681612ab5565b9050919050565b60006020820190508181036000830152612ef681612ad8565b9050919050565b60006020820190508181036000830152612f1681612afb565b9050919050565b60006020820190508181036000830152612f3681612b1e565b9050919050565b60006020820190508181036000830152612f5681612b41565b9050919050565b60006020820190508181036000830152612f7681612b64565b9050919050565b60006020820190508181036000830152612f9681612b87565b9050919050565b60006020820190508181036000830152612fb681612baa565b9050919050565b60006020820190508181036000830152612fd681612bcd565b9050919050565b60006020820190508181036000830152612ff681612bf0565b9050919050565b6000602082019050818103600083015261301681612c13565b9050919050565b6000602082019050818103600083015261303681612c36565b9050919050565b60006020820190506130526000830184612c59565b92915050565b600060408201905061306d6000830185612c59565b61307a6020830184612c59565b9392505050565b60006080820190506130966000830187612c59565b6130a36020830186612c59565b6130b06040830185612c59565b6130bd6060830184612885565b95945050505050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600061313c82613433565b915061314783613433565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561317c5761317b6134b7565b5b828201905092915050565b600061319282613433565b915061319d83613433565b9250826131ad576131ac6134e6565b5b828204905092915050565b6000808291508390505b6001851115613202578086048111156131de576131dd6134b7565b5b60018516156131ed5780820291505b80810290506131fb85613526565b94506131c2565b94509492505050565b600061321682613433565b91506132218361343d565b925061324e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613256565b905092915050565b6000826132665760019050613322565b816132745760009050613322565b816001811461328a5760028114613294576132c3565b6001915050613322565b60ff8411156132a6576132a56134b7565b5b8360020a9150848211156132bd576132bc6134b7565b5b50613322565b5060208310610133831016604e8410600b84101617156132f85782820a9050838111156132f3576132f26134b7565b5b613322565b61330584848460016131b8565b9250905081840481111561331c5761331b6134b7565b5b81810290505b9392505050565b600061333482613433565b915061333f83613433565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613378576133776134b7565b5b828202905092915050565b600061338e82613433565b915061339983613433565b9250828210156133ac576133ab6134b7565b5b828203905092915050565b60006133c28261343d565b91506133cd8361343d565b9250828210156133e0576133df6134b7565b5b828203905092915050565b60006133f682613413565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600069ffffffffffffffffffff82169050919050565b600061346b82613472565b9050919050565b600061347d82613413565b9050919050565b60005b838110156134a2578082015181840152602081019050613487565b838111156134b1576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f63546f6b656e2d616464726573732d69732d7a65726f00000000000000000000600082015250565b7f73616d652d6d696e742d6c696d69740000000000000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f63616c6c65722d69732d6e6f742d7468652d676f7665726e6f72000000000000600082015250565b7f746f6b656e2d616464726573732d69732d7a65726f0000000000000000000000600082015250565b7f746f6b656e2d69732d6e6f742d737570706f7274656400000000000000000000600082015250565b7f6f7261636c652d70726963652d6578636565642d746f6c6572616e6365000000600082015250565b7f6164642d696e2d6c6973742d6661696c65640000000000000000000000000000600082015250565b7f72656d6f76652d66726f6d2d6c6973742d6661696c6564000000000000000000600082015250565b7f70726963652d69732d696e76616c696400000000000000000000000000000000600082015250565b7f70726963652d646576696174696f6e2d69732d696e76616c6964000000000000600082015250565b7f6f7261636c652d616464726573732d69732d7a65726f00000000000000000000600082015250565b7f6d696e742d6c696d69742d726561636865640000000000000000000000000000600082015250565b7f6d696e74696e672d6665652d6c696d69742d7265616368656400000000000000600082015250565b7f73616d652d70726963652d646576696174696f6e2d6c696d6974000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f63546f6b656e2d6d696e742d6661696c65640000000000000000000000000000600082015250565b7f73616d652d6d696e74696e672d66656500000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b61390b816133eb565b811461391657600080fd5b50565b613922816133fd565b811461392d57600080fd5b50565b61393981613409565b811461394457600080fd5b50565b61395081613433565b811461395b57600080fd5b50565b6139678161343d565b811461397257600080fd5b50565b61397e8161344a565b811461398957600080fd5b5056fea26469706673582212200701d8b53b06f2ad1de75cbb72b6f6e02905d9bbaabf68703e204ce82ba51fea64736f6c63430008030033000000000000000000000000677ddbd918637e5f2c79e164d402454de7da86190000000000000000000000000000000000000000019d971e4fe8401e74000000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806361d027b3116100c3578063addd50991161007c578063addd50991461037a578063c0275a25146103aa578063c760af5c146103c6578063edac5203146103e2578063fd967f4714610400578063ffa1ad741461041e5761014d565b806361d027b3146102a457806370e2f827146102c25780638c0b09d0146102e0578063a0712d6814610310578063a3f4df7e1461032c578063ab37f4861461034a5761014d565b806340c10f191161011557806340c10f19146101e0578063482b6014146101fc5780635166c96a1461022c57806359011cd11461024a5780635a64ad95146102685780635e1762a0146102865761014d565b80630c340a24146101525780630d4d1513146101705780631c88705d1461018c57806320ab954e146101a8578063380a0df2146101c4575b600080fd5b61015a61043c565b6040516101679190612c7f565b60405180910390f35b61018a600480360381019061018591906126f4565b6104e1565b005b6101a660048036038101906101a19190612617565b610548565b005b6101c260048036038101906101bd9190612669565b6107ac565b005b6101de60048036038101906101d9919061276c565b610988565b005b6101fa60048036038101906101f591906126b8565b610a92565b005b610216600480360381019061021191906126b8565b610aff565b604051610223919061303d565b60405180910390f35b610234610b2d565b604051610241919061303d565b60405180910390f35b610252610bf3565b60405161025f919061303d565b60405180910390f35b610270610bf9565b60405161027d919061303d565b60405180910390f35b61028e610bff565b60405161029b9190612d23565b60405180910390f35b6102ac610c10565b6040516102b99190612c7f565b60405180910390f35b6102ca610cb5565b6040516102d7919061303d565b60405180910390f35b6102fa60048036038101906102f59190612617565b610cbb565b6040516103079190612c7f565b60405180910390f35b61032a6004803603810190610325919061276c565b610cee565b005b610334610e51565b6040516103419190612d7b565b60405180910390f35b610364600480360381019061035f9190612617565b610e8a565b6040516103719190612d45565b60405180910390f35b610394600480360381019061038f9190612617565b610ea7565b6040516103a19190612c7f565b60405180910390f35b6103c460048036038101906103bf919061276c565b610eda565b005b6103e060048036038101906103db919061276c565b611025565b005b6103ea611174565b6040516103f79190612d60565b60405180910390f35b610408611198565b604051610415919061303d565b60405180910390f35b61042661119e565b6040516104339190612d7b565b60405180910390f35b60007f000000000000000000000000677ddbd918637e5f2c79e164d402454de7da861973ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156104a457600080fd5b505afa1580156104b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104dc9190612640565b905090565b60026000541415610527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051e90612ffd565b60405180910390fd5b600260008190555061053a83838361137d565b506001600081905550505050565b61055061043c565b73ffffffffffffffffffffffffffffffffffffffff1661056e611813565b73ffffffffffffffffffffffffffffffffffffffff16146105c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bb90612dfd565b60405180910390fd5b6105d881600661181b90919063ffffffff16565b610617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060e90612e9d565b60405180910390fd5b6106a2600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660008373ffffffffffffffffffffffffffffffffffffffff166112079092919063ffffffff16565b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558073ffffffffffffffffffffffffffffffffffffffff167f3e4130008265a57fa3e4f3cc37bc1d691652b77b4407bd08ddea997b2eda436760405160405180910390a250565b6107b461043c565b73ffffffffffffffffffffffffffffffffffffffff166107d2611813565b73ffffffffffffffffffffffffffffffffffffffff1614610828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081f90612dfd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088f90612e1d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ff90612d9d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f90612efd565b60405180910390fd5b61098383838361184b565b505050565b61099061043c565b73ffffffffffffffffffffffffffffffffffffffff166109ae611813565b73ffffffffffffffffffffffffffffffffffffffff1614610a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fb90612dfd565b60405180910390fd5b6000600254905081811415610a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4590612dbd565b60405180910390fd5b7f8353d6f6057b53994c31faf6112674bd84b37caab3af81c269080ae9904ebbeb8183604051610a7f929190613058565b60405180910390a1816002819055505050565b60026000541415610ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acf90612ffd565b60405180910390fd5b6002600081905550610af28282610aed611813565b61137d565b5060016000819055505050565b6000610b15836006611bed90919063ffffffff16565b15610b2757610b248383611c1d565b90505b92915050565b6000807f000000000000000000000000677ddbd918637e5f2c79e164d402454de7da861973ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b9657600080fd5b505afa158015610baa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bce9190612795565b90506000600254905081811115610bee578181610beb9190613383565b92505b505090565b60035481565b60015481565b6060610c0b6006611f75565b905090565b60007f000000000000000000000000677ddbd918637e5f2c79e164d402454de7da861973ffffffffffffffffffffffffffffffffffffffff166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b158015610c7857600080fd5b505afa158015610c8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb09190612640565b905090565b60025481565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610cf661043c565b73ffffffffffffffffffffffffffffffffffffffff16610d14611813565b73ffffffffffffffffffffffffffffffffffffffff1614610d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6190612dfd565b60405180910390fd5b6000610d74610b2d565b905081811015610db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db090612f1d565b60405180910390fd5b7f000000000000000000000000677ddbd918637e5f2c79e164d402454de7da861973ffffffffffffffffffffffffffffffffffffffff166340c10f19610dfd611813565b846040518363ffffffff1660e01b8152600401610e1b929190612cfa565b600060405180830381600087803b158015610e3557600080fd5b505af1158015610e49573d6000803e3d6000fd5b505050505050565b6040518060400160405280600b81526020017f565553442d4d696e74657200000000000000000000000000000000000000000081525081565b6000610ea0826006611bed90919063ffffffff16565b9050919050565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ee261043c565b73ffffffffffffffffffffffffffffffffffffffff16610f00611813565b73ffffffffffffffffffffffffffffffffffffffff1614610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d90612dfd565b60405180910390fd5b612710811115610f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9290612f3d565b60405180910390fd5b806001541415610fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd790612fdd565b60405180910390fd5b7f85735a3ef929fdaaf946ddf4b97deec396e7347cbb47fea3d6a8f3934e1b02e360015482604051611013929190613058565b60405180910390a18060018190555050565b61102d61043c565b73ffffffffffffffffffffffffffffffffffffffff1661104b611813565b73ffffffffffffffffffffffffffffffffffffffff16146110a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109890612dfd565b60405180910390fd5b6127108111156110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd90612edd565b60405180910390fd5b6000600354905081811415611130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112790612f5d565b60405180910390fd5b7f3cb23ae97dcd603618548f333b96dbb9e41059b6fd0eb7face59058c5ac3b11b8183604051611161929190613058565b60405180910390a1816003819055505050565b7f000000000000000000000000677ddbd918637e5f2c79e164d402454de7da861981565b61271081565b6040518060400160405280600581526020017f312e342e3100000000000000000000000000000000000000000000000000000081525081565b60006111ff836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611f96565b905092915050565b60008114806112a0575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b815260040161124e929190612c9a565b60206040518083038186803b15801561126657600080fd5b505afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e9190612795565b145b6112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d69061301d565b60405180910390fd5b6113608363095ea7b360e01b84846040516024016112fe929190612cfa565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612006565b505050565b606061137484846000856120cd565b90509392505050565b6000611393846006611bed90919063ffffffff16565b6113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c990612e3d565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161140d9190612c7f565b60206040518083038186803b15801561142557600080fd5b505afa158015611439573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145d9190612795565b905061149361146a611813565b30868873ffffffffffffffffffffffffffffffffffffffff166121e1909392919063ffffffff16565b60008573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114ce9190612c7f565b60206040518083038186803b1580156114e657600080fd5b505afa1580156114fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151e9190612795565b90506000828261152e9190613383565b905061153a8782611c1d565b93506000600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663a0712d68856040518263ffffffff1660e01b81526004016115db919061303d565b602060405180830381600087803b1580156115f557600080fd5b505af1158015611609573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162d9190612795565b1461166d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166490612fbd565b60405180910390fd5b611727611678610c10565b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116b19190612c7f565b60206040518083038186803b1580156116c957600080fd5b505afa1580156116dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117019190612795565b8373ffffffffffffffffffffffffffffffffffffffff1661226a9092919063ffffffff16565b7f000000000000000000000000677ddbd918637e5f2c79e164d402454de7da861973ffffffffffffffffffffffffffffffffffffffff166340c10f1987876040518363ffffffff1660e01b8152600401611782929190612cfa565b600060405180830381600087803b15801561179c57600080fd5b505af11580156117b0573d6000803e3d6000fd5b505050508773ffffffffffffffffffffffffffffffffffffffff167fa8137fff86647d8a402117b9c5dbda627f721d3773338fb9678c83e54ed390808884888a6040516118009493929190613081565b60405180910390a2505050509392505050565b600033905090565b6000611843836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6122f0565b905092915050565b61185f8360066111d790919063ffffffff16565b61189e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189590612e7d565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156118e657600080fd5b505afa1580156118fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191e9190612835565b905060008273ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561196857600080fd5b505afa15801561197c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a091906127be565b5050509150506000819050600083600a6119ba919061320b565b90506000612710600354836119cf9190613329565b6119d99190613187565b9050600081836119e99190613131565b9050600082846119f99190613383565b9050818511158015611a0b5750808510155b611a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4190612ebd565b60405180910390fd5b87600560008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b91897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c73ffffffffffffffffffffffffffffffffffffffff166112079092919063ffffffff16565b8973ffffffffffffffffffffffffffffffffffffffff167ff264178f70a222c6991bf4849b98c3722e9f54b6e89d1fb550509113e60ae0b78a8a604051611bd9929190612c9a565b60405180910390a250505050505050505050565b6000611c15836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612476565b905092915050565b600080600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611cca57600080fd5b505afa158015611cde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d029190612835565b905060008273ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015611d4c57600080fd5b505afa158015611d60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8491906127be565b5050509150506000819050600083600a611d9e919061320b565b9050600061271060035483611db39190613329565b611dbd9190613187565b905060008183611dcd9190613131565b905060008284611ddd9190613383565b9050818511158015611def5750808510155b611e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2590612e5d565b60405180910390fd5b6000612710600154612710611e439190613383565b8c611e4e9190613329565b611e589190613187565b9050848682611e679190613329565b611e719190613187565b99508b73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611eb957600080fd5b505afa158015611ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef19190612835565b6012611efd91906133b7565b600a611f09919061320b565b8a611f149190613329565b99506000611f20610b2d565b90508a811015611f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5c90612f1d565b60405180910390fd5b5050505050505050505092915050565b60606000611f8583600001612499565b905060608190508092505050919050565b6000611fa28383612476565b611ffb578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612000565b600090505b92915050565b6000612068826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166113659092919063ffffffff16565b90506000815111156120c857808060200190518101906120889190612743565b6120c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120be90612f9d565b60405180910390fd5b5b505050565b606082471015612112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210990612ddd565b60405180910390fd5b61211b856124f5565b61215a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215190612f7d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516121839190612c68565b60006040518083038185875af1925050503d80600081146121c0576040519150601f19603f3d011682016040523d82523d6000602084013e6121c5565b606091505b50915091506121d5828286612508565b92505050949350505050565b612264846323b872dd60e01b85858560405160240161220293929190612cc3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612006565b50505050565b6122eb8363a9059cbb60e01b8484604051602401612289929190612cfa565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612006565b505050565b6000808360010160008481526020019081526020016000205490506000811461246a5760006001826123229190613383565b905060006001866000018054905061233a9190613383565b90508181146123f5576000866000018281548110612381577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050808760000184815481106123cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061242f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612470565b60009150505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6060816000018054806020026020016040519081016040528092919081815260200182805480156124e957602002820191906000526020600020905b8154815260200190600101908083116124d5575b50505050509050919050565b600080823b905060008111915050919050565b6060831561251857829050612568565b60008351111561252b5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255f9190612d7b565b60405180910390fd5b9392505050565b60008135905061257e81613902565b92915050565b60008151905061259381613902565b92915050565b6000815190506125a881613919565b92915050565b6000815190506125bd81613930565b92915050565b6000813590506125d281613947565b92915050565b6000815190506125e781613947565b92915050565b6000815190506125fc81613975565b92915050565b6000815190506126118161395e565b92915050565b60006020828403121561262957600080fd5b60006126378482850161256f565b91505092915050565b60006020828403121561265257600080fd5b600061266084828501612584565b91505092915050565b60008060006060848603121561267e57600080fd5b600061268c8682870161256f565b935050602061269d8682870161256f565b92505060406126ae8682870161256f565b9150509250925092565b600080604083850312156126cb57600080fd5b60006126d98582860161256f565b92505060206126ea858286016125c3565b9150509250929050565b60008060006060848603121561270957600080fd5b60006127178682870161256f565b9350506020612728868287016125c3565b92505060406127398682870161256f565b9150509250925092565b60006020828403121561275557600080fd5b600061276384828501612599565b91505092915050565b60006020828403121561277e57600080fd5b600061278c848285016125c3565b91505092915050565b6000602082840312156127a757600080fd5b60006127b5848285016125d8565b91505092915050565b600080600080600060a086880312156127d657600080fd5b60006127e4888289016125ed565b95505060206127f5888289016125ae565b9450506040612806888289016125d8565b9350506060612817888289016125d8565b9250506080612828888289016125ed565b9150509295509295909350565b60006020828403121561284757600080fd5b600061285584828501612602565b91505092915050565b600061286a8383612876565b60208301905092915050565b61287f816133eb565b82525050565b61288e816133eb565b82525050565b600061289f826130d6565b6128a98185613104565b93506128b4836130c6565b8060005b838110156128e55781516128cc888261285e565b97506128d7836130f7565b9250506001810190506128b8565b5085935050505092915050565b6128fb816133fd565b82525050565b600061290c826130e1565b6129168185613115565b9350612926818560208601613484565b80840191505092915050565b61293b81613460565b82525050565b600061294c826130ec565b6129568185613120565b9350612966818560208601613484565b61296f81613515565b840191505092915050565b6000612987601683613120565b915061299282613533565b602082019050919050565b60006129aa600f83613120565b91506129b58261355c565b602082019050919050565b60006129cd602683613120565b91506129d882613585565b604082019050919050565b60006129f0601a83613120565b91506129fb826135d4565b602082019050919050565b6000612a13601583613120565b9150612a1e826135fd565b602082019050919050565b6000612a36601683613120565b9150612a4182613626565b602082019050919050565b6000612a59601d83613120565b9150612a648261364f565b602082019050919050565b6000612a7c601283613120565b9150612a8782613678565b602082019050919050565b6000612a9f601783613120565b9150612aaa826136a1565b602082019050919050565b6000612ac2601083613120565b9150612acd826136ca565b602082019050919050565b6000612ae5601a83613120565b9150612af0826136f3565b602082019050919050565b6000612b08601683613120565b9150612b138261371c565b602082019050919050565b6000612b2b601283613120565b9150612b3682613745565b602082019050919050565b6000612b4e601983613120565b9150612b598261376e565b602082019050919050565b6000612b71601a83613120565b9150612b7c82613797565b602082019050919050565b6000612b94601d83613120565b9150612b9f826137c0565b602082019050919050565b6000612bb7602a83613120565b9150612bc2826137e9565b604082019050919050565b6000612bda601283613120565b9150612be582613838565b602082019050919050565b6000612bfd601083613120565b9150612c0882613861565b602082019050919050565b6000612c20601f83613120565b9150612c2b8261388a565b602082019050919050565b6000612c43603683613120565b9150612c4e826138b3565b604082019050919050565b612c6281613433565b82525050565b6000612c748284612901565b915081905092915050565b6000602082019050612c946000830184612885565b92915050565b6000604082019050612caf6000830185612885565b612cbc6020830184612885565b9392505050565b6000606082019050612cd86000830186612885565b612ce56020830185612885565b612cf26040830184612c59565b949350505050565b6000604082019050612d0f6000830185612885565b612d1c6020830184612c59565b9392505050565b60006020820190508181036000830152612d3d8184612894565b905092915050565b6000602082019050612d5a60008301846128f2565b92915050565b6000602082019050612d756000830184612932565b92915050565b60006020820190508181036000830152612d958184612941565b905092915050565b60006020820190508181036000830152612db68161297a565b9050919050565b60006020820190508181036000830152612dd68161299d565b9050919050565b60006020820190508181036000830152612df6816129c0565b9050919050565b60006020820190508181036000830152612e16816129e3565b9050919050565b60006020820190508181036000830152612e3681612a06565b9050919050565b60006020820190508181036000830152612e5681612a29565b9050919050565b60006020820190508181036000830152612e7681612a4c565b9050919050565b60006020820190508181036000830152612e9681612a6f565b9050919050565b60006020820190508181036000830152612eb681612a92565b9050919050565b60006020820190508181036000830152612ed681612ab5565b9050919050565b60006020820190508181036000830152612ef681612ad8565b9050919050565b60006020820190508181036000830152612f1681612afb565b9050919050565b60006020820190508181036000830152612f3681612b1e565b9050919050565b60006020820190508181036000830152612f5681612b41565b9050919050565b60006020820190508181036000830152612f7681612b64565b9050919050565b60006020820190508181036000830152612f9681612b87565b9050919050565b60006020820190508181036000830152612fb681612baa565b9050919050565b60006020820190508181036000830152612fd681612bcd565b9050919050565b60006020820190508181036000830152612ff681612bf0565b9050919050565b6000602082019050818103600083015261301681612c13565b9050919050565b6000602082019050818103600083015261303681612c36565b9050919050565b60006020820190506130526000830184612c59565b92915050565b600060408201905061306d6000830185612c59565b61307a6020830184612c59565b9392505050565b60006080820190506130966000830187612c59565b6130a36020830186612c59565b6130b06040830185612c59565b6130bd6060830184612885565b95945050505050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600061313c82613433565b915061314783613433565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561317c5761317b6134b7565b5b828201905092915050565b600061319282613433565b915061319d83613433565b9250826131ad576131ac6134e6565b5b828204905092915050565b6000808291508390505b6001851115613202578086048111156131de576131dd6134b7565b5b60018516156131ed5780820291505b80810290506131fb85613526565b94506131c2565b94509492505050565b600061321682613433565b91506132218361343d565b925061324e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613256565b905092915050565b6000826132665760019050613322565b816132745760009050613322565b816001811461328a5760028114613294576132c3565b6001915050613322565b60ff8411156132a6576132a56134b7565b5b8360020a9150848211156132bd576132bc6134b7565b5b50613322565b5060208310610133831016604e8410600b84101617156132f85782820a9050838111156132f3576132f26134b7565b5b613322565b61330584848460016131b8565b9250905081840481111561331c5761331b6134b7565b5b81810290505b9392505050565b600061333482613433565b915061333f83613433565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613378576133776134b7565b5b828202905092915050565b600061338e82613433565b915061339983613433565b9250828210156133ac576133ab6134b7565b5b828203905092915050565b60006133c28261343d565b91506133cd8361343d565b9250828210156133e0576133df6134b7565b5b828203905092915050565b60006133f682613413565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600069ffffffffffffffffffff82169050919050565b600061346b82613472565b9050919050565b600061347d82613413565b9050919050565b60005b838110156134a2578082015181840152602081019050613487565b838111156134b1576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f63546f6b656e2d616464726573732d69732d7a65726f00000000000000000000600082015250565b7f73616d652d6d696e742d6c696d69740000000000000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f63616c6c65722d69732d6e6f742d7468652d676f7665726e6f72000000000000600082015250565b7f746f6b656e2d616464726573732d69732d7a65726f0000000000000000000000600082015250565b7f746f6b656e2d69732d6e6f742d737570706f7274656400000000000000000000600082015250565b7f6f7261636c652d70726963652d6578636565642d746f6c6572616e6365000000600082015250565b7f6164642d696e2d6c6973742d6661696c65640000000000000000000000000000600082015250565b7f72656d6f76652d66726f6d2d6c6973742d6661696c6564000000000000000000600082015250565b7f70726963652d69732d696e76616c696400000000000000000000000000000000600082015250565b7f70726963652d646576696174696f6e2d69732d696e76616c6964000000000000600082015250565b7f6f7261636c652d616464726573732d69732d7a65726f00000000000000000000600082015250565b7f6d696e742d6c696d69742d726561636865640000000000000000000000000000600082015250565b7f6d696e74696e672d6665652d6c696d69742d7265616368656400000000000000600082015250565b7f73616d652d70726963652d646576696174696f6e2d6c696d6974000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f63546f6b656e2d6d696e742d6661696c65640000000000000000000000000000600082015250565b7f73616d652d6d696e74696e672d66656500000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b61390b816133eb565b811461391657600080fd5b50565b613922816133fd565b811461392d57600080fd5b50565b61393981613409565b811461394457600080fd5b50565b61395081613433565b811461395b57600080fd5b50565b6139678161343d565b811461397257600080fd5b50565b61397e8161344a565b811461398957600080fd5b5056fea26469706673582212200701d8b53b06f2ad1de75cbb72b6f6e02905d9bbaabf68703e204ce82ba51fea64736f6c63430008030033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000677ddbd918637e5f2c79e164d402454de7da86190000000000000000000000000000000000000000019d971e4fe8401e74000000
-----Decoded View---------------
Arg [0] : _vusd (address): 0x677ddbd918637E5F2c79e164D402454dE7dA8619
Arg [1] : _maxMintLimit (uint256): 500000000000000000000000000
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000677ddbd918637e5f2c79e164d402454de7da8619
Arg [1] : 0000000000000000000000000000000000000000019d971e4fe8401e74000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
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.