Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 12 from a total of 12 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer | 22313029 | 310 days ago | IN | 0 ETH | 0.00006933 | ||||
| Transfer | 20415305 | 575 days ago | IN | 0 ETH | 0.00016408 | ||||
| Transfer | 20406435 | 576 days ago | IN | 0 ETH | 0.00014178 | ||||
| Transfer | 20384504 | 579 days ago | IN | 0 ETH | 0.00086669 | ||||
| Transfer | 20378626 | 580 days ago | IN | 0 ETH | 0.00045361 | ||||
| Transfer | 20187136 | 606 days ago | IN | 0 ETH | 0.00049578 | ||||
| Approve | 20106142 | 618 days ago | IN | 0 ETH | 0.00108882 | ||||
| Approve | 19993279 | 633 days ago | IN | 0 ETH | 0.00033618 | ||||
| Transfer | 19992896 | 634 days ago | IN | 0 ETH | 0.00050955 | ||||
| Transfer | 19991114 | 634 days ago | IN | 0 ETH | 0.00133959 | ||||
| Approve | 19987512 | 634 days ago | IN | 0 ETH | 0.00125273 | ||||
| Approve | 19987507 | 634 days ago | IN | 0 ETH | 0.000282 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ORANG3
Compiler Version
v0.8.25+commit.b61c2a91
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2024-06-03
*/
// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;
/**
* @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);
}
// File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.20;
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```solidity
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
*
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Storage of the initializable contract.
*
* It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions
* when using with upgradeable contracts.
*
* @custom:storage-location erc7201:openzeppelin.storage.Initializable
*/
struct InitializableStorage {
/**
* @dev Indicates that the contract has been initialized.
*/
uint64 _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool _initializing;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;
/**
* @dev The contract is already initialized.
*/
error InvalidInitialization();
/**
* @dev The contract is not initializing.
*/
error NotInitializing();
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint64 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any
* number of times. This behavior in the constructor can be useful during testing and is not expected to be used in
* production.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
// Cache values to avoid duplicated sloads
bool isTopLevelCall = !$._initializing;
uint64 initialized = $._initialized;
// Allowed calls:
// - initialSetup: the contract is not in the initializing state and no previous version was
// initialized
// - construction: the contract is initialized at version 1 (no reininitialization) and the
// current contract is just being deployed
bool initialSetup = initialized == 0 && isTopLevelCall;
bool construction = initialized == 1 && address(this).code.length == 0;
if (!initialSetup && !construction) {
revert InvalidInitialization();
}
$._initialized = 1;
if (isTopLevelCall) {
$._initializing = true;
}
_;
if (isTopLevelCall) {
$._initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint64 version) {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
if ($._initializing || $._initialized >= version) {
revert InvalidInitialization();
}
$._initialized = version;
$._initializing = true;
_;
$._initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
_checkInitializing();
_;
}
/**
* @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.
*/
function _checkInitializing() internal view virtual {
if (!_isInitializing()) {
revert NotInitializing();
}
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
if ($._initializing) {
revert InvalidInitialization();
}
if ($._initialized != type(uint64).max) {
$._initialized = type(uint64).max;
emit Initialized(type(uint64).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint64) {
return _getInitializableStorage()._initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _getInitializableStorage()._initializing;
}
/**
* @dev Returns a pointer to the storage namespace.
*/
// solhint-disable-next-line var-name-mixedcase
function _getInitializableStorage() private pure returns (InitializableStorage storage $) {
assembly {
$.slot := INITIALIZABLE_STORAGE
}
}
}
// File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @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 ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
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;
}
}
// File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
/**
* @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 OwnableUpgradeable is Initializable, ContextUpgradeable {
/// @custom:storage-location erc7201:openzeppelin.storage.Ownable
struct OwnableStorage {
address _owner;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;
function _getOwnableStorage() private pure returns (OwnableStorage storage $) {
assembly {
$.slot := OwnableStorageLocation
}
}
/**
* @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.
*/
function __Ownable_init(address initialOwner) internal onlyInitializing {
__Ownable_init_unchained(initialOwner);
}
function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {
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) {
OwnableStorage storage $ = _getOwnableStorage();
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 {
OwnableStorage storage $ = _getOwnableStorage();
address oldOwner = $._owner;
$._owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol)
pragma solidity ^0.8.20;
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract PausableUpgradeable is Initializable, ContextUpgradeable {
/// @custom:storage-location erc7201:openzeppelin.storage.Pausable
struct PausableStorage {
bool _paused;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Pausable")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant PausableStorageLocation = 0xcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300;
function _getPausableStorage() private pure returns (PausableStorage storage $) {
assembly {
$.slot := PausableStorageLocation
}
}
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
/**
* @dev The operation failed because the contract is paused.
*/
error EnforcedPause();
/**
* @dev The operation failed because the contract is not paused.
*/
error ExpectedPause();
/**
* @dev Initializes the contract in unpaused state.
*/
function __Pausable_init() internal onlyInitializing {
__Pausable_init_unchained();
}
function __Pausable_init_unchained() internal onlyInitializing {
PausableStorage storage $ = _getPausableStorage();
$._paused = false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
PausableStorage storage $ = _getPausableStorage();
return $._paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
if (paused()) {
revert EnforcedPause();
}
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
if (!paused()) {
revert ExpectedPause();
}
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
PausableStorage storage $ = _getPausableStorage();
$._paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
PausableStorage storage $ = _getPausableStorage();
$._paused = false;
emit Unpaused(_msgSender());
}
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @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);
}
// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.20;
/**
* @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);
}
// File: @openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.20;
/**
* @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 ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20, IERC20Metadata, IERC20Errors {
/// @custom:storage-location erc7201:openzeppelin.storage.ERC20
struct ERC20Storage {
mapping(address account => uint256) _balances;
mapping(address account => mapping(address spender => uint256)) _allowances;
uint256 _totalSupply;
string _name;
string _symbol;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC20")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant ERC20StorageLocation = 0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00;
function _getERC20Storage() private pure returns (ERC20Storage storage $) {
assembly {
$.slot := ERC20StorageLocation
}
}
/**
* @dev Sets the values for {name} and {symbol}.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing {
__ERC20_init_unchained(name_, symbol_);
}
function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {
ERC20Storage storage $ = _getERC20Storage();
$._name = name_;
$._symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
ERC20Storage storage $ = _getERC20Storage();
return $._name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
ERC20Storage storage $ = _getERC20Storage();
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) {
ERC20Storage storage $ = _getERC20Storage();
return $._totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual returns (uint256) {
ERC20Storage storage $ = _getERC20Storage();
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) {
ERC20Storage storage $ = _getERC20Storage();
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 {
ERC20Storage storage $ = _getERC20Storage();
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 {
ERC20Storage storage $ = _getERC20Storage();
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);
}
}
}
}
// File: @openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Pausable.sol)
pragma solidity ^0.8.20;
/**
* @dev ERC20 token with pausable token transfers, minting and burning.
*
* Useful for scenarios such as preventing trades until the end of an evaluation
* period, or having an emergency switch for freezing all token transfers in the
* event of a large bug.
*
* IMPORTANT: This contract does not include public pause and unpause functions. In
* addition to inheriting this contract, you must define both functions, invoking the
* {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate
* access control, e.g. using {AccessControl} or {Ownable}. Not doing so will
* make the contract pause mechanism of the contract unreachable, and thus unusable.
*/
abstract contract ERC20PausableUpgradeable is Initializable, ERC20Upgradeable, PausableUpgradeable {
function __ERC20Pausable_init() internal onlyInitializing {
__Pausable_init_unchained();
}
function __ERC20Pausable_init_unchained() internal onlyInitializing {
}
/**
* @dev See {ERC20-_update}.
*
* Requirements:
*
* - the contract must not be paused.
*/
function _update(address from, address to, uint256 value) internal virtual override whenNotPaused {
super._update(from, to, value);
}
}
// File: contracts/0RANG3.sol
pragma solidity ^0.8.20;
contract ORANG3 is ERC20PausableUpgradeable, OwnableUpgradeable {
struct Wallet {
address walletAddress;
bytes32 uniqueID; // Use keccak256 for unique ID
}
mapping(address => Wallet) public wallets;
address[] public walletAddresses;
address public taxWallet;
address public charityWallet;
address public earlyAdoptersWallet;
address public foundersWallet;
address public seedInvestorsWallet;
address public strategicInvestorsWallet;
uint256 public initialSupply; // Initial supply of 10 billion tokens
uint256 public maxSupply; // Maximum supply of 20 billion tokens
uint256 public remainingTokens; // Remaining tokens for future minting
constructor() initializer {
__ERC20_init("ORANG3", "0R3");
__Ownable_init(msg.sender);
initialSupply = 10000000000 * 10**18; // Set the initial supply to 10 billion tokens
maxSupply = 20000000000 * 10**18; // Set the maximum supply to 20 billion tokens
taxWallet = 0x08443725BcBDF1Eb05Ce64d054bD3583CFD0cf72;
charityWallet = 0x5A6D7c0340CA3EA263BF3Ec9a514F844d6f73260;
earlyAdoptersWallet = 0x659101f2001dA8Ae9877A7039536a6a3F211Fe77;
foundersWallet = 0x0819A7a47c68EeEf22E7743a755BAA9d69B398E1;
seedInvestorsWallet = 0x2A9768a1403f7716E37924f93C46eb7325a1d1a1;
strategicInvestorsWallet = 0x16D940F84Faabd794079bC588dfD8f5FB54d5699;
// Store the wallet addresses in an array
walletAddresses = [taxWallet, charityWallet, earlyAdoptersWallet, foundersWallet, seedInvestorsWallet, strategicInvestorsWallet];
uint256 walletCount = walletAddresses.length;
for (uint i = 0; i < walletCount; i++) {
bytes32 uniqueID = keccak256(abi.encodePacked(walletAddresses[i]));
wallets[walletAddresses[i]].uniqueID = uniqueID;
}
// Mint tokens to each wallet
_mint(taxWallet, 200000000 * 10**18);
_mint(charityWallet, 1000000000 * 10**18);
_mint(earlyAdoptersWallet, 3000000000 * 10**18);
_mint(foundersWallet, 2000000000 * 10**18);
_mint(seedInvestorsWallet, 1000000000 * 10**18);
_mint(strategicInvestorsWallet, 2000000000 * 10**18);
_mint(msg.sender, 800000000 * 10**18); // Mint to the deployment wallet
// Calculate the remaining tokens for future minting
remainingTokens = maxSupply - (200000000 * 10**18 + 1000000000 * 10**18 + 3000000000 * 10**18 + 2000000000 * 10**18 + 1000000000 * 10**18 + 2000000000 * 10**18 + 800000000 * 10**18);
}
function mint(address recipient, uint256 amount) public onlyOwner {
require(amount <= remainingTokens, "Not enough tokens left for minting");
_mint(recipient, amount);
remainingTokens -= amount;
// Check if max supply is reached
if (totalSupply() >= maxSupply) {
// Increase max supply dynamically
increaseMaxSupply(1000000000 * 10**18); // Increase by 1 billion tokens
}
}
function increaseMaxSupply(uint256 amount) internal {
maxSupply += amount;
remainingTokens += amount;
}
function transfer(address recipient, uint256 amount) public override whenNotPaused returns(bool){
// Calculate the tax amount (2% of the transferred amount)
uint256 taxAmount = (amount * 2) / 100;
// Mint new tokens for the tax
_mint(taxWallet, taxAmount * 9 / 10); // Mint 90% of tax amount to tax wallet
_mint(charityWallet, taxAmount / 10); // Mint 10% of tax amount to charity wallet
// Transfer the full amount to the recipient
_transfer(msg.sender, recipient, amount);
return true;
}
function burn(uint256 amount) public {
_burn(msg.sender, amount);
}
function pause() public onlyOwner {
_pause();
}
function unpause() public onlyOwner {
_unpause();
}
function clearStuckTokens(IERC20 token) public onlyOwner {
uint256 amount = token.balanceOf(address(this));
token.transfer(msg.sender, amount);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","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":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"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":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"charityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"clearStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyAdoptersWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"foundersWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainingTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seedInvestorsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategicInvestorsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"walletAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wallets","outputs":[{"internalType":"address","name":"walletAddress","type":"address"},{"internalType":"bytes32","name":"uniqueID","type":"bytes32"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801561000f575f80fd5b505f61001f6108f360201b60201c565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f808267ffffffffffffffff161480156100675750825b90505f60018367ffffffffffffffff1614801561009a57505f3073ffffffffffffffffffffffffffffffffffffffff163b145b9050811580156100a8575080155b156100df576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550831561012c576001855f0160086101000a81548160ff0219169083151502179055505b6101a66040518060400160405280600681526020017f4f52414e473300000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f305233000000000000000000000000000000000000000000000000000000000081525061091a60201b60201c565b6101b53361093c60201b60201c565b6b204fce5e3e250261100000006008819055506b409f9cbc7c4a04c2200000006009819055507308443725bcbdf1eb05ce64d054bd3583cfd0cf7260025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550735a6d7c0340ca3ea263bf3ec9a514f844d6f7326060035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073659101f2001da8ae9877a7039536a6a3f211fe7760045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550730819a7a47c68eeef22e7743a755baa9d69b398e160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550732a9768a1403f7716e37924f93c46eb7325a1d1a160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507316d940f84faabd794079bc588dfd8f5fb54d569960075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060c0016040528060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525060019060066105de929190610f37565b505f60018054905090505f5b818110156106e4575f6001828154811061060757610606610fd9565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660405160200161063f919061107b565b604051602081830303815290604052805190602001209050805f806001858154811061066e5761066d610fd9565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101819055505080806001019150506105ea565b5061072160025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166aa56fa5b99019a5c800000061095c60201b60201c565b61075e60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166b033b2e3c9fd0803ce800000061095c60201b60201c565b61079b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166b09b18ab5df7180b6b800000061095c60201b60201c565b6107d860055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166b06765c793fa10079d000000061095c60201b60201c565b61081560065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166b033b2e3c9fd0803ce800000061095c60201b60201c565b61085260075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166b06765c793fa10079d000000061095c60201b60201c565b61086e336b0295be96e64066972000000061095c60201b60201c565b6b204fce5e3e2502611000000060095461088891906110cb565b600a819055505083156108e9575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d260016040516108e09190611153565b60405180910390a15b505050505061151b565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b6109286109e160201b60201c565b6109388282610a2760201b60201c565b5050565b61094a6109e160201b60201c565b61095981610a6f60201b60201c565b50565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109cc575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016109c3919061117b565b60405180910390fd5b6109dd5f8383610aff60201b60201c565b5050565b6109ef610b2360201b60201c565b610a25576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b610a356109e160201b60201c565b5f610a44610b4760201b60201c565b905082816003019081610a5791906113bc565b5081816004019081610a6991906113bc565b50505050565b610a7d6109e160201b60201c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610aed575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610ae4919061117b565b60405180910390fd5b610afc81610b6e60201b60201c565b50565b610b0d610c4560201b60201c565b610b1e838383610c8c60201b60201c565b505050565b5f610b326108f360201b60201c565b5f0160089054906101000a900460ff16905090565b5f7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00905090565b5f610b7d610ec160201b60201c565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b610c53610ee860201b60201c565b15610c8a576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f610c9b610b4760201b60201c565b90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610cef5781816002015f828254610ce3919061148b565b92505081905550610dc1565b5f815f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905082811015610d7a578481846040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610d71939291906114cd565b60405180910390fd5b828103825f015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e0a5781816002015f8282540392505081905550610e56565b81815f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610eb39190611502565b60405180910390a350505050565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b5f80610ef8610f1060201b60201c565b9050805f015f9054906101000a900460ff1691505090565b5f7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300905090565b828054828255905f5260205f20908101928215610fad579160200282015b82811115610fac578251825f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190610f55565b5b509050610fba9190610fbe565b5090565b5b80821115610fd5575f815f905550600101610fbf565b5090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61102f82611006565b9050919050565b5f8160601b9050919050565b5f61104c82611036565b9050919050565b5f61105d82611042565b9050919050565b61107561107082611025565b611053565b82525050565b5f6110868284611064565b60148201915081905092915050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6110d582611095565b91506110e083611095565b92508282039050818111156110f8576110f761109e565b5b92915050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f819050919050565b5f61113d611138611133846110fe565b61111a565b611107565b9050919050565b61114d81611123565b82525050565b5f6020820190506111665f830184611144565b92915050565b61117581611025565b82525050565b5f60208201905061118e5f83018461116c565b92915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061120f57607f821691505b602082108103611222576112216111cb565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026112847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611249565b61128e8683611249565b95508019841693508086168417925050509392505050565b5f6112c06112bb6112b684611095565b61111a565b611095565b9050919050565b5f819050919050565b6112d9836112a6565b6112ed6112e5826112c7565b848454611255565b825550505050565b5f90565b6113016112f5565b61130c8184846112d0565b505050565b5b8181101561132f576113245f826112f9565b600181019050611312565b5050565b601f8211156113745761134581611228565b61134e8461123a565b8101602085101561135d578190505b6113716113698561123a565b830182611311565b50505b505050565b5f82821c905092915050565b5f6113945f1984600802611379565b1980831691505092915050565b5f6113ac8383611385565b9150826002028217905092915050565b6113c582611194565b67ffffffffffffffff8111156113de576113dd61119e565b5b6113e882546111f8565b6113f3828285611333565b5f60209050601f831160018114611424575f8415611412578287015190505b61141c85826113a1565b865550611483565b601f19841661143286611228565b5f5b8281101561145957848901518255600182019150602085019450602081019050611434565b868310156114765784890151611472601f891682611385565b8355505b6001600288020188555050505b505050505050565b5f61149582611095565b91506114a083611095565b92508282019050808211156114b8576114b761109e565b5b92915050565b6114c781611095565b82525050565b5f6060820190506114e05f83018661116c565b6114ed60208301856114be565b6114fa60408301846114be565b949350505050565b5f6020820190506115155f8301846114be565b92915050565b611dd5806115285f395ff3fe608060405234801561000f575f80fd5b50600436106101cd575f3560e01c80635c975abb1161010257806395d89b41116100a0578063d1e03ea01161006f578063d1e03ea0146104ea578063d5abeb0114610508578063dd62ed3e14610526578063f2fde38b14610556576101cd565b806395d89b4114610460578063a9059cbb1461047e578063bec1f7c1146104ae578063bf583903146104cc576101cd565b80637b208769116100dc5780637b208769146103e95780638456cb591461040757806389b08f11146104115780638da5cb5b14610442576101cd565b80635c975abb1461039157806370a08231146103af578063715018a6146103df576101cd565b8063313ce5671161016f578063381bc83511610149578063381bc835146103315780633f4ba83a1461034f57806340c10f191461035957806342966c6814610375576101cd565b8063313ce567146102d9578063346cc7be146102f7578063378dc3dc14610313576101cd565b806318160ddd116101ab57806318160ddd1461024f5780631bfaf1551461026d57806323b872dd1461028b5780632dc0562d146102bb576101cd565b806306fdde03146101d1578063095ea7b3146101ef5780631469d5d41461021f575b5f80fd5b6101d9610572565b6040516101e69190611764565b60405180910390f35b61020960048036038101906102049190611815565b610610565b604051610216919061186d565b60405180910390f35b61023960048036038101906102349190611886565b610632565b60405161024691906118c0565b60405180910390f35b61025761066d565b60405161026491906118e8565b60405180910390f35b610275610684565b60405161028291906118c0565b60405180910390f35b6102a560048036038101906102a09190611901565b6106a9565b6040516102b2919061186d565b60405180910390f35b6102c36106d7565b6040516102d091906118c0565b60405180910390f35b6102e16106fc565b6040516102ee919061196c565b60405180910390f35b610311600480360381019061030c91906119c0565b610704565b005b61031b610807565b60405161032891906118e8565b60405180910390f35b61033961080d565b60405161034691906118c0565b60405180910390f35b610357610832565b005b610373600480360381019061036e9190611815565b610844565b005b61038f600480360381019061038a9190611886565b6108dd565b005b6103996108ea565b6040516103a6919061186d565b60405180910390f35b6103c960048036038101906103c491906119eb565b61090c565b6040516103d691906118e8565b60405180910390f35b6103e761095f565b005b6103f1610972565b6040516103fe91906118c0565b60405180910390f35b61040f610997565b005b61042b600480360381019061042691906119eb565b6109a9565b604051610439929190611a2e565b60405180910390f35b61044a6109e7565b60405161045791906118c0565b60405180910390f35b610468610a1c565b6040516104759190611764565b60405180910390f35b61049860048036038101906104939190611815565b610aba565b6040516104a5919061186d565b60405180910390f35b6104b6610b6f565b6040516104c391906118c0565b60405180910390f35b6104d4610b94565b6040516104e191906118e8565b60405180910390f35b6104f2610b9a565b6040516104ff91906118c0565b60405180910390f35b610510610bbf565b60405161051d91906118e8565b60405180910390f35b610540600480360381019061053b9190611a55565b610bc5565b60405161054d91906118e8565b60405180910390f35b610570600480360381019061056b91906119eb565b610c55565b005b60605f61057d610cd9565b905080600301805461058e90611ac0565b80601f01602080910402602001604051908101604052809291908181526020018280546105ba90611ac0565b80156106055780601f106105dc57610100808354040283529160200191610605565b820191905f5260205f20905b8154815290600101906020018083116105e857829003601f168201915b505050505091505090565b5f8061061a610d00565b9050610627818585610d07565b600191505092915050565b60018181548110610641575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80610677610cd9565b9050806002015491505090565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f806106b3610d00565b90506106c0858285610d19565b6106cb858585610dab565b60019150509392505050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6012905090565b61070c610e9b565b5f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161074691906118c0565b602060405180830381865afa158015610761573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107859190611b04565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016107c2929190611b2f565b6020604051808303815f875af11580156107de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108029190611b80565b505050565b60085481565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61083a610e9b565b610842610f22565b565b61084c610e9b565b600a54811115610891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088890611c1b565b60405180910390fd5b61089b8282610f90565b80600a5f8282546108ac9190611c66565b925050819055506009546108be61066d565b106108d9576108d86b033b2e3c9fd0803ce800000061100f565b5b5050565b6108e73382611042565b50565b5f806108f46110c1565b9050805f015f9054906101000a900460ff1691505090565b5f80610916610cd9565b9050805f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054915050919050565b610967610e9b565b6109705f6110e8565b565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61099f610e9b565b6109a76111b9565b565b5f602052805f5260405f205f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b5f806109f1611228565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b60605f610a27610cd9565b9050806004018054610a3890611ac0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6490611ac0565b8015610aaf5780601f10610a8657610100808354040283529160200191610aaf565b820191905f5260205f20905b815481529060010190602001808311610a9257829003601f168201915b505050505091505090565b5f610ac361124f565b5f6064600284610ad39190611c99565b610add9190611d07565b9050610b2260025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a600984610b139190611c99565b610b1d9190611d07565b610f90565b610b5960035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a83610b549190611d07565b610f90565b610b64338585610dab565b600191505092915050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b5f80610bcf610cd9565b9050806001015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205491505092915050565b610c5d610e9b565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ccd575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610cc491906118c0565b60405180910390fd5b610cd6816110e8565b50565b5f7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00905090565b5f33905090565b610d148383836001611290565b505050565b5f610d248484610bc5565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610da55781811015610d96578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610d8d93929190611d37565b60405180910390fd5b610da484848484035f611290565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e1b575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610e1291906118c0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e8b575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610e8291906118c0565b60405180910390fd5b610e9683838361146d565b505050565b610ea3610d00565b73ffffffffffffffffffffffffffffffffffffffff16610ec16109e7565b73ffffffffffffffffffffffffffffffffffffffff1614610f2057610ee4610d00565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610f1791906118c0565b60405180910390fd5b565b610f2a611485565b5f610f336110c1565b90505f815f015f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610f78610d00565b604051610f8591906118c0565b60405180910390a150565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611000575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610ff791906118c0565b60405180910390fd5b61100b5f838361146d565b5050565b8060095f8282546110209190611d6c565b9250508190555080600a5f8282546110389190611d6c565b9250508190555050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110b2575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016110a991906118c0565b60405180910390fd5b6110bd825f8361146d565b5050565b5f7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300905090565b5f6110f1611228565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b6111c161124f565b5f6111ca6110c1565b90506001815f015f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611210610d00565b60405161121d91906118c0565b60405180910390a150565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b6112576108ea565b1561128e576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f611299610cd9565b90505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361130b575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161130291906118c0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361137b575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161137291906118c0565b60405180910390fd5b82816001015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508115611466578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161145d91906118e8565b60405180910390a35b5050505050565b61147561124f565b6114808383836114c5565b505050565b61148d6108ea565b6114c3576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f6114ce610cd9565b90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036115225781816002015f8282546115169190611d6c565b925050819055506115f4565b5f815f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050828110156115ad578481846040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016115a493929190611d37565b60405180910390fd5b828103825f015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361163d5781816002015f8282540392505081905550611689565b81815f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116e691906118e8565b60405180910390a350505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611736826116f4565b61174081856116fe565b935061175081856020860161170e565b6117598161171c565b840191505092915050565b5f6020820190508181035f83015261177c818461172c565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6117b182611788565b9050919050565b6117c1816117a7565b81146117cb575f80fd5b50565b5f813590506117dc816117b8565b92915050565b5f819050919050565b6117f4816117e2565b81146117fe575f80fd5b50565b5f8135905061180f816117eb565b92915050565b5f806040838503121561182b5761182a611784565b5b5f611838858286016117ce565b925050602061184985828601611801565b9150509250929050565b5f8115159050919050565b61186781611853565b82525050565b5f6020820190506118805f83018461185e565b92915050565b5f6020828403121561189b5761189a611784565b5b5f6118a884828501611801565b91505092915050565b6118ba816117a7565b82525050565b5f6020820190506118d35f8301846118b1565b92915050565b6118e2816117e2565b82525050565b5f6020820190506118fb5f8301846118d9565b92915050565b5f805f6060848603121561191857611917611784565b5b5f611925868287016117ce565b9350506020611936868287016117ce565b925050604061194786828701611801565b9150509250925092565b5f60ff82169050919050565b61196681611951565b82525050565b5f60208201905061197f5f83018461195d565b92915050565b5f61198f826117a7565b9050919050565b61199f81611985565b81146119a9575f80fd5b50565b5f813590506119ba81611996565b92915050565b5f602082840312156119d5576119d4611784565b5b5f6119e2848285016119ac565b91505092915050565b5f60208284031215611a00576119ff611784565b5b5f611a0d848285016117ce565b91505092915050565b5f819050919050565b611a2881611a16565b82525050565b5f604082019050611a415f8301856118b1565b611a4e6020830184611a1f565b9392505050565b5f8060408385031215611a6b57611a6a611784565b5b5f611a78858286016117ce565b9250506020611a89858286016117ce565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611ad757607f821691505b602082108103611aea57611ae9611a93565b5b50919050565b5f81519050611afe816117eb565b92915050565b5f60208284031215611b1957611b18611784565b5b5f611b2684828501611af0565b91505092915050565b5f604082019050611b425f8301856118b1565b611b4f60208301846118d9565b9392505050565b611b5f81611853565b8114611b69575f80fd5b50565b5f81519050611b7a81611b56565b92915050565b5f60208284031215611b9557611b94611784565b5b5f611ba284828501611b6c565b91505092915050565b7f4e6f7420656e6f75676820746f6b656e73206c65667420666f72206d696e74695f8201527f6e67000000000000000000000000000000000000000000000000000000000000602082015250565b5f611c056022836116fe565b9150611c1082611bab565b604082019050919050565b5f6020820190508181035f830152611c3281611bf9565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611c70826117e2565b9150611c7b836117e2565b9250828203905081811115611c9357611c92611c39565b5b92915050565b5f611ca3826117e2565b9150611cae836117e2565b9250828202611cbc816117e2565b91508282048414831517611cd357611cd2611c39565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611d11826117e2565b9150611d1c836117e2565b925082611d2c57611d2b611cda565b5b828204905092915050565b5f606082019050611d4a5f8301866118b1565b611d5760208301856118d9565b611d6460408301846118d9565b949350505050565b5f611d76826117e2565b9150611d81836117e2565b9250828201905080821115611d9957611d98611c39565b5b9291505056fea26469706673582212205f5073e0aef3fc4a98f00fe530f4b4f17fc74a0ef83b5fce64ccbf28aa78be0664736f6c63430008190033
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101cd575f3560e01c80635c975abb1161010257806395d89b41116100a0578063d1e03ea01161006f578063d1e03ea0146104ea578063d5abeb0114610508578063dd62ed3e14610526578063f2fde38b14610556576101cd565b806395d89b4114610460578063a9059cbb1461047e578063bec1f7c1146104ae578063bf583903146104cc576101cd565b80637b208769116100dc5780637b208769146103e95780638456cb591461040757806389b08f11146104115780638da5cb5b14610442576101cd565b80635c975abb1461039157806370a08231146103af578063715018a6146103df576101cd565b8063313ce5671161016f578063381bc83511610149578063381bc835146103315780633f4ba83a1461034f57806340c10f191461035957806342966c6814610375576101cd565b8063313ce567146102d9578063346cc7be146102f7578063378dc3dc14610313576101cd565b806318160ddd116101ab57806318160ddd1461024f5780631bfaf1551461026d57806323b872dd1461028b5780632dc0562d146102bb576101cd565b806306fdde03146101d1578063095ea7b3146101ef5780631469d5d41461021f575b5f80fd5b6101d9610572565b6040516101e69190611764565b60405180910390f35b61020960048036038101906102049190611815565b610610565b604051610216919061186d565b60405180910390f35b61023960048036038101906102349190611886565b610632565b60405161024691906118c0565b60405180910390f35b61025761066d565b60405161026491906118e8565b60405180910390f35b610275610684565b60405161028291906118c0565b60405180910390f35b6102a560048036038101906102a09190611901565b6106a9565b6040516102b2919061186d565b60405180910390f35b6102c36106d7565b6040516102d091906118c0565b60405180910390f35b6102e16106fc565b6040516102ee919061196c565b60405180910390f35b610311600480360381019061030c91906119c0565b610704565b005b61031b610807565b60405161032891906118e8565b60405180910390f35b61033961080d565b60405161034691906118c0565b60405180910390f35b610357610832565b005b610373600480360381019061036e9190611815565b610844565b005b61038f600480360381019061038a9190611886565b6108dd565b005b6103996108ea565b6040516103a6919061186d565b60405180910390f35b6103c960048036038101906103c491906119eb565b61090c565b6040516103d691906118e8565b60405180910390f35b6103e761095f565b005b6103f1610972565b6040516103fe91906118c0565b60405180910390f35b61040f610997565b005b61042b600480360381019061042691906119eb565b6109a9565b604051610439929190611a2e565b60405180910390f35b61044a6109e7565b60405161045791906118c0565b60405180910390f35b610468610a1c565b6040516104759190611764565b60405180910390f35b61049860048036038101906104939190611815565b610aba565b6040516104a5919061186d565b60405180910390f35b6104b6610b6f565b6040516104c391906118c0565b60405180910390f35b6104d4610b94565b6040516104e191906118e8565b60405180910390f35b6104f2610b9a565b6040516104ff91906118c0565b60405180910390f35b610510610bbf565b60405161051d91906118e8565b60405180910390f35b610540600480360381019061053b9190611a55565b610bc5565b60405161054d91906118e8565b60405180910390f35b610570600480360381019061056b91906119eb565b610c55565b005b60605f61057d610cd9565b905080600301805461058e90611ac0565b80601f01602080910402602001604051908101604052809291908181526020018280546105ba90611ac0565b80156106055780601f106105dc57610100808354040283529160200191610605565b820191905f5260205f20905b8154815290600101906020018083116105e857829003601f168201915b505050505091505090565b5f8061061a610d00565b9050610627818585610d07565b600191505092915050565b60018181548110610641575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80610677610cd9565b9050806002015491505090565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f806106b3610d00565b90506106c0858285610d19565b6106cb858585610dab565b60019150509392505050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6012905090565b61070c610e9b565b5f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161074691906118c0565b602060405180830381865afa158015610761573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107859190611b04565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016107c2929190611b2f565b6020604051808303815f875af11580156107de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108029190611b80565b505050565b60085481565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61083a610e9b565b610842610f22565b565b61084c610e9b565b600a54811115610891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088890611c1b565b60405180910390fd5b61089b8282610f90565b80600a5f8282546108ac9190611c66565b925050819055506009546108be61066d565b106108d9576108d86b033b2e3c9fd0803ce800000061100f565b5b5050565b6108e73382611042565b50565b5f806108f46110c1565b9050805f015f9054906101000a900460ff1691505090565b5f80610916610cd9565b9050805f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054915050919050565b610967610e9b565b6109705f6110e8565b565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61099f610e9b565b6109a76111b9565b565b5f602052805f5260405f205f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b5f806109f1611228565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b60605f610a27610cd9565b9050806004018054610a3890611ac0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6490611ac0565b8015610aaf5780601f10610a8657610100808354040283529160200191610aaf565b820191905f5260205f20905b815481529060010190602001808311610a9257829003601f168201915b505050505091505090565b5f610ac361124f565b5f6064600284610ad39190611c99565b610add9190611d07565b9050610b2260025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a600984610b139190611c99565b610b1d9190611d07565b610f90565b610b5960035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a83610b549190611d07565b610f90565b610b64338585610dab565b600191505092915050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b5f80610bcf610cd9565b9050806001015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205491505092915050565b610c5d610e9b565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ccd575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610cc491906118c0565b60405180910390fd5b610cd6816110e8565b50565b5f7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00905090565b5f33905090565b610d148383836001611290565b505050565b5f610d248484610bc5565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610da55781811015610d96578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610d8d93929190611d37565b60405180910390fd5b610da484848484035f611290565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e1b575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610e1291906118c0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e8b575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610e8291906118c0565b60405180910390fd5b610e9683838361146d565b505050565b610ea3610d00565b73ffffffffffffffffffffffffffffffffffffffff16610ec16109e7565b73ffffffffffffffffffffffffffffffffffffffff1614610f2057610ee4610d00565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610f1791906118c0565b60405180910390fd5b565b610f2a611485565b5f610f336110c1565b90505f815f015f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610f78610d00565b604051610f8591906118c0565b60405180910390a150565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611000575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610ff791906118c0565b60405180910390fd5b61100b5f838361146d565b5050565b8060095f8282546110209190611d6c565b9250508190555080600a5f8282546110389190611d6c565b9250508190555050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110b2575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016110a991906118c0565b60405180910390fd5b6110bd825f8361146d565b5050565b5f7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300905090565b5f6110f1611228565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b6111c161124f565b5f6111ca6110c1565b90506001815f015f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611210610d00565b60405161121d91906118c0565b60405180910390a150565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b6112576108ea565b1561128e576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f611299610cd9565b90505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361130b575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161130291906118c0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361137b575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161137291906118c0565b60405180910390fd5b82816001015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508115611466578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161145d91906118e8565b60405180910390a35b5050505050565b61147561124f565b6114808383836114c5565b505050565b61148d6108ea565b6114c3576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f6114ce610cd9565b90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036115225781816002015f8282546115169190611d6c565b925050819055506115f4565b5f815f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050828110156115ad578481846040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016115a493929190611d37565b60405180910390fd5b828103825f015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361163d5781816002015f8282540392505081905550611689565b81815f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116e691906118e8565b60405180910390a350505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611736826116f4565b61174081856116fe565b935061175081856020860161170e565b6117598161171c565b840191505092915050565b5f6020820190508181035f83015261177c818461172c565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6117b182611788565b9050919050565b6117c1816117a7565b81146117cb575f80fd5b50565b5f813590506117dc816117b8565b92915050565b5f819050919050565b6117f4816117e2565b81146117fe575f80fd5b50565b5f8135905061180f816117eb565b92915050565b5f806040838503121561182b5761182a611784565b5b5f611838858286016117ce565b925050602061184985828601611801565b9150509250929050565b5f8115159050919050565b61186781611853565b82525050565b5f6020820190506118805f83018461185e565b92915050565b5f6020828403121561189b5761189a611784565b5b5f6118a884828501611801565b91505092915050565b6118ba816117a7565b82525050565b5f6020820190506118d35f8301846118b1565b92915050565b6118e2816117e2565b82525050565b5f6020820190506118fb5f8301846118d9565b92915050565b5f805f6060848603121561191857611917611784565b5b5f611925868287016117ce565b9350506020611936868287016117ce565b925050604061194786828701611801565b9150509250925092565b5f60ff82169050919050565b61196681611951565b82525050565b5f60208201905061197f5f83018461195d565b92915050565b5f61198f826117a7565b9050919050565b61199f81611985565b81146119a9575f80fd5b50565b5f813590506119ba81611996565b92915050565b5f602082840312156119d5576119d4611784565b5b5f6119e2848285016119ac565b91505092915050565b5f60208284031215611a00576119ff611784565b5b5f611a0d848285016117ce565b91505092915050565b5f819050919050565b611a2881611a16565b82525050565b5f604082019050611a415f8301856118b1565b611a4e6020830184611a1f565b9392505050565b5f8060408385031215611a6b57611a6a611784565b5b5f611a78858286016117ce565b9250506020611a89858286016117ce565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611ad757607f821691505b602082108103611aea57611ae9611a93565b5b50919050565b5f81519050611afe816117eb565b92915050565b5f60208284031215611b1957611b18611784565b5b5f611b2684828501611af0565b91505092915050565b5f604082019050611b425f8301856118b1565b611b4f60208301846118d9565b9392505050565b611b5f81611853565b8114611b69575f80fd5b50565b5f81519050611b7a81611b56565b92915050565b5f60208284031215611b9557611b94611784565b5b5f611ba284828501611b6c565b91505092915050565b7f4e6f7420656e6f75676820746f6b656e73206c65667420666f72206d696e74695f8201527f6e67000000000000000000000000000000000000000000000000000000000000602082015250565b5f611c056022836116fe565b9150611c1082611bab565b604082019050919050565b5f6020820190508181035f830152611c3281611bf9565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611c70826117e2565b9150611c7b836117e2565b9250828203905081811115611c9357611c92611c39565b5b92915050565b5f611ca3826117e2565b9150611cae836117e2565b9250828202611cbc816117e2565b91508282048414831517611cd357611cd2611c39565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611d11826117e2565b9150611d1c836117e2565b925082611d2c57611d2b611cda565b5b828204905092915050565b5f606082019050611d4a5f8301866118b1565b611d5760208301856118d9565b611d6460408301846118d9565b949350505050565b5f611d76826117e2565b9150611d81836117e2565b9250828201905080821115611d9957611d98611c39565b5b9291505056fea26469706673582212205f5073e0aef3fc4a98f00fe530f4b4f17fc74a0ef83b5fce64ccbf28aa78be0664736f6c63430008190033
Deployed Bytecode Sourcemap
42775:4256:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31458:147;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34031:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43016:32;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32672:155;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43164:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34799:249;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43057:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32523:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46860:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43289:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43123:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46787:65;;;:::i;:::-;;45415:468;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46629:81;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23889:148;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32890:174;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20293:103;;;:::i;:::-;;43088:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46718:61;;;:::i;:::-;;42966:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;19558:147;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31724:151;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46025:596;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43241:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43433:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43200:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43363:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33514:198;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20551:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31458:147;31503:13;31529:22;31554:18;:16;:18::i;:::-;31529:43;;31590:1;:7;;31583:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31458:147;:::o;34031:190::-;34104:4;34121:13;34137:12;:10;:12::i;:::-;34121:28;;34160:31;34169:5;34176:7;34185:5;34160:8;:31::i;:::-;34209:4;34202:11;;;34031:190;;;;:::o;43016:32::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32672:155::-;32724:7;32744:22;32769:18;:16;:18::i;:::-;32744:43;;32805:1;:14;;;32798:21;;;32672:155;:::o;43164:29::-;;;;;;;;;;;;;:::o;34799:249::-;34886:4;34903:15;34921:12;:10;:12::i;:::-;34903:30;;34944:37;34960:4;34966:7;34975:5;34944:15;:37::i;:::-;34992:26;35002:4;35008:2;35012:5;34992:9;:26::i;:::-;35036:4;35029:11;;;34799:249;;;;;:::o;43057:24::-;;;;;;;;;;;;;:::o;32523:84::-;32572:5;32597:2;32590:9;;32523:84;:::o;46860:168::-;19444:13;:11;:13::i;:::-;46928:14:::1;46945:5;:15;;;46969:4;46945:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46928:47;;46986:5;:14;;;47001:10;47013:6;46986:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46917:111;46860:168:::0;:::o;43289:28::-;;;;:::o;43123:34::-;;;;;;;;;;;;;:::o;46787:65::-;19444:13;:11;:13::i;:::-;46834:10:::1;:8;:10::i;:::-;46787:65::o:0;45415:468::-;19444:13;:11;:13::i;:::-;45510:15:::1;;45500:6;:25;;45492:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;45575:24;45581:9;45592:6;45575:5;:24::i;:::-;45629:6;45610:15;;:25;;;;;;;:::i;:::-;;;;;;;;45720:9;;45703:13;:11;:13::i;:::-;:26;45699:177;;45794:38;45812:19;45794:17;:38::i;:::-;45699:177;45415:468:::0;;:::o;46629:81::-;46677:25;46683:10;46695:6;46677:5;:25::i;:::-;46629:81;:::o;23889:148::-;23936:4;23953:25;23981:21;:19;:21::i;:::-;23953:49;;24020:1;:9;;;;;;;;;;;;24013:16;;;23889:148;:::o;32890:174::-;32955:7;32975:22;33000:18;:16;:18::i;:::-;32975:43;;33036:1;:11;;:20;33048:7;33036:20;;;;;;;;;;;;;;;;33029:27;;;32890:174;;;:::o;20293:103::-;19444:13;:11;:13::i;:::-;20358:30:::1;20385:1;20358:18;:30::i;:::-;20293:103::o:0;43088:28::-;;;;;;;;;;;;;:::o;46718:61::-;19444:13;:11;:13::i;:::-;46763:8:::1;:6;:8::i;:::-;46718:61::o:0;42966:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19558:147::-;19604:7;19624:24;19651:20;:18;:20::i;:::-;19624:47;;19689:1;:8;;;;;;;;;;;;19682:15;;;19558:147;:::o;31724:151::-;31771:13;31797:22;31822:18;:16;:18::i;:::-;31797:43;;31858:1;:9;;31851:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31724:151;:::o;46025:596::-;46116:4;23494:19;:17;:19::i;:::-;46200:17:::1;46235:3;46230:1;46221:6;:10;;;;:::i;:::-;46220:18;;;;:::i;:::-;46200:38;;46299:36;46305:9;;;;;;;;;;;46332:2;46328:1;46316:9;:13;;;;:::i;:::-;:18;;;;:::i;:::-;46299:5;:36::i;:::-;46386;46392:13;;;;;;;;;;;46419:2;46407:9;:14;;;;:::i;:::-;46386:5;:36::i;:::-;46541:40;46551:10;46563:9;46574:6;46541:9;:40::i;:::-;46609:4;46602:11;;;46025:596:::0;;;;:::o;43241:39::-;;;;;;;;;;;;;:::o;43433:30::-;;;;:::o;43200:34::-;;;;;;;;;;;;;:::o;43363:24::-;;;;:::o;33514:198::-;33594:7;33614:22;33639:18;:16;:18::i;:::-;33614:43;;33675:1;:13;;:20;33689:5;33675:20;;;;;;;;;;;;;;;:29;33696:7;33675:29;;;;;;;;;;;;;;;;33668:36;;;33514:198;;;;:::o;20551:220::-;19444:13;:11;:13::i;:::-;20656:1:::1;20636:22;;:8;:22;;::::0;20632:93:::1;;20710:1;20682:31;;;;;;;;;;;:::i;:::-;;;;;;;;20632:93;20735:28;20754:8;20735:18;:28::i;:::-;20551:220:::0;:::o;30664:157::-;30714:22;30783:20;30773:30;;30664:157;:::o;16809:98::-;16862:7;16889:10;16882:17;;16809:98;:::o;38922:130::-;39007:37;39016:5;39023:7;39032:5;39039:4;39007:8;:37::i;:::-;38922:130;;;:::o;40694:487::-;40794:24;40821:25;40831:5;40838:7;40821:9;:25::i;:::-;40794:52;;40881:17;40861:16;:37;40857:317;;40938:5;40919:16;:24;40915:132;;;40998:7;41007:16;41025:5;40971:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;40915:132;41090:57;41099:5;41106:7;41134:5;41115:16;:24;41141:5;41090:8;:57::i;:::-;40857:317;40783:398;40694:487;;;:::o;35433:308::-;35533:1;35517:18;;:4;:18;;;35513:88;;35586:1;35559:30;;;;;;;;;;;:::i;:::-;;;;;;;;35513:88;35629:1;35615:16;;:2;:16;;;35611:88;;35684:1;35655:32;;;;;;;;;;;:::i;:::-;;;;;;;;35611:88;35709:24;35717:4;35723:2;35727:5;35709:7;:24::i;:::-;35433:308;;;:::o;19783:166::-;19854:12;:10;:12::i;:::-;19843:23;;:7;:5;:7::i;:::-;:23;;;19839:103;;19917:12;:10;:12::i;:::-;19890:40;;;;;;;;;;;:::i;:::-;;;;;;;;19839:103;19783:166::o;24914:182::-;23753:16;:14;:16::i;:::-;24973:25:::1;25001:21;:19;:21::i;:::-;24973:49;;25045:5;25033:1;:9;;;:17;;;;;;;;;;;;;;;;;;25066:22;25075:12;:10;:12::i;:::-;25066:22;;;;;;:::i;:::-;;;;;;;;24962:134;24914:182::o:0;37617:213::-;37707:1;37688:21;;:7;:21;;;37684:93;;37762:1;37733:32;;;;;;;;;;;:::i;:::-;;;;;;;;37684:93;37787:35;37803:1;37807:7;37816:5;37787:7;:35::i;:::-;37617:213;;:::o;45891:126::-;45967:6;45954:9;;:19;;;;;;;:::i;:::-;;;;;;;;46003:6;45984:15;;:25;;;;;;;:::i;:::-;;;;;;;;45891:126;:::o;38158:211::-;38248:1;38229:21;;:7;:21;;;38225:91;;38301:1;38274:30;;;;;;;;;;;:::i;:::-;;;;;;;;38225:91;38326:35;38334:7;38351:1;38355:5;38326:7;:35::i;:::-;38158:211;;:::o;22279:166::-;22332:25;22404:23;22394:33;;22279:166;:::o;20931:253::-;21005:24;21032:20;:18;:20::i;:::-;21005:47;;21063:16;21082:1;:8;;;;;;;;;;;;21063:27;;21112:8;21101:1;:8;;;:19;;;;;;;;;;;;;;;;;;21167:8;21136:40;;21157:8;21136:40;;;;;;;;;;;;20994:190;;20931:253;:::o;24593:180::-;23494:19;:17;:19::i;:::-;24653:25:::1;24681:21;:19;:21::i;:::-;24653:49;;24725:4;24713:1;:9;;;:16;;;;;;;;;;;;;;;;;;24745:20;24752:12;:10;:12::i;:::-;24745:20;;;;;;:::i;:::-;;;;;;;;24642:131;24593:180::o:0;18266:163::-;18318:24;18389:22;18379:32;;18266:163;:::o;24110:132::-;24176:8;:6;:8::i;:::-;24172:63;;;24208:15;;;;;;;;;;;;;;24172:63;24110:132::o;39903:499::-;40012:22;40037:18;:16;:18::i;:::-;40012:43;;40087:1;40070:19;;:5;:19;;;40066:91;;40142:1;40113:32;;;;;;;;;;;:::i;:::-;;;;;;;;40066:91;40190:1;40171:21;;:7;:21;;;40167:92;;40244:1;40216:31;;;;;;;;;;;:::i;:::-;;;;;;;;40167:92;40301:5;40269:1;:13;;:20;40283:5;40269:20;;;;;;;;;;;;;;;:29;40290:7;40269:29;;;;;;;;;;;;;;;:37;;;;40321:9;40317:78;;;40368:7;40352:31;;40361:5;40352:31;;;40377:5;40352:31;;;;;;:::i;:::-;;;;;;;;40317:78;40001:401;39903:499;;;;:::o;42552:147::-;23494:19;:17;:19::i;:::-;42661:30:::1;42675:4;42681:2;42685:5;42661:13;:30::i;:::-;42552:147:::0;;;:::o;24319:130::-;24383:8;:6;:8::i;:::-;24378:64;;24415:15;;;;;;;;;;;;;;24378:64;24319:130::o;36065:1199::-;36151:22;36176:18;:16;:18::i;:::-;36151:43;;36225:1;36209:18;;:4;:18;;;36205:558;;36365:5;36347:1;:14;;;:23;;;;;;;:::i;:::-;;;;;;;;36205:558;;;36403:19;36425:1;:11;;:17;36437:4;36425:17;;;;;;;;;;;;;;;;36403:39;;36475:5;36461:11;:19;36457:117;;;36533:4;36539:11;36552:5;36508:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;36457:117;36731:5;36717:11;:19;36697:1;:11;;:17;36709:4;36697:17;;;;;;;;;;;;;;;:39;;;;36388:375;36205:558;36793:1;36779:16;;:2;:16;;;36775:439;;36963:5;36945:1;:14;;;:23;;;;;;;;;;;36775:439;;;37182:5;37163:1;:11;;:15;37175:2;37163:15;;;;;;;;;;;;;;;;:24;;;;;;;;;;;36775:439;37246:2;37231:25;;37240:4;37231:25;;;37250:5;37231:25;;;;;;:::i;:::-;;;;;;;;36140:1124;36065:1199;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:139::-;376:6;371:3;366;360:23;417:1;408:6;403:3;399:16;392:27;287:139;;;:::o;432:102::-;473:6;524:2;520:7;515:2;508:5;504:14;500:28;490:38;;432:102;;;:::o;540:377::-;628:3;656:39;689:5;656:39;:::i;:::-;711:71;775:6;770:3;711:71;:::i;:::-;704:78;;791:65;849:6;844:3;837:4;830:5;826:16;791:65;:::i;:::-;881:29;903:6;881:29;:::i;:::-;876:3;872:39;865:46;;632:285;540:377;;;;:::o;923:313::-;1036:4;1074:2;1063:9;1059:18;1051:26;;1123:9;1117:4;1113:20;1109:1;1098:9;1094:17;1087:47;1151:78;1224:4;1215:6;1151:78;:::i;:::-;1143:86;;923:313;;;;:::o;1323:117::-;1432:1;1429;1422:12;1569:126;1606:7;1646:42;1639:5;1635:54;1624:65;;1569:126;;;:::o;1701:96::-;1738:7;1767:24;1785:5;1767:24;:::i;:::-;1756:35;;1701:96;;;:::o;1803:122::-;1876:24;1894:5;1876:24;:::i;:::-;1869:5;1866:35;1856:63;;1915:1;1912;1905:12;1856:63;1803:122;:::o;1931:139::-;1977:5;2015:6;2002:20;1993:29;;2031:33;2058:5;2031:33;:::i;:::-;1931:139;;;;:::o;2076:77::-;2113:7;2142:5;2131:16;;2076:77;;;:::o;2159:122::-;2232:24;2250:5;2232:24;:::i;:::-;2225:5;2222:35;2212:63;;2271:1;2268;2261:12;2212:63;2159:122;:::o;2287:139::-;2333:5;2371:6;2358:20;2349:29;;2387:33;2414:5;2387:33;:::i;:::-;2287:139;;;;:::o;2432:474::-;2500:6;2508;2557:2;2545:9;2536:7;2532:23;2528:32;2525:119;;;2563:79;;:::i;:::-;2525:119;2683:1;2708:53;2753:7;2744:6;2733:9;2729:22;2708:53;:::i;:::-;2698:63;;2654:117;2810:2;2836:53;2881:7;2872:6;2861:9;2857:22;2836:53;:::i;:::-;2826:63;;2781:118;2432:474;;;;;:::o;2912:90::-;2946:7;2989:5;2982:13;2975:21;2964:32;;2912:90;;;:::o;3008:109::-;3089:21;3104:5;3089:21;:::i;:::-;3084:3;3077:34;3008:109;;:::o;3123:210::-;3210:4;3248:2;3237:9;3233:18;3225:26;;3261:65;3323:1;3312:9;3308:17;3299:6;3261:65;:::i;:::-;3123:210;;;;:::o;3339:329::-;3398:6;3447:2;3435:9;3426:7;3422:23;3418:32;3415:119;;;3453:79;;:::i;:::-;3415:119;3573:1;3598:53;3643:7;3634:6;3623:9;3619:22;3598:53;:::i;:::-;3588:63;;3544:117;3339:329;;;;:::o;3674:118::-;3761:24;3779:5;3761:24;:::i;:::-;3756:3;3749:37;3674:118;;:::o;3798:222::-;3891:4;3929:2;3918:9;3914:18;3906:26;;3942:71;4010:1;3999:9;3995:17;3986:6;3942:71;:::i;:::-;3798:222;;;;:::o;4026:118::-;4113:24;4131:5;4113:24;:::i;:::-;4108:3;4101:37;4026:118;;:::o;4150:222::-;4243:4;4281:2;4270:9;4266:18;4258:26;;4294:71;4362:1;4351:9;4347:17;4338:6;4294:71;:::i;:::-;4150:222;;;;:::o;4378:619::-;4455:6;4463;4471;4520:2;4508:9;4499:7;4495:23;4491:32;4488:119;;;4526:79;;:::i;:::-;4488:119;4646:1;4671:53;4716:7;4707:6;4696:9;4692:22;4671:53;:::i;:::-;4661:63;;4617:117;4773:2;4799:53;4844:7;4835:6;4824:9;4820:22;4799:53;:::i;:::-;4789:63;;4744:118;4901:2;4927:53;4972:7;4963:6;4952:9;4948:22;4927:53;:::i;:::-;4917:63;;4872:118;4378:619;;;;;:::o;5003:86::-;5038:7;5078:4;5071:5;5067:16;5056:27;;5003:86;;;:::o;5095:112::-;5178:22;5194:5;5178:22;:::i;:::-;5173:3;5166:35;5095:112;;:::o;5213:214::-;5302:4;5340:2;5329:9;5325:18;5317:26;;5353:67;5417:1;5406:9;5402:17;5393:6;5353:67;:::i;:::-;5213:214;;;;:::o;5433:110::-;5484:7;5513:24;5531:5;5513:24;:::i;:::-;5502:35;;5433:110;;;:::o;5549:150::-;5636:38;5668:5;5636:38;:::i;:::-;5629:5;5626:49;5616:77;;5689:1;5686;5679:12;5616:77;5549:150;:::o;5705:167::-;5765:5;5803:6;5790:20;5781:29;;5819:47;5860:5;5819:47;:::i;:::-;5705:167;;;;:::o;5878:357::-;5951:6;6000:2;5988:9;5979:7;5975:23;5971:32;5968:119;;;6006:79;;:::i;:::-;5968:119;6126:1;6151:67;6210:7;6201:6;6190:9;6186:22;6151:67;:::i;:::-;6141:77;;6097:131;5878:357;;;;:::o;6241:329::-;6300:6;6349:2;6337:9;6328:7;6324:23;6320:32;6317:119;;;6355:79;;:::i;:::-;6317:119;6475:1;6500:53;6545:7;6536:6;6525:9;6521:22;6500:53;:::i;:::-;6490:63;;6446:117;6241:329;;;;:::o;6576:77::-;6613:7;6642:5;6631:16;;6576:77;;;:::o;6659:118::-;6746:24;6764:5;6746:24;:::i;:::-;6741:3;6734:37;6659:118;;:::o;6783:332::-;6904:4;6942:2;6931:9;6927:18;6919:26;;6955:71;7023:1;7012:9;7008:17;6999:6;6955:71;:::i;:::-;7036:72;7104:2;7093:9;7089:18;7080:6;7036:72;:::i;:::-;6783:332;;;;;:::o;7121:474::-;7189:6;7197;7246:2;7234:9;7225:7;7221:23;7217:32;7214:119;;;7252:79;;:::i;:::-;7214:119;7372:1;7397:53;7442:7;7433:6;7422:9;7418:22;7397:53;:::i;:::-;7387:63;;7343:117;7499:2;7525:53;7570:7;7561:6;7550:9;7546:22;7525:53;:::i;:::-;7515:63;;7470:118;7121:474;;;;;:::o;7601:180::-;7649:77;7646:1;7639:88;7746:4;7743:1;7736:15;7770:4;7767:1;7760:15;7787:320;7831:6;7868:1;7862:4;7858:12;7848:22;;7915:1;7909:4;7905:12;7936:18;7926:81;;7992:4;7984:6;7980:17;7970:27;;7926:81;8054:2;8046:6;8043:14;8023:18;8020:38;8017:84;;8073:18;;:::i;:::-;8017:84;7838:269;7787:320;;;:::o;8113:143::-;8170:5;8201:6;8195:13;8186:22;;8217:33;8244:5;8217:33;:::i;:::-;8113:143;;;;:::o;8262:351::-;8332:6;8381:2;8369:9;8360:7;8356:23;8352:32;8349:119;;;8387:79;;:::i;:::-;8349:119;8507:1;8532:64;8588:7;8579:6;8568:9;8564:22;8532:64;:::i;:::-;8522:74;;8478:128;8262:351;;;;:::o;8619:332::-;8740:4;8778:2;8767:9;8763:18;8755:26;;8791:71;8859:1;8848:9;8844:17;8835:6;8791:71;:::i;:::-;8872:72;8940:2;8929:9;8925:18;8916:6;8872:72;:::i;:::-;8619:332;;;;;:::o;8957:116::-;9027:21;9042:5;9027:21;:::i;:::-;9020:5;9017:32;9007:60;;9063:1;9060;9053:12;9007:60;8957:116;:::o;9079:137::-;9133:5;9164:6;9158:13;9149:22;;9180:30;9204:5;9180:30;:::i;:::-;9079:137;;;;:::o;9222:345::-;9289:6;9338:2;9326:9;9317:7;9313:23;9309:32;9306:119;;;9344:79;;:::i;:::-;9306:119;9464:1;9489:61;9542:7;9533:6;9522:9;9518:22;9489:61;:::i;:::-;9479:71;;9435:125;9222:345;;;;:::o;9573:221::-;9713:34;9709:1;9701:6;9697:14;9690:58;9782:4;9777:2;9769:6;9765:15;9758:29;9573:221;:::o;9800:366::-;9942:3;9963:67;10027:2;10022:3;9963:67;:::i;:::-;9956:74;;10039:93;10128:3;10039:93;:::i;:::-;10157:2;10152:3;10148:12;10141:19;;9800:366;;;:::o;10172:419::-;10338:4;10376:2;10365:9;10361:18;10353:26;;10425:9;10419:4;10415:20;10411:1;10400:9;10396:17;10389:47;10453:131;10579:4;10453:131;:::i;:::-;10445:139;;10172:419;;;:::o;10597:180::-;10645:77;10642:1;10635:88;10742:4;10739:1;10732:15;10766:4;10763:1;10756:15;10783:194;10823:4;10843:20;10861:1;10843:20;:::i;:::-;10838:25;;10877:20;10895:1;10877:20;:::i;:::-;10872:25;;10921:1;10918;10914:9;10906:17;;10945:1;10939:4;10936:11;10933:37;;;10950:18;;:::i;:::-;10933:37;10783:194;;;;:::o;10983:410::-;11023:7;11046:20;11064:1;11046:20;:::i;:::-;11041:25;;11080:20;11098:1;11080:20;:::i;:::-;11075:25;;11135:1;11132;11128:9;11157:30;11175:11;11157:30;:::i;:::-;11146:41;;11336:1;11327:7;11323:15;11320:1;11317:22;11297:1;11290:9;11270:83;11247:139;;11366:18;;:::i;:::-;11247:139;11031:362;10983:410;;;;:::o;11399:180::-;11447:77;11444:1;11437:88;11544:4;11541:1;11534:15;11568:4;11565:1;11558:15;11585:185;11625:1;11642:20;11660:1;11642:20;:::i;:::-;11637:25;;11676:20;11694:1;11676:20;:::i;:::-;11671:25;;11715:1;11705:35;;11720:18;;:::i;:::-;11705:35;11762:1;11759;11755:9;11750:14;;11585:185;;;;:::o;11776:442::-;11925:4;11963:2;11952:9;11948:18;11940:26;;11976:71;12044:1;12033:9;12029:17;12020:6;11976:71;:::i;:::-;12057:72;12125:2;12114:9;12110:18;12101:6;12057:72;:::i;:::-;12139;12207:2;12196:9;12192:18;12183:6;12139:72;:::i;:::-;11776:442;;;;;;:::o;12224:191::-;12264:3;12283:20;12301:1;12283:20;:::i;:::-;12278:25;;12317:20;12335:1;12317:20;:::i;:::-;12312:25;;12360:1;12357;12353:9;12346:16;;12381:3;12378:1;12375:10;12372:36;;;12388:18;;:::i;:::-;12372:36;12224:191;;;;:::o
Swarm Source
ipfs://5f5073e0aef3fc4a98f00fe530f4b4f17fc74a0ef83b5fce64ccbf28aa78be06
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
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.