Contract
0x7d9eee2e678f3e6feced061d85cc45f649621996
6
Contract Overview
My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x796a49d54d2f8908925e4089239860bd21f3a86a56e0adc8ab2c3b57d53b807e | Init Vesting Sch... | 2058327 | 422 days 15 hrs ago | 0x55e66f5b3cf90cc707e8945428a7f675224042bb | IN | 0x7d9eee2e678f3e6feced061d85cc45f649621996 | 0 GLMR | 0.181601535 | |
0xc2fa0a9ad128ffcd1ad1e520a589aeec6c49c9885628cafdbf4222222ca9e9cb | Set Token | 2058324 | 422 days 15 hrs ago | 0x55e66f5b3cf90cc707e8945428a7f675224042bb | IN | 0x7d9eee2e678f3e6feced061d85cc45f649621996 | 0 GLMR | 0.004781239 | |
0xf89497cf5c7aa7cc1a5f54945bce7150f907a0b49885b54410ebe899e16c9ba0 | 0x60806040 | 2058281 | 422 days 15 hrs ago | 0x55e66f5b3cf90cc707e8945428a7f675224042bb | IN | Create: LasmVesting | 0 GLMR | 0.21218525 |
[ Download CSV Export ]
Contract Name:
LasmVesting
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at moonbeam.moonscan.io on 2022-10-11 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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 anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) 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); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } 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"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/Lasm_Vesting.sol //SPDX-License-Identifier: MIT pragma solidity >=0.8.0; contract LasmVesting is ReentrancyGuard, Ownable { // Allocation distribution of the total supply. uint256 private constant E18 = 10 ** 18; uint256 private constant LOCKED_ALLOCATION = 160_000_000 * E18; uint256 private constant PUBLIC_SALE_ALLOCATION = 56_000_000 * E18; uint256 private constant PRIVATE_SALE_ALLOCATION = 12_000_000 * E18; uint256 private constant SEED_SALE_ALLOCATION = 12_000_000 * E18; uint256 private constant TEAM_ALLOCATION = 96_000_000 * E18; uint256 private constant PARTNERS_ALLOCATION = 24_000_000 * E18; uint256 private constant MARKETING_ALLOCATION = 40_000_000 * E18; uint256 private constant DEVELOPMENT_ALLOCATION = 80_000_000 * E18; uint256 private constant STAKING_ALLOCATION = 272_000_000 * E18; uint256 private constant AIRDROP_ALLOCATION = 40_000_000 * E18; uint256 private constant NFT_AIRDROP_ALLOCATION = 8_000_000 * E18; // vesting wallets address private constant lockedWallet = address(0x0102aEa1a3D3F100bAd80feF23a2883a0C980833); address private constant managerWallet = address(0x5e81892779c28617B066553d25499B9aD2630a47); address private constant teamWallet = address(0xef08430d3e53198160D0cd33b0f84358291640bD); address private constant partnersWallet = address(0xe5917b2686f9FA32cC88CF360bF03cCa1a223563); address private constant marketingWallet = address(0xB2f33Cb375E21314A991f14c2d93570013E5a0a4); address private constant developmentWallet = address(0x939Ad272c00efE7e4398b21b6Aa52A3a6B7BADbF); address private constant stakingRewardsWallet = address(0x2Ad0ee5E02c7Be7701416925B72808df99D549ED); address private constant airdropWallet = address(0xFA39969e9083e6Ddf1F18464573B9B5c002B6310); address private constant nftAirdropWallet = address(0x18758Ea1A29e43A840DcB7EB3D9468294F7967dA); uint256 private constant VESTING_END_AT = 24 * 30 * 24 * 60 * 60; // 24 months address public vestingToken; // ERC20 token that get vested. event TokenSet(address vestingToken); event Claimed(address indexed beneficiary, uint256 amount); struct Schedule { // Name of the template string templateName; // Tokens that were already claimed uint256 claimedTokens; // Start time of the schedule uint256 startTime; // Total amount of tokens uint256 allocation; // Cliff of the schedule. uint256 cliff; // Last time of Claimed uint256 lastClaimTime; } struct ClaimedEvent { // Index of the schedule list uint8 scheduleIndex; // Tokens that were only unlocked in this event uint256 claimedTokens; // Tokens that were already unlocked uint256 unlockedTokens; // Tokens that are locked yet uint256 lockedTokens; // Time of the current event uint256 eventTime; } Schedule[] public schedules; ClaimedEvent[] public scheduleEvents; mapping (address => uint8[]) public schedulesByOwner; mapping (string => uint8) public schedulesByName; mapping (string => address) public beneficiary; mapping (address => uint8[]) public eventsByScheduleBeneficiary; mapping (string => uint8[]) public eventsByScheduleName; constructor() { } /** * @dev Allow owner to set the token address that get vested. * @param tokenAddress Address of the ERC-20 token. */ function setToken(address tokenAddress) external onlyOwner { require(tokenAddress != address(0), "Vesting: ZERO_ADDRESS_NOT_ALLOWED"); require(vestingToken == address(0), "Vesting: ALREADY_SET"); vestingToken = tokenAddress; emit TokenSet(tokenAddress); } /** * @dev Allow owner to initiate the vesting schedule */ function initVestingSchedule() public onlyOwner { // For Locked allocation _createSchedule(lockedWallet, Schedule({ templateName : "Locked", claimedTokens : uint256(0), startTime : block.timestamp, allocation : LOCKED_ALLOCATION, cliff : 62208000, // 24 Months (24 * 30 * 24 * 60 * 60) lastClaimTime : 0 })); // For Public sale allocation _createSchedule(managerWallet, Schedule({ templateName : "PublicSale", claimedTokens : uint256(0), startTime : block.timestamp, allocation : PUBLIC_SALE_ALLOCATION, cliff : 0, // 0 Month lastClaimTime : 0 })); // For Private sale allocation _createSchedule(managerWallet, Schedule({ templateName : "PrivateSale", claimedTokens : uint256(0), startTime : block.timestamp, allocation : PRIVATE_SALE_ALLOCATION, cliff : 0, // 0 Month lastClaimTime : 0 })); // For Seed sale allocation _createSchedule(managerWallet, Schedule({ templateName : "SeedSale", claimedTokens : uint256(0), startTime : block.timestamp, allocation : SEED_SALE_ALLOCATION, cliff : 0, // 0 Month lastClaimTime : 0 })); // For Team allocation _createSchedule(teamWallet, Schedule({ templateName : "Team", claimedTokens : uint256(0), startTime : block.timestamp, allocation : TEAM_ALLOCATION, cliff : 7776000, // 3 Months ( 3 * 30 * 24 * 60 * 60) lastClaimTime : 0 })); // For Partners & Advisors allocation _createSchedule(partnersWallet, Schedule({ templateName : "Partners", claimedTokens : uint256(0), startTime : block.timestamp, allocation : PARTNERS_ALLOCATION, cliff : 15552000, // 6 Months ( 6 * 30 * 24 * 60 * 60) lastClaimTime : 0 })); // For Marketing allocation _createSchedule(marketingWallet, Schedule({ templateName : "Marketing", claimedTokens : uint256(0), startTime : block.timestamp, allocation : MARKETING_ALLOCATION, cliff : 0, // 0 Month lastClaimTime : 0 })); // For Development allocation _createSchedule(developmentWallet, Schedule({ templateName : "Development", claimedTokens : uint256(0), startTime : block.timestamp, allocation : DEVELOPMENT_ALLOCATION, cliff : 0, // 0 Month lastClaimTime : 0 })); // For P2E & Staking rewards allocation _createSchedule(stakingRewardsWallet, Schedule({ templateName : "Staking", claimedTokens : uint256(0), startTime : block.timestamp, allocation : STAKING_ALLOCATION, cliff : 7776000, // 3 Months ( 3 * 30 * 24 * 60 * 60) lastClaimTime : 0 })); // For Airdrop allocation _createSchedule(airdropWallet, Schedule({ templateName : "Airdrop", claimedTokens : uint256(0), startTime : block.timestamp, allocation : AIRDROP_ALLOCATION, cliff : 0, // 0 Month lastClaimTime : 0 })); // For NFT Airdrop allocation _createSchedule(nftAirdropWallet, Schedule({ templateName : "NFT_Airdrop", claimedTokens : uint256(0), startTime : block.timestamp, allocation : NFT_AIRDROP_ALLOCATION, cliff : 0, // 0 Month lastClaimTime : 0 })); } function _createSchedule(address _beneficiary, Schedule memory _schedule) internal { schedules.push(_schedule); uint8 index = uint8(schedules.length) - 1; schedulesByOwner[_beneficiary].push(index); schedulesByName[_schedule.templateName] = index; beneficiary[_schedule.templateName] = _beneficiary; } function createSchedule(address _beneficiary, string memory _templateName, uint256 _allocation, uint256 _cliff) external onlyOwner { _createSchedule(_beneficiary, Schedule({ templateName : _templateName, claimedTokens : uint256(0), startTime : block.timestamp, allocation : _allocation, cliff : _cliff, lastClaimTime : 0 })); } function updateSchedule(string memory _templateName, uint256 _allocation, uint256 _cliff) external onlyOwner { uint index = schedulesByName[_templateName]; require(index >= 0 && index < schedules.length, "Vesting: NOT_SCHEDULE"); schedules[index].allocation = _allocation; schedules[index].cliff = _cliff; } /** * @dev Check the amount of claimable token of the beneficiary. */ function pendingTokensByScheduleBeneficiary(address _account) public view returns (uint256) { uint8[] memory _indexs = schedulesByOwner[_account]; require(_indexs.length != uint256(0), "Vesting: NOT_AUTORIZE"); uint256 amount = 0; for (uint8 i = 0; i < _indexs.length; i++) { string memory _templateName = schedules[_indexs[i]].templateName; amount += pendingTokensByScheduleName(_templateName); } return amount; } /** * @dev Check the amount of claimable token of the schedule. */ function pendingTokensByScheduleName(string memory _templateName) public view returns (uint256) { uint8 index = schedulesByName[_templateName]; require(index >= 0 && index < schedules.length, "Vesting: NOT_SCHEDULE"); Schedule memory schedule = schedules[index]; if ( schedule.startTime + schedule.cliff >= block.timestamp || schedule.claimedTokens == schedule.allocation) { return 0; } else return schedule.allocation; } /** * @dev Allow the respective addresses claim the vested tokens. */ function claimByScheduleBeneficiary() external nonReentrant { require(vestingToken != address(0), "Vesting: VESTINGTOKEN_NO__SET"); uint8[] memory _indexs = schedulesByOwner[msg.sender]; require(_indexs.length != uint256(0), "Vesting: NOT_AUTORIZE"); uint256 amount = 0; uint8 index; for (uint8 i = 0; i < _indexs.length; i++) { index = _indexs[i]; string memory _templateName = schedules[index].templateName; uint256 claimAmount = pendingTokensByScheduleName(_templateName); if (claimAmount == 0) continue; schedules[index].claimedTokens += claimAmount; schedules[index].lastClaimTime = block.timestamp; amount += claimAmount; registerEvent(msg.sender, index, claimAmount); } require(amount > uint256(0), "Vesting: NO_VESTED_TOKENS"); SafeERC20.safeTransfer(IERC20(vestingToken), msg.sender, amount); emit Claimed(msg.sender, amount); } /** * @dev Allow the respective addresses claim the vested tokens of the schedule. */ function claimByScheduleName(string memory _templateName) external nonReentrant { require(vestingToken != address(0), "Vesting: VESTINGTOKEN_NO__SET"); uint8 index = schedulesByName[_templateName]; require(index >= 0 && index < schedules.length, "Vesting: NOT_SCHEDULE"); require(beneficiary[_templateName] == msg.sender, "Vesting: NOT_AUTORIZE"); uint256 claimAmount = pendingTokensByScheduleName(_templateName); require(claimAmount > uint256(0), "Vesting: NO_VESTED_TOKENS"); schedules[index].claimedTokens += claimAmount; schedules[index].lastClaimTime = block.timestamp; SafeERC20.safeTransfer(IERC20(vestingToken), msg.sender, claimAmount); registerEvent(msg.sender, index, claimAmount); emit Claimed(beneficiary[_templateName], claimAmount); } function registerEvent(address _account, uint8 _scheduleIndex, uint256 _claimedTokens) internal { Schedule memory schedule = schedules[_scheduleIndex]; scheduleEvents.push(ClaimedEvent({ scheduleIndex: _scheduleIndex, claimedTokens: _claimedTokens, unlockedTokens: schedule.claimedTokens, lockedTokens: schedule.allocation - schedule.claimedTokens, eventTime: schedule.lastClaimTime })); eventsByScheduleBeneficiary[_account].push(uint8(scheduleEvents.length) - 1); eventsByScheduleName[schedule.templateName].push(uint8(scheduleEvents.length) - 1); } /** * @dev Allow owner to withdraw the token from the contract. * @param amount Amount of token that get skimmed out of the contract. * @param destination Whom token amount get transferred to. */ function withdraw(uint256 amount, address destination) external onlyOwner { require(vestingToken != address(0), "Vesting: VESTINGTOKEN_NO__SET"); require(block.timestamp > VESTING_END_AT, "Vesting: NOT_ALLOWED"); require(destination != address(0), "Vesting: ZERO_ADDRESS_NOT_ALLOWED"); require(amount <= IERC20(vestingToken).balanceOf(address(this)), "Insufficient balance"); SafeERC20.safeTransfer(IERC20(vestingToken), destination, amount); } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"vestingToken","type":"address"}],"name":"TokenSet","type":"event"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"beneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimByScheduleBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_templateName","type":"string"}],"name":"claimByScheduleName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"string","name":"_templateName","type":"string"},{"internalType":"uint256","name":"_allocation","type":"uint256"},{"internalType":"uint256","name":"_cliff","type":"uint256"}],"name":"createSchedule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"eventsByScheduleBeneficiary","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"eventsByScheduleName","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initVestingSchedule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"pendingTokensByScheduleBeneficiary","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_templateName","type":"string"}],"name":"pendingTokensByScheduleName","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"scheduleEvents","outputs":[{"internalType":"uint8","name":"scheduleIndex","type":"uint8"},{"internalType":"uint256","name":"claimedTokens","type":"uint256"},{"internalType":"uint256","name":"unlockedTokens","type":"uint256"},{"internalType":"uint256","name":"lockedTokens","type":"uint256"},{"internalType":"uint256","name":"eventTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"schedules","outputs":[{"internalType":"string","name":"templateName","type":"string"},{"internalType":"uint256","name":"claimedTokens","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"allocation","type":"uint256"},{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"schedulesByName","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"schedulesByOwner","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_templateName","type":"string"},{"internalType":"uint256","name":"_allocation","type":"uint256"},{"internalType":"uint256","name":"_cliff","type":"uint256"}],"name":"updateSchedule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vestingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"destination","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50600160005561001f33610024565b610076565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6123a2806100856000396000f3fe608060405234801561001057600080fd5b506004361061012b5760003560e01c8063737356bd116100ad578063b9a2cf8a11610071578063b9a2cf8a146102b6578063bdc6d9ab146102c9578063e0f291ea146102ee578063eddb43e314610301578063f2fde38b1461032f57600080fd5b8063737356bd1461024b5780637acc46b31461025e5780637e394be21461027f5780638da5cb5b146102925780639bb4d322146102a357600080fd5b80633578a964116100f45780633578a964146101e15780634fb04ec2146101e95780636c3c530a14610228578063715018a61461023057806371bff0721461023857600080fd5b8062f714ce14610130578063144fa6d71461014557806319d152fa146101585780631c31e83914610188578063322f63fd146101ad575b600080fd5b61014361013e366004611e45565b610342565b005b610143610153366004611e71565b6104b8565b60025461016b906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61019b610196366004611e8c565b61058a565b60405160ff909116815260200161017f565b61016b6101bb366004611f59565b80516020818301810180516007825292820191909301209152546001600160a01b031681565b6101436105cd565b6101fc6101f7366004611f96565b610ac5565b6040805160ff90961686526020860194909452928401919091526060830152608082015260a00161017f565b610143610b0a565b610143610e5e565b61019b610246366004611faf565b610e70565b610143610259366004611ff4565b610e9b565b61027161026c366004611e71565b610ee1565b60405190815260200161017f565b61014361028d366004612052565b611096565b6001546001600160a01b031661016b565b6102716102b1366004611f59565b61113e565b6101436102c4366004611f59565b6112c4565b6102dc6102d7366004611f96565b611519565b60405161017f969594939291906120f8565b61019b6102fc366004611e8c565b6115ed565b61019b61030f366004611f59565b805160208183018101805160068252928201919093012091525460ff1681565b61014361033d366004611e71565b611609565b61034a611682565b6002546001600160a01b031661037b5760405162461bcd60e51b815260040161037290612134565b60405180910390fd5b6303b5380042116103c55760405162461bcd60e51b815260206004820152601460248201527315995cdd1a5b99ce881393d517d0531313d5d15160621b6044820152606401610372565b6001600160a01b0381166103eb5760405162461bcd60e51b81526004016103729061216b565b6002546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610433573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061045791906121ac565b82111561049d5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610372565b6002546104b4906001600160a01b031682846116dc565b5050565b6104c0611682565b6001600160a01b0381166104e65760405162461bcd60e51b81526004016103729061216b565b6002546001600160a01b0316156105365760405162461bcd60e51b815260206004820152601460248201527315995cdd1a5b99ce881053149150511657d4d15560621b6044820152606401610372565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527fa07c91c183e42229e705a9795a1c06d76528b673788b849597364528c96eefb79060200160405180910390a150565b600560205281600052604060002081815481106105a657600080fd5b9060005260206000209060209182820401919006915091509054906101000a900460ff1681565b6105d5611682565b6040805161010081018252600660c0820190815265131bd8dad95960d21b60e0830152815260006020820152429181019190915261065690730102aea1a3d3f100bad80fef23a2883a0c980833906060810161063d670de0b6b3a764000063098968006121db565b81526020016303b5380081526020016000815250611733565b6040805161010081018252600a60c08201908152695075626c696353616c6560b01b60e083015281526000602082015242918101919091526106d890735e81892779c28617b066553d25499b9ad2630a4790606081016106c2670de0b6b3a76400006303567e006121db565b8152602001600081526020016000815250611733565b6040805161010081018252600b60c082019081526a5072697661746553616c6560a81b60e0830152815260006020820152429181019190915261074490735e81892779c28617b066553d25499b9ad2630a4790606081016106c2670de0b6b3a764000062b71b006121db565b6040805161010081018252600860c08201908152675365656453616c6560c01b60e083015281526000602082015242918101919091526107ad90735e81892779c28617b066553d25499b9ad2630a4790606081016106c2670de0b6b3a764000062b71b006121db565b6040805161010081018252600460c08201908152635465616d60e01b60e0830152815260006020820152429181019190915261082b9073ef08430d3e53198160d0cd33b0f84358291640bd9060608101610813670de0b6b3a76400006305b8d8006121db565b81526020016276a70081526020016000815250611733565b6040805161010081018252600860c0820190815267506172746e65727360c01b60e083015281526000602082015242918101919091526108ad9073e5917b2686f9fa32cc88cf360bf03cca1a2235639060608101610895670de0b6b3a764000063016e36006121db565b815260200162ed4e0081526020016000815250611733565b6040805161010081018252600960c08201908152684d61726b6574696e6760b81b60e083015281526000602082015242918101919091526109189073b2f33cb375e21314a991f14c2d93570013e5a0a490606081016106c2670de0b6b3a76400006302625a006121db565b6040805161010081018252600b60c082019081526a11195d995b1bdc1b595b9d60aa1b60e083015281526000602082015242918101919091526109859073939ad272c00efe7e4398b21b6aa52a3a6b7badbf90606081016106c2670de0b6b3a76400006304c4b4006121db565b6040805161010081018252600760c08201908152665374616b696e6760c81b60e083015281526000602082015242918101919091526109ee90732ad0ee5e02c7be7701416925b72808df99d549ed9060608101610813670de0b6b3a764000063103664006121db565b6040805161010081018252600760c0820190815266041697264726f760cc1b60e08301528152600060208201524291810191909152610a579073fa39969e9083e6ddf1f18464573b9b5c002b631090606081016106c2670de0b6b3a76400006302625a006121db565b6040805161010081018252600b60c082019081526a04e46545f41697264726f760ac1b60e08301528152600060208201524291810191909152610ac3907318758ea1a29e43a840dcb7eb3d9468294f7967da90606081016106c2670de0b6b3a7640000627a12006121db565b565b60048181548110610ad557600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015460ff90931694509092909185565b60026000541415610b5d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610372565b60026000819055546001600160a01b0316610b8a5760405162461bcd60e51b815260040161037290612134565b33600090815260056020908152604080832080548251818502810185019093528083529192909190830182828015610bff57602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610bd05790505b50505050509050600081511415610c285760405162461bcd60e51b8152600401610372906121fa565b600080805b83518160ff161015610dba57838160ff1681518110610c4e57610c4e612229565b60200260200101519150600060038360ff1681548110610c7057610c70612229565b90600052602060002090600602016000018054610c8c9061223f565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb89061223f565b8015610d055780601f10610cda57610100808354040283529160200191610d05565b820191906000526020600020905b815481529060010190602001808311610ce857829003601f168201915b505050505090506000610d178261113e565b905080610d25575050610da8565b8060038560ff1681548110610d3c57610d3c612229565b90600052602060002090600602016001016000828254610d5c919061227a565b925050819055504260038560ff1681548110610d7a57610d7a612229565b6000918252602090912060056006909202010155610d98818661227a565b9450610da5338583611892565b50505b80610db281612292565b915050610c2d565b5060008211610e075760405162461bcd60e51b815260206004820152601960248201527856657374696e673a204e4f5f5645535445445f544f4b454e5360381b6044820152606401610372565b600254610e1e906001600160a01b031633846116dc565b60405182815233907fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a906020015b60405180910390a25050600160005550565b610e66611682565b610ac36000611ae9565b815160208184018101805160098252928201918501919091209190528054829081106105a657600080fd5b610ea3611682565b610edb846040518060c00160405280868152602001600081526020014281526020018581526020018481526020016000815250611733565b50505050565b6001600160a01b038116600090815260056020908152604080832080548251818502810185019093528083528493830182828015610f5c57602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610f2d5790505b50505050509050600081511415610f855760405162461bcd60e51b8152600401610372906121fa565b6000805b82518160ff16101561108e5760006003848360ff1681518110610fae57610fae612229565b602002602001015160ff1681548110610fc957610fc9612229565b90600052602060002090600602016000018054610fe59061223f565b80601f01602080910402602001604051908101604052809291908181526020018280546110119061223f565b801561105e5780601f106110335761010080835404028352916020019161105e565b820191906000526020600020905b81548152906001019060200180831161104157829003601f168201915b5050505050905061106e8161113e565b611078908461227a565b925050808061108690612292565b915050610f89565b509392505050565b61109e611682565b60006006846040516110b091906122b2565b9081526040519081900360200190205460ff16905060035481106110e65760405162461bcd60e51b8152600401610372906122ce565b82600382815481106110fa576110fa612229565b906000526020600020906006020160030181905550816003828154811061112357611123612229565b90600052602060002090600602016004018190555050505050565b60008060068360405161115191906122b2565b9081526040519081900360200190205460ff16905060035460ff82161061118a5760405162461bcd60e51b8152600401610372906122ce565b600060038260ff16815481106111a2576111a2612229565b90600052602060002090600602016040518060c00160405290816000820180546111cb9061223f565b80601f01602080910402602001604051908101604052809291908181526020018280546111f79061223f565b80156112445780601f1061121957610100808354040283529160200191611244565b820191906000526020600020905b81548152906001019060200180831161122757829003601f168201915b505050505081526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152505090504281608001518260400151611296919061227a565b1015806112aa575080606001518160200151145b156112b9575060009392505050565b606001519392505050565b600260005414156113175760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610372565b60026000819055546001600160a01b03166113445760405162461bcd60e51b815260040161037290612134565b600060068260405161135691906122b2565b9081526040519081900360200190205460ff16905060035460ff82161061138f5760405162461bcd60e51b8152600401610372906122ce565b336001600160a01b03166007836040516113a991906122b2565b908152604051908190036020019020546001600160a01b0316146113df5760405162461bcd60e51b8152600401610372906121fa565b60006113ea8361113e565b9050600081116114385760405162461bcd60e51b815260206004820152601960248201527856657374696e673a204e4f5f5645535445445f544f4b454e5360381b6044820152606401610372565b8060038360ff168154811061144f5761144f612229565b9060005260206000209060060201600101600082825461146f919061227a565b925050819055504260038360ff168154811061148d5761148d612229565b60009182526020909120600560069092020101556002546114b8906001600160a01b031633836116dc565b6114c3338383611892565b6007836040516114d391906122b2565b90815260405160209181900382018120548382526001600160a01b0316917fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a9101610e4c565b6003818154811061152957600080fd5b906000526020600020906006020160009150905080600001805461154c9061223f565b80601f01602080910402602001604051908101604052809291908181526020018280546115789061223f565b80156115c55780601f1061159a576101008083540402835291602001916115c5565b820191906000526020600020905b8154815290600101906020018083116115a857829003601f168201915b5050505050908060010154908060020154908060030154908060040154908060050154905086565b600860205281600052604060002081815481106105a657600080fd5b611611611682565b6001600160a01b0381166116765760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610372565b61167f81611ae9565b50565b6001546001600160a01b03163314610ac35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610372565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261172e908490611b3b565b505050565b600380546001810182556000919091528151805183926006027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b019161177e91839160200190611d90565b506020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501555050600060016003805490506117c791906122fd565b6001600160a01b0384166000908152600560209081526040808320805460018101825590845292829020918304909101805460ff808616601f9095166101000a948502940219169290921790915583519051919250829160069161182a916122b2565b908152604051908190036020018120805460ff9390931660ff19909316929092179091558251849160079161185e916122b2565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055505050565b600060038360ff16815481106118aa576118aa612229565b90600052602060002090600602016040518060c00160405290816000820180546118d39061223f565b80601f01602080910402602001604051908101604052809291908181526020018280546118ff9061223f565b801561194c5780601f106119215761010080835404028352916020019161194c565b820191906000526020600020905b81548152906001019060200180831161192f57829003601f168201915b5050505050815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050905060046040518060a001604052808560ff16815260200184815260200183602001518152602001836020015184606001516119c39190612320565b815260a084015160209182015282546001808201855560009485528285208451600590930201805460ff191660ff9093169290921782558383015182820155604080850151600284015560608501516003840155608094909401516004928301556001600160a01b038916855260089092529190922090549091611a46916122fd565b81546001810183556000928352602092839020928104909201805460ff928316601f9094166101000a93840292909302199092161790558051604051600991611a8e916122b2565b908152604051908190036020019020600454611aac906001906122fd565b81546001810183556000928352602092839020928104909201805460ff928316601f9094166101000a938402929093021990921617905550505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611b90826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611c0d9092919063ffffffff16565b80519091501561172e5780806020019051810190611bae9190612337565b61172e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610372565b6060611c1c8484600085611c26565b90505b9392505050565b606082471015611c875760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610372565b6001600160a01b0385163b611cde5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610372565b600080866001600160a01b03168587604051611cfa91906122b2565b60006040518083038185875af1925050503d8060008114611d37576040519150601f19603f3d011682016040523d82523d6000602084013e611d3c565b606091505b5091509150611d4c828286611d57565b979650505050505050565b60608315611d66575081611c1f565b825115611d765782518084602001fd5b8160405162461bcd60e51b81526004016103729190612359565b828054611d9c9061223f565b90600052602060002090601f016020900481019282611dbe5760008555611e04565b82601f10611dd757805160ff1916838001178555611e04565b82800160010185558215611e04579182015b82811115611e04578251825591602001919060010190611de9565b50611e10929150611e14565b5090565b5b80821115611e105760008155600101611e15565b80356001600160a01b0381168114611e4057600080fd5b919050565b60008060408385031215611e5857600080fd5b82359150611e6860208401611e29565b90509250929050565b600060208284031215611e8357600080fd5b611c1f82611e29565b60008060408385031215611e9f57600080fd5b611ea883611e29565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611edd57600080fd5b813567ffffffffffffffff80821115611ef857611ef8611eb6565b604051601f8301601f19908116603f01168101908282118183101715611f2057611f20611eb6565b81604052838152866020858801011115611f3957600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215611f6b57600080fd5b813567ffffffffffffffff811115611f8257600080fd5b611f8e84828501611ecc565b949350505050565b600060208284031215611fa857600080fd5b5035919050565b60008060408385031215611fc257600080fd5b823567ffffffffffffffff811115611fd957600080fd5b611fe585828601611ecc565b95602094909401359450505050565b6000806000806080858703121561200a57600080fd5b61201385611e29565b9350602085013567ffffffffffffffff81111561202f57600080fd5b61203b87828801611ecc565b949794965050505060408301359260600135919050565b60008060006060848603121561206757600080fd5b833567ffffffffffffffff81111561207e57600080fd5b61208a86828701611ecc565b9660208601359650604090950135949350505050565b60005b838110156120bb5781810151838201526020016120a3565b83811115610edb5750506000910152565b600081518084526120e48160208601602086016120a0565b601f01601f19169290920160200192915050565b60c08152600061210b60c08301896120cc565b60208301979097525060408101949094526060840192909252608083015260a090910152919050565b6020808252601d908201527f56657374696e673a2056455354494e47544f4b454e5f4e4f5f5f534554000000604082015260600190565b60208082526021908201527f56657374696e673a205a45524f5f414444524553535f4e4f545f414c4c4f57456040820152601160fa1b606082015260800190565b6000602082840312156121be57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156121f5576121f56121c5565b500290565b60208082526015908201527456657374696e673a204e4f545f4155544f52495a4560581b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061225357607f821691505b6020821081141561227457634e487b7160e01b600052602260045260246000fd5b50919050565b6000821982111561228d5761228d6121c5565b500190565b600060ff821660ff8114156122a9576122a96121c5565b60010192915050565b600082516122c48184602087016120a0565b9190910192915050565b60208082526015908201527456657374696e673a204e4f545f5343484544554c4560581b604082015260600190565b600060ff821660ff841680821015612317576123176121c5565b90039392505050565b600082821015612332576123326121c5565b500390565b60006020828403121561234957600080fd5b81518015158114611c1f57600080fd5b602081526000611c1f60208301846120cc56fea264697066735822122003ef060aa3ae2166d52e0fe8474fe7f6f605cf821a780e3f266b68d94bdbc79064736f6c634300080b0033
Deployed ByteCode Sourcemap
24758:14938:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39190:503;;;;;;:::i;:::-;;:::i;:::-;;28492:300;;;;;;:::i;:::-;;:::i;26904:27::-;;;;;-1:-1:-1;;;;;26904:27:0;;;;;;-1:-1:-1;;;;;806:32:1;;;788:51;;776:2;761:18;26904:27:0;;;;;;;;28017:52;;;;;;:::i;:::-;;:::i;:::-;;;1281:4:1;1269:17;;;1251:36;;1239:2;1224:18;28017:52:0;1109:184:1;28131:46:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28131:46:0;;;28876:4776;;;:::i;27972:36::-;;;;;;:::i;:::-;;:::i;:::-;;;;2951:4:1;2939:17;;;2921:36;;2988:2;2973:18;;2966:34;;;;3016:18;;;3009:34;;;;3074:2;3059:18;;3052:34;3117:3;3102:19;;3095:35;2908:3;2893:19;27972:36:0;2666:470:1;36223:1071:0;;;:::i;5535:103::-;;;:::i;28256:55::-;;;;;;:::i;:::-;;:::i;34023:506::-;;;;;;:::i;:::-;;:::i;34996:503::-;;;;;;:::i;:::-;;:::i;:::-;;;4220:25:1;;;4208:2;4193:18;34996:503:0;4074:177:1;34537:364:0;;;;;;:::i;:::-;;:::i;4887:87::-;4960:6;;-1:-1:-1;;;;;4960:6:0;4887:87;;35591:537;;;;;;:::i;:::-;;:::i;37405:867::-;;;;;;:::i;:::-;;:::i;27938:27::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;28186:63::-;;;;;;:::i;:::-;;:::i;28076:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5793:201;;;;;;:::i;:::-;;:::i;39190:503::-;4773:13;:11;:13::i;:::-;39283:12:::1;::::0;-1:-1:-1;;;;;39283:12:0::1;39275:68;;;;-1:-1:-1::0;;;39275:68:0::1;;;;;;;:::i;:::-;;;;;;;;;26859:22;39362:15;:32;39354:65;;;::::0;-1:-1:-1;;;39354:65:0;;6389:2:1;39354:65:0::1;::::0;::::1;6371:21:1::0;6428:2;6408:18;;;6401:30;-1:-1:-1;;;6447:18:1;;;6440:50;6507:18;;39354:65:0::1;6187:344:1::0;39354:65:0::1;-1:-1:-1::0;;;;;39438:25:0;::::1;39430:78;;;;-1:-1:-1::0;;;39430:78:0::1;;;;;;;:::i;:::-;39544:12;::::0;39537:45:::1;::::0;-1:-1:-1;;;39537:45:0;;39576:4:::1;39537:45;::::0;::::1;788:51:1::0;-1:-1:-1;;;;;39544:12:0;;::::1;::::0;39537:30:::1;::::0;761:18:1;;39537:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39527:6;:55;;39519:88;;;::::0;-1:-1:-1;;;39519:88:0;;7329:2:1;39519:88:0::1;::::0;::::1;7311:21:1::0;7368:2;7348:18;;;7341:30;-1:-1:-1;;;7387:18:1;;;7380:50;7447:18;;39519:88:0::1;7127:344:1::0;39519:88:0::1;39650:12;::::0;39620:65:::1;::::0;-1:-1:-1;;;;;39650:12:0::1;39665:11:::0;39678:6;39620:22:::1;:65::i;:::-;39190:503:::0;;:::o;28492:300::-;4773:13;:11;:13::i;:::-;-1:-1:-1;;;;;28570:26:0;::::1;28562:72;;;;-1:-1:-1::0;;;28562:72:0::1;;;;;;;:::i;:::-;28653:12;::::0;-1:-1:-1;;;;;28653:12:0::1;:26:::0;28645:59:::1;;;::::0;-1:-1:-1;;;28645:59:0;;7678:2:1;28645:59:0::1;::::0;::::1;7660:21:1::0;7717:2;7697:18;;;7690:30;-1:-1:-1;;;7736:18:1;;;7729:50;7796:18;;28645:59:0::1;7476:344:1::0;28645:59:0::1;28717:12;:27:::0;;-1:-1:-1;;;;;;28717:27:0::1;-1:-1:-1::0;;;;;28717:27:0;::::1;::::0;;::::1;::::0;;;28762:22:::1;::::0;788:51:1;;;28762:22:0::1;::::0;776:2:1;761:18;28762:22:0::1;;;;;;;28492:300:::0;:::o;28017:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28876:4776::-;4773:13;:11;:13::i;:::-;28999:356:::1;::::0;;;;;;;::::1;;::::0;::::1;::::0;;;-1:-1:-1;;;28999:356:0;;;;;;-1:-1:-1;28999:356:0::1;::::0;::::1;::::0;29143:15:::1;28999:356:::0;;;;;;;28969:387:::1;::::0;25893:42:::1;::::0;28999:356;;;24994:17:::1;24922:8;24994:11;:17;:::i;:::-;28999:356;;;;29253:8;28999:356;;;;29342:1;28999:356;;::::0;28969:15:::1;:387::i;:::-;29439:338;::::0;;;;;;;::::1;;::::0;::::1;::::0;;;-1:-1:-1;;;29439:338:0;;;;;;-1:-1:-1;29439:338:0::1;::::0;::::1;::::0;29587:15:::1;29439:338:::0;;;;;;;29408:370:::1;::::0;26002:42:::1;::::0;29439:338;;;25074:16:::1;24922:8;25074:10;:16;:::i;:::-;29439:338;;;;29702:1;29439:338;;;;29764:1;29439:338;;::::0;29408:15:::1;:370::i;:::-;29862:340;::::0;;;;;;;::::1;;::::0;::::1;::::0;;;-1:-1:-1;;;29862:340:0;;;;;;-1:-1:-1;29862:340:0::1;::::0;::::1;::::0;30011:15:::1;29862:340:::0;;;;;;;29831:372:::1;::::0;26002:42:::1;::::0;29862:340;;;25153:16:::1;24922:8;25153:10;:16;:::i;29831:372::-;30284:334;::::0;;;;;;;::::1;;::::0;::::1;::::0;;;-1:-1:-1;;;30284:334:0;;;;;;-1:-1:-1;30284:334:0::1;::::0;::::1;::::0;30430:15:::1;30284:334:::0;;;;;;;30253:366:::1;::::0;26002:42:::1;::::0;30284:334;;;25232:16:::1;24922:8;25232:10;:16;:::i;30253:366::-;30692:352;::::0;;;;;;;::::1;;::::0;::::1;::::0;;;-1:-1:-1;;;30692:352:0;;;;;;-1:-1:-1;30692:352:0::1;::::0;::::1;::::0;30834:15:::1;30692:352:::0;;;;;;;30664:381:::1;::::0;26111:42:::1;::::0;30692:352;;;25311:16:::1;24922:8;25311:10;:16;:::i;:::-;30692:352;;;;30942:7;30692:352;;;;31031:1;30692:352;;::::0;30664:15:::1;:381::i;:::-;31137:360;::::0;;;;;;;::::1;;::::0;::::1;::::0;;;-1:-1:-1;;;31137:360:0;;;;;;-1:-1:-1;31137:360:0::1;::::0;::::1;::::0;31283:15:::1;31137:360:::0;;;;;;;31105:393:::1;::::0;26220:42:::1;::::0;31137:360;;;25390:16:::1;24922:8;25390:10;:16;:::i;:::-;31137:360;;;;31395:8;31137:360;;;;31484:1;31137:360;;::::0;31105:15:::1;:393::i;:::-;31581:336;::::0;;;;;;;::::1;;::::0;::::1;::::0;;;-1:-1:-1;;;31581:336:0;;;;;;-1:-1:-1;31581:336:0::1;::::0;::::1;::::0;31728:15:::1;31581:336:::0;;;;;;;31548:370:::1;::::0;26329:42:::1;::::0;31581:336;;;25469:16:::1;24922:8;25469:10;:16;:::i;31548:370::-;32005:340;::::0;;;;;;;::::1;;::::0;::::1;::::0;;;-1:-1:-1;;;32005:340:0;;;;;;-1:-1:-1;32005:340:0::1;::::0;::::1;::::0;32154:15:::1;32005:340:::0;;;;;;;31970:376:::1;::::0;26438:42:::1;::::0;32005:340;;;25548:16:::1;24922:8;25548:10;:16;:::i;31970:376::-;32446:358;::::0;;;;;;;::::1;;::::0;::::1;::::0;;;-1:-1:-1;;;32446:358:0;;;;;;-1:-1:-1;32446:358:0::1;::::0;::::1;::::0;32591:15:::1;32446:358:::0;;;;;;;32408:397:::1;::::0;26547:42:::1;::::0;32446:358;;;25626:17:::1;24922:8;25626:11;:17;:::i;32408:397::-;32884:332;::::0;;;;;;;::::1;;::::0;::::1;::::0;;;-1:-1:-1;;;32884:332:0;;;;;;-1:-1:-1;32884:332:0::1;::::0;::::1;::::0;33029:15:::1;32884:332:::0;;;;;;;32853:364:::1;::::0;26656:42:::1;::::0;32884:332;;;25706:16:::1;24922:8;25706:10;:16;:::i;32853:364::-;33303:340;::::0;;;;;;;::::1;;::::0;::::1;::::0;;;-1:-1:-1;;;33303:340:0;;;;;;-1:-1:-1;33303:340:0::1;::::0;::::1;::::0;33452:15:::1;33303:340:::0;;;;;;;33269:375:::1;::::0;26765:42:::1;::::0;33303:340;;;25786:15:::1;24922:8;25786:9;:15;:::i;33269:375::-;28876:4776::o:0;27972:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27972:36:0;;;;;:::o;36223:1071::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;8332:2:1;2402:63:0;;;8314:21:1;8371:2;8351:18;;;8344:30;8410:33;8390:18;;;8383:61;8461:18;;2402:63:0;8130:355:1;2402:63:0;1812:1;2543:7;:18;;;36302:12;-1:-1:-1;;;;;36302:12:0::1;36294:68;;;;-1:-1:-1::0;;;36294:68:0::1;;;;;;;:::i;:::-;36417:10;36375:22;36400:28:::0;;;:16:::1;:28;::::0;;;;;;;36375:53;;;;;;::::1;::::0;;;;;;;;;;;;36400:28;;36375:53;;::::1;36400:28:::0;36375:53;;::::1;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;::::1;;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;;;;;;;;;;;;;36473:1;36447:7;:14;:28;;36439:62;;;;-1:-1:-1::0;;;36439:62:0::1;;;;;;;:::i;:::-;36514:14;::::0;;36565:530:::1;36587:7;:14;36583:1;:18;;;36565:530;;;36631:7;36639:1;36631:10;;;;;;;;;;:::i;:::-;;;;;;;36623:18;;36658:27;36688:9;36698:5;36688:16;;;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;36658:59;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36732:19;36754:42;36782:13;36754:27;:42::i;:::-;36732:64:::0;-1:-1:-1;36817:16:0;36813:47:::1;;36852:8;;;;36813:47;36911:11;36877:9;36887:5;36877:16;;;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;;:45;;;;;;;:::i;:::-;;;;;;;;36970:15;36937:9;36947:5;36937:16;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:30:::1;:16;::::0;;::::1;;:30;:48:::0;37000:21:::1;37010:11:::0;37000:21;::::1;:::i;:::-;;;37038:45;37052:10;37064:5;37071:11;37038:13;:45::i;:::-;36608:487;;36565:530;36603:3:::0;::::1;::::0;::::1;:::i;:::-;;;;36565:530;;;;37132:1;37115:6;:19;37107:57;;;::::0;-1:-1:-1;;;37107:57:0;;9872:2:1;37107:57:0::1;::::0;::::1;9854:21:1::0;9911:2;9891:18;;;9884:30;-1:-1:-1;;;9930:18:1;;;9923:55;9995:18;;37107:57:0::1;9670:349:1::0;37107:57:0::1;37207:12;::::0;37177:64:::1;::::0;-1:-1:-1;;;;;37207:12:0::1;37222:10;37234:6:::0;37177:22:::1;:64::i;:::-;37259:27;::::0;4220:25:1;;;37267:10:0::1;::::0;37259:27:::1;::::0;4208:2:1;4193:18;37259:27:0::1;;;;;;;;-1:-1:-1::0;;1768:1:0;2722:7;:22;-1:-1:-1;36223:1071:0:o;5535:103::-;4773:13;:11;:13::i;:::-;5600:30:::1;5627:1;5600:18;:30::i;28256:55::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34023:506;4773:13;:11;:13::i;:::-;34179:342:::1;34195:12;34209:311;;;;;;;;34257:13;34209:311;;;;34317:1;34209:311;;;;34358:15;34209:311;;;;34412:11;34209:311;;;;34462:6;34209:311;;;;34507:1;34209:311;;::::0;34179:15:::1;:342::i;:::-;34023:506:::0;;;;:::o;34996:503::-;-1:-1:-1;;;;;35124:26:0;;35079:7;35124:26;;;:16;:26;;;;;;;;35099:51;;;;;;;;;;;;;;;;;35079:7;;35099:51;;35124:26;35099:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35195:1;35169:7;:14;:28;;35161:62;;;;-1:-1:-1;;;35161:62:0;;;;;;;:::i;:::-;35236:14;35270:7;35265:201;35287:7;:14;35283:1;:18;;;35265:201;;;35323:27;35353:9;35363:7;35371:1;35363:10;;;;;;;;;;:::i;:::-;;;;;;;35353:21;;;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;35323:64;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35412:42;35440:13;35412:27;:42::i;:::-;35402:52;;;;:::i;:::-;;;35308:158;35303:3;;;;;:::i;:::-;;;;35265:201;;;-1:-1:-1;35485:6:0;34996:503;-1:-1:-1;;;34996:503:0:o;34537:364::-;4773:13;:11;:13::i;:::-;34671:10:::1;34684:15;34700:13;34684:30;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;::::0;-1:-1:-1;34755:9:0::1;:16:::0;34747:24;::::1;34725:72;;;;-1:-1:-1::0;;;34725:72:0::1;;;;;;;:::i;:::-;34840:11;34810:9;34820:5;34810:16;;;;;;;;:::i;:::-;;;;;;;;;;;:27;;:41;;;;34887:6;34862:9;34872:5;34862:16;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;:31;;;;34660:241;34537:364:::0;;;:::o;35591:537::-;35678:7;35698:11;35712:15;35728:13;35712:30;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;35783:9:0;:16;35775:24;;;;35753:72;;;;-1:-1:-1;;;35753:72:0;;;;;;;:::i;:::-;35838:24;35865:9;35875:5;35865:16;;;;;;;;;;:::i;:::-;;;;;;;;;;;35838:43;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35951:15;35933:8;:14;;;35912:8;:18;;;:35;;;;:::i;:::-;:54;;:117;;;;36010:8;:19;;;35984:8;:22;;;:45;35912:117;35894:226;;;-1:-1:-1;36053:1:0;;35591:537;-1:-1:-1;;;35591:537:0:o;35894:226::-;36101:19;;;;35591:537;-1:-1:-1;;;35591:537:0:o;37405:867::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;8332:2:1;2402:63:0;;;8314:21:1;8371:2;8351:18;;;8344:30;8410:33;8390:18;;;8383:61;8461:18;;2402:63:0;8130:355:1;2402:63:0;1812:1;2543:7;:18;;;37504:12;-1:-1:-1;;;;;37504:12:0::1;37496:68;;;;-1:-1:-1::0;;;37496:68:0::1;;;;;;;:::i;:::-;37577:11;37591:15;37607:13;37591:30;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;::::0;-1:-1:-1;37662:9:0::1;:16:::0;37654:24:::1;::::0;::::1;;37632:72;;;;-1:-1:-1::0;;;37632:72:0::1;;;;;;;:::i;:::-;37753:10;-1:-1:-1::0;;;;;37723:40:0::1;:11;37735:13;37723:26;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;-1:-1:-1;;;;;37723:26:0::1;:40;37715:74;;;;-1:-1:-1::0;;;37715:74:0::1;;;;;;;:::i;:::-;37802:19;37824:42;37852:13;37824:27;:42::i;:::-;37802:64;;37909:1;37887:11;:24;37879:62;;;::::0;-1:-1:-1;;;37879:62:0;;9872:2:1;37879:62:0::1;::::0;::::1;9854:21:1::0;9911:2;9891:18;;;9884:30;-1:-1:-1;;;9930:18:1;;;9923:55;9995:18;;37879:62:0::1;9670:349:1::0;37879:62:0::1;37988:11;37954:9;37964:5;37954:16;;;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;;:45;;;;;;;:::i;:::-;;;;;;;;38043:15;38010:9;38020:5;38010:16;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:30:::1;:16;::::0;;::::1;;:30;:48:::0;38101:12:::1;::::0;38071:69:::1;::::0;-1:-1:-1;;;;;38101:12:0::1;38116:10;38128:11:::0;38071:22:::1;:69::i;:::-;38153:45;38167:10;38179:5;38186:11;38153:13;:45::i;:::-;38224:11;38236:13;38224:26;;;;;;:::i;:::-;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;;4220:25:1;;;-1:-1:-1;;;;;38224:26:0::1;::::0;38216:48:::1;::::0;4193:18:1;38216:48:0::1;4074:177:1::0;27938:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28186:63::-;;;;;;;;;;;;;;;;;;;;5793:201;4773:13;:11;:13::i;:::-;-1:-1:-1;;;;;5882:22:0;::::1;5874:73;;;::::0;-1:-1:-1;;;5874:73:0;;10857:2:1;5874:73:0::1;::::0;::::1;10839:21:1::0;10896:2;10876:18;;;10869:30;10935:34;10915:18;;;10908:62;-1:-1:-1;;;10986:18:1;;;10979:36;11032:19;;5874:73:0::1;10655:402:1::0;5874:73:0::1;5958:28;5977:8;5958:18;:28::i;:::-;5793:201:::0;:::o;5052:132::-;4960:6;;-1:-1:-1;;;;;4960:6:0;3518:10;5116:23;5108:68;;;;-1:-1:-1;;;5108:68:0;;11264:2:1;5108:68:0;;;11246:21:1;;;11283:18;;;11276:30;11342:34;11322:18;;;11315:62;11394:18;;5108:68:0;11062:356:1;20863:211:0;21007:58;;;-1:-1:-1;;;;;11615:32:1;;21007:58:0;;;11597:51:1;11664:18;;;;11657:34;;;21007:58:0;;;;;;;;;;11570:18:1;;;;21007:58:0;;;;;;;;-1:-1:-1;;;;;21007:58:0;-1:-1:-1;;;21007:58:0;;;20980:86;;21000:5;;20980:19;:86::i;:::-;20863:211;;;:::o;33660:355::-;33754:9;:25;;;;;;;-1:-1:-1;33754:25:0;;;;;;;;33769:9;;33754:25;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33792:11;33832:1;33812:9;:16;;;;33806:27;;;;:::i;:::-;-1:-1:-1;;;;;33846:30:0;;;;;;:16;:30;;;;;;;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33915:22;;33899:39;;33792:41;;-1:-1:-1;33792:41:0;;33899:15;;:39;;;:::i;:::-;;;;;;;;;;;;;;:47;;;;;;;-1:-1:-1;;33899:47:0;;;;;;;;;;33969:22;;33995:12;;33957:11;;:35;;;:::i;:::-;;;;;;;;;;;;;;:50;;-1:-1:-1;;;;;33957:50:0;;;;-1:-1:-1;;;;;;33957:50:0;;;;;;;;;-1:-1:-1;;;33660:355:0:o;38280:670::-;38387:24;38414:9;38424:14;38414:25;;;;;;;;;;:::i;:::-;;;;;;;;;;;38387:52;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38452:14;38472:287;;;;;;;;38515:14;38472:287;;;;;;38559:14;38472:287;;;;38604:8;:22;;;38472:287;;;;38677:8;:22;;;38655:8;:19;;;:44;;;;:::i;:::-;38472:287;;38725:22;;;;38472:287;;;;;38452:308;;;;;;;;-1:-1:-1;38452:308:0;;;;;;;;;;;;;;;-1:-1:-1;;38452:308:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38452:308:0;;;;;;;;;;-1:-1:-1;;;;;38773:37:0;;;;:27;:37;;;;;;;38822:21;;38773:37;;38816:32;;;:::i;:::-;38773:76;;;;;;;-1:-1:-1;38773:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38881:21;;38860:43;;:20;;:43;;;:::i;:::-;;;;;;;;;;;;;;38915:14;:21;38909:32;;38940:1;;38909:32;:::i;:::-;38860:82;;;;;;;-1:-1:-1;38860:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;38280:670:0:o;6154:191::-;6247:6;;;-1:-1:-1;;;;;6264:17:0;;;-1:-1:-1;;;;;;6264:17:0;;;;;;;6297:40;;6247:6;;;6264:17;6247:6;;6297:40;;6228:16;;6297:40;6217:128;6154:191;:::o;23930:716::-;24354:23;24380:69;24408:4;24380:69;;;;;;;;;;;;;;;;;24388:5;-1:-1:-1;;;;;24380:27:0;;;:69;;;;;:::i;:::-;24464:17;;24354:95;;-1:-1:-1;24464:21:0;24460:179;;24561:10;24550:30;;;;;;;;;;;;:::i;:::-;24542:85;;;;-1:-1:-1;;;24542:85:0;;12516:2:1;24542:85:0;;;12498:21:1;12555:2;12535:18;;;12528:30;12594:34;12574:18;;;12567:62;-1:-1:-1;;;12645:18:1;;;12638:40;12695:19;;24542:85:0;12314:406:1;10330:229:0;10467:12;10499:52;10521:6;10529:4;10535:1;10538:12;10499:21;:52::i;:::-;10492:59;;10330:229;;;;;;:::o;11450:510::-;11620:12;11678:5;11653:21;:30;;11645:81;;;;-1:-1:-1;;;11645:81:0;;12927:2:1;11645:81:0;;;12909:21:1;12966:2;12946:18;;;12939:30;13005:34;12985:18;;;12978:62;-1:-1:-1;;;13056:18:1;;;13049:36;13102:19;;11645:81:0;12725:402:1;11645:81:0;-1:-1:-1;;;;;7880:19:0;;;11737:60;;;;-1:-1:-1;;;11737:60:0;;13334:2:1;11737:60:0;;;13316:21:1;13373:2;13353:18;;;13346:30;13412:31;13392:18;;;13385:59;13461:18;;11737:60:0;13132:353:1;11737:60:0;11811:12;11825:23;11852:6;-1:-1:-1;;;;;11852:11:0;11871:5;11878:4;11852:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11810:73;;;;11901:51;11918:7;11927:10;11939:12;11901:16;:51::i;:::-;11894:58;11450:510;-1:-1:-1;;;;;;;11450:510:0:o;14136:762::-;14286:12;14315:7;14311:580;;;-1:-1:-1;14346:10:0;14339:17;;14311:580;14460:17;;:21;14456:424;;14708:10;14702:17;14769:15;14756:10;14752:2;14748:19;14741:44;14456:424;14851:12;14844:20;;-1:-1:-1;;;14844:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;373:9;360:23;350:33;;402:38;436:2;425:9;421:18;402:38;:::i;:::-;392:48;;192:254;;;;;:::o;451:186::-;510:6;563:2;551:9;542:7;538:23;534:32;531:52;;;579:1;576;569:12;531:52;602:29;621:9;602:29;:::i;850:254::-;918:6;926;979:2;967:9;958:7;954:23;950:32;947:52;;;995:1;992;985:12;947:52;1018:29;1037:9;1018:29;:::i;:::-;1008:39;1094:2;1079:18;;;;1066:32;;-1:-1:-1;;;850:254:1:o;1298:127::-;1359:10;1354:3;1350:20;1347:1;1340:31;1390:4;1387:1;1380:15;1414:4;1411:1;1404:15;1430:719;1473:5;1526:3;1519:4;1511:6;1507:17;1503:27;1493:55;;1544:1;1541;1534:12;1493:55;1580:6;1567:20;1606:18;1643:2;1639;1636:10;1633:36;;;1649:18;;:::i;:::-;1724:2;1718:9;1692:2;1778:13;;-1:-1:-1;;1774:22:1;;;1798:2;1770:31;1766:40;1754:53;;;1822:18;;;1842:22;;;1819:46;1816:72;;;1868:18;;:::i;:::-;1908:10;1904:2;1897:22;1943:2;1935:6;1928:18;1989:3;1982:4;1977:2;1969:6;1965:15;1961:26;1958:35;1955:55;;;2006:1;2003;1996:12;1955:55;2070:2;2063:4;2055:6;2051:17;2044:4;2036:6;2032:17;2019:54;2117:1;2110:4;2105:2;2097:6;2093:15;2089:26;2082:37;2137:6;2128:15;;;;;;1430:719;;;;:::o;2154:322::-;2223:6;2276:2;2264:9;2255:7;2251:23;2247:32;2244:52;;;2292:1;2289;2282:12;2244:52;2332:9;2319:23;2365:18;2357:6;2354:30;2351:50;;;2397:1;2394;2387:12;2351:50;2420;2462:7;2453:6;2442:9;2438:22;2420:50;:::i;:::-;2410:60;2154:322;-1:-1:-1;;;;2154:322:1:o;2481:180::-;2540:6;2593:2;2581:9;2572:7;2568:23;2564:32;2561:52;;;2609:1;2606;2599:12;2561:52;-1:-1:-1;2632:23:1;;2481:180;-1:-1:-1;2481:180:1:o;3141:390::-;3219:6;3227;3280:2;3268:9;3259:7;3255:23;3251:32;3248:52;;;3296:1;3293;3286:12;3248:52;3336:9;3323:23;3369:18;3361:6;3358:30;3355:50;;;3401:1;3398;3391:12;3355:50;3424;3466:7;3457:6;3446:9;3442:22;3424:50;:::i;:::-;3414:60;3521:2;3506:18;;;;3493:32;;-1:-1:-1;;;;3141:390:1:o;3536:533::-;3632:6;3640;3648;3656;3709:3;3697:9;3688:7;3684:23;3680:33;3677:53;;;3726:1;3723;3716:12;3677:53;3749:29;3768:9;3749:29;:::i;:::-;3739:39;;3829:2;3818:9;3814:18;3801:32;3856:18;3848:6;3845:30;3842:50;;;3888:1;3885;3878:12;3842:50;3911;3953:7;3944:6;3933:9;3929:22;3911:50;:::i;:::-;3536:533;;3901:60;;-1:-1:-1;;;;4008:2:1;3993:18;;3980:32;;4059:2;4044:18;4031:32;;3536:533;-1:-1:-1;3536:533:1:o;4256:458::-;4343:6;4351;4359;4412:2;4400:9;4391:7;4387:23;4383:32;4380:52;;;4428:1;4425;4418:12;4380:52;4468:9;4455:23;4501:18;4493:6;4490:30;4487:50;;;4533:1;4530;4523:12;4487:50;4556;4598:7;4589:6;4578:9;4574:22;4556:50;:::i;:::-;4546:60;4653:2;4638:18;;4625:32;;-1:-1:-1;4704:2:1;4689:18;;;4676:32;;4256:458;-1:-1:-1;;;;4256:458:1:o;4719:258::-;4791:1;4801:113;4815:6;4812:1;4809:13;4801:113;;;4891:11;;;4885:18;4872:11;;;4865:39;4837:2;4830:10;4801:113;;;4932:6;4929:1;4926:13;4923:48;;;-1:-1:-1;;4967:1:1;4949:16;;4942:27;4719:258::o;4982:::-;5024:3;5062:5;5056:12;5089:6;5084:3;5077:19;5105:63;5161:6;5154:4;5149:3;5145:14;5138:4;5131:5;5127:16;5105:63;:::i;:::-;5222:2;5201:15;-1:-1:-1;;5197:29:1;5188:39;;;;5229:4;5184:50;;4982:258;-1:-1:-1;;4982:258:1:o;5245:579::-;5534:3;5523:9;5516:22;5497:4;5555:46;5596:3;5585:9;5581:19;5573:6;5555:46;:::i;:::-;5632:2;5617:18;;5610:34;;;;-1:-1:-1;5675:2:1;5660:18;;5653:34;;;;5718:2;5703:18;;5696:34;;;;5761:3;5746:19;;5739:35;5805:3;5790:19;;;5783:35;5547:54;5245:579;-1:-1:-1;5245:579:1:o;5829:353::-;6031:2;6013:21;;;6070:2;6050:18;;;6043:30;6109:31;6104:2;6089:18;;6082:59;6173:2;6158:18;;5829:353::o;6536:397::-;6738:2;6720:21;;;6777:2;6757:18;;;6750:30;6816:34;6811:2;6796:18;;6789:62;-1:-1:-1;;;6882:2:1;6867:18;;6860:31;6923:3;6908:19;;6536:397::o;6938:184::-;7008:6;7061:2;7049:9;7040:7;7036:23;7032:32;7029:52;;;7077:1;7074;7067:12;7029:52;-1:-1:-1;7100:16:1;;6938:184;-1:-1:-1;6938:184:1:o;7825:127::-;7886:10;7881:3;7877:20;7874:1;7867:31;7917:4;7914:1;7907:15;7941:4;7938:1;7931:15;7957:168;7997:7;8063:1;8059;8055:6;8051:14;8048:1;8045:21;8040:1;8033:9;8026:17;8022:45;8019:71;;;8070:18;;:::i;:::-;-1:-1:-1;8110:9:1;;7957:168::o;8490:345::-;8692:2;8674:21;;;8731:2;8711:18;;;8704:30;-1:-1:-1;;;8765:2:1;8750:18;;8743:51;8826:2;8811:18;;8490:345::o;8840:127::-;8901:10;8896:3;8892:20;8889:1;8882:31;8932:4;8929:1;8922:15;8956:4;8953:1;8946:15;8972:380;9051:1;9047:12;;;;9094;;;9115:61;;9169:4;9161:6;9157:17;9147:27;;9115:61;9222:2;9214:6;9211:14;9191:18;9188:38;9185:161;;;9268:10;9263:3;9259:20;9256:1;9249:31;9303:4;9300:1;9293:15;9331:4;9328:1;9321:15;9185:161;;8972:380;;;:::o;9357:128::-;9397:3;9428:1;9424:6;9421:1;9418:13;9415:39;;;9434:18;;:::i;:::-;-1:-1:-1;9470:9:1;;9357:128::o;9490:175::-;9527:3;9571:4;9564:5;9560:16;9600:4;9591:7;9588:17;9585:43;;;9608:18;;:::i;:::-;9657:1;9644:15;;9490:175;-1:-1:-1;;9490:175:1:o;10024:276::-;10155:3;10193:6;10187:13;10209:53;10255:6;10250:3;10243:4;10235:6;10231:17;10209:53;:::i;:::-;10278:16;;;;;10024:276;-1:-1:-1;;10024:276:1:o;10305:345::-;10507:2;10489:21;;;10546:2;10526:18;;;10519:30;-1:-1:-1;;;10580:2:1;10565:18;;10558:51;10641:2;10626:18;;10305:345::o;11702:195::-;11740:4;11777;11774:1;11770:12;11809:4;11806:1;11802:12;11834:3;11829;11826:12;11823:38;;;11841:18;;:::i;:::-;11878:13;;;11702:195;-1:-1:-1;;;11702:195:1:o;11902:125::-;11942:4;11970:1;11967;11964:8;11961:34;;;11975:18;;:::i;:::-;-1:-1:-1;12012:9:1;;11902:125::o;12032:277::-;12099:6;12152:2;12140:9;12131:7;12127:23;12123:32;12120:52;;;12168:1;12165;12158:12;12120:52;12200:9;12194:16;12253:5;12246:13;12239:21;12232:5;12229:32;12219:60;;12275:1;12272;12265:12;13769:220;13918:2;13907:9;13900:21;13881:4;13938:45;13979:2;13968:9;13964:18;13956:6;13938:45;:::i
Swarm Source
ipfs://03ef060aa3ae2166d52e0fe8474fe7f6f605cf821a780e3f266b68d94bdbc790
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.