More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 269 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Tokens | 21456843 | 2 days ago | IN | 0 ETH | 0.00077101 | ||||
Claim Tokens | 21452287 | 3 days ago | IN | 0 ETH | 0.00110437 | ||||
Claim Tokens | 21445896 | 4 days ago | IN | 0 ETH | 0.00242729 | ||||
Claim Tokens | 21444259 | 4 days ago | IN | 0 ETH | 0.00349779 | ||||
Claim Tokens | 21439384 | 5 days ago | IN | 0 ETH | 0.00230043 | ||||
Claim Tokens | 21437860 | 5 days ago | IN | 0 ETH | 0.00249491 | ||||
Claim Tokens | 21424693 | 7 days ago | IN | 0 ETH | 0.0015611 | ||||
Claim Tokens | 21414096 | 8 days ago | IN | 0 ETH | 0.00084007 | ||||
Claim Tokens | 21413371 | 8 days ago | IN | 0 ETH | 0.00103048 | ||||
Claim Tokens | 21403111 | 10 days ago | IN | 0 ETH | 0.00065717 | ||||
Claim Tokens | 21402803 | 10 days ago | IN | 0 ETH | 0.0007262 | ||||
Claim Tokens | 21402170 | 10 days ago | IN | 0 ETH | 0.00082919 | ||||
Claim Tokens | 21395464 | 11 days ago | IN | 0 ETH | 0.00177399 | ||||
Claim Tokens | 21395439 | 11 days ago | IN | 0 ETH | 0.00190774 | ||||
Claim Tokens | 21389250 | 12 days ago | IN | 0 ETH | 0.00158514 | ||||
Claim Tokens | 21389069 | 12 days ago | IN | 0 ETH | 0.00229107 | ||||
Claim Tokens | 21377657 | 13 days ago | IN | 0 ETH | 0.00127051 | ||||
Claim Tokens | 21377583 | 13 days ago | IN | 0 ETH | 0.00134561 | ||||
Claim Tokens | 21377462 | 13 days ago | IN | 0 ETH | 0.00127079 | ||||
Claim Tokens | 21371432 | 14 days ago | IN | 0 ETH | 0.00194952 | ||||
Claim Tokens | 21342551 | 18 days ago | IN | 0 ETH | 0.00197656 | ||||
Claim Tokens | 21334955 | 19 days ago | IN | 0 ETH | 0.00198881 | ||||
Claim Tokens | 21334198 | 19 days ago | IN | 0 ETH | 0.00220517 | ||||
Claim Tokens | 21329347 | 20 days ago | IN | 0 ETH | 0.00239011 | ||||
Claim Tokens | 21328977 | 20 days ago | IN | 0 ETH | 0.00171226 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MoonVesting
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-07-03 */ /// SPDX-License-Identifier: MIT pragma solidity 0.8.26; /** * @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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); } /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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 { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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); } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * 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. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) 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 FailedInnerCall(); } } } /** * @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 An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @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.encodeCall(token.transfer, (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.encodeCall(token.transferFrom, (from, to, 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); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @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); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @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(token).code.length > 0; } } /** * @title MoonVesting * @dev A token vesting contract that handles both linear and cycle-based vesting schedules. */ contract MoonVesting is Ownable { using SafeERC20 for IERC20; IERC20 public token; struct VestingSchedule { uint256 amount; uint256 start; uint256 duration; bool revokable; bool revoked; uint256 cycles; uint256 cycleDuration; uint256 released; } mapping(address => mapping(uint256 => VestingSchedule)) public vestingSchedules; mapping(address => uint256[]) public userVestingIds; bool private _entered; event VestingCreated( address indexed beneficiary, uint256 indexed vestingId, uint256 amount, uint256 start, uint256 cliff, uint256 duration, bool revokable, uint256 cycles, uint256 cycleDuration ); event TokensReleased( address indexed beneficiary, uint256 indexed vestingId, uint256 amount ); event VestingRevoked( address indexed beneficiary, uint256 indexed vestingId ); error ZeroAddress(); error ZeroAmount(); error CliffPeriodIsNotPassedYet(); error NoTokensToClaim(); error AlreadyClaimed(); error ArrayLengthMismatch(); error ZeroDuration(); error MinimumTwoCycles(); error VestingIsNotRevokable(); error AlreadyRevoked(); error NoVestingFound(); error CannotClaimNativeToken(); /** * @dev Constructor function * @param _token Address of the token to be vested */ constructor(IERC20 _token) Ownable(msg.sender) { token = _token; } modifier nonReentrant() { require(!_entered, "Reentrant call"); _entered = true; _; _entered = false; } function claimOtherERC20(address _token, address to, uint256 amount) external onlyOwner{ if(_token == address(token)){ revert CannotClaimNativeToken(); } // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = _token.call( abi.encodeWithSelector(0xa9059cbb, to, amount) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "ERC20: TOKEN_CLAIM_FAILED" ); } /// @dev set linear vesting /// see docs:{_setLinearVesting} /// example - user '0x123' has been alloted with 100 tokens, cliff is 1, duration is 30 /// then user tokens are vested over 30 days linearly. /// user can start claiming unlocked tokens anytime after cliff of 1 day has been passed. function setLinearVesting( address beneficiary, uint256 amount, uint256 cliff, uint256 duration, bool revokable ) external onlyOwner { if (amount > 0) { token.safeTransferFrom(msg.sender, address(this), amount); } _setLinearVesting( beneficiary, amount, cliff, duration, revokable ); } /// @dev set linear vesting for multiple users with custom amounts, duration /// see docs:{_setLinearVesting} function setLinearVestingMulti( address[] calldata users, uint256[] calldata amounts, uint256[] calldata cliff, uint256[] calldata duration, bool revokable ) external onlyOwner { uint256 userLength = users.length; uint256 amountLength = amounts.length; if( userLength != amountLength && userLength != cliff.length && userLength != duration.length){revert ArrayLengthMismatch();} uint256 totalTokens; for (uint256 j = 0; j < amountLength; j++) { totalTokens = totalTokens + amounts[j]; } token.safeTransferFrom(msg.sender, address(this), totalTokens); for (uint256 i = 0; i < userLength; i++) { _setLinearVesting( users[i], amounts[i], cliff[i], duration[i], revokable ); } } /// @dev set cycleBased vesting /// see docs:{_setCycleBasedrVesting} /// example - user '0x123' is assigned with 100 as amount. With cliff 1, cycles 5 and cycle duration 10 /// so per cycle claimable amount will be (100/5 = 20), /// when 1 day passed, user can get 20 tokens, then every 10 days he can claim 20 tokens untill full /// amount is claimed function setCycleBasedVesting( address beneficiary, uint256 amount, uint256 cliff, uint256 cycles, uint256 cycleduration, bool revokable ) external onlyOwner { if (amount > 0) { token.safeTransferFrom(msg.sender, address(this), amount); } _setCycleBasedVesting( beneficiary, amount, cliff, cycles, cycleduration, revokable ); } /// @dev set cycleBased vesting for multiple users with custom amounts, cycles /// see docs:{_setCycleBasedrVesting} function setCycleBasedVestingMultiWithCustomParams( address[] calldata users, uint256[] calldata amounts, uint256[] calldata cliff, uint256[] calldata cycles, uint256[] calldata cycleduration, bool revokable ) external onlyOwner { uint256 userLength = users.length; uint256 amountLength = amounts.length; if( userLength != amountLength && userLength != cliff.length && userLength != cycles.length){revert ArrayLengthMismatch();} uint256 totalTokens; for (uint256 j = 0; j < amountLength; ++j) { totalTokens = totalTokens + amounts[j]; } token.safeTransferFrom(msg.sender, address(this), totalTokens); for (uint256 i = 0; i < userLength; ++i) { _setCycleBasedVesting( users[i], amounts[i], cliff[i], cycles[i], cycleduration[i], revokable ); } } /** * @notice Sets a linear vesting schedule for a beneficiary * @param beneficiary Address of the beneficiary * @param amount Total amount of tokens to be vested * @param cliff Duration in days before vesting starts * @param duration Total duration in days for vesting * @param revokable Boolean indicating whether the vesting is revokable by the owner */ function _setLinearVesting( address beneficiary, uint256 amount, uint256 cliff, uint256 duration, bool revokable ) internal { if( beneficiary == address(0)){revert ZeroAddress();} if(amount == 0){revert ZeroAmount();} if(duration == 0){revert ZeroDuration();} cliff = cliff * 1 days; duration = duration * 1 days; uint256 start = block.timestamp + cliff; uint256 vestingId = userVestingIds[beneficiary].length; vestingSchedules[beneficiary][vestingId] = VestingSchedule({ amount: amount, start: start, duration: duration, revokable: revokable, revoked: false, cycles: 0, cycleDuration: 0, released: 0 }); userVestingIds[beneficiary].push(vestingId); emit VestingCreated( beneficiary, vestingId, amount, start, cliff, duration, revokable, 0, 0 ); } /** * @notice Sets a cycle-based vesting schedule for a beneficiary * @param beneficiary Address of the beneficiary * @param amount Total amount of tokens to be vested * @param cliff Duration in days before vesting starts * @param cycles Number of cycles for the vesting * @param cycleduration Duration in days of each cycle * @param revokable Boolean indicating whether the vesting is revokable by the owner */ function _setCycleBasedVesting( address beneficiary, uint256 amount, uint256 cliff, uint256 cycles, uint256 cycleduration, bool revokable ) internal { if( beneficiary == address(0)){revert ZeroAddress();} if(amount == 0){revert ZeroAmount();} if(cycleduration == 0){revert ZeroDuration();} if(cycles == 0){revert MinimumTwoCycles();} cliff = cliff * 1 days; cycleduration = cycleduration * 1 days; uint256 start = block.timestamp + cliff; uint256 duration = cycles * cycleduration; uint256 vestingId = userVestingIds[beneficiary].length; vestingSchedules[beneficiary][vestingId] = VestingSchedule({ amount: amount, start: start, duration: duration, revokable: revokable, revoked: false, cycles: cycles, cycleDuration: cycleduration, released: 0 }); userVestingIds[beneficiary].push(vestingId); emit VestingCreated( beneficiary, vestingId, amount, start, cliff, duration, revokable, cycles, cycleduration ); } /** * @notice Returns the IDs of all vesting schedules for a user * @param beneficiary Address of the beneficiary * @return Array of vesting schedule IDs */ function getUserVestingIds(address beneficiary) external view returns (uint256[] memory) { return userVestingIds[beneficiary]; } /** * @notice Allows a beneficiary to claim tokens from a specific vesting schedule * @param vestingId ID of the vesting schedule */ function claimTokens(uint256 vestingId) external nonReentrant{ _release(msg.sender, vestingId); } /** * @notice Allows a beneficiary to claim tokens from multiple vesting schedules * @param vestingIds Array of vesting schedule IDs */ function claimMultipleTokens(uint256[] memory vestingIds) external nonReentrant{ for (uint256 i = 0; i < vestingIds.length; i++) { _release(msg.sender, vestingIds[i]); } } /** * @notice Revokes a vesting schedule * @param beneficiary Address of the beneficiary * @param vestingId ID of the vesting schedule * send unlocked tokens to beneficiary and rest to the owner * userful if setting vesting for employees */ function revoke(address beneficiary, uint256 vestingId) external onlyOwner { VestingSchedule storage schedule = vestingSchedules[beneficiary][ vestingId ]; if(!schedule.revokable){revert VestingIsNotRevokable();} if(schedule.revoked){revert AlreadyRevoked();} uint256 vestedAmount = _tokensVested(beneficiary, vestingId); uint256 unreleased = vestedAmount - schedule.released; uint256 refund = schedule.amount - vestedAmount; schedule.revoked = true; if (unreleased > 0) { token.safeTransfer(beneficiary, unreleased); } token.safeTransfer(owner(), refund); emit VestingRevoked(beneficiary, vestingId); } /** * @notice Returns the IDs of all vesting schedules for a user that have tokens available * @param beneficiary Address of the beneficiary * @return Array of vesting schedule IDs with tokens available */ function getUserVestingIdsWithTokens(address beneficiary) external view returns (uint256[] memory) { uint256[] memory allIds = userVestingIds[beneficiary]; uint256[] memory tempIdsWithTokens = new uint256[](allIds.length); uint256 count = 0; for (uint256 i = 0; i < allIds.length; i++) { uint256 vestingId = allIds[i]; if (getIdWithTokens(beneficiary, vestingId) > 0) { tempIdsWithTokens[count] = vestingId; count++; } } // Create the final array with the exact count uint256[] memory idsWithTokens = new uint256[](count); for (uint256 i = 0; i < count; i++) { idsWithTokens[i] = tempIdsWithTokens[i]; } return idsWithTokens; } /** * @dev Internal function to release tokens for a specific vesting schedule * @param beneficiary Address of the beneficiary * @param vestingId ID of the vesting schedule */ function _release(address beneficiary, uint256 vestingId) internal { VestingSchedule storage schedule = vestingSchedules[beneficiary][ vestingId ]; if(schedule.amount == 0){revert NoVestingFound();} if(block.timestamp < schedule.start){revert CliffPeriodIsNotPassedYet();} if(schedule.revoked){revert AlreadyRevoked();} uint256 vestedAmount = _tokensVested(beneficiary, vestingId); uint256 unreleased = vestedAmount - schedule.released; if(unreleased == 0) {revert AlreadyClaimed();} schedule.released += unreleased; token.safeTransfer(beneficiary, unreleased); emit TokensReleased(beneficiary, vestingId, unreleased); } /** * @dev returns if particular vesting has tokens to claim * @param user user address * @param vesting vesting id */ function getIdWithTokens (address user, uint256 vesting) public view returns (uint256){ VestingSchedule storage schedule = vestingSchedules[user][ vesting ]; uint256 amount = schedule.amount - schedule.released; return amount; } /** * @notice returns current claimable tokens for particular user * @param user user address * @param vesting vesting id */ function getUnlockedTokens(address user, uint256 vesting) public view returns (uint256) { VestingSchedule storage schedule = vestingSchedules[user][ vesting ]; if(schedule.start > block.timestamp){return 0;} uint256 totalAmount = _tokensVested(user, vesting); uint256 unlockedTokens = totalAmount - schedule.released; return unlockedTokens; } /** * @dev Internal function to calculate the amount of tokens vested for a specific vesting schedule * @param beneficiary Address of the beneficiary * @param vestingId ID of the vesting schedule * @return Amount of vested tokens */ function _tokensVested(address beneficiary, uint256 vestingId) private view returns (uint256) { VestingSchedule storage schedule = vestingSchedules[beneficiary][ vestingId ]; if (block.timestamp < schedule.start) { return 0; } if (schedule.revoked) { return schedule.released; } uint256 elapsedTime = block.timestamp - schedule.start; uint256 vestedAmount; if (schedule.cycles == 0) { // Linear vesting vestedAmount = (schedule.amount * elapsedTime) / schedule.duration; } else { // Cycle-based vesting uint256 currentCycle = elapsedTime / schedule.cycleDuration; vestedAmount = (schedule.amount * (currentCycle + 1)) / schedule.cycles; } if (vestedAmount > schedule.amount) { vestedAmount = schedule.amount; } return vestedAmount; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"AlreadyClaimed","type":"error"},{"inputs":[],"name":"AlreadyRevoked","type":"error"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"CannotClaimNativeToken","type":"error"},{"inputs":[],"name":"CliffPeriodIsNotPassedYet","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"MinimumTwoCycles","type":"error"},{"inputs":[],"name":"NoTokensToClaim","type":"error"},{"inputs":[],"name":"NoVestingFound","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"VestingIsNotRevokable","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"inputs":[],"name":"ZeroDuration","type":"error"},{"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":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"uint256","name":"vestingId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"uint256","name":"vestingId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cliff","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"bool","name":"revokable","type":"bool"},{"indexed":false,"internalType":"uint256","name":"cycles","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cycleDuration","type":"uint256"}],"name":"VestingCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"uint256","name":"vestingId","type":"uint256"}],"name":"VestingRevoked","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"vestingIds","type":"uint256[]"}],"name":"claimMultipleTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimOtherERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vestingId","type":"uint256"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"vesting","type":"uint256"}],"name":"getIdWithTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"vesting","type":"uint256"}],"name":"getUnlockedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"getUserVestingIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"getUserVestingIdsWithTokens","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":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"vestingId","type":"uint256"}],"name":"revoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"cycles","type":"uint256"},{"internalType":"uint256","name":"cycleduration","type":"uint256"},{"internalType":"bool","name":"revokable","type":"bool"}],"name":"setCycleBasedVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"cliff","type":"uint256[]"},{"internalType":"uint256[]","name":"cycles","type":"uint256[]"},{"internalType":"uint256[]","name":"cycleduration","type":"uint256[]"},{"internalType":"bool","name":"revokable","type":"bool"}],"name":"setCycleBasedVestingMultiWithCustomParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"bool","name":"revokable","type":"bool"}],"name":"setLinearVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"cliff","type":"uint256[]"},{"internalType":"uint256[]","name":"duration","type":"uint256[]"},{"internalType":"bool","name":"revokable","type":"bool"}],"name":"setLinearVestingMulti","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":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userVestingIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"vestingSchedules","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"bool","name":"revokable","type":"bool"},{"internalType":"bool","name":"revoked","type":"bool"},{"internalType":"uint256","name":"cycles","type":"uint256"},{"internalType":"uint256","name":"cycleDuration","type":"uint256"},{"internalType":"uint256","name":"released","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561000f575f80fd5b50604051611d88380380611d8883398101604081905261002e916100d1565b338061005357604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61005c81610082565b50600180546001600160a01b0319166001600160a01b03929092169190911790556100fe565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100e1575f80fd5b81516001600160a01b03811681146100f7575f80fd5b9392505050565b611c7d8061010b5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c8063715018a61161009e578063eac449d91161006e578063eac449d9146102bf578063f103009f146102d2578063f2fde38b146102e5578063f5b86ac3146102f8578063fc0c546a1461030b575f80fd5b8063715018a61461026d5780638da5cb5b14610275578063a3ce097414610299578063b6f8caed146102ac575f80fd5b8063440941d0116100e4578063440941d01461018757806345626bd61461019a57806346e04a2f146102345780635c545101146102475780636296d0f21461025a575f80fd5b80631720b8c014610115578063200cd5731461013e5780632e5dbf44146101535780633cd0036e14610174575b5f80fd5b6101286101233660046116e2565b61031e565b60405161013591906116fb565b60405180910390f35b61015161014c366004611755565b610387565b005b6101666101613660046117ad565b6103c3565b604051908152602001610135565b6101516101823660046117d5565b6103ee565b61015161019536600461186c565b610428565b6101f76101a83660046117ad565b600260208181525f938452604080852090915291835291208054600182015492820154600383015460048401546005850154600690950154939594929360ff8084169461010090940416929088565b6040805198895260208901979097529587019490945291151560608601521515608085015260a084015260c083015260e082015261010001610135565b610151610242366004611974565b610575565b61015161025536600461199f565b6105e2565b6101666102683660046117ad565b610677565b6101516106d8565b5f546001600160a01b03165b6040516001600160a01b039091168152602001610135565b6101516102a7366004611a64565b6106eb565b6101286102ba3660046116e2565b61081d565b6101516102cd3660046117ad565b6109ce565b6101516102e0366004611b40565b610b0c565b6101516102f33660046116e2565b610c52565b6101666103063660046117ad565b610c8f565b600154610281906001600160a01b031681565b6001600160a01b0381165f9081526003602090815260409182902080548351818402810184019094528084526060939283018282801561037b57602002820191905f5260205f20905b815481526020019060010190808311610367575b50505050509050919050565b61038f610ccc565b84156103ad576001546103ad906001600160a01b0316333088610cf8565b6103bb868686868686610d65565b505050505050565b6003602052815f5260405f2081815481106103dc575f80fd5b905f5260205f20015f91509150505481565b6103f6610ccc565b831561041457600154610414906001600160a01b0316333087610cf8565b6104218585858585611007565b5050505050565b610430610ccc565b89888082148015906104425750818814155b801561044e5750818614155b1561046c5760405163512509d360e11b815260040160405180910390fd5b5f805b828110156104a5578c8c8281811061048957610489611b7a565b905060200201358261049b9190611ba2565b915060010161046f565b506001546104be906001600160a01b0316333084610cf8565b5f5b838110156105645761055c8f8f838181106104dd576104dd611b7a565b90506020020160208101906104f291906116e2565b8e8e8481811061050457610504611b7a565b905060200201358d8d8581811061051d5761051d611b7a565b905060200201358c8c8681811061053657610536611b7a565b905060200201358b8b8781811061054f5761054f611b7a565b905060200201358a610d65565b6001016104c0565b505050505050505050505050505050565b60045460ff16156105be5760405162461bcd60e51b815260206004820152600e60248201526d1499595b9d1c985b9d0818d85b1b60921b60448201526064015b60405180910390fd5b6004805460ff191660011790556105d5338261127a565b506004805460ff19169055565b60045460ff16156106265760405162461bcd60e51b815260206004820152600e60248201526d1499595b9d1c985b9d0818d85b1b60921b60448201526064016105b5565b6004805460ff191660011790555f5b8151811015610669576106613383838151811061065457610654611b7a565b602002602001015161127a565b600101610635565b50506004805460ff19169055565b6001600160a01b0382165f908152600260209081526040808320848452909152812060018101544210156106ae575f9150506106d2565b5f6106b985856113c8565b90505f8260060154826106cc9190611bb5565b93505050505b92915050565b6106e0610ccc565b6106e95f6114af565b565b6106f3610ccc565b87868082148015906107055750818614155b80156107115750818414155b1561072f5760405163512509d360e11b815260040160405180910390fd5b5f805b82811015610768578a8a8281811061074c5761074c611b7a565b905060200201358261075e9190611ba2565b9150600101610732565b50600154610781906001600160a01b0316333084610cf8565b5f5b8381101561080e576108068d8d838181106107a0576107a0611b7a565b90506020020160208101906107b591906116e2565b8c8c848181106107c7576107c7611b7a565b905060200201358b8b858181106107e0576107e0611b7a565b905060200201358a8a868181106107f9576107f9611b7a565b9050602002013589611007565b600101610783565b50505050505050505050505050565b6001600160a01b0381165f90815260036020908152604080832080548251818502810185019093528083526060949383018282801561087957602002820191905f5260205f20905b815481526020019060010190808311610865575b505050505090505f81516001600160401b0381111561089a5761089a61198b565b6040519080825280602002602001820160405280156108c3578160200160208202803683370190505b5090505f805b8351811015610935575f8482815181106108e5576108e5611b7a565b602002602001015190505f6108fa8883610c8f565b111561092c578084848151811061091357610913611b7a565b60209081029190910101528261092881611bc8565b9350505b506001016108c9565b505f816001600160401b0381111561094f5761094f61198b565b604051908082528060200260200182016040528015610978578160200160208202803683370190505b5090505f5b828110156109c45783818151811061099757610997611b7a565b60200260200101518282815181106109b1576109b1611b7a565b602090810291909101015260010161097d565b5095945050505050565b6109d6610ccc565b6001600160a01b0382165f9081526002602090815260408083208484529091529020600381015460ff16610a1d576040516346bb871960e11b815260040160405180910390fd5b6003810154610100900460ff1615610a485760405163905e710760e01b815260040160405180910390fd5b5f610a5384846113c8565b90505f826006015482610a669190611bb5565b90505f82845f0154610a789190611bb5565b60038501805461ff00191661010017905590508115610aa857600154610aa8906001600160a01b031687846114fe565b610acf610abc5f546001600160a01b031690565b6001546001600160a01b031690836114fe565b60405185906001600160a01b038816907f57c76f5e278bfbd4eeb5207d287aa5a1a9e1113c65f7eefa540e379a2774d13b905f90a3505050505050565b610b14610ccc565b6001546001600160a01b0390811690841603610b43576040516374e6759b60e11b815260040160405180910390fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f92839290871691610b9e9190611be0565b5f604051808303815f865af19150503d805f8114610bd7576040519150601f19603f3d011682016040523d82523d5f602084013e610bdc565b606091505b5091509150818015610c06575080511580610c06575080806020019051810190610c069190611bf6565b6104215760405162461bcd60e51b815260206004820152601960248201527f45524332303a20544f4b454e5f434c41494d5f4641494c45440000000000000060448201526064016105b5565b610c5a610ccc565b6001600160a01b038116610c8357604051631e4fbdf760e01b81525f60048201526024016105b5565b610c8c816114af565b50565b6001600160a01b0382165f9081526002602090815260408083208484529091528120600681015481548391610cc391611bb5565b95945050505050565b5f546001600160a01b031633146106e95760405163118cdaa760e01b81523360048201526024016105b5565b6040516001600160a01b038481166024830152838116604483015260648201839052610d5f9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050611534565b50505050565b6001600160a01b038616610d8c5760405163d92e233d60e01b815260040160405180910390fd5b845f03610dac57604051631f2a200560e01b815260040160405180910390fd5b815f03610dcc5760405163346ab43760e11b815260040160405180910390fd5b825f03610dec5760405163dd10862960e01b815260040160405180910390fd5b610df98462015180611c11565b9350610e088262015180611c11565b91505f610e158542611ba2565b90505f610e228486611c11565b90505f60035f8a6001600160a01b03166001600160a01b031681526020019081526020015f2080549050905060405180610100016040528089815260200184815260200183815260200185151581526020015f151581526020018781526020018681526020015f81525060025f8b6001600160a01b03166001600160a01b031681526020019081526020015f205f8381526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff02191690831515021790555060808201518160030160016101000a81548160ff02191690831515021790555060a0820151816004015560c0820151816005015560e0820151816006015590505060035f8a6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505580896001600160a01b03167f850619f5272bcc9fa34925b4362e7e65d516927f16b61fab4c86bf7d0da3a3f88a868b878a8d8d604051610ff497969594939291909687526020870195909552604086019390935260608501919091521515608084015260a083015260c082015260e00190565b60405180910390a3505050505050505050565b6001600160a01b03851661102e5760405163d92e233d60e01b815260040160405180910390fd5b835f0361104e57604051631f2a200560e01b815260040160405180910390fd5b815f0361106e5760405163346ab43760e11b815260040160405180910390fd5b61107b8362015180611c11565b925061108a8262015180611c11565b91505f6110978442611ba2565b90505f60035f886001600160a01b03166001600160a01b031681526020019081526020015f2080549050905060405180610100016040528087815260200183815260200185815260200184151581526020015f151581526020015f81526020015f81526020015f81525060025f896001600160a01b03166001600160a01b031681526020019081526020015f205f8381526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff02191690831515021790555060808201518160030160016101000a81548160ff02191690831515021790555060a0820151816004015560c0820151816005015560e0820151816006015590505060035f886001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505580876001600160a01b03167f850619f5272bcc9fa34925b4362e7e65d516927f16b61fab4c86bf7d0da3a3f888858989895f8060405161126997969594939291909687526020870195909552604086019390935260608501919091521515608084015260a083015260c082015260e00190565b60405180910390a350505050505050565b6001600160a01b0382165f908152600260209081526040808320848452909152812080549091036112be57604051630bba1ad560e11b815260040160405180910390fd5b80600101544210156112e3576040516346c775f760e01b815260040160405180910390fd5b6003810154610100900460ff161561130e5760405163905e710760e01b815260040160405180910390fd5b5f61131984846113c8565b90505f82600601548261132c9190611bb5565b9050805f0361134e57604051630c8d9eab60e31b815260040160405180910390fd5b80836006015f8282546113619190611ba2565b909155505060015461137d906001600160a01b031686836114fe565b83856001600160a01b03167fc5c52c2a9175470464d5ea4429889e7df2ea88630a3d32f4d0d3d2d448656210836040516113b991815260200190565b60405180910390a35050505050565b6001600160a01b0382165f908152600260209081526040808320848452909152812060018101544210156113ff575f9150506106d2565b6003810154610100900460ff161561141c576006015490506106d2565b5f81600101544261142d9190611bb5565b90505f82600401545f0361145e576002830154835461144d908490611c11565b6114579190611c28565b905061149c565b5f83600501548361146f9190611c28565b6004850154909150611482826001611ba2565b855461148e9190611c11565b6114989190611c28565b9150505b8254811115610cc3575050549392505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0383811660248301526044820183905261152f91859182169063a9059cbb90606401610d2d565b505050565b5f6115486001600160a01b03841683611595565b905080515f1415801561156c57508080602001905181019061156a9190611bf6565b155b1561152f57604051635274afe760e01b81526001600160a01b03841660048201526024016105b5565b60606115a283835f6115a9565b9392505050565b6060814710156115ce5760405163cd78605960e01b81523060048201526024016105b5565b5f80856001600160a01b031684866040516115e99190611be0565b5f6040518083038185875af1925050503d805f8114611623576040519150601f19603f3d011682016040523d82523d5f602084013e611628565b606091505b5091509150611638868383611642565b9695505050505050565b606082611657576116528261169e565b6115a2565b815115801561166e57506001600160a01b0384163b155b1561169757604051639996b31560e01b81526001600160a01b03851660048201526024016105b5565b50806115a2565b8051156116ae5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80356001600160a01b03811681146116dd575f80fd5b919050565b5f602082840312156116f2575f80fd5b6115a2826116c7565b602080825282518282018190525f918401906040840190835b81811015611732578351835260209384019390920191600101611714565b509095945050505050565b8015158114610c8c575f80fd5b80356116dd8161173d565b5f805f805f8060c0878903121561176a575f80fd5b611773876116c7565b95506020870135945060408701359350606087013592506080870135915060a087013561179f8161173d565b809150509295509295509295565b5f80604083850312156117be575f80fd5b6117c7836116c7565b946020939093013593505050565b5f805f805f60a086880312156117e9575f80fd5b6117f2866116c7565b945060208601359350604086013592506060860135915060808601356118178161173d565b809150509295509295909350565b5f8083601f840112611835575f80fd5b5081356001600160401b0381111561184b575f80fd5b6020830191508360208260051b8501011115611865575f80fd5b9250929050565b5f805f805f805f805f805f60c08c8e031215611886575f80fd5b8b356001600160401b0381111561189b575f80fd5b6118a78e828f01611825565b909c509a505060208c01356001600160401b038111156118c5575f80fd5b6118d18e828f01611825565b909a5098505060408c01356001600160401b038111156118ef575f80fd5b6118fb8e828f01611825565b90985096505060608c01356001600160401b03811115611919575f80fd5b6119258e828f01611825565b90965094505060808c01356001600160401b03811115611943575f80fd5b61194f8e828f01611825565b9094509250611962905060a08d0161174a565b90509295989b509295989b9093969950565b5f60208284031215611984575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156119af575f80fd5b81356001600160401b038111156119c4575f80fd5b8201601f810184136119d4575f80fd5b80356001600160401b038111156119ed576119ed61198b565b8060051b604051601f19603f83011681018181106001600160401b0382111715611a1957611a1961198b565b604052918252602081840181019290810187841115611a36575f80fd5b6020850194505b83851015611a5957843580825260209586019590935001611a3d565b509695505050505050565b5f805f805f805f805f60a08a8c031215611a7c575f80fd5b89356001600160401b03811115611a91575f80fd5b611a9d8c828d01611825565b909a5098505060208a01356001600160401b03811115611abb575f80fd5b611ac78c828d01611825565b90985096505060408a01356001600160401b03811115611ae5575f80fd5b611af18c828d01611825565b90965094505060608a01356001600160401b03811115611b0f575f80fd5b611b1b8c828d01611825565b90945092505060808a0135611b2f8161173d565b809150509295985092959850929598565b5f805f60608486031215611b52575f80fd5b611b5b846116c7565b9250611b69602085016116c7565b929592945050506040919091013590565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106d2576106d2611b8e565b818103818111156106d2576106d2611b8e565b5f60018201611bd957611bd9611b8e565b5060010190565b5f82518060208501845e5f920191825250919050565b5f60208284031215611c06575f80fd5b81516115a28161173d565b80820281158282048414176106d2576106d2611b8e565b5f82611c4257634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212200832a5a51668da75d87783567e1c971179c780b02c2fd8b2f5319634e898401164736f6c634300081a0033000000000000000000000000b784bbd5cce24b510d06377f6b0af3d33b73585a
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610111575f3560e01c8063715018a61161009e578063eac449d91161006e578063eac449d9146102bf578063f103009f146102d2578063f2fde38b146102e5578063f5b86ac3146102f8578063fc0c546a1461030b575f80fd5b8063715018a61461026d5780638da5cb5b14610275578063a3ce097414610299578063b6f8caed146102ac575f80fd5b8063440941d0116100e4578063440941d01461018757806345626bd61461019a57806346e04a2f146102345780635c545101146102475780636296d0f21461025a575f80fd5b80631720b8c014610115578063200cd5731461013e5780632e5dbf44146101535780633cd0036e14610174575b5f80fd5b6101286101233660046116e2565b61031e565b60405161013591906116fb565b60405180910390f35b61015161014c366004611755565b610387565b005b6101666101613660046117ad565b6103c3565b604051908152602001610135565b6101516101823660046117d5565b6103ee565b61015161019536600461186c565b610428565b6101f76101a83660046117ad565b600260208181525f938452604080852090915291835291208054600182015492820154600383015460048401546005850154600690950154939594929360ff8084169461010090940416929088565b6040805198895260208901979097529587019490945291151560608601521515608085015260a084015260c083015260e082015261010001610135565b610151610242366004611974565b610575565b61015161025536600461199f565b6105e2565b6101666102683660046117ad565b610677565b6101516106d8565b5f546001600160a01b03165b6040516001600160a01b039091168152602001610135565b6101516102a7366004611a64565b6106eb565b6101286102ba3660046116e2565b61081d565b6101516102cd3660046117ad565b6109ce565b6101516102e0366004611b40565b610b0c565b6101516102f33660046116e2565b610c52565b6101666103063660046117ad565b610c8f565b600154610281906001600160a01b031681565b6001600160a01b0381165f9081526003602090815260409182902080548351818402810184019094528084526060939283018282801561037b57602002820191905f5260205f20905b815481526020019060010190808311610367575b50505050509050919050565b61038f610ccc565b84156103ad576001546103ad906001600160a01b0316333088610cf8565b6103bb868686868686610d65565b505050505050565b6003602052815f5260405f2081815481106103dc575f80fd5b905f5260205f20015f91509150505481565b6103f6610ccc565b831561041457600154610414906001600160a01b0316333087610cf8565b6104218585858585611007565b5050505050565b610430610ccc565b89888082148015906104425750818814155b801561044e5750818614155b1561046c5760405163512509d360e11b815260040160405180910390fd5b5f805b828110156104a5578c8c8281811061048957610489611b7a565b905060200201358261049b9190611ba2565b915060010161046f565b506001546104be906001600160a01b0316333084610cf8565b5f5b838110156105645761055c8f8f838181106104dd576104dd611b7a565b90506020020160208101906104f291906116e2565b8e8e8481811061050457610504611b7a565b905060200201358d8d8581811061051d5761051d611b7a565b905060200201358c8c8681811061053657610536611b7a565b905060200201358b8b8781811061054f5761054f611b7a565b905060200201358a610d65565b6001016104c0565b505050505050505050505050505050565b60045460ff16156105be5760405162461bcd60e51b815260206004820152600e60248201526d1499595b9d1c985b9d0818d85b1b60921b60448201526064015b60405180910390fd5b6004805460ff191660011790556105d5338261127a565b506004805460ff19169055565b60045460ff16156106265760405162461bcd60e51b815260206004820152600e60248201526d1499595b9d1c985b9d0818d85b1b60921b60448201526064016105b5565b6004805460ff191660011790555f5b8151811015610669576106613383838151811061065457610654611b7a565b602002602001015161127a565b600101610635565b50506004805460ff19169055565b6001600160a01b0382165f908152600260209081526040808320848452909152812060018101544210156106ae575f9150506106d2565b5f6106b985856113c8565b90505f8260060154826106cc9190611bb5565b93505050505b92915050565b6106e0610ccc565b6106e95f6114af565b565b6106f3610ccc565b87868082148015906107055750818614155b80156107115750818414155b1561072f5760405163512509d360e11b815260040160405180910390fd5b5f805b82811015610768578a8a8281811061074c5761074c611b7a565b905060200201358261075e9190611ba2565b9150600101610732565b50600154610781906001600160a01b0316333084610cf8565b5f5b8381101561080e576108068d8d838181106107a0576107a0611b7a565b90506020020160208101906107b591906116e2565b8c8c848181106107c7576107c7611b7a565b905060200201358b8b858181106107e0576107e0611b7a565b905060200201358a8a868181106107f9576107f9611b7a565b9050602002013589611007565b600101610783565b50505050505050505050505050565b6001600160a01b0381165f90815260036020908152604080832080548251818502810185019093528083526060949383018282801561087957602002820191905f5260205f20905b815481526020019060010190808311610865575b505050505090505f81516001600160401b0381111561089a5761089a61198b565b6040519080825280602002602001820160405280156108c3578160200160208202803683370190505b5090505f805b8351811015610935575f8482815181106108e5576108e5611b7a565b602002602001015190505f6108fa8883610c8f565b111561092c578084848151811061091357610913611b7a565b60209081029190910101528261092881611bc8565b9350505b506001016108c9565b505f816001600160401b0381111561094f5761094f61198b565b604051908082528060200260200182016040528015610978578160200160208202803683370190505b5090505f5b828110156109c45783818151811061099757610997611b7a565b60200260200101518282815181106109b1576109b1611b7a565b602090810291909101015260010161097d565b5095945050505050565b6109d6610ccc565b6001600160a01b0382165f9081526002602090815260408083208484529091529020600381015460ff16610a1d576040516346bb871960e11b815260040160405180910390fd5b6003810154610100900460ff1615610a485760405163905e710760e01b815260040160405180910390fd5b5f610a5384846113c8565b90505f826006015482610a669190611bb5565b90505f82845f0154610a789190611bb5565b60038501805461ff00191661010017905590508115610aa857600154610aa8906001600160a01b031687846114fe565b610acf610abc5f546001600160a01b031690565b6001546001600160a01b031690836114fe565b60405185906001600160a01b038816907f57c76f5e278bfbd4eeb5207d287aa5a1a9e1113c65f7eefa540e379a2774d13b905f90a3505050505050565b610b14610ccc565b6001546001600160a01b0390811690841603610b43576040516374e6759b60e11b815260040160405180910390fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f92839290871691610b9e9190611be0565b5f604051808303815f865af19150503d805f8114610bd7576040519150601f19603f3d011682016040523d82523d5f602084013e610bdc565b606091505b5091509150818015610c06575080511580610c06575080806020019051810190610c069190611bf6565b6104215760405162461bcd60e51b815260206004820152601960248201527f45524332303a20544f4b454e5f434c41494d5f4641494c45440000000000000060448201526064016105b5565b610c5a610ccc565b6001600160a01b038116610c8357604051631e4fbdf760e01b81525f60048201526024016105b5565b610c8c816114af565b50565b6001600160a01b0382165f9081526002602090815260408083208484529091528120600681015481548391610cc391611bb5565b95945050505050565b5f546001600160a01b031633146106e95760405163118cdaa760e01b81523360048201526024016105b5565b6040516001600160a01b038481166024830152838116604483015260648201839052610d5f9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050611534565b50505050565b6001600160a01b038616610d8c5760405163d92e233d60e01b815260040160405180910390fd5b845f03610dac57604051631f2a200560e01b815260040160405180910390fd5b815f03610dcc5760405163346ab43760e11b815260040160405180910390fd5b825f03610dec5760405163dd10862960e01b815260040160405180910390fd5b610df98462015180611c11565b9350610e088262015180611c11565b91505f610e158542611ba2565b90505f610e228486611c11565b90505f60035f8a6001600160a01b03166001600160a01b031681526020019081526020015f2080549050905060405180610100016040528089815260200184815260200183815260200185151581526020015f151581526020018781526020018681526020015f81525060025f8b6001600160a01b03166001600160a01b031681526020019081526020015f205f8381526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff02191690831515021790555060808201518160030160016101000a81548160ff02191690831515021790555060a0820151816004015560c0820151816005015560e0820151816006015590505060035f8a6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505580896001600160a01b03167f850619f5272bcc9fa34925b4362e7e65d516927f16b61fab4c86bf7d0da3a3f88a868b878a8d8d604051610ff497969594939291909687526020870195909552604086019390935260608501919091521515608084015260a083015260c082015260e00190565b60405180910390a3505050505050505050565b6001600160a01b03851661102e5760405163d92e233d60e01b815260040160405180910390fd5b835f0361104e57604051631f2a200560e01b815260040160405180910390fd5b815f0361106e5760405163346ab43760e11b815260040160405180910390fd5b61107b8362015180611c11565b925061108a8262015180611c11565b91505f6110978442611ba2565b90505f60035f886001600160a01b03166001600160a01b031681526020019081526020015f2080549050905060405180610100016040528087815260200183815260200185815260200184151581526020015f151581526020015f81526020015f81526020015f81525060025f896001600160a01b03166001600160a01b031681526020019081526020015f205f8381526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff02191690831515021790555060808201518160030160016101000a81548160ff02191690831515021790555060a0820151816004015560c0820151816005015560e0820151816006015590505060035f886001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505580876001600160a01b03167f850619f5272bcc9fa34925b4362e7e65d516927f16b61fab4c86bf7d0da3a3f888858989895f8060405161126997969594939291909687526020870195909552604086019390935260608501919091521515608084015260a083015260c082015260e00190565b60405180910390a350505050505050565b6001600160a01b0382165f908152600260209081526040808320848452909152812080549091036112be57604051630bba1ad560e11b815260040160405180910390fd5b80600101544210156112e3576040516346c775f760e01b815260040160405180910390fd5b6003810154610100900460ff161561130e5760405163905e710760e01b815260040160405180910390fd5b5f61131984846113c8565b90505f82600601548261132c9190611bb5565b9050805f0361134e57604051630c8d9eab60e31b815260040160405180910390fd5b80836006015f8282546113619190611ba2565b909155505060015461137d906001600160a01b031686836114fe565b83856001600160a01b03167fc5c52c2a9175470464d5ea4429889e7df2ea88630a3d32f4d0d3d2d448656210836040516113b991815260200190565b60405180910390a35050505050565b6001600160a01b0382165f908152600260209081526040808320848452909152812060018101544210156113ff575f9150506106d2565b6003810154610100900460ff161561141c576006015490506106d2565b5f81600101544261142d9190611bb5565b90505f82600401545f0361145e576002830154835461144d908490611c11565b6114579190611c28565b905061149c565b5f83600501548361146f9190611c28565b6004850154909150611482826001611ba2565b855461148e9190611c11565b6114989190611c28565b9150505b8254811115610cc3575050549392505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0383811660248301526044820183905261152f91859182169063a9059cbb90606401610d2d565b505050565b5f6115486001600160a01b03841683611595565b905080515f1415801561156c57508080602001905181019061156a9190611bf6565b155b1561152f57604051635274afe760e01b81526001600160a01b03841660048201526024016105b5565b60606115a283835f6115a9565b9392505050565b6060814710156115ce5760405163cd78605960e01b81523060048201526024016105b5565b5f80856001600160a01b031684866040516115e99190611be0565b5f6040518083038185875af1925050503d805f8114611623576040519150601f19603f3d011682016040523d82523d5f602084013e611628565b606091505b5091509150611638868383611642565b9695505050505050565b606082611657576116528261169e565b6115a2565b815115801561166e57506001600160a01b0384163b155b1561169757604051639996b31560e01b81526001600160a01b03851660048201526024016105b5565b50806115a2565b8051156116ae5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80356001600160a01b03811681146116dd575f80fd5b919050565b5f602082840312156116f2575f80fd5b6115a2826116c7565b602080825282518282018190525f918401906040840190835b81811015611732578351835260209384019390920191600101611714565b509095945050505050565b8015158114610c8c575f80fd5b80356116dd8161173d565b5f805f805f8060c0878903121561176a575f80fd5b611773876116c7565b95506020870135945060408701359350606087013592506080870135915060a087013561179f8161173d565b809150509295509295509295565b5f80604083850312156117be575f80fd5b6117c7836116c7565b946020939093013593505050565b5f805f805f60a086880312156117e9575f80fd5b6117f2866116c7565b945060208601359350604086013592506060860135915060808601356118178161173d565b809150509295509295909350565b5f8083601f840112611835575f80fd5b5081356001600160401b0381111561184b575f80fd5b6020830191508360208260051b8501011115611865575f80fd5b9250929050565b5f805f805f805f805f805f60c08c8e031215611886575f80fd5b8b356001600160401b0381111561189b575f80fd5b6118a78e828f01611825565b909c509a505060208c01356001600160401b038111156118c5575f80fd5b6118d18e828f01611825565b909a5098505060408c01356001600160401b038111156118ef575f80fd5b6118fb8e828f01611825565b90985096505060608c01356001600160401b03811115611919575f80fd5b6119258e828f01611825565b90965094505060808c01356001600160401b03811115611943575f80fd5b61194f8e828f01611825565b9094509250611962905060a08d0161174a565b90509295989b509295989b9093969950565b5f60208284031215611984575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156119af575f80fd5b81356001600160401b038111156119c4575f80fd5b8201601f810184136119d4575f80fd5b80356001600160401b038111156119ed576119ed61198b565b8060051b604051601f19603f83011681018181106001600160401b0382111715611a1957611a1961198b565b604052918252602081840181019290810187841115611a36575f80fd5b6020850194505b83851015611a5957843580825260209586019590935001611a3d565b509695505050505050565b5f805f805f805f805f60a08a8c031215611a7c575f80fd5b89356001600160401b03811115611a91575f80fd5b611a9d8c828d01611825565b909a5098505060208a01356001600160401b03811115611abb575f80fd5b611ac78c828d01611825565b90985096505060408a01356001600160401b03811115611ae5575f80fd5b611af18c828d01611825565b90965094505060608a01356001600160401b03811115611b0f575f80fd5b611b1b8c828d01611825565b90945092505060808a0135611b2f8161173d565b809150509295985092959850929598565b5f805f60608486031215611b52575f80fd5b611b5b846116c7565b9250611b69602085016116c7565b929592945050506040919091013590565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106d2576106d2611b8e565b818103818111156106d2576106d2611b8e565b5f60018201611bd957611bd9611b8e565b5060010190565b5f82518060208501845e5f920191825250919050565b5f60208284031215611c06575f80fd5b81516115a28161173d565b80820281158282048414176106d2576106d2611b8e565b5f82611c4257634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212200832a5a51668da75d87783567e1c971179c780b02c2fd8b2f5319634e898401164736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b784bbd5cce24b510d06377f6b0af3d33b73585a
-----Decoded View---------------
Arg [0] : _token (address): 0xB784bBd5CCe24b510d06377f6b0af3D33B73585a
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b784bbd5cce24b510d06377f6b0af3d33b73585a
Deployed Bytecode Sourcemap
18696:16143:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28671:174;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23306:518;;;;;;:::i;:::-;;:::i;:::-;;19138:51;;;;;;:::i;:::-;;:::i;:::-;;;2509:25:1;;;2497:2;2482:18;19138:51:0;2363:177:1;21332:454:0;;;;;;:::i;:::-;;:::i;23965:1109::-;;;;;;:::i;:::-;;:::i;19043:88::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5769:25:1;;;5825:2;5810:18;;5803:34;;;;5853:18;;;5846:34;;;;5923:14;;5916:22;5911:2;5896:18;;5889:50;5983:14;5976:22;5970:3;5955:19;;5948:51;6030:3;6015:19;;6008:35;6074:3;6059:19;;6052:35;6118:3;6103:19;;6096:35;5756:3;5741:19;19043:88:0;5438:699:1;29017:111:0;;;;;;:::i;:::-;;:::i;29295:207::-;;;;;;:::i;:::-;;:::i;33084:417::-;;;;;;:::i;:::-;;:::i;5840:103::-;;;:::i;5165:87::-;5211:7;5238:6;-1:-1:-1;;;;;5238:6:0;5165:87;;;-1:-1:-1;;;;;7849:32:1;;;7831:51;;7819:2;7804:18;5165:87:0;7685:203:1;21921:994:0;;;;;;:::i;:::-;;:::i;30767:746::-;;;;;;:::i;:::-;;:::i;29792:752::-;;;;;;:::i;:::-;;:::i;20484:521::-;;;;;;:::i;:::-;;:::i;6098:220::-;;;;;;:::i;:::-;;:::i;32634:282::-;;;;;;:::i;:::-;;:::i;18768:19::-;;;;;-1:-1:-1;;;;;18768:19:0;;;28671:174;-1:-1:-1;;;;;28810:27:0;;;;;;:14;:27;;;;;;;;;28803:34;;;;;;;;;;;;;;;;;28769:16;;28803:34;;;28810:27;28803:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28671:174;;;:::o;23306:518::-;5051:13;:11;:13::i;:::-;23538:10;;23534:100:::1;;23565:5;::::0;:57:::1;::::0;-1:-1:-1;;;;;23565:5:0::1;23588:10;23608:4;23615:6:::0;23565:22:::1;:57::i;:::-;23644:172;23680:11;23706:6;23727:5;23747:6;23768:13;23796:9;23644:21;:172::i;:::-;23306:518:::0;;;;;;:::o;19138:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21332:454::-;5051:13;:11;:13::i;:::-;21530:10;;21526:100:::1;;21557:5;::::0;:57:::1;::::0;-1:-1:-1;;;;;21557:5:0::1;21580:10;21600:4;21607:6:::0;21557:22:::1;:57::i;:::-;21636:142;21668:11;21694:6;21715:5;21735:8;21758:9;21636:17;:142::i;:::-;21332:454:::0;;;;;:::o;23965:1109::-;5051:13;:11;:13::i;:::-;24285:5;24331:7;24373:26;;::::1;::::0;::::1;::::0;:73:::1;;-1:-1:-1::0;24420:26:0;;::::1;;24373:73;:121;;;;-1:-1:-1::0;24467:27:0;;::::1;;24373:121;24356:170;;;24503:21;;-1:-1:-1::0;;;24503:21:0::1;;;;;;;;;;;24356:170;24536:19;::::0;24576:108:::1;24600:12;24596:1;:16;24576:108;;;24662:7;;24670:1;24662:10;;;;;;;:::i;:::-;;;;;;;24648:11;:24;;;;:::i;:::-;24634:38:::0;-1:-1:-1;24614:3:0::1;;24576:108;;;-1:-1:-1::0;24704:5:0::1;::::0;:62:::1;::::0;-1:-1:-1;;;;;24704:5:0::1;24727:10;24747:4;24754:11:::0;24704:22:::1;:62::i;:::-;24784:9;24779:278;24803:10;24799:1;:14;24779:278;;;24835:210;24875:5;;24881:1;24875:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;24902:7;;24910:1;24902:10;;;;;;;:::i;:::-;;;;;;;24931:5;;24937:1;24931:8;;;;;;;:::i;:::-;;;;;;;24958:6;;24965:1;24958:9;;;;;;;:::i;:::-;;;;;;;24986:13;;25000:1;24986:16;;;;;;;:::i;:::-;;;;;;;25021:9;24835:21;:210::i;:::-;24815:3;;24779:278;;;;24253:821;;;23965:1109:::0;;;;;;;;;;;:::o;29017:111::-;20376:8;;;;20375:9;20367:36;;;;-1:-1:-1;;;20367:36:0;;10655:2:1;20367:36:0;;;10637:21:1;10694:2;10674:18;;;10667:30;-1:-1:-1;;;10713:18:1;;;10706:44;10767:18;;20367:36:0;;;;;;;;;20414:8;:15;;-1:-1:-1;;20414:15:0;20425:4;20414:15;;;29089:31:::1;29098:10;29110:9:::0;29089:8:::1;:31::i;:::-;-1:-1:-1::0;20452:8:0;:16;;-1:-1:-1;;20452:16:0;;;29017:111::o;29295:207::-;20376:8;;;;20375:9;20367:36;;;;-1:-1:-1;;;20367:36:0;;10655:2:1;20367:36:0;;;10637:21:1;10694:2;10674:18;;;10667:30;-1:-1:-1;;;10713:18:1;;;10706:44;10767:18;;20367:36:0;10453:338:1;20367:36:0;20414:8;:15;;-1:-1:-1;;20414:15:0;20425:4;20414:15;;;:8;29385:110:::1;29409:10;:17;29405:1;:21;29385:110;;;29448:35;29457:10;29469;29480:1;29469:13;;;;;;;;:::i;:::-;;;;;;;29448:8;:35::i;:::-;29428:3;;29385:110;;;-1:-1:-1::0;;20452:8:0;:16;;-1:-1:-1;;20452:16:0;;;29295:207::o;33084:417::-;-1:-1:-1;;;;;33218:22:0;;33163:7;33218:22;;;:16;:22;;;;;;;;:55;;;;;;;;33287:14;;;;33305:15;-1:-1:-1;33284:48:0;;;33329:1;33322:8;;;;;33284:48;33342:19;33364:28;33378:4;33384:7;33364:13;:28::i;:::-;33342:50;;33404:22;33443:8;:17;;;33429:11;:31;;;;:::i;:::-;33404:56;-1:-1:-1;;;;33084:417:0;;;;;:::o;5840:103::-;5051:13;:11;:13::i;:::-;5905:30:::1;5932:1;5905:18;:30::i;:::-;5840:103::o:0;21921:994::-;5051:13;:11;:13::i;:::-;22180:5;22226:7;22268:26;;::::1;::::0;::::1;::::0;:73:::1;;-1:-1:-1::0;22315:26:0;;::::1;;22268:73;:123;;;;-1:-1:-1::0;22362:29:0;;::::1;;22268:123;22251:172;;;22400:21;;-1:-1:-1::0;;;22400:21:0::1;;;;;;;;;;;22251:172;22446:19;::::0;22476:108:::1;22500:12;22496:1;:16;22476:108;;;22562:7;;22570:1;22562:10;;;;;;;:::i;:::-;;;;;;;22548:11;:24;;;;:::i;:::-;22534:38:::0;-1:-1:-1;22514:3:0::1;;22476:108;;;-1:-1:-1::0;22594:5:0::1;::::0;:62:::1;::::0;-1:-1:-1;;;;;22594:5:0::1;22617:10;22637:4;22644:11:::0;22594:22:::1;:62::i;:::-;22672:9;22667:241;22691:10;22687:1;:14;22667:241;;;22723:173;22759:5;;22765:1;22759:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;22786:7;;22794:1;22786:10;;;;;;;:::i;:::-;;;;;;;22815:5;;22821:1;22815:8;;;;;;;:::i;:::-;;;;;;;22842;;22851:1;22842:11;;;;;;;:::i;:::-;;;;;;;22872:9;22723:17;:173::i;:::-;22703:3;;22667:241;;;;22148:767;;;21921:994:::0;;;;;;;;;:::o;30767:746::-;-1:-1:-1;;;;;30899:27:0;;30873:23;30899:27;;;:14;:27;;;;;;;;30873:53;;;;;;;;;;;;;;;;;30848:16;;30873:23;:53;;30899:27;30873:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30933:34;30984:6;:13;-1:-1:-1;;;;;30970:28:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30970:28:0;;30933:65;;31005:13;31036:9;31031:236;31055:6;:13;31051:1;:17;31031:236;;;31086:17;31106:6;31113:1;31106:9;;;;;;;;:::i;:::-;;;;;;;31086:29;;31172:1;31130:39;31146:11;31159:9;31130:15;:39::i;:::-;:43;31126:134;;;31217:9;31190:17;31208:5;31190:24;;;;;;;;:::i;:::-;;;;;;;;;;:36;31241:7;;;;:::i;:::-;;;;31126:134;-1:-1:-1;31070:3:0;;31031:236;;;;31327:30;31374:5;-1:-1:-1;;;;;31360:20:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31360:20:0;;31327:53;;31392:9;31387:94;31411:5;31407:1;:9;31387:94;;;31453:17;31471:1;31453:20;;;;;;;;:::i;:::-;;;;;;;31434:13;31448:1;31434:16;;;;;;;;:::i;:::-;;;;;;;;;;:39;31418:3;;31387:94;;;-1:-1:-1;31496:13:0;30767:746;-1:-1:-1;;;;;30767:746:0:o;29792:752::-;5051:13;:11;:13::i;:::-;-1:-1:-1;;;;;29913:29:0;::::1;29878:32;29913:29:::0;;;:16:::1;:29;::::0;;;;;;;:64;;;;;;;;29992:18:::1;::::0;::::1;::::0;::::1;;29988:56;;30019:23;;-1:-1:-1::0;;;30019:23:0::1;;;;;;;;;;;29988:56;30057:16;::::0;::::1;::::0;::::1;::::0;::::1;;;30054:46;;;30082:16;;-1:-1:-1::0;;;30082:16:0::1;;;;;;;;;;;30054:46;30112:20;30135:37;30149:11;30162:9;30135:13;:37::i;:::-;30112:60;;30183:18;30219:8;:17;;;30204:12;:32;;;;:::i;:::-;30183:53;;30247:14;30282:12;30264:8;:15;;;:30;;;;:::i;:::-;30307:16;::::0;::::1;:23:::0;;-1:-1:-1;;30307:23:0::1;;;::::0;;30247:47;-1:-1:-1;30347:14:0;;30343:90:::1;;30378:5;::::0;:43:::1;::::0;-1:-1:-1;;;;;30378:5:0::1;30397:11:::0;30410:10;30378:18:::1;:43::i;:::-;30445:35;30464:7;5211::::0;5238:6;-1:-1:-1;;;;;5238:6:0;;5165:87;30464:7:::1;30445:5;::::0;-1:-1:-1;;;;;30445:5:0::1;::::0;30473:6;30445:18:::1;:35::i;:::-;30498:38;::::0;30526:9;;-1:-1:-1;;;;;30498:38:0;::::1;::::0;::::1;::::0;;;::::1;29867:677;;;;29792:752:::0;;:::o;20484:521::-;5051:13;:11;:13::i;:::-;20601:5:::1;::::0;-1:-1:-1;;;;;20601:5:0;;::::1;20583:24:::0;;::::1;::::0;20580:80:::1;;20626:24;;-1:-1:-1::0;;;20626:24:0::1;;;;;;;;;;;20580:80;20797:46;::::0;;-1:-1:-1;;;;;11261:32:1;;;20797:46:0::1;::::0;::::1;11243:51:1::0;11310:18;;;;11303:34;;;20797:46:0;;;;;;;;;;11216:18:1;;;;20797:46:0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;20797:46:0::1;-1:-1:-1::0;;;20797:46:0::1;::::0;;20771:83;;-1:-1:-1;;;;20771:11:0;;::::1;::::0;:83:::1;::::0;20797:46;20771:83:::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20735:119;;;;20887:7;:57;;;;-1:-1:-1::0;20899:11:0;;:16;;:44:::1;;;20930:4;20919:24;;;;;;;;;;;;:::i;:::-;20865:132;;;::::0;-1:-1:-1;;;20865:132:0;;12106:2:1;20865:132:0::1;::::0;::::1;12088:21:1::0;12145:2;12125:18;;;12118:30;12184:27;12164:18;;;12157:55;12229:18;;20865:132:0::1;11904:349:1::0;6098:220:0;5051:13;:11;:13::i;:::-;-1:-1:-1;;;;;6183:22:0;::::1;6179:93;;6229:31;::::0;-1:-1:-1;;;6229:31:0;;6257:1:::1;6229:31;::::0;::::1;7831:51:1::0;7804:18;;6229:31:0::1;7685:203:1::0;6179:93:0::1;6282:28;6301:8;6282:18;:28::i;:::-;6098:220:::0;:::o;32634:282::-;-1:-1:-1;;;;;32766:22:0;;32712:7;32766:22;;;:16;:22;;;;;;;;:55;;;;;;;;32867:17;;;;32849:15;;32712:7;;32849:35;;;:::i;:::-;32832:52;32634:282;-1:-1:-1;;;;;32634:282:0:o;5330:166::-;5211:7;5238:6;-1:-1:-1;;;;;5238:6:0;3407:10;5390:23;5386:103;;5437:40;;-1:-1:-1;;;5437:40:0;;3407:10;5437:40;;;7831:51:1;7804:18;;5437:40:0;7685:203:1;14420:190:0;14548:53;;-1:-1:-1;;;;;12478:32:1;;;14548:53:0;;;12460:51:1;12547:32;;;12527:18;;;12520:60;12596:18;;;12589:34;;;14521:81:0;;14541:5;;14563:18;;;;;12433::1;;14548:53:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14548:53:0;;;;;;;;;;;14521:19;:81::i;:::-;14420:190;;;;:::o;27126:1351::-;-1:-1:-1;;;;;27362:25:0;;27345:66;;27396:13;;-1:-1:-1;;;27396:13:0;;;;;;;;;;;27345:66;27437:6;27447:1;27437:11;27434:37;;27457:12;;-1:-1:-1;;;27457:12:0;;;;;;;;;;;27434:37;27484:13;27501:1;27484:18;27481:46;;27511:14;;-1:-1:-1;;;27511:14:0;;;;;;;;;;;27481:46;27540:6;27550:1;27540:11;27537:43;;27560:18;;-1:-1:-1;;;27560:18:0;;;;;;;;;;;27537:43;27600:14;:5;27608:6;27600:14;:::i;:::-;27592:22;-1:-1:-1;27641:22:0;:13;27657:6;27641:22;:::i;:::-;27625:38;-1:-1:-1;27674:13:0;27690:23;27708:5;27690:15;:23;:::i;:::-;27674:39;-1:-1:-1;27724:16:0;27743:22;27752:13;27743:6;:22;:::i;:::-;27724:41;;27776:17;27796:14;:27;27811:11;-1:-1:-1;;;;;27796:27:0;-1:-1:-1;;;;;27796:27:0;;;;;;;;;;;;:34;;;;27776:54;;27884:279;;;;;;;;27923:6;27884:279;;;;27951:5;27884:279;;;;27981:8;27884:279;;;;28015:9;27884:279;;;;;;28048:5;27884:279;;;;;;28076:6;27884:279;;;;28112:13;27884:279;;;;28150:1;27884:279;;;27841:16;:29;27858:11;-1:-1:-1;;;;;27841:29:0;-1:-1:-1;;;;;27841:29:0;;;;;;;;;;;;:40;27871:9;27841:40;;;;;;;;;;;:322;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28176:14;:27;28191:11;-1:-1:-1;;;;;28176:27:0;-1:-1:-1;;;;;28176:27:0;;;;;;;;;;;;28209:9;28176:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28292:9;28266:11;-1:-1:-1;;;;;28237:232:0;;28316:6;28337:5;28357;28377:8;28400:9;28424:6;28445:13;28237:232;;;;;;;;;;;13116:25:1;;;13172:2;13157:18;;13150:34;;;;13215:2;13200:18;;13193:34;;;;13258:2;13243:18;;13236:34;;;;13314:14;13307:22;13301:3;13286:19;;13279:51;13361:3;13346:19;;13339:35;13405:3;13390:19;;13383:35;13103:3;13088:19;;12807:617;28237:232:0;;;;;;;;27334:1143;;;27126:1351;;;;;;:::o;25486:1167::-;-1:-1:-1;;;;;25688:25:0;;25671:66;;25722:13;;-1:-1:-1;;;25722:13:0;;;;;;;;;;;25671:66;25763:6;25773:1;25763:11;25760:37;;25783:12;;-1:-1:-1;;;25783:12:0;;;;;;;;;;;25760:37;25810:8;25822:1;25810:13;25807:41;;25832:14;;-1:-1:-1;;;25832:14:0;;;;;;;;;;;25807:41;25869:14;:5;25877:6;25869:14;:::i;:::-;25861:22;-1:-1:-1;25906:17:0;:8;25917:6;25906:17;:::i;:::-;25895:28;-1:-1:-1;25934:13:0;25950:23;25968:5;25950:15;:23;:::i;:::-;25934:39;;25986:17;26006:14;:27;26021:11;-1:-1:-1;;;;;26006:27:0;-1:-1:-1;;;;;26006:27:0;;;;;;;;;;;;:34;;;;25986:54;;26094:262;;;;;;;;26133:6;26094:262;;;;26161:5;26094:262;;;;26191:8;26094:262;;;;26225:9;26094:262;;;;;;26258:5;26094:262;;;;;;26286:1;26094:262;;;;26317:1;26094:262;;;;26343:1;26094:262;;;26051:16;:29;26068:11;-1:-1:-1;;;;;26051:29:0;-1:-1:-1;;;;;26051:29:0;;;;;;;;;;;;:40;26081:9;26051:40;;;;;;;;;;;:305;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26369:14;:27;26384:11;-1:-1:-1;;;;;26369:27:0;-1:-1:-1;;;;;26369:27:0;;;;;;;;;;;;26402:9;26369:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26485:9;26459:11;-1:-1:-1;;;;;26430:215:0;;26509:6;26530:5;26550;26570:8;26593:9;26617:1;26633;26430:215;;;;;;;;;;;13116:25:1;;;13172:2;13157:18;;13150:34;;;;13215:2;13200:18;;13193:34;;;;13258:2;13243:18;;13236:34;;;;13314:14;13307:22;13301:3;13286:19;;13279:51;13361:3;13346:19;;13339:35;13405:3;13390:19;;13383:35;13103:3;13088:19;;12807:617;26430:215:0;;;;;;;;25660:993;;25486:1167;;;;;:::o;31726:745::-;-1:-1:-1;;;;;31839:29:0;;31804:32;31839:29;;;:16;:29;;;;;;;;:64;;;;;;;;31917:15;;31839:64;;31917:20;31914:50;;31946:16;;-1:-1:-1;;;31946:16:0;;;;;;;;;;;31914:50;31995:8;:14;;;31977:15;:32;31974:73;;;32018:27;;-1:-1:-1;;;32018:27:0;;;;;;;;;;;31974:73;32060:16;;;;;;;;;32057:46;;;32085:16;;-1:-1:-1;;;32085:16:0;;;;;;;;;;;32057:46;32115:20;32138:37;32152:11;32165:9;32138:13;:37::i;:::-;32115:60;;32186:18;32222:8;:17;;;32207:12;:32;;;;:::i;:::-;32186:53;;32255:10;32269:1;32255:15;32252:46;;32280:16;;-1:-1:-1;;;32280:16:0;;;;;;;;;;;32252:46;32331:10;32310:8;:17;;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;32352:5:0;;:43;;-1:-1:-1;;;;;32352:5:0;32371:11;32384:10;32352:18;:43::i;:::-;32441:9;32428:11;-1:-1:-1;;;;;32413:50:0;;32452:10;32413:50;;;;2509:25:1;;2497:2;2482:18;;2363:177;32413:50:0;;;;;;;;31793:678;;;31726:745;;:::o;33777:1059::-;-1:-1:-1;;;;;33949:29:0;;33889:7;33949:29;;;:16;:29;;;;;;;;:64;;;;;;;;34048:14;;;;34030:15;:32;34026:73;;;34086:1;34079:8;;;;;34026:73;34115:16;;;;;;;;;34111:73;;;34155:17;;;;-1:-1:-1;34148:24:0;;34111:73;34196:19;34236:8;:14;;;34218:15;:32;;;;:::i;:::-;34196:54;;34261:20;34298:8;:15;;;34317:1;34298:20;34294:398;;34415:17;;;;34382:15;;:29;;34400:11;;34382:29;:::i;:::-;34381:51;;;;:::i;:::-;34366:66;;34294:398;;;34501:20;34538:8;:22;;;34524:11;:36;;;;:::i;:::-;34665:15;;;;34501:59;;-1:-1:-1;34627:16:0;34501:59;34642:1;34627:16;:::i;:::-;34608:15;;:36;;;;:::i;:::-;34607:73;;;;:::i;:::-;34575:105;;34450:242;34294:398;34723:15;;34708:30;;34704:93;;;-1:-1:-1;;34770:15:0;;34816:12;-1:-1:-1;;;33777:1059:0:o;6478:191::-;6552:16;6571:6;;-1:-1:-1;;;;;6588:17:0;;;-1:-1:-1;;;;;;6588:17:0;;;;;;6621:40;;6571:6;;;;;;;6621:40;;6552:16;6621:40;6541:128;6478:191;:::o;14013:162::-;14123:43;;-1:-1:-1;;;;;11261:32:1;;;14123:43:0;;;11243:51:1;11310:18;;;11303:34;;;14096:71:0;;14116:5;;14138:14;;;;;11216:18:1;;14123:43:0;11069:274:1;14096:71:0;14013:162;;;:::o;16824:638::-;17248:23;17274:33;-1:-1:-1;;;;;17274:27:0;;17302:4;17274:27;:33::i;:::-;17248:59;;17322:10;:17;17343:1;17322:22;;:57;;;;;17360:10;17349:30;;;;;;;;;;;;:::i;:::-;17348:31;17322:57;17318:137;;;17403:40;;-1:-1:-1;;;17403:40:0;;-1:-1:-1;;;;;7849:32:1;;17403:40:0;;;7831:51:1;7804:18;;17403:40:0;7685:203:1;9318:153:0;9393:12;9425:38;9447:6;9455:4;9461:1;9425:21;:38::i;:::-;9418:45;9318:153;-1:-1:-1;;;9318:153:0:o;9806:398::-;9905:12;9958:5;9934:21;:29;9930:110;;;9987:41;;-1:-1:-1;;;9987:41:0;;10022:4;9987:41;;;7831:51:1;7804:18;;9987:41:0;7685:203:1;9930:110:0;10051:12;10065:23;10092:6;-1:-1:-1;;;;;10092:11:0;10111:5;10118:4;10092:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10050:73;;;;10141:55;10168:6;10176:7;10185:10;10141:26;:55::i;:::-;10134:62;9806:398;-1:-1:-1;;;;;;9806:398:0:o;11282:597::-;11430:12;11460:7;11455:417;;11484:19;11492:10;11484:7;:19::i;:::-;11455:417;;;11712:17;;:22;:49;;;;-1:-1:-1;;;;;;11738:18:0;;;:23;11712:49;11708:121;;;11789:24;;-1:-1:-1;;;11789:24:0;;-1:-1:-1;;;;;7849:32:1;;11789:24:0;;;7831:51:1;7804:18;;11789:24:0;7685:203:1;11708:121:0;-1:-1:-1;11850:10:0;11843:17;;12432:528;12565:17;;:21;12561:392;;12797:10;12791:17;12854:15;12841:10;12837:2;12833:19;12826:44;12561:392;12924:17;;-1:-1:-1;;;12924:17:0;;;;;;;;;;;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:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;383:611::-;573:2;585:21;;;655:13;;558:18;;;677:22;;;525:4;;756:15;;;730:2;715:18;;;525:4;799:169;813:6;810:1;807:13;799:169;;;874:13;;862:26;;917:2;943:15;;;;908:12;;;;835:1;828:9;799:169;;;-1:-1:-1;985:3:1;;383:611;-1:-1:-1;;;;;383:611:1:o;999:118::-;1085:5;1078:13;1071:21;1064:5;1061:32;1051:60;;1107:1;1104;1097:12;1122:128;1187:20;;1216:28;1187:20;1216:28;:::i;1255:798::-;1356:6;1364;1372;1380;1388;1396;1449:3;1437:9;1428:7;1424:23;1420:33;1417:53;;;1466:1;1463;1456:12;1417:53;1489:29;1508:9;1489:29;:::i;:::-;1479:39;-1:-1:-1;1587:2:1;1572:18;;1559:32;;-1:-1:-1;1688:2:1;1673:18;;1660:32;;-1:-1:-1;1791:2:1;1776:18;;1763:32;;-1:-1:-1;1894:3:1;1879:19;;1866:33;;-1:-1:-1;1977:3:1;1962:19;;1949:33;1991:30;1949:33;1991:30;:::i;:::-;2040:7;2030:17;;;1255:798;;;;;;;;:::o;2058:300::-;2126:6;2134;2187:2;2175:9;2166:7;2162:23;2158:32;2155:52;;;2203:1;2200;2193:12;2155:52;2226:29;2245:9;2226:29;:::i;:::-;2216:39;2324:2;2309:18;;;;2296:32;;-1:-1:-1;;;2058:300:1:o;2545:677::-;2637:6;2645;2653;2661;2669;2722:3;2710:9;2701:7;2697:23;2693:33;2690:53;;;2739:1;2736;2729:12;2690:53;2762:29;2781:9;2762:29;:::i;:::-;2752:39;-1:-1:-1;2860:2:1;2845:18;;2832:32;;-1:-1:-1;2961:2:1;2946:18;;2933:32;;-1:-1:-1;3064:2:1;3049:18;;3036:32;;-1:-1:-1;3146:3:1;3131:19;;3118:33;3160:30;3118:33;3160:30;:::i;:::-;3209:7;3199:17;;;2545:677;;;;;;;;:::o;3227:367::-;3290:8;3300:6;3354:3;3347:4;3339:6;3335:17;3331:27;3321:55;;3372:1;3369;3362:12;3321:55;-1:-1:-1;3395:20:1;;-1:-1:-1;;;;;3427:30:1;;3424:50;;;3470:1;3467;3460:12;3424:50;3507:4;3499:6;3495:17;3483:29;;3567:3;3560:4;3550:6;3547:1;3543:14;3535:6;3531:27;3527:38;3524:47;3521:67;;;3584:1;3581;3574:12;3521:67;3227:367;;;;;:::o;3599:1834::-;3835:6;3843;3851;3859;3867;3875;3883;3891;3899;3907;3915:7;3969:3;3957:9;3948:7;3944:23;3940:33;3937:53;;;3986:1;3983;3976:12;3937:53;4026:9;4013:23;-1:-1:-1;;;;;4051:6:1;4048:30;4045:50;;;4091:1;4088;4081:12;4045:50;4130:70;4192:7;4183:6;4172:9;4168:22;4130:70;:::i;:::-;4219:8;;-1:-1:-1;4104:96:1;-1:-1:-1;;4307:2:1;4292:18;;4279:32;-1:-1:-1;;;;;4323:32:1;;4320:52;;;4368:1;4365;4358:12;4320:52;4407:72;4471:7;4460:8;4449:9;4445:24;4407:72;:::i;:::-;4498:8;;-1:-1:-1;4381:98:1;-1:-1:-1;;4586:2:1;4571:18;;4558:32;-1:-1:-1;;;;;4602:32:1;;4599:52;;;4647:1;4644;4637:12;4599:52;4686:72;4750:7;4739:8;4728:9;4724:24;4686:72;:::i;:::-;4777:8;;-1:-1:-1;4660:98:1;-1:-1:-1;;4865:2:1;4850:18;;4837:32;-1:-1:-1;;;;;4881:32:1;;4878:52;;;4926:1;4923;4916:12;4878:52;4965:72;5029:7;5018:8;5007:9;5003:24;4965:72;:::i;:::-;5056:8;;-1:-1:-1;4939:98:1;-1:-1:-1;;5144:3:1;5129:19;;5116:33;-1:-1:-1;;;;;5161:32:1;;5158:52;;;5206:1;5203;5196:12;5158:52;5245:72;5309:7;5298:8;5287:9;5283:24;5245:72;:::i;:::-;5336:8;;-1:-1:-1;5219:98:1;-1:-1:-1;5391:36:1;;-1:-1:-1;5422:3:1;5407:19;;5391:36;:::i;:::-;5380:47;;3599:1834;;;;;;;;;;;;;;:::o;6142:226::-;6201:6;6254:2;6242:9;6233:7;6229:23;6225:32;6222:52;;;6270:1;6267;6260:12;6222:52;-1:-1:-1;6315:23:1;;6142:226;-1:-1:-1;6142:226:1:o;6373:127::-;6434:10;6429:3;6425:20;6422:1;6415:31;6465:4;6462:1;6455:15;6489:4;6486:1;6479:15;6505:1175;6589:6;6642:2;6630:9;6621:7;6617:23;6613:32;6610:52;;;6658:1;6655;6648:12;6610:52;6698:9;6685:23;-1:-1:-1;;;;;6723:6:1;6720:30;6717:50;;;6763:1;6760;6753:12;6717:50;6786:22;;6839:4;6831:13;;6827:27;-1:-1:-1;6817:55:1;;6868:1;6865;6858:12;6817:55;6908:2;6895:16;-1:-1:-1;;;;;6926:6:1;6923:30;6920:56;;;6956:18;;:::i;:::-;7002:6;6999:1;6995:14;7038:2;7032:9;7101:2;7097:7;7092:2;7088;7084:11;7080:25;7072:6;7068:38;7172:6;7160:10;7157:22;-1:-1:-1;;;;;7124:10:1;7121:34;7118:62;7115:88;;;7183:18;;:::i;:::-;7219:2;7212:22;7269;;;7319:2;7349:11;;;7345:20;;;7269:22;7307:15;;7377:19;;;7374:39;;;7409:1;7406;7399:12;7374:39;7441:2;7437;7433:11;7422:22;;7453:196;7469:6;7464:3;7461:15;7453:196;;;7559:17;;7589:18;;;7636:2;7486:12;;;;7559:17;;-1:-1:-1;7627:12:1;7453:196;;;-1:-1:-1;7668:6:1;6505:1175;-1:-1:-1;;;;;;6505:1175:1:o;7893:1561::-;8093:6;8101;8109;8117;8125;8133;8141;8149;8157;8210:3;8198:9;8189:7;8185:23;8181:33;8178:53;;;8227:1;8224;8217:12;8178:53;8267:9;8254:23;-1:-1:-1;;;;;8292:6:1;8289:30;8286:50;;;8332:1;8329;8322:12;8286:50;8371:70;8433:7;8424:6;8413:9;8409:22;8371:70;:::i;:::-;8460:8;;-1:-1:-1;8345:96:1;-1:-1:-1;;8548:2:1;8533:18;;8520:32;-1:-1:-1;;;;;8564:32:1;;8561:52;;;8609:1;8606;8599:12;8561:52;8648:72;8712:7;8701:8;8690:9;8686:24;8648:72;:::i;:::-;8739:8;;-1:-1:-1;8622:98:1;-1:-1:-1;;8827:2:1;8812:18;;8799:32;-1:-1:-1;;;;;8843:32:1;;8840:52;;;8888:1;8885;8878:12;8840:52;8927:72;8991:7;8980:8;8969:9;8965:24;8927:72;:::i;:::-;9018:8;;-1:-1:-1;8901:98:1;-1:-1:-1;;9106:2:1;9091:18;;9078:32;-1:-1:-1;;;;;9122:32:1;;9119:52;;;9167:1;9164;9157:12;9119:52;9206:72;9270:7;9259:8;9248:9;9244:24;9206:72;:::i;:::-;9297:8;;-1:-1:-1;9180:98:1;-1:-1:-1;;9382:3:1;9367:19;;9354:33;9396:28;9354:33;9396:28;:::i;:::-;9443:5;9433:15;;;7893:1561;;;;;;;;;;;:::o;9459:374::-;9536:6;9544;9552;9605:2;9593:9;9584:7;9580:23;9576:32;9573:52;;;9621:1;9618;9611:12;9573:52;9644:29;9663:9;9644:29;:::i;:::-;9634:39;;9692:38;9726:2;9715:9;9711:18;9692:38;:::i;:::-;9459:374;;9682:48;;-1:-1:-1;;;9799:2:1;9784:18;;;;9771:32;;9459:374::o;10059:127::-;10120:10;10115:3;10111:20;10108:1;10101:31;10151:4;10148:1;10141:15;10175:4;10172:1;10165:15;10191:127;10252:10;10247:3;10243:20;10240:1;10233:31;10283:4;10280:1;10273:15;10307:4;10304:1;10297:15;10323:125;10388:9;;;10409:10;;;10406:36;;;10422:18;;:::i;10796:128::-;10863:9;;;10884:11;;;10881:37;;;10898:18;;:::i;10929:135::-;10968:3;10989:17;;;10986:43;;11009:18;;:::i;:::-;-1:-1:-1;11056:1:1;11045:13;;10929:135::o;11348:301::-;11477:3;11515:6;11509:13;11561:6;11554:4;11546:6;11542:17;11537:3;11531:37;11623:1;11587:16;;11612:13;;;-1:-1:-1;11587:16:1;11348:301;-1:-1:-1;11348:301:1:o;11654:245::-;11721:6;11774:2;11762:9;11753:7;11749:23;11745:32;11742:52;;;11790:1;11787;11780:12;11742:52;11822:9;11816:16;11841:28;11863:5;11841:28;:::i;12634:168::-;12707:9;;;12738;;12755:15;;;12749:22;;12735:37;12725:71;;12776:18;;:::i;14067:217::-;14107:1;14133;14123:132;;14177:10;14172:3;14168:20;14165:1;14158:31;14212:4;14209:1;14202:15;14240:4;14237:1;14230:15;14123:132;-1:-1:-1;14269:9:1;;14067:217::o
Swarm Source
ipfs://0832a5a51668da75d87783567e1c971179c780b02c2fd8b2f5319634e8984011
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.