More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 149 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Tokens | 20120151 | 190 days ago | IN | 0 ETH | 0.00111508 | ||||
Claim Tokens | 20120150 | 190 days ago | IN | 0 ETH | 0.00127271 | ||||
Claim Tokens | 20023362 | 204 days ago | IN | 0 ETH | 0.00081652 | ||||
Claim Tokens | 19553448 | 269 days ago | IN | 0 ETH | 0.00243469 | ||||
Claim Tokens | 18290598 | 446 days ago | IN | 0 ETH | 0.00123297 | ||||
Claim Tokens | 18290572 | 446 days ago | IN | 0 ETH | 0.00019605 | ||||
Claim Tokens | 17846428 | 509 days ago | IN | 0 ETH | 0.00182477 | ||||
Claim Tokens | 17833863 | 510 days ago | IN | 0 ETH | 0.00167421 | ||||
Claim Tokens | 17737352 | 524 days ago | IN | 0 ETH | 0.00450771 | ||||
Claim Tokens | 17732765 | 525 days ago | IN | 0 ETH | 0.00255179 | ||||
Claim Tokens | 17052554 | 620 days ago | IN | 0 ETH | 0.00310577 | ||||
Claim Tokens | 16840578 | 650 days ago | IN | 0 ETH | 0.00336708 | ||||
Claim Tokens | 16840543 | 650 days ago | IN | 0 ETH | 0.00325437 | ||||
Claim Tokens | 16824596 | 653 days ago | IN | 0 ETH | 0.00233106 | ||||
Claim Tokens | 16812363 | 654 days ago | IN | 0 ETH | 0.00225859 | ||||
Claim Tokens | 16668548 | 675 days ago | IN | 0 ETH | 0.00353106 | ||||
Claim Tokens | 16606739 | 683 days ago | IN | 0 ETH | 0.00557951 | ||||
Claim Tokens | 16592288 | 685 days ago | IN | 0 ETH | 0.00577201 | ||||
Claim Tokens | 16525018 | 695 days ago | IN | 0 ETH | 0.00167349 | ||||
Claim Tokens | 16215752 | 738 days ago | IN | 0 ETH | 0.0013611 | ||||
Claim Tokens | 16192020 | 741 days ago | IN | 0 ETH | 0.00284296 | ||||
Claim Tokens | 16192013 | 741 days ago | IN | 0 ETH | 0.00292666 | ||||
Claim Tokens | 16192007 | 741 days ago | IN | 0 ETH | 0.00286633 | ||||
Claim Tokens | 16169739 | 744 days ago | IN | 0 ETH | 0.0033856 | ||||
Claim Tokens | 16131670 | 750 days ago | IN | 0 ETH | 0.00234743 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
LockerByBlock
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT // Platinum Software Dev Team // Locker Beta version. pragma solidity ^0.8.4; import "./Locker.sol"; contract LockerByBlock is Locker { function _getAvailableAmountByLockIndex(uint256 _lockIndex) internal view override returns(uint256) { VestingRecord[] memory v = lockerStorage[_lockIndex].vestings; uint256 res = 0; for (uint256 i = 0; i < v.length; i ++ ) { if (v[i].unlockTime <= block.number && !v[i].isNFT) { res += v[i].amountUnlock; } } return res; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // 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"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // Platinum Software Dev Team // Locker Beta version. pragma solidity ^0.8.4; import "./IERC20.sol"; import "./SafeERC20.sol"; import "./LockerTypes.sol"; contract Locker is LockerTypes { using SafeERC20 for IERC20; string constant public name = "Lock & Registry v0.0.3"; /** * @dev Then more records in VestingRecord array then more gas will spend * in `lockTokens` method and in every getter call_getAvailableAmountByLockIndex. * So in some case it can revert After test we decide use yhis value. But it * is not up limit and you can try more */ uint256 constant public MAX_VESTING_RECORDS_PER_LOCK = 21; /** * @dev Then more records in _beneficiaries then more gas will spend * in `lockTokens` method. After test we decide use yhis value. But it * is not up limit and you can try more */ uint256 constant public MAX_BENEFICIARIES_PER_LOCK = 160; uint256 constant public MAX_LOCkS_PER_BENEFICIARY = 1000; /** * @dev Then more TOTAL_IN_PERCENT then more precision. * but be attention with _beneficiariesShares array * accordingly this value */ uint256 constant public TOTAL_IN_PERCENT = 1e13; LockStorageRecord[] lockerStorage; //map from users(investors) to locked shares mapping(address => RegistryShare[]) public registry; //map from lockIndex to beneficiaries list mapping(uint256 => address[]) beneficiariesInLock; event NewLock(address indexed erc20, address indexed who, uint256 lockedAmount, uint256 lockId); /** * @dev Any who have token balance > 0 can lock it here. * * Emits a NewLock event. * * Requirements: * * - `_ERC20` token contract address for lock. * - `_amount` amount of tokens to be locked. * - `_unlockedFrom` array of unlock dates in unixtime format. * - `_unlockAmount` array of unlock amounts. * - `_beneficiaries` array of address for beneficiaries. * - `_beneficiariesShares` array of beneficiaries shares, in % but * - scaled on TOTAL_IN_PERCENT/100. So 20% = 2000 if TOTAL_IN_PERCENT=10000, 0.1% = 10 and etc. * Caller must approve _ERC20 tokens to this contract address before lock */ function lockTokens( address _ERC20, uint256 _amount, uint256[] memory _unlockedFrom, uint256[] memory _unlockAmount, address[] memory _beneficiaries, uint256[] memory _beneficiariesShares ) external { require(_amount > 0, "Cant lock 0 amount"); require(IERC20(_ERC20).allowance(msg.sender, address(this)) >= _amount, "Please approve first"); require(_getArraySum(_unlockAmount) == _amount, "Sum vesting records must be equal lock amount"); require(_unlockedFrom.length == _unlockAmount.length, "Length of periods and amounts arrays must be equal"); require(_beneficiaries.length == _beneficiariesShares.length, "Length of beneficiaries and shares arrays must be equal"); require(_getArraySum(_beneficiariesShares) == TOTAL_IN_PERCENT, "Sum of shares array must be equal to 100%"); require(_beneficiaries.length < MAX_BENEFICIARIES_PER_LOCK, "MAX_BENEFICIARIES_PER_LOCK LIMIT"); require(_unlockedFrom.length < MAX_VESTING_RECORDS_PER_LOCK, "MAX_VESTING_RECORDS_PER_LOCK LIMIT"); //Lets prepare vestings array VestingRecord[] memory v = new VestingRecord[](_unlockedFrom.length); for (uint256 i = 0; i < _unlockedFrom.length; i ++ ) { v[i].unlockTime = _unlockedFrom[i]; v[i].amountUnlock = _unlockAmount[i]; } //Save lock info in storage LockStorageRecord storage lock = lockerStorage.push(); lock.ltype = LockType.ERC20; lock.token = _ERC20; lock.amount = _amount; //Copying of type struct LockerTypes.VestingRecord memory[] memory //to storage not yet supported. //so we need this cycle for (uint256 i = 0; i < _unlockedFrom.length; i ++ ) { lock.vestings.push(v[i]); } //Lets save _beneficiaries for this lock for (uint256 i = 0; i < _beneficiaries.length; i ++ ) { require(_beneficiaries[i] != address(0), 'Cant add zero address'); require(_beneficiaries[i] != address(this), 'Bad idea'); RegistryShare[] storage shares = registry[_beneficiaries[i]]; require( shares.length <= MAX_LOCkS_PER_BENEFICIARY, 'MAX_LOCkS_PER_BENEFICIARY LIMIT' ); shares.push(RegistryShare({ lockIndex: lockerStorage.length - 1, sharePercent: _beneficiariesShares[i], claimedAmount: 0 })); //Save beneficaries in one map for use in child conatrcts beneficiariesInLock[lockerStorage.length - 1].push(_beneficiaries[i]); } IERC20 token = IERC20(_ERC20); token.safeTransferFrom(msg.sender, address(this), _amount); emit NewLock(_ERC20, msg.sender, _amount, lockerStorage.length - 1); } /** * @dev Any _beneficiaries can claim their tokens after vesting lock time is expired. * * Requirements: * * - `_lockIndex` array index, number of lock record in storage. For one project lock case = 0 * - `_desiredAmount` amount of tokens to be unlocked. Only after vesting lock time is expired * - If now date less then vesting lock time tx will be revert */ function claimTokens(uint256 _lockIndex, uint256 _desiredAmount) external { //Lets get our lockRecord by index require(_lockIndex < lockerStorage.length, "Lock record not saved yet"); require(_desiredAmount > 0, "Cant claim zero"); LockStorageRecord memory lock = lockerStorage[_lockIndex]; (uint256 percentShares, uint256 wasClaimed) = _getUserSharePercentAndClaimedAmount(msg.sender, _lockIndex); uint256 availableAmount = _getAvailableAmountByLockIndex(_lockIndex) * percentShares / TOTAL_IN_PERCENT - wasClaimed; require(_desiredAmount <= availableAmount, "Insufficient for now"); availableAmount = _desiredAmount; //update claimed amount _decreaseAvailableAmount(msg.sender, _lockIndex, availableAmount); //send tokens IERC20 token = IERC20(lock.token); token.safeTransfer(msg.sender, availableAmount); } /** * @dev Returns array of shares for user (beneficiary). * See LockerTypes.RegistryShare description. * In case of one project this will only one record * * Requirements: * * - `_user` beneficiary address */ function getUserShares(address _user) external view returns (RegistryShare[] memory) { return _getUsersShares(_user); } /** * @dev Returns tuple (totalBalance, available balance). * totalBalance - amount of all user shares minus already claimed * available - user balance that available for NOW, minus already claimed * - * Requirements: * * - `_user` beneficiary address * - `_lockIndex` array index, number of lock record in storage. For one project lock case = 0 */ function getUserBalances(address _user, uint256 _lockIndex) external view returns (uint256, uint256) { return _getUserBalances(_user, _lockIndex); } /** * @dev Returns LockStorageRecord data struture.See LockerTypes.LockStorageRecord description. * - * Requirements: * * - `_index` array index, number of lock record in storage. For one project lock case = 0 */ function getLockRecordByIndex(uint256 _index) external view returns (LockStorageRecord memory){ return _getLockRecordByIndex(_index); } /** * @dev Returns LockStorage Record count, for iteration from app. * */ function getLockCount() external view returns (uint256) { return lockerStorage.length; } /** * @dev Just helper for array summ. * */ function getArraySum(uint256[] memory _array) external pure returns (uint256) { return _getArraySum(_array); } //////////////////////////////////////////////////////////// /////////// Internals //////////////////////////// //////////////////////////////////////////////////////////// function _decreaseAvailableAmount(address user, uint256 _lockIndex, uint256 _amount) internal { RegistryShare[] storage shares = registry[user]; for (uint256 i = 0; i < shares.length; i ++ ) { if (shares[i].lockIndex == _lockIndex) { //It does not matter what record will update // with same _lockIndex. but only one!!!! shares[i].claimedAmount += _amount; break; } } } function _getArraySum(uint256[] memory _array) internal pure returns (uint256) { uint256 res = 0; for (uint256 i = 0; i < _array.length; i++) { res += _array[i]; } return res; } function _getAvailableAmountByLockIndex(uint256 _lockIndex) internal view virtual returns(uint256) { VestingRecord[] memory v = lockerStorage[_lockIndex].vestings; uint256 res = 0; for (uint256 i = 0; i < v.length; i ++ ) { if (v[i].unlockTime <= block.timestamp && !v[i].isNFT) { res += v[i].amountUnlock; } } return res; } function _getUserSharePercentAndClaimedAmount(address _user, uint256 _lockIndex) internal view returns(uint256 percent, uint256 claimed) { RegistryShare[] memory shares = registry[_user]; for (uint256 i = 0; i < shares.length; i ++ ) { if (shares[i].lockIndex == _lockIndex) { //We do this cycle because one address can exist //more then once in one lock percent += shares[i].sharePercent; claimed += shares[i].claimedAmount; } } return (percent, claimed); } function _getUsersShares(address _user) internal view returns (RegistryShare[] memory) { return registry[_user]; } function _getUserBalances(address _user, uint256 _lockIndex) internal view returns (uint256, uint256) { (uint256 percentShares, uint256 wasClaimed) = _getUserSharePercentAndClaimedAmount(_user, _lockIndex); uint256 totalBalance = lockerStorage[_lockIndex].amount * percentShares / TOTAL_IN_PERCENT - wasClaimed; uint256 available = _getAvailableAmountByLockIndex(_lockIndex) * percentShares / TOTAL_IN_PERCENT - wasClaimed; return (totalBalance, available); } function _getVestingsByLockIndex(uint256 _index) internal view returns (VestingRecord[] memory) { VestingRecord[] memory v = _getLockRecordByIndex(_index).vestings; return v; } function _getLockRecordByIndex(uint256 _index) internal view returns (LockStorageRecord memory){ return lockerStorage[_index]; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** * @dev Base datstructures for Locker contracts set * */ abstract contract LockerTypes { //Just enum for good readability enum LockType {ERC20, LP} //Lock storage record struct LockStorageRecord { LockType ltype; //Most time it equal ERC20 address token; //Address of project token smart contract to lock uint256 amount; //Lock amount for all investors/lendings VestingRecord[] vestings; //Array of vedtings records (see below) } //One vesting record struct VestingRecord { uint256 unlockTime; //only after this moment locked amount will be available uint256 amountUnlock;//after unlockTime this amount will be available for all investors according percentage share bool isNFT; //for use with futeres lock } //Investor's share record struct RegistryShare { uint256 lockIndex; //Array index of lock record uint256 sharePercent; //Investors share in this lock uint256 claimedAmount; //Already claimed amount } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC20.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // 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) + 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 // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"erc20","type":"address"},{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"uint256","name":"lockedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockId","type":"uint256"}],"name":"NewLock","type":"event"},{"inputs":[],"name":"MAX_BENEFICIARIES_PER_LOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LOCkS_PER_BENEFICIARY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_VESTING_RECORDS_PER_LOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_IN_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockIndex","type":"uint256"},{"internalType":"uint256","name":"_desiredAmount","type":"uint256"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_array","type":"uint256[]"}],"name":"getArraySum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getLockCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getLockRecordByIndex","outputs":[{"components":[{"internalType":"enum LockerTypes.LockType","name":"ltype","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"components":[{"internalType":"uint256","name":"unlockTime","type":"uint256"},{"internalType":"uint256","name":"amountUnlock","type":"uint256"},{"internalType":"bool","name":"isNFT","type":"bool"}],"internalType":"struct LockerTypes.VestingRecord[]","name":"vestings","type":"tuple[]"}],"internalType":"struct LockerTypes.LockStorageRecord","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_lockIndex","type":"uint256"}],"name":"getUserBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserShares","outputs":[{"components":[{"internalType":"uint256","name":"lockIndex","type":"uint256"},{"internalType":"uint256","name":"sharePercent","type":"uint256"},{"internalType":"uint256","name":"claimedAmount","type":"uint256"}],"internalType":"struct LockerTypes.RegistryShare[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ERC20","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256[]","name":"_unlockedFrom","type":"uint256[]"},{"internalType":"uint256[]","name":"_unlockAmount","type":"uint256[]"},{"internalType":"address[]","name":"_beneficiaries","type":"address[]"},{"internalType":"uint256[]","name":"_beneficiariesShares","type":"uint256[]"}],"name":"lockTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"registry","outputs":[{"internalType":"uint256","name":"lockIndex","type":"uint256"},{"internalType":"uint256","name":"sharePercent","type":"uint256"},{"internalType":"uint256","name":"claimedAmount","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50611c18806100206000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063769c3cb31161008c578063ba0cb22b11610066578063ba0cb22b146101c9578063c3ac8b33146101e9578063d05cb545146101f6578063dfbe88811461022457600080fd5b8063769c3cb3146101865780638ea6bde3146101ae57806394493c43146101c157600080fd5b806306fdde03146100d457806308f999471461011f578063096dbaba14610135578063136fa5151461014a5780633098b74b146101535780636f5dde5214610166575b600080fd5b610109604051806040016040528060168152602001754c6f636b20262052656769737472792076302e302e3360501b81525081565b604051610116919061199b565b60405180910390f35b610127601581565b604051908152602001610116565b6101486101433660046117ad565b61022c565b005b6101276103e881565b610127610161366004611873565b610a99565b6101796101743660046118d2565b610aaa565b60405161011691906119ce565b610199610194366004611783565b610add565b60408051928352602083019190915201610116565b6101486101bc366004611904565b610af5565b600054610127565b6101dc6101d7366004611768565b610d58565b6040516101169190611942565b6101276509184e72a00081565b610209610204366004611783565b610d63565b60408051938452602084019290925290820152606001610116565b61012760a081565b600085116102765760405162461bcd60e51b815260206004820152601260248201527110d85b9d081b1bd8dac80c08185b5bdd5b9d60721b60448201526064015b60405180910390fd5b604051636eb1769f60e11b815233600482015230602482015285906001600160a01b0388169063dd62ed3e9060440160206040518083038186803b1580156102bd57600080fd5b505afa1580156102d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f591906118eb565b101561033a5760405162461bcd60e51b8152602060048201526014602482015273141b19585cd948185c1c1c9bdd9948199a5c9cdd60621b604482015260640161026d565b8461034484610da5565b146103a75760405162461bcd60e51b815260206004820152602d60248201527f53756d2076657374696e67207265636f726473206d757374206265206571756160448201526c1b081b1bd8dac8185b5bdd5b9d609a1b606482015260840161026d565b82518451146104135760405162461bcd60e51b815260206004820152603260248201527f4c656e677468206f6620706572696f647320616e6420616d6f756e74732061726044820152711c985e5cc81b5d5cdd08189948195c5d585b60721b606482015260840161026d565b805182511461048a5760405162461bcd60e51b815260206004820152603760248201527f4c656e677468206f662062656e6566696369617269657320616e64207368617260448201527f657320617272617973206d75737420626520657175616c000000000000000000606482015260840161026d565b6509184e72a00061049a82610da5565b146104f95760405162461bcd60e51b815260206004820152602960248201527f53756d206f6620736861726573206172726179206d75737420626520657175616044820152686c20746f203130302560b81b606482015260840161026d565b60a082511061054a5760405162461bcd60e51b815260206004820181905260248201527f4d41585f42454e454649434941524945535f5045525f4c4f434b204c494d4954604482015260640161026d565b60158451106105a65760405162461bcd60e51b815260206004820152602260248201527f4d41585f56455354494e475f5245434f5244535f5045525f4c4f434b204c494d604482015261125560f21b606482015260840161026d565b6000845167ffffffffffffffff8111156105c2576105c2611bcc565b60405190808252806020026020018201604052801561061957816020015b610606604051806060016040528060008152602001600081526020016000151581525090565b8152602001906001900390816105e05790505b50905060005b85518110156106b05785818151811061063a5761063a611bb6565b602002602001015182828151811061065457610654611bb6565b6020026020010151600001818152505084818151811061067657610676611bb6565b602002602001015182828151811061069057610690611bb6565b6020908102919091018101510152806106a881611b6f565b91505061061f565b50600080546001810182558180526003027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563810180546001600160a81b0319166101006001600160a01b038c16021781557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564909101889055905b86518110156107a9578160020183828151811061074957610749611bb6565b602090810291909101810151825460018082018555600094855293839020825160039092020190815591810151928201929092556040909101516002909101805460ff1916911515919091179055806107a181611b6f565b91505061072a565b5060005b8451811015610a1f5760006001600160a01b03168582815181106107d3576107d3611bb6565b60200260200101516001600160a01b0316141561082a5760405162461bcd60e51b815260206004820152601560248201527443616e7420616464207a65726f206164647265737360581b604482015260640161026d565b306001600160a01b031685828151811061084657610846611bb6565b60200260200101516001600160a01b031614156108905760405162461bcd60e51b8152602060048201526008602482015267426164206964656160c01b604482015260640161026d565b6000600160008784815181106108a8576108a8611bb6565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002090506103e8818054905011156109285760405162461bcd60e51b815260206004820152601f60248201527f4d41585f4c4f436b535f5045525f42454e4546494349415259204c494d495400604482015260640161026d565b80604051806060016040528060016000805490506109469190611b2c565b815260200187858151811061095d5761095d611bb6565b60209081029190910181015182526000918101829052835460018181018655948352818320845160039092020190815590830151818501556040909201516002928301558054919290916109b19190611b2c565b81526020019081526020016000208683815181106109d1576109d1611bb6565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555080610a1781611b6f565b9150506107ad565b5087610a366001600160a01b03821633308b610df3565b60005433906001600160a01b038b16907f360b683997b87e650f5af8bb848bb2f19f0ae44eccf0c5b82553fdd11cc0d371908b90610a7690600190611b2c565b6040805192835260208301919091520160405180910390a3505050505050505050565b6000610aa482610da5565b92915050565b610ad460408051608081019091528060008152600060208201819052604082015260609081015290565b610aa482610e64565b600080610aea8484610fa6565b915091509250929050565b6000548210610b465760405162461bcd60e51b815260206004820152601960248201527f4c6f636b207265636f7264206e6f742073617665642079657400000000000000604482015260640161026d565b60008111610b885760405162461bcd60e51b815260206004820152600f60248201526e43616e7420636c61696d207a65726f60881b604482015260640161026d565b6000808381548110610b9c57610b9c611bb6565b6000918252602090912060408051608081019091526003909202018054829060ff166001811115610bcf57610bcf611ba0565b6001811115610be057610be0611ba0565b81526020016000820160019054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015610c935760008481526020908190206040805160608101825260038602909201805483526001808201548486015260029091015460ff161515918301919091529083529092019101610c42565b50505050815250509050600080610caa338661104b565b915091506000816509184e72a00084610cc28961117c565b610ccc9190611b0d565b610cd69190611aeb565b610ce09190611b2c565b905080851115610d295760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e7420666f72206e6f7760601b604482015260640161026d565b5083610d363387836112ba565b6020840151610d4f6001600160a01b038216338461135f565b50505050505050565b6060610aa482611394565b60016020528160005260406000208181548110610d7f57600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b600080805b8351811015610dec57838181518110610dc557610dc5611bb6565b602002602001015182610dd89190611ad3565b915080610de481611b6f565b915050610daa565b5092915050565b6040516001600160a01b0380851660248301528316604482015260648101829052610e5e9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611427565b50505050565b610e8e60408051608081019091528060008152600060208201819052604082015260609081015290565b60008281548110610ea157610ea1611bb6565b6000918252602090912060408051608081019091526003909202018054829060ff166001811115610ed457610ed4611ba0565b6001811115610ee557610ee5611ba0565b81526020016000820160019054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015610f985760008481526020908190206040805160608101825260038602909201805483526001808201548486015260029091015460ff161515918301919091529083529092019101610f47565b505050915250909392505050565b600080600080610fb6868661104b565b915091506000816509184e72a0008460008981548110610fd857610fd8611bb6565b906000526020600020906003020160010154610ff49190611b0d565b610ffe9190611aeb565b6110089190611b2c565b90506000826509184e72a0008561101e8a61117c565b6110289190611b0d565b6110329190611aeb565b61103c9190611b2c565b91989197509095505050505050565b6001600160a01b0382166000908152600160209081526040808320805482518185028101850190935280835284938493929190849084015b828210156110d35783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190611083565b50505050905060005b815181101561117357848282815181106110f8576110f8611bb6565b60200260200101516000015114156111615781818151811061111c5761111c611bb6565b602002602001015160200151846111339190611ad3565b935081818151811061114757611147611bb6565b6020026020010151604001518361115e9190611ad3565b92505b8061116b81611b6f565b9150506110dc565b50509250929050565b6000806000838154811061119257611192611bb6565b9060005260206000209060030201600201805480602002602001604051908101604052809291908181526020016000905b828210156112145760008481526020908190206040805160608101825260038602909201805483526001808201548486015260029091015460ff1615159183019190915290835290920191016111c3565b5050505090506000805b82518110156112b2574383828151811061123a5761123a611bb6565b6020026020010151600001511115801561126f575082818151811061126157611261611bb6565b602002602001015160400151155b156112a05782818151811061128657611286611bb6565b6020026020010151602001518261129d9190611ad3565b91505b806112aa81611b6f565b91505061121e565b509392505050565b6001600160a01b0383166000908152600160205260408120905b815481101561135857838282815481106112f0576112f0611bb6565b9060005260206000209060030201600001541415611346578282828154811061131b5761131b611bb6565b9060005260206000209060030201600201600082825461133b9190611ad3565b909155506113589050565b8061135081611b6f565b9150506112d4565b5050505050565b6040516001600160a01b03831660248201526044810182905261138f90849063a9059cbb60e01b90606401610e27565b505050565b6001600160a01b0381166000908152600160209081526040808320805482518185028101850190935280835260609492939192909184015b8282101561141c57838290600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050815260200190600101906113cc565b505050509050919050565b600061147c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114f99092919063ffffffff16565b80519091501561138f578080602001905181019061149a91906118b0565b61138f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161026d565b60606115088484600085611512565b90505b9392505050565b6060824710156115735760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161026d565b843b6115c15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161026d565b600080866001600160a01b031685876040516115dd9190611926565b60006040518083038185875af1925050503d806000811461161a576040519150601f19603f3d011682016040523d82523d6000602084013e61161f565b606091505b509150915061162f82828661163a565b979650505050505050565b6060831561164957508161150b565b8251156116595782518084602001fd5b8160405162461bcd60e51b815260040161026d919061199b565b80356001600160a01b038116811461168a57600080fd5b919050565b600082601f8301126116a057600080fd5b813560206116b56116b083611aaf565b611a7e565b80838252828201915082860187848660051b89010111156116d557600080fd5b60005b858110156116fb576116e982611673565b845292840192908401906001016116d8565b5090979650505050505050565b600082601f83011261171957600080fd5b813560206117296116b083611aaf565b80838252828201915082860187848660051b890101111561174957600080fd5b60005b858110156116fb5781358452928401929084019060010161174c565b60006020828403121561177a57600080fd5b61150b82611673565b6000806040838503121561179657600080fd5b61179f83611673565b946020939093013593505050565b60008060008060008060c087890312156117c657600080fd5b6117cf87611673565b955060208701359450604087013567ffffffffffffffff808211156117f357600080fd5b6117ff8a838b01611708565b9550606089013591508082111561181557600080fd5b6118218a838b01611708565b9450608089013591508082111561183757600080fd5b6118438a838b0161168f565b935060a089013591508082111561185957600080fd5b5061186689828a01611708565b9150509295509295509295565b60006020828403121561188557600080fd5b813567ffffffffffffffff81111561189c57600080fd5b6118a884828501611708565b949350505050565b6000602082840312156118c257600080fd5b8151801515811461150b57600080fd5b6000602082840312156118e457600080fd5b5035919050565b6000602082840312156118fd57600080fd5b5051919050565b6000806040838503121561191757600080fd5b50508035926020909101359150565b60008251611938818460208701611b43565b9190910192915050565b602080825282518282018190526000919060409081850190868401855b8281101561198e578151805185528681015187860152850151858501526060909301929085019060010161195f565b5091979650505050505050565b60208152600082518060208401526119ba816040850160208701611b43565b601f01601f19169190910160400192915050565b6000602080835260a083018451600281106119f957634e487b7160e01b600052602160045260246000fd5b84830152848201516001600160a01b03166040808601919091528086015160608087019190915280870151608080880152805193849052840192600092919060c08801905b80851015611a71578551805183528781015188840152840151151584830152948601946001949094019390820190611a3e565b5098975050505050505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715611aa757611aa7611bcc565b604052919050565b600067ffffffffffffffff821115611ac957611ac9611bcc565b5060051b60200190565b60008219821115611ae657611ae6611b8a565b500190565b600082611b0857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611b2757611b27611b8a565b500290565b600082821015611b3e57611b3e611b8a565b500390565b60005b83811015611b5e578181015183820152602001611b46565b83811115610e5e5750506000910152565b6000600019821415611b8357611b83611b8a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220596b5811bd6b06faec92fbe52724693e2e2ce3b9621245a3166cdae7ca725e8f64736f6c63430008060033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063769c3cb31161008c578063ba0cb22b11610066578063ba0cb22b146101c9578063c3ac8b33146101e9578063d05cb545146101f6578063dfbe88811461022457600080fd5b8063769c3cb3146101865780638ea6bde3146101ae57806394493c43146101c157600080fd5b806306fdde03146100d457806308f999471461011f578063096dbaba14610135578063136fa5151461014a5780633098b74b146101535780636f5dde5214610166575b600080fd5b610109604051806040016040528060168152602001754c6f636b20262052656769737472792076302e302e3360501b81525081565b604051610116919061199b565b60405180910390f35b610127601581565b604051908152602001610116565b6101486101433660046117ad565b61022c565b005b6101276103e881565b610127610161366004611873565b610a99565b6101796101743660046118d2565b610aaa565b60405161011691906119ce565b610199610194366004611783565b610add565b60408051928352602083019190915201610116565b6101486101bc366004611904565b610af5565b600054610127565b6101dc6101d7366004611768565b610d58565b6040516101169190611942565b6101276509184e72a00081565b610209610204366004611783565b610d63565b60408051938452602084019290925290820152606001610116565b61012760a081565b600085116102765760405162461bcd60e51b815260206004820152601260248201527110d85b9d081b1bd8dac80c08185b5bdd5b9d60721b60448201526064015b60405180910390fd5b604051636eb1769f60e11b815233600482015230602482015285906001600160a01b0388169063dd62ed3e9060440160206040518083038186803b1580156102bd57600080fd5b505afa1580156102d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f591906118eb565b101561033a5760405162461bcd60e51b8152602060048201526014602482015273141b19585cd948185c1c1c9bdd9948199a5c9cdd60621b604482015260640161026d565b8461034484610da5565b146103a75760405162461bcd60e51b815260206004820152602d60248201527f53756d2076657374696e67207265636f726473206d757374206265206571756160448201526c1b081b1bd8dac8185b5bdd5b9d609a1b606482015260840161026d565b82518451146104135760405162461bcd60e51b815260206004820152603260248201527f4c656e677468206f6620706572696f647320616e6420616d6f756e74732061726044820152711c985e5cc81b5d5cdd08189948195c5d585b60721b606482015260840161026d565b805182511461048a5760405162461bcd60e51b815260206004820152603760248201527f4c656e677468206f662062656e6566696369617269657320616e64207368617260448201527f657320617272617973206d75737420626520657175616c000000000000000000606482015260840161026d565b6509184e72a00061049a82610da5565b146104f95760405162461bcd60e51b815260206004820152602960248201527f53756d206f6620736861726573206172726179206d75737420626520657175616044820152686c20746f203130302560b81b606482015260840161026d565b60a082511061054a5760405162461bcd60e51b815260206004820181905260248201527f4d41585f42454e454649434941524945535f5045525f4c4f434b204c494d4954604482015260640161026d565b60158451106105a65760405162461bcd60e51b815260206004820152602260248201527f4d41585f56455354494e475f5245434f5244535f5045525f4c4f434b204c494d604482015261125560f21b606482015260840161026d565b6000845167ffffffffffffffff8111156105c2576105c2611bcc565b60405190808252806020026020018201604052801561061957816020015b610606604051806060016040528060008152602001600081526020016000151581525090565b8152602001906001900390816105e05790505b50905060005b85518110156106b05785818151811061063a5761063a611bb6565b602002602001015182828151811061065457610654611bb6565b6020026020010151600001818152505084818151811061067657610676611bb6565b602002602001015182828151811061069057610690611bb6565b6020908102919091018101510152806106a881611b6f565b91505061061f565b50600080546001810182558180526003027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563810180546001600160a81b0319166101006001600160a01b038c16021781557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564909101889055905b86518110156107a9578160020183828151811061074957610749611bb6565b602090810291909101810151825460018082018555600094855293839020825160039092020190815591810151928201929092556040909101516002909101805460ff1916911515919091179055806107a181611b6f565b91505061072a565b5060005b8451811015610a1f5760006001600160a01b03168582815181106107d3576107d3611bb6565b60200260200101516001600160a01b0316141561082a5760405162461bcd60e51b815260206004820152601560248201527443616e7420616464207a65726f206164647265737360581b604482015260640161026d565b306001600160a01b031685828151811061084657610846611bb6565b60200260200101516001600160a01b031614156108905760405162461bcd60e51b8152602060048201526008602482015267426164206964656160c01b604482015260640161026d565b6000600160008784815181106108a8576108a8611bb6565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002090506103e8818054905011156109285760405162461bcd60e51b815260206004820152601f60248201527f4d41585f4c4f436b535f5045525f42454e4546494349415259204c494d495400604482015260640161026d565b80604051806060016040528060016000805490506109469190611b2c565b815260200187858151811061095d5761095d611bb6565b60209081029190910181015182526000918101829052835460018181018655948352818320845160039092020190815590830151818501556040909201516002928301558054919290916109b19190611b2c565b81526020019081526020016000208683815181106109d1576109d1611bb6565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555080610a1781611b6f565b9150506107ad565b5087610a366001600160a01b03821633308b610df3565b60005433906001600160a01b038b16907f360b683997b87e650f5af8bb848bb2f19f0ae44eccf0c5b82553fdd11cc0d371908b90610a7690600190611b2c565b6040805192835260208301919091520160405180910390a3505050505050505050565b6000610aa482610da5565b92915050565b610ad460408051608081019091528060008152600060208201819052604082015260609081015290565b610aa482610e64565b600080610aea8484610fa6565b915091509250929050565b6000548210610b465760405162461bcd60e51b815260206004820152601960248201527f4c6f636b207265636f7264206e6f742073617665642079657400000000000000604482015260640161026d565b60008111610b885760405162461bcd60e51b815260206004820152600f60248201526e43616e7420636c61696d207a65726f60881b604482015260640161026d565b6000808381548110610b9c57610b9c611bb6565b6000918252602090912060408051608081019091526003909202018054829060ff166001811115610bcf57610bcf611ba0565b6001811115610be057610be0611ba0565b81526020016000820160019054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015610c935760008481526020908190206040805160608101825260038602909201805483526001808201548486015260029091015460ff161515918301919091529083529092019101610c42565b50505050815250509050600080610caa338661104b565b915091506000816509184e72a00084610cc28961117c565b610ccc9190611b0d565b610cd69190611aeb565b610ce09190611b2c565b905080851115610d295760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e7420666f72206e6f7760601b604482015260640161026d565b5083610d363387836112ba565b6020840151610d4f6001600160a01b038216338461135f565b50505050505050565b6060610aa482611394565b60016020528160005260406000208181548110610d7f57600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b600080805b8351811015610dec57838181518110610dc557610dc5611bb6565b602002602001015182610dd89190611ad3565b915080610de481611b6f565b915050610daa565b5092915050565b6040516001600160a01b0380851660248301528316604482015260648101829052610e5e9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611427565b50505050565b610e8e60408051608081019091528060008152600060208201819052604082015260609081015290565b60008281548110610ea157610ea1611bb6565b6000918252602090912060408051608081019091526003909202018054829060ff166001811115610ed457610ed4611ba0565b6001811115610ee557610ee5611ba0565b81526020016000820160019054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015610f985760008481526020908190206040805160608101825260038602909201805483526001808201548486015260029091015460ff161515918301919091529083529092019101610f47565b505050915250909392505050565b600080600080610fb6868661104b565b915091506000816509184e72a0008460008981548110610fd857610fd8611bb6565b906000526020600020906003020160010154610ff49190611b0d565b610ffe9190611aeb565b6110089190611b2c565b90506000826509184e72a0008561101e8a61117c565b6110289190611b0d565b6110329190611aeb565b61103c9190611b2c565b91989197509095505050505050565b6001600160a01b0382166000908152600160209081526040808320805482518185028101850190935280835284938493929190849084015b828210156110d35783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190611083565b50505050905060005b815181101561117357848282815181106110f8576110f8611bb6565b60200260200101516000015114156111615781818151811061111c5761111c611bb6565b602002602001015160200151846111339190611ad3565b935081818151811061114757611147611bb6565b6020026020010151604001518361115e9190611ad3565b92505b8061116b81611b6f565b9150506110dc565b50509250929050565b6000806000838154811061119257611192611bb6565b9060005260206000209060030201600201805480602002602001604051908101604052809291908181526020016000905b828210156112145760008481526020908190206040805160608101825260038602909201805483526001808201548486015260029091015460ff1615159183019190915290835290920191016111c3565b5050505090506000805b82518110156112b2574383828151811061123a5761123a611bb6565b6020026020010151600001511115801561126f575082818151811061126157611261611bb6565b602002602001015160400151155b156112a05782818151811061128657611286611bb6565b6020026020010151602001518261129d9190611ad3565b91505b806112aa81611b6f565b91505061121e565b509392505050565b6001600160a01b0383166000908152600160205260408120905b815481101561135857838282815481106112f0576112f0611bb6565b9060005260206000209060030201600001541415611346578282828154811061131b5761131b611bb6565b9060005260206000209060030201600201600082825461133b9190611ad3565b909155506113589050565b8061135081611b6f565b9150506112d4565b5050505050565b6040516001600160a01b03831660248201526044810182905261138f90849063a9059cbb60e01b90606401610e27565b505050565b6001600160a01b0381166000908152600160209081526040808320805482518185028101850190935280835260609492939192909184015b8282101561141c57838290600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050815260200190600101906113cc565b505050509050919050565b600061147c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114f99092919063ffffffff16565b80519091501561138f578080602001905181019061149a91906118b0565b61138f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161026d565b60606115088484600085611512565b90505b9392505050565b6060824710156115735760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161026d565b843b6115c15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161026d565b600080866001600160a01b031685876040516115dd9190611926565b60006040518083038185875af1925050503d806000811461161a576040519150601f19603f3d011682016040523d82523d6000602084013e61161f565b606091505b509150915061162f82828661163a565b979650505050505050565b6060831561164957508161150b565b8251156116595782518084602001fd5b8160405162461bcd60e51b815260040161026d919061199b565b80356001600160a01b038116811461168a57600080fd5b919050565b600082601f8301126116a057600080fd5b813560206116b56116b083611aaf565b611a7e565b80838252828201915082860187848660051b89010111156116d557600080fd5b60005b858110156116fb576116e982611673565b845292840192908401906001016116d8565b5090979650505050505050565b600082601f83011261171957600080fd5b813560206117296116b083611aaf565b80838252828201915082860187848660051b890101111561174957600080fd5b60005b858110156116fb5781358452928401929084019060010161174c565b60006020828403121561177a57600080fd5b61150b82611673565b6000806040838503121561179657600080fd5b61179f83611673565b946020939093013593505050565b60008060008060008060c087890312156117c657600080fd5b6117cf87611673565b955060208701359450604087013567ffffffffffffffff808211156117f357600080fd5b6117ff8a838b01611708565b9550606089013591508082111561181557600080fd5b6118218a838b01611708565b9450608089013591508082111561183757600080fd5b6118438a838b0161168f565b935060a089013591508082111561185957600080fd5b5061186689828a01611708565b9150509295509295509295565b60006020828403121561188557600080fd5b813567ffffffffffffffff81111561189c57600080fd5b6118a884828501611708565b949350505050565b6000602082840312156118c257600080fd5b8151801515811461150b57600080fd5b6000602082840312156118e457600080fd5b5035919050565b6000602082840312156118fd57600080fd5b5051919050565b6000806040838503121561191757600080fd5b50508035926020909101359150565b60008251611938818460208701611b43565b9190910192915050565b602080825282518282018190526000919060409081850190868401855b8281101561198e578151805185528681015187860152850151858501526060909301929085019060010161195f565b5091979650505050505050565b60208152600082518060208401526119ba816040850160208701611b43565b601f01601f19169190910160400192915050565b6000602080835260a083018451600281106119f957634e487b7160e01b600052602160045260246000fd5b84830152848201516001600160a01b03166040808601919091528086015160608087019190915280870151608080880152805193849052840192600092919060c08801905b80851015611a71578551805183528781015188840152840151151584830152948601946001949094019390820190611a3e565b5098975050505050505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715611aa757611aa7611bcc565b604052919050565b600067ffffffffffffffff821115611ac957611ac9611bcc565b5060051b60200190565b60008219821115611ae657611ae6611b8a565b500190565b600082611b0857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611b2757611b27611b8a565b500290565b600082821015611b3e57611b3e611b8a565b500390565b60005b83811015611b5e578181015183820152602001611b46565b83811115610e5e5750506000910152565b6000600019821415611b8357611b83611b8a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220596b5811bd6b06faec92fbe52724693e2e2ce3b9621245a3166cdae7ca725e8f64736f6c63430008060033
Deployed Bytecode Sourcemap
138:490:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;262:55:2;;;;;;;;;;;;;;;-1:-1:-1;;;262:55:2;;;;;;;;;;;;:::i;:::-;;;;;;;;632:58;;688:2;632:58;;;;;14893:25:6;;;14881:2;14866:18;632:58:2;14848:76:6;2300:2927:2;;;;;;:::i;:::-;;:::i;:::-;;974:59;;1029:4;974:59;;8251:122;;;;;;:::i;:::-;;:::i;7827:147::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7413:160::-;;;;;;:::i;:::-;;:::i;:::-;;;;15103:25:6;;;15159:2;15144:18;;15137:34;;;;15076:18;7413:160:2;15058:119:6;5640:969:2;;;;;;:::i;:::-;;:::i;8079:100::-;8126:7;8152:20;8079:100;;6876:131;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1202:47::-;;1245:4;1202:47;;1345:52;;;;;;:::i;:::-;;:::i;:::-;;;;15384:25:6;;;15440:2;15425:18;;15418:34;;;;15468:18;;;15461:34;15372:2;15357:18;1345:52:2;15339:162:6;909:59:2;;965:3;909:59;;2300:2927;2598:1;2588:7;:11;2580:42;;;;-1:-1:-1;;;2580:42:2;;8667:2:6;2580:42:2;;;8649:21:6;8706:2;8686:18;;;8679:30;-1:-1:-1;;;8725:18:6;;;8718:48;8783:18;;2580:42:2;;;;;;;;;2640:51;;-1:-1:-1;;;2640:51:2;;2665:10;2640:51;;;4954:34:6;2685:4:2;5004:18:6;;;4997:43;2695:7:2;;-1:-1:-1;;;;;2640:24:2;;;;;4889:18:6;;2640:51:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;2632:95;;;;-1:-1:-1;;;2632:95:2;;12504:2:6;2632:95:2;;;12486:21:6;12543:2;12523:18;;;12516:30;-1:-1:-1;;;12562:18:6;;;12555:50;12622:18;;2632:95:2;12476:170:6;2632:95:2;2776:7;2745:27;2758:13;2745:12;:27::i;:::-;:38;2737:96;;;;-1:-1:-1;;;2737:96:2;;7160:2:6;2737:96:2;;;7142:21:6;7199:2;7179:18;;;7172:30;7238:34;7218:18;;;7211:62;-1:-1:-1;;;7289:18:6;;;7282:43;7342:19;;2737:96:2;7132:235:6;2737:96:2;2875:13;:20;2851:13;:20;:44;2843:107;;;;-1:-1:-1;;;2843:107:2;;10595:2:6;2843:107:2;;;10577:21:6;10634:2;10614:18;;;10607:30;10673:34;10653:18;;;10646:62;-1:-1:-1;;;10724:18:6;;;10717:48;10782:19;;2843:107:2;10567:240:6;2843:107:2;2993:20;:27;2968:14;:21;:52;2960:120;;;;-1:-1:-1;;;2960:120:2;;9417:2:6;2960:120:2;;;9399:21:6;9456:2;9436:18;;;9429:30;9495:34;9475:18;;;9468:62;9566:25;9546:18;;;9539:53;9609:19;;2960:120:2;9389:245:6;2960:120:2;1245:4;3098:34;3111:20;3098:12;:34::i;:::-;:54;3090:108;;;;-1:-1:-1;;;3090:108:2;;10185:2:6;3090:108:2;;;10167:21:6;10224:2;10204:18;;;10197:30;10263:34;10243:18;;;10236:62;-1:-1:-1;;;10314:18:6;;;10307:39;10363:19;;3090:108:2;10157:231:6;3090:108:2;965:3;3216:14;:21;:50;3208:97;;;;-1:-1:-1;;;3208:97:2;;11014:2:6;3208:97:2;;;10996:21:6;;;11033:18;;;11026:30;11092:34;11072:18;;;11065:62;11144:18;;3208:97:2;10986:182:6;3208:97:2;688:2;3323:13;:20;:52;3315:99;;;;-1:-1:-1;;;3315:99:2;;9014:2:6;3315:99:2;;;8996:21:6;9053:2;9033:18;;;9026:30;9092:34;9072:18;;;9065:62;-1:-1:-1;;;9143:18:6;;;9136:32;9185:19;;3315:99:2;8986:224:6;3315:99:2;3463:24;3510:13;:20;3490:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;3490:41:2;;;;;;;;;;;;;;;;;3463:68;;3546:9;3541:171;3565:13;:20;3561:1;:24;3541:171;;;3630:13;3644:1;3630:16;;;;;;;;:::i;:::-;;;;;;;3612:1;3614;3612:4;;;;;;;;:::i;:::-;;;;;;;:15;;:34;;;;;3684:13;3698:1;3684:16;;;;;;;;:::i;:::-;;;;;;;3664:1;3666;3664:4;;;;;;;;:::i;:::-;;;;;;;;;;;;:17;:36;3587:4;;;;:::i;:::-;;;;3541:171;;;-1:-1:-1;3766:30:2;3799:20;;;;;;;;;;;;;;;3829:27;;-1:-1:-1;;;;;;3866:19:2;;-1:-1:-1;;;;;3866:19:2;;;;;;3895:11;;;;:21;;;3799:20;4076:106;4100:13;:20;4096:1;:24;4076:106;;;4143:4;:13;;4162:1;4164;4162:4;;;;;;;;:::i;:::-;;;;;;;;;;;;4143:24;;;;;;;;-1:-1:-1;4143:24:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4143:24:2;;;;;;;;;;4122:4;;;;:::i;:::-;;;;4076:106;;;;4246:9;4241:785;4265:14;:21;4261:1;:25;4241:785;;;4346:1;-1:-1:-1;;;;;4317:31:2;:14;4332:1;4317:17;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;4317:31:2;;;4309:65;;;;-1:-1:-1;;;4309:65:2;;7910:2:6;4309:65:2;;;7892:21:6;7949:2;7929:18;;;7922:30;-1:-1:-1;;;7968:18:6;;;7961:51;8029:18;;4309:65:2;7882:171:6;4309:65:2;4425:4;-1:-1:-1;;;;;4396:34:2;:14;4411:1;4396:17;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;4396:34:2;;;4388:55;;;;-1:-1:-1;;;4388:55:2;;7574:2:6;4388:55:2;;;7556:21:6;7613:1;7593:18;;;7586:29;-1:-1:-1;;;7631:18:6;;;7624:38;7679:18;;4388:55:2;7546:157:6;4388:55:2;4457:30;4490:8;:27;4499:14;4514:1;4499:17;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;4490:27:2;-1:-1:-1;;;;;4490:27:2;;;;;;;;;;;;4457:60;;1029:4;4556:6;:13;;;;:42;;4531:133;;;;-1:-1:-1;;;4531:133:2;;11733:2:6;4531:133:2;;;11715:21:6;11772:2;11752:18;;;11745:30;11811:33;11791:18;;;11784:61;11862:18;;4531:133:2;11705:181:6;4531:133:2;4678:6;4690:171;;;;;;;;4756:1;4733:13;:20;;;;:24;;;;:::i;:::-;4690:171;;;;4789:20;4810:1;4789:23;;;;;;;;:::i;:::-;;;;;;;;;;;;4690:171;;4845:1;4690:171;;;;;;4678:184;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4966:20;;4678:184;;4845:1;;4966:24;;4678:184;4966:24;:::i;:::-;4946:45;;;;;;;;;;;4997:14;5012:1;4997:17;;;;;;;;:::i;:::-;;;;;;;;;;;;4946:69;;;;;;;-1:-1:-1;4946:69:2;;;;;;;;;;-1:-1:-1;;;;;;4946:69:2;-1:-1:-1;;;;;4946:69:2;;;;;;;;;-1:-1:-1;4288:4:2;;;;:::i;:::-;;;;4241:785;;;-1:-1:-1;5067:6:2;5084:58;-1:-1:-1;;;;;5084:22:2;;5107:10;5127:4;5134:7;5084:22;:58::i;:::-;5194:13;:20;5173:10;;-1:-1:-1;;;;;5157:62:2;;;;;5185:7;;5194:24;;5217:1;;5194:24;:::i;:::-;5157:62;;;15103:25:6;;;15159:2;15144:18;;15137:34;;;;15076:18;5157:62:2;;;;;;;2570:2657;;;2300:2927;;;;;;:::o;8251:122::-;8320:7;8346:20;8359:6;8346:12;:20::i;:::-;8339:27;8251:122;-1:-1:-1;;8251:122:2:o;7827:147::-;7896:24;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7896:24:2;7938:29;7960:6;7938:21;:29::i;7413:160::-;7496:7;7505;7531:35;7548:5;7555:10;7531:16;:35::i;:::-;7524:42;;;;7413:160;;;;;:::o;5640:969::-;5788:13;:20;5775:33;;5767:71;;;;-1:-1:-1;;;5767:71:2;;13202:2:6;5767:71:2;;;13184:21:6;13241:2;13221:18;;;13214:30;13280:27;13260:18;;;13253:55;13325:18;;5767:71:2;13174:175:6;5767:71:2;5873:1;5856:14;:18;5848:46;;;;-1:-1:-1;;;5848:46:2;;9841:2:6;5848:46:2;;;9823:21:6;9880:2;9860:18;;;9853:30;-1:-1:-1;;;9899:18:6;;;9892:45;9954:18;;5848:46:2;9813:165:6;5848:46:2;5904:29;5936:13;5950:10;5936:25;;;;;;;;:::i;:::-;;;;;;;;;5904:57;;;;;;;;;5936:25;;;;;5904:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5904:57:2;-1:-1:-1;;;;;5904:57:2;-1:-1:-1;;;;;5904:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5972:21;5995:18;6030:60;6067:10;6079;6030:36;:60::i;:::-;5971:119;;;;6100:23;6242:10;1245:4;6195:13;6138:42;6169:10;6138:30;:42::i;:::-;:70;;;;:::i;:::-;:89;;;;:::i;:::-;:114;;;;:::i;:::-;6100:152;;6289:15;6271:14;:33;;6263:66;;;;-1:-1:-1;;;6263:66:2;;12853:2:6;6263:66:2;;;12835:21:6;12892:2;12872:18;;;12865:30;-1:-1:-1;;;12911:18:6;;;12904:50;12971:18;;6263:66:2;12825:170:6;6263:66:2;-1:-1:-1;6357:14:2;6414:65;6439:10;6451;6357:14;6414:24;:65::i;:::-;6534:10;;;;6555:47;-1:-1:-1;;;;;6555:18:2;;6574:10;6586:15;6555:18;:47::i;:::-;5714:895;;;;;5640:969;;:::o;6876:131::-;6937:22;6978;6994:5;6978:15;:22::i;1345:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1345:52:2;;-1:-1:-1;1345:52:2;:::o;9067:236::-;9137:7;;;9181:96;9205:6;:13;9201:1;:17;9181:96;;;9246:6;9253:1;9246:9;;;;;;;;:::i;:::-;;;;;;;9239:16;;;;;:::i;:::-;;-1:-1:-1;9220:3:2;;;;:::i;:::-;;;;9181:96;;;-1:-1:-1;9293:3:2;9067:236;-1:-1:-1;;9067:236:2:o;801:203:5:-;928:68;;-1:-1:-1;;;;;5309:15:6;;;928:68:5;;;5291:34:6;5361:15;;5341:18;;;5334:43;5393:18;;;5386:34;;;901:96:5;;921:5;;-1:-1:-1;;;951:27:5;5226:18:6;;928:68:5;;;;-1:-1:-1;;928:68:5;;;;;;;;;;;;;;-1:-1:-1;;;;;928:68:5;-1:-1:-1;;;;;;928:68:5;;;;;;;;;;901:19;:96::i;:::-;801:203;;;;:::o;11286:140:2:-;11356:24;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11356:24:2;11398:13;11412:6;11398:21;;;;;;;;:::i;:::-;;;;;;;;;11391:28;;;;;;;;;11398:21;;;;;11391:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11391:28:2;-1:-1:-1;;;;;11391:28:2;-1:-1:-1;;;;;11391:28:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11391:28:2;;-1:-1:-1;11391:28:2;;11286:140;-1:-1:-1;;;11286:140:2:o;10516:560::-;10600:7;10609;10630:21;10653:18;10687:55;10724:5;10731:10;10687:36;:55::i;:::-;10629:113;;;;10753:20;10870:10;1245:4;10827:13;10784;10798:10;10784:25;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;;:56;;;;:::i;:::-;:75;;;;:::i;:::-;:96;;;;:::i;:::-;10753:127;;10891:17;11015:10;1245:4;10972:13;10919:42;10950:10;10919:30;:42::i;:::-;:66;;;;:::i;:::-;:85;;;;:::i;:::-;:106;;;;:::i;:::-;11044:12;;;;-1:-1:-1;10516:560:2;;-1:-1:-1;;;;;;10516:560:2:o;9764:614::-;-1:-1:-1;;;;;9974:15:2;;9894;9974;;;:8;:15;;;;;;;;9942:47;;;;;;;;;;;;;;;;;9894:15;;;;9942:47;9974:15;9942:47;9894:15;;9942:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10004:9;9999:338;10023:6;:13;10019:1;:17;9999:338;;;10087:10;10064:6;10071:1;10064:9;;;;;;;;:::i;:::-;;;;;;;:19;;;:33;10059:268;;;10238:6;10245:1;10238:9;;;;;;;;:::i;:::-;;;;;;;:22;;;10227:33;;;;;:::i;:::-;;;10289:6;10296:1;10289:9;;;;;;;;:::i;:::-;;;;;;;:23;;;10278:34;;;;;:::i;:::-;;;10059:268;10038:4;;;;:::i;:::-;;;;9999:338;;;;10346:25;9764:614;;;;;:::o;178:447:3:-;305:7;328:24;355:13;369:10;355:25;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;328:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;399:11;429:9;424:175;448:1;:8;444:1;:12;424:175;;;503:12;484:1;486;484:4;;;;;;;;:::i;:::-;;;;;;;:15;;;:31;;:46;;;;;520:1;522;520:4;;;;;;;;:::i;:::-;;;;;;;:10;;;519:11;484:46;479:110;;;557:1;559;557:4;;;;;;;;:::i;:::-;;;;;;;:17;;;550:24;;;;;:::i;:::-;;;479:110;458:4;;;;:::i;:::-;;;;424:175;;;-1:-1:-1;615:3:3;178:447;-1:-1:-1;;;178:447:3:o;8574:487:2:-;-1:-1:-1;;;;;8711:14:2;;8678:30;8711:14;;;:8;:14;;;;;;8735:319;8759:13;;8755:17;;8735:319;;;8823:10;8800:6;8807:1;8800:9;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;:33;8795:249;;;8999:7;8972:6;8979:1;8972:9;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;9024:5:2;;-1:-1:-1;9024:5:2;8795:249;8774:4;;;;:::i;:::-;;;;8735:319;;;;8668:393;8574:487;;;:::o;620:175:5:-;729:58;;-1:-1:-1;;;;;5623:32:6;;729:58:5;;;5605:51:6;5672:18;;;5665:34;;;702:86:5;;722:5;;-1:-1:-1;;;752:23:5;5578:18:6;;729:58:5;5560:145:6;702:86:5;620:175;;;:::o;10384:126:2:-;-1:-1:-1;;;;;10488:15:2;;;;;;:8;:15;;;;;;;;10481:22;;;;;;;;;;;;;;;;;10447;;10481;;10488:15;;10481:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10384:126;;;:::o;3008:751:5:-;3427:23;3453:69;3481:4;3453:69;;;;;;;;;;;;;;;;;3461:5;-1:-1:-1;;;;;3453:27:5;;;:69;;;;;:::i;:::-;3536:17;;3427:95;;-1:-1:-1;3536:21:5;3532:221;;3676:10;3665:30;;;;;;;;;;;;:::i;:::-;3657:85;;;;-1:-1:-1;;;3657:85:5;;12093:2:6;3657:85:5;;;12075:21:6;12132:2;12112:18;;;12105:30;12171:34;12151:18;;;12144:62;-1:-1:-1;;;12222:18:6;;;12215:40;12272:19;;3657:85:5;12065:232:6;3573:193:0;3676:12;3707:52;3729:6;3737:4;3743:1;3746:12;3707:21;:52::i;:::-;3700:59;;3573:193;;;;;;:::o;4600:523::-;4727:12;4784:5;4759:21;:30;;4751:81;;;;-1:-1:-1;;;4751:81:0;;8260:2:6;4751:81:0;;;8242:21:6;8299:2;8279:18;;;8272:30;8338:34;8318:18;;;8311:62;-1:-1:-1;;;8389:18:6;;;8382:36;8435:19;;4751:81:0;8232:228:6;4751:81:0;1078:20;;4842:60;;;;-1:-1:-1;;;4842:60:0;;11375:2:6;4842:60:0;;;11357:21:6;11414:2;11394:18;;;11387:30;11453:31;11433:18;;;11426:59;11502:18;;4842:60:0;11347:179:6;4842:60:0;4973:12;4987:23;5014:6;-1:-1:-1;;;;;5014:11:0;5034:5;5042:4;5014:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4972:75;;;;5064:52;5082:7;5091:10;5103:12;5064:17;:52::i;:::-;5057:59;4600:523;-1:-1:-1;;;;;;;4600:523:0:o;7083:725::-;7198:12;7226:7;7222:580;;;-1:-1:-1;7256:10:0;7249:17;;7222:580;7367:17;;:21;7363:429;;7625:10;7619:17;7685:15;7672:10;7668:2;7664:19;7657:44;7363:429;7764:12;7757:20;;-1:-1:-1;;;7757:20:0;;;;;;;;:::i;14:173:6:-;82:20;;-1:-1:-1;;;;;131:31:6;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:679::-;246:5;299:3;292:4;284:6;280:17;276:27;266:2;;317:1;314;307:12;266:2;353:6;340:20;379:4;403:60;419:43;459:2;419:43;:::i;:::-;403:60;:::i;:::-;485:3;509:2;504:3;497:15;537:2;532:3;528:12;521:19;;572:2;564:6;560:15;624:3;619:2;613;610:1;606:10;598:6;594:23;590:32;587:41;584:2;;;641:1;638;631:12;584:2;663:1;673:169;687:2;684:1;681:9;673:169;;;744:23;763:3;744:23;:::i;:::-;732:36;;788:12;;;;820;;;;705:1;698:9;673:169;;;-1:-1:-1;860:5:6;;256:615;-1:-1:-1;;;;;;;256:615:6:o;876:673::-;930:5;983:3;976:4;968:6;964:17;960:27;950:2;;1001:1;998;991:12;950:2;1037:6;1024:20;1063:4;1087:60;1103:43;1143:2;1103:43;:::i;1087:60::-;1169:3;1193:2;1188:3;1181:15;1221:2;1216:3;1212:12;1205:19;;1256:2;1248:6;1244:15;1308:3;1303:2;1297;1294:1;1290:10;1282:6;1278:23;1274:32;1271:41;1268:2;;;1325:1;1322;1315:12;1268:2;1347:1;1357:163;1371:2;1368:1;1365:9;1357:163;;;1428:17;;1416:30;;1466:12;;;;1498;;;;1389:1;1382:9;1357:163;;1554:186;1613:6;1666:2;1654:9;1645:7;1641:23;1637:32;1634:2;;;1682:1;1679;1672:12;1634:2;1705:29;1724:9;1705:29;:::i;1745:254::-;1813:6;1821;1874:2;1862:9;1853:7;1849:23;1845:32;1842:2;;;1890:1;1887;1880:12;1842:2;1913:29;1932:9;1913:29;:::i;:::-;1903:39;1989:2;1974:18;;;;1961:32;;-1:-1:-1;;;1832:167:6:o;2004:1192::-;2208:6;2216;2224;2232;2240;2248;2301:3;2289:9;2280:7;2276:23;2272:33;2269:2;;;2318:1;2315;2308:12;2269:2;2341:29;2360:9;2341:29;:::i;:::-;2331:39;;2417:2;2406:9;2402:18;2389:32;2379:42;;2472:2;2461:9;2457:18;2444:32;2495:18;2536:2;2528:6;2525:14;2522:2;;;2552:1;2549;2542:12;2522:2;2575:61;2628:7;2619:6;2608:9;2604:22;2575:61;:::i;:::-;2565:71;;2689:2;2678:9;2674:18;2661:32;2645:48;;2718:2;2708:8;2705:16;2702:2;;;2734:1;2731;2724:12;2702:2;2757:63;2812:7;2801:8;2790:9;2786:24;2757:63;:::i;:::-;2747:73;;2873:3;2862:9;2858:19;2845:33;2829:49;;2903:2;2893:8;2890:16;2887:2;;;2919:1;2916;2909:12;2887:2;2942:63;2997:7;2986:8;2975:9;2971:24;2942:63;:::i;:::-;2932:73;;3058:3;3047:9;3043:19;3030:33;3014:49;;3088:2;3078:8;3075:16;3072:2;;;3104:1;3101;3094:12;3072:2;;3127:63;3182:7;3171:8;3160:9;3156:24;3127:63;:::i;:::-;3117:73;;;2259:937;;;;;;;;:::o;3201:348::-;3285:6;3338:2;3326:9;3317:7;3313:23;3309:32;3306:2;;;3354:1;3351;3344:12;3306:2;3394:9;3381:23;3427:18;3419:6;3416:30;3413:2;;;3459:1;3456;3449:12;3413:2;3482:61;3535:7;3526:6;3515:9;3511:22;3482:61;:::i;:::-;3472:71;3296:253;-1:-1:-1;;;;3296:253:6:o;3554:277::-;3621:6;3674:2;3662:9;3653:7;3649:23;3645:32;3642:2;;;3690:1;3687;3680:12;3642:2;3722:9;3716:16;3775:5;3768:13;3761:21;3754:5;3751:32;3741:2;;3797:1;3794;3787:12;3836:180;3895:6;3948:2;3936:9;3927:7;3923:23;3919:32;3916:2;;;3964:1;3961;3954:12;3916:2;-1:-1:-1;3987:23:6;;3906:110;-1:-1:-1;3906:110:6:o;4021:184::-;4091:6;4144:2;4132:9;4123:7;4119:23;4115:32;4112:2;;;4160:1;4157;4150:12;4112:2;-1:-1:-1;4183:16:6;;4102:103;-1:-1:-1;4102:103:6:o;4210:248::-;4278:6;4286;4339:2;4327:9;4318:7;4314:23;4310:32;4307:2;;;4355:1;4352;4345:12;4307:2;-1:-1:-1;;4378:23:6;;;4448:2;4433:18;;;4420:32;;-1:-1:-1;4297:161:6:o;4463:274::-;4592:3;4630:6;4624:13;4646:53;4692:6;4687:3;4680:4;4672:6;4668:17;4646:53;:::i;:::-;4715:16;;;;;4600:137;-1:-1:-1;;4600:137:6:o;5710:855::-;5943:2;5995:21;;;6065:13;;5968:18;;;6087:22;;;5914:4;;5943:2;6128;;6146:18;;;;6187:15;;;5914:4;6230:309;6244:6;6241:1;6238:13;6230:309;;;6303:13;;6341:9;;6329:22;;6391:11;;;6385:18;6371:12;;;6364:40;6444:11;;6438:18;6424:12;;;6417:40;6486:4;6477:14;;;;6514:15;;;;6266:1;6259:9;6230:309;;;-1:-1:-1;6556:3:6;;5923:642;-1:-1:-1;;;;;;;5923:642:6:o;6570:383::-;6719:2;6708:9;6701:21;6682:4;6751:6;6745:13;6794:6;6789:2;6778:9;6774:18;6767:34;6810:66;6869:6;6864:2;6853:9;6849:18;6844:2;6836:6;6832:15;6810:66;:::i;:::-;6937:2;6916:15;-1:-1:-1;;6912:29:6;6897:45;;;;6944:2;6893:54;;6691:262;-1:-1:-1;;6691:262:6:o;13354:1388::-;13516:4;13545:2;13574;13563:9;13556:21;13615:3;13604:9;13600:19;13644:6;13638:13;13677:1;13673:2;13670:9;13660:2;;13722:10;13717:3;13713:20;13710:1;13703:31;13757:4;13754:1;13747:15;13785:4;13782:1;13775:15;13660:2;13816:18;;;13809:30;13874:15;;;13868:22;-1:-1:-1;;;;;13947:38:6;13909:2;13927:18;;;13920:66;;;;14011:15;;;14005:22;14046:2;14064:18;;;14057:30;;;;14124:15;;;14118:22;14178:4;14156:20;;;14149:34;14232:21;;14262:22;;;;14342:23;;;-1:-1:-1;;13909:2:6;14046;14315:3;14300:19;;;14393:323;14407:6;14404:1;14401:13;14393:323;;;14466:13;;14504:9;;14492:22;;14554:11;;;14548:18;14534:12;;;14527:40;14621:11;;14615:18;14608:26;14601:34;14587:12;;;14580:56;14691:15;;;;14429:1;14422:9;;;;;14656:12;;;;14393:323;;;-1:-1:-1;14733:3:6;13525:1217;-1:-1:-1;;;;;;;;13525:1217:6:o;15506:275::-;15577:2;15571:9;15642:2;15623:13;;-1:-1:-1;;15619:27:6;15607:40;;15677:18;15662:34;;15698:22;;;15659:62;15656:2;;;15724:18;;:::i;:::-;15760:2;15753:22;15551:230;;-1:-1:-1;15551:230:6:o;15786:183::-;15846:4;15879:18;15871:6;15868:30;15865:2;;;15901:18;;:::i;:::-;-1:-1:-1;15946:1:6;15942:14;15958:4;15938:25;;15855:114::o;15974:128::-;16014:3;16045:1;16041:6;16038:1;16035:13;16032:2;;;16051:18;;:::i;:::-;-1:-1:-1;16087:9:6;;16022:80::o;16107:217::-;16147:1;16173;16163:2;;16217:10;16212:3;16208:20;16205:1;16198:31;16252:4;16249:1;16242:15;16280:4;16277:1;16270:15;16163:2;-1:-1:-1;16309:9:6;;16153:171::o;16329:168::-;16369:7;16435:1;16431;16427:6;16423:14;16420:1;16417:21;16412:1;16405:9;16398:17;16394:45;16391:2;;;16442:18;;:::i;:::-;-1:-1:-1;16482:9:6;;16381:116::o;16502:125::-;16542:4;16570:1;16567;16564:8;16561:2;;;16575:18;;:::i;:::-;-1:-1:-1;16612:9:6;;16551:76::o;16632:258::-;16704:1;16714:113;16728:6;16725:1;16722:13;16714:113;;;16804:11;;;16798:18;16785:11;;;16778:39;16750:2;16743:10;16714:113;;;16845:6;16842:1;16839:13;16836:2;;;-1:-1:-1;;16880:1:6;16862:16;;16855:27;16685:205::o;16895:135::-;16934:3;-1:-1:-1;;16955:17:6;;16952:2;;;16975:18;;:::i;:::-;-1:-1:-1;17022:1:6;17011:13;;16942:88::o;17035:127::-;17096:10;17091:3;17087:20;17084:1;17077:31;17127:4;17124:1;17117:15;17151:4;17148:1;17141:15;17167:127;17228:10;17223:3;17219:20;17216:1;17209:31;17259:4;17256:1;17249:15;17283:4;17280:1;17273:15;17299:127;17360:10;17355:3;17351:20;17348:1;17341:31;17391:4;17388:1;17381:15;17415:4;17412:1;17405:15;17431:127;17492:10;17487:3;17483:20;17480:1;17473:31;17523:4;17520:1;17513:15;17547:4;17544:1;17537:15
Swarm Source
ipfs://596b5811bd6b06faec92fbe52724693e2e2ce3b9621245a3166cdae7ca725e8f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.