More Info
Private Name Tags
ContractCreator
Multichain Info
No addresses found
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
OpenLiTeamVesting
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-06-20 */ // created by cryptodo.app // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } /** * @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; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ 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"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to * 0 before setting it to a non-zero value. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @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). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } } /** * @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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/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.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } contract OpenLiTeamVesting is Ownable, ReentrancyGuard { using Address for address; using SafeERC20 for IERC20; struct UnlockInfo { uint256 unlockDate; uint256 percent; } struct VestingInfo { uint256 totalAmount; uint256 withdrawn; UnlockInfo[] unlockInfos; uint256 startTime; } mapping(address => VestingInfo) public vestings; IERC20 public token; uint256 public vestingInterval; uint16 public vestingCount; uint256 public vestingDelay; address[] private _beneficiaries; mapping(address => uint256) private _balances; mapping(address => uint256) private _lastClaimTime; uint256 public createdAt; event VestingIntervalChanged(uint32 vestingInterval); event VestingCountChanged(uint16 vestingCount); event VestingDelayChanged(uint256 vestingDelay); constructor( IERC20 _token, address[] memory _addresses, uint256[] memory _amounts, uint256 _vestingDelay, uint256 _vestingInterval, uint16 _vestingCount ) { require( _addresses.length == _amounts.length, 'Input arrays length mismatch' ); createdAt = block.timestamp; token = _token; vestingInterval = _vestingInterval; vestingCount = _vestingCount; vestingDelay = _vestingDelay; for (uint256 i = 0; i < _addresses.length; i++) { _beneficiaries.push(_addresses[i]); VestingInfo storage vesting = vestings[_addresses[i]]; vesting.totalAmount = _amounts[i]; vesting.withdrawn = 0; vesting.startTime = block.timestamp; for (uint256 j = 0; j < _vestingCount; j++) { UnlockInfo memory newUnlockInfo = UnlockInfo({ unlockDate: createdAt + _vestingDelay + (vestingInterval * j), percent: 10000 / _vestingCount }); vesting.unlockInfos.push(newUnlockInfo); } } } function getDecimals() private view returns (uint8) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSignature("decimals()") ); require(success, "Failed to call decimals function on token contract"); return abi.decode(data, (uint8)); } function setVestingInterval(uint32 _interval) public onlyOwner { vestingInterval = _interval; emit VestingIntervalChanged(_interval); } function setVestingCount(uint16 _count) public onlyOwner { require(_count > 0, "Count must be greater than 0"); vestingCount = _count; emit VestingCountChanged(_count); } function setVestingDelay(uint256 _delay) public onlyOwner { vestingDelay = _delay; emit VestingDelayChanged(_delay); } function withdraw() public nonReentrant { VestingInfo storage vesting = vestings[msg.sender]; uint256 totalPercent = 0; uint8 decimals = getDecimals(); for (uint256 i = 0; i < vesting.unlockInfos.length; i++) { if (block.timestamp >= vesting.unlockInfos[i].unlockDate) { totalPercent += vesting.unlockInfos[i].percent; vesting.unlockInfos[i].percent = 0; } } uint256 timePassed = block.timestamp - vesting.startTime; uint256 releasedIntervals = timePassed / vestingInterval; if (releasedIntervals > vestingCount) { releasedIntervals = vestingCount; } uint256 intervalPercent = (releasedIntervals * 10000) / vestingCount; // 10000 is 100% if (intervalPercent > totalPercent) { totalPercent = intervalPercent; } require(totalPercent > 0, 'No tokens to withdraw'); uint256 withdrawable = (vesting.totalAmount * totalPercent) / 10000; require( vesting.withdrawn + withdrawable <= vesting.totalAmount, 'Cannot withdraw more than total amount' ); vesting.withdrawn += withdrawable; uint256 withdrawableAdjusted = withdrawable * (10 ** uint256(decimals)); token.safeTransfer(msg.sender, withdrawableAdjusted); _lastClaimTime[_msgSender()] = block.timestamp; } function checkVestingDetails(address participant) public view returns (uint256 totalAmount, uint256 withdrawn, uint256 unlockable, uint256[] memory unlockDates, uint256[] memory unlockPercents) { VestingInfo storage vesting = vestings[participant]; totalAmount = vesting.totalAmount; withdrawn = vesting.withdrawn; uint256 totalPercent = 0; for (uint256 i = 0; i < vesting.unlockInfos.length; i++) { if (block.timestamp >= vesting.unlockInfos[i].unlockDate) { totalPercent += vesting.unlockInfos[i].percent; } } unlockable = (vesting.totalAmount * totalPercent) / 10000; unlockDates = new uint256[](vesting.unlockInfos.length); unlockPercents = new uint256[](vesting.unlockInfos.length); for (uint256 i = 0; i < vesting.unlockInfos.length; i++) { unlockDates[i] = vesting.unlockInfos[i].unlockDate; unlockPercents[i] = vesting.unlockInfos[i].percent; } } function getTotalParticipants() public view returns (uint256) { return _beneficiaries.length; } function getTotalClaimedTokens() public view returns (uint256) { uint256 totalClaimed = 0; for (uint256 i = 0; i < _beneficiaries.length; i++) { totalClaimed += vestings[_beneficiaries[i]].withdrawn; } return totalClaimed; } function getLastClaimTime() external view returns (uint256) { return _lastClaimTime[_msgSender()]; } function depositTokens(uint256 amount) external nonReentrant onlyOwner { token.safeTransferFrom(_msgSender(), address(this), amount); } function getTotalRemainingTokens() public view returns (uint256) { uint256 totalRemaining = 0; for (uint256 i = 0; i < _beneficiaries.length; i++) { totalRemaining += vestings[_beneficiaries[i]].totalAmount - vestings[_beneficiaries[i]].withdrawn; } return totalRemaining; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"uint256","name":"_vestingDelay","type":"uint256"},{"internalType":"uint256","name":"_vestingInterval","type":"uint256"},{"internalType":"uint16","name":"_vestingCount","type":"uint16"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"vestingCount","type":"uint16"}],"name":"VestingCountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"vestingDelay","type":"uint256"}],"name":"VestingDelayChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"vestingInterval","type":"uint32"}],"name":"VestingIntervalChanged","type":"event"},{"inputs":[{"internalType":"address","name":"participant","type":"address"}],"name":"checkVestingDetails","outputs":[{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"withdrawn","type":"uint256"},{"internalType":"uint256","name":"unlockable","type":"uint256"},{"internalType":"uint256[]","name":"unlockDates","type":"uint256[]"},{"internalType":"uint256[]","name":"unlockPercents","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createdAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLastClaimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalClaimedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalParticipants","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalRemainingTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_count","type":"uint16"}],"name":"setVestingCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_delay","type":"uint256"}],"name":"setVestingDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_interval","type":"uint32"}],"name":"setVestingInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vestingCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vestings","outputs":[{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"withdrawn","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561000f575f80fd5b50604051612bc9380380612bc9833981810160405281019061003191906106c8565b61004d6100426102e060201b60201c565b6102e760201b60201c565b600180819055508351855114610098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008f906107e3565b60405180910390fd5b42600a819055508560035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816004819055508060055f6101000a81548161ffff021916908361ffff160217905550826006819055505f5b85518110156102d457600786828151811061012957610128610801565b5b6020026020010151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60025f8884815181106101a5576101a4610801565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090508582815181106101fb576101fa610801565b5b6020026020010151815f01819055505f81600101819055504281600301819055505f5b8361ffff168110156102c5575f604051806040016040528083600454610244919061085b565b89600a54610252919061089c565b61025c919061089c565b81526020018661271061026f91906108fc565b61ffff1681525090508260020181908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f015560208201518160010155505050808060010191505061021e565b5050808060010191505061010b565b5050505050505061092c565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6103e2826103b9565b9050919050565b5f6103f3826103d8565b9050919050565b610403816103e9565b811461040d575f80fd5b50565b5f8151905061041e816103fa565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61046e82610428565b810181811067ffffffffffffffff8211171561048d5761048c610438565b5b80604052505050565b5f61049f6103a8565b90506104ab8282610465565b919050565b5f67ffffffffffffffff8211156104ca576104c9610438565b5b602082029050602081019050919050565b5f80fd5b6104e8816103d8565b81146104f2575f80fd5b50565b5f81519050610503816104df565b92915050565b5f61051b610516846104b0565b610496565b9050808382526020820190506020840283018581111561053e5761053d6104db565b5b835b81811015610567578061055388826104f5565b845260208401935050602081019050610540565b5050509392505050565b5f82601f83011261058557610584610424565b5b8151610595848260208601610509565b91505092915050565b5f67ffffffffffffffff8211156105b8576105b7610438565b5b602082029050602081019050919050565b5f819050919050565b6105db816105c9565b81146105e5575f80fd5b50565b5f815190506105f6816105d2565b92915050565b5f61060e6106098461059e565b610496565b90508083825260208201905060208402830185811115610631576106306104db565b5b835b8181101561065a578061064688826105e8565b845260208401935050602081019050610633565b5050509392505050565b5f82601f83011261067857610677610424565b5b81516106888482602086016105fc565b91505092915050565b5f61ffff82169050919050565b6106a781610691565b81146106b1575f80fd5b50565b5f815190506106c28161069e565b92915050565b5f805f805f8060c087890312156106e2576106e16103b1565b5b5f6106ef89828a01610410565b965050602087015167ffffffffffffffff8111156107105761070f6103b5565b5b61071c89828a01610571565b955050604087015167ffffffffffffffff81111561073d5761073c6103b5565b5b61074989828a01610664565b945050606061075a89828a016105e8565b935050608061076b89828a016105e8565b92505060a061077c89828a016106b4565b9150509295509295509295565b5f82825260208201905092915050565b7f496e70757420617272617973206c656e677468206d69736d61746368000000005f82015250565b5f6107cd601c83610789565b91506107d882610799565b602082019050919050565b5f6020820190508181035f8301526107fa816107c1565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610865826105c9565b9150610870836105c9565b925082820261087e816105c9565b915082820484148315176108955761089461082e565b5b5092915050565b5f6108a6826105c9565b91506108b1836105c9565b92508282019050808211156108c9576108c861082e565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61090682610691565b915061091183610691565b925082610921576109206108cf565b5b828204905092915050565b612290806109395f395ff3fe608060405234801561000f575f80fd5b506004361061011f575f3560e01c8063a90cc445116100ab578063dae6ee591161006f578063dae6ee59146102af578063daf49863146102cd578063dd49756e146102ff578063f2fde38b1461031b578063fc0c546a146103375761011f565b8063a90cc4451461021d578063b34e7cfc1461023b578063b8e50cab14610257578063c94e13ba14610275578063cf09e0d0146102915761011f565b8063887eb130116100f2578063887eb130146101895780638da5cb5b146101a757806394e5bd01146101c557806396102669146101e15780639c277ebd146101ff5761011f565b80633812ab0e146101235780633ccfd60b1461015757806369dc296b14610161578063715018a61461017f575b5f80fd5b61013d600480360381019061013891906114d3565b610355565b60405161014e9594939291906115cd565b60405180910390f35b61015f61059c565b005b6101696108be565b604051610176919061162c565b60405180910390f35b6101876108c4565b005b6101916108d7565b60405161019e9190611661565b60405180910390f35b6101af6108ea565b6040516101bc9190611689565b60405180910390f35b6101df60048036038101906101da91906116db565b610911565b005b6101e961095f565b6040516101f6919061162c565b60405180910390f35b610207610a96565b604051610214919061162c565b60405180910390f35b610225610ae1565b604051610232919061162c565b60405180910390f35b61025560048036038101906102509190611730565b610aed565b005b61025f610b36565b60405161026c919061162c565b60405180910390f35b61028f600480360381019061028a9190611785565b610b3c565b005b610299610be0565b6040516102a6919061162c565b60405180910390f35b6102b7610be6565b6040516102c4919061162c565b60405180910390f35b6102e760048036038101906102e291906114d3565b610c98565b6040516102f6939291906117b0565b60405180910390f35b61031960048036038101906103149190611730565b610cbe565b005b610335600480360381019061033091906114d3565b610d2e565b005b61033f610db0565b60405161034c9190611840565b60405180910390f35b5f805f6060805f60025f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050805f01549550806001015494505f805b8260020180549050811015610426578260020181815481106103d0576103cf611859565b5b905f5260205f2090600202015f01544210610419578260020181815481106103fb576103fa611859565b5b905f5260205f209060020201600101548261041691906118b3565b91505b80806001019150506103ab565b5061271081835f015461043991906118e6565b6104439190611954565b9450816002018054905067ffffffffffffffff81111561046657610465611984565b5b6040519080825280602002602001820160405280156104945781602001602082028036833780820191505090505b509350816002018054905067ffffffffffffffff8111156104b8576104b7611984565b5b6040519080825280602002602001820160405280156104e65781602001602082028036833780820191505090505b5092505f5b8260020180549050811015610590578260020181815481106105105761050f611859565b5b905f5260205f2090600202015f015485828151811061053257610531611859565b5b60200260200101818152505082600201818154811061055457610553611859565b5b905f5260205f2090600202016001015484828151811061057757610576611859565b5b60200260200101818152505080806001019150506104eb565b50505091939590929450565b6105a4610dd5565b5f60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f806105ee610e24565b90505f5b83600201805490508110156106975783600201818154811061061757610616611859565b5b905f5260205f2090600202015f0154421061068a5783600201818154811061064257610641611859565b5b905f5260205f209060020201600101548361065d91906118b3565b92505f84600201828154811061067657610675611859565b5b905f5260205f209060020201600101819055505b80806001019150506105f2565b505f8360030154426106a991906119b1565b90505f600454826106ba9190611954565b905060055f9054906101000a900461ffff1661ffff168111156106ee5760055f9054906101000a900461ffff1661ffff1690505b5f60055f9054906101000a900461ffff1661ffff166127108361071191906118e6565b61071b9190611954565b905084811115610729578094505b5f851161076b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076290611a3e565b60405180910390fd5b5f61271086885f015461077e91906118e6565b6107889190611954565b9050865f015481886001015461079e91906118b3565b11156107df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d690611acc565b60405180910390fd5b80876001015f8282546107f291906118b3565b925050819055505f8560ff16600a61080a9190611c19565b8261081591906118e6565b9050610863338260035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610f8c9092919063ffffffff16565b4260095f61086f611012565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555050505050505050506108bc611019565b565b60065481565b6108cc611022565b6108d55f6110a0565b565b60055f9054906101000a900461ffff1681565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610919611022565b8063ffffffff166004819055507ebb2d43540fbf80260c95c24dca39e8123606ffe09d34f5a5b8efac9ab3cd8c816040516109549190611c72565b60405180910390a150565b5f805f90505f5b600780549050811015610a8e5760025f6007838154811061098a57610989611859565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015460025f60078481548110610a0657610a05611859565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0154610a7491906119b1565b82610a7f91906118b3565b91508080600101915050610966565b508091505090565b5f60095f610aa2611012565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905090565b5f600780549050905090565b610af5611022565b806006819055507fcfdfc6a69d9399c7f033441db0202735f187da1a588b884d28722c6d91cb957881604051610b2b919061162c565b60405180910390a150565b60045481565b610b44611022565b5f8161ffff1611610b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8190611cd5565b60405180910390fd5b8060055f6101000a81548161ffff021916908361ffff1602179055507fa28e64c9c6b6dc7399f68ea6a63dd55aca3fcc29077ffcf8b493ee800620d39881604051610bd59190611661565b60405180910390a150565b600a5481565b5f805f90505f5b600780549050811015610c905760025f60078381548110610c1157610c10611859565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015482610c8191906118b3565b91508080600101915050610bed565b508091505090565b6002602052805f5260405f205f91509050805f0154908060010154908060030154905083565b610cc6610dd5565b610cce611022565b610d23610cd9611012565b308360035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611161909392919063ffffffff16565b610d2b611019565b50565b610d36611022565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b90611d63565b60405180910390fd5b610dad816110a0565b50565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260015403610e1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1190611dcb565b60405180910390fd5b6002600181905550565b5f805f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527f313ce567000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610eef9190611e3b565b5f60405180830381855afa9150503d805f8114610f27576040519150601f19603f3d011682016040523d82523d5f602084013e610f2c565b606091505b509150915081610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890611ec1565b60405180910390fd5b80806020019051810190610f859190611f15565b9250505090565b61100d8363a9059cbb60e01b8484604051602401610fab929190611f40565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506111ea565b505050565b5f33905090565b60018081905550565b61102a611012565b73ffffffffffffffffffffffffffffffffffffffff166110486108ea565b73ffffffffffffffffffffffffffffffffffffffff161461109e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109590611fb1565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6111e4846323b872dd60e01b85858560405160240161118293929190611fcf565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506111ea565b50505050565b5f61124b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166112b09092919063ffffffff16565b90505f8151148061126c57508080602001905181019061126b9190612039565b5b6112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a2906120d4565b60405180910390fd5b505050565b60606112be84845f856112c7565b90509392505050565b60608247101561130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130390612162565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516113349190611e3b565b5f6040518083038185875af1925050503d805f811461136e576040519150601f19603f3d011682016040523d82523d5f602084013e611373565b606091505b509150915061138487838387611390565b92505050949350505050565b606083156113f1575f8351036113e9576113a985611404565b6113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df906121ca565b60405180910390fd5b5b8290506113fc565b6113fb8383611426565b5b949350505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f825111156114385781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146c919061223a565b60405180910390fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6114a282611479565b9050919050565b6114b281611498565b81146114bc575f80fd5b50565b5f813590506114cd816114a9565b92915050565b5f602082840312156114e8576114e7611475565b5b5f6114f5848285016114bf565b91505092915050565b5f819050919050565b611510816114fe565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611548816114fe565b82525050565b5f611559838361153f565b60208301905092915050565b5f602082019050919050565b5f61157b82611516565b6115858185611520565b935061159083611530565b805f5b838110156115c05781516115a7888261154e565b97506115b283611565565b925050600181019050611593565b5085935050505092915050565b5f60a0820190506115e05f830188611507565b6115ed6020830187611507565b6115fa6040830186611507565b818103606083015261160c8185611571565b905081810360808301526116208184611571565b90509695505050505050565b5f60208201905061163f5f830184611507565b92915050565b5f61ffff82169050919050565b61165b81611645565b82525050565b5f6020820190506116745f830184611652565b92915050565b61168381611498565b82525050565b5f60208201905061169c5f83018461167a565b92915050565b5f63ffffffff82169050919050565b6116ba816116a2565b81146116c4575f80fd5b50565b5f813590506116d5816116b1565b92915050565b5f602082840312156116f0576116ef611475565b5b5f6116fd848285016116c7565b91505092915050565b61170f816114fe565b8114611719575f80fd5b50565b5f8135905061172a81611706565b92915050565b5f6020828403121561174557611744611475565b5b5f6117528482850161171c565b91505092915050565b61176481611645565b811461176e575f80fd5b50565b5f8135905061177f8161175b565b92915050565b5f6020828403121561179a57611799611475565b5b5f6117a784828501611771565b91505092915050565b5f6060820190506117c35f830186611507565b6117d06020830185611507565b6117dd6040830184611507565b949350505050565b5f819050919050565b5f6118086118036117fe84611479565b6117e5565b611479565b9050919050565b5f611819826117ee565b9050919050565b5f61182a8261180f565b9050919050565b61183a81611820565b82525050565b5f6020820190506118535f830184611831565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6118bd826114fe565b91506118c8836114fe565b92508282019050808211156118e0576118df611886565b5b92915050565b5f6118f0826114fe565b91506118fb836114fe565b9250828202611909816114fe565b915082820484148315176119205761191f611886565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61195e826114fe565b9150611969836114fe565b92508261197957611978611927565b5b828204905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f6119bb826114fe565b91506119c6836114fe565b92508282039050818111156119de576119dd611886565b5b92915050565b5f82825260208201905092915050565b7f4e6f20746f6b656e7320746f20776974686472617700000000000000000000005f82015250565b5f611a286015836119e4565b9150611a33826119f4565b602082019050919050565b5f6020820190508181035f830152611a5581611a1c565b9050919050565b7f43616e6e6f74207769746864726177206d6f7265207468616e20746f74616c205f8201527f616d6f756e740000000000000000000000000000000000000000000000000000602082015250565b5f611ab66026836119e4565b9150611ac182611a5c565b604082019050919050565b5f6020820190508181035f830152611ae381611aaa565b9050919050565b5f8160011c9050919050565b5f808291508390505b6001851115611b3f57808604811115611b1b57611b1a611886565b5b6001851615611b2a5780820291505b8081029050611b3885611aea565b9450611aff565b94509492505050565b5f82611b575760019050611c12565b81611b64575f9050611c12565b8160018114611b7a5760028114611b8457611bb3565b6001915050611c12565b60ff841115611b9657611b95611886565b5b8360020a915084821115611bad57611bac611886565b5b50611c12565b5060208310610133831016604e8410600b8410161715611be85782820a905083811115611be357611be2611886565b5b611c12565b611bf58484846001611af6565b92509050818404811115611c0c57611c0b611886565b5b81810290505b9392505050565b5f611c23826114fe565b9150611c2e836114fe565b9250611c5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484611b48565b905092915050565b611c6c816116a2565b82525050565b5f602082019050611c855f830184611c63565b92915050565b7f436f756e74206d7573742062652067726561746572207468616e2030000000005f82015250565b5f611cbf601c836119e4565b9150611cca82611c8b565b602082019050919050565b5f6020820190508181035f830152611cec81611cb3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f611d4d6026836119e4565b9150611d5882611cf3565b604082019050919050565b5f6020820190508181035f830152611d7a81611d41565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f611db5601f836119e4565b9150611dc082611d81565b602082019050919050565b5f6020820190508181035f830152611de281611da9565b9050919050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f611e1582611de9565b611e1f8185611df3565b9350611e2f818560208601611dfd565b80840191505092915050565b5f611e468284611e0b565b915081905092915050565b7f4661696c656420746f2063616c6c20646563696d616c732066756e6374696f6e5f8201527f206f6e20746f6b656e20636f6e74726163740000000000000000000000000000602082015250565b5f611eab6032836119e4565b9150611eb682611e51565b604082019050919050565b5f6020820190508181035f830152611ed881611e9f565b9050919050565b5f60ff82169050919050565b611ef481611edf565b8114611efe575f80fd5b50565b5f81519050611f0f81611eeb565b92915050565b5f60208284031215611f2a57611f29611475565b5b5f611f3784828501611f01565b91505092915050565b5f604082019050611f535f83018561167a565b611f606020830184611507565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f611f9b6020836119e4565b9150611fa682611f67565b602082019050919050565b5f6020820190508181035f830152611fc881611f8f565b9050919050565b5f606082019050611fe25f83018661167a565b611fef602083018561167a565b611ffc6040830184611507565b949350505050565b5f8115159050919050565b61201881612004565b8114612022575f80fd5b50565b5f815190506120338161200f565b92915050565b5f6020828403121561204e5761204d611475565b5b5f61205b84828501612025565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f6120be602a836119e4565b91506120c982612064565b604082019050919050565b5f6020820190508181035f8301526120eb816120b2565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f61214c6026836119e4565b9150612157826120f2565b604082019050919050565b5f6020820190508181035f83015261217981612140565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f6121b4601d836119e4565b91506121bf82612180565b602082019050919050565b5f6020820190508181035f8301526121e1816121a8565b9050919050565b5f81519050919050565b5f601f19601f8301169050919050565b5f61220c826121e8565b61221681856119e4565b9350612226818560208601611dfd565b61222f816121f2565b840191505092915050565b5f6020820190508181035f8301526122528184612202565b90509291505056fea26469706673582212206be3a8c4c37b68721050e17bae0385b78b1ad09029014608486d96e5682458c164736f6c634300081a0033000000000000000000000000fa955ec865f51c55e3b6ce02528a6844c2eb9c2600000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000278d0000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ada2ad1075bc35bc4715216daad2428c3429191c00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000989680
Deployed Bytecode
0x608060405234801561000f575f80fd5b506004361061011f575f3560e01c8063a90cc445116100ab578063dae6ee591161006f578063dae6ee59146102af578063daf49863146102cd578063dd49756e146102ff578063f2fde38b1461031b578063fc0c546a146103375761011f565b8063a90cc4451461021d578063b34e7cfc1461023b578063b8e50cab14610257578063c94e13ba14610275578063cf09e0d0146102915761011f565b8063887eb130116100f2578063887eb130146101895780638da5cb5b146101a757806394e5bd01146101c557806396102669146101e15780639c277ebd146101ff5761011f565b80633812ab0e146101235780633ccfd60b1461015757806369dc296b14610161578063715018a61461017f575b5f80fd5b61013d600480360381019061013891906114d3565b610355565b60405161014e9594939291906115cd565b60405180910390f35b61015f61059c565b005b6101696108be565b604051610176919061162c565b60405180910390f35b6101876108c4565b005b6101916108d7565b60405161019e9190611661565b60405180910390f35b6101af6108ea565b6040516101bc9190611689565b60405180910390f35b6101df60048036038101906101da91906116db565b610911565b005b6101e961095f565b6040516101f6919061162c565b60405180910390f35b610207610a96565b604051610214919061162c565b60405180910390f35b610225610ae1565b604051610232919061162c565b60405180910390f35b61025560048036038101906102509190611730565b610aed565b005b61025f610b36565b60405161026c919061162c565b60405180910390f35b61028f600480360381019061028a9190611785565b610b3c565b005b610299610be0565b6040516102a6919061162c565b60405180910390f35b6102b7610be6565b6040516102c4919061162c565b60405180910390f35b6102e760048036038101906102e291906114d3565b610c98565b6040516102f6939291906117b0565b60405180910390f35b61031960048036038101906103149190611730565b610cbe565b005b610335600480360381019061033091906114d3565b610d2e565b005b61033f610db0565b60405161034c9190611840565b60405180910390f35b5f805f6060805f60025f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050805f01549550806001015494505f805b8260020180549050811015610426578260020181815481106103d0576103cf611859565b5b905f5260205f2090600202015f01544210610419578260020181815481106103fb576103fa611859565b5b905f5260205f209060020201600101548261041691906118b3565b91505b80806001019150506103ab565b5061271081835f015461043991906118e6565b6104439190611954565b9450816002018054905067ffffffffffffffff81111561046657610465611984565b5b6040519080825280602002602001820160405280156104945781602001602082028036833780820191505090505b509350816002018054905067ffffffffffffffff8111156104b8576104b7611984565b5b6040519080825280602002602001820160405280156104e65781602001602082028036833780820191505090505b5092505f5b8260020180549050811015610590578260020181815481106105105761050f611859565b5b905f5260205f2090600202015f015485828151811061053257610531611859565b5b60200260200101818152505082600201818154811061055457610553611859565b5b905f5260205f2090600202016001015484828151811061057757610576611859565b5b60200260200101818152505080806001019150506104eb565b50505091939590929450565b6105a4610dd5565b5f60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f806105ee610e24565b90505f5b83600201805490508110156106975783600201818154811061061757610616611859565b5b905f5260205f2090600202015f0154421061068a5783600201818154811061064257610641611859565b5b905f5260205f209060020201600101548361065d91906118b3565b92505f84600201828154811061067657610675611859565b5b905f5260205f209060020201600101819055505b80806001019150506105f2565b505f8360030154426106a991906119b1565b90505f600454826106ba9190611954565b905060055f9054906101000a900461ffff1661ffff168111156106ee5760055f9054906101000a900461ffff1661ffff1690505b5f60055f9054906101000a900461ffff1661ffff166127108361071191906118e6565b61071b9190611954565b905084811115610729578094505b5f851161076b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076290611a3e565b60405180910390fd5b5f61271086885f015461077e91906118e6565b6107889190611954565b9050865f015481886001015461079e91906118b3565b11156107df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d690611acc565b60405180910390fd5b80876001015f8282546107f291906118b3565b925050819055505f8560ff16600a61080a9190611c19565b8261081591906118e6565b9050610863338260035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610f8c9092919063ffffffff16565b4260095f61086f611012565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555050505050505050506108bc611019565b565b60065481565b6108cc611022565b6108d55f6110a0565b565b60055f9054906101000a900461ffff1681565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610919611022565b8063ffffffff166004819055507ebb2d43540fbf80260c95c24dca39e8123606ffe09d34f5a5b8efac9ab3cd8c816040516109549190611c72565b60405180910390a150565b5f805f90505f5b600780549050811015610a8e5760025f6007838154811061098a57610989611859565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015460025f60078481548110610a0657610a05611859565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0154610a7491906119b1565b82610a7f91906118b3565b91508080600101915050610966565b508091505090565b5f60095f610aa2611012565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905090565b5f600780549050905090565b610af5611022565b806006819055507fcfdfc6a69d9399c7f033441db0202735f187da1a588b884d28722c6d91cb957881604051610b2b919061162c565b60405180910390a150565b60045481565b610b44611022565b5f8161ffff1611610b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8190611cd5565b60405180910390fd5b8060055f6101000a81548161ffff021916908361ffff1602179055507fa28e64c9c6b6dc7399f68ea6a63dd55aca3fcc29077ffcf8b493ee800620d39881604051610bd59190611661565b60405180910390a150565b600a5481565b5f805f90505f5b600780549050811015610c905760025f60078381548110610c1157610c10611859565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015482610c8191906118b3565b91508080600101915050610bed565b508091505090565b6002602052805f5260405f205f91509050805f0154908060010154908060030154905083565b610cc6610dd5565b610cce611022565b610d23610cd9611012565b308360035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611161909392919063ffffffff16565b610d2b611019565b50565b610d36611022565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b90611d63565b60405180910390fd5b610dad816110a0565b50565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260015403610e1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1190611dcb565b60405180910390fd5b6002600181905550565b5f805f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527f313ce567000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610eef9190611e3b565b5f60405180830381855afa9150503d805f8114610f27576040519150601f19603f3d011682016040523d82523d5f602084013e610f2c565b606091505b509150915081610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890611ec1565b60405180910390fd5b80806020019051810190610f859190611f15565b9250505090565b61100d8363a9059cbb60e01b8484604051602401610fab929190611f40565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506111ea565b505050565b5f33905090565b60018081905550565b61102a611012565b73ffffffffffffffffffffffffffffffffffffffff166110486108ea565b73ffffffffffffffffffffffffffffffffffffffff161461109e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109590611fb1565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6111e4846323b872dd60e01b85858560405160240161118293929190611fcf565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506111ea565b50505050565b5f61124b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166112b09092919063ffffffff16565b90505f8151148061126c57508080602001905181019061126b9190612039565b5b6112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a2906120d4565b60405180910390fd5b505050565b60606112be84845f856112c7565b90509392505050565b60608247101561130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130390612162565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516113349190611e3b565b5f6040518083038185875af1925050503d805f811461136e576040519150601f19603f3d011682016040523d82523d5f602084013e611373565b606091505b509150915061138487838387611390565b92505050949350505050565b606083156113f1575f8351036113e9576113a985611404565b6113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df906121ca565b60405180910390fd5b5b8290506113fc565b6113fb8383611426565b5b949350505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f825111156114385781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146c919061223a565b60405180910390fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6114a282611479565b9050919050565b6114b281611498565b81146114bc575f80fd5b50565b5f813590506114cd816114a9565b92915050565b5f602082840312156114e8576114e7611475565b5b5f6114f5848285016114bf565b91505092915050565b5f819050919050565b611510816114fe565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611548816114fe565b82525050565b5f611559838361153f565b60208301905092915050565b5f602082019050919050565b5f61157b82611516565b6115858185611520565b935061159083611530565b805f5b838110156115c05781516115a7888261154e565b97506115b283611565565b925050600181019050611593565b5085935050505092915050565b5f60a0820190506115e05f830188611507565b6115ed6020830187611507565b6115fa6040830186611507565b818103606083015261160c8185611571565b905081810360808301526116208184611571565b90509695505050505050565b5f60208201905061163f5f830184611507565b92915050565b5f61ffff82169050919050565b61165b81611645565b82525050565b5f6020820190506116745f830184611652565b92915050565b61168381611498565b82525050565b5f60208201905061169c5f83018461167a565b92915050565b5f63ffffffff82169050919050565b6116ba816116a2565b81146116c4575f80fd5b50565b5f813590506116d5816116b1565b92915050565b5f602082840312156116f0576116ef611475565b5b5f6116fd848285016116c7565b91505092915050565b61170f816114fe565b8114611719575f80fd5b50565b5f8135905061172a81611706565b92915050565b5f6020828403121561174557611744611475565b5b5f6117528482850161171c565b91505092915050565b61176481611645565b811461176e575f80fd5b50565b5f8135905061177f8161175b565b92915050565b5f6020828403121561179a57611799611475565b5b5f6117a784828501611771565b91505092915050565b5f6060820190506117c35f830186611507565b6117d06020830185611507565b6117dd6040830184611507565b949350505050565b5f819050919050565b5f6118086118036117fe84611479565b6117e5565b611479565b9050919050565b5f611819826117ee565b9050919050565b5f61182a8261180f565b9050919050565b61183a81611820565b82525050565b5f6020820190506118535f830184611831565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6118bd826114fe565b91506118c8836114fe565b92508282019050808211156118e0576118df611886565b5b92915050565b5f6118f0826114fe565b91506118fb836114fe565b9250828202611909816114fe565b915082820484148315176119205761191f611886565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61195e826114fe565b9150611969836114fe565b92508261197957611978611927565b5b828204905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f6119bb826114fe565b91506119c6836114fe565b92508282039050818111156119de576119dd611886565b5b92915050565b5f82825260208201905092915050565b7f4e6f20746f6b656e7320746f20776974686472617700000000000000000000005f82015250565b5f611a286015836119e4565b9150611a33826119f4565b602082019050919050565b5f6020820190508181035f830152611a5581611a1c565b9050919050565b7f43616e6e6f74207769746864726177206d6f7265207468616e20746f74616c205f8201527f616d6f756e740000000000000000000000000000000000000000000000000000602082015250565b5f611ab66026836119e4565b9150611ac182611a5c565b604082019050919050565b5f6020820190508181035f830152611ae381611aaa565b9050919050565b5f8160011c9050919050565b5f808291508390505b6001851115611b3f57808604811115611b1b57611b1a611886565b5b6001851615611b2a5780820291505b8081029050611b3885611aea565b9450611aff565b94509492505050565b5f82611b575760019050611c12565b81611b64575f9050611c12565b8160018114611b7a5760028114611b8457611bb3565b6001915050611c12565b60ff841115611b9657611b95611886565b5b8360020a915084821115611bad57611bac611886565b5b50611c12565b5060208310610133831016604e8410600b8410161715611be85782820a905083811115611be357611be2611886565b5b611c12565b611bf58484846001611af6565b92509050818404811115611c0c57611c0b611886565b5b81810290505b9392505050565b5f611c23826114fe565b9150611c2e836114fe565b9250611c5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484611b48565b905092915050565b611c6c816116a2565b82525050565b5f602082019050611c855f830184611c63565b92915050565b7f436f756e74206d7573742062652067726561746572207468616e2030000000005f82015250565b5f611cbf601c836119e4565b9150611cca82611c8b565b602082019050919050565b5f6020820190508181035f830152611cec81611cb3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f611d4d6026836119e4565b9150611d5882611cf3565b604082019050919050565b5f6020820190508181035f830152611d7a81611d41565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f611db5601f836119e4565b9150611dc082611d81565b602082019050919050565b5f6020820190508181035f830152611de281611da9565b9050919050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f611e1582611de9565b611e1f8185611df3565b9350611e2f818560208601611dfd565b80840191505092915050565b5f611e468284611e0b565b915081905092915050565b7f4661696c656420746f2063616c6c20646563696d616c732066756e6374696f6e5f8201527f206f6e20746f6b656e20636f6e74726163740000000000000000000000000000602082015250565b5f611eab6032836119e4565b9150611eb682611e51565b604082019050919050565b5f6020820190508181035f830152611ed881611e9f565b9050919050565b5f60ff82169050919050565b611ef481611edf565b8114611efe575f80fd5b50565b5f81519050611f0f81611eeb565b92915050565b5f60208284031215611f2a57611f29611475565b5b5f611f3784828501611f01565b91505092915050565b5f604082019050611f535f83018561167a565b611f606020830184611507565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f611f9b6020836119e4565b9150611fa682611f67565b602082019050919050565b5f6020820190508181035f830152611fc881611f8f565b9050919050565b5f606082019050611fe25f83018661167a565b611fef602083018561167a565b611ffc6040830184611507565b949350505050565b5f8115159050919050565b61201881612004565b8114612022575f80fd5b50565b5f815190506120338161200f565b92915050565b5f6020828403121561204e5761204d611475565b5b5f61205b84828501612025565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f6120be602a836119e4565b91506120c982612064565b604082019050919050565b5f6020820190508181035f8301526120eb816120b2565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f61214c6026836119e4565b9150612157826120f2565b604082019050919050565b5f6020820190508181035f83015261217981612140565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f6121b4601d836119e4565b91506121bf82612180565b602082019050919050565b5f6020820190508181035f8301526121e1816121a8565b9050919050565b5f81519050919050565b5f601f19601f8301169050919050565b5f61220c826121e8565b61221681856119e4565b9350612226818560208601611dfd565b61222f816121f2565b840191505092915050565b5f6020820190508181035f8301526122528184612202565b90509291505056fea26469706673582212206be3a8c4c37b68721050e17bae0385b78b1ad09029014608486d96e5682458c164736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000fa955ec865f51c55e3b6ce02528a6844c2eb9c2600000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000278d0000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ada2ad1075bc35bc4715216daad2428c3429191c00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000989680
-----Decoded View---------------
Arg [0] : _token (address): 0xFa955eC865f51c55E3B6CE02528A6844c2Eb9c26
Arg [1] : _addresses (address[]): 0xaDa2Ad1075Bc35bc4715216DAAD2428C3429191C
Arg [2] : _amounts (uint256[]): 10000000
Arg [3] : _vestingDelay (uint256): 0
Arg [4] : _vestingInterval (uint256): 2592000
Arg [5] : _vestingCount (uint16): 24
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 000000000000000000000000fa955ec865f51c55e3b6ce02528a6844c2eb9c26
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000278d00
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [7] : 000000000000000000000000ada2ad1075bc35bc4715216daad2428c3429191c
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [9] : 0000000000000000000000000000000000000000000000000000000000989680
Deployed Bytecode Sourcemap
26575:6498:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31019:1033;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;29542:1469;;;:::i;:::-;;27099:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25800:97;;;:::i;:::-;;27066:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25183:81;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29017:158;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32742:328;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32463:114;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32060:109;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29393:141;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27029:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29183:202;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27281:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32177:278;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26949:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;32585:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26046:191;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27003:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31019:1033;31090:19;31111:17;31130:18;31150:28;31180:31;31224:27;31254:8;:21;31263:11;31254:21;;;;;;;;;;;;;;;31224:51;;31300:7;:19;;;31286:33;;31342:7;:17;;;31330:29;;31372:20;31412:9;31407:222;31431:7;:19;;:26;;;;31427:1;:30;31407:222;;;31502:7;:19;;31522:1;31502:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;;31483:15;:52;31479:139;;31572:7;:19;;31592:1;31572:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:30;;;31556:46;;;;;:::i;:::-;;;31479:139;31459:3;;;;;;;31407:222;;;;31691:5;31675:12;31653:7;:19;;;:34;;;;:::i;:::-;31652:44;;;;:::i;:::-;31639:57;;31737:7;:19;;:26;;;;31723:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31709:55;;31806:7;:19;;:26;;;;31792:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31775:58;;31851:9;31846:199;31870:7;:19;;:26;;;;31866:1;:30;31846:199;;;31935:7;:19;;31955:1;31935:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;;31918:11;31930:1;31918:14;;;;;;;;:::i;:::-;;;;;;;:50;;;;;32003:7;:19;;32023:1;32003:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:30;;;31983:14;31998:1;31983:17;;;;;;;;:::i;:::-;;;;;;;:50;;;;;31898:3;;;;;;;31846:199;;;;31213:839;;31019:1033;;;;;;;:::o;29542:1469::-;22586:21;:19;:21::i;:::-;29593:27:::1;29623:8;:20;29632:10;29623:20;;;;;;;;;;;;;;;29593:50;;29656:20;29691:14:::0;29708:13:::1;:11;:13::i;:::-;29691:30;;29741:9;29736:275;29760:7;:19;;:26;;;;29756:1;:30;29736:275;;;29831:7;:19;;29851:1;29831:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;;29812:15;:52;29808:192;;29901:7;:19;;29921:1;29901:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:30;;;29885:46;;;;;:::i;:::-;;;29983:1;29950:7;:19;;29970:1;29950:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:30;;:34;;;;29808:192;29788:3;;;;;;;29736:275;;;;30025:18;30064:7;:17;;;30046:15;:35;;;;:::i;:::-;30025:56;;30092:25;30133:15;;30120:10;:28;;;;:::i;:::-;30092:56;;30185:12;;;;;;;;;;;30165:32;;:17;:32;30161:97;;;30234:12;;;;;;;;;;;30214:32;;;;30161:97;30270:23;30326:12;;;;;;;;;;;30296:42;;30317:5;30297:17;:25;;;;:::i;:::-;30296:42;;;;:::i;:::-;30270:68;;30388:12;30370:15;:30;30366:93;;;30432:15;30417:30;;30366:93;30494:1;30479:12;:16;30471:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;30534:20;30596:5;30580:12;30558:7;:19;;;:34;;;;:::i;:::-;30557:44;;;;:::i;:::-;30534:67;;30670:7;:19;;;30654:12;30634:7;:17;;;:32;;;;:::i;:::-;:55;;30612:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;30787:12;30766:7;:17;;;:33;;;;;;;:::i;:::-;;;;;;;;30812:28;30873:8;30865:17;;30859:2;:23;;;;:::i;:::-;30843:12;:40;;;;:::i;:::-;30812:71;;30894:52;30913:10;30925:20;30894:5;;;;;;;;;;;:18;;;;:52;;;;;:::i;:::-;30988:15;30957:14;:28;30972:12;:10;:12::i;:::-;30957:28;;;;;;;;;;;;;;;:46;;;;29582:1429;;;;;;;;22622:20:::0;:18;:20::i;:::-;29542:1469::o;27099:27::-;;;;:::o;25800:97::-;25081:13;:11;:13::i;:::-;25861:30:::1;25888:1;25861:18;:30::i;:::-;25800:97::o:0;27066:26::-;;;;;;;;;;;;;:::o;25183:81::-;25229:7;25252:6;;;;;;;;;;;25245:13;;25183:81;:::o;29017:158::-;25081:13;:11;:13::i;:::-;29109:9:::1;29091:27;;:15;:27;;;;29134:33;29157:9;29134:33;;;;;;:::i;:::-;;;;;;;;29017:158:::0;:::o;32742:328::-;32798:7;32818:22;32843:1;32818:26;;32860:9;32855:176;32879:14;:21;;;;32875:1;:25;32855:176;;;32982:8;:27;32991:14;33006:1;32991:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32982:27;;;;;;;;;;;;;;;:37;;;32940:8;:27;32949:14;32964:1;32949:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32940:27;;;;;;;;;;;;;;;:39;;;:79;;;;:::i;:::-;32922:97;;;;;:::i;:::-;;;32902:3;;;;;;;32855:176;;;;33048:14;33041:21;;;32742:328;:::o;32463:114::-;32514:7;32541:14;:28;32556:12;:10;:12::i;:::-;32541:28;;;;;;;;;;;;;;;;32534:35;;32463:114;:::o;32060:109::-;32113:7;32140:14;:21;;;;32133:28;;32060:109;:::o;29393:141::-;25081:13;:11;:13::i;:::-;29477:6:::1;29462:12;:21;;;;29499:27;29519:6;29499:27;;;;;;:::i;:::-;;;;;;;;29393:141:::0;:::o;27029:30::-;;;;:::o;29183:202::-;25081:13;:11;:13::i;:::-;29268:1:::1;29259:6;:10;;;29251:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;29328:6;29313:12;;:21;;;;;;;;;;;;;;;;;;29350:27;29370:6;29350:27;;;;;;:::i;:::-;;;;;;;;29183:202:::0;:::o;27281:24::-;;;;:::o;32177:278::-;32231:7;32251:20;32274:1;32251:24;;32291:9;32286:132;32310:14;:21;;;;32306:1;:25;32286:132;;;32369:8;:27;32378:14;32393:1;32378:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32369:27;;;;;;;;;;;;;;;:37;;;32353:53;;;;;:::i;:::-;;;32333:3;;;;;;;32286:132;;;;32435:12;32428:19;;;32177:278;:::o;26949:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32585:149::-;22586:21;:19;:21::i;:::-;25081:13:::1;:11;:13::i;:::-;32667:59:::2;32690:12;:10;:12::i;:::-;32712:4;32719:6;32667:5;;;;;;;;;;;:22;;;;:59;;;;;;:::i;:::-;22622:20:::0;:18;:20::i;:::-;32585:149;:::o;26046:191::-;25081:13;:11;:13::i;:::-;26151:1:::1;26131:22;;:8;:22;;::::0;26123:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;26203:28;26222:8;26203:18;:28::i;:::-;26046:191:::0;:::o;27003:19::-;;;;;;;;;;;;;:::o;22654:271::-;22104:1;22778:7;;:19;22770:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;22104:1;22901:7;:18;;;;22654:271::o;28702:307::-;28747:5;28764:12;28778:17;28807:5;;;;;;;;;;;28799:25;;28835:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28799:82;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28763:118;;;;28898:7;28890:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;28987:4;28976:25;;;;;;;;;;;;:::i;:::-;28969:32;;;;28702:307;:::o;5599:171::-;5678:86;5698:5;5728:23;;;5753:2;5757:5;5705:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5678:19;:86::i;:::-;5599:171;;;:::o;23946:92::-;23999:7;24022:10;24015:17;;23946:92;:::o;22931:195::-;22062:1;23098:7;:22;;;;22931:195::o;25336:126::-;25407:12;:10;:12::i;:::-;25396:23;;:7;:5;:7::i;:::-;:23;;;25388:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25336:126::o;26391:177::-;26461:16;26480:6;;;;;;;;;;;26461:25;;26502:8;26493:6;;:17;;;;;;;;;;;;;;;;;;26553:8;26522:40;;26543:8;26522:40;;;;;;;;;;;;26454:114;26391:177;:::o;6009:199::-;6106:96;6126:5;6156:27;;;6185:4;6191:2;6195:5;6133:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6106:19;:96::i;:::-;6009:199;;;;:::o;9714:627::-;10122:23;10148:69;10176:4;10148:69;;;;;;;;;;;;;;;;;10156:5;10148:27;;;;:69;;;;;:::i;:::-;10122:95;;10253:1;10232:10;:17;:22;:56;;;;10269:10;10258:30;;;;;;;;;;;;:::i;:::-;10232:56;10224:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;9784:557;9714:627;;:::o;15440:209::-;15563:12;15591:52;15613:6;15621:4;15627:1;15630:12;15591:21;:52::i;:::-;15584:59;;15440:209;;;;;:::o;16488:423::-;16640:12;16694:5;16669:21;:30;;16661:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;16750:12;16764:23;16791:6;:11;;16810:5;16817:4;16791:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16749:73;;;;16836:69;16863:6;16871:7;16880:10;16892:12;16836:26;:69::i;:::-;16829:76;;;;16488:423;;;;;;:::o;18939:564::-;19106:12;19131:7;19127:371;;;19174:1;19153:10;:17;:22;19149:260;;19347:18;19358:6;19347:10;:18::i;:::-;19339:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;19149:260;19424:10;19417:17;;;;19127:371;19457:33;19465:10;19477:12;19457:7;:33::i;:::-;18939:564;;;;;;;:::o;12741:308::-;12801:4;13042:1;13020:7;:19;;;:23;13013:30;;12741:308;;;:::o;19997:488::-;20170:1;20150:10;:17;:21;20146:334;;;20356:10;20350:17;20405:15;20392:10;20388:2;20384:19;20377:44;20146:334;20459:12;20452:20;;;;;;;;;;;:::i;:::-;;;;;;;;88:117:1;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:114::-;1450:6;1484:5;1478:12;1468:22;;1383:114;;;:::o;1503:184::-;1602:11;1636:6;1631:3;1624:19;1676:4;1671:3;1667:14;1652:29;;1503:184;;;;:::o;1693:132::-;1760:4;1783:3;1775:11;;1813:4;1808:3;1804:14;1796:22;;1693:132;;;:::o;1831:108::-;1908:24;1926:5;1908:24;:::i;:::-;1903:3;1896:37;1831:108;;:::o;1945:179::-;2014:10;2035:46;2077:3;2069:6;2035:46;:::i;:::-;2113:4;2108:3;2104:14;2090:28;;1945:179;;;;:::o;2130:113::-;2200:4;2232;2227:3;2223:14;2215:22;;2130:113;;;:::o;2279:732::-;2398:3;2427:54;2475:5;2427:54;:::i;:::-;2497:86;2576:6;2571:3;2497:86;:::i;:::-;2490:93;;2607:56;2657:5;2607:56;:::i;:::-;2686:7;2717:1;2702:284;2727:6;2724:1;2721:13;2702:284;;;2803:6;2797:13;2830:63;2889:3;2874:13;2830:63;:::i;:::-;2823:70;;2916:60;2969:6;2916:60;:::i;:::-;2906:70;;2762:224;2749:1;2746;2742:9;2737:14;;2702:284;;;2706:14;3002:3;2995:10;;2403:608;;;2279:732;;;;:::o;3017:966::-;3322:4;3360:3;3349:9;3345:19;3337:27;;3374:71;3442:1;3431:9;3427:17;3418:6;3374:71;:::i;:::-;3455:72;3523:2;3512:9;3508:18;3499:6;3455:72;:::i;:::-;3537;3605:2;3594:9;3590:18;3581:6;3537:72;:::i;:::-;3656:9;3650:4;3646:20;3641:2;3630:9;3626:18;3619:48;3684:108;3787:4;3778:6;3684:108;:::i;:::-;3676:116;;3840:9;3834:4;3830:20;3824:3;3813:9;3809:19;3802:49;3868:108;3971:4;3962:6;3868:108;:::i;:::-;3860:116;;3017:966;;;;;;;;:::o;3989:222::-;4082:4;4120:2;4109:9;4105:18;4097:26;;4133:71;4201:1;4190:9;4186:17;4177:6;4133:71;:::i;:::-;3989:222;;;;:::o;4217:89::-;4253:7;4293:6;4286:5;4282:18;4271:29;;4217:89;;;:::o;4312:115::-;4397:23;4414:5;4397:23;:::i;:::-;4392:3;4385:36;4312:115;;:::o;4433:218::-;4524:4;4562:2;4551:9;4547:18;4539:26;;4575:69;4641:1;4630:9;4626:17;4617:6;4575:69;:::i;:::-;4433:218;;;;:::o;4657:118::-;4744:24;4762:5;4744:24;:::i;:::-;4739:3;4732:37;4657:118;;:::o;4781:222::-;4874:4;4912:2;4901:9;4897:18;4889:26;;4925:71;4993:1;4982:9;4978:17;4969:6;4925:71;:::i;:::-;4781:222;;;;:::o;5009:93::-;5045:7;5085:10;5078:5;5074:22;5063:33;;5009:93;;;:::o;5108:120::-;5180:23;5197:5;5180:23;:::i;:::-;5173:5;5170:34;5160:62;;5218:1;5215;5208:12;5160:62;5108:120;:::o;5234:137::-;5279:5;5317:6;5304:20;5295:29;;5333:32;5359:5;5333:32;:::i;:::-;5234:137;;;;:::o;5377:327::-;5435:6;5484:2;5472:9;5463:7;5459:23;5455:32;5452:119;;;5490:79;;:::i;:::-;5452:119;5610:1;5635:52;5679:7;5670:6;5659:9;5655:22;5635:52;:::i;:::-;5625:62;;5581:116;5377:327;;;;:::o;5710:122::-;5783:24;5801:5;5783:24;:::i;:::-;5776:5;5773:35;5763:63;;5822:1;5819;5812:12;5763:63;5710:122;:::o;5838:139::-;5884:5;5922:6;5909:20;5900:29;;5938:33;5965:5;5938:33;:::i;:::-;5838:139;;;;:::o;5983:329::-;6042:6;6091:2;6079:9;6070:7;6066:23;6062:32;6059:119;;;6097:79;;:::i;:::-;6059:119;6217:1;6242:53;6287:7;6278:6;6267:9;6263:22;6242:53;:::i;:::-;6232:63;;6188:117;5983:329;;;;:::o;6318:120::-;6390:23;6407:5;6390:23;:::i;:::-;6383:5;6380:34;6370:62;;6428:1;6425;6418:12;6370:62;6318:120;:::o;6444:137::-;6489:5;6527:6;6514:20;6505:29;;6543:32;6569:5;6543:32;:::i;:::-;6444:137;;;;:::o;6587:327::-;6645:6;6694:2;6682:9;6673:7;6669:23;6665:32;6662:119;;;6700:79;;:::i;:::-;6662:119;6820:1;6845:52;6889:7;6880:6;6869:9;6865:22;6845:52;:::i;:::-;6835:62;;6791:116;6587:327;;;;:::o;6920:442::-;7069:4;7107:2;7096:9;7092:18;7084:26;;7120:71;7188:1;7177:9;7173:17;7164:6;7120:71;:::i;:::-;7201:72;7269:2;7258:9;7254:18;7245:6;7201:72;:::i;:::-;7283;7351:2;7340:9;7336:18;7327:6;7283:72;:::i;:::-;6920:442;;;;;;:::o;7368:60::-;7396:3;7417:5;7410:12;;7368:60;;;:::o;7434:142::-;7484:9;7517:53;7535:34;7544:24;7562:5;7544:24;:::i;:::-;7535:34;:::i;:::-;7517:53;:::i;:::-;7504:66;;7434:142;;;:::o;7582:126::-;7632:9;7665:37;7696:5;7665:37;:::i;:::-;7652:50;;7582:126;;;:::o;7714:139::-;7777:9;7810:37;7841:5;7810:37;:::i;:::-;7797:50;;7714:139;;;:::o;7859:157::-;7959:50;8003:5;7959:50;:::i;:::-;7954:3;7947:63;7859:157;;:::o;8022:248::-;8128:4;8166:2;8155:9;8151:18;8143:26;;8179:84;8260:1;8249:9;8245:17;8236:6;8179:84;:::i;:::-;8022:248;;;;:::o;8276:180::-;8324:77;8321:1;8314:88;8421:4;8418:1;8411:15;8445:4;8442:1;8435:15;8462:180;8510:77;8507:1;8500:88;8607:4;8604:1;8597:15;8631:4;8628:1;8621:15;8648:191;8688:3;8707:20;8725:1;8707:20;:::i;:::-;8702:25;;8741:20;8759:1;8741:20;:::i;:::-;8736:25;;8784:1;8781;8777:9;8770:16;;8805:3;8802:1;8799:10;8796:36;;;8812:18;;:::i;:::-;8796:36;8648:191;;;;:::o;8845:410::-;8885:7;8908:20;8926:1;8908:20;:::i;:::-;8903:25;;8942:20;8960:1;8942:20;:::i;:::-;8937:25;;8997:1;8994;8990:9;9019:30;9037:11;9019:30;:::i;:::-;9008:41;;9198:1;9189:7;9185:15;9182:1;9179:22;9159:1;9152:9;9132:83;9109:139;;9228:18;;:::i;:::-;9109:139;8893:362;8845:410;;;;:::o;9261:180::-;9309:77;9306:1;9299:88;9406:4;9403:1;9396:15;9430:4;9427:1;9420:15;9447:185;9487:1;9504:20;9522:1;9504:20;:::i;:::-;9499:25;;9538:20;9556:1;9538:20;:::i;:::-;9533:25;;9577:1;9567:35;;9582:18;;:::i;:::-;9567:35;9624:1;9621;9617:9;9612:14;;9447:185;;;;:::o;9638:180::-;9686:77;9683:1;9676:88;9783:4;9780:1;9773:15;9807:4;9804:1;9797:15;9824:194;9864:4;9884:20;9902:1;9884:20;:::i;:::-;9879:25;;9918:20;9936:1;9918:20;:::i;:::-;9913:25;;9962:1;9959;9955:9;9947:17;;9986:1;9980:4;9977:11;9974:37;;;9991:18;;:::i;:::-;9974:37;9824:194;;;;:::o;10024:169::-;10108:11;10142:6;10137:3;10130:19;10182:4;10177:3;10173:14;10158:29;;10024:169;;;;:::o;10199:171::-;10339:23;10335:1;10327:6;10323:14;10316:47;10199:171;:::o;10376:366::-;10518:3;10539:67;10603:2;10598:3;10539:67;:::i;:::-;10532:74;;10615:93;10704:3;10615:93;:::i;:::-;10733:2;10728:3;10724:12;10717:19;;10376:366;;;:::o;10748:419::-;10914:4;10952:2;10941:9;10937:18;10929:26;;11001:9;10995:4;10991:20;10987:1;10976:9;10972:17;10965:47;11029:131;11155:4;11029:131;:::i;:::-;11021:139;;10748:419;;;:::o;11173:225::-;11313:34;11309:1;11301:6;11297:14;11290:58;11382:8;11377:2;11369:6;11365:15;11358:33;11173:225;:::o;11404:366::-;11546:3;11567:67;11631:2;11626:3;11567:67;:::i;:::-;11560:74;;11643:93;11732:3;11643:93;:::i;:::-;11761:2;11756:3;11752:12;11745:19;;11404:366;;;:::o;11776:419::-;11942:4;11980:2;11969:9;11965:18;11957:26;;12029:9;12023:4;12019:20;12015:1;12004:9;12000:17;11993:47;12057:131;12183:4;12057:131;:::i;:::-;12049:139;;11776:419;;;:::o;12201:102::-;12243:8;12290:5;12287:1;12283:13;12262:34;;12201:102;;;:::o;12309:848::-;12370:5;12377:4;12401:6;12392:15;;12425:5;12416:14;;12439:712;12460:1;12450:8;12447:15;12439:712;;;12555:4;12550:3;12546:14;12540:4;12537:24;12534:50;;;12564:18;;:::i;:::-;12534:50;12614:1;12604:8;12600:16;12597:451;;;13029:4;13022:5;13018:16;13009:25;;12597:451;13079:4;13073;13069:15;13061:23;;13109:32;13132:8;13109:32;:::i;:::-;13097:44;;12439:712;;;12309:848;;;;;;;:::o;13163:1073::-;13217:5;13408:8;13398:40;;13429:1;13420:10;;13431:5;;13398:40;13457:4;13447:36;;13474:1;13465:10;;13476:5;;13447:36;13543:4;13591:1;13586:27;;;;13627:1;13622:191;;;;13536:277;;13586:27;13604:1;13595:10;;13606:5;;;13622:191;13667:3;13657:8;13654:17;13651:43;;;13674:18;;:::i;:::-;13651:43;13723:8;13720:1;13716:16;13707:25;;13758:3;13751:5;13748:14;13745:40;;;13765:18;;:::i;:::-;13745:40;13798:5;;;13536:277;;13922:2;13912:8;13909:16;13903:3;13897:4;13894:13;13890:36;13872:2;13862:8;13859:16;13854:2;13848:4;13845:12;13841:35;13825:111;13822:246;;;13978:8;13972:4;13968:19;13959:28;;14013:3;14006:5;14003:14;14000:40;;;14020:18;;:::i;:::-;14000:40;14053:5;;13822:246;14093:42;14131:3;14121:8;14115:4;14112:1;14093:42;:::i;:::-;14078:57;;;;14167:4;14162:3;14158:14;14151:5;14148:25;14145:51;;;14176:18;;:::i;:::-;14145:51;14225:4;14218:5;14214:16;14205:25;;13163:1073;;;;;;:::o;14242:285::-;14302:5;14326:23;14344:4;14326:23;:::i;:::-;14318:31;;14370:27;14388:8;14370:27;:::i;:::-;14358:39;;14416:104;14453:66;14443:8;14437:4;14416:104;:::i;:::-;14407:113;;14242:285;;;;:::o;14533:115::-;14618:23;14635:5;14618:23;:::i;:::-;14613:3;14606:36;14533:115;;:::o;14654:218::-;14745:4;14783:2;14772:9;14768:18;14760:26;;14796:69;14862:1;14851:9;14847:17;14838:6;14796:69;:::i;:::-;14654:218;;;;:::o;14878:178::-;15018:30;15014:1;15006:6;15002:14;14995:54;14878:178;:::o;15062:366::-;15204:3;15225:67;15289:2;15284:3;15225:67;:::i;:::-;15218:74;;15301:93;15390:3;15301:93;:::i;:::-;15419:2;15414:3;15410:12;15403:19;;15062:366;;;:::o;15434:419::-;15600:4;15638:2;15627:9;15623:18;15615:26;;15687:9;15681:4;15677:20;15673:1;15662:9;15658:17;15651:47;15715:131;15841:4;15715:131;:::i;:::-;15707:139;;15434:419;;;:::o;15859:225::-;15999:34;15995:1;15987:6;15983:14;15976:58;16068:8;16063:2;16055:6;16051:15;16044:33;15859:225;:::o;16090:366::-;16232:3;16253:67;16317:2;16312:3;16253:67;:::i;:::-;16246:74;;16329:93;16418:3;16329:93;:::i;:::-;16447:2;16442:3;16438:12;16431:19;;16090:366;;;:::o;16462:419::-;16628:4;16666:2;16655:9;16651:18;16643:26;;16715:9;16709:4;16705:20;16701:1;16690:9;16686:17;16679:47;16743:131;16869:4;16743:131;:::i;:::-;16735:139;;16462:419;;;:::o;16887:181::-;17027:33;17023:1;17015:6;17011:14;17004:57;16887:181;:::o;17074:366::-;17216:3;17237:67;17301:2;17296:3;17237:67;:::i;:::-;17230:74;;17313:93;17402:3;17313:93;:::i;:::-;17431:2;17426:3;17422:12;17415:19;;17074:366;;;:::o;17446:419::-;17612:4;17650:2;17639:9;17635:18;17627:26;;17699:9;17693:4;17689:20;17685:1;17674:9;17670:17;17663:47;17727:131;17853:4;17727:131;:::i;:::-;17719:139;;17446:419;;;:::o;17871:98::-;17922:6;17956:5;17950:12;17940:22;;17871:98;;;:::o;17975:147::-;18076:11;18113:3;18098:18;;17975:147;;;;:::o;18128:139::-;18217:6;18212:3;18207;18201:23;18258:1;18249:6;18244:3;18240:16;18233:27;18128:139;;;:::o;18273:386::-;18377:3;18405:38;18437:5;18405:38;:::i;:::-;18459:88;18540:6;18535:3;18459:88;:::i;:::-;18452:95;;18556:65;18614:6;18609:3;18602:4;18595:5;18591:16;18556:65;:::i;:::-;18646:6;18641:3;18637:16;18630:23;;18381:278;18273:386;;;;:::o;18665:271::-;18795:3;18817:93;18906:3;18897:6;18817:93;:::i;:::-;18810:100;;18927:3;18920:10;;18665:271;;;;:::o;18942:237::-;19082:34;19078:1;19070:6;19066:14;19059:58;19151:20;19146:2;19138:6;19134:15;19127:45;18942:237;:::o;19185:366::-;19327:3;19348:67;19412:2;19407:3;19348:67;:::i;:::-;19341:74;;19424:93;19513:3;19424:93;:::i;:::-;19542:2;19537:3;19533:12;19526:19;;19185:366;;;:::o;19557:419::-;19723:4;19761:2;19750:9;19746:18;19738:26;;19810:9;19804:4;19800:20;19796:1;19785:9;19781:17;19774:47;19838:131;19964:4;19838:131;:::i;:::-;19830:139;;19557:419;;;:::o;19982:86::-;20017:7;20057:4;20050:5;20046:16;20035:27;;19982:86;;;:::o;20074:118::-;20145:22;20161:5;20145:22;:::i;:::-;20138:5;20135:33;20125:61;;20182:1;20179;20172:12;20125:61;20074:118;:::o;20198:139::-;20253:5;20284:6;20278:13;20269:22;;20300:31;20325:5;20300:31;:::i;:::-;20198:139;;;;:::o;20343:347::-;20411:6;20460:2;20448:9;20439:7;20435:23;20431:32;20428:119;;;20466:79;;:::i;:::-;20428:119;20586:1;20611:62;20665:7;20656:6;20645:9;20641:22;20611:62;:::i;:::-;20601:72;;20557:126;20343:347;;;;:::o;20696:332::-;20817:4;20855:2;20844:9;20840:18;20832:26;;20868:71;20936:1;20925:9;20921:17;20912:6;20868:71;:::i;:::-;20949:72;21017:2;21006:9;21002:18;20993:6;20949:72;:::i;:::-;20696:332;;;;;:::o;21034:182::-;21174:34;21170:1;21162:6;21158:14;21151:58;21034:182;:::o;21222:366::-;21364:3;21385:67;21449:2;21444:3;21385:67;:::i;:::-;21378:74;;21461:93;21550:3;21461:93;:::i;:::-;21579:2;21574:3;21570:12;21563:19;;21222:366;;;:::o;21594:419::-;21760:4;21798:2;21787:9;21783:18;21775:26;;21847:9;21841:4;21837:20;21833:1;21822:9;21818:17;21811:47;21875:131;22001:4;21875:131;:::i;:::-;21867:139;;21594:419;;;:::o;22019:442::-;22168:4;22206:2;22195:9;22191:18;22183:26;;22219:71;22287:1;22276:9;22272:17;22263:6;22219:71;:::i;:::-;22300:72;22368:2;22357:9;22353:18;22344:6;22300:72;:::i;:::-;22382;22450:2;22439:9;22435:18;22426:6;22382:72;:::i;:::-;22019:442;;;;;;:::o;22467:90::-;22501:7;22544:5;22537:13;22530:21;22519:32;;22467:90;;;:::o;22563:116::-;22633:21;22648:5;22633:21;:::i;:::-;22626:5;22623:32;22613:60;;22669:1;22666;22659:12;22613:60;22563:116;:::o;22685:137::-;22739:5;22770:6;22764:13;22755:22;;22786:30;22810:5;22786:30;:::i;:::-;22685:137;;;;:::o;22828:345::-;22895:6;22944:2;22932:9;22923:7;22919:23;22915:32;22912:119;;;22950:79;;:::i;:::-;22912:119;23070:1;23095:61;23148:7;23139:6;23128:9;23124:22;23095:61;:::i;:::-;23085:71;;23041:125;22828:345;;;;:::o;23179:229::-;23319:34;23315:1;23307:6;23303:14;23296:58;23388:12;23383:2;23375:6;23371:15;23364:37;23179:229;:::o;23414:366::-;23556:3;23577:67;23641:2;23636:3;23577:67;:::i;:::-;23570:74;;23653:93;23742:3;23653:93;:::i;:::-;23771:2;23766:3;23762:12;23755:19;;23414:366;;;:::o;23786:419::-;23952:4;23990:2;23979:9;23975:18;23967:26;;24039:9;24033:4;24029:20;24025:1;24014:9;24010:17;24003:47;24067:131;24193:4;24067:131;:::i;:::-;24059:139;;23786:419;;;:::o;24211:225::-;24351:34;24347:1;24339:6;24335:14;24328:58;24420:8;24415:2;24407:6;24403:15;24396:33;24211:225;:::o;24442:366::-;24584:3;24605:67;24669:2;24664:3;24605:67;:::i;:::-;24598:74;;24681:93;24770:3;24681:93;:::i;:::-;24799:2;24794:3;24790:12;24783:19;;24442:366;;;:::o;24814:419::-;24980:4;25018:2;25007:9;25003:18;24995:26;;25067:9;25061:4;25057:20;25053:1;25042:9;25038:17;25031:47;25095:131;25221:4;25095:131;:::i;:::-;25087:139;;24814:419;;;:::o;25239:179::-;25379:31;25375:1;25367:6;25363:14;25356:55;25239:179;:::o;25424:366::-;25566:3;25587:67;25651:2;25646:3;25587:67;:::i;:::-;25580:74;;25663:93;25752:3;25663:93;:::i;:::-;25781:2;25776:3;25772:12;25765:19;;25424:366;;;:::o;25796:419::-;25962:4;26000:2;25989:9;25985:18;25977:26;;26049:9;26043:4;26039:20;26035:1;26024:9;26020:17;26013:47;26077:131;26203:4;26077:131;:::i;:::-;26069:139;;25796:419;;;:::o;26221:99::-;26273:6;26307:5;26301:12;26291:22;;26221:99;;;:::o;26326:102::-;26367:6;26418:2;26414:7;26409:2;26402:5;26398:14;26394:28;26384:38;;26326:102;;;:::o;26434:377::-;26522:3;26550:39;26583:5;26550:39;:::i;:::-;26605:71;26669:6;26664:3;26605:71;:::i;:::-;26598:78;;26685:65;26743:6;26738:3;26731:4;26724:5;26720:16;26685:65;:::i;:::-;26775:29;26797:6;26775:29;:::i;:::-;26770:3;26766:39;26759:46;;26526:285;26434:377;;;;:::o;26817:313::-;26930:4;26968:2;26957:9;26953:18;26945:26;;27017:9;27011:4;27007:20;27003:1;26992:9;26988:17;26981:47;27045:78;27118:4;27109:6;27045:78;:::i;:::-;27037:86;;26817:313;;;;:::o
Swarm Source
ipfs://6be3a8c4c37b68721050e17bae0385b78b1ad09029014608486d96e5682458c1
Loading...
Loading
Loading...
Loading
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.