More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 180 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer | 39176318 | 2 days ago | IN | 0 ETH | 0.00000062 | ||||
| Approve | 39171112 | 2 days ago | IN | 0 ETH | 0.00000016 | ||||
| Approve | 39162580 | 2 days ago | IN | 0 ETH | 0.00006114 | ||||
| Transfer | 39162577 | 2 days ago | IN | 0 ETH | 0.00000006 | ||||
| Transfer With Fe... | 39158225 | 2 days ago | IN | 0 ETH | 0.00000005 | ||||
| Approve | 39157115 | 2 days ago | IN | 0 ETH | 0.00003886 | ||||
| Transfer | 39157112 | 2 days ago | IN | 0 ETH | 0.00000004 | ||||
| Approve | 39153175 | 2 days ago | IN | 0 ETH | 0.00006111 | ||||
| Transfer | 39153172 | 2 days ago | IN | 0 ETH | 0.00000004 | ||||
| Approve | 39117106 | 3 days ago | IN | 0 ETH | 0.00006111 | ||||
| Transfer | 39117103 | 3 days ago | IN | 0 ETH | 0.00000003 | ||||
| Approve | 39116926 | 3 days ago | IN | 0 ETH | 0.00003886 | ||||
| Transfer | 39116923 | 3 days ago | IN | 0 ETH | 0.00000004 | ||||
| Transfer | 39094104 | 4 days ago | IN | 0 ETH | 0.00000006 | ||||
| Approve | 39080193 | 4 days ago | IN | 0 ETH | 0.00006127 | ||||
| Transfer | 39080190 | 4 days ago | IN | 0 ETH | 0.00000016 | ||||
| Approve | 39044939 | 5 days ago | IN | 0 ETH | 0.00006113 | ||||
| Transfer | 39044936 | 5 days ago | IN | 0 ETH | 0.00000006 | ||||
| Approve | 39035838 | 5 days ago | IN | 0 ETH | 0.00003898 | ||||
| Transfer | 39035835 | 5 days ago | IN | 0 ETH | 0.00000019 | ||||
| Transfer | 39009630 | 6 days ago | IN | 0 ETH | 0.00000011 | ||||
| Transfer | 39009460 | 6 days ago | IN | 0 ETH | 0.00000013 | ||||
| Transfer | 39009247 | 6 days ago | IN | 0 ETH | 0.00000016 | ||||
| Transfer | 39009161 | 6 days ago | IN | 0 ETH | 0.00000029 | ||||
| Approve | 39005412 | 6 days ago | IN | 0 ETH | 0.00000016 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
VottunToken
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/**
*Submitted for verification at basescan.org on 2025-01-21
*/
// SPDX-License-Identifier: MIT
pragma solidity =0.8.20 ^0.8.20;
// lib/openzeppelin-contracts/contracts/access/IAccessControl.sol
// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev The `account` is missing a role.
*/
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
/**
* @dev The caller of a function is not the expected one.
*
* NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
*/
error AccessControlBadConfirmation();
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*/
function renounceRole(bytes32 role, address callerConfirmation) external;
}
// lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
/**
* @dev Standard ERC20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
/**
* @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);
}
// lib/openzeppelin-contracts/contracts/utils/Context.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
/**
* @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;
}
}
// lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)
/**
* @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;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be NOT_ENTERED
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// Any calls to nonReentrant after this point will fail
_status = ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}
// lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// src/models/Errors.sol
/**
* @title Errors
* @author Vottun S.L
*/
/// @custom:security-contact
contract Errors {
//Common Error
error AddressCannotBeZero();
error ArraysMustHaveSameLength();
error ErrorEthTransferFailed(address sender, uint256 amount);
error ErrorOnCalculateFee();
error InvalidFeeAmount();
error InvalidPayloadSizeError();
//Staking Errors
error NotEnoughFunds();
error StakingNotInitialized();
error StakingPeriodNotFinished();
error UnstakeAlredyRequested();
error UnstakingInProcessError();
error UnstakingNotAvailableError();
error UnstakingNotAvailableUntilRequestUnstake();
error UserMinStakingAmountError();
//TokenVestingErros
error AllTokensVested();
error AmountMustBeGreaterThanZero();
error BlockTimestampManipulationDetected();
error ClaimedDuringCliffTimeError();
error DurationMustBeGreaterThanClaimFrequency();
error DurationMustBeGreaterOrEqualToCliff();
error DurationMustBeGreaterThanZero();
error IndexOutOfBounds();
error MathError();
error NotEnoughVestedPeriods();
error NotEnoughVestedTokens();
error NotEnoughWithdrawableFunds();
error OnlyBeneficiaryOrOwnerCanReleaseVestedTokens();
error ParticipantNotFound();
error VestingAlreadyRevoked();
error VestingScheduleNotExist();
error VestingRevokedError();
error VestingScheduleNotStarted();
}
// lib/openzeppelin-contracts/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
/**
* @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);
}
}
// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
// lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// lib/openzeppelin-contracts/contracts/access/AccessControl.sol
// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```solidity
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
* to enforce additional security measures for this role.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address account => bool) hasRole;
bytes32 adminRole;
}
mapping(bytes32 role => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with an {AccessControlUnauthorizedAccount} error including the required role.
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual returns (bool) {
return _roles[role].hasRole[account];
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
* is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
* is missing `role`.
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert AccessControlUnauthorizedAccount(account, role);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleGranted} event.
*/
function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleRevoked} event.
*/
function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*
* May emit a {RoleRevoked} event.
*/
function renounceRole(bytes32 role, address callerConfirmation) public virtual {
if (callerConfirmation != _msgSender()) {
revert AccessControlBadConfirmation();
}
_revokeRole(role, callerConfirmation);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
if (!hasRole(role, account)) {
_roles[role].hasRole[account] = true;
emit RoleGranted(role, account, _msgSender());
return true;
} else {
return false;
}
}
/**
* @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
if (hasRole(role, account)) {
_roles[role].hasRole[account] = false;
emit RoleRevoked(role, account, _msgSender());
return true;
} else {
return false;
}
}
}
// lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*/
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `value`.
*/
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `value`.
* - the caller must have allowance for ``from``'s tokens of at least
* `value`.
*/
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
/**
* @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
* (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
* this function.
*
* Emits a {Transfer} event.
*/
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
// Overflow check required: The rest of the code assumes that totalSupply never overflows
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
// Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
_totalSupply -= value;
}
} else {
unchecked {
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
/**
* @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
* Relies on the `_update` mechanism
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
* Relies on the `_update` mechanism.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead
*/
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
/**
* @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
/**
* @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
*
* By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
* `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
* `Approval` event during `transferFrom` operations.
*
* Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
* true using the following override:
* ```
* function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
* super._approve(owner, spender, value, true);
* }
* ```
*
* Requirements are the same as {_approve}.
*/
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `value`.
*
* Does not update the allowance value in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Does not emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}
// src/token/VottunAccessControl.sol
/**
* @title VottunAccessControl
* @author Vottun S.L
*/
/// @custom:security-contact
abstract contract VottunAccessControl is AccessControl, Ownable {
/**
* @dev ADMIN_ROLE variable definition
*/
bytes32 public constant ADMIN_ROLE = keccak256("ADMIN");
constructor(address newOwnerAddress) Ownable(newOwnerAddress) {
_grantRole(ADMIN_ROLE, newOwnerAddress);
_grantRole(ADMIN_ROLE, _msgSender());
}
/**
* @dev Add address as ADMIN
* @param adminAddressToAdd User address to add as ADMIN
*/
function grantAdminRole(address adminAddressToAdd) external onlyOwner {
_grantRole(ADMIN_ROLE, adminAddressToAdd);
}
/**
* @dev Add address as ADMIN
* @param addressToRevoke User address to revoke from ADMIN
*/
function revokeAdminRole(address addressToRevoke) external onlyOwner {
_revokeRole(ADMIN_ROLE, addressToRevoke);
}
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with an {AccessControlUnauthorizedAccount} error including the required role.
*/
modifier onlyAdminRole() {
_checkRole(ADMIN_ROLE);
_;
}
}
// src/token/VottunToken.sol
/**
* @title VottunToken
* @author Vottun S.L
*/
/// @custom:security-contact
contract VottunToken is ERC20, VottunAccessControl, ReentrancyGuard, Errors {
string private constant TOKEN_SYMBOL = "VTN";
string private constant TOKEN_NAME = "Vottun Token";
// sets the ERC20 token decimals to 18
uint8 private constant TOKEN_DECIMALS = 18;
uint256 private constant TOTAL_SUPPLY = 625e6;
uint256 private constant TOKEN_ALLOWANCE_SUPPLY = 20e6;
/**
* @dev Address used as feesReceiver
*/
address public feesReceiver;
// stores the contract operator address
address private immutable operator;
/**
* @dev Event emitted when `batchTransfer` is done, returns array of the recipients and its amounts
*/
event BatchTransfer(
address[] indexed recipients,
uint256[] indexed amounts
);
/**
* @dev Event emitted when `transferWithFees` is executed
*/
event TransferedWithFees(
address indexed to,
uint256 indexed amount,
uint256 indexed fee
);
/**
* @dev Event emitted when `changeFeesReceiver` is executed
*/
event OnFeesReceiverChange(address indexed newFeesReceiver);
/**
* @dev Event emitted when `operator` is set
*/
event OnSetOperator(address indexed operatorAddr);
/**
* @dev Event emitted when `operator` is set
*/
event OnSetFeesReceiver(address indexed newFeesReceiver);
/**
* @dev Event emitted when tokens are burned
*/
event TokensBurned(address indexed sender, uint256 indexed amountBurned);
constructor(
address newOwnerAddress,
address feesAccount
) ERC20(TOKEN_NAME, TOKEN_SYMBOL) VottunAccessControl(newOwnerAddress) {
if (feesAccount == address(0x0)) {
revert AddressCannotBeZero();
}
feesReceiver = feesAccount;
emit OnSetFeesReceiver(feesAccount);
//sets the operator
operator = _msgSender();
_mint(newOwnerAddress, 625e24);
_approve(
newOwnerAddress,
operator,
TOKEN_ALLOWANCE_SUPPLY * 10 ** TOKEN_DECIMALS
); //Sets an initial allowance
emit OnSetOperator(operator);
}
/**
* @dev ERC165 interface check function.
* @param _interfaceId Interface ID to check.
* @return bool Whether or not the interface is supported by this contract.
*/
function supportsInterface(
bytes4 _interfaceId
) public view virtual override returns (bool) {
return
_interfaceId == type(IERC165).interfaceId ||
_interfaceId == type(ERC20).interfaceId;
}
/**
* @dev allows the amount of VTN expressed by value to the operator account
* @param value the value to allow to the operator
*/
function internalAllowance(
uint256 value
) external onlyOwner returns (bool) {
return approve(operator, value * 10 ** 18);
}
/**
* @dev Function to make transfer and substract a part of the amount as a fee
* @param to recipient of the transfer
* @param amount Amount to send in wei
* @param feeAmount Part of the amount that will be substracted as a fee
*/
function transferWithFees(
address to,
uint256 amount,
uint256 feeAmount
) external onlyPayloadSize(2 * 32) {
if (to == address(0x0)) {
revert AddressCannotBeZero();
}
if (amount < feeAmount) {
revert InvalidFeeAmount();
}
uint256 amountAfterFees = amount - feeAmount;
if (feeAmount > 0) {
_transfer(_msgSender(), feesReceiver, feeAmount);
}
_transfer(_msgSender(), to, amountAfterFees);
emit TransferedWithFees(to, amount, feeAmount);
}
/**
* @dev Function to batch transfer multiple amounts to multiple recipients
* @param recipients recipients of the batch transfer
* @param amounts Amount to send in wei
*/
function batchTransfer(
address[] memory recipients,
uint256[] memory amounts
) external onlyRole(ADMIN_ROLE) onlyPayloadSize(2 * 32) {
if (recipients.length != amounts.length) {
revert ArraysMustHaveSameLength();
}
uint256 len = recipients.length;
for (uint256 i; i < len; ) {
if (recipients[i] == address(0x0)) {
revert AddressCannotBeZero();
}
_transfer(_msgSender(), recipients[i], amounts[i]);
unchecked {
++i;
}
}
emit BatchTransfer(recipients, amounts);
}
/**
* @dev transfer token for a specified address
* @param _to The address to transfer to.
* @param _value The amount to be transferred.
*/
function transfer(
address _to,
uint256 _value
) public override onlyPayloadSize(2 * 32) returns (bool) {
if (_to == address(0x0)) {
revert AddressCannotBeZero();
}
_transfer(_msgSender(), _to, _value);
return true;
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) public override onlyPayloadSize(2 * 32) returns (bool) {
if (sender == address(0x0) || recipient == address(0x0)) {
revert AddressCannotBeZero();
}
if (amount <= 0) {
revert AmountMustBeGreaterThanZero();
}
super.transferFrom(sender, recipient, amount);
return true;
}
/**
* BURNABLE
*/
/**
* @dev Destroys a `value` amount of tokens from the caller.
*
* See {ERC20-_burn}.
*/
function burn(uint256 value) external onlyOwner {
_burn(_msgSender(), value);
emit TokensBurned(_msgSender(), value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, deducting from
* the caller's allowance.
*
* See {ERC20-_burn} and {ERC20-allowance}.
*
* Requirements:
*
* - the caller must have allowance for ``accounts``'s tokens of at least
* `value`.
*/
function burnFrom(address account, uint256 value) external onlyOwner {
_spendAllowance(account, _msgSender(), value);
_burn(account, value);
emit TokensBurned(account, value);
}
/**
* Allows to change fees receiver account
* @param feesReceiverAccount new fees receiver account
*/
function changeFeesReceiver(
address feesReceiverAccount
) external onlyRole(ADMIN_ROLE) {
if (feesReceiverAccount == address(0x0)) {
revert AddressCannotBeZero();
}
feesReceiver = feesReceiverAccount;
emit OnFeesReceiverChange(feesReceiverAccount);
}
/**
* @dev Fix for the ERC20 short address attack.
*/
modifier onlyPayloadSize(uint256 size) {
if ((msg.data.length < size + 4)) {
revert InvalidPayloadSizeError();
}
_;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"newOwnerAddress","type":"address"},{"internalType":"address","name":"feesAccount","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"AddressCannotBeZero","type":"error"},{"inputs":[],"name":"AllTokensVested","type":"error"},{"inputs":[],"name":"AmountMustBeGreaterThanZero","type":"error"},{"inputs":[],"name":"ArraysMustHaveSameLength","type":"error"},{"inputs":[],"name":"BlockTimestampManipulationDetected","type":"error"},{"inputs":[],"name":"ClaimedDuringCliffTimeError","type":"error"},{"inputs":[],"name":"DurationMustBeGreaterOrEqualToCliff","type":"error"},{"inputs":[],"name":"DurationMustBeGreaterThanClaimFrequency","type":"error"},{"inputs":[],"name":"DurationMustBeGreaterThanZero","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ErrorEthTransferFailed","type":"error"},{"inputs":[],"name":"ErrorOnCalculateFee","type":"error"},{"inputs":[],"name":"IndexOutOfBounds","type":"error"},{"inputs":[],"name":"InvalidFeeAmount","type":"error"},{"inputs":[],"name":"InvalidPayloadSizeError","type":"error"},{"inputs":[],"name":"MathError","type":"error"},{"inputs":[],"name":"NotEnoughFunds","type":"error"},{"inputs":[],"name":"NotEnoughVestedPeriods","type":"error"},{"inputs":[],"name":"NotEnoughVestedTokens","type":"error"},{"inputs":[],"name":"NotEnoughWithdrawableFunds","type":"error"},{"inputs":[],"name":"OnlyBeneficiaryOrOwnerCanReleaseVestedTokens","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":[],"name":"ParticipantNotFound","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"StakingNotInitialized","type":"error"},{"inputs":[],"name":"StakingPeriodNotFinished","type":"error"},{"inputs":[],"name":"UnstakeAlredyRequested","type":"error"},{"inputs":[],"name":"UnstakingInProcessError","type":"error"},{"inputs":[],"name":"UnstakingNotAvailableError","type":"error"},{"inputs":[],"name":"UnstakingNotAvailableUntilRequestUnstake","type":"error"},{"inputs":[],"name":"UserMinStakingAmountError","type":"error"},{"inputs":[],"name":"VestingAlreadyRevoked","type":"error"},{"inputs":[],"name":"VestingRevokedError","type":"error"},{"inputs":[],"name":"VestingScheduleNotExist","type":"error"},{"inputs":[],"name":"VestingScheduleNotStarted","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address[]","name":"recipients","type":"address[]"},{"indexed":true,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"BatchTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newFeesReceiver","type":"address"}],"name":"OnFeesReceiverChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newFeesReceiver","type":"address"}],"name":"OnSetFeesReceiver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operatorAddr","type":"address"}],"name":"OnSetOperator","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":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"amountBurned","type":"uint256"}],"name":"TokensBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"TransferedWithFees","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"batchTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"feesReceiverAccount","type":"address"}],"name":"changeFeesReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feesReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"adminAddressToAdd","type":"address"}],"name":"grantAdminRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"internalAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToRevoke","type":"address"}],"name":"revokeAdminRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"transferWithFees","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a060405234801562000010575f80fd5b50604051620038cd380380620038cd833981810160405281019062000036919062000ac8565b81806040518060400160405280600c81526020017f566f7474756e20546f6b656e00000000000000000000000000000000000000008152506040518060400160405280600381526020017f56544e00000000000000000000000000000000000000000000000000000000008152508160039081620000b5919062000d71565b508060049081620000c7919062000d71565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200013d575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040162000134919062000e66565b60405180910390fd5b6200014e816200039960201b60201c565b50620001817fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42826200045c60201b60201c565b50620001c37fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42620001b76200055860201b60201c565b6200045c60201b60201c565b505060016007819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000233576040517fe622e04000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fb69a1f782251400761baf2389a836a06fd8a2764d9166c2bf71f47e2f54c728c60405160405180910390a2620002c66200055860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505062000317826b0204fce5e3e25026110000006200055f60201b60201c565b6200034c826080516012600a6200032f91906200100a565b6301312d006200034091906200105a565b620005e960201b60201c565b60805173ffffffffffffffffffffffffffffffffffffffff167fcb0711823474d83621a5d3e1a85111e6c37168a5a67465b947173dbaed95e64860405160405180910390a2505062001145565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6200046f83836200060360201b60201c565b6200054e57600160055f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550620004ea6200055860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001905062000552565b5f90505b92915050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620005d2575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401620005c9919062000e66565b60405180910390fd5b620005e55f83836200066760201b60201c565b5050565b620005fe83838360016200088b60201b60201c565b505050565b5f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620006bb578060025f828254620006ae9190620010a4565b925050819055506200078c565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101562000747578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016200073e93929190620010ef565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620007d5578060025f82825403925050819055506200081f565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200087e91906200112a565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603620008fe575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401620008f5919062000e66565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000971575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040162000968919062000e66565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550801562000a5d578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405162000a5491906200112a565b60405180910390a35b50505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000a928262000a67565b9050919050565b62000aa48162000a86565b811462000aaf575f80fd5b50565b5f8151905062000ac28162000a99565b92915050565b5f806040838503121562000ae15762000ae062000a63565b5b5f62000af08582860162000ab2565b925050602062000b038582860162000ab2565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000b8957607f821691505b60208210810362000b9f5762000b9e62000b44565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000bc6565b62000c0f868362000bc6565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000c5962000c5362000c4d8462000c27565b62000c30565b62000c27565b9050919050565b5f819050919050565b62000c748362000c39565b62000c8c62000c838262000c60565b84845462000bd2565b825550505050565b5f90565b62000ca262000c94565b62000caf81848462000c69565b505050565b5b8181101562000cd65762000cca5f8262000c98565b60018101905062000cb5565b5050565b601f82111562000d255762000cef8162000ba5565b62000cfa8462000bb7565b8101602085101562000d0a578190505b62000d2262000d198562000bb7565b83018262000cb4565b50505b505050565b5f82821c905092915050565b5f62000d475f198460080262000d2a565b1980831691505092915050565b5f62000d61838362000d36565b9150826002028217905092915050565b62000d7c8262000b0d565b67ffffffffffffffff81111562000d985762000d9762000b17565b5b62000da4825462000b71565b62000db182828562000cda565b5f60209050601f83116001811462000de7575f841562000dd2578287015190505b62000dde858262000d54565b86555062000e4d565b601f19841662000df78662000ba5565b5f5b8281101562000e205784890151825560018201915060208501945060208101905062000df9565b8683101562000e40578489015162000e3c601f89168262000d36565b8355505b6001600288020188555050505b505050505050565b62000e608162000a86565b82525050565b5f60208201905062000e7b5f83018462000e55565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111562000f0b5780860481111562000ee35762000ee262000e81565b5b600185161562000ef35780820291505b808102905062000f038562000eae565b945062000ec3565b94509492505050565b5f8262000f25576001905062000ff7565b8162000f34575f905062000ff7565b816001811462000f4d576002811462000f585762000f8e565b600191505062000ff7565b60ff84111562000f6d5762000f6c62000e81565b5b8360020a91508482111562000f875762000f8662000e81565b5b5062000ff7565b5060208310610133831016604e8410600b841016171562000fc85782820a90508381111562000fc25762000fc162000e81565b5b62000ff7565b62000fd7848484600162000eba565b9250905081840481111562000ff15762000ff062000e81565b5b81810290505b9392505050565b5f60ff82169050919050565b5f620010168262000c27565b9150620010238362000ffe565b9250620010527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000f14565b905092915050565b5f620010668262000c27565b9150620010738362000c27565b9250828202620010838162000c27565b915082820484148315176200109d576200109c62000e81565b5b5092915050565b5f620010b08262000c27565b9150620010bd8362000c27565b9250828201905080821115620010d857620010d762000e81565b5b92915050565b620010e98162000c27565b82525050565b5f606082019050620011045f83018662000e55565b620011136020830185620010de565b620011226040830184620010de565b949350505050565b5f6020820190506200113f5f830184620010de565b92915050565b60805161276f6200115e5f395f610f2b015261276f5ff3fe608060405234801561000f575f80fd5b50600436106101cd575f3560e01c806375b238fc116101025780639a19c7b0116100a0578063c634b78e1161006f578063c634b78e1461052b578063d547741f14610547578063dd62ed3e14610563578063f2fde38b14610593576101cd565b80639a19c7b0146104a3578063a217fddf146104bf578063a9059cbb146104dd578063bca93cf51461050d576101cd565b80638b1599be116100dc5780638b1599be146104075780638da5cb5b1461043757806391d148541461045557806395d89b4114610485576101cd565b806375b238fc146103b157806379cc6790146103cf57806388d695b2146103eb576101cd565b80632f2ff15d1161016f57806336568abe1161014957806336568abe1461033f57806342966c681461035b57806370a0823114610377578063715018a6146103a7576101cd565b80632f2ff15d146102e9578063313ce5671461030557806331fd9fd114610323576101cd565b8063095ea7b3116101ab578063095ea7b31461023b57806318160ddd1461026b57806323b872dd14610289578063248a9ca3146102b9576101cd565b806301ffc9a7146101d1578063060977ff1461020157806306fdde031461021d575b5f80fd5b6101eb60048036038101906101e69190611d2c565b6105af565b6040516101f89190611d71565b60405180910390f35b61021b60048036038101906102169190611e17565b610680565b005b610225610813565b6040516102329190611ef1565b60405180910390f35b61025560048036038101906102509190611f11565b6108a3565b6040516102629190611d71565b60405180910390f35b6102736108c5565b6040516102809190611f5e565b60405180910390f35b6102a3600480360381019061029e9190611f77565b6108ce565b6040516102b09190611d71565b60405180910390f35b6102d360048036038101906102ce9190611ffa565b610a07565b6040516102e09190612034565b60405180910390f35b61030360048036038101906102fe919061204d565b610a24565b005b61030d610a46565b60405161031a91906120a6565b60405180910390f35b61033d600480360381019061033891906120bf565b610a4e565b005b6103596004803603810190610354919061204d565b610b64565b005b610375600480360381019061037091906120ea565b610bdf565b005b610391600480360381019061038c91906120bf565b610c46565b60405161039e9190611f5e565b60405180910390f35b6103af610c8b565b005b6103b9610c9e565b6040516103c69190612034565b60405180910390f35b6103e960048036038101906103e49190611f11565b610cc2565b005b61040560048036038101906104009190612315565b610d2e565b005b610421600480360381019061041c91906120ea565b610f1d565b60405161042e9190611d71565b60405180910390f35b61043f610f6a565b60405161044c919061239a565b60405180910390f35b61046f600480360381019061046a919061204d565b610f92565b60405161047c9190611d71565b60405180910390f35b61048d610ff6565b60405161049a9190611ef1565b60405180910390f35b6104bd60048036038101906104b891906120bf565b611086565b005b6104c76110bc565b6040516104d49190612034565b60405180910390f35b6104f760048036038101906104f29190611f11565b6110c2565b6040516105049190611d71565b60405180910390f35b610515611190565b604051610522919061239a565b60405180910390f35b610545600480360381019061054091906120bf565b6111b5565b005b610561600480360381019061055c919061204d565b6111eb565b005b61057d600480360381019061057891906123b3565b61120d565b60405161058a9190611f5e565b60405180910390f35b6105ad60048036038101906105a891906120bf565b61128f565b005b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061067957507f942e8b22000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b604060048161068f919061241e565b5f36905010156106cb576040517fe48204a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610730576040517fe622e04000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8183101561076a576040517f52338c8000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82846107779190612451565b90505f8311156107b5576107b461078c611313565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168561131a565b5b6107c76107c0611313565b868361131a565b82848673ffffffffffffffffffffffffffffffffffffffff167fb4ca6c0bb8df42c49371da737b14f15eb4fbc74b1771651bf982ea38ad41684c60405160405180910390a45050505050565b606060038054610822906124b1565b80601f016020809104026020016040519081016040528092919081815260200182805461084e906124b1565b80156108995780601f1061087057610100808354040283529160200191610899565b820191905f5260205f20905b81548152906001019060200180831161087c57829003601f168201915b5050505050905090565b5f806108ad611313565b90506108ba81858561140a565b600191505092915050565b5f600254905090565b5f60406004816108de919061241e565b5f369050101561091a576040517fe48204a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061097f57505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b156109b6576040517fe622e04000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f83116109ef576040517f5e85ae7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109fa85858561141c565b5060019150509392505050565b5f60055f8381526020019081526020015f20600101549050919050565b610a2d82610a07565b610a368161144a565b610a40838361145e565b50505050565b5f6012905090565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42610a788161144a565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610add576040517fe622e04000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167f102f66218c8eb92bc987c36de8ddd90f751890ec8de2479e1f6e9940c712426960405160405180910390a25050565b610b6c611313565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bd0576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bda8282611548565b505050565b610be7611632565b610bf8610bf2611313565b826116b9565b80610c01611313565b73ffffffffffffffffffffffffffffffffffffffff167ffd38818f5291bf0bb3a2a48aadc06ba8757865d1dabd804585338aab3009dcb660405160405180910390a350565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610c93611632565b610c9c5f611738565b565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b610cca611632565b610cdc82610cd6611313565b836117fb565b610ce682826116b9565b808273ffffffffffffffffffffffffffffffffffffffff167ffd38818f5291bf0bb3a2a48aadc06ba8757865d1dabd804585338aab3009dcb660405160405180910390a35050565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42610d588161144a565b6040600481610d67919061241e565b5f3690501015610da3576040517fe48204a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8251845114610dde576040517f6e596f3100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f845190505f5b81811015610ebd575f73ffffffffffffffffffffffffffffffffffffffff16868281518110610e1757610e166124e1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610e6c576040517fe622e04000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eb2610e77611313565b878381518110610e8a57610e896124e1565b5b6020026020010151878481518110610ea557610ea46124e1565b5b602002602001015161131a565b806001019050610de5565b5083604051610ecc91906125bf565b604051809103902085604051610ee29190612686565b60405180910390207f2a8b481c4fd6b79532b02dcb3d102185cbfaf1fe525ae1283184c2fb15cbca1d60405160405180910390a35050505050565b5f610f26611632565b610f637f0000000000000000000000000000000000000000000000000000000000000000670de0b6b3a764000084610f5e919061269c565b6108a3565b9050919050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b606060048054611005906124b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611031906124b1565b801561107c5780601f106110535761010080835404028352916020019161107c565b820191905f5260205f20905b81548152906001019060200180831161105f57829003601f168201915b5050505050905090565b61108e611632565b6110b87fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4282611548565b5050565b5f801b81565b5f60406004816110d2919061241e565b5f369050101561110e576040517fe48204a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611173576040517fe622e04000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61118561117e611313565b858561131a565b600191505092915050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111bd611632565b6111e77fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec428261145e565b5050565b6111f482610a07565b6111fd8161144a565b6112078383611548565b50505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611297611632565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611307575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016112fe919061239a565b60405180910390fd5b61131081611738565b50565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361138a575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611381919061239a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113fa575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016113f1919061239a565b60405180910390fd5b61140583838361188d565b505050565b6114178383836001611aa6565b505050565b5f80611426611313565b90506114338582856117fb565b61143e85858561131a565b60019150509392505050565b61145b81611456611313565b611c75565b50565b5f6114698383610f92565b61153e57600160055f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506114db611313565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050611542565b5f90505b92915050565b5f6115538383610f92565b15611628575f60055f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506115c5611313565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a46001905061162c565b5f90505b92915050565b61163a611313565b73ffffffffffffffffffffffffffffffffffffffff16611658610f6a565b73ffffffffffffffffffffffffffffffffffffffff16146116b75761167b611313565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016116ae919061239a565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611729575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611720919061239a565b60405180910390fd5b611734825f8361188d565b5050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f611806848461120d565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118875781811015611878578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161186f939291906126dd565b60405180910390fd5b61188684848484035f611aa6565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118dd578060025f8282546118d1919061241e565b925050819055506119ab565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611966578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161195d939291906126dd565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119f2578060025f8282540392505081905550611a3c565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611a999190611f5e565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611b16575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611b0d919061239a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b86575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611b7d919061239a565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611c6f578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611c669190611f5e565b60405180910390a35b50505050565b611c7f8282610f92565b611cc25780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401611cb9929190612712565b60405180910390fd5b5050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d0b81611cd7565b8114611d15575f80fd5b50565b5f81359050611d2681611d02565b92915050565b5f60208284031215611d4157611d40611ccf565b5b5f611d4e84828501611d18565b91505092915050565b5f8115159050919050565b611d6b81611d57565b82525050565b5f602082019050611d845f830184611d62565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611db382611d8a565b9050919050565b611dc381611da9565b8114611dcd575f80fd5b50565b5f81359050611dde81611dba565b92915050565b5f819050919050565b611df681611de4565b8114611e00575f80fd5b50565b5f81359050611e1181611ded565b92915050565b5f805f60608486031215611e2e57611e2d611ccf565b5b5f611e3b86828701611dd0565b9350506020611e4c86828701611e03565b9250506040611e5d86828701611e03565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611e9e578082015181840152602081019050611e83565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611ec382611e67565b611ecd8185611e71565b9350611edd818560208601611e81565b611ee681611ea9565b840191505092915050565b5f6020820190508181035f830152611f098184611eb9565b905092915050565b5f8060408385031215611f2757611f26611ccf565b5b5f611f3485828601611dd0565b9250506020611f4585828601611e03565b9150509250929050565b611f5881611de4565b82525050565b5f602082019050611f715f830184611f4f565b92915050565b5f805f60608486031215611f8e57611f8d611ccf565b5b5f611f9b86828701611dd0565b9350506020611fac86828701611dd0565b9250506040611fbd86828701611e03565b9150509250925092565b5f819050919050565b611fd981611fc7565b8114611fe3575f80fd5b50565b5f81359050611ff481611fd0565b92915050565b5f6020828403121561200f5761200e611ccf565b5b5f61201c84828501611fe6565b91505092915050565b61202e81611fc7565b82525050565b5f6020820190506120475f830184612025565b92915050565b5f806040838503121561206357612062611ccf565b5b5f61207085828601611fe6565b925050602061208185828601611dd0565b9150509250929050565b5f60ff82169050919050565b6120a08161208b565b82525050565b5f6020820190506120b95f830184612097565b92915050565b5f602082840312156120d4576120d3611ccf565b5b5f6120e184828501611dd0565b91505092915050565b5f602082840312156120ff576120fe611ccf565b5b5f61210c84828501611e03565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61214f82611ea9565b810181811067ffffffffffffffff8211171561216e5761216d612119565b5b80604052505050565b5f612180611cc6565b905061218c8282612146565b919050565b5f67ffffffffffffffff8211156121ab576121aa612119565b5b602082029050602081019050919050565b5f80fd5b5f6121d26121cd84612191565b612177565b905080838252602082019050602084028301858111156121f5576121f46121bc565b5b835b8181101561221e578061220a8882611dd0565b8452602084019350506020810190506121f7565b5050509392505050565b5f82601f83011261223c5761223b612115565b5b813561224c8482602086016121c0565b91505092915050565b5f67ffffffffffffffff82111561226f5761226e612119565b5b602082029050602081019050919050565b5f61229261228d84612255565b612177565b905080838252602082019050602084028301858111156122b5576122b46121bc565b5b835b818110156122de57806122ca8882611e03565b8452602084019350506020810190506122b7565b5050509392505050565b5f82601f8301126122fc576122fb612115565b5b813561230c848260208601612280565b91505092915050565b5f806040838503121561232b5761232a611ccf565b5b5f83013567ffffffffffffffff81111561234857612347611cd3565b5b61235485828601612228565b925050602083013567ffffffffffffffff81111561237557612374611cd3565b5b612381858286016122e8565b9150509250929050565b61239481611da9565b82525050565b5f6020820190506123ad5f83018461238b565b92915050565b5f80604083850312156123c9576123c8611ccf565b5b5f6123d685828601611dd0565b92505060206123e785828601611dd0565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61242882611de4565b915061243383611de4565b925082820190508082111561244b5761244a6123f1565b5b92915050565b5f61245b82611de4565b915061246683611de4565b925082820390508181111561247e5761247d6123f1565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806124c857607f821691505b6020821081036124db576124da612484565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f81905092915050565b5f819050602082019050919050565b61253a81611de4565b82525050565b5f61254b8383612531565b60208301905092915050565b5f602082019050919050565b5f61256d8261250e565b6125778185612518565b935061258283612522565b805f5b838110156125b25781516125998882612540565b97506125a483612557565b925050600181019050612585565b5085935050505092915050565b5f6125ca8284612563565b915081905092915050565b5f81519050919050565b5f81905092915050565b5f819050602082019050919050565b61260181611da9565b82525050565b5f61261283836125f8565b60208301905092915050565b5f602082019050919050565b5f612634826125d5565b61263e81856125df565b9350612649836125e9565b805f5b838110156126795781516126608882612607565b975061266b8361261e565b92505060018101905061264c565b5085935050505092915050565b5f612691828461262a565b915081905092915050565b5f6126a682611de4565b91506126b183611de4565b92508282026126bf81611de4565b915082820484148315176126d6576126d56123f1565b5b5092915050565b5f6060820190506126f05f83018661238b565b6126fd6020830185611f4f565b61270a6040830184611f4f565b949350505050565b5f6040820190506127255f83018561238b565b6127326020830184612025565b939250505056fea26469706673582212203f545a0f0ec1184eefd70cb5243368daa1c66d773b2bb326feecffb10700c36a64736f6c63430008140033000000000000000000000000e507e342c2225ed4141a2b9b3e6bf74a1f3dfcaf00000000000000000000000032935a0dd340521a828066f7d69d0501e54c60cd
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101cd575f3560e01c806375b238fc116101025780639a19c7b0116100a0578063c634b78e1161006f578063c634b78e1461052b578063d547741f14610547578063dd62ed3e14610563578063f2fde38b14610593576101cd565b80639a19c7b0146104a3578063a217fddf146104bf578063a9059cbb146104dd578063bca93cf51461050d576101cd565b80638b1599be116100dc5780638b1599be146104075780638da5cb5b1461043757806391d148541461045557806395d89b4114610485576101cd565b806375b238fc146103b157806379cc6790146103cf57806388d695b2146103eb576101cd565b80632f2ff15d1161016f57806336568abe1161014957806336568abe1461033f57806342966c681461035b57806370a0823114610377578063715018a6146103a7576101cd565b80632f2ff15d146102e9578063313ce5671461030557806331fd9fd114610323576101cd565b8063095ea7b3116101ab578063095ea7b31461023b57806318160ddd1461026b57806323b872dd14610289578063248a9ca3146102b9576101cd565b806301ffc9a7146101d1578063060977ff1461020157806306fdde031461021d575b5f80fd5b6101eb60048036038101906101e69190611d2c565b6105af565b6040516101f89190611d71565b60405180910390f35b61021b60048036038101906102169190611e17565b610680565b005b610225610813565b6040516102329190611ef1565b60405180910390f35b61025560048036038101906102509190611f11565b6108a3565b6040516102629190611d71565b60405180910390f35b6102736108c5565b6040516102809190611f5e565b60405180910390f35b6102a3600480360381019061029e9190611f77565b6108ce565b6040516102b09190611d71565b60405180910390f35b6102d360048036038101906102ce9190611ffa565b610a07565b6040516102e09190612034565b60405180910390f35b61030360048036038101906102fe919061204d565b610a24565b005b61030d610a46565b60405161031a91906120a6565b60405180910390f35b61033d600480360381019061033891906120bf565b610a4e565b005b6103596004803603810190610354919061204d565b610b64565b005b610375600480360381019061037091906120ea565b610bdf565b005b610391600480360381019061038c91906120bf565b610c46565b60405161039e9190611f5e565b60405180910390f35b6103af610c8b565b005b6103b9610c9e565b6040516103c69190612034565b60405180910390f35b6103e960048036038101906103e49190611f11565b610cc2565b005b61040560048036038101906104009190612315565b610d2e565b005b610421600480360381019061041c91906120ea565b610f1d565b60405161042e9190611d71565b60405180910390f35b61043f610f6a565b60405161044c919061239a565b60405180910390f35b61046f600480360381019061046a919061204d565b610f92565b60405161047c9190611d71565b60405180910390f35b61048d610ff6565b60405161049a9190611ef1565b60405180910390f35b6104bd60048036038101906104b891906120bf565b611086565b005b6104c76110bc565b6040516104d49190612034565b60405180910390f35b6104f760048036038101906104f29190611f11565b6110c2565b6040516105049190611d71565b60405180910390f35b610515611190565b604051610522919061239a565b60405180910390f35b610545600480360381019061054091906120bf565b6111b5565b005b610561600480360381019061055c919061204d565b6111eb565b005b61057d600480360381019061057891906123b3565b61120d565b60405161058a9190611f5e565b60405180910390f35b6105ad60048036038101906105a891906120bf565b61128f565b005b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061067957507f942e8b22000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b604060048161068f919061241e565b5f36905010156106cb576040517fe48204a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610730576040517fe622e04000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8183101561076a576040517f52338c8000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82846107779190612451565b90505f8311156107b5576107b461078c611313565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168561131a565b5b6107c76107c0611313565b868361131a565b82848673ffffffffffffffffffffffffffffffffffffffff167fb4ca6c0bb8df42c49371da737b14f15eb4fbc74b1771651bf982ea38ad41684c60405160405180910390a45050505050565b606060038054610822906124b1565b80601f016020809104026020016040519081016040528092919081815260200182805461084e906124b1565b80156108995780601f1061087057610100808354040283529160200191610899565b820191905f5260205f20905b81548152906001019060200180831161087c57829003601f168201915b5050505050905090565b5f806108ad611313565b90506108ba81858561140a565b600191505092915050565b5f600254905090565b5f60406004816108de919061241e565b5f369050101561091a576040517fe48204a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061097f57505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b156109b6576040517fe622e04000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f83116109ef576040517f5e85ae7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109fa85858561141c565b5060019150509392505050565b5f60055f8381526020019081526020015f20600101549050919050565b610a2d82610a07565b610a368161144a565b610a40838361145e565b50505050565b5f6012905090565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42610a788161144a565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610add576040517fe622e04000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167f102f66218c8eb92bc987c36de8ddd90f751890ec8de2479e1f6e9940c712426960405160405180910390a25050565b610b6c611313565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bd0576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bda8282611548565b505050565b610be7611632565b610bf8610bf2611313565b826116b9565b80610c01611313565b73ffffffffffffffffffffffffffffffffffffffff167ffd38818f5291bf0bb3a2a48aadc06ba8757865d1dabd804585338aab3009dcb660405160405180910390a350565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610c93611632565b610c9c5f611738565b565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b610cca611632565b610cdc82610cd6611313565b836117fb565b610ce682826116b9565b808273ffffffffffffffffffffffffffffffffffffffff167ffd38818f5291bf0bb3a2a48aadc06ba8757865d1dabd804585338aab3009dcb660405160405180910390a35050565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42610d588161144a565b6040600481610d67919061241e565b5f3690501015610da3576040517fe48204a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8251845114610dde576040517f6e596f3100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f845190505f5b81811015610ebd575f73ffffffffffffffffffffffffffffffffffffffff16868281518110610e1757610e166124e1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610e6c576040517fe622e04000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eb2610e77611313565b878381518110610e8a57610e896124e1565b5b6020026020010151878481518110610ea557610ea46124e1565b5b602002602001015161131a565b806001019050610de5565b5083604051610ecc91906125bf565b604051809103902085604051610ee29190612686565b60405180910390207f2a8b481c4fd6b79532b02dcb3d102185cbfaf1fe525ae1283184c2fb15cbca1d60405160405180910390a35050505050565b5f610f26611632565b610f637f0000000000000000000000000e60b83f83c5d2684ace779dea8a957e91d02475670de0b6b3a764000084610f5e919061269c565b6108a3565b9050919050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b606060048054611005906124b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611031906124b1565b801561107c5780601f106110535761010080835404028352916020019161107c565b820191905f5260205f20905b81548152906001019060200180831161105f57829003601f168201915b5050505050905090565b61108e611632565b6110b87fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4282611548565b5050565b5f801b81565b5f60406004816110d2919061241e565b5f369050101561110e576040517fe48204a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611173576040517fe622e04000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61118561117e611313565b858561131a565b600191505092915050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111bd611632565b6111e77fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec428261145e565b5050565b6111f482610a07565b6111fd8161144a565b6112078383611548565b50505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611297611632565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611307575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016112fe919061239a565b60405180910390fd5b61131081611738565b50565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361138a575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611381919061239a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113fa575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016113f1919061239a565b60405180910390fd5b61140583838361188d565b505050565b6114178383836001611aa6565b505050565b5f80611426611313565b90506114338582856117fb565b61143e85858561131a565b60019150509392505050565b61145b81611456611313565b611c75565b50565b5f6114698383610f92565b61153e57600160055f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506114db611313565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050611542565b5f90505b92915050565b5f6115538383610f92565b15611628575f60055f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506115c5611313565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a46001905061162c565b5f90505b92915050565b61163a611313565b73ffffffffffffffffffffffffffffffffffffffff16611658610f6a565b73ffffffffffffffffffffffffffffffffffffffff16146116b75761167b611313565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016116ae919061239a565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611729575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611720919061239a565b60405180910390fd5b611734825f8361188d565b5050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f611806848461120d565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118875781811015611878578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161186f939291906126dd565b60405180910390fd5b61188684848484035f611aa6565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118dd578060025f8282546118d1919061241e565b925050819055506119ab565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611966578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161195d939291906126dd565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119f2578060025f8282540392505081905550611a3c565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611a999190611f5e565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611b16575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611b0d919061239a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b86575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611b7d919061239a565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611c6f578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611c669190611f5e565b60405180910390a35b50505050565b611c7f8282610f92565b611cc25780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401611cb9929190612712565b60405180910390fd5b5050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d0b81611cd7565b8114611d15575f80fd5b50565b5f81359050611d2681611d02565b92915050565b5f60208284031215611d4157611d40611ccf565b5b5f611d4e84828501611d18565b91505092915050565b5f8115159050919050565b611d6b81611d57565b82525050565b5f602082019050611d845f830184611d62565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611db382611d8a565b9050919050565b611dc381611da9565b8114611dcd575f80fd5b50565b5f81359050611dde81611dba565b92915050565b5f819050919050565b611df681611de4565b8114611e00575f80fd5b50565b5f81359050611e1181611ded565b92915050565b5f805f60608486031215611e2e57611e2d611ccf565b5b5f611e3b86828701611dd0565b9350506020611e4c86828701611e03565b9250506040611e5d86828701611e03565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611e9e578082015181840152602081019050611e83565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611ec382611e67565b611ecd8185611e71565b9350611edd818560208601611e81565b611ee681611ea9565b840191505092915050565b5f6020820190508181035f830152611f098184611eb9565b905092915050565b5f8060408385031215611f2757611f26611ccf565b5b5f611f3485828601611dd0565b9250506020611f4585828601611e03565b9150509250929050565b611f5881611de4565b82525050565b5f602082019050611f715f830184611f4f565b92915050565b5f805f60608486031215611f8e57611f8d611ccf565b5b5f611f9b86828701611dd0565b9350506020611fac86828701611dd0565b9250506040611fbd86828701611e03565b9150509250925092565b5f819050919050565b611fd981611fc7565b8114611fe3575f80fd5b50565b5f81359050611ff481611fd0565b92915050565b5f6020828403121561200f5761200e611ccf565b5b5f61201c84828501611fe6565b91505092915050565b61202e81611fc7565b82525050565b5f6020820190506120475f830184612025565b92915050565b5f806040838503121561206357612062611ccf565b5b5f61207085828601611fe6565b925050602061208185828601611dd0565b9150509250929050565b5f60ff82169050919050565b6120a08161208b565b82525050565b5f6020820190506120b95f830184612097565b92915050565b5f602082840312156120d4576120d3611ccf565b5b5f6120e184828501611dd0565b91505092915050565b5f602082840312156120ff576120fe611ccf565b5b5f61210c84828501611e03565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61214f82611ea9565b810181811067ffffffffffffffff8211171561216e5761216d612119565b5b80604052505050565b5f612180611cc6565b905061218c8282612146565b919050565b5f67ffffffffffffffff8211156121ab576121aa612119565b5b602082029050602081019050919050565b5f80fd5b5f6121d26121cd84612191565b612177565b905080838252602082019050602084028301858111156121f5576121f46121bc565b5b835b8181101561221e578061220a8882611dd0565b8452602084019350506020810190506121f7565b5050509392505050565b5f82601f83011261223c5761223b612115565b5b813561224c8482602086016121c0565b91505092915050565b5f67ffffffffffffffff82111561226f5761226e612119565b5b602082029050602081019050919050565b5f61229261228d84612255565b612177565b905080838252602082019050602084028301858111156122b5576122b46121bc565b5b835b818110156122de57806122ca8882611e03565b8452602084019350506020810190506122b7565b5050509392505050565b5f82601f8301126122fc576122fb612115565b5b813561230c848260208601612280565b91505092915050565b5f806040838503121561232b5761232a611ccf565b5b5f83013567ffffffffffffffff81111561234857612347611cd3565b5b61235485828601612228565b925050602083013567ffffffffffffffff81111561237557612374611cd3565b5b612381858286016122e8565b9150509250929050565b61239481611da9565b82525050565b5f6020820190506123ad5f83018461238b565b92915050565b5f80604083850312156123c9576123c8611ccf565b5b5f6123d685828601611dd0565b92505060206123e785828601611dd0565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61242882611de4565b915061243383611de4565b925082820190508082111561244b5761244a6123f1565b5b92915050565b5f61245b82611de4565b915061246683611de4565b925082820390508181111561247e5761247d6123f1565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806124c857607f821691505b6020821081036124db576124da612484565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f81905092915050565b5f819050602082019050919050565b61253a81611de4565b82525050565b5f61254b8383612531565b60208301905092915050565b5f602082019050919050565b5f61256d8261250e565b6125778185612518565b935061258283612522565b805f5b838110156125b25781516125998882612540565b97506125a483612557565b925050600181019050612585565b5085935050505092915050565b5f6125ca8284612563565b915081905092915050565b5f81519050919050565b5f81905092915050565b5f819050602082019050919050565b61260181611da9565b82525050565b5f61261283836125f8565b60208301905092915050565b5f602082019050919050565b5f612634826125d5565b61263e81856125df565b9350612649836125e9565b805f5b838110156126795781516126608882612607565b975061266b8361261e565b92505060018101905061264c565b5085935050505092915050565b5f612691828461262a565b915081905092915050565b5f6126a682611de4565b91506126b183611de4565b92508282026126bf81611de4565b915082820484148315176126d6576126d56123f1565b5b5092915050565b5f6060820190506126f05f83018661238b565b6126fd6020830185611f4f565b61270a6040830184611f4f565b949350505050565b5f6040820190506127255f83018561238b565b6127326020830184612025565b939250505056fea26469706673582212203f545a0f0ec1184eefd70cb5243368daa1c66d773b2bb326feecffb10700c36a64736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e507e342c2225ed4141a2b9b3e6bf74a1f3dfcaf00000000000000000000000032935a0dd340521a828066f7d69d0501e54c60cd
-----Decoded View---------------
Arg [0] : newOwnerAddress (address): 0xE507e342c2225eD4141A2B9B3e6bF74a1F3dFcaf
Arg [1] : feesAccount (address): 0x32935A0Dd340521a828066F7D69d0501e54c60cD
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000e507e342c2225ed4141a2b9b3e6bf74a1f3dfcaf
Arg [1] : 00000000000000000000000032935a0dd340521a828066f7d69d0501e54c60cd
Deployed Bytecode Sourcemap
44235:7215:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46671:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47506:596;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33510:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35803:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34612:99;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49447:462;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28251:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28683:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34463:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50887:319;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29820:251;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50073:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34774:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22050:103;;;:::i;:::-;;43107:55;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50544:209;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48312:656;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47078:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21375:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27267:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33720:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43713:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26579:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49145:294;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44693:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43460:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29114:140;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35342:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22308:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46671:244;46773:4;46826:25;46810:41;;;:12;:41;;;;:97;;;;46884:23;46868:39;;;:12;:39;;;;46810:97;46790:117;;46671:244;;;:::o;47506:596::-;47638:6;51365:1;51358:4;:8;;;;:::i;:::-;51340;;:15;;:26;51335:93;;;51391:25;;;;;;;;;;;;;;51335:93;47675:3:::1;47661:18;;:2;:18;;::::0;47657:79:::1;;47703:21;;;;;;;;;;;;;;47657:79;47759:9;47750:6;:18;47746:76;;;47792:18;;;;;;;;;;;;;;47746:76;47832:23;47867:9;47858:6;:18;;;;:::i;:::-;47832:44;;47903:1;47891:9;:13;47887:94;;;47921:48;47931:12;:10;:12::i;:::-;47945;;;;;;;;;;;47959:9;47921;:48::i;:::-;47887:94;47993:44;48003:12;:10;:12::i;:::-;48017:2;48021:15;47993:9;:44::i;:::-;48084:9;48076:6;48072:2;48053:41;;;;;;;;;;;;47646:456;47506:596:::0;;;;:::o;33510:91::-;33555:13;33588:5;33581:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33510:91;:::o;35803:190::-;35876:4;35893:13;35909:12;:10;:12::i;:::-;35893:28;;35932:31;35941:5;35948:7;35957:5;35932:8;:31::i;:::-;35981:4;35974:11;;;35803:190;;;;:::o;34612:99::-;34664:7;34691:12;;34684:19;;34612:99;:::o;49447:462::-;49603:4;49586:6;51365:1;51358:4;:8;;;;:::i;:::-;51340;;:15;;:26;51335:93;;;51391:25;;;;;;;;;;;;;;51335:93;49642:3:::1;49624:22;;:6;:22;;;:51;;;;49671:3;49650:25;;:9;:25;;;49624:51;49620:112;;;49699:21;;;;;;;;;;;;;;49620:112;49756:1;49746:6;:11;49742:80;;49781:29;;;;;;;;;;;;;;49742:80;49834:45;49853:6;49861:9;49872:6;49834:18;:45::i;:::-;;49897:4;49890:11;;49447:462:::0;;;;;;:::o;28251:122::-;28316:7;28343:6;:12;28350:4;28343:12;;;;;;;;;;;:22;;;28336:29;;28251:122;;;:::o;28683:138::-;28757:18;28770:4;28757:12;:18::i;:::-;26863:16;26874:4;26863:10;:16::i;:::-;28788:25:::1;28799:4;28805:7;28788:10;:25::i;:::-;;28683:138:::0;;;:::o;34463:84::-;34512:5;34537:2;34530:9;;34463:84;:::o;50887:319::-;43144:18;26863:16;26874:4;26863:10;:16::i;:::-;51036:3:::1;51005:35;;:19;:35;;::::0;51001:96:::1;;51064:21;;;;;;;;;;;;;;51001:96;51122:19;51107:12;;:34;;;;;;;;;;;;;;;;;;51178:19;51157:41;;;;;;;;;;;;50887:319:::0;;:::o;29820:251::-;29936:12;:10;:12::i;:::-;29914:34;;:18;:34;;;29910:104;;29972:30;;;;;;;;;;;;;;29910:104;30026:37;30038:4;30044:18;30026:11;:37::i;:::-;;29820:251;;:::o;50073:142::-;21261:13;:11;:13::i;:::-;50132:26:::1;50138:12;:10;:12::i;:::-;50152:5;50132;:26::i;:::-;50201:5;50187:12;:10;:12::i;:::-;50174:33;;;;;;;;;;;;50073:142:::0;:::o;34774:118::-;34839:7;34866:9;:18;34876:7;34866:18;;;;;;;;;;;;;;;;34859:25;;34774:118;;;:::o;22050:103::-;21261:13;:11;:13::i;:::-;22115:30:::1;22142:1;22115:18;:30::i;:::-;22050:103::o:0;43107:55::-;43144:18;43107:55;:::o;50544:209::-;21261:13;:11;:13::i;:::-;50624:45:::1;50640:7;50649:12;:10;:12::i;:::-;50663:5;50624:15;:45::i;:::-;50680:21;50686:7;50695:5;50680;:21::i;:::-;50739:5;50730:7;50717:28;;;;;;;;;;;;50544:209:::0;;:::o;48312:656::-;43144:18;26863:16;26874:4;26863:10;:16::i;:::-;48461:6:::1;51365:1;51358:4;:8;;;;:::i;:::-;51340;;:15;;:26;51335:93;;;51391:25;;;;;;;;;;;;;;51335:93;48505:7:::2;:14;48484:10;:17;:35;48480:101;;48543:26;;;;;;;;;;;;;;48480:101;48591:11;48605:10;:17;48591:31;;48638:9;48633:278;48653:3;48649:1;:7;48633:278;;;48704:3;48679:29;;:10;48690:1;48679:13;;;;;;;;:::i;:::-;;;;;;;;:29;;::::0;48675:98:::2;;48736:21;;;;;;;;;;;;;;48675:98;48787:50;48797:12;:10;:12::i;:::-;48811:10;48822:1;48811:13;;;;;;;;:::i;:::-;;;;;;;;48826:7;48834:1;48826:10;;;;;;;;:::i;:::-;;;;;;;;48787:9;:50::i;:::-;48881:3;;;;;48633:278;;;;48952:7;48926:34;;;;;;:::i;:::-;;;;;;;;48940:10;48926:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;48469:499;26890:1:::1;48312:656:::0;;;:::o;47078:153::-;47164:4;21261:13;:11;:13::i;:::-;47188:35:::1;47196:8;47214;47206:5;:16;;;;:::i;:::-;47188:7;:35::i;:::-;47181:42;;47078:153:::0;;;:::o;21375:87::-;21421:7;21448:6;;;;;;;;;;;21441:13;;21375:87;:::o;27267:138::-;27344:4;27368:6;:12;27375:4;27368:12;;;;;;;;;;;:20;;:29;27389:7;27368:29;;;;;;;;;;;;;;;;;;;;;;;;;27361:36;;27267:138;;;;:::o;33720:95::-;33767:13;33800:7;33793:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33720:95;:::o;43713:128::-;21261:13;:11;:13::i;:::-;43793:40:::1;43144:18;43817:15;43793:11;:40::i;:::-;;43713:128:::0;:::o;26579:49::-;26624:4;26579:49;;;:::o;49145:294::-;49266:4;49249:6;51365:1;51358:4;:8;;;;:::i;:::-;51340;;:15;;:26;51335:93;;;51391:25;;;;;;;;;;;;;;51335:93;49302:3:::1;49287:19;;:3;:19;;::::0;49283:80:::1;;49330:21;;;;;;;;;;;;;;49283:80;49373:36;49383:12;:10;:12::i;:::-;49397:3;49402:6;49373:9;:36::i;:::-;49427:4;49420:11;;49145:294:::0;;;;;:::o;44693:27::-;;;;;;;;;;;;;:::o;43460:130::-;21261:13;:11;:13::i;:::-;43541:41:::1;43144:18;43564:17;43541:10;:41::i;:::-;;43460:130:::0;:::o;29114:140::-;29189:18;29202:4;29189:12;:18::i;:::-;26863:16;26874:4;26863:10;:16::i;:::-;29220:26:::1;29232:4;29238:7;29220:11;:26::i;:::-;;29114:140:::0;;;:::o;35342:142::-;35422:7;35449:11;:18;35461:5;35449:18;;;;;;;;;;;;;;;:27;35468:7;35449:27;;;;;;;;;;;;;;;;35442:34;;35342:142;;;;:::o;22308:220::-;21261:13;:11;:13::i;:::-;22413:1:::1;22393:22;;:8;:22;;::::0;22389:93:::1;;22467:1;22439:31;;;;;;;;;;;:::i;:::-;;;;;;;;22389:93;22492:28;22511:8;22492:18;:28::i;:::-;22308:220:::0;:::o;13682:98::-;13735:7;13762:10;13755:17;;13682:98;:::o;37205:308::-;37305:1;37289:18;;:4;:18;;;37285:88;;37358:1;37331:30;;;;;;;;;;;:::i;:::-;;;;;;;;37285:88;37401:1;37387:16;;:2;:16;;;37383:88;;37456:1;37427:32;;;;;;;;;;;:::i;:::-;;;;;;;;37383:88;37481:24;37489:4;37495:2;37499:5;37481:7;:24::i;:::-;37205:308;;;:::o;40630:130::-;40715:37;40724:5;40731:7;40740:5;40747:4;40715:8;:37::i;:::-;40630:130;;;:::o;36571:249::-;36658:4;36675:15;36693:12;:10;:12::i;:::-;36675:30;;36716:37;36732:4;36738:7;36747:5;36716:15;:37::i;:::-;36764:26;36774:4;36780:2;36784:5;36764:9;:26::i;:::-;36808:4;36801:11;;;36571:249;;;;;:::o;27620:105::-;27687:30;27698:4;27704:12;:10;:12::i;:::-;27687:10;:30::i;:::-;27620:105;:::o;30697:324::-;30774:4;30796:22;30804:4;30810:7;30796;:22::i;:::-;30791:223;;30867:4;30835:6;:12;30842:4;30835:12;;;;;;;;;;;:20;;:29;30856:7;30835:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;30918:12;:10;:12::i;:::-;30891:40;;30909:7;30891:40;;30903:4;30891:40;;;;;;;;;;30953:4;30946:11;;;;30791:223;30997:5;30990:12;;30697:324;;;;;:::o;31265:325::-;31343:4;31364:22;31372:4;31378:7;31364;:22::i;:::-;31360:223;;;31435:5;31403:6;:12;31410:4;31403:12;;;;;;;;;;;:20;;:29;31424:7;31403:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;31487:12;:10;:12::i;:::-;31460:40;;31478:7;31460:40;;31472:4;31460:40;;;;;;;;;;31522:4;31515:11;;;;31360:223;31566:5;31559:12;;31265:325;;;;;:::o;21540:166::-;21611:12;:10;:12::i;:::-;21600:23;;:7;:5;:7::i;:::-;:23;;;21596:103;;21674:12;:10;:12::i;:::-;21647:40;;;;;;;;;;;:::i;:::-;;;;;;;;21596:103;21540:166::o;39866:211::-;39956:1;39937:21;;:7;:21;;;39933:91;;40009:1;39982:30;;;;;;;;;;;:::i;:::-;;;;;;;;39933:91;40034:35;40042:7;40059:1;40063:5;40034:7;:35::i;:::-;39866:211;;:::o;22688:191::-;22762:16;22781:6;;;;;;;;;;;22762:25;;22807:8;22798:6;;:17;;;;;;;;;;;;;;;;;;22862:8;22831:40;;22852:8;22831:40;;;;;;;;;;;;22751:128;22688:191;:::o;42346:487::-;42446:24;42473:25;42483:5;42490:7;42473:9;:25::i;:::-;42446:52;;42533:17;42513:16;:37;42509:317;;42590:5;42571:16;:24;42567:132;;;42650:7;42659:16;42677:5;42623:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;42567:132;42742:57;42751:5;42758:7;42786:5;42767:16;:24;42793:5;42742:8;:57::i;:::-;42509:317;42435:398;42346:487;;;:::o;37837:1135::-;37943:1;37927:18;;:4;:18;;;37923:552;;38081:5;38065:12;;:21;;;;;;;:::i;:::-;;;;;;;;37923:552;;;38119:19;38141:9;:15;38151:4;38141:15;;;;;;;;;;;;;;;;38119:37;;38189:5;38175:11;:19;38171:117;;;38247:4;38253:11;38266:5;38222:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;38171:117;38443:5;38429:11;:19;38411:9;:15;38421:4;38411:15;;;;;;;;;;;;;;;:37;;;;38104:371;37923:552;38505:1;38491:16;;:2;:16;;;38487:435;;38673:5;38657:12;;:21;;;;;;;;;;;38487:435;;;38890:5;38873:9;:13;38883:2;38873:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;38487:435;38954:2;38939:25;;38948:4;38939:25;;;38958:5;38939:25;;;;;;:::i;:::-;;;;;;;;37837:1135;;;:::o;41611:443::-;41741:1;41724:19;;:5;:19;;;41720:91;;41796:1;41767:32;;;;;;;;;;;:::i;:::-;;;;;;;;41720:91;41844:1;41825:21;;:7;:21;;;41821:92;;41898:1;41870:31;;;;;;;;;;;:::i;:::-;;;;;;;;41821:92;41953:5;41923:11;:18;41935:5;41923:18;;;;;;;;;;;;;;;:27;41942:7;41923:27;;;;;;;;;;;;;;;:35;;;;41973:9;41969:78;;;42020:7;42004:31;;42013:5;42004:31;;;42029:5;42004:31;;;;;;:::i;:::-;;;;;;;;41969:78;41611:443;;;;:::o;27861:201::-;27950:22;27958:4;27964:7;27950;:22::i;:::-;27945:110;;28029:7;28038:4;27996:47;;;;;;;;;;;;:::i;:::-;;;;;;;;27945:110;27861:201;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:77::-;2062:7;2091:5;2080:16;;2025:77;;;:::o;2108:122::-;2181:24;2199:5;2181:24;:::i;:::-;2174:5;2171:35;2161:63;;2220:1;2217;2210:12;2161:63;2108:122;:::o;2236:139::-;2282:5;2320:6;2307:20;2298:29;;2336:33;2363:5;2336:33;:::i;:::-;2236:139;;;;:::o;2381:619::-;2458:6;2466;2474;2523:2;2511:9;2502:7;2498:23;2494:32;2491:119;;;2529:79;;:::i;:::-;2491:119;2649:1;2674:53;2719:7;2710:6;2699:9;2695:22;2674:53;:::i;:::-;2664:63;;2620:117;2776:2;2802:53;2847:7;2838:6;2827:9;2823:22;2802:53;:::i;:::-;2792:63;;2747:118;2904:2;2930:53;2975:7;2966:6;2955:9;2951:22;2930:53;:::i;:::-;2920:63;;2875:118;2381:619;;;;;:::o;3006:99::-;3058:6;3092:5;3086:12;3076:22;;3006:99;;;:::o;3111:169::-;3195:11;3229:6;3224:3;3217:19;3269:4;3264:3;3260:14;3245:29;;3111:169;;;;:::o;3286:246::-;3367:1;3377:113;3391:6;3388:1;3385:13;3377:113;;;3476:1;3471:3;3467:11;3461:18;3457:1;3452:3;3448:11;3441:39;3413:2;3410:1;3406:10;3401:15;;3377:113;;;3524:1;3515:6;3510:3;3506:16;3499:27;3348:184;3286:246;;;:::o;3538:102::-;3579:6;3630:2;3626:7;3621:2;3614:5;3610:14;3606:28;3596:38;;3538:102;;;:::o;3646:377::-;3734:3;3762:39;3795:5;3762:39;:::i;:::-;3817:71;3881:6;3876:3;3817:71;:::i;:::-;3810:78;;3897:65;3955:6;3950:3;3943:4;3936:5;3932:16;3897:65;:::i;:::-;3987:29;4009:6;3987:29;:::i;:::-;3982:3;3978:39;3971:46;;3738:285;3646:377;;;;:::o;4029:313::-;4142:4;4180:2;4169:9;4165:18;4157:26;;4229:9;4223:4;4219:20;4215:1;4204:9;4200:17;4193:47;4257:78;4330:4;4321:6;4257:78;:::i;:::-;4249:86;;4029:313;;;;:::o;4348:474::-;4416:6;4424;4473:2;4461:9;4452:7;4448:23;4444:32;4441:119;;;4479:79;;:::i;:::-;4441:119;4599:1;4624:53;4669:7;4660:6;4649:9;4645:22;4624:53;:::i;:::-;4614:63;;4570:117;4726:2;4752:53;4797:7;4788:6;4777:9;4773:22;4752:53;:::i;:::-;4742:63;;4697:118;4348:474;;;;;:::o;4828:118::-;4915:24;4933:5;4915:24;:::i;:::-;4910:3;4903:37;4828:118;;:::o;4952:222::-;5045:4;5083:2;5072:9;5068:18;5060:26;;5096:71;5164:1;5153:9;5149:17;5140:6;5096:71;:::i;:::-;4952:222;;;;:::o;5180:619::-;5257:6;5265;5273;5322:2;5310:9;5301:7;5297:23;5293:32;5290:119;;;5328:79;;:::i;:::-;5290:119;5448:1;5473:53;5518:7;5509:6;5498:9;5494:22;5473:53;:::i;:::-;5463:63;;5419:117;5575:2;5601:53;5646:7;5637:6;5626:9;5622:22;5601:53;:::i;:::-;5591:63;;5546:118;5703:2;5729:53;5774:7;5765:6;5754:9;5750:22;5729:53;:::i;:::-;5719:63;;5674:118;5180:619;;;;;:::o;5805:77::-;5842:7;5871:5;5860:16;;5805:77;;;:::o;5888:122::-;5961:24;5979:5;5961:24;:::i;:::-;5954:5;5951:35;5941:63;;6000:1;5997;5990:12;5941:63;5888:122;:::o;6016:139::-;6062:5;6100:6;6087:20;6078:29;;6116:33;6143:5;6116:33;:::i;:::-;6016:139;;;;:::o;6161:329::-;6220:6;6269:2;6257:9;6248:7;6244:23;6240:32;6237:119;;;6275:79;;:::i;:::-;6237:119;6395:1;6420:53;6465:7;6456:6;6445:9;6441:22;6420:53;:::i;:::-;6410:63;;6366:117;6161:329;;;;:::o;6496:118::-;6583:24;6601:5;6583:24;:::i;:::-;6578:3;6571:37;6496:118;;:::o;6620:222::-;6713:4;6751:2;6740:9;6736:18;6728:26;;6764:71;6832:1;6821:9;6817:17;6808:6;6764:71;:::i;:::-;6620:222;;;;:::o;6848:474::-;6916:6;6924;6973:2;6961:9;6952:7;6948:23;6944:32;6941:119;;;6979:79;;:::i;:::-;6941:119;7099:1;7124:53;7169:7;7160:6;7149:9;7145:22;7124:53;:::i;:::-;7114:63;;7070:117;7226:2;7252:53;7297:7;7288:6;7277:9;7273:22;7252:53;:::i;:::-;7242:63;;7197:118;6848:474;;;;;:::o;7328:86::-;7363:7;7403:4;7396:5;7392:16;7381:27;;7328:86;;;:::o;7420:112::-;7503:22;7519:5;7503:22;:::i;:::-;7498:3;7491:35;7420:112;;:::o;7538:214::-;7627:4;7665:2;7654:9;7650:18;7642:26;;7678:67;7742:1;7731:9;7727:17;7718:6;7678:67;:::i;:::-;7538:214;;;;:::o;7758:329::-;7817:6;7866:2;7854:9;7845:7;7841:23;7837:32;7834:119;;;7872:79;;:::i;:::-;7834:119;7992:1;8017:53;8062:7;8053:6;8042:9;8038:22;8017:53;:::i;:::-;8007:63;;7963:117;7758:329;;;;:::o;8093:::-;8152:6;8201:2;8189:9;8180:7;8176:23;8172:32;8169:119;;;8207:79;;:::i;:::-;8169:119;8327:1;8352:53;8397:7;8388:6;8377:9;8373:22;8352:53;:::i;:::-;8342:63;;8298:117;8093:329;;;;:::o;8428:117::-;8537:1;8534;8527:12;8551:180;8599:77;8596:1;8589:88;8696:4;8693:1;8686:15;8720:4;8717:1;8710:15;8737:281;8820:27;8842:4;8820:27;:::i;:::-;8812:6;8808:40;8950:6;8938:10;8935:22;8914:18;8902:10;8899:34;8896:62;8893:88;;;8961:18;;:::i;:::-;8893:88;9001:10;8997:2;8990:22;8780:238;8737:281;;:::o;9024:129::-;9058:6;9085:20;;:::i;:::-;9075:30;;9114:33;9142:4;9134:6;9114:33;:::i;:::-;9024:129;;;:::o;9159:311::-;9236:4;9326:18;9318:6;9315:30;9312:56;;;9348:18;;:::i;:::-;9312:56;9398:4;9390:6;9386:17;9378:25;;9458:4;9452;9448:15;9440:23;;9159:311;;;:::o;9476:117::-;9585:1;9582;9575:12;9616:710;9712:5;9737:81;9753:64;9810:6;9753:64;:::i;:::-;9737:81;:::i;:::-;9728:90;;9838:5;9867:6;9860:5;9853:21;9901:4;9894:5;9890:16;9883:23;;9954:4;9946:6;9942:17;9934:6;9930:30;9983:3;9975:6;9972:15;9969:122;;;10002:79;;:::i;:::-;9969:122;10117:6;10100:220;10134:6;10129:3;10126:15;10100:220;;;10209:3;10238:37;10271:3;10259:10;10238:37;:::i;:::-;10233:3;10226:50;10305:4;10300:3;10296:14;10289:21;;10176:144;10160:4;10155:3;10151:14;10144:21;;10100:220;;;10104:21;9718:608;;9616:710;;;;;:::o;10349:370::-;10420:5;10469:3;10462:4;10454:6;10450:17;10446:27;10436:122;;10477:79;;:::i;:::-;10436:122;10594:6;10581:20;10619:94;10709:3;10701:6;10694:4;10686:6;10682:17;10619:94;:::i;:::-;10610:103;;10426:293;10349:370;;;;:::o;10725:311::-;10802:4;10892:18;10884:6;10881:30;10878:56;;;10914:18;;:::i;:::-;10878:56;10964:4;10956:6;10952:17;10944:25;;11024:4;11018;11014:15;11006:23;;10725:311;;;:::o;11059:710::-;11155:5;11180:81;11196:64;11253:6;11196:64;:::i;:::-;11180:81;:::i;:::-;11171:90;;11281:5;11310:6;11303:5;11296:21;11344:4;11337:5;11333:16;11326:23;;11397:4;11389:6;11385:17;11377:6;11373:30;11426:3;11418:6;11415:15;11412:122;;;11445:79;;:::i;:::-;11412:122;11560:6;11543:220;11577:6;11572:3;11569:15;11543:220;;;11652:3;11681:37;11714:3;11702:10;11681:37;:::i;:::-;11676:3;11669:50;11748:4;11743:3;11739:14;11732:21;;11619:144;11603:4;11598:3;11594:14;11587:21;;11543:220;;;11547:21;11161:608;;11059:710;;;;;:::o;11792:370::-;11863:5;11912:3;11905:4;11897:6;11893:17;11889:27;11879:122;;11920:79;;:::i;:::-;11879:122;12037:6;12024:20;12062:94;12152:3;12144:6;12137:4;12129:6;12125:17;12062:94;:::i;:::-;12053:103;;11869:293;11792:370;;;;:::o;12168:894::-;12286:6;12294;12343:2;12331:9;12322:7;12318:23;12314:32;12311:119;;;12349:79;;:::i;:::-;12311:119;12497:1;12486:9;12482:17;12469:31;12527:18;12519:6;12516:30;12513:117;;;12549:79;;:::i;:::-;12513:117;12654:78;12724:7;12715:6;12704:9;12700:22;12654:78;:::i;:::-;12644:88;;12440:302;12809:2;12798:9;12794:18;12781:32;12840:18;12832:6;12829:30;12826:117;;;12862:79;;:::i;:::-;12826:117;12967:78;13037:7;13028:6;13017:9;13013:22;12967:78;:::i;:::-;12957:88;;12752:303;12168:894;;;;;:::o;13068:118::-;13155:24;13173:5;13155:24;:::i;:::-;13150:3;13143:37;13068:118;;:::o;13192:222::-;13285:4;13323:2;13312:9;13308:18;13300:26;;13336:71;13404:1;13393:9;13389:17;13380:6;13336:71;:::i;:::-;13192:222;;;;:::o;13420:474::-;13488:6;13496;13545:2;13533:9;13524:7;13520:23;13516:32;13513:119;;;13551:79;;:::i;:::-;13513:119;13671:1;13696:53;13741:7;13732:6;13721:9;13717:22;13696:53;:::i;:::-;13686:63;;13642:117;13798:2;13824:53;13869:7;13860:6;13849:9;13845:22;13824:53;:::i;:::-;13814:63;;13769:118;13420:474;;;;;:::o;13900:180::-;13948:77;13945:1;13938:88;14045:4;14042:1;14035:15;14069:4;14066:1;14059:15;14086:191;14126:3;14145:20;14163:1;14145:20;:::i;:::-;14140:25;;14179:20;14197:1;14179:20;:::i;:::-;14174:25;;14222:1;14219;14215:9;14208:16;;14243:3;14240:1;14237:10;14234:36;;;14250:18;;:::i;:::-;14234:36;14086:191;;;;:::o;14283:194::-;14323:4;14343:20;14361:1;14343:20;:::i;:::-;14338:25;;14377:20;14395:1;14377:20;:::i;:::-;14372:25;;14421:1;14418;14414:9;14406:17;;14445:1;14439:4;14436:11;14433:37;;;14450:18;;:::i;:::-;14433:37;14283:194;;;;:::o;14483:180::-;14531:77;14528:1;14521:88;14628:4;14625:1;14618:15;14652:4;14649:1;14642:15;14669:320;14713:6;14750:1;14744:4;14740:12;14730:22;;14797:1;14791:4;14787:12;14818:18;14808:81;;14874:4;14866:6;14862:17;14852:27;;14808:81;14936:2;14928:6;14925:14;14905:18;14902:38;14899:84;;14955:18;;:::i;:::-;14899:84;14720:269;14669:320;;;:::o;14995:180::-;15043:77;15040:1;15033:88;15140:4;15137:1;15130:15;15164:4;15161:1;15154:15;15181:114;15248:6;15282:5;15276:12;15266:22;;15181:114;;;:::o;15301:163::-;15418:11;15455:3;15440:18;;15301:163;;;;:::o;15470:132::-;15537:4;15560:3;15552:11;;15590:4;15585:3;15581:14;15573:22;;15470:132;;;:::o;15608:116::-;15693:24;15711:5;15693:24;:::i;:::-;15688:3;15681:37;15608:116;;:::o;15730:195::-;15807:10;15828:54;15878:3;15870:6;15828:54;:::i;:::-;15914:4;15909:3;15905:14;15891:28;;15730:195;;;;:::o;15931:113::-;16001:4;16033;16028:3;16024:14;16016:22;;15931:113;;;:::o;16080:776::-;16217:3;16246:54;16294:5;16246:54;:::i;:::-;16316:104;16413:6;16408:3;16316:104;:::i;:::-;16309:111;;16444:56;16494:5;16444:56;:::i;:::-;16523:7;16554:1;16539:292;16564:6;16561:1;16558:13;16539:292;;;16640:6;16634:13;16667:71;16734:3;16719:13;16667:71;:::i;:::-;16660:78;;16761:60;16814:6;16761:60;:::i;:::-;16751:70;;16599:232;16586:1;16583;16579:9;16574:14;;16539:292;;;16543:14;16847:3;16840:10;;16222:634;;;16080:776;;;;:::o;16862:335::-;17024:3;17046:125;17167:3;17158:6;17046:125;:::i;:::-;17039:132;;17188:3;17181:10;;16862:335;;;;:::o;17203:114::-;17270:6;17304:5;17298:12;17288:22;;17203:114;;;:::o;17323:163::-;17440:11;17477:3;17462:18;;17323:163;;;;:::o;17492:132::-;17559:4;17582:3;17574:11;;17612:4;17607:3;17603:14;17595:22;;17492:132;;;:::o;17630:116::-;17715:24;17733:5;17715:24;:::i;:::-;17710:3;17703:37;17630:116;;:::o;17752:195::-;17829:10;17850:54;17900:3;17892:6;17850:54;:::i;:::-;17936:4;17931:3;17927:14;17913:28;;17752:195;;;;:::o;17953:113::-;18023:4;18055;18050:3;18046:14;18038:22;;17953:113;;;:::o;18102:776::-;18239:3;18268:54;18316:5;18268:54;:::i;:::-;18338:104;18435:6;18430:3;18338:104;:::i;:::-;18331:111;;18466:56;18516:5;18466:56;:::i;:::-;18545:7;18576:1;18561:292;18586:6;18583:1;18580:13;18561:292;;;18662:6;18656:13;18689:71;18756:3;18741:13;18689:71;:::i;:::-;18682:78;;18783:60;18836:6;18783:60;:::i;:::-;18773:70;;18621:232;18608:1;18605;18601:9;18596:14;;18561:292;;;18565:14;18869:3;18862:10;;18244:634;;;18102:776;;;;:::o;18884:335::-;19046:3;19068:125;19189:3;19180:6;19068:125;:::i;:::-;19061:132;;19210:3;19203:10;;18884:335;;;;:::o;19225:410::-;19265:7;19288:20;19306:1;19288:20;:::i;:::-;19283:25;;19322:20;19340:1;19322:20;:::i;:::-;19317:25;;19377:1;19374;19370:9;19399:30;19417:11;19399:30;:::i;:::-;19388:41;;19578:1;19569:7;19565:15;19562:1;19559:22;19539:1;19532:9;19512:83;19489:139;;19608:18;;:::i;:::-;19489:139;19273:362;19225:410;;;;:::o;19641:442::-;19790:4;19828:2;19817:9;19813:18;19805:26;;19841:71;19909:1;19898:9;19894:17;19885:6;19841:71;:::i;:::-;19922:72;19990:2;19979:9;19975:18;19966:6;19922:72;:::i;:::-;20004;20072:2;20061:9;20057:18;20048:6;20004:72;:::i;:::-;19641:442;;;;;;:::o;20089:332::-;20210:4;20248:2;20237:9;20233:18;20225:26;;20261:71;20329:1;20318:9;20314:17;20305:6;20261:71;:::i;:::-;20342:72;20410:2;20399:9;20395:18;20386:6;20342:72;:::i;:::-;20089:332;;;;;:::o
Swarm Source
ipfs://3f545a0f0ec1184eefd70cb5243368daa1c66d773b2bb326feecffb10700c36a
Loading...
Loading
Loading...
Loading
OVERVIEW
Build with Blockchain. Accelerate with AI.Plug & play APIs to launch powerful Web3 solutions: smarter than everLoading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.