Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
DeBridgeToken
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-01-08 */ // Sources flattened with hardhat v2.7.0 https://hardhat.org // File @openzeppelin/contracts-upgradeable/access/[email protected] // SPDX-License-Identifier: BUSL-1.1 AND MIT // OpenZeppelin Contracts v4.4.0 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlUpgradeable { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // OpenZeppelin Contracts v4.4.0 (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; /** * @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 a proxied contract can't have 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. * * 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 initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal initializer { __ERC165_init_unchained(); } function __ERC165_init_unchained() internal initializer { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // OpenZeppelin Contracts v4.4.0 (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable { function __AccessControl_init() internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __AccessControl_init_unchained(); } function __AccessControl_init_unchained() internal initializer { } struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", StringsUpgradeable.toHexString(uint160(account), 20), " is missing role ", StringsUpgradeable.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC20/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @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); } // File @openzeppelin/contracts-upgradeable/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20MetadataUpgradeable is IERC20Upgradeable { /** * @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/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @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}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * 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. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * 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 initializer { __Context_init_unchained(); __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * 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 override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); 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}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * 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. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` 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. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} uint256[45] private __gap; } // File @openzeppelin/contracts-upgradeable/security/[email protected] // OpenZeppelin Contracts v4.4.0 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @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 { /** * @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); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal initializer { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal initializer { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/ERC20Pausable.sol) pragma solidity ^0.8.0; /** * @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. */ abstract contract ERC20PausableUpgradeable is Initializable, ERC20Upgradeable, PausableUpgradeable { function __ERC20Pausable_init() internal initializer { __Context_init_unchained(); __Pausable_init_unchained(); __ERC20Pausable_init_unchained(); } function __ERC20Pausable_init_unchained() internal initializer { } /** * @dev See {ERC20-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override { super._beforeTokenTransfer(from, to, amount); require(!paused(), "ERC20Pausable: token transfer while paused"); } uint256[50] private __gap; } // File contracts/interfaces/IERC20Permit.sol pragma solidity ^0.8.7; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } // File contracts/interfaces/IDeBridgeToken.sol pragma solidity ^0.8.7; interface IDeBridgeToken is IERC20Upgradeable, IERC20Permit { /// @dev Issues new tokens. /// @param _receiver Token's receiver. /// @param _amount Amount to be minted. function mint(address _receiver, uint256 _amount) external; /// @dev Destroys existing tokens. /// @param _amount Amount to be burnt. function burn(uint256 _amount) external; } // File contracts/periphery/DeBridgeToken.sol pragma solidity ^0.8.7; /// @dev ERC20 token that is used as wrapped asset to represent the native token value on the other chains. contract DeBridgeToken is Initializable, AccessControlUpgradeable, ERC20PausableUpgradeable, IDeBridgeToken { /// @dev Minter role identifier bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); /// @dev Pauser role identifier bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); /// @dev Domain separator as described in [EIP-712](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#rationale) bytes32 public DOMAIN_SEPARATOR; /// @dev Typehash as described in [EIP-712](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#rationale). /// =keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; /// @dev Transfers counter mapping(address => uint256) public nonces; /// @dev Asset's decimals uint8 internal _decimals; /* ========== ERRORS ========== */ error MinterBadRole(); error PauserBadRole(); /* ========== MODIFIERS ========== */ modifier onlyMinter() { if (!hasRole(MINTER_ROLE, msg.sender)) revert MinterBadRole(); _; } modifier onlyPauser() { if (!hasRole(PAUSER_ROLE, msg.sender)) revert PauserBadRole(); _; } /// @dev Constructor that initializes the most important configurations. /// @param name_ Asset's name. /// @param symbol_ Asset's symbol. /// @param decimals_ Asset's decimals. /// @param admin Address to set as asset's admin. /// @param minters The accounts allowed to int new tokens. function initialize( string memory name_, string memory symbol_, uint8 decimals_, address admin, address[] memory minters ) public initializer { _decimals = decimals_; name_ = bytes(name_).length == 0 ? symbol_ : name_; __ERC20_init_unchained(name_, symbol_); _setupRole(DEFAULT_ADMIN_ROLE, admin); _setupRole(PAUSER_ROLE, admin); uint256 mintersCount = minters.length; for (uint256 i = 0; i < mintersCount; i++) { _setupRole(MINTER_ROLE, minters[i]); } uint256 chainId; assembly { chainId := chainid() } DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ), keccak256(bytes(name_)), keccak256(bytes("1")), chainId, address(this) ) ); } /// @inheritdoc IDeBridgeToken function mint(address _receiver, uint256 _amount) external override onlyMinter { _mint(_receiver, _amount); } /// @inheritdoc IDeBridgeToken function burn(uint256 _amount) external override onlyMinter { _burn(msg.sender, _amount); } /// @dev Approves the spender by signature. /// @param _owner Token's owner. /// @param _spender Account to be approved. /// @param _value Amount to be approved. /// @param _deadline The permit valid until. /// @param _v Signature part. /// @param _r Signature part. /// @param _s Signature part. function permit( address _owner, address _spender, uint256 _value, uint256 _deadline, uint8 _v, bytes32 _r, bytes32 _s ) external override { require(_deadline >= block.timestamp, "permit: EXPIRED"); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256( abi.encode( PERMIT_TYPEHASH, _owner, _spender, _value, nonces[_owner]++, _deadline ) ) ) ); address recoveredAddress = ecrecover(digest, _v, _r, _s); require( recoveredAddress != address(0) && recoveredAddress == _owner, "permit: invalid signature" ); _approve(_owner, _spender, _value); } /// @dev Asset's decimals function decimals() public view override returns (uint8) { return _decimals; } /// @dev Pauses all token transfers. The caller must have the `PAUSER_ROLE`. function pause() public onlyPauser { _pause(); } /// @dev Unpauses all token transfers. The caller must have the `PAUSER_ROLE`. function unpause() public onlyPauser { _unpause(); } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override { super._beforeTokenTransfer(from, to, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"name":"MinterBadRole","type":"error"},{"inputs":[],"name":"PauserBadRole","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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","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":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"address[]","name":"minters","type":"address[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","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":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50611dd4806100206000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80635471a50411610104578063a217fddf116100a2578063d539139311610071578063d5391393146103f3578063d547741f14610408578063dd62ed3e1461041b578063e63ab1e91461045457600080fd5b8063a217fddf146103b2578063a457c2d7146103ba578063a9059cbb146103cd578063d505accf146103e057600080fd5b80637ecebe00116100de5780637ecebe001461036e5780638456cb591461038f57806391d148541461039757806395d89b41146103aa57600080fd5b80635471a504146103275780635c975abb1461033a57806370a082311461034557600080fd5b806330adf81f1161017c578063395093511161014b57806339509351146102e65780633f4ba83a146102f957806340c10f191461030157806342966c681461031457600080fd5b806330adf81f1461028c578063313ce567146102b35780633644e515146102c957806336568abe146102d357600080fd5b806318160ddd116101b857806318160ddd1461022f57806323b872dd14610241578063248a9ca3146102545780632f2ff15d1461027757600080fd5b806301ffc9a7146101df57806306fdde0314610207578063095ea7b31461021c575b600080fd5b6101f26101ed3660046116ed565b610469565b60405190151581526020015b60405180910390f35b61020f6104a0565b6040516101fe919061173b565b6101f261022a36600461178a565b610532565b6099545b6040519081526020016101fe565b6101f261024f3660046117b4565b610548565b6102336102623660046117f0565b60009081526065602052604090206001015490565b61028a610285366004611809565b6105f7565b005b6102337f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61012f5460405160ff90911681526020016101fe565b61023361012d5481565b61028a6102e1366004611809565b610622565b6101f26102f436600461178a565b6106a0565b61028a6106dc565b61028a61030f36600461178a565b61071b565b61028a6103223660046117f0565b61075a565b61028a6103353660046118fd565b61079c565b60c95460ff166101f2565b610233610353366004611a13565b6001600160a01b031660009081526097602052604090205490565b61023361037c366004611a13565b61012e6020526000908152604090205481565b61028a610950565b6101f26103a5366004611809565b61098d565b61020f6109b8565b610233600081565b6101f26103c836600461178a565b6109c7565b6101f26103db36600461178a565b610a60565b61028a6103ee366004611a2e565b610a6d565b610233600080516020611d7f83398151915281565b61028a610416366004611809565b610c80565b610233610429366004611a98565b6001600160a01b03918216600090815260986020908152604080832093909416825291909152205490565b610233600080516020611d5f83398151915281565b60006001600160e01b03198216637965db0b60e01b148061049a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060609a80546104af90611ac2565b80601f01602080910402602001604051908101604052809291908181526020018280546104db90611ac2565b80156105285780601f106104fd57610100808354040283529160200191610528565b820191906000526020600020905b81548152906001019060200180831161050b57829003601f168201915b5050505050905090565b600061053f338484610ca6565b50600192915050565b6000610555848484610dca565b6001600160a01b0384166000908152609860209081526040808320338452909152902054828110156105df5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6105ec8533858403610ca6565b506001949350505050565b6000828152606560205260409020600101546106138133610fa4565b61061d8383611008565b505050565b6001600160a01b03811633146106925760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016105d6565b61069c828261108e565b5050565b3360008181526098602090815260408083206001600160a01b0387168452909152812054909161053f9185906106d7908690611b12565b610ca6565b6106f4600080516020611d5f8339815191523361098d565b61071157604051634794afc360e11b815260040160405180910390fd5b6107196110f5565b565b610733600080516020611d7f8339815191523361098d565b61075057604051630b21270760e21b815260040160405180910390fd5b61069c8282611188565b610772600080516020611d7f8339815191523361098d565b61078f57604051630b21270760e21b815260040160405180910390fd5b6107993382611273565b50565b600054610100900460ff16806107b5575060005460ff16155b6107d15760405162461bcd60e51b81526004016105d690611b25565b600054610100900460ff161580156107f3576000805461ffff19166101011790555b61012f805460ff191660ff86161790558551156108105785610812565b845b955061081e86866113cd565b610829600084611454565b610841600080516020611d5f83398151915284611454565b815160005b818110156108915761087f600080516020611d7f83398151915285838151811061087257610872611b73565b6020026020010151611454565b8061088981611b89565b915050610846565b50865160208089019190912060408051808201825260018152603160f81b9084015280517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f938101939093528201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015246608082018190523060a08301529060c00160408051601f19818403018152919052805160209091012061012d5550508015610948576000805461ff00191690555b505050505050565b610968600080516020611d5f8339815191523361098d565b61098557604051634794afc360e11b815260040160405180910390fd5b61071961145e565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060609b80546104af90611ac2565b3360009081526098602090815260408083206001600160a01b038616845290915281205482811015610a495760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105d6565b610a563385858403610ca6565b5060019392505050565b600061053f338484610dca565b42841015610aaf5760405162461bcd60e51b815260206004820152600f60248201526e1c195c9b5a5d0e8811561412549151608a1b60448201526064016105d6565b61012d546001600160a01b038816600090815261012e6020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087610b0483611b89565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001610b7d92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015610be8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610c1e5750886001600160a01b0316816001600160a01b0316145b610c6a5760405162461bcd60e51b815260206004820152601960248201527f7065726d69743a20696e76616c6964207369676e61747572650000000000000060448201526064016105d6565b610c75898989610ca6565b505050505050505050565b600082815260656020526040902060010154610c9c8133610fa4565b61061d838361108e565b6001600160a01b038316610d085760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105d6565b6001600160a01b038216610d695760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105d6565b6001600160a01b0383811660008181526098602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610e2e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105d6565b6001600160a01b038216610e905760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105d6565b610e9b8383836114d9565b6001600160a01b03831660009081526097602052604090205481811015610f135760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105d6565b6001600160a01b03808516600090815260976020526040808220858503905591851681529081208054849290610f4a908490611b12565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610f9691815260200190565b60405180910390a350505050565b610fae828261098d565b61069c57610fc6816001600160a01b031660146114e4565b610fd18360206114e4565b604051602001610fe2929190611ba2565b60408051601f198184030181529082905262461bcd60e51b82526105d69160040161173b565b611012828261098d565b61069c5760008281526065602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561104a3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611098828261098d565b1561069c5760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60c95460ff1661113e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105d6565b60c9805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0382166111de5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105d6565b6111ea600083836114d9565b80609960008282546111fc9190611b12565b90915550506001600160a01b03821660009081526097602052604081208054839290611229908490611b12565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166112d35760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105d6565b6112df826000836114d9565b6001600160a01b038216600090815260976020526040902054818110156113535760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016105d6565b6001600160a01b0383166000908152609760205260408120838303905560998054849290611382908490611c17565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600054610100900460ff16806113e6575060005460ff16155b6114025760405162461bcd60e51b81526004016105d690611b25565b600054610100900460ff16158015611424576000805461ffff19166101011790555b609a6114308482611c70565b50609b61143d8382611c70565b50801561061d576000805461ff0019169055505050565b61069c8282611008565b60c95460ff16156114a45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016105d6565b60c9805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861116b3390565b61061d838383611687565b606060006114f3836002611d30565b6114fe906002611b12565b67ffffffffffffffff81111561151657611516611835565b6040519080825280601f01601f191660200182016040528015611540576020820181803683370190505b509050600360fc1b8160008151811061155b5761155b611b73565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061158a5761158a611b73565b60200101906001600160f81b031916908160001a90535060006115ae846002611d30565b6115b9906001611b12565b90505b6001811115611631576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106115ed576115ed611b73565b1a60f81b82828151811061160357611603611b73565b60200101906001600160f81b031916908160001a90535060049490941c9361162a81611d47565b90506115bc565b5083156116805760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016105d6565b9392505050565b60c95460ff161561061d5760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b60648201526084016105d6565b6000602082840312156116ff57600080fd5b81356001600160e01b03198116811461168057600080fd5b60005b8381101561173257818101518382015260200161171a565b50506000910152565b602081526000825180602084015261175a816040850160208701611717565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461178557600080fd5b919050565b6000806040838503121561179d57600080fd5b6117a68361176e565b946020939093013593505050565b6000806000606084860312156117c957600080fd5b6117d28461176e565b92506117e06020850161176e565b9150604084013590509250925092565b60006020828403121561180257600080fd5b5035919050565b6000806040838503121561181c57600080fd5b8235915061182c6020840161176e565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561187457611874611835565b604052919050565b600082601f83011261188d57600080fd5b813567ffffffffffffffff8111156118a7576118a7611835565b6118ba601f8201601f191660200161184b565b8181528460208386010111156118cf57600080fd5b816020850160208301376000918101602001919091529392505050565b803560ff8116811461178557600080fd5b600080600080600060a0868803121561191557600080fd5b853567ffffffffffffffff8082111561192d57600080fd5b61193989838a0161187c565b965060209150818801358181111561195057600080fd5b61195c8a828b0161187c565b96505061196b604089016118ec565b94506119796060890161176e565b935060808801358181111561198d57600080fd5b8801601f81018a1361199e57600080fd5b8035828111156119b0576119b0611835565b8060051b92506119c184840161184b565b818152928201840192848101908c8511156119db57600080fd5b928501925b84841015611a00576119f18461176e565b825292850192908501906119e0565b8096505050505050509295509295909350565b600060208284031215611a2557600080fd5b6116808261176e565b600080600080600080600060e0888a031215611a4957600080fd5b611a528861176e565b9650611a606020890161176e565b95506040880135945060608801359350611a7c608089016118ec565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215611aab57600080fd5b611ab48361176e565b915061182c6020840161176e565b600181811c90821680611ad657607f821691505b602082108103611af657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561049a5761049a611afc565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060018201611b9b57611b9b611afc565b5060010190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611bda816017850160208801611717565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611c0b816028840160208801611717565b01602801949350505050565b8181038181111561049a5761049a611afc565b601f82111561061d57600081815260208120601f850160051c81016020861015611c515750805b601f850160051c820191505b8181101561094857828155600101611c5d565b815167ffffffffffffffff811115611c8a57611c8a611835565b611c9e81611c988454611ac2565b84611c2a565b602080601f831160018114611cd35760008415611cbb5750858301515b600019600386901b1c1916600185901b178555610948565b600085815260208120601f198616915b82811015611d0257888601518255948401946001909101908401611ce3565b5085821015611d205787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808202811582820484141761049a5761049a611afc565b600081611d5657611d56611afc565b50600019019056fe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a264697066735822122088eaeb2170b139179c43caf7fe3e97a29d44eba89e280dc62f2fa6c09e69479364736f6c63430008110033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80635471a50411610104578063a217fddf116100a2578063d539139311610071578063d5391393146103f3578063d547741f14610408578063dd62ed3e1461041b578063e63ab1e91461045457600080fd5b8063a217fddf146103b2578063a457c2d7146103ba578063a9059cbb146103cd578063d505accf146103e057600080fd5b80637ecebe00116100de5780637ecebe001461036e5780638456cb591461038f57806391d148541461039757806395d89b41146103aa57600080fd5b80635471a504146103275780635c975abb1461033a57806370a082311461034557600080fd5b806330adf81f1161017c578063395093511161014b57806339509351146102e65780633f4ba83a146102f957806340c10f191461030157806342966c681461031457600080fd5b806330adf81f1461028c578063313ce567146102b35780633644e515146102c957806336568abe146102d357600080fd5b806318160ddd116101b857806318160ddd1461022f57806323b872dd14610241578063248a9ca3146102545780632f2ff15d1461027757600080fd5b806301ffc9a7146101df57806306fdde0314610207578063095ea7b31461021c575b600080fd5b6101f26101ed3660046116ed565b610469565b60405190151581526020015b60405180910390f35b61020f6104a0565b6040516101fe919061173b565b6101f261022a36600461178a565b610532565b6099545b6040519081526020016101fe565b6101f261024f3660046117b4565b610548565b6102336102623660046117f0565b60009081526065602052604090206001015490565b61028a610285366004611809565b6105f7565b005b6102337f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61012f5460405160ff90911681526020016101fe565b61023361012d5481565b61028a6102e1366004611809565b610622565b6101f26102f436600461178a565b6106a0565b61028a6106dc565b61028a61030f36600461178a565b61071b565b61028a6103223660046117f0565b61075a565b61028a6103353660046118fd565b61079c565b60c95460ff166101f2565b610233610353366004611a13565b6001600160a01b031660009081526097602052604090205490565b61023361037c366004611a13565b61012e6020526000908152604090205481565b61028a610950565b6101f26103a5366004611809565b61098d565b61020f6109b8565b610233600081565b6101f26103c836600461178a565b6109c7565b6101f26103db36600461178a565b610a60565b61028a6103ee366004611a2e565b610a6d565b610233600080516020611d7f83398151915281565b61028a610416366004611809565b610c80565b610233610429366004611a98565b6001600160a01b03918216600090815260986020908152604080832093909416825291909152205490565b610233600080516020611d5f83398151915281565b60006001600160e01b03198216637965db0b60e01b148061049a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060609a80546104af90611ac2565b80601f01602080910402602001604051908101604052809291908181526020018280546104db90611ac2565b80156105285780601f106104fd57610100808354040283529160200191610528565b820191906000526020600020905b81548152906001019060200180831161050b57829003601f168201915b5050505050905090565b600061053f338484610ca6565b50600192915050565b6000610555848484610dca565b6001600160a01b0384166000908152609860209081526040808320338452909152902054828110156105df5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6105ec8533858403610ca6565b506001949350505050565b6000828152606560205260409020600101546106138133610fa4565b61061d8383611008565b505050565b6001600160a01b03811633146106925760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016105d6565b61069c828261108e565b5050565b3360008181526098602090815260408083206001600160a01b0387168452909152812054909161053f9185906106d7908690611b12565b610ca6565b6106f4600080516020611d5f8339815191523361098d565b61071157604051634794afc360e11b815260040160405180910390fd5b6107196110f5565b565b610733600080516020611d7f8339815191523361098d565b61075057604051630b21270760e21b815260040160405180910390fd5b61069c8282611188565b610772600080516020611d7f8339815191523361098d565b61078f57604051630b21270760e21b815260040160405180910390fd5b6107993382611273565b50565b600054610100900460ff16806107b5575060005460ff16155b6107d15760405162461bcd60e51b81526004016105d690611b25565b600054610100900460ff161580156107f3576000805461ffff19166101011790555b61012f805460ff191660ff86161790558551156108105785610812565b845b955061081e86866113cd565b610829600084611454565b610841600080516020611d5f83398151915284611454565b815160005b818110156108915761087f600080516020611d7f83398151915285838151811061087257610872611b73565b6020026020010151611454565b8061088981611b89565b915050610846565b50865160208089019190912060408051808201825260018152603160f81b9084015280517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f938101939093528201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015246608082018190523060a08301529060c00160408051601f19818403018152919052805160209091012061012d5550508015610948576000805461ff00191690555b505050505050565b610968600080516020611d5f8339815191523361098d565b61098557604051634794afc360e11b815260040160405180910390fd5b61071961145e565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060609b80546104af90611ac2565b3360009081526098602090815260408083206001600160a01b038616845290915281205482811015610a495760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105d6565b610a563385858403610ca6565b5060019392505050565b600061053f338484610dca565b42841015610aaf5760405162461bcd60e51b815260206004820152600f60248201526e1c195c9b5a5d0e8811561412549151608a1b60448201526064016105d6565b61012d546001600160a01b038816600090815261012e6020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087610b0483611b89565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001610b7d92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015610be8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610c1e5750886001600160a01b0316816001600160a01b0316145b610c6a5760405162461bcd60e51b815260206004820152601960248201527f7065726d69743a20696e76616c6964207369676e61747572650000000000000060448201526064016105d6565b610c75898989610ca6565b505050505050505050565b600082815260656020526040902060010154610c9c8133610fa4565b61061d838361108e565b6001600160a01b038316610d085760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105d6565b6001600160a01b038216610d695760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105d6565b6001600160a01b0383811660008181526098602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610e2e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105d6565b6001600160a01b038216610e905760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105d6565b610e9b8383836114d9565b6001600160a01b03831660009081526097602052604090205481811015610f135760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105d6565b6001600160a01b03808516600090815260976020526040808220858503905591851681529081208054849290610f4a908490611b12565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610f9691815260200190565b60405180910390a350505050565b610fae828261098d565b61069c57610fc6816001600160a01b031660146114e4565b610fd18360206114e4565b604051602001610fe2929190611ba2565b60408051601f198184030181529082905262461bcd60e51b82526105d69160040161173b565b611012828261098d565b61069c5760008281526065602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561104a3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611098828261098d565b1561069c5760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60c95460ff1661113e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105d6565b60c9805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0382166111de5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105d6565b6111ea600083836114d9565b80609960008282546111fc9190611b12565b90915550506001600160a01b03821660009081526097602052604081208054839290611229908490611b12565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166112d35760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105d6565b6112df826000836114d9565b6001600160a01b038216600090815260976020526040902054818110156113535760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016105d6565b6001600160a01b0383166000908152609760205260408120838303905560998054849290611382908490611c17565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600054610100900460ff16806113e6575060005460ff16155b6114025760405162461bcd60e51b81526004016105d690611b25565b600054610100900460ff16158015611424576000805461ffff19166101011790555b609a6114308482611c70565b50609b61143d8382611c70565b50801561061d576000805461ff0019169055505050565b61069c8282611008565b60c95460ff16156114a45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016105d6565b60c9805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861116b3390565b61061d838383611687565b606060006114f3836002611d30565b6114fe906002611b12565b67ffffffffffffffff81111561151657611516611835565b6040519080825280601f01601f191660200182016040528015611540576020820181803683370190505b509050600360fc1b8160008151811061155b5761155b611b73565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061158a5761158a611b73565b60200101906001600160f81b031916908160001a90535060006115ae846002611d30565b6115b9906001611b12565b90505b6001811115611631576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106115ed576115ed611b73565b1a60f81b82828151811061160357611603611b73565b60200101906001600160f81b031916908160001a90535060049490941c9361162a81611d47565b90506115bc565b5083156116805760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016105d6565b9392505050565b60c95460ff161561061d5760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b60648201526084016105d6565b6000602082840312156116ff57600080fd5b81356001600160e01b03198116811461168057600080fd5b60005b8381101561173257818101518382015260200161171a565b50506000910152565b602081526000825180602084015261175a816040850160208701611717565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461178557600080fd5b919050565b6000806040838503121561179d57600080fd5b6117a68361176e565b946020939093013593505050565b6000806000606084860312156117c957600080fd5b6117d28461176e565b92506117e06020850161176e565b9150604084013590509250925092565b60006020828403121561180257600080fd5b5035919050565b6000806040838503121561181c57600080fd5b8235915061182c6020840161176e565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561187457611874611835565b604052919050565b600082601f83011261188d57600080fd5b813567ffffffffffffffff8111156118a7576118a7611835565b6118ba601f8201601f191660200161184b565b8181528460208386010111156118cf57600080fd5b816020850160208301376000918101602001919091529392505050565b803560ff8116811461178557600080fd5b600080600080600060a0868803121561191557600080fd5b853567ffffffffffffffff8082111561192d57600080fd5b61193989838a0161187c565b965060209150818801358181111561195057600080fd5b61195c8a828b0161187c565b96505061196b604089016118ec565b94506119796060890161176e565b935060808801358181111561198d57600080fd5b8801601f81018a1361199e57600080fd5b8035828111156119b0576119b0611835565b8060051b92506119c184840161184b565b818152928201840192848101908c8511156119db57600080fd5b928501925b84841015611a00576119f18461176e565b825292850192908501906119e0565b8096505050505050509295509295909350565b600060208284031215611a2557600080fd5b6116808261176e565b600080600080600080600060e0888a031215611a4957600080fd5b611a528861176e565b9650611a606020890161176e565b95506040880135945060608801359350611a7c608089016118ec565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215611aab57600080fd5b611ab48361176e565b915061182c6020840161176e565b600181811c90821680611ad657607f821691505b602082108103611af657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561049a5761049a611afc565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060018201611b9b57611b9b611afc565b5060010190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611bda816017850160208801611717565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611c0b816028840160208801611717565b01602801949350505050565b8181038181111561049a5761049a611afc565b601f82111561061d57600081815260208120601f850160051c81016020861015611c515750805b601f850160051c820191505b8181101561094857828155600101611c5d565b815167ffffffffffffffff811115611c8a57611c8a611835565b611c9e81611c988454611ac2565b84611c2a565b602080601f831160018114611cd35760008415611cbb5750858301515b600019600386901b1c1916600185901b178555610948565b600085815260208120601f198616915b82811015611d0257888601518255948401946001909101908401611ce3565b5085821015611d205787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808202811582820484141761049a5761049a611afc565b600081611d5657611d56611afc565b50600019019056fe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a264697066735822122088eaeb2170b139179c43caf7fe3e97a29d44eba89e280dc62f2fa6c09e69479364736f6c63430008110033
Deployed Bytecode Sourcemap
41561:5124:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14175:215;;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;14175:215:0;;;;;;;;25370:100;;;:::i;:::-;;;;;;;:::i;27537:169::-;;;;;;:::i;:::-;;:::i;26490:108::-;26578:12;;26490:108;;;1736:25:1;;;1724:2;1709:18;26490:108:0;1590:177:1;28188:492:0;;;;;;:::i;:::-;;:::i;15619:123::-;;;;;;:::i;:::-;15685:7;15712:12;;;:6;:12;;;;;:22;;;;15619:123;16004:147;;;;;;:::i;:::-;;:::i;:::-;;42305:117;;42356:66;42305:117;;46076:92;46151:9;;46076:92;;46151:9;;;;2873:36:1;;2861:2;2846:18;46076:92:0;2731:184:1;42038:31:0;;;;;;17052:218;;;;;;:::i;:::-;;:::i;29089:215::-;;;;;;:::i;:::-;;:::i;46413:66::-;;;:::i;44397:123::-;;;;;;:::i;:::-;;:::i;44564:105::-;;;;;;:::i;:::-;;:::i;43279:1074::-;;;;;;:::i;:::-;;:::i;36744:86::-;36815:7;;;;36744:86;;26661:127;;;;;;:::i;:::-;-1:-1:-1;;;;;26762:18:0;26735:7;26762:18;;;:9;:18;;;;;;;26661:127;42461:41;;;;;;:::i;:::-;;;;;;;;;;;;;;46258:62;;;:::i;14482:139::-;;;;;;:::i;:::-;;:::i;25589:104::-;;;:::i;13562:49::-;;13607:4;13562:49;;29807:413;;;;;;:::i;:::-;;:::i;27001:175::-;;;;;;:::i;:::-;;:::i;45014:1023::-;;;;;;:::i;:::-;;:::i;41734:62::-;;-1:-1:-1;;;;;;;;;;;41734:62:0;;16396:149;;;;;;:::i;:::-;;:::i;27239:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;27355:18:0;;;27328:7;27355:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;27239:151;41840:62;;-1:-1:-1;;;;;;;;;;;41840:62:0;;14175:215;14260:4;-1:-1:-1;;;;;;14284:58:0;;-1:-1:-1;;;14284:58:0;;:98;;-1:-1:-1;;;;;;;;;;11151:51:0;;;14346:36;14277:105;14175:215;-1:-1:-1;;14175:215:0:o;25370:100::-;25424:13;25457:5;25450:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25370:100;:::o;27537:169::-;27620:4;27637:39;6656:10;27660:7;27669:6;27637:8;:39::i;:::-;-1:-1:-1;27694:4:0;27537:169;;;;:::o;28188:492::-;28328:4;28345:36;28355:6;28363:9;28374:6;28345:9;:36::i;:::-;-1:-1:-1;;;;;28421:19:0;;28394:24;28421:19;;;:11;:19;;;;;;;;6656:10;28421:33;;;;;;;;28473:26;;;;28465:79;;;;-1:-1:-1;;;28465:79:0;;7371:2:1;28465:79:0;;;7353:21:1;7410:2;7390:18;;;7383:30;7449:34;7429:18;;;7422:62;-1:-1:-1;;;7500:18:1;;;7493:38;7548:19;;28465:79:0;;;;;;;;;28580:57;28589:6;6656:10;28630:6;28611:16;:25;28580:8;:57::i;:::-;-1:-1:-1;28668:4:0;;28188:492;-1:-1:-1;;;;28188:492:0:o;16004:147::-;15685:7;15712:12;;;:6;:12;;;;;:22;;;14053:30;14064:4;6656:10;14053;:30::i;:::-;16118:25:::1;16129:4;16135:7;16118:10;:25::i;:::-;16004:147:::0;;;:::o;17052:218::-;-1:-1:-1;;;;;17148:23:0;;6656:10;17148:23;17140:83;;;;-1:-1:-1;;;17140:83:0;;7780:2:1;17140:83:0;;;7762:21:1;7819:2;7799:18;;;7792:30;7858:34;7838:18;;;7831:62;-1:-1:-1;;;7909:18:1;;;7902:45;7964:19;;17140:83:0;7578:411:1;17140:83:0;17236:26;17248:4;17254:7;17236:11;:26::i;:::-;17052:218;;:::o;29089:215::-;6656:10;29177:4;29226:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;29226:34:0;;;;;;;;;;29177:4;;29194:80;;29217:7;;29226:47;;29263:10;;29226:47;:::i;:::-;29194:8;:80::i;46413:66::-;42878:32;-1:-1:-1;;;;;;;;;;;42899:10:0;42878:7;:32::i;:::-;42873:61;;42919:15;;-1:-1:-1;;;42919:15:0;;;;;;;;;;;42873:61;46461:10:::1;:8;:10::i;:::-;46413:66::o:0;44397:123::-;42756:32;-1:-1:-1;;;;;;;;;;;42777:10:0;42756:7;:32::i;:::-;42751:61;;42797:15;;-1:-1:-1;;;42797:15:0;;;;;;;;;;;42751:61;44487:25:::1;44493:9;44504:7;44487:5;:25::i;44564:105::-:0;42756:32;-1:-1:-1;;;;;;;;;;;42777:10:0;42756:7;:32::i;:::-;42751:61;;42797:15;;-1:-1:-1;;;42797:15:0;;;;;;;;;;;42751:61;44635:26:::1;44641:10;44653:7;44635:5;:26::i;:::-;44564:105:::0;:::o;43279:1074::-;5319:13;;;;;;;;:30;;-1:-1:-1;5337:12:0;;;;5336:13;5319:30;5311:89;;;;-1:-1:-1;;;5311:89:0;;;;;;;:::i;:::-;5413:19;5436:13;;;;;;5435:14;5460:101;;;;5495:13;:20;;-1:-1:-1;;5530:19:0;;;;;5460:101;43483:9:::1;:21:::0;;-1:-1:-1;;43483:21:0::1;;::::0;::::1;;::::0;;43523:19;;:24;:42:::1;;43560:5;43523:42;;;43550:7;43523:42;43515:50;;43576:38;43599:5;43606:7;43576:22;:38::i;:::-;43627:37;13607:4;43658:5:::0;43627:10:::1;:37::i;:::-;43675:30;-1:-1:-1::0;;;;;;;;;;;43699:5:0::1;43675:10;:30::i;:::-;43739:14:::0;;43716:20:::1;43764:105;43788:12;43784:1;:16;43764:105;;;43822:35;-1:-1:-1::0;;;;;;;;;;;43846:7:0::1;43854:1;43846:10;;;;;;;;:::i;:::-;;;;;;;43822;:35::i;:::-;43802:3:::0;::::1;::::0;::::1;:::i;:::-;;;;43764:105;;;-1:-1:-1::0;44198:23:0;;::::1;::::0;;::::1;::::0;;;;44250:10:::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;44250:10:0;;::::1;::::0;44015:319;;44044:135:::1;44015:319:::0;;::::1;9202:25:1::0;;;;9243:18;;9236:34;44240:21:0;9286:18:1;;;9279:34;43942:9:0::1;9329:18:1::0;;;9322:34;;;44314:4:0::1;9372:19:1::0;;;9365:61;43942:9:0;9174:19:1;;44015:319:0::1;::::0;;-1:-1:-1;;44015:319:0;;::::1;::::0;;;;;;43991:354;;44015:319:::1;43991:354:::0;;::::1;::::0;43972:16:::1;:373:::0;-1:-1:-1;;5587:68:0;;;;5638:5;5622:21;;-1:-1:-1;;5622:21:0;;;5587:68;5300:362;43279:1074;;;;;:::o;46258:62::-;42878:32;-1:-1:-1;;;;;;;;;;;42899:10:0;42878:7;:32::i;:::-;42873:61;;42919:15;;-1:-1:-1;;;42919:15:0;;;;;;;;;;;42873:61;46304:8:::1;:6;:8::i;14482:139::-:0;14560:4;14584:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;14584:29:0;;;;;;;;;;;;;;;14482:139::o;25589:104::-;25645:13;25678:7;25671:14;;;;;:::i;29807:413::-;6656:10;29900:4;29944:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;29944:34:0;;;;;;;;;;29997:35;;;;29989:85;;;;-1:-1:-1;;;29989:85:0;;9639:2:1;29989:85:0;;;9621:21:1;9678:2;9658:18;;;9651:30;9717:34;9697:18;;;9690:62;-1:-1:-1;;;9768:18:1;;;9761:35;9813:19;;29989:85:0;9437:401:1;29989:85:0;30110:67;6656:10;30133:7;30161:15;30142:16;:34;30110:8;:67::i;:::-;-1:-1:-1;30208:4:0;;29807:413;-1:-1:-1;;;29807:413:0:o;27001:175::-;27087:4;27104:42;6656:10;27128:9;27139:6;27104:9;:42::i;45014:1023::-;45253:15;45240:9;:28;;45232:56;;;;-1:-1:-1;;;45232:56:0;;10045:2:1;45232:56:0;;;10027:21:1;10084:2;10064:18;;;10057:30;-1:-1:-1;;;10103:18:1;;;10096:45;10158:18;;45232:56:0;9843:339:1;45232:56:0;45404:16;;-1:-1:-1;;;;;45651:14:0;;45299;45651;;;:6;:14;;;;;:16;;45299:14;;45404:16;42356:66;;45550:6;;45583:8;;45618:6;;45651:16;45299:14;45651:16;;;:::i;:::-;;;;-1:-1:-1;45471:255:0;;;;;;10474:25:1;;;;-1:-1:-1;;;;;10573:15:1;;;10553:18;;;10546:43;10625:15;;;;10605:18;;;10598:43;10657:18;;;10650:34;10700:19;;;10693:35;10744:19;;;10737:35;;;10446:19;;45471:255:0;;;;;;;;;;;;45439:306;;;;;;45340:420;;;;;;;;-1:-1:-1;;;11041:27:1;;11093:1;11084:11;;11077:27;;;;11129:2;11120:12;;11113:28;11166:2;11157:12;;10783:392;45340:420:0;;;;-1:-1:-1;;45340:420:0;;;;;;;;;45316:455;;45340:420;45316:455;;;;45782:24;45809:29;;;;;;;;;11407:25:1;;;11480:4;11468:17;;11448:18;;;11441:45;;;;11502:18;;;11495:34;;;11545:18;;;11538:34;;;45316:455:0;;-1:-1:-1;45782:24:0;45809:29;;11379:19:1;;45809:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45809:29:0;;-1:-1:-1;;45809:29:0;;;-1:-1:-1;;;;;;;45871:30:0;;;;;;:60;;;45925:6;-1:-1:-1;;;;;45905:26:0;:16;-1:-1:-1;;;;;45905:26:0;;45871:60;45849:135;;;;-1:-1:-1;;;45849:135:0;;11785:2:1;45849:135:0;;;11767:21:1;11824:2;11804:18;;;11797:30;11863:27;11843:18;;;11836:55;11908:18;;45849:135:0;11583:349:1;45849:135:0;45995:34;46004:6;46012:8;46022:6;45995:8;:34::i;:::-;45221:816;;45014:1023;;;;;;;:::o;16396:149::-;15685:7;15712:12;;;:6;:12;;;;;:22;;;14053:30;14064:4;6656:10;14053;:30::i;:::-;16511:26:::1;16523:4;16529:7;16511:11;:26::i;33491:380::-:0;-1:-1:-1;;;;;33627:19:0;;33619:68;;;;-1:-1:-1;;;33619:68:0;;12139:2:1;33619:68:0;;;12121:21:1;12178:2;12158:18;;;12151:30;12217:34;12197:18;;;12190:62;-1:-1:-1;;;12268:18:1;;;12261:34;12312:19;;33619:68:0;11937:400:1;33619:68:0;-1:-1:-1;;;;;33706:21:0;;33698:68;;;;-1:-1:-1;;;33698:68:0;;12544:2:1;33698:68:0;;;12526:21:1;12583:2;12563:18;;;12556:30;12622:34;12602:18;;;12595:62;-1:-1:-1;;;12673:18:1;;;12666:32;12715:19;;33698:68:0;12342:398:1;33698:68:0;-1:-1:-1;;;;;33779:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;33831:32;;1736:25:1;;;33831:32:0;;1709:18:1;33831:32:0;;;;;;;33491:380;;;:::o;30710:733::-;-1:-1:-1;;;;;30850:20:0;;30842:70;;;;-1:-1:-1;;;30842:70:0;;12947:2:1;30842:70:0;;;12929:21:1;12986:2;12966:18;;;12959:30;13025:34;13005:18;;;12998:62;-1:-1:-1;;;13076:18:1;;;13069:35;13121:19;;30842:70:0;12745:401:1;30842:70:0;-1:-1:-1;;;;;30931:23:0;;30923:71;;;;-1:-1:-1;;;30923:71:0;;13353:2:1;30923:71:0;;;13335:21:1;13392:2;13372:18;;;13365:30;13431:34;13411:18;;;13404:62;-1:-1:-1;;;13482:18:1;;;13475:33;13525:19;;30923:71:0;13151:399:1;30923:71:0;31007:47;31028:6;31036:9;31047:6;31007:20;:47::i;:::-;-1:-1:-1;;;;;31091:17:0;;31067:21;31091:17;;;:9;:17;;;;;;31127:23;;;;31119:74;;;;-1:-1:-1;;;31119:74:0;;13757:2:1;31119:74:0;;;13739:21:1;13796:2;13776:18;;;13769:30;13835:34;13815:18;;;13808:62;-1:-1:-1;;;13886:18:1;;;13879:36;13932:19;;31119:74:0;13555:402:1;31119:74:0;-1:-1:-1;;;;;31229:17:0;;;;;;;:9;:17;;;;;;31249:22;;;31229:42;;31293:20;;;;;;;;:30;;31265:6;;31229:17;31293:30;;31265:6;;31293:30;:::i;:::-;;;;;;;;31358:9;-1:-1:-1;;;;;31341:35:0;31350:6;-1:-1:-1;;;;;31341:35:0;;31369:6;31341:35;;;;1736:25:1;;1724:2;1709:18;;1590:177;31341:35:0;;;;;;;;30831:612;30710:733;;;:::o;14911:519::-;14992:22;15000:4;15006:7;14992;:22::i;:::-;14987:436;;15180:52;15219:7;-1:-1:-1;;;;;15180:52:0;15229:2;15180:30;:52::i;:::-;15305:49;15344:4;15351:2;15305:30;:49::i;:::-;15085:292;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;15085:292:0;;;;;;;;;;-1:-1:-1;;;15031:380:0;;;;;;;:::i;18553:238::-;18637:22;18645:4;18651:7;18637;:22::i;:::-;18632:152;;18676:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;18676:29:0;;;;;;;;;:36;;-1:-1:-1;;18676:36:0;18708:4;18676:36;;;18759:12;6656:10;;6576:98;18759:12;-1:-1:-1;;;;;18732:40:0;18750:7;-1:-1:-1;;;;;18732:40:0;18744:4;18732:40;;;;;;;;;;18553:238;;:::o;18923:239::-;19007:22;19015:4;19021:7;19007;:22::i;:::-;19003:152;;;19078:5;19046:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;19046:29:0;;;;;;;;;;:37;;-1:-1:-1;;19046:37:0;;;19103:40;6656:10;;19046:12;;19103:40;;19078:5;19103:40;18923:239;;:::o;37803:120::-;36815:7;;;;37339:41;;;;-1:-1:-1;;;37339:41:0;;14981:2:1;37339:41:0;;;14963:21:1;15020:2;15000:18;;;14993:30;-1:-1:-1;;;15039:18:1;;;15032:50;15099:18;;37339:41:0;14779:344:1;37339:41:0;37862:7:::1;:15:::0;;-1:-1:-1;;37862:15:0::1;::::0;;37893:22:::1;6656:10:::0;37902:12:::1;37893:22;::::0;-1:-1:-1;;;;;15292:32:1;;;15274:51;;15262:2;15247:18;37893:22:0::1;;;;;;;37803:120::o:0;31730:399::-;-1:-1:-1;;;;;31814:21:0;;31806:65;;;;-1:-1:-1;;;31806:65:0;;15538:2:1;31806:65:0;;;15520:21:1;15577:2;15557:18;;;15550:30;15616:33;15596:18;;;15589:61;15667:18;;31806:65:0;15336:355:1;31806:65:0;31884:49;31913:1;31917:7;31926:6;31884:20;:49::i;:::-;31962:6;31946:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;31979:18:0;;;;;;:9;:18;;;;;:28;;32001:6;;31979:18;:28;;32001:6;;31979:28;:::i;:::-;;;;-1:-1:-1;;32023:37:0;;1736:25:1;;;-1:-1:-1;;;;;32023:37:0;;;32040:1;;32023:37;;1724:2:1;1709:18;32023:37:0;;;;;;;17052:218;;:::o;32462:591::-;-1:-1:-1;;;;;32546:21:0;;32538:67;;;;-1:-1:-1;;;32538:67:0;;15898:2:1;32538:67:0;;;15880:21:1;15937:2;15917:18;;;15910:30;15976:34;15956:18;;;15949:62;-1:-1:-1;;;16027:18:1;;;16020:31;16068:19;;32538:67:0;15696:397:1;32538:67:0;32618:49;32639:7;32656:1;32660:6;32618:20;:49::i;:::-;-1:-1:-1;;;;;32705:18:0;;32680:22;32705:18;;;:9;:18;;;;;;32742:24;;;;32734:71;;;;-1:-1:-1;;;32734:71:0;;16300:2:1;32734:71:0;;;16282:21:1;16339:2;16319:18;;;16312:30;16378:34;16358:18;;;16351:62;-1:-1:-1;;;16429:18:1;;;16422:32;16471:19;;32734:71:0;16098:398:1;32734:71:0;-1:-1:-1;;;;;32841:18:0;;;;;;:9;:18;;;;;32862:23;;;32841:44;;32907:12;:22;;32879:6;;32841:18;32907:22;;32879:6;;32907:22;:::i;:::-;;;;-1:-1:-1;;32947:37:0;;1736:25:1;;;32973:1:0;;-1:-1:-1;;;;;32947:37:0;;;;;1724:2:1;1709:18;32947:37:0;;;;;;;16004:147;;;:::o;25143:157::-;5319:13;;;;;;;;:30;;-1:-1:-1;5337:12:0;;;;5336:13;5319:30;5311:89;;;;-1:-1:-1;;;5311:89:0;;;;;;;:::i;:::-;5413:19;5436:13;;;;;;5435:14;5460:101;;;;5495:13;:20;;-1:-1:-1;;5530:19:0;;;;;5460:101;25251:5:::1;:13;25259:5:::0;25251;:13:::1;:::i;:::-;-1:-1:-1::0;25275:7:0::1;:17;25285:7:::0;25275;:17:::1;:::i;:::-;;5591:14:::0;5587:68;;;5638:5;5622:21;;-1:-1:-1;;5622:21:0;;;5300:362;25143:157;;:::o;17929:112::-;18008:25;18019:4;18025:7;18008:10;:25::i;37544:118::-;36815:7;;;;37069:9;37061:38;;;;-1:-1:-1;;;37061:38:0;;19040:2:1;37061:38:0;;;19022:21:1;19079:2;19059:18;;;19052:30;-1:-1:-1;;;19098:18:1;;;19091:46;19154:18;;37061:38:0;18838:340:1;37061:38:0;37604:7:::1;:14:::0;;-1:-1:-1;;37604:14:0::1;37614:4;37604:14;::::0;;37634:20:::1;37641:12;6656:10:::0;;6576:98;46487:195;46630:44;46657:4;46663:2;46667:6;46630:26;:44::i;8528:451::-;8603:13;8629:19;8661:10;8665:6;8661:1;:10;:::i;:::-;:14;;8674:1;8661:14;:::i;:::-;8651:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8651:25:0;;8629:47;;-1:-1:-1;;;8687:6:0;8694:1;8687:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;8687:15:0;;;;;;;;;-1:-1:-1;;;8713:6:0;8720:1;8713:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;8713:15:0;;;;;;;;-1:-1:-1;8744:9:0;8756:10;8760:6;8756:1;:10;:::i;:::-;:14;;8769:1;8756:14;:::i;:::-;8744:26;;8739:135;8776:1;8772;:5;8739:135;;;-1:-1:-1;;;8824:5:0;8832:3;8824:11;8811:25;;;;;;;:::i;:::-;;;;8799:6;8806:1;8799:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;8799:37:0;;;;;;;;-1:-1:-1;8861:1:0;8851:11;;;;;8779:3;;;:::i;:::-;;;8739:135;;;-1:-1:-1;8892:10:0;;8884:55;;;;-1:-1:-1;;;8884:55:0;;19699:2:1;8884:55:0;;;19681:21:1;;;19718:18;;;19711:30;19777:34;19757:18;;;19750:62;19829:18;;8884:55:0;19497:356:1;8884:55:0;8964:6;8528:451;-1:-1:-1;;;8528:451:0:o;38973:272::-;36815:7;;;;39181:9;39173:64;;;;-1:-1:-1;;;39173:64:0;;20060:2:1;39173:64:0;;;20042:21:1;20099:2;20079:18;;;20072:30;20138:34;20118:18;;;20111:62;-1:-1:-1;;;20189:18:1;;;20182:40;20239:19;;39173:64:0;19858:406:1;14:286;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;497:250;582:1;592:113;606:6;603:1;600:13;592:113;;;682:11;;;676:18;663:11;;;656:39;628:2;621:10;592:113;;;-1:-1:-1;;739:1:1;721:16;;714:27;497:250::o;752:396::-;901:2;890:9;883:21;864:4;933:6;927:13;976:6;971:2;960:9;956:18;949:34;992:79;1064:6;1059:2;1048:9;1044:18;1039:2;1031:6;1027:15;992:79;:::i;:::-;1132:2;1111:15;-1:-1:-1;;1107:29:1;1092:45;;;;1139:2;1088:54;;752:396;-1:-1:-1;;752:396:1:o;1153:173::-;1221:20;;-1:-1:-1;;;;;1270:31:1;;1260:42;;1250:70;;1316:1;1313;1306:12;1250:70;1153:173;;;:::o;1331:254::-;1399:6;1407;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;1499:29;1518:9;1499:29;:::i;:::-;1489:39;1575:2;1560:18;;;;1547:32;;-1:-1:-1;;;1331:254:1:o;1772:328::-;1849:6;1857;1865;1918:2;1906:9;1897:7;1893:23;1889:32;1886:52;;;1934:1;1931;1924:12;1886:52;1957:29;1976:9;1957:29;:::i;:::-;1947:39;;2005:38;2039:2;2028:9;2024:18;2005:38;:::i;:::-;1995:48;;2090:2;2079:9;2075:18;2062:32;2052:42;;1772:328;;;;;:::o;2105:180::-;2164:6;2217:2;2205:9;2196:7;2192:23;2188:32;2185:52;;;2233:1;2230;2223:12;2185:52;-1:-1:-1;2256:23:1;;2105:180;-1:-1:-1;2105:180:1:o;2472:254::-;2540:6;2548;2601:2;2589:9;2580:7;2576:23;2572:32;2569:52;;;2617:1;2614;2607:12;2569:52;2653:9;2640:23;2630:33;;2682:38;2716:2;2705:9;2701:18;2682:38;:::i;:::-;2672:48;;2472:254;;;;;:::o;3105:127::-;3166:10;3161:3;3157:20;3154:1;3147:31;3197:4;3194:1;3187:15;3221:4;3218:1;3211:15;3237:275;3308:2;3302:9;3373:2;3354:13;;-1:-1:-1;;3350:27:1;3338:40;;3408:18;3393:34;;3429:22;;;3390:62;3387:88;;;3455:18;;:::i;:::-;3491:2;3484:22;3237:275;;-1:-1:-1;3237:275:1:o;3517:531::-;3560:5;3613:3;3606:4;3598:6;3594:17;3590:27;3580:55;;3631:1;3628;3621:12;3580:55;3667:6;3654:20;3693:18;3689:2;3686:26;3683:52;;;3715:18;;:::i;:::-;3759:55;3802:2;3783:13;;-1:-1:-1;;3779:27:1;3808:4;3775:38;3759:55;:::i;:::-;3839:2;3830:7;3823:19;3885:3;3878:4;3873:2;3865:6;3861:15;3857:26;3854:35;3851:55;;;3902:1;3899;3892:12;3851:55;3967:2;3960:4;3952:6;3948:17;3941:4;3932:7;3928:18;3915:55;4015:1;3990:16;;;4008:4;3986:27;3979:38;;;;3994:7;3517:531;-1:-1:-1;;;3517:531:1:o;4053:156::-;4119:20;;4179:4;4168:16;;4158:27;;4148:55;;4199:1;4196;4189:12;4214:1498;4352:6;4360;4368;4376;4384;4437:3;4425:9;4416:7;4412:23;4408:33;4405:53;;;4454:1;4451;4444:12;4405:53;4494:9;4481:23;4523:18;4564:2;4556:6;4553:14;4550:34;;;4580:1;4577;4570:12;4550:34;4603:50;4645:7;4636:6;4625:9;4621:22;4603:50;:::i;:::-;4593:60;;4672:2;4662:12;;4727:2;4716:9;4712:18;4699:32;4756:2;4746:8;4743:16;4740:36;;;4772:1;4769;4762:12;4740:36;4795:52;4839:7;4828:8;4817:9;4813:24;4795:52;:::i;:::-;4785:62;;;4866:36;4898:2;4887:9;4883:18;4866:36;:::i;:::-;4856:46;;4921:38;4955:2;4944:9;4940:18;4921:38;:::i;:::-;4911:48;;5012:3;5001:9;4997:19;4984:33;5042:2;5032:8;5029:16;5026:36;;;5058:1;5055;5048:12;5026:36;5081:24;;5136:4;5128:13;;5124:27;-1:-1:-1;5114:55:1;;5165:1;5162;5155:12;5114:55;5201:2;5188:16;5223:2;5219;5216:10;5213:36;;;5229:18;;:::i;:::-;5275:2;5272:1;5268:10;5258:20;;5298:28;5322:2;5318;5314:11;5298:28;:::i;:::-;5360:15;;;5430:11;;;5426:20;;;5391:12;;;;5458:19;;;5455:39;;;5490:1;5487;5480:12;5455:39;5514:11;;;;5534:148;5550:6;5545:3;5542:15;5534:148;;;5616:23;5635:3;5616:23;:::i;:::-;5604:36;;5567:12;;;;5660;;;;5534:148;;;5701:5;5691:15;;;;;;;;4214:1498;;;;;;;;:::o;5717:186::-;5776:6;5829:2;5817:9;5808:7;5804:23;5800:32;5797:52;;;5845:1;5842;5835:12;5797:52;5868:29;5887:9;5868:29;:::i;5908:606::-;6019:6;6027;6035;6043;6051;6059;6067;6120:3;6108:9;6099:7;6095:23;6091:33;6088:53;;;6137:1;6134;6127:12;6088:53;6160:29;6179:9;6160:29;:::i;:::-;6150:39;;6208:38;6242:2;6231:9;6227:18;6208:38;:::i;:::-;6198:48;;6293:2;6282:9;6278:18;6265:32;6255:42;;6344:2;6333:9;6329:18;6316:32;6306:42;;6367:37;6399:3;6388:9;6384:19;6367:37;:::i;:::-;6357:47;;6451:3;6440:9;6436:19;6423:33;6413:43;;6503:3;6492:9;6488:19;6475:33;6465:43;;5908:606;;;;;;;;;;:::o;6519:260::-;6587:6;6595;6648:2;6636:9;6627:7;6623:23;6619:32;6616:52;;;6664:1;6661;6654:12;6616:52;6687:29;6706:9;6687:29;:::i;:::-;6677:39;;6735:38;6769:2;6758:9;6754:18;6735:38;:::i;6784:380::-;6863:1;6859:12;;;;6906;;;6927:61;;6981:4;6973:6;6969:17;6959:27;;6927:61;7034:2;7026:6;7023:14;7003:18;7000:38;6997:161;;7080:10;7075:3;7071:20;7068:1;7061:31;7115:4;7112:1;7105:15;7143:4;7140:1;7133:15;6997:161;;6784:380;;;:::o;7994:127::-;8055:10;8050:3;8046:20;8043:1;8036:31;8086:4;8083:1;8076:15;8110:4;8107:1;8100:15;8126:125;8191:9;;;8212:10;;;8209:36;;;8225:18;;:::i;8256:410::-;8458:2;8440:21;;;8497:2;8477:18;;;8470:30;8536:34;8531:2;8516:18;;8509:62;-1:-1:-1;;;8602:2:1;8587:18;;8580:44;8656:3;8641:19;;8256:410::o;8671:127::-;8732:10;8727:3;8723:20;8720:1;8713:31;8763:4;8760:1;8753:15;8787:4;8784:1;8777:15;8803:135;8842:3;8863:17;;;8860:43;;8883:18;;:::i;:::-;-1:-1:-1;8930:1:1;8919:13;;8803:135::o;13962:812::-;14373:25;14368:3;14361:38;14343:3;14428:6;14422:13;14444:75;14512:6;14507:2;14502:3;14498:12;14491:4;14483:6;14479:17;14444:75;:::i;:::-;-1:-1:-1;;;14578:2:1;14538:16;;;14570:11;;;14563:40;14628:13;;14650:76;14628:13;14712:2;14704:11;;14697:4;14685:17;;14650:76;:::i;:::-;14746:17;14765:2;14742:26;;13962:812;-1:-1:-1;;;;13962:812:1:o;16501:128::-;16568:9;;;16589:11;;;16586:37;;;16603:18;;:::i;16760:545::-;16862:2;16857:3;16854:11;16851:448;;;16898:1;16923:5;16919:2;16912:17;16968:4;16964:2;16954:19;17038:2;17026:10;17022:19;17019:1;17015:27;17009:4;17005:38;17074:4;17062:10;17059:20;17056:47;;;-1:-1:-1;17097:4:1;17056:47;17152:2;17147:3;17143:12;17140:1;17136:20;17130:4;17126:31;17116:41;;17207:82;17225:2;17218:5;17215:13;17207:82;;;17270:17;;;17251:1;17240:13;17207:82;;17481:1352;17607:3;17601:10;17634:18;17626:6;17623:30;17620:56;;;17656:18;;:::i;:::-;17685:97;17775:6;17735:38;17767:4;17761:11;17735:38;:::i;:::-;17729:4;17685:97;:::i;:::-;17837:4;;17901:2;17890:14;;17918:1;17913:663;;;;18620:1;18637:6;18634:89;;;-1:-1:-1;18689:19:1;;;18683:26;18634:89;-1:-1:-1;;17438:1:1;17434:11;;;17430:24;17426:29;17416:40;17462:1;17458:11;;;17413:57;18736:81;;17883:944;;17913:663;16707:1;16700:14;;;16744:4;16731:18;;-1:-1:-1;;17949:20:1;;;18067:236;18081:7;18078:1;18075:14;18067:236;;;18170:19;;;18164:26;18149:42;;18262:27;;;;18230:1;18218:14;;;;18097:19;;18067:236;;;18071:3;18331:6;18322:7;18319:19;18316:201;;;18392:19;;;18386:26;-1:-1:-1;;18475:1:1;18471:14;;;18487:3;18467:24;18463:37;18459:42;18444:58;18429:74;;18316:201;-1:-1:-1;;;;;18563:1:1;18547:14;;;18543:22;18530:36;;-1:-1:-1;17481:1352:1:o;19183:168::-;19256:9;;;19287;;19304:15;;;19298:22;;19284:37;19274:71;;19325:18;;:::i;19356:136::-;19395:3;19423:5;19413:39;;19432:18;;:::i;:::-;-1:-1:-1;;;19468:18:1;;19356:136::o
Swarm Source
ipfs://88eaeb2170b139179c43caf7fe3e97a29d44eba89e280dc62f2fa6c09e694793
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BASE | 38.06% | $0.999791 | 93,893.2697 | $93,873.65 | |
BASE | 25.29% | $1,877.21 | 33.2242 | $62,368.86 | |
BASE | 24.40% | $0.00365 | 16,489,436.9766 | $60,190.24 | |
BASE | 11.94% | $0.000057 | 520,144,431.8753 | $29,438.67 | |
BASE | 0.30% | $1,881.1 | 0.387 | $727.98 | |
BASE | <0.01% | $0.998162 | 19.8634 | $19.83 | |
BASE | <0.01% | $0.000117 | 96,914.2715 | $11.36 | |
BASE | <0.01% | $0.020324 | 340.2884 | $6.92 | |
BASE | <0.01% | $0.001062 | 4,650.3175 | $4.94 | |
BASE | <0.01% | $0.99657 | 4.2617 | $4.25 | |
BASE | <0.01% | $0.000562 | 369.0168 | $0.2074 |
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.