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 160 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Ape | 14737411 | 826 days ago | IN | 0.05 ETH | 0.00053376 | ||||
End | 14545157 | 857 days ago | IN | 0 ETH | 0.00369612 | ||||
Ape | 14541759 | 857 days ago | IN | 0.8 ETH | 0.00869681 | ||||
Ape | 14540493 | 857 days ago | IN | 1 ETH | 0.0038264 | ||||
Ape | 14538916 | 857 days ago | IN | 1 ETH | 0.00558456 | ||||
Ape | 14538597 | 858 days ago | IN | 0.3 ETH | 0.00452393 | ||||
Ape | 14538594 | 858 days ago | IN | 0.1 ETH | 0.00509226 | ||||
Ape | 14538031 | 858 days ago | IN | 1 ETH | 0.00587948 | ||||
Ape | 14537890 | 858 days ago | IN | 0.1 ETH | 0.0042748 | ||||
Ape | 14536941 | 858 days ago | IN | 1 ETH | 0.00443841 | ||||
Ape | 14536744 | 858 days ago | IN | 1 ETH | 0.00836221 | ||||
Ape | 14536524 | 858 days ago | IN | 1 ETH | 0.00513428 | ||||
Ape | 14536044 | 858 days ago | IN | 0.2 ETH | 0.00482988 | ||||
Ape | 14535623 | 858 days ago | IN | 1 ETH | 0.00368451 | ||||
Ape | 14535303 | 858 days ago | IN | 0.16 ETH | 0.00410438 | ||||
Ape | 14535145 | 858 days ago | IN | 1 ETH | 0.00559305 | ||||
Ape | 14535136 | 858 days ago | IN | 1 ETH | 0.00462301 | ||||
Ape | 14535130 | 858 days ago | IN | 0.6 ETH | 0.00555713 | ||||
Ape | 14534987 | 858 days ago | IN | 1 ETH | 0.00507752 | ||||
Ape | 14534964 | 858 days ago | IN | 1 ETH | 0.0069514 | ||||
Ape | 14534864 | 858 days ago | IN | 1 ETH | 0.00600205 | ||||
Ape | 14534844 | 858 days ago | IN | 0.5 ETH | 0.00690631 | ||||
Ape | 14534807 | 858 days ago | IN | 1 ETH | 0.00630704 | ||||
Ape | 14534795 | 858 days ago | IN | 1 ETH | 0.00539247 | ||||
Ape | 14534790 | 858 days ago | IN | 1 ETH | 0.00550727 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
14541759 | 857 days ago | 0.8 ETH | ||||
14540493 | 857 days ago | 1 ETH | ||||
14538916 | 857 days ago | 1 ETH | ||||
14538597 | 858 days ago | 0.3 ETH | ||||
14538594 | 858 days ago | 0.1 ETH | ||||
14538031 | 858 days ago | 1 ETH | ||||
14537890 | 858 days ago | 0.1 ETH | ||||
14536941 | 858 days ago | 1 ETH | ||||
14536744 | 858 days ago | 1 ETH | ||||
14536524 | 858 days ago | 1 ETH | ||||
14536044 | 858 days ago | 0.2 ETH | ||||
14535623 | 858 days ago | 1 ETH | ||||
14535303 | 858 days ago | 0.16 ETH | ||||
14535145 | 858 days ago | 1 ETH | ||||
14535136 | 858 days ago | 1 ETH | ||||
14535130 | 858 days ago | 0.6 ETH | ||||
14534987 | 858 days ago | 1 ETH | ||||
14534964 | 858 days ago | 1 ETH | ||||
14534864 | 858 days ago | 1 ETH | ||||
14534844 | 858 days ago | 0.5 ETH | ||||
14534807 | 858 days ago | 1 ETH | ||||
14534795 | 858 days ago | 1 ETH | ||||
14534790 | 858 days ago | 1 ETH | ||||
14534782 | 858 days ago | 1 ETH | ||||
14534781 | 858 days ago | 1 ETH |
Loading...
Loading
Contract Name:
InitialDistribution
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-06 */ // SPDX-License-Identifier: GPL-3.0-or-later // Sources flattened with hardhat v2.9.3 https://hardhat.org // File libraries/MerkleProof.sol pragma solidity ^0.8.13; library MerkleProof { struct Proof { uint16 nodeIndex; bytes32[] hashes; } function isValid( Proof memory proof, bytes32 node, bytes32 merkleRoot ) internal pure returns (bool) { uint256 length = proof.hashes.length; uint16 nodeIndex = proof.nodeIndex; for (uint256 i = 0; i < length; i++) { if (nodeIndex % 2 == 0) { node = keccak256(abi.encodePacked(node, proof.hashes[i])); } else { node = keccak256(abi.encodePacked(proof.hashes[i], node)); } nodeIndex /= 2; } return node == merkleRoot; } } // File interfaces/tokenomics/IInitialDistribution.sol pragma solidity ^0.8.13; interface IInitialDistribution { event DistributonStarted(); event DistributonEnded(); event TokenDistributed(address receiver, uint256 receiveAmount, uint256 amountDeposited); function getAmountForDeposit(uint256 depositAmount) external view returns (uint256); function getDefaultMinOutput(uint256 depositAmount) external view returns (uint256); function getLeftInTranche() external view returns (uint256); function ape(uint256 minOutputAmount) external payable; function ape(uint256 minOutputAmount, MerkleProof.Proof calldata proof) external payable; function start() external; function end() external; } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File interfaces/tokenomics/ICNCToken.sol pragma solidity ^0.8.13; interface ICNCToken is IERC20 { event MinterAdded(address minter); event MinterRemoved(address minter); event InitialDistributionMinted(uint256 amount); event AirdropMinted(uint256 amount); event AMMRewardsMinted(uint256 amount); event TreasuryRewardsMinted(uint256 amount); event SeedShareMinted(uint256 amount); /// @notice mints the initial distribution amount to the distribution contract function mintInitialDistribution(address distribution) external; /// @notice mints the airdrop amount to the airdrop contract function mintAirdrop(address airdropHandler) external; /// @notice mints the amm rewards function mintAMMRewards(address ammGauge) external; /// @notice mints `amount` to `account` function mint(address account, uint256 amount) external returns (uint256); /// @notice returns a list of all authorized minters function listMinters() external view returns (address[] memory); /// @notice returns the ratio of inflation already minted function inflationMintedRatio() external view returns (uint256); } // File @openzeppelin/contracts/utils/[email protected] // 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; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File libraries/ScaledMath.sol pragma solidity ^0.8.13; library ScaledMath { uint256 internal constant DECIMALS = 18; uint256 internal constant ONE = 10**DECIMALS; function mulDown(uint256 a, uint256 b) internal pure returns (uint256) { return (a * b) / ONE; } function divDown(uint256 a, uint256 b) internal pure returns (uint256) { return (a * ONE) / b; } } // File contracts/tokenomics/InitialDistribution.sol pragma solidity ^0.8.13; contract InitialDistribution is IInitialDistribution, Ownable { using ScaledMath for uint256; using SafeERC20 for IERC20; using MerkleProof for MerkleProof.Proof; uint256 internal constant TOTAL_AMOUNT = 0.3e18 * 10_000_000; uint256 internal constant MIN_DURATION = 1 days; uint256 public constant ETH_PER_TRANCHE = 14e18; uint256 public constant WHITELIST_DURATION = 3 hours; uint256 internal constant INFLATION_SCALE = 1e18; uint256 internal constant REDUCTION_RATIO = 0.53333e18; uint256 internal constant INITIAL_TRANCHE = 0.14e18 * 10_000_000; address public immutable token; address public immutable treasury; uint256 public immutable maxPerUser; bytes32 public immutable merkleRoot; uint256 public startedAt; uint256 public endedAt; uint256 public exchangeRate; uint256 public currentTrancheSize; uint256 public lastReductionAmount; uint256 public totalMinted; mapping(address => uint256) public apedPerUser; constructor( address _token, address _treasury, uint256 _maxPerUser, bytes32 _merkleRoot ) { token = _token; treasury = _treasury; exchangeRate = INITIAL_TRANCHE.divDown(ETH_PER_TRANCHE) * INFLATION_SCALE; currentTrancheSize = INITIAL_TRANCHE; maxPerUser = _maxPerUser; merkleRoot = _merkleRoot; } /// @notice Query the amount of tokens one would receive for an amount of ETH function getAmountForDeposit(uint256 depositAmount) public view returns (uint256) { return _getAmountForDeposit( depositAmount, exchangeRate, currentTrancheSize, getLeftInTranche() ); } /// @return returns a default minimum amount of CNC token to be received /// for a given ETH amount /// this will compute an amount with a single tranch devation function getDefaultMinOutput(uint256 depositAmount) external view returns (uint256) { uint256 initialExchangeRate = exchangeRate.mulDown(REDUCTION_RATIO); uint256 _currentTrancheSize = currentTrancheSize; uint256 trancheSize = _currentTrancheSize.mulDown(REDUCTION_RATIO); uint256 extraMinted = getAmountForDeposit(ETH_PER_TRANCHE); uint256 leftInTranche = (lastReductionAmount + _currentTrancheSize) + trancheSize - (totalMinted + extraMinted); return _getAmountForDeposit(depositAmount, initialExchangeRate, trancheSize, leftInTranche); } function _getAmountForDeposit( uint256 depositAmount, uint256 initialExchangeRate, uint256 initialTrancheSize, uint256 leftInTranche ) internal pure returns (uint256) { uint256 amountAtRate = depositAmount.mulDown(initialExchangeRate) / INFLATION_SCALE; if (amountAtRate <= leftInTranche) { return amountAtRate; } uint256 receiveAmount; uint256 amountSatisfied; uint256 tempTrancheSize = initialTrancheSize; uint256 tempExchangeRate = initialExchangeRate; while (amountSatisfied <= depositAmount) { if (amountAtRate >= leftInTranche) { amountSatisfied += (leftInTranche * INFLATION_SCALE).divDown(tempExchangeRate); receiveAmount += leftInTranche; } else { receiveAmount += amountAtRate; break; } tempExchangeRate = tempExchangeRate.mulDown(REDUCTION_RATIO); tempTrancheSize = tempTrancheSize.mulDown(REDUCTION_RATIO); amountAtRate = (depositAmount - amountSatisfied).mulDown(tempExchangeRate) / INFLATION_SCALE; leftInTranche = tempTrancheSize; } return receiveAmount; } function getLeftInTranche() public view override returns (uint256) { return lastReductionAmount + currentTrancheSize - totalMinted; } function ape(uint256 minOutputAmount, MerkleProof.Proof calldata proof) external payable override { if (startedAt + WHITELIST_DURATION >= block.timestamp) { bytes32 node = keccak256(abi.encodePacked(msg.sender)); require(proof.isValid(node, merkleRoot), "invalid proof"); } _ape(minOutputAmount); } // @notice Apes tokens for ETH. The amount is determined by the msg.value function ape(uint256 minOutputAmount) external payable override { require(startedAt + WHITELIST_DURATION <= block.timestamp, "whitelist is active"); _ape(minOutputAmount); } function _ape(uint256 minOutputAmount) internal { require(msg.value > 0, "nothing to ape"); require(endedAt == 0, "distribution has ended"); require(startedAt != 0, "distribution has not yet started"); require(exchangeRate > 1e18, "distribution has exceeded max exchange rate"); uint256 aped = apedPerUser[msg.sender]; require(aped + msg.value <= maxPerUser, "cannot ape more than 1 ETH"); apedPerUser[msg.sender] = aped + msg.value; uint256 amountAtRate = (msg.value).mulDown(exchangeRate) / INFLATION_SCALE; uint256 leftInTranche = getLeftInTranche(); if (amountAtRate <= leftInTranche) { require(amountAtRate >= minOutputAmount, "too much slippage"); totalMinted += amountAtRate; IERC20(token).safeTransfer(msg.sender, amountAtRate); (bool sent, ) = payable(treasury).call{value: msg.value, gas: 20000}(""); require(sent, "failed to send to treasury"); emit TokenDistributed(msg.sender, amountAtRate, msg.value); return; } uint256 receiveAmount; uint256 amountSatisfied; while (amountSatisfied <= msg.value) { if (amountAtRate >= leftInTranche) { amountSatisfied += (leftInTranche * INFLATION_SCALE).divDown(exchangeRate); receiveAmount += leftInTranche; } else { receiveAmount += amountAtRate; break; } lastReductionAmount = lastReductionAmount + currentTrancheSize; exchangeRate = exchangeRate.mulDown(REDUCTION_RATIO); currentTrancheSize = currentTrancheSize.mulDown(REDUCTION_RATIO); amountAtRate = (msg.value - amountSatisfied).mulDown(exchangeRate) / INFLATION_SCALE; leftInTranche = currentTrancheSize; } totalMinted += receiveAmount; require(receiveAmount >= minOutputAmount, "too much slippage"); (bool sent, ) = payable(treasury).call{value: msg.value, gas: 20000}(""); require(sent, "failed to send to treasury"); IERC20(token).safeTransfer(msg.sender, receiveAmount); emit TokenDistributed(msg.sender, receiveAmount, msg.value); } function start() external override onlyOwner { require(startedAt == 0, "distribution already started"); startedAt = block.timestamp; emit DistributonStarted(); } function end() external override onlyOwner { require(block.timestamp > startedAt + MIN_DURATION); require(endedAt == 0, "distribution already ended"); IERC20 _token = IERC20(token); _token.safeTransfer(treasury, _token.balanceOf(address(this))); endedAt = block.timestamp; emit DistributonEnded(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"uint256","name":"_maxPerUser","type":"uint256"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"DistributonEnded","type":"event"},{"anonymous":false,"inputs":[],"name":"DistributonStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"receiveAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountDeposited","type":"uint256"}],"name":"TokenDistributed","type":"event"},{"inputs":[],"name":"ETH_PER_TRANCHE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"minOutputAmount","type":"uint256"}],"name":"ape","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minOutputAmount","type":"uint256"},{"components":[{"internalType":"uint16","name":"nodeIndex","type":"uint16"},{"internalType":"bytes32[]","name":"hashes","type":"bytes32[]"}],"internalType":"struct MerkleProof.Proof","name":"proof","type":"tuple"}],"name":"ape","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"apedPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTrancheSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"end","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"}],"name":"getAmountForDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"}],"name":"getDefaultMinOutput","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLeftInTranche","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastReductionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"start","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101006040523480156200001257600080fd5b5060405162001c6938038062001c69833981016040819052620000359162000156565b6200004033620000b7565b6001600160a01b03848116608052831660a052670de0b6b3a7640000620000876a01287626ee52197b00000067c249fdd32778000062000107602090811b6200093117901c565b620000939190620001b4565b6003556a01287626ee52197b00000060045560c09190915260e05250620003049050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081620001186012600a620002d3565b620001249085620001b4565b620001309190620002e1565b90505b92915050565b80516001600160a01b03811681146200015157600080fd5b919050565b600080600080608085870312156200016d57600080fd5b620001788562000139565b9350620001886020860162000139565b6040860151606090960151949790965092505050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615620001d157620001d16200019e565b500290565b600181815b8085111562000217578160001904821115620001fb57620001fb6200019e565b808516156200020957918102915b93841c9390800290620001db565b509250929050565b600082620002305750600162000133565b816200023f5750600062000133565b8160018114620002585760028114620002635762000283565b600191505062000133565b60ff8411156200027757620002776200019e565b50506001821b62000133565b5060208310610133831016604e8410600b8410161715620002a8575081810a62000133565b620002b48383620001d6565b8060001904821115620002cb57620002cb6200019e565b029392505050565b60006200013083836200021f565b600082620002ff57634e487b7160e01b600052601260045260246000fd5b500490565b60805160a05160c05160e0516118f3620003766000396000818161021601526105990152600081816101570152610ab60152600081816102d0015281816107e301528181610c150152610e570152600081816103fb015281816107bd01528181610bea0152610f2801526118f36000f3fe6080604052600436106101405760003560e01c8063571b1f8a116100b6578063b718e8721161006f578063b718e87214610373578063be9a655514610389578063efbe1c1c1461039e578063f21f537d146103b3578063f2fde38b146103c9578063fc0c546a146103e957600080fd5b8063571b1f8a146102a857806361d027b3146102be578063715018a61461030a5780638da5cb5b1461031f578063a2309ff81461033d578063a7575e461461035357600080fd5b80632eb4a7ab116101085780632eb4a7ab146102045780632fb63dd4146102385780633ba0b9a9146102545780633cfb71d01461026a5780633d6a71e41461027f57806345fc96be1461029557600080fd5b806306d586bb1461014557806307be2a9c1461018c5780631f8abaa4146101a1578063206a9ad3146101ce578063220e259f146101ee575b600080fd5b34801561015157600080fd5b506101797f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b61019f61019a366004611415565b61041d565b005b3480156101ad57600080fd5b506101796101bc36600461142e565b60076020526000908152604090205481565b3480156101da57600080fd5b506101796101e9366004611415565b610483565b3480156101fa57600080fd5b5061017960045481565b34801561021057600080fd5b506101797f000000000000000000000000000000000000000000000000000000000000000081565b34801561024457600080fd5b5061017967c249fdd32778000081565b34801561026057600080fd5b5061017960035481565b34801561027657600080fd5b50610179610520565b34801561028b57600080fd5b5061017960025481565b61019f6102a3366004611457565b610544565b3480156102b457600080fd5b50610179612a3081565b3480156102ca57600080fd5b506102f27f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610183565b34801561031657600080fd5b5061019f610614565b34801561032b57600080fd5b506000546001600160a01b03166102f2565b34801561034957600080fd5b5061017960065481565b34801561035f57600080fd5b5061017961036e366004611415565b61064a565b34801561037f57600080fd5b5061017960055481565b34801561039557600080fd5b5061019f610669565b3480156103aa57600080fd5b5061019f610712565b3480156103bf57600080fd5b5061017960015481565b3480156103d557600080fd5b5061019f6103e436600461142e565b610899565b3480156103f557600080fd5b506102f27f000000000000000000000000000000000000000000000000000000000000000081565b42612a3060015461042e91906114bb565b11156104775760405162461bcd60e51b815260206004820152601360248201527277686974656c6973742069732061637469766560681b60448201526064015b60405180910390fd5b6104808161095b565b50565b6000806104a3670766c4cf2e0f2000600354610f9790919063ffffffff16565b60045490915060006104bd82670766c4cf2e0f2000610f97565b905060006104d267c249fdd32778000061064a565b90506000816006546104e491906114bb565b83856005546104f391906114bb565b6104fd91906114bb565b61050791906114d3565b905061051587868584610faf565b979650505050505050565b600060065460045460055461053591906114bb565b61053f91906114d3565b905090565b42612a3060015461055591906114bb565b10610607576040516bffffffffffffffffffffffff193360601b1660208201526000906034016040516020818303038152906040528051906020012090506105c9817f0000000000000000000000000000000000000000000000000000000000000000846105c29061155a565b919061109a565b6106055760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b604482015260640161046e565b505b6106108261095b565b5050565b6000546001600160a01b0316331461063e5760405162461bcd60e51b815260040161046e90611624565b6106486000611198565b565b60006106638260035460045461065e610520565b610faf565b92915050565b6000546001600160a01b031633146106935760405162461bcd60e51b815260040161046e90611624565b600154156106e35760405162461bcd60e51b815260206004820152601c60248201527f646973747269627574696f6e20616c7265616479207374617274656400000000604482015260640161046e565b426001556040517ff67a9c9ff66e4a25fdbd2afe53db0cb98c86c5b771ab018c2acb8fe41cb71d5090600090a1565b6000546001600160a01b0316331461073c5760405162461bcd60e51b815260040161046e90611624565b6201518060015461074d91906114bb565b421161075857600080fd5b600254156107a85760405162461bcd60e51b815260206004820152601a60248201527f646973747269627574696f6e20616c726561647920656e646564000000000000604482015260640161046e565b6040516370a0823160e01b81523060048201527f000000000000000000000000000000000000000000000000000000000000000090610869907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610834573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108589190611659565b6001600160a01b03841691906111e8565b426002556040517fd853973d65981a851c2cd5437067724fd08ff44792b1df6237953b4cb4701e7d90600090a150565b6000546001600160a01b031633146108c35760405162461bcd60e51b815260040161046e90611624565b6001600160a01b0381166109285760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161046e565b61048081611198565b6000816109406012600a611756565b61094a9085611762565b6109549190611797565b9392505050565b6000341161099c5760405162461bcd60e51b815260206004820152600e60248201526d6e6f7468696e6720746f2061706560901b604482015260640161046e565b600254156109e55760405162461bcd60e51b8152602060048201526016602482015275191a5cdd1c9a589d5d1a5bdb881a185cc8195b99195960521b604482015260640161046e565b600154600003610a375760405162461bcd60e51b815260206004820181905260248201527f646973747269627574696f6e20686173206e6f74207965742073746172746564604482015260640161046e565b670de0b6b3a764000060035411610aa45760405162461bcd60e51b815260206004820152602b60248201527f646973747269627574696f6e20686173206578636565646564206d617820657860448201526a6368616e6765207261746560a81b606482015260840161046e565b336000908152600760205260409020547f0000000000000000000000000000000000000000000000000000000000000000610adf34836114bb565b1115610b2d5760405162461bcd60e51b815260206004820152601a60248201527f63616e6e6f7420617065206d6f7265207468616e203120455448000000000000604482015260640161046e565b610b3734826114bb565b33600090815260076020526040812091909155600354670de0b6b3a764000090610b62903490610f97565b610b6c9190611797565b90506000610b78610520565b9050808211610d1f5783821015610bc55760405162461bcd60e51b8152602060048201526011602482015270746f6f206d75636820736c69707061676560781b604482015260640161046e565b8160066000828254610bd791906114bb565b90915550610c1190506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633846111e8565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031634614e2090604051600060405180830381858888f193505050503d8060008114610c83576040519150601f19603f3d011682016040523d82523d6000602084013e610c88565b606091505b5050905080610cd95760405162461bcd60e51b815260206004820152601a60248201527f6661696c656420746f2073656e6420746f207472656173757279000000000000604482015260640161046e565b6040805133815260208101859052348183015290517f442151da4f589f7e51fac5b4f285a5e8fc8e105067689027ef065e1e922e19359181900360600190a15050505050565b6000805b348111610df857828410610d6d57600354610d5090610d4a670de0b6b3a764000086611762565b90610931565b610d5a90826114bb565b9050610d6683836114bb565b9150610d7e565b610d7784836114bb565b9150610df8565b600454600554610d8e91906114bb565b600555600354610da690670766c4cf2e0f2000610f97565b600355600454610dbe90670766c4cf2e0f2000610f97565b600455600354670de0b6b3a764000090610de290610ddc84346114d3565b90610f97565b610dec9190611797565b93506004549250610d23565b8160066000828254610e0a91906114bb565b909155505085821015610e535760405162461bcd60e51b8152602060048201526011602482015270746f6f206d75636820736c69707061676560781b604482015260640161046e565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031634614e2090604051600060405180830381858888f193505050503d8060008114610ec5576040519150601f19603f3d011682016040523d82523d6000602084013e610eca565b606091505b5050905080610f1b5760405162461bcd60e51b815260206004820152601a60248201527f6661696c656420746f2073656e6420746f207472656173757279000000000000604482015260640161046e565b610f4f6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633856111e8565b6040805133815260208101859052348183015290517f442151da4f589f7e51fac5b4f285a5e8fc8e105067689027ef065e1e922e19359181900360600190a150505050505050565b6000610fa56012600a611756565b61094a8385611762565b600080670de0b6b3a7640000610fc58787610f97565b610fcf9190611797565b9050828111610fdf579050611092565b60008085875b89831161108a578685106110265761100981610d4a670de0b6b3a76400008a611762565b61101390846114bb565b925061101f87856114bb565b9350611037565b61103085856114bb565b935061108a565b61104981670766c4cf2e0f2000610f97565b905061105d82670766c4cf2e0f2000610f97565b9150670de0b6b3a764000061107682610ddc868e6114d3565b6110809190611797565b9450819650610fe5565b509193505050505b949350505050565b602083015151835160009190825b8281101561118d576110bb6002836117ab565b61ffff1660000361111c5785876020015182815181106110dd576110dd6117cc565b60200260200101516040516020016110ff929190918252602082015260400190565b60405160208183030381529060405280519060200120955061116e565b86602001518181518110611132576111326117cc565b602002602001015186604051602001611155929190918252602082015260400190565b6040516020818303038152906040528051906020012095505b6111796002836117e2565b91508061118581611803565b9150506110a8565b505050911492915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261123a90849061123f565b505050565b6000611294826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166113119092919063ffffffff16565b80519091501561123a57808060200190518101906112b2919061181c565b61123a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161046e565b60606110928484600085856001600160a01b0385163b6113735760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161046e565b600080866001600160a01b0316858760405161138f919061186e565b60006040518083038185875af1925050503d80600081146113cc576040519150601f19603f3d011682016040523d82523d6000602084013e6113d1565b606091505b5091509150610515828286606083156113eb575081610954565b8251156113fb5782518084602001fd5b8160405162461bcd60e51b815260040161046e919061188a565b60006020828403121561142757600080fd5b5035919050565b60006020828403121561144057600080fd5b81356001600160a01b038116811461095457600080fd5b6000806040838503121561146a57600080fd5b82359150602083013567ffffffffffffffff81111561148857600080fd5b83016040818603121561149a57600080fd5b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b600082198211156114ce576114ce6114a5565b500190565b6000828210156114e5576114e56114a5565b500390565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611523576115236114ea565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611552576115526114ea565b604052919050565b60006040823603121561156c57600080fd5b611574611500565b823561ffff8116811461158657600080fd5b815260208381013567ffffffffffffffff808211156115a457600080fd5b9085019036601f8301126115b757600080fd5b8135818111156115c9576115c96114ea565b8060051b91506115da848301611529565b81815291830184019184810190368411156115f457600080fd5b938501935b83851015611612578435825293850193908501906115f9565b94860194909452509295945050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561166b57600080fd5b5051919050565b600181815b808511156116ad578160001904821115611693576116936114a5565b808516156116a057918102915b93841c9390800290611677565b509250929050565b6000826116c457506001610663565b816116d157506000610663565b81600181146116e757600281146116f15761170d565b6001915050610663565b60ff841115611702576117026114a5565b50506001821b610663565b5060208310610133831016604e8410600b8410161715611730575081810a610663565b61173a8383611672565b806000190482111561174e5761174e6114a5565b029392505050565b600061095483836116b5565b600081600019048311821515161561177c5761177c6114a5565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826117a6576117a6611781565b500490565b600061ffff808416806117c0576117c0611781565b92169190910692915050565b634e487b7160e01b600052603260045260246000fd5b600061ffff808416806117f7576117f7611781565b92169190910492915050565b600060018201611815576118156114a5565b5060010190565b60006020828403121561182e57600080fd5b8151801515811461095457600080fd5b60005b83811015611859578181015183820152602001611841565b83811115611868576000848401525b50505050565b6000825161188081846020870161183e565b9190910192915050565b60208152600082518060208401526118a981604085016020870161183e565b601f01601f1916919091016040019291505056fea264697066735822122062c116a219f440f1a83bbdd0ffe762bbb5f27f2c9535b7c278a2a1c0b059bcb164736f6c634300080d00330000000000000000000000009ae380f0272e2162340a5bb646c354271c0f5cfc000000000000000000000000b27dc5f8286f063f11491c8f349053cb37718bea0000000000000000000000000000000000000000000000000de0b6b3a764000076de4ca3f6408ee275c14b56674b52851e1e2bf23bff37cb9bcca2bc868a8406
Deployed Bytecode
0x6080604052600436106101405760003560e01c8063571b1f8a116100b6578063b718e8721161006f578063b718e87214610373578063be9a655514610389578063efbe1c1c1461039e578063f21f537d146103b3578063f2fde38b146103c9578063fc0c546a146103e957600080fd5b8063571b1f8a146102a857806361d027b3146102be578063715018a61461030a5780638da5cb5b1461031f578063a2309ff81461033d578063a7575e461461035357600080fd5b80632eb4a7ab116101085780632eb4a7ab146102045780632fb63dd4146102385780633ba0b9a9146102545780633cfb71d01461026a5780633d6a71e41461027f57806345fc96be1461029557600080fd5b806306d586bb1461014557806307be2a9c1461018c5780631f8abaa4146101a1578063206a9ad3146101ce578063220e259f146101ee575b600080fd5b34801561015157600080fd5b506101797f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b6040519081526020015b60405180910390f35b61019f61019a366004611415565b61041d565b005b3480156101ad57600080fd5b506101796101bc36600461142e565b60076020526000908152604090205481565b3480156101da57600080fd5b506101796101e9366004611415565b610483565b3480156101fa57600080fd5b5061017960045481565b34801561021057600080fd5b506101797f76de4ca3f6408ee275c14b56674b52851e1e2bf23bff37cb9bcca2bc868a840681565b34801561024457600080fd5b5061017967c249fdd32778000081565b34801561026057600080fd5b5061017960035481565b34801561027657600080fd5b50610179610520565b34801561028b57600080fd5b5061017960025481565b61019f6102a3366004611457565b610544565b3480156102b457600080fd5b50610179612a3081565b3480156102ca57600080fd5b506102f27f000000000000000000000000b27dc5f8286f063f11491c8f349053cb37718bea81565b6040516001600160a01b039091168152602001610183565b34801561031657600080fd5b5061019f610614565b34801561032b57600080fd5b506000546001600160a01b03166102f2565b34801561034957600080fd5b5061017960065481565b34801561035f57600080fd5b5061017961036e366004611415565b61064a565b34801561037f57600080fd5b5061017960055481565b34801561039557600080fd5b5061019f610669565b3480156103aa57600080fd5b5061019f610712565b3480156103bf57600080fd5b5061017960015481565b3480156103d557600080fd5b5061019f6103e436600461142e565b610899565b3480156103f557600080fd5b506102f27f0000000000000000000000009ae380f0272e2162340a5bb646c354271c0f5cfc81565b42612a3060015461042e91906114bb565b11156104775760405162461bcd60e51b815260206004820152601360248201527277686974656c6973742069732061637469766560681b60448201526064015b60405180910390fd5b6104808161095b565b50565b6000806104a3670766c4cf2e0f2000600354610f9790919063ffffffff16565b60045490915060006104bd82670766c4cf2e0f2000610f97565b905060006104d267c249fdd32778000061064a565b90506000816006546104e491906114bb565b83856005546104f391906114bb565b6104fd91906114bb565b61050791906114d3565b905061051587868584610faf565b979650505050505050565b600060065460045460055461053591906114bb565b61053f91906114d3565b905090565b42612a3060015461055591906114bb565b10610607576040516bffffffffffffffffffffffff193360601b1660208201526000906034016040516020818303038152906040528051906020012090506105c9817f76de4ca3f6408ee275c14b56674b52851e1e2bf23bff37cb9bcca2bc868a8406846105c29061155a565b919061109a565b6106055760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b604482015260640161046e565b505b6106108261095b565b5050565b6000546001600160a01b0316331461063e5760405162461bcd60e51b815260040161046e90611624565b6106486000611198565b565b60006106638260035460045461065e610520565b610faf565b92915050565b6000546001600160a01b031633146106935760405162461bcd60e51b815260040161046e90611624565b600154156106e35760405162461bcd60e51b815260206004820152601c60248201527f646973747269627574696f6e20616c7265616479207374617274656400000000604482015260640161046e565b426001556040517ff67a9c9ff66e4a25fdbd2afe53db0cb98c86c5b771ab018c2acb8fe41cb71d5090600090a1565b6000546001600160a01b0316331461073c5760405162461bcd60e51b815260040161046e90611624565b6201518060015461074d91906114bb565b421161075857600080fd5b600254156107a85760405162461bcd60e51b815260206004820152601a60248201527f646973747269627574696f6e20616c726561647920656e646564000000000000604482015260640161046e565b6040516370a0823160e01b81523060048201527f0000000000000000000000009ae380f0272e2162340a5bb646c354271c0f5cfc90610869907f000000000000000000000000b27dc5f8286f063f11491c8f349053cb37718bea906001600160a01b038416906370a0823190602401602060405180830381865afa158015610834573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108589190611659565b6001600160a01b03841691906111e8565b426002556040517fd853973d65981a851c2cd5437067724fd08ff44792b1df6237953b4cb4701e7d90600090a150565b6000546001600160a01b031633146108c35760405162461bcd60e51b815260040161046e90611624565b6001600160a01b0381166109285760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161046e565b61048081611198565b6000816109406012600a611756565b61094a9085611762565b6109549190611797565b9392505050565b6000341161099c5760405162461bcd60e51b815260206004820152600e60248201526d6e6f7468696e6720746f2061706560901b604482015260640161046e565b600254156109e55760405162461bcd60e51b8152602060048201526016602482015275191a5cdd1c9a589d5d1a5bdb881a185cc8195b99195960521b604482015260640161046e565b600154600003610a375760405162461bcd60e51b815260206004820181905260248201527f646973747269627574696f6e20686173206e6f74207965742073746172746564604482015260640161046e565b670de0b6b3a764000060035411610aa45760405162461bcd60e51b815260206004820152602b60248201527f646973747269627574696f6e20686173206578636565646564206d617820657860448201526a6368616e6765207261746560a81b606482015260840161046e565b336000908152600760205260409020547f0000000000000000000000000000000000000000000000000de0b6b3a7640000610adf34836114bb565b1115610b2d5760405162461bcd60e51b815260206004820152601a60248201527f63616e6e6f7420617065206d6f7265207468616e203120455448000000000000604482015260640161046e565b610b3734826114bb565b33600090815260076020526040812091909155600354670de0b6b3a764000090610b62903490610f97565b610b6c9190611797565b90506000610b78610520565b9050808211610d1f5783821015610bc55760405162461bcd60e51b8152602060048201526011602482015270746f6f206d75636820736c69707061676560781b604482015260640161046e565b8160066000828254610bd791906114bb565b90915550610c1190506001600160a01b037f0000000000000000000000009ae380f0272e2162340a5bb646c354271c0f5cfc1633846111e8565b60007f000000000000000000000000b27dc5f8286f063f11491c8f349053cb37718bea6001600160a01b031634614e2090604051600060405180830381858888f193505050503d8060008114610c83576040519150601f19603f3d011682016040523d82523d6000602084013e610c88565b606091505b5050905080610cd95760405162461bcd60e51b815260206004820152601a60248201527f6661696c656420746f2073656e6420746f207472656173757279000000000000604482015260640161046e565b6040805133815260208101859052348183015290517f442151da4f589f7e51fac5b4f285a5e8fc8e105067689027ef065e1e922e19359181900360600190a15050505050565b6000805b348111610df857828410610d6d57600354610d5090610d4a670de0b6b3a764000086611762565b90610931565b610d5a90826114bb565b9050610d6683836114bb565b9150610d7e565b610d7784836114bb565b9150610df8565b600454600554610d8e91906114bb565b600555600354610da690670766c4cf2e0f2000610f97565b600355600454610dbe90670766c4cf2e0f2000610f97565b600455600354670de0b6b3a764000090610de290610ddc84346114d3565b90610f97565b610dec9190611797565b93506004549250610d23565b8160066000828254610e0a91906114bb565b909155505085821015610e535760405162461bcd60e51b8152602060048201526011602482015270746f6f206d75636820736c69707061676560781b604482015260640161046e565b60007f000000000000000000000000b27dc5f8286f063f11491c8f349053cb37718bea6001600160a01b031634614e2090604051600060405180830381858888f193505050503d8060008114610ec5576040519150601f19603f3d011682016040523d82523d6000602084013e610eca565b606091505b5050905080610f1b5760405162461bcd60e51b815260206004820152601a60248201527f6661696c656420746f2073656e6420746f207472656173757279000000000000604482015260640161046e565b610f4f6001600160a01b037f0000000000000000000000009ae380f0272e2162340a5bb646c354271c0f5cfc1633856111e8565b6040805133815260208101859052348183015290517f442151da4f589f7e51fac5b4f285a5e8fc8e105067689027ef065e1e922e19359181900360600190a150505050505050565b6000610fa56012600a611756565b61094a8385611762565b600080670de0b6b3a7640000610fc58787610f97565b610fcf9190611797565b9050828111610fdf579050611092565b60008085875b89831161108a578685106110265761100981610d4a670de0b6b3a76400008a611762565b61101390846114bb565b925061101f87856114bb565b9350611037565b61103085856114bb565b935061108a565b61104981670766c4cf2e0f2000610f97565b905061105d82670766c4cf2e0f2000610f97565b9150670de0b6b3a764000061107682610ddc868e6114d3565b6110809190611797565b9450819650610fe5565b509193505050505b949350505050565b602083015151835160009190825b8281101561118d576110bb6002836117ab565b61ffff1660000361111c5785876020015182815181106110dd576110dd6117cc565b60200260200101516040516020016110ff929190918252602082015260400190565b60405160208183030381529060405280519060200120955061116e565b86602001518181518110611132576111326117cc565b602002602001015186604051602001611155929190918252602082015260400190565b6040516020818303038152906040528051906020012095505b6111796002836117e2565b91508061118581611803565b9150506110a8565b505050911492915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261123a90849061123f565b505050565b6000611294826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166113119092919063ffffffff16565b80519091501561123a57808060200190518101906112b2919061181c565b61123a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161046e565b60606110928484600085856001600160a01b0385163b6113735760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161046e565b600080866001600160a01b0316858760405161138f919061186e565b60006040518083038185875af1925050503d80600081146113cc576040519150601f19603f3d011682016040523d82523d6000602084013e6113d1565b606091505b5091509150610515828286606083156113eb575081610954565b8251156113fb5782518084602001fd5b8160405162461bcd60e51b815260040161046e919061188a565b60006020828403121561142757600080fd5b5035919050565b60006020828403121561144057600080fd5b81356001600160a01b038116811461095457600080fd5b6000806040838503121561146a57600080fd5b82359150602083013567ffffffffffffffff81111561148857600080fd5b83016040818603121561149a57600080fd5b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b600082198211156114ce576114ce6114a5565b500190565b6000828210156114e5576114e56114a5565b500390565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611523576115236114ea565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611552576115526114ea565b604052919050565b60006040823603121561156c57600080fd5b611574611500565b823561ffff8116811461158657600080fd5b815260208381013567ffffffffffffffff808211156115a457600080fd5b9085019036601f8301126115b757600080fd5b8135818111156115c9576115c96114ea565b8060051b91506115da848301611529565b81815291830184019184810190368411156115f457600080fd5b938501935b83851015611612578435825293850193908501906115f9565b94860194909452509295945050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561166b57600080fd5b5051919050565b600181815b808511156116ad578160001904821115611693576116936114a5565b808516156116a057918102915b93841c9390800290611677565b509250929050565b6000826116c457506001610663565b816116d157506000610663565b81600181146116e757600281146116f15761170d565b6001915050610663565b60ff841115611702576117026114a5565b50506001821b610663565b5060208310610133831016604e8410600b8410161715611730575081810a610663565b61173a8383611672565b806000190482111561174e5761174e6114a5565b029392505050565b600061095483836116b5565b600081600019048311821515161561177c5761177c6114a5565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826117a6576117a6611781565b500490565b600061ffff808416806117c0576117c0611781565b92169190910692915050565b634e487b7160e01b600052603260045260246000fd5b600061ffff808416806117f7576117f7611781565b92169190910492915050565b600060018201611815576118156114a5565b5060010190565b60006020828403121561182e57600080fd5b8151801515811461095457600080fd5b60005b83811015611859578181015183820152602001611841565b83811115611868576000848401525b50505050565b6000825161188081846020870161183e565b9190910192915050565b60208152600082518060208401526118a981604085016020870161183e565b601f01601f1916919091016040019291505056fea264697066735822122062c116a219f440f1a83bbdd0ffe762bbb5f27f2c9535b7c278a2a1c0b059bcb164736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009ae380f0272e2162340a5bb646c354271c0f5cfc000000000000000000000000b27dc5f8286f063f11491c8f349053cb37718bea0000000000000000000000000000000000000000000000000de0b6b3a764000076de4ca3f6408ee275c14b56674b52851e1e2bf23bff37cb9bcca2bc868a8406
-----Decoded View---------------
Arg [0] : _token (address): 0x9aE380F0272E2162340a5bB646c354271c0F5cFC
Arg [1] : _treasury (address): 0xB27DC5f8286f063F11491c8f349053cB37718bea
Arg [2] : _maxPerUser (uint256): 1000000000000000000
Arg [3] : _merkleRoot (bytes32): 0x76de4ca3f6408ee275c14b56674b52851e1e2bf23bff37cb9bcca2bc868a8406
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000009ae380f0272e2162340a5bb646c354271c0f5cfc
Arg [1] : 000000000000000000000000b27dc5f8286f063f11491c8f349053cb37718bea
Arg [2] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [3] : 76de4ca3f6408ee275c14b56674b52851e1e2bf23bff37cb9bcca2bc868a8406
Deployed Bytecode Sourcemap
22194:7678:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22881:35;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;22881:35:0;;;;;;;;26786:196;;;;;;:::i;:::-;;:::i;:::-;;23177:46;;;;;;;;;;-1:-1:-1;23177:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;24198:625;;;;;;;;;;-1:-1:-1;24198:625:0;;;;;:::i;:::-;;:::i;23061:33::-;;;;;;;;;;;;;;;;22923:35;;;;;;;;;;;;;;;22502:47;;;;;;;;;;;;22544:5;22502:47;;23027:27;;;;;;;;;;;;;;;;26156:147;;;;;;;;;;;;;:::i;22996:22::-;;;;;;;;;;;;;;;;26311:388;;;;;;:::i;:::-;;:::i;22556:52::-;;;;;;;;;;;;22601:7;22556:52;;22841:33;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1472:32:1;;;1454:51;;1442:2;1427:18;22841:33:0;1308:203:1;8351:103:0;;;;;;;;;;;;;:::i;7700:87::-;;;;;;;;;;-1:-1:-1;7746:7:0;7773:6;-1:-1:-1;;;;;7773:6:0;7700:87;;23142:26;;;;;;;;;;;;;;;;23720:293;;;;;;;;;;-1:-1:-1;23720:293:0;;;;;:::i;:::-;;:::i;23101:34::-;;;;;;;;;;;;;;;;29310:193;;;;;;;;;;;;;:::i;29511:358::-;;;;;;;;;;;;;:::i;22965:24::-;;;;;;;;;;;;;;;;8609:201;;;;;;;;;;-1:-1:-1;8609:201:0;;;;;:::i;:::-;;:::i;22804:30::-;;;;;;;;;;;;;;;26786:196;26903:15;22601:7;26869:9;;:30;;;;:::i;:::-;:49;;26861:81;;;;-1:-1:-1;;;26861:81:0;;1983:2:1;26861:81:0;;;1965:21:1;2022:2;2002:18;;;1995:30;-1:-1:-1;;;2041:18:1;;;2034:49;2100:18;;26861:81:0;;;;;;;;;26953:21;26958:15;26953:4;:21::i;:::-;26786:196;:::o;24198:625::-;24273:7;24293:27;24323:37;22714:10;24323:12;;:20;;:37;;;;:::i;:::-;24401:18;;24293:67;;-1:-1:-1;24371:27:0;24452:44;24401:18;22714:10;24452:27;:44::i;:::-;24430:66;;24507:19;24529:36;22544:5;24529:19;:36::i;:::-;24507:58;;24576:21;24701:11;24687;;:25;;;;:::i;:::-;24659:11;24623:19;24601;;:41;;;;:::i;:::-;24600:70;;;;:::i;:::-;:113;;;;:::i;:::-;24576:137;;24731:84;24752:13;24767:19;24788:11;24801:13;24731:20;:84::i;:::-;24724:91;24198:625;-1:-1:-1;;;;;;;24198:625:0:o;26156:147::-;26214:7;26284:11;;26263:18;;26241:19;;:40;;;;:::i;:::-;:54;;;;:::i;:::-;26234:61;;26156:147;:::o;26311:388::-;26490:15;22601:7;26456:9;;:30;;;;:::i;:::-;:49;26452:208;;26547:28;;-1:-1:-1;;26564:10:0;2408:2:1;2404:15;2400:53;26547:28:0;;;2388:66:1;26522:12:0;;2470::1;;26547:28:0;;;;;;;;;;;;26537:39;;;;;;26522:54;;26599:31;26613:4;26619:10;26599:5;:13;;;:::i;:::-;;:31;:13;:31::i;:::-;26591:57;;;;-1:-1:-1;;;26591:57:0;;4588:2:1;26591:57:0;;;4570:21:1;4627:2;4607:18;;;4600:30;-1:-1:-1;;;4646:18:1;;;4639:43;4699:18;;26591:57:0;4386:337:1;26591:57:0;26507:153;26452:208;26670:21;26675:15;26670:4;:21::i;:::-;26311:388;;:::o;8351:103::-;7746:7;7773:6;-1:-1:-1;;;;;7773:6:0;6500:10;7920:23;7912:68;;;;-1:-1:-1;;;7912:68:0;;;;;;;:::i;:::-;8416:30:::1;8443:1;8416:18;:30::i;:::-;8351:103::o:0;23720:293::-;23793:7;23833:172;23872:13;23904:12;;23935:18;;23972;:16;:18::i;:::-;23833:20;:172::i;:::-;23813:192;23720:293;-1:-1:-1;;23720:293:0:o;29310:193::-;7746:7;7773:6;-1:-1:-1;;;;;7773:6:0;6500:10;7920:23;7912:68;;;;-1:-1:-1;;;7912:68:0;;;;;;;:::i;:::-;29374:9:::1;::::0;:14;29366:55:::1;;;::::0;-1:-1:-1;;;29366:55:0;;5291:2:1;29366:55:0::1;::::0;::::1;5273:21:1::0;5330:2;5310:18;;;5303:30;5369;5349:18;;;5342:58;5417:18;;29366:55:0::1;5089:352:1::0;29366:55:0::1;29444:15;29432:9;:27:::0;29475:20:::1;::::0;::::1;::::0;;;::::1;29310:193::o:0;29511:358::-;7746:7;7773:6;-1:-1:-1;;;;;7773:6:0;6500:10;7920:23;7912:68;;;;-1:-1:-1;;;7912:68:0;;;;;;;:::i;:::-;22487:6:::1;29591:9;;:24;;;;:::i;:::-;29573:15;:42;29565:51;;;::::0;::::1;;29635:7;::::0;:12;29627:51:::1;;;::::0;-1:-1:-1;;;29627:51:0;;5648:2:1;29627:51:0::1;::::0;::::1;5630:21:1::0;5687:2;5667:18;;;5660:30;5726:28;5706:18;;;5699:56;5772:18;;29627:51:0::1;5446:350:1::0;29627:51:0::1;29759:31;::::0;-1:-1:-1;;;29759:31:0;;29784:4:::1;29759:31;::::0;::::1;1454:51:1::0;29712:5:0::1;::::0;29729:62:::1;::::0;29749:8:::1;::::0;-1:-1:-1;;;;;29759:16:0;::::1;::::0;::::1;::::0;1427:18:1;;29759:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29729:19:0;::::1;::::0;:62;:19:::1;:62::i;:::-;29812:15;29802:7;:25:::0;29843:18:::1;::::0;::::1;::::0;;;::::1;29554:315;29511:358::o:0;8609:201::-;7746:7;7773:6;-1:-1:-1;;;;;7773:6:0;6500:10;7920:23;7912:68;;;;-1:-1:-1;;;7912:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8698:22:0;::::1;8690:73;;;::::0;-1:-1:-1;;;8690:73:0;;6192:2:1;8690:73:0::1;::::0;::::1;6174:21:1::0;6231:2;6211:18;;;6204:30;6270:34;6250:18;;;6243:62;-1:-1:-1;;;6321:18:1;;;6314:36;6367:19;;8690:73:0::1;5990:402:1::0;8690:73:0::1;8774:28;8793:8;8774:18;:28::i;21983:110::-:0;22045:7;22084:1;21844:12;21803:2;21844;:12;:::i;:::-;22073:7;;:1;:7;:::i;:::-;22072:13;;;;:::i;:::-;22065:20;21983:110;-1:-1:-1;;;21983:110:0:o;26990:2312::-;27069:1;27057:9;:13;27049:40;;;;-1:-1:-1;;;27049:40:0;;8403:2:1;27049:40:0;;;8385:21:1;8442:2;8422:18;;;8415:30;-1:-1:-1;;;8461:18:1;;;8454:44;8515:18;;27049:40:0;8201:338:1;27049:40:0;27108:7;;:12;27100:47;;;;-1:-1:-1;;;27100:47:0;;8746:2:1;27100:47:0;;;8728:21:1;8785:2;8765:18;;;8758:30;-1:-1:-1;;;8804:18:1;;;8797:52;8866:18;;27100:47:0;8544:346:1;27100:47:0;27166:9;;27179:1;27166:14;27158:59;;;;-1:-1:-1;;;27158:59:0;;9097:2:1;27158:59:0;;;9079:21:1;;;9116:18;;;9109:30;9175:34;9155:18;;;9148:62;9227:18;;27158:59:0;8895:356:1;27158:59:0;27251:4;27236:12;;:19;27228:75;;;;-1:-1:-1;;;27228:75:0;;9458:2:1;27228:75:0;;;9440:21:1;9497:2;9477:18;;;9470:30;9536:34;9516:18;;;9509:62;-1:-1:-1;;;9587:18:1;;;9580:41;9638:19;;27228:75:0;9256:407:1;27228:75:0;27343:10;27316:12;27331:23;;;:11;:23;;;;;;27393:10;27373:16;27380:9;27331:23;27373:16;:::i;:::-;:30;;27365:69;;;;-1:-1:-1;;;27365:69:0;;9870:2:1;27365:69:0;;;9852:21:1;9909:2;9889:18;;;9882:30;9948:28;9928:18;;;9921:56;9994:18;;27365:69:0;9668:350:1;27365:69:0;27471:16;27478:9;27471:4;:16;:::i;:::-;27457:10;27445:23;;;;:11;:23;;;;;:42;;;;27543:12;;22659:4;;27523:33;;27524:9;;27523:19;:33::i;:::-;:51;;;;:::i;:::-;27500:74;;27585:21;27609:18;:16;:18::i;:::-;27585:42;;27658:13;27642:12;:29;27638:471;;27712:15;27696:12;:31;;27688:61;;;;-1:-1:-1;;;27688:61:0;;10225:2:1;27688:61:0;;;10207:21:1;10264:2;10244:18;;;10237:30;-1:-1:-1;;;10283:18:1;;;10276:47;10340:18;;27688:61:0;10023:341:1;27688:61:0;27779:12;27764:11;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;27806:52:0;;-1:-1:-1;;;;;;27813:5:0;27806:26;27833:10;27845:12;27806:26;:52::i;:::-;27874:9;27897:8;-1:-1:-1;;;;;27889:22:0;27919:9;27935:5;27889:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27873:72;;;27968:4;27960:43;;;;-1:-1:-1;;;27960:43:0;;10781:2:1;27960:43:0;;;10763:21:1;10820:2;10800:18;;;10793:30;10859:28;10839:18;;;10832:56;10905:18;;27960:43:0;10579:350:1;27960:43:0;28023:53;;;28040:10;11136:51:1;;11218:2;11203:18;;11196:34;;;28066:9:0;11246:18:1;;;11239:34;28023:53:0;;;;;;;11124:2:1;28023:53:0;;;28091:7;;;;26990:2312;:::o;27638:471::-;28121:21;28153:23;28189:721;28215:9;28196:15;:28;28189:721;;28261:13;28245:12;:29;28241:287;;28356:12;;28314:55;;28315:31;22659:4;28315:13;:31;:::i;:::-;28314:41;;:55::i;:::-;28295:74;;;;:::i;:::-;;-1:-1:-1;28388:30:0;28405:13;28388:30;;:::i;:::-;;;28241:287;;;28459:29;28476:12;28459:29;;:::i;:::-;;;28507:5;;28241:287;28586:18;;28564:19;;:40;;;;:::i;:::-;28542:19;:62;28634:12;;:37;;22714:10;28634:20;:37::i;:::-;28619:12;:52;28707:18;;:43;;22714:10;28707:26;:43::i;:::-;28686:18;:64;28818:12;;22659:4;;28780:51;;28781:27;28793:15;28781:9;:27;:::i;:::-;28780:37;;:51::i;:::-;:69;;;;:::i;:::-;28765:84;;28880:18;;28864:34;;28189:721;;;28935:13;28920:11;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;28969:32:0;;;;28961:62;;;;-1:-1:-1;;;28961:62:0;;10225:2:1;28961:62:0;;;10207:21:1;10264:2;10244:18;;;10237:30;-1:-1:-1;;;10283:18:1;;;10276:47;10340:18;;28961:62:0;10023:341:1;28961:62:0;29035:9;29058:8;-1:-1:-1;;;;;29050:22:0;29080:9;29096:5;29050:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29034:72;;;29125:4;29117:43;;;;-1:-1:-1;;;29117:43:0;;10781:2:1;29117:43:0;;;10763:21:1;10820:2;10800:18;;;10793:30;10859:28;10839:18;;;10832:56;10905:18;;29117:43:0;10579:350:1;29117:43:0;29171:53;-1:-1:-1;;;;;29178:5:0;29171:26;29198:10;29210:13;29171:26;:53::i;:::-;29240:54;;;29257:10;11136:51:1;;11218:2;11203:18;;11196:34;;;29284:9:0;11246:18:1;;;11239:34;29240:54:0;;;;;;;11124:2:1;29240:54:0;;;27038:2264;;;;;;26990:2312;:::o;21865:110::-;21927:7;21844:12;21803:2;21844;:12;:::i;:::-;21955:5;21959:1;21955;:5;:::i;24831:1317::-;25030:7;;22659:4;25073:42;:13;25095:19;25073:21;:42::i;:::-;:60;;;;:::i;:::-;25050:83;;25164:13;25148:12;:29;25144:81;;25201:12;-1:-1:-1;25194:19:0;;25144:81;25237:21;;25329:18;25385:19;25417:693;25443:13;25424:15;:32;25417:693;;25493:13;25477:12;:29;25473:291;;25546:59;25588:16;25547:31;22659:4;25547:13;:31;:::i;25546:59::-;25527:78;;;;:::i;:::-;;-1:-1:-1;25624:30:0;25641:13;25624:30;;:::i;:::-;;;25473:291;;;25695:29;25712:12;25695:29;;:::i;:::-;;;25743:5;;25473:291;25797:41;:16;22714:10;25797:24;:41::i;:::-;25778:60;-1:-1:-1;25871:40:0;:15;22714:10;25871:23;:40::i;:::-;25853:58;-1:-1:-1;22659:4:0;25958:59;26000:16;25959:31;25975:15;25959:13;:31;:::i;25958:59::-;:94;;;;:::i;:::-;25926:126;;26083:15;26067:31;;25417:693;;;-1:-1:-1;26127:13:0;;-1:-1:-1;;;;24831:1317:0;;;;;;;:::o;285:588::-;447:12;;;;:19;496:15;;413:4;;447:19;413:4;522:306;546:6;542:1;:10;522:306;;;578:13;590:1;578:9;:13;:::i;:::-;:18;;595:1;578:18;574:214;;651:4;657:5;:12;;;670:1;657:15;;;;;;;;:::i;:::-;;;;;;;634:39;;;;;;;;11757:19:1;;;11801:2;11792:12;;11785:28;11838:2;11829:12;;11600:247;634:39:0;;;;;;;;;;;;;624:50;;;;;;617:57;;574:214;;;749:5;:12;;;762:1;749:15;;;;;;;;:::i;:::-;;;;;;;766:4;732:39;;;;;;;;11757:19:1;;;11801:2;11792:12;;11785:28;11838:2;11829:12;;11600:247;732:39:0;;;;;;;;;;;;;722:50;;;;;;715:57;;574:214;802:14;815:1;802:14;;:::i;:::-;;-1:-1:-1;554:3:0;;;;:::i;:::-;;;;522:306;;;-1:-1:-1;;;847:18:0;;;285:588;-1:-1:-1;;285:588:0:o;8970:191::-;9044:16;9063:6;;-1:-1:-1;;;;;9080:17:0;;;-1:-1:-1;;;;;;9080:17:0;;;;;;9113:40;;9063:6;;;;;;;9113:40;;9044:16;9113:40;9033:128;8970:191;:::o;18378:211::-;18522:58;;;-1:-1:-1;;;;;12376:32:1;;18522:58:0;;;12358:51:1;12425:18;;;;12418:34;;;18522:58:0;;;;;;;;;;12331:18:1;;;;18522:58:0;;;;;;;;-1:-1:-1;;;;;18522:58:0;-1:-1:-1;;;18522:58:0;;;18495:86;;18515:5;;18495:19;:86::i;:::-;18378:211;;;:::o;20951:716::-;21375:23;21401:69;21429:4;21401:69;;;;;;;;;;;;;;;;;21409:5;-1:-1:-1;;;;;21401:27:0;;;:69;;;;;:::i;:::-;21485:17;;21375:95;;-1:-1:-1;21485:21:0;21481:179;;21582:10;21571:30;;;;;;;;;;;;:::i;:::-;21563:85;;;;-1:-1:-1;;;21563:85:0;;12947:2:1;21563:85:0;;;12929:21:1;12986:2;12966:18;;;12959:30;13025:34;13005:18;;;12998:62;-1:-1:-1;;;13076:18:1;;;13069:40;13126:19;;21563:85:0;12745:406:1;13152:229:0;13289:12;13321:52;13343:6;13351:4;13357:1;13360:12;13289;-1:-1:-1;;;;;10702:19:0;;;14559:60;;;;-1:-1:-1;;;14559:60:0;;13765:2:1;14559:60:0;;;13747:21:1;13804:2;13784:18;;;13777:30;13843:31;13823:18;;;13816:59;13892:18;;14559:60:0;13563:353:1;14559:60:0;14633:12;14647:23;14674:6;-1:-1:-1;;;;;14674:11:0;14693:5;14700:4;14674:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14632:73;;;;14723:51;14740:7;14749:10;14761:12;17108;17137:7;17133:530;;;-1:-1:-1;17168:10:0;17161:17;;17133:530;17282:17;;:21;17278:374;;17480:10;17474:17;17541:15;17528:10;17524:2;17520:19;17513:44;17278:374;17623:12;17616:20;;-1:-1:-1;;;17616:20:0;;;;;;;;:::i;196:180:1:-;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;-1:-1:-1;347:23:1;;196:180;-1:-1:-1;196:180:1:o;381:286::-;440:6;493:2;481:9;472:7;468:23;464:32;461:52;;;509:1;506;499:12;461:52;535:23;;-1:-1:-1;;;;;587:31:1;;577:42;;567:70;;633:1;630;623:12;854:449;944:6;952;1005:2;993:9;984:7;980:23;976:32;973:52;;;1021:1;1018;1011:12;973:52;1057:9;1044:23;1034:33;;1118:2;1107:9;1103:18;1090:32;1145:18;1137:6;1134:30;1131:50;;;1177:1;1174;1167:12;1131:50;1200:22;;1256:2;1238:16;;;1234:25;1231:45;;;1272:1;1269;1262:12;1231:45;1295:2;1285:12;;;854:449;;;;;:::o;1516:127::-;1577:10;1572:3;1568:20;1565:1;1558:31;1608:4;1605:1;1598:15;1632:4;1629:1;1622:15;1648:128;1688:3;1719:1;1715:6;1712:1;1709:13;1706:39;;;1725:18;;:::i;:::-;-1:-1:-1;1761:9:1;;1648:128::o;2129:125::-;2169:4;2197:1;2194;2191:8;2188:34;;;2202:18;;:::i;:::-;-1:-1:-1;2239:9:1;;2129:125::o;2493:127::-;2554:10;2549:3;2545:20;2542:1;2535:31;2585:4;2582:1;2575:15;2609:4;2606:1;2599:15;2625:257;2697:4;2691:11;;;2729:17;;2776:18;2761:34;;2797:22;;;2758:62;2755:88;;;2823:18;;:::i;:::-;2859:4;2852:24;2625:257;:::o;2887:275::-;2958:2;2952:9;3023:2;3004:13;;-1:-1:-1;;3000:27:1;2988:40;;3058:18;3043:34;;3079:22;;;3040:62;3037:88;;;3105:18;;:::i;:::-;3141:2;3134:22;2887:275;;-1:-1:-1;2887:275:1:o;3167:1214::-;3259:9;3318:4;3310:5;3294:14;3290:26;3286:37;3283:57;;;3336:1;3333;3326:12;3283:57;3364:22;;:::i;:::-;3423:5;3410:19;3473:6;3464:7;3460:20;3451:7;3448:33;3438:61;;3495:1;3492;3485:12;3438:61;3508:24;;3551:2;3589:14;;;3576:28;3623:18;3653:14;;;3650:34;;;3680:1;3677;3670:12;3650:34;3703:18;;;;3759:14;3752:4;3744:13;;3740:34;3730:62;;3788:1;3785;3778:12;3730:62;3824:2;3811:16;3846:2;3842;3839:10;3836:36;;;3852:18;;:::i;:::-;3898:2;3895:1;3891:10;3881:20;;3921:28;3945:2;3941;3937:11;3921:28;:::i;:::-;3983:15;;;4053:11;;;4049:20;;;4014:12;;;;4092:14;4081:26;;4078:46;;;4120:1;4117;4110:12;4078:46;4144:11;;;;4164:142;4180:6;4175:3;4172:15;4164:142;;;4246:17;;4234:30;;4197:12;;;;4284;;;;4164:142;;;4322:16;;;4315:31;;;;-1:-1:-1;4326:7:1;;3167:1214;-1:-1:-1;;;;;3167:1214:1:o;4728:356::-;4930:2;4912:21;;;4949:18;;;4942:30;5008:34;5003:2;4988:18;;4981:62;5075:2;5060:18;;4728:356::o;5801:184::-;5871:6;5924:2;5912:9;5903:7;5899:23;5895:32;5892:52;;;5940:1;5937;5930:12;5892:52;-1:-1:-1;5963:16:1;;5801:184;-1:-1:-1;5801:184:1:o;6397:422::-;6486:1;6529:5;6486:1;6543:270;6564:7;6554:8;6551:21;6543:270;;;6623:4;6619:1;6615:6;6611:17;6605:4;6602:27;6599:53;;;6632:18;;:::i;:::-;6682:7;6672:8;6668:22;6665:55;;;6702:16;;;;6665:55;6781:22;;;;6741:15;;;;6543:270;;;6547:3;6397:422;;;;;:::o;6824:806::-;6873:5;6903:8;6893:80;;-1:-1:-1;6944:1:1;6958:5;;6893:80;6992:4;6982:76;;-1:-1:-1;7029:1:1;7043:5;;6982:76;7074:4;7092:1;7087:59;;;;7160:1;7155:130;;;;7067:218;;7087:59;7117:1;7108:10;;7131:5;;;7155:130;7192:3;7182:8;7179:17;7176:43;;;7199:18;;:::i;:::-;-1:-1:-1;;7255:1:1;7241:16;;7270:5;;7067:218;;7369:2;7359:8;7356:16;7350:3;7344:4;7341:13;7337:36;7331:2;7321:8;7318:16;7313:2;7307:4;7304:12;7300:35;7297:77;7294:159;;;-1:-1:-1;7406:19:1;;;7438:5;;7294:159;7485:34;7510:8;7504:4;7485:34;:::i;:::-;7555:6;7551:1;7547:6;7543:19;7534:7;7531:32;7528:58;;;7566:18;;:::i;:::-;7604:20;;6824:806;-1:-1:-1;;;6824:806:1:o;7635:131::-;7695:5;7724:36;7751:8;7745:4;7724:36;:::i;7771:168::-;7811:7;7877:1;7873;7869:6;7865:14;7862:1;7859:21;7854:1;7847:9;7840:17;7836:45;7833:71;;;7884:18;;:::i;:::-;-1:-1:-1;7924:9:1;;7771:168::o;7944:127::-;8005:10;8000:3;7996:20;7993:1;7986:31;8036:4;8033:1;8026:15;8060:4;8057:1;8050:15;8076:120;8116:1;8142;8132:35;;8147:18;;:::i;:::-;-1:-1:-1;8181:9:1;;8076:120::o;11284:179::-;11315:1;11341:6;11374:2;11371:1;11367:10;11396:3;11386:37;;11403:18;;:::i;:::-;11441:10;;11437:20;;;;;11284:179;-1:-1:-1;;11284:179:1:o;11468:127::-;11529:10;11524:3;11520:20;11517:1;11510:31;11560:4;11557:1;11550:15;11584:4;11581:1;11574:15;11852:187;11891:1;11917:6;11950:2;11947:1;11943:10;11972:3;11962:37;;11979:18;;:::i;:::-;12017:10;;12013:20;;;;;11852:187;-1:-1:-1;;11852:187:1:o;12044:135::-;12083:3;12104:17;;;12101:43;;12124:18;;:::i;:::-;-1:-1:-1;12171:1:1;12160:13;;12044:135::o;12463:277::-;12530:6;12583:2;12571:9;12562:7;12558:23;12554:32;12551:52;;;12599:1;12596;12589:12;12551:52;12631:9;12625:16;12684:5;12677:13;12670:21;12663:5;12660:32;12650:60;;12706:1;12703;12696:12;13921:258;13993:1;14003:113;14017:6;14014:1;14011:13;14003:113;;;14093:11;;;14087:18;14074:11;;;14067:39;14039:2;14032:10;14003:113;;;14134:6;14131:1;14128:13;14125:48;;;14169:1;14160:6;14155:3;14151:16;14144:27;14125:48;;13921:258;;;:::o;14184:274::-;14313:3;14351:6;14345:13;14367:53;14413:6;14408:3;14401:4;14393:6;14389:17;14367:53;:::i;:::-;14436:16;;;;;14184:274;-1:-1:-1;;14184:274:1:o;14463:383::-;14612:2;14601:9;14594:21;14575:4;14644:6;14638:13;14687:6;14682:2;14671:9;14667:18;14660:34;14703:66;14762:6;14757:2;14746:9;14742:18;14737:2;14729:6;14725:15;14703:66;:::i;:::-;14830:2;14809:15;-1:-1:-1;;14805:29:1;14790:45;;;;14837:2;14786:54;;14463:383;-1:-1:-1;;14463:383:1:o
Swarm Source
ipfs://62c116a219f440f1a83bbdd0ffe762bbb5f27f2c9535b7c278a2a1c0b059bcb1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.