More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,185 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 20374914 | 2 days ago | IN | 0 ETH | 0.00042452 | ||||
Claim | 20314392 | 10 days ago | IN | 0 ETH | 0.00160941 | ||||
Claim | 20281242 | 15 days ago | IN | 0 ETH | 0.00024311 | ||||
Claim | 20272800 | 16 days ago | IN | 0 ETH | 0.0002485 | ||||
Claim | 20097072 | 40 days ago | IN | 0 ETH | 0.00052166 | ||||
Claim | 20065929 | 45 days ago | IN | 0 ETH | 0.00076937 | ||||
Claim | 19811614 | 80 days ago | IN | 0 ETH | 0.00102484 | ||||
Claim | 19808206 | 81 days ago | IN | 0 ETH | 0.00050911 | ||||
Claim | 19634868 | 105 days ago | IN | 0 ETH | 0.00217996 | ||||
Claim | 19447627 | 131 days ago | IN | 0 ETH | 0.00337667 | ||||
Claim | 19307865 | 151 days ago | IN | 0 ETH | 0.0028601 | ||||
Claim | 18997800 | 194 days ago | IN | 0 ETH | 0.00170231 | ||||
Claim | 18963581 | 199 days ago | IN | 0 ETH | 0.00236522 | ||||
Claim | 18962068 | 199 days ago | IN | 0 ETH | 0.00120321 | ||||
Claim | 18962051 | 199 days ago | IN | 0 ETH | 0.00128898 | ||||
Claim | 18962041 | 199 days ago | IN | 0 ETH | 0.00128982 | ||||
Claim | 18962041 | 199 days ago | IN | 0 ETH | 0.00128931 | ||||
Claim | 18962041 | 199 days ago | IN | 0 ETH | 0.00128913 | ||||
Claim | 18962041 | 199 days ago | IN | 0 ETH | 0.00128982 | ||||
Claim | 18962041 | 199 days ago | IN | 0 ETH | 0.00128937 | ||||
Claim | 18962041 | 199 days ago | IN | 0 ETH | 0.00128937 | ||||
Claim | 18962041 | 199 days ago | IN | 0 ETH | 0.00127725 | ||||
Claim | 18922920 | 205 days ago | IN | 0 ETH | 0.00127725 | ||||
Claim | 18922920 | 205 days ago | IN | 0 ETH | 0.00127692 | ||||
Claim | 18922920 | 205 days ago | IN | 0 ETH | 0.00127755 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MerkleBox
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-04 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @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 in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev 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"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.6.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 SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @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' // solhint-disable-next-line max-line-length 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).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _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 // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/cryptography/MerkleProof.sol pragma solidity ^0.6.0; /** * @dev These functions deal with verification of Merkle trees (hash trees), */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } } // File: contracts/interfaces/IMerkleBox.sol pragma solidity 0.6.12; interface IMerkleBox { event NewMerkle( address indexed sender, address indexed erc20, uint256 amount, bytes32 indexed merkleRoot, uint256 claimGroupId, uint256 withdrawUnlockTime, string memo ); event MerkleClaim(address indexed account, address indexed erc20, uint256 amount); event MerkleFundUpdate(address indexed funder, bytes32 indexed merkleRoot, uint256 claimGroupId, uint256 amount, bool withdraw); function addFunds(uint256 claimGroupId, uint256 amount) external; function addFundsWithPermit( uint256 claimGroupId, address funder, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function withdrawFunds(uint256 claimGroupId, uint256 amount) external; function newClaimsGroup( address erc20, uint256 amount, bytes32 merkleRoot, uint256 withdrawUnlockTime, string calldata memo ) external returns (uint256); function isClaimable( uint256 claimGroupId, address account, uint256 amount, bytes32[] memory proof ) external view returns (bool); function claim( uint256 claimGroupId, address account, uint256 amount, bytes32[] memory proof ) external; } // File: contracts/interfaces/IERC20WithPermit.sol pragma solidity 0.6.12; interface IERC20WithPermit is IERC20 { function permit( address, address, uint256, uint256, uint8, bytes32, bytes32 ) external; } // File: contracts/MerkleBox.sol pragma solidity 0.6.12; contract MerkleBox is IMerkleBox { using MerkleProof for MerkleProof; using SafeERC20 for IERC20; using SafeERC20 for IERC20WithPermit; using SafeMath for uint256; struct Holding { address owner; // account that contributed funds address erc20; // claim-able ERC20 asset uint256 balance; // amount of token held currently bytes32 merkleRoot; // root of claims merkle tree uint256 withdrawUnlockTime; // withdraw forbidden before this time string memo; // an string to store arbitary notes about the holding } mapping(uint256 => Holding) public holdings; mapping(address => uint256[]) public claimGroupIds; mapping(uint256 => mapping(bytes32 => bool)) public leafClaimed; uint256 public constant LOCKING_PERIOD = 30 days; uint256 public claimGroupCount; function addFunds(uint256 claimGroupId, uint256 amount) external override { // prelim. parameter checks require(amount != 0, "Invalid amount"); // reference our struct storage Holding storage holding = holdings[claimGroupId]; require(holding.owner != address(0), "Holding does not exist"); // calculate amount to deposit. handle deposit-all. IERC20 token = IERC20(holding.erc20); uint256 balance = token.balanceOf(msg.sender); if (amount == uint256(-1)) { amount = balance; } require(amount <= balance, "Insufficient balance"); require(amount != 0, "Amount cannot be zero"); // transfer token to this contract token.safeTransferFrom(msg.sender, address(this), amount); // update holdings record holding.balance = holding.balance.add(amount); emit MerkleFundUpdate(msg.sender, holding.merkleRoot, claimGroupId, amount, false); } function addFundsWithPermit( uint256 claimGroupId, address funder, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external override { // prelim. parameter checks require(amount != 0, "Invalid amount"); // reference our struct storage Holding storage holding = holdings[claimGroupId]; require(holding.owner != address(0), "Holding does not exist"); // calculate amount to deposit. handle deposit-all. IERC20WithPermit token = IERC20WithPermit(holding.erc20); uint256 balance = token.balanceOf(funder); if (amount == uint256(-1)) { amount = balance; } require(amount <= balance, "Insufficient balance"); require(amount != 0, "Amount cannot be zero"); // transfer token to this contract token.permit(funder, address(this), amount, deadline, v, r, s); token.safeTransferFrom(funder, address(this), amount); // update holdings record holding.balance = holding.balance.add(amount); emit MerkleFundUpdate(funder, holding.merkleRoot, claimGroupId, amount, false); } function withdrawFunds(uint256 claimGroupId, uint256 amount) external override { // reference our struct storage Holding storage holding = holdings[claimGroupId]; require(holding.owner != address(0), "Holding does not exist"); require(block.timestamp >= holding.withdrawUnlockTime, "Holdings may not be withdrawn"); require(holding.owner == msg.sender, "Only owner may withdraw"); // calculate amount to withdraw. handle withdraw-all. IERC20 token = IERC20(holding.erc20); if (amount == uint256(-1)) { amount = holding.balance; } require(amount <= holding.balance, "Insufficient balance"); // update holdings record holding.balance = holding.balance.sub(amount); // transfer token to this contract token.safeTransfer(msg.sender, amount); emit MerkleFundUpdate(msg.sender, holding.merkleRoot, claimGroupId, amount, true); } function newClaimsGroup( address erc20, uint256 amount, bytes32 merkleRoot, uint256 withdrawUnlockTime, string calldata memo ) external override returns (uint256) { // prelim. parameter checks require(erc20 != address(0), "Invalid ERC20 address"); require(merkleRoot != 0, "Merkle cannot be zero"); require(withdrawUnlockTime >= block.timestamp + LOCKING_PERIOD, "Holding lock must exceed minimum lock period"); claimGroupCount++; // reference our struct storage Holding storage holding = holdings[claimGroupCount]; // calculate amount to deposit. handle deposit-all. IERC20 token = IERC20(erc20); uint256 balance = token.balanceOf(msg.sender); if (amount == uint256(-1)) { amount = balance; } require(amount <= balance, "Insufficient balance"); require(amount != 0, "Amount cannot be zero"); // transfer token to this contract token.safeTransferFrom(msg.sender, address(this), amount); // record holding in stable storage holding.owner = msg.sender; holding.erc20 = erc20; holding.balance = amount; holding.merkleRoot = merkleRoot; holding.withdrawUnlockTime = withdrawUnlockTime; holding.memo = memo; claimGroupIds[msg.sender].push(claimGroupCount); emit NewMerkle(msg.sender, erc20, amount, merkleRoot, claimGroupCount, withdrawUnlockTime, memo); return claimGroupCount; } function isClaimable( uint256 claimGroupId, address account, uint256 amount, bytes32[] memory proof ) external view override returns (bool) { // holding exists? Holding memory holding = holdings[claimGroupId]; if (holding.owner == address(0)) { return false; } // holding owner? if (holding.owner == account) { return false; } // sufficient balance exists? (funder may have under-funded) if (holding.balance < amount) { return false; } bytes32 leaf = _leafHash(account, amount); // already claimed? if (leafClaimed[claimGroupId][leaf]) { return false; } // merkle proof is invalid or claim not found if (!MerkleProof.verify(proof, holding.merkleRoot, leaf)) { return false; } return true; } function claim( uint256 claimGroupId, address account, uint256 amount, bytes32[] memory proof ) external override { // holding exists? Holding storage holding = holdings[claimGroupId]; require(holding.owner != address(0), "Holding not found"); // holding owner? require(holding.owner != account, "Holding owner cannot claim"); // sufficient balance exists? (funder may have under-funded) require(holding.balance >= amount, "Claim under-funded by funder."); bytes32 leaf = _leafHash(account, amount); // already spent? require(leafClaimed[claimGroupId][leaf] == false, "Already claimed"); // merkle proof valid? require(MerkleProof.verify(proof, holding.merkleRoot, leaf) == true, "Claim not found"); // update state leafClaimed[claimGroupId][leaf] = true; holding.balance = holding.balance.sub(amount); IERC20(holding.erc20).safeTransfer(account, amount); emit MerkleClaim(account, holding.erc20, amount); } function getClaimGroupIds(address owner) public view returns (uint256[] memory ids) { ids = claimGroupIds[owner]; } ////////////////////////////////////////////////////////// // generate hash of (claim holder, amount) // claim holder must be the caller function _leafHash(address account, uint256 amount) internal pure returns (bytes32) { return keccak256(abi.encodePacked(account, amount)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"erc20","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MerkleClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"funder","type":"address"},{"indexed":true,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"claimGroupId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"withdraw","type":"bool"}],"name":"MerkleFundUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"erc20","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"claimGroupId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawUnlockTime","type":"uint256"},{"indexed":false,"internalType":"string","name":"memo","type":"string"}],"name":"NewMerkle","type":"event"},{"inputs":[],"name":"LOCKING_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimGroupId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimGroupId","type":"uint256"},{"internalType":"address","name":"funder","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"addFundsWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimGroupId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimGroupCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimGroupIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getClaimGroupIds","outputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"holdings","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"erc20","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"withdrawUnlockTime","type":"uint256"},{"internalType":"string","name":"memo","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimGroupId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isClaimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"leafClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"erc20","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"withdrawUnlockTime","type":"uint256"},{"internalType":"string","name":"memo","type":"string"}],"name":"newClaimsGroup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimGroupId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50611b8c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a45760003560e01c80632e7ba6ef146100a95780634cfb19ed146101685780636292fabf146101a65780637b2c343f1461023557806385f45250146102ab57806391a47af5146102ce57806398bad2691461039f578063aedefb80146103ec578063af503309146103f4578063b2a2b722146104be578063e5253105146104c6578063f3549e36146104e9575b600080fd5b610166600480360360808110156100bf57600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b8111156100f557600080fd5b82018360208201111561010757600080fd5b803590602001918460208302840111600160201b8311171561012857600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061050c945050505050565b005b6101946004803603604081101561017e57600080fd5b506001600160a01b038135169060200135610789565b60408051918252519081900360200190f35b610194600480360360a08110156101bc57600080fd5b6001600160a01b038235169160208101359160408201359160608101359181019060a081016080820135600160201b8111156101f757600080fd5b82018360208201111561020957600080fd5b803590602001918460018302840111600160201b8311171561022a57600080fd5b5090925090506107b7565b61025b6004803603602081101561024b57600080fd5b50356001600160a01b0316610af4565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561029757818101518382015260200161027f565b505050509050019250505060405180910390f35b610166600480360360408110156102c157600080fd5b5080359060200135610b60565b61038b600480360360808110156102e457600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b81111561031a57600080fd5b82018360208201111561032c57600080fd5b803590602001918460208302840111600160201b8311171561034d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610d90945050505050565b604080519115158252519081900360200190f35b610166600480360360e08110156103b557600080fd5b508035906001600160a01b036020820135169060408101359060608101359060ff6080820135169060a08101359060c00135610f46565b610194611215565b6104116004803603602081101561040a57600080fd5b503561121b565b60405180876001600160a01b03168152602001866001600160a01b0316815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561047e578181015183820152602001610466565b50505050905090810190601f1680156104ab5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b6101946112e8565b610166600480360360408110156104dc57600080fd5b50803590602001356112ef565b61038b600480360360408110156104ff57600080fd5b50803590602001356114d7565b600084815260208190526040902080546001600160a01b031661056a576040805162461bcd60e51b8152602060048201526011602482015270121bdb191a5b99c81b9bdd08199bdd5b99607a1b604482015290519081900360640190fd5b80546001600160a01b03858116911614156105c9576040805162461bcd60e51b815260206004820152601a602482015279486f6c64696e67206f776e65722063616e6e6f7420636c61696d60301b604482015290519081900360640190fd5b8281600201541015610622576040805162461bcd60e51b815260206004820152601d60248201527f436c61696d20756e6465722d66756e6465642062792066756e6465722e000000604482015290519081900360640190fd5b600061062e85856114f7565b600087815260026020908152604080832084845290915290205490915060ff1615610692576040805162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b6106a18383600301548361153c565b15156001146106e9576040805162461bcd60e51b815260206004820152600f60248201526e10db185a5b481b9bdd08199bdd5b99608a1b604482015290519081900360640190fd5b6000868152600260208181526040808420858552909152909120805460ff1916600117905582015461071b90856115e5565b60028301556001820154610739906001600160a01b0316868661162e565b60018201546040805186815290516001600160a01b03928316928816917f3af05bdbca3cea126ac0af71ad1715d8860bec57e252bfccaab4c205455e9cc1919081900360200190a3505050505050565b600160205281600052604060002081815481106107a257fe5b90600052602060002001600091509150505481565b60006001600160a01b03871661080c576040805162461bcd60e51b8152602060048201526015602482015274496e76616c6964204552433230206164647265737360581b604482015290519081900360640190fd5b84610856576040805162461bcd60e51b81526020600482015260156024820152744d65726b6c652063616e6e6f74206265207a65726f60581b604482015290519081900360640190fd5b62278d00420184101561089a5760405162461bcd60e51b815260040180806020018281038252602c815260200180611b01602c913960400191505060405180910390fd5b600380546001019081905560009081526020818152604080832081516370a0823160e01b8152336004820152915190938b9390926001600160a01b038516926370a0823192602480840193919291829003018186803b1580156108fc57600080fd5b505afa158015610910573d6000803e3d6000fd5b505050506040513d602081101561092657600080fd5b50519050600019891415610938578098505b80891115610984576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b886109ce576040805162461bcd60e51b8152602060048201526015602482015274416d6f756e742063616e6e6f74206265207a65726f60581b604482015290519081900360640190fd5b6109e36001600160a01b03831633308c611685565b8254336001600160a01b03199182161784556001840180549091166001600160a01b038c16179055600283018990556003830188905560048301879055610a2e600584018787611a02565b5033600081815260016020818152604080842060038054825495860183559186529483902090930192909255915481518d81529283018190529082018a90526080606083018181529083018990528b936001600160a01b038f169390927f6a554f29f3801ca960697648a687dbfc68e5d6cab77bc0ce97100de90abf573f928f928e918e918e9160a08201848480828437600083820152604051601f909101601f19169092018290039850909650505050505050a4505060035498975050505050505050565b6001600160a01b038116600090815260016020908152604091829020805483518184028101840190945280845260609392830182828015610b5457602002820191906000526020600020905b815481526020019060010190808311610b40575b50505050509050919050565b80610ba3576040805162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b600082815260208190526040902080546001600160a01b0316610c06576040805162461bcd60e51b8152602060048201526016602482015275121bdb191a5b99c8191bd95cc81b9bdd08195e1a5cdd60521b604482015290519081900360640190fd5b6001810154604080516370a0823160e01b815233600482015290516001600160a01b039092169160009183916370a0823191602480820192602092909190829003018186803b158015610c5857600080fd5b505afa158015610c6c573d6000803e3d6000fd5b505050506040513d6020811015610c8257600080fd5b50519050600019841415610c94578093505b80841115610ce0576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b83610d2a576040805162461bcd60e51b8152602060048201526015602482015274416d6f756e742063616e6e6f74206265207a65726f60581b604482015290519081900360640190fd5b610d3f6001600160a01b038316333087611685565b6002830154610d4e90856116e5565b60028401556003830154604080518781526020810187905260008183015290513391600080516020611ae1833981519152919081900360600190a35050505050565b6000610d9a611a80565b60008681526020818152604091829020825160c08101845281546001600160a01b0390811682526001808401549091168285015260028084015483870152600384015460608401526004840154608084015260058401805487516101009482161594909402600019011691909104601f81018690048602830186019096528582529194929360a086019391929190830182828015610e795780601f10610e4e57610100808354040283529160200191610e79565b820191906000526020600020905b815481529060010190602001808311610e5c57829003601f168201915b5050509190925250508151919250506001600160a01b0316610e9f576000915050610f3e565b846001600160a01b031681600001516001600160a01b03161415610ec7576000915050610f3e565b8381604001511015610edd576000915050610f3e565b6000610ee986866114f7565b600088815260026020908152604080832084845290915290205490915060ff1615610f1957600092505050610f3e565b610f288483606001518361153c565b610f3757600092505050610f3e565b6001925050505b949350505050565b84610f89576040805162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b600087815260208190526040902080546001600160a01b0316610fec576040805162461bcd60e51b8152602060048201526016602482015275121bdb191a5b99c8191bd95cc81b9bdd08195e1a5cdd60521b604482015290519081900360640190fd5b6001810154604080516370a0823160e01b81526001600160a01b038a811660048301529151919092169160009183916370a08231916024808301926020929190829003018186803b15801561104057600080fd5b505afa158015611054573d6000803e3d6000fd5b505050506040513d602081101561106a57600080fd5b5051905060001988141561107c578097505b808811156110c8576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b87611112576040805162461bcd60e51b8152602060048201526015602482015274416d6f756e742063616e6e6f74206265207a65726f60581b604482015290519081900360640190fd5b6040805163d505accf60e01b81526001600160a01b038b81166004830152306024830152604482018b9052606482018a905260ff8916608483015260a4820188905260c4820187905291519184169163d505accf9160e48082019260009290919082900301818387803b15801561118857600080fd5b505af115801561119c573d6000803e3d6000fd5b506111b6925050506001600160a01b0383168a308b611685565b60028301546111c590896116e5565b60028401556003830154604080518c8152602081018b905260008183015290516001600160a01b038c1691600080516020611ae1833981519152919081900360600190a350505050505050505050565b60035481565b600060208181529181526040908190208054600180830154600280850154600386015460048701546005880180548a51601f600019998316156101000299909901909116959095049687018b90048b0285018b019099528584526001600160a01b03968716999490961697919690959490938301828280156112de5780601f106112b3576101008083540402835291602001916112de565b820191906000526020600020905b8154815290600101906020018083116112c157829003601f168201915b5050505050905086565b62278d0081565b600082815260208190526040902080546001600160a01b0316611352576040805162461bcd60e51b8152602060048201526016602482015275121bdb191a5b99c8191bd95cc81b9bdd08195e1a5cdd60521b604482015290519081900360640190fd5b80600401544210156113ab576040805162461bcd60e51b815260206004820152601d60248201527f486f6c64696e6773206d6179206e6f742062652077697468647261776e000000604482015290519081900360640190fd5b80546001600160a01b03163314611403576040805162461bcd60e51b81526020600482015260176024820152764f6e6c79206f776e6572206d617920776974686472617760481b604482015290519081900360640190fd5b60018101546001600160a01b031660001983141561142357816002015492505b8160020154831115611473576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b600282015461148290846115e5565b600283015561149b6001600160a01b038216338561162e565b6003820154604080518681526020810186905260018183015290513391600080516020611ae1833981519152919081900360600190a350505050565b600260209081526000928352604080842090915290825290205460ff1681565b6000828260405160200180836001600160a01b031660601b81526014018281526020019250505060405160208183030381529060405280519060200120905092915050565b600081815b85518110156115da57600086828151811061155857fe5b6020026020010151905080831161159f57828160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012092506115d1565b808360405160200180838152602001828152602001925050506040516020818303038152906040528051906020012092505b50600101611541565b509092149392505050565b600061162783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061173d565b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526116809084906117d4565b505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526116df9085906117d4565b50505050565b600082820183811015611627576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b600081848411156117cc5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611791578181015183820152602001611779565b50505050905090810190601f1680156117be5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6060611829826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118859092919063ffffffff16565b8051909150156116805780806020019051602081101561184857600080fd5b50516116805760405162461bcd60e51b815260040180806020018281038252602a815260200180611b2d602a913960400191505060405180910390fd5b6060610f3e8484600085606061189a856119fc565b6118eb576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061192a5780518252601f19909201916020918201910161190b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461198c576040519150601f19603f3d011682016040523d82523d6000602084013e611991565b606091505b509150915081156119a5579150610f3e9050565b8051156119b55780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315611791578181015183820152602001611779565b3b151590565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611a435782800160ff19823516178555611a70565b82800160010185558215611a70579182015b82811115611a70578235825591602001919060010190611a55565b50611a7c929150611acb565b5090565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000801916815260200160008152602001606081525090565b5b80821115611a7c5760008155600101611acc56fe210aece5a2bb3ac8bbec4d3bd83444123ef037a899b89d617e735799f983e6b3486f6c64696e67206c6f636b206d75737420657863656564206d696e696d756d206c6f636b20706572696f645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220348704aed66b1e45e3f3f1ea53bfa103efeba2adb353b05262969d5eb3d4a5b164736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100a45760003560e01c80632e7ba6ef146100a95780634cfb19ed146101685780636292fabf146101a65780637b2c343f1461023557806385f45250146102ab57806391a47af5146102ce57806398bad2691461039f578063aedefb80146103ec578063af503309146103f4578063b2a2b722146104be578063e5253105146104c6578063f3549e36146104e9575b600080fd5b610166600480360360808110156100bf57600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b8111156100f557600080fd5b82018360208201111561010757600080fd5b803590602001918460208302840111600160201b8311171561012857600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061050c945050505050565b005b6101946004803603604081101561017e57600080fd5b506001600160a01b038135169060200135610789565b60408051918252519081900360200190f35b610194600480360360a08110156101bc57600080fd5b6001600160a01b038235169160208101359160408201359160608101359181019060a081016080820135600160201b8111156101f757600080fd5b82018360208201111561020957600080fd5b803590602001918460018302840111600160201b8311171561022a57600080fd5b5090925090506107b7565b61025b6004803603602081101561024b57600080fd5b50356001600160a01b0316610af4565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561029757818101518382015260200161027f565b505050509050019250505060405180910390f35b610166600480360360408110156102c157600080fd5b5080359060200135610b60565b61038b600480360360808110156102e457600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b81111561031a57600080fd5b82018360208201111561032c57600080fd5b803590602001918460208302840111600160201b8311171561034d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610d90945050505050565b604080519115158252519081900360200190f35b610166600480360360e08110156103b557600080fd5b508035906001600160a01b036020820135169060408101359060608101359060ff6080820135169060a08101359060c00135610f46565b610194611215565b6104116004803603602081101561040a57600080fd5b503561121b565b60405180876001600160a01b03168152602001866001600160a01b0316815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561047e578181015183820152602001610466565b50505050905090810190601f1680156104ab5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b6101946112e8565b610166600480360360408110156104dc57600080fd5b50803590602001356112ef565b61038b600480360360408110156104ff57600080fd5b50803590602001356114d7565b600084815260208190526040902080546001600160a01b031661056a576040805162461bcd60e51b8152602060048201526011602482015270121bdb191a5b99c81b9bdd08199bdd5b99607a1b604482015290519081900360640190fd5b80546001600160a01b03858116911614156105c9576040805162461bcd60e51b815260206004820152601a602482015279486f6c64696e67206f776e65722063616e6e6f7420636c61696d60301b604482015290519081900360640190fd5b8281600201541015610622576040805162461bcd60e51b815260206004820152601d60248201527f436c61696d20756e6465722d66756e6465642062792066756e6465722e000000604482015290519081900360640190fd5b600061062e85856114f7565b600087815260026020908152604080832084845290915290205490915060ff1615610692576040805162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b6106a18383600301548361153c565b15156001146106e9576040805162461bcd60e51b815260206004820152600f60248201526e10db185a5b481b9bdd08199bdd5b99608a1b604482015290519081900360640190fd5b6000868152600260208181526040808420858552909152909120805460ff1916600117905582015461071b90856115e5565b60028301556001820154610739906001600160a01b0316868661162e565b60018201546040805186815290516001600160a01b03928316928816917f3af05bdbca3cea126ac0af71ad1715d8860bec57e252bfccaab4c205455e9cc1919081900360200190a3505050505050565b600160205281600052604060002081815481106107a257fe5b90600052602060002001600091509150505481565b60006001600160a01b03871661080c576040805162461bcd60e51b8152602060048201526015602482015274496e76616c6964204552433230206164647265737360581b604482015290519081900360640190fd5b84610856576040805162461bcd60e51b81526020600482015260156024820152744d65726b6c652063616e6e6f74206265207a65726f60581b604482015290519081900360640190fd5b62278d00420184101561089a5760405162461bcd60e51b815260040180806020018281038252602c815260200180611b01602c913960400191505060405180910390fd5b600380546001019081905560009081526020818152604080832081516370a0823160e01b8152336004820152915190938b9390926001600160a01b038516926370a0823192602480840193919291829003018186803b1580156108fc57600080fd5b505afa158015610910573d6000803e3d6000fd5b505050506040513d602081101561092657600080fd5b50519050600019891415610938578098505b80891115610984576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b886109ce576040805162461bcd60e51b8152602060048201526015602482015274416d6f756e742063616e6e6f74206265207a65726f60581b604482015290519081900360640190fd5b6109e36001600160a01b03831633308c611685565b8254336001600160a01b03199182161784556001840180549091166001600160a01b038c16179055600283018990556003830188905560048301879055610a2e600584018787611a02565b5033600081815260016020818152604080842060038054825495860183559186529483902090930192909255915481518d81529283018190529082018a90526080606083018181529083018990528b936001600160a01b038f169390927f6a554f29f3801ca960697648a687dbfc68e5d6cab77bc0ce97100de90abf573f928f928e918e918e9160a08201848480828437600083820152604051601f909101601f19169092018290039850909650505050505050a4505060035498975050505050505050565b6001600160a01b038116600090815260016020908152604091829020805483518184028101840190945280845260609392830182828015610b5457602002820191906000526020600020905b815481526020019060010190808311610b40575b50505050509050919050565b80610ba3576040805162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b600082815260208190526040902080546001600160a01b0316610c06576040805162461bcd60e51b8152602060048201526016602482015275121bdb191a5b99c8191bd95cc81b9bdd08195e1a5cdd60521b604482015290519081900360640190fd5b6001810154604080516370a0823160e01b815233600482015290516001600160a01b039092169160009183916370a0823191602480820192602092909190829003018186803b158015610c5857600080fd5b505afa158015610c6c573d6000803e3d6000fd5b505050506040513d6020811015610c8257600080fd5b50519050600019841415610c94578093505b80841115610ce0576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b83610d2a576040805162461bcd60e51b8152602060048201526015602482015274416d6f756e742063616e6e6f74206265207a65726f60581b604482015290519081900360640190fd5b610d3f6001600160a01b038316333087611685565b6002830154610d4e90856116e5565b60028401556003830154604080518781526020810187905260008183015290513391600080516020611ae1833981519152919081900360600190a35050505050565b6000610d9a611a80565b60008681526020818152604091829020825160c08101845281546001600160a01b0390811682526001808401549091168285015260028084015483870152600384015460608401526004840154608084015260058401805487516101009482161594909402600019011691909104601f81018690048602830186019096528582529194929360a086019391929190830182828015610e795780601f10610e4e57610100808354040283529160200191610e79565b820191906000526020600020905b815481529060010190602001808311610e5c57829003601f168201915b5050509190925250508151919250506001600160a01b0316610e9f576000915050610f3e565b846001600160a01b031681600001516001600160a01b03161415610ec7576000915050610f3e565b8381604001511015610edd576000915050610f3e565b6000610ee986866114f7565b600088815260026020908152604080832084845290915290205490915060ff1615610f1957600092505050610f3e565b610f288483606001518361153c565b610f3757600092505050610f3e565b6001925050505b949350505050565b84610f89576040805162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b600087815260208190526040902080546001600160a01b0316610fec576040805162461bcd60e51b8152602060048201526016602482015275121bdb191a5b99c8191bd95cc81b9bdd08195e1a5cdd60521b604482015290519081900360640190fd5b6001810154604080516370a0823160e01b81526001600160a01b038a811660048301529151919092169160009183916370a08231916024808301926020929190829003018186803b15801561104057600080fd5b505afa158015611054573d6000803e3d6000fd5b505050506040513d602081101561106a57600080fd5b5051905060001988141561107c578097505b808811156110c8576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b87611112576040805162461bcd60e51b8152602060048201526015602482015274416d6f756e742063616e6e6f74206265207a65726f60581b604482015290519081900360640190fd5b6040805163d505accf60e01b81526001600160a01b038b81166004830152306024830152604482018b9052606482018a905260ff8916608483015260a4820188905260c4820187905291519184169163d505accf9160e48082019260009290919082900301818387803b15801561118857600080fd5b505af115801561119c573d6000803e3d6000fd5b506111b6925050506001600160a01b0383168a308b611685565b60028301546111c590896116e5565b60028401556003830154604080518c8152602081018b905260008183015290516001600160a01b038c1691600080516020611ae1833981519152919081900360600190a350505050505050505050565b60035481565b600060208181529181526040908190208054600180830154600280850154600386015460048701546005880180548a51601f600019998316156101000299909901909116959095049687018b90048b0285018b019099528584526001600160a01b03968716999490961697919690959490938301828280156112de5780601f106112b3576101008083540402835291602001916112de565b820191906000526020600020905b8154815290600101906020018083116112c157829003601f168201915b5050505050905086565b62278d0081565b600082815260208190526040902080546001600160a01b0316611352576040805162461bcd60e51b8152602060048201526016602482015275121bdb191a5b99c8191bd95cc81b9bdd08195e1a5cdd60521b604482015290519081900360640190fd5b80600401544210156113ab576040805162461bcd60e51b815260206004820152601d60248201527f486f6c64696e6773206d6179206e6f742062652077697468647261776e000000604482015290519081900360640190fd5b80546001600160a01b03163314611403576040805162461bcd60e51b81526020600482015260176024820152764f6e6c79206f776e6572206d617920776974686472617760481b604482015290519081900360640190fd5b60018101546001600160a01b031660001983141561142357816002015492505b8160020154831115611473576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b600282015461148290846115e5565b600283015561149b6001600160a01b038216338561162e565b6003820154604080518681526020810186905260018183015290513391600080516020611ae1833981519152919081900360600190a350505050565b600260209081526000928352604080842090915290825290205460ff1681565b6000828260405160200180836001600160a01b031660601b81526014018281526020019250505060405160208183030381529060405280519060200120905092915050565b600081815b85518110156115da57600086828151811061155857fe5b6020026020010151905080831161159f57828160405160200180838152602001828152602001925050506040516020818303038152906040528051906020012092506115d1565b808360405160200180838152602001828152602001925050506040516020818303038152906040528051906020012092505b50600101611541565b509092149392505050565b600061162783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061173d565b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526116809084906117d4565b505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526116df9085906117d4565b50505050565b600082820183811015611627576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b600081848411156117cc5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611791578181015183820152602001611779565b50505050905090810190601f1680156117be5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6060611829826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118859092919063ffffffff16565b8051909150156116805780806020019051602081101561184857600080fd5b50516116805760405162461bcd60e51b815260040180806020018281038252602a815260200180611b2d602a913960400191505060405180910390fd5b6060610f3e8484600085606061189a856119fc565b6118eb576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061192a5780518252601f19909201916020918201910161190b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461198c576040519150601f19603f3d011682016040523d82523d6000602084013e611991565b606091505b509150915081156119a5579150610f3e9050565b8051156119b55780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315611791578181015183820152602001611779565b3b151590565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611a435782800160ff19823516178555611a70565b82800160010185558215611a70579182015b82811115611a70578235825591602001919060010190611a55565b50611a7c929150611acb565b5090565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000801916815260200160008152602001606081525090565b5b80821115611a7c5760008155600101611acc56fe210aece5a2bb3ac8bbec4d3bd83444123ef037a899b89d617e735799f983e6b3486f6c64696e67206c6f636b206d75737420657863656564206d696e696d756d206c6f636b20706572696f645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220348704aed66b1e45e3f3f1ea53bfa103efeba2adb353b05262969d5eb3d4a5b164736f6c634300060c0033
Deployed Bytecode Sourcemap
21207:8274:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27902:1123;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27902:1123:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27902:1123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27902:1123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27902:1123:0;;-1:-1:-1;27902:1123:0;;-1:-1:-1;;;;;27902:1123:0:i;:::-;;21859:50;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21859:50:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;25332:1586;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25332:1586:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25332:1586:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25332:1586:0;;;;;;;;;;-1:-1:-1;25332:1586:0;;-1:-1:-1;25332:1586:0;-1:-1:-1;25332:1586:0;:::i;29033:129::-;;;;;;;;;;;;;;;;-1:-1:-1;29033:129:0;-1:-1:-1;;;;;29033:129:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22080:1009;;;;;;;;;;;;;;;;-1:-1:-1;22080:1009:0;;;;;;;:::i;26926:968::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26926:968:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26926:968:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26926:968:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26926:968:0;;-1:-1:-1;26926:968:0;;-1:-1:-1;;;;;26926:968:0:i;:::-;;;;;;;;;;;;;;;;;;23097:1235;;;;;;;;;;;;;;;;-1:-1:-1;23097:1235:0;;;-1:-1:-1;;;;;23097:1235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22041:30::-;;;:::i;21809:43::-;;;;;;;;;;;;;;;;-1:-1:-1;21809:43:0;;:::i;:::-;;;;;-1:-1:-1;;;;;21809:43:0;;;;;;-1:-1:-1;;;;;21809:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21986:48;;;:::i;24340:984::-;;;;;;;;;;;;;;;;-1:-1:-1;24340:984:0;;;;;;;:::i;21916:63::-;;;;;;;;;;;;;;;;-1:-1:-1;21916:63:0;;;;;;;:::i;27902:1123::-;28096:23;28122:22;;;;;;;;;;28163:13;;-1:-1:-1;;;;;28163:13:0;28155:57;;;;;-1:-1:-1;;;28155:57:0;;;;;;;;;;;;-1:-1:-1;;;28155:57:0;;;;;;;;;;;;;;;28261:13;;-1:-1:-1;;;;;28261:24:0;;;:13;;:24;;28253:63;;;;;-1:-1:-1;;;28253:63:0;;;;;;;;;;;;-1:-1:-1;;;28253:63:0;;;;;;;;;;;;;;;28428:6;28409:7;:15;;;:25;;28401:67;;;;;-1:-1:-1;;;28401:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28481:12;28496:26;28506:7;28515:6;28496:9;:26::i;:::-;28570:25;;;;:11;:25;;;;;;;;:31;;;;;;;;;28481:41;;-1:-1:-1;28570:31:0;;:40;28562:68;;;;;-1:-1:-1;;;28562:68:0;;;;;;;;;;;;-1:-1:-1;;;28562:68:0;;;;;;;;;;;;;;;28683:51;28702:5;28709:7;:18;;;28729:4;28683:18;:51::i;:::-;:59;;28738:4;28683:59;28675:87;;;;;-1:-1:-1;;;28675:87:0;;;;;;;;;;;;-1:-1:-1;;;28675:87:0;;;;;;;;;;;;;;;28800:25;;;;:11;:25;;;;;;;;:31;;;;;;;;;:38;;-1:-1:-1;;28800:38:0;28834:4;28800:38;;;28867:15;;;:27;;28887:6;28867:19;:27::i;:::-;28849:15;;;:45;28912:13;;;;28905:51;;-1:-1:-1;;;;;28912:13:0;28940:7;28949:6;28905:34;:51::i;:::-;28995:13;;;;28974:43;;;;;;;;-1:-1:-1;;;;;28995:13:0;;;;28974:43;;;;;;;;;;;;;27902:1123;;;;;;:::o;21859:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25332:1586::-;25536:7;-1:-1:-1;;;;;25601:19:0;;25593:53;;;;;-1:-1:-1;;;25593:53:0;;;;;;;;;;;;-1:-1:-1;;;25593:53:0;;;;;;;;;;;;;;;25665:15;25657:49;;;;;-1:-1:-1;;;25657:49:0;;;;;;;;;;;;-1:-1:-1;;;25657:49:0;;;;;;;;;;;;;;;22027:7;25747:15;:32;25725:18;:54;;25717:111;;;;-1:-1:-1;;;25717:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25841:15;:17;;;;;;;;:15;25936:25;;;;;;;;;;;26093:27;;-1:-1:-1;;;26093:27:0;;26109:10;26093:27;;;;;;25936:25;;26058:5;;25841:15;;-1:-1:-1;;;;;26093:15:0;;;;;:27;;;;;25936:25;;26093:27;;;;;;:15;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26093:27:0;;-1:-1:-1;;;26135:21:0;;26131:70;;;26182:7;26173:16;;26131:70;26229:7;26219:6;:17;;26211:50;;;;;-1:-1:-1;;;26211:50:0;;;;;;;;;;;;-1:-1:-1;;;26211:50:0;;;;;;;;;;;;;;;26280:11;26272:45;;;;;-1:-1:-1;;;26272:45:0;;;;;;;;;;;;-1:-1:-1;;;26272:45:0;;;;;;;;;;;;;;;26374:57;-1:-1:-1;;;;;26374:22:0;;26397:10;26417:4;26424:6;26374:22;:57::i;:::-;26489:26;;26505:10;-1:-1:-1;;;;;;26489:26:0;;;;;;-1:-1:-1;26526:13:0;;:21;;;;;-1:-1:-1;;;;;26526:21:0;;;;;26558:15;;;:24;;;26593:18;;;:31;;;26635:26;;;:47;;;26693:19;:12;;;26708:4;;26693:19;:::i;:::-;-1:-1:-1;26737:10:0;26723:25;;;;:13;:25;;;;;;;;26754:15;;;26723:47;;;;;;;;;;;;;;;;;;;;;26835:15;;26786:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26823:10;;-1:-1:-1;;;;;26786:91:0;;;26737:10;;26786:91;;26815:6;;26852:18;;26872:4;;;;26786:91;;;26872:4;;;;26786:91;;;;;;;;;;;;;-1:-1:-1;;26786:91:0;;;;;;;;-1:-1:-1;26786:91:0;;-1:-1:-1;;;;;;;26786:91:0;-1:-1:-1;;26895:15:0;;;25332:1586;-1:-1:-1;;;;;;;;25332:1586:0:o;29033:129::-;-1:-1:-1;;;;;29134:20:0;;;;;;:13;:20;;;;;;;;;29128:26;;;;;;;;;;;;;;;;;29095:20;;29128:26;;;29134:20;29128:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29033:129;;;:::o;22080:1009::-;22210:11;22202:38;;;;;-1:-1:-1;;;22202:38:0;;;;;;;;;;;;-1:-1:-1;;;22202:38:0;;;;;;;;;;;;;;;22294:23;22320:22;;;;;;;;;;22361:13;;-1:-1:-1;;;;;22361:13:0;22353:62;;;;;-1:-1:-1;;;22353:62:0;;;;;;;;;;;;-1:-1:-1;;;22353:62:0;;;;;;;;;;;;;;;22512:13;;;;22555:27;;;-1:-1:-1;;;22555:27:0;;22571:10;22555:27;;;;;;-1:-1:-1;;;;;22512:13:0;;;;22490:12;;22512:13;;22555:15;;:27;;;;;;;;;;;;;;;22512:13;22555:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22555:27:0;;-1:-1:-1;;;22597:21:0;;22593:70;;;22644:7;22635:16;;22593:70;22691:7;22681:6;:17;;22673:50;;;;;-1:-1:-1;;;22673:50:0;;;;;;;;;;;;-1:-1:-1;;;22673:50:0;;;;;;;;;;;;;;;22742:11;22734:45;;;;;-1:-1:-1;;;22734:45:0;;;;;;;;;;;;-1:-1:-1;;;22734:45:0;;;;;;;;;;;;;;;22836:57;-1:-1:-1;;;;;22836:22:0;;22859:10;22879:4;22886:6;22836:22;:57::i;:::-;22959:15;;;;:27;;22979:6;22959:19;:27::i;:::-;22941:15;;;:45;23033:18;;;;23004:77;;;;;;;;;;;;23075:5;23004:77;;;;;;23021:10;;-1:-1:-1;;;;;;;;;;;23004:77:0;;;;;;;;;22080:1009;;;;;:::o;26926:968::-;27101:4;27146:22;;:::i;:::-;27171:8;:22;;;;;;;;;;;;27146:47;;;;;;;;;-1:-1:-1;;;;;27146:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27146:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;27171:22;;27146:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27146:47:0;;;;-1:-1:-1;;27208:13:0;;27146:47;;-1:-1:-1;;;;;;;27208:27:0;27204:72;;27259:5;27252:12;;;;;27204:72;27335:7;-1:-1:-1;;;;;27318:24:0;:7;:13;;;-1:-1:-1;;;;;27318:24:0;;27314:69;;;27366:5;27359:12;;;;;27314:69;27487:6;27469:7;:15;;;:24;27465:69;;;27517:5;27510:12;;;;;27465:69;27546:12;27561:26;27571:7;27580:6;27561:9;:26::i;:::-;27631:25;;;;:11;:25;;;;;;;;:31;;;;;;;;;27546:41;;-1:-1:-1;27631:31:0;;27627:76;;;27686:5;27679:12;;;;;;27627:76;27773:51;27792:5;27799:7;:18;;;27819:4;27773:18;:51::i;:::-;27768:97;;27848:5;27841:12;;;;;;27768:97;27882:4;27875:11;;;;26926:968;;;;;;;:::o;23097:1235::-;23372:11;23364:38;;;;;-1:-1:-1;;;23364:38:0;;;;;;;;;;;;-1:-1:-1;;;23364:38:0;;;;;;;;;;;;;;;23456:23;23482:22;;;;;;;;;;23523:13;;-1:-1:-1;;;;;23523:13:0;23515:62;;;;;-1:-1:-1;;;23515:62:0;;;;;;;;;;;;-1:-1:-1;;;23515:62:0;;;;;;;;;;;;;;;23694:13;;;;23737:23;;;-1:-1:-1;;;23737:23:0;;-1:-1:-1;;;;;23737:23:0;;;;;;;;;23694:13;;;;;23652:22;;23694:13;;23737:15;;:23;;;;;;;;;;;;;;23694:13;23737:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23737:23:0;;-1:-1:-1;;;23775:21:0;;23771:70;;;23822:7;23813:16;;23771:70;23869:7;23859:6;:17;;23851:50;;;;;-1:-1:-1;;;23851:50:0;;;;;;;;;;;;-1:-1:-1;;;23851:50:0;;;;;;;;;;;;;;;23920:11;23912:45;;;;;-1:-1:-1;;;23912:45:0;;;;;;;;;;;;-1:-1:-1;;;23912:45:0;;;;;;;;;;;;;;;24014:62;;;-1:-1:-1;;;24014:62:0;;-1:-1:-1;;;;;24014:62:0;;;;;;;24043:4;24014:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;;;;;;:62;;;;;-1:-1:-1;;24014:62:0;;;;;;;;-1:-1:-1;24014:12:0;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24087:53:0;;-1:-1:-1;;;;;;;;24087:22:0;;24110:6;24126:4;24133:6;24087:22;:53::i;:::-;24206:15;;;;:27;;24226:6;24206:19;:27::i;:::-;24188:15;;;:45;24276:18;;;;24251:73;;;;;;;;;;;;24318:5;24251:73;;;;;;-1:-1:-1;;;;;24251:73:0;;;-1:-1:-1;;;;;;;;;;;24251:73:0;;;;;;;;;23097:1235;;;;;;;;;;:::o;22041:30::-;;;;:::o;21809:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21809:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21809:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21986:48::-;22027:7;21986:48;:::o;24340:984::-;24471:23;24497:22;;;;;;;;;;24538:13;;-1:-1:-1;;;;;24538:13:0;24530:62;;;;;-1:-1:-1;;;24530:62:0;;;;;;;;;;;;-1:-1:-1;;;24530:62:0;;;;;;;;;;;;;;;24630:7;:26;;;24611:15;:45;;24603:87;;;;;-1:-1:-1;;;24603:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24709:13;;-1:-1:-1;;;;;24709:13:0;24726:10;24709:27;24701:63;;;;;-1:-1:-1;;;24701:63:0;;;;;;;;;;;;-1:-1:-1;;;24701:63:0;;;;;;;;;;;;;;;24863:13;;;;-1:-1:-1;;;;;24863:13:0;-1:-1:-1;;24892:21:0;;24888:78;;;24939:7;:15;;;24930:24;;24888:78;24994:7;:15;;;24984:6;:25;;24976:58;;;;;-1:-1:-1;;;24976:58:0;;;;;;;;;;;;-1:-1:-1;;;24976:58:0;;;;;;;;;;;;;;;25100:15;;;;:27;;25120:6;25100:19;:27::i;:::-;25082:15;;;:45;25184:38;-1:-1:-1;;;;;25184:18:0;;25203:10;25215:6;25184:18;:38::i;:::-;25269:18;;;;25240:76;;;;;;;;;;;;25311:4;25240:76;;;;;;25257:10;;-1:-1:-1;;;;;;;;;;;25240:76:0;;;;;;;;;24340:984;;;;:::o;21916:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29324:154::-;29399:7;29453;29462:6;29436:33;;;;;;-1:-1:-1;;;;;29436:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29426:44;;;;;;29419:51;;29324:154;;;;:::o;18542:796::-;18633:4;18673;18633;18690:525;18714:5;:12;18710:1;:16;18690:525;;;18748:20;18771:5;18777:1;18771:8;;;;;;;;;;;;;;18748:31;;18816:12;18800;:28;18796:408;;18970:12;18984;18953:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18943:55;;;;;;18928:70;;18796:408;;;19160:12;19174;19143:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19133:55;;;;;;19118:70;;18796:408;-1:-1:-1;18728:3:0;;18690:525;;;-1:-1:-1;19310:20:0;;;;18542:796;-1:-1:-1;;;18542:796:0:o;1420:136::-;1478:7;1505:43;1509:1;1512;1505:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1498:50;1420:136;-1:-1:-1;;;1420:136:0:o;14924:177::-;15034:58;;;-1:-1:-1;;;;;15034:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15034:58:0;-1:-1:-1;;;15034:58:0;;;15007:86;;15027:5;;15007:19;:86::i;:::-;14924:177;;;:::o;15109:205::-;15237:68;;;-1:-1:-1;;;;;15237:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15237:68:0;-1:-1:-1;;;15237:68:0;;;15210:96;;15230:5;;15210:19;:96::i;:::-;15109:205;;;;:::o;956:181::-;1014:7;1046:5;;;1070:6;;;;1062:46;;;;;-1:-1:-1;;;1062:46:0;;;;;;;;;;;;-1:-1:-1;;;1062:46:0;;;;;;;;;;;;;;1859:192;1945:7;1981:12;1973:6;;;;1965:29;;;;-1:-1:-1;;;1965:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2017:5:0;;;1859:192::o;17229:761::-;17653:23;17679:69;17707:4;17679:69;;;;;;;;;;;;;;;;;17687:5;-1:-1:-1;;;;;17679:27:0;;;:69;;;;;:::i;:::-;17763:17;;17653:95;;-1:-1:-1;17763:21:0;17759:224;;17905:10;17894:30;;;;;;;;;;;;;;;-1:-1:-1;17894:30:0;17886:85;;;;-1:-1:-1;;;17886:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11903:196;12006:12;12038:53;12061:6;12069:4;12075:1;12078:12;13410;13443:18;13454:6;13443:10;:18::i;:::-;13435:60;;;;;-1:-1:-1;;;13435:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13569:12;13583:23;13610:6;-1:-1:-1;;;;;13610:11:0;13630:8;13641:4;13610:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13610:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13568:78;;;;13661:7;13657:595;;;13692:10;-1:-1:-1;13685:17:0;;-1:-1:-1;13685:17:0;13657:595;13806:17;;:21;13802:439;;14069:10;14063:17;14130:15;14117:10;14113:2;14109:19;14102:44;14017:148;14205:20;;-1:-1:-1;;;14205:20:0;;;;;;;;;;;;;;;;;14212:12;;14205:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8985:422;9352:20;9391:8;;;8985:422::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;
Swarm Source
ipfs://348704aed66b1e45e3f3f1ea53bfa103efeba2adb353b05262969d5eb3d4a5b1
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.