Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
StablecoinUpgradeable
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-08-09 */ // Sources flattened with hardhat v2.22.8 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts/proxy/beacon/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.20; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeacon { /** * @dev Must return an address that can be used as a delegate call target. * * {UpgradeableBeacon} will check that this address is a contract. */ function implementation() external view returns (address); } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. pragma solidity ^0.8.20; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ```solidity * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(newImplementation.code.length > 0); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` */ library StorageSlot { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct StringSlot { string value; } struct BytesSlot { bytes value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev Returns an `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } } // File @openzeppelin/contracts/proxy/ERC1967/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Utils.sol) pragma solidity ^0.8.20; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. */ library ERC1967Utils { // We re-declare ERC-1967 events here because they can't be used directly from IERC1967. // This will be fixed in Solidity 0.8.21. At that point we should remove these events. /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Emitted when the beacon is changed. */ event BeaconUpgraded(address indexed beacon); /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1. */ // solhint-disable-next-line private-vars-leading-underscore bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev The `implementation` of the proxy is invalid. */ error ERC1967InvalidImplementation(address implementation); /** * @dev The `admin` of the proxy is invalid. */ error ERC1967InvalidAdmin(address admin); /** * @dev The `beacon` of the proxy is invalid. */ error ERC1967InvalidBeacon(address beacon); /** * @dev An upgrade function sees `msg.value > 0` that may be lost. */ error ERC1967NonPayable(); /** * @dev Returns the current implementation address. */ function getImplementation() internal view returns (address) { return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { if (newImplementation.code.length == 0) { revert ERC1967InvalidImplementation(newImplementation); } StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Performs implementation upgrade with additional setup call if data is nonempty. * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected * to avoid stuck value in the contract. * * Emits an {IERC1967-Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); if (data.length > 0) { Address.functionDelegateCall(newImplementation, data); } else { _checkNonPayable(); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1. */ // solhint-disable-next-line private-vars-leading-underscore bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Returns the current admin. * * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103` */ function getAdmin() internal view returns (address) { return StorageSlot.getAddressSlot(ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { if (newAdmin == address(0)) { revert ERC1967InvalidAdmin(address(0)); } StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {IERC1967-AdminChanged} event. */ function changeAdmin(address newAdmin) internal { emit AdminChanged(getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is the keccak-256 hash of "eip1967.proxy.beacon" subtracted by 1. */ // solhint-disable-next-line private-vars-leading-underscore bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Returns the current beacon. */ function getBeacon() internal view returns (address) { return StorageSlot.getAddressSlot(BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { if (newBeacon.code.length == 0) { revert ERC1967InvalidBeacon(newBeacon); } StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon; address beaconImplementation = IBeacon(newBeacon).implementation(); if (beaconImplementation.code.length == 0) { revert ERC1967InvalidImplementation(beaconImplementation); } } /** * @dev Change the beacon and trigger a setup call if data is nonempty. * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected * to avoid stuck value in the contract. * * Emits an {IERC1967-BeaconUpgraded} event. * * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for * efficiency. */ function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0) { Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data); } else { _checkNonPayable(); } } /** * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract * if an upgrade doesn't perform an initialization call. */ function _checkNonPayable() private { if (msg.value > 0) { revert ERC1967NonPayable(); } } } // File @openzeppelin/contracts/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.20; /** * @dev Interface for the optional metadata functions from the ERC20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.20; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Storage of the initializable contract. * * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions * when using with upgradeable contracts. * * @custom:storage-location erc7201:openzeppelin.storage.Initializable */ struct InitializableStorage { /** * @dev Indicates that the contract has been initialized. */ uint64 _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool _initializing; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00; /** * @dev The contract is already initialized. */ error InvalidInitialization(); /** * @dev The contract is not initializing. */ error NotInitializing(); /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint64 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in * production. * * Emits an {Initialized} event. */ modifier initializer() { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); // Cache values to avoid duplicated sloads bool isTopLevelCall = !$._initializing; uint64 initialized = $._initialized; // Allowed calls: // - initialSetup: the contract is not in the initializing state and no previous version was // initialized // - construction: the contract is initialized at version 1 (no reininitialization) and the // current contract is just being deployed bool initialSetup = initialized == 0 && isTopLevelCall; bool construction = initialized == 1 && address(this).code.length == 0; if (!initialSetup && !construction) { revert InvalidInitialization(); } $._initialized = 1; if (isTopLevelCall) { $._initializing = true; } _; if (isTopLevelCall) { $._initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint64 version) { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing || $._initialized >= version) { revert InvalidInitialization(); } $._initialized = version; $._initializing = true; _; $._initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { _checkInitializing(); _; } /** * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}. */ function _checkInitializing() internal view virtual { if (!_isInitializing()) { revert NotInitializing(); } } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing) { revert InvalidInitialization(); } if ($._initialized != type(uint64).max) { $._initialized = type(uint64).max; emit Initialized(type(uint64).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint64) { return _getInitializableStorage()._initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _getInitializableStorage()._initializing; } /** * @dev Returns a pointer to the storage namespace. */ // solhint-disable-next-line var-name-mixedcase function _getInitializableStorage() private pure returns (InitializableStorage storage $) { assembly { $.slot := INITIALIZABLE_STORAGE } } } // File node_modules/@openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File contracts/AccountPausableUpgradeable.sol // Original license: SPDX_License_Identifier: MIT pragma solidity 0.8.26; /** * @dev The following contract lets us halt activities for accounts that have been paused using the * `_pauseAccount` method and the same action can be reverted by using the `_unpauseAccount` * method. The state is stored at a custom storage location as per ERC7201. The modifiers in this * contract are used in the base `StablecoinUpgradeable` contract resulting in blocked actions for * specific accounts. * * @custom:security-contact [email protected] */ abstract contract AccountPausableUpgradeable is Initializable, ContextUpgradeable { /// @custom:storage-location erc7201:storage.AccountPausable struct AccountPausableStorage { mapping(address account => bool) _frozen; } // keccak256(abi.encode(uint256(keccak256("storage.AccountPausable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant AccountPausableStorageLocation = 0x345cc2404af916c3db112e7a6103770647a90ed78a5d681e21dc2e1174232900; function _getAccountPausableStorage() private pure returns (AccountPausableStorage storage $) { assembly { $.slot := AccountPausableStorageLocation } } /** * This event is emitted when an account is paused in the contract. */ event AccountPaused(address account); /** * This event is emitted when an account is unpaused in the contract. */ event AccountUnpaused(address account); error AccountIsPaused(address account); error AccountIsNotPaused(address account); function __AccountPausable_init() internal onlyInitializing { } /** * @dev Modifier to make a function callable only when the account is not paused. * * Requirements: * - The account must not already be paused. */ modifier whenAccountNotPaused(address account) { if (accountPaused(account)) { revert AccountIsPaused(account); } _; } /** * @dev Modifier to make a function callable only when the acoount is paused. * * Requirements: * - The account must already be paused. */ modifier whenAccountPaused(address account) { if (!accountPaused(account)) { revert AccountIsNotPaused(account); } _; } /** * @notice Check if an address is paused in the contract. * * @param account The `address` to check the pause status of. * * @return Boolean to indicate if an account is paused or not. */ function accountPaused(address account) public view virtual returns (bool) { AccountPausableStorage storage $ = _getAccountPausableStorage(); return $._frozen[account]; } /** * @dev Pauses an account from circulating the ERC20 token. * * Requirements: * - The account must not be paused. */ function _pauseAccount(address account) internal virtual whenAccountNotPaused(account) { AccountPausableStorage storage $ = _getAccountPausableStorage(); $._frozen[account] = true; emit AccountPaused(account); } /** * @dev Returns account to normal state. * * Requirements: * - The account must be paused. */ function _unpauseAccount(address account) internal virtual whenAccountPaused(account) { AccountPausableStorage storage $ = _getAccountPausableStorage(); $._frozen[account] = false; emit AccountUnpaused(account); } } // File @openzeppelin/contracts/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol) pragma solidity ^0.8.20; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev The `account` is missing a role. */ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); /** * @dev The caller of a function is not the expected one. * * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. */ error AccessControlBadConfirmation(); /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. */ function renounceRole(bytes32 role, address callerConfirmation) external; } // File @openzeppelin/contracts/utils/introspection/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165Upgradeable is Initializable, IERC165 { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File node_modules/@openzeppelin/contracts-upgradeable/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol) pragma solidity ^0.8.20; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControl, ERC165Upgradeable { struct RoleData { mapping(address account => bool) hasRole; bytes32 adminRole; } bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /// @custom:storage-location erc7201:openzeppelin.storage.AccessControl struct AccessControlStorage { mapping(bytes32 role => RoleData) _roles; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.AccessControl")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant AccessControlStorageLocation = 0x02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800; function _getAccessControlStorage() private pure returns (AccessControlStorage storage $) { assembly { $.slot := AccessControlStorageLocation } } /** * @dev Modifier that checks that an account has a specific role. Reverts * with an {AccessControlUnauthorizedAccount} error including the required role. */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } function __AccessControl_init() internal onlyInitializing { } function __AccessControl_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual returns (bool) { AccessControlStorage storage $ = _getAccessControlStorage(); return $._roles[role].hasRole[account]; } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` * is missing `role`. */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert AccessControlUnauthorizedAccount(account, role); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { AccessControlStorage storage $ = _getAccessControlStorage(); return $._roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address callerConfirmation) public virtual { if (callerConfirmation != _msgSender()) { revert AccessControlBadConfirmation(); } _revokeRole(role, callerConfirmation); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { AccessControlStorage storage $ = _getAccessControlStorage(); bytes32 previousAdminRole = getRoleAdmin(role); $._roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual returns (bool) { AccessControlStorage storage $ = _getAccessControlStorage(); if (!hasRole(role, account)) { $._roles[role].hasRole[account] = true; emit RoleGranted(role, account, _msgSender()); return true; } else { return false; } } /** * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { AccessControlStorage storage $ = _getAccessControlStorage(); if (hasRole(role, account)) { $._roles[role].hasRole[account] = false; emit RoleRevoked(role, account, _msgSender()); return true; } else { return false; } } } // File @openzeppelin/contracts/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.20; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822Proxiable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); } // File node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.20; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. */ abstract contract UUPSUpgradeable is Initializable, IERC1822Proxiable { /// @custom:oz-upgrades-unsafe-allow state-variable-immutable address private immutable __self = address(this); /** * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)` * and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called, * while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string. * If the getter returns `"5.0.0"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function * during an upgrade. */ string public constant UPGRADE_INTERFACE_VERSION = "5.0.0"; /** * @dev The call is from an unauthorized context. */ error UUPSUnauthorizedCallContext(); /** * @dev The storage `slot` is unsupported as a UUID. */ error UUPSUnsupportedProxiableUUID(bytes32 slot); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { _checkProxy(); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { _checkNotDelegated(); _; } function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual notDelegated returns (bytes32) { return ERC1967Utils.IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data); } /** * @dev Reverts if the execution is not performed via delegatecall or the execution * context is not of a proxy with an ERC1967-compliant implementation pointing to self. * See {_onlyProxy}. */ function _checkProxy() internal view virtual { if ( address(this) == __self || // Must be called through delegatecall ERC1967Utils.getImplementation() != __self // Must be called through an active proxy ) { revert UUPSUnauthorizedCallContext(); } } /** * @dev Reverts if the execution is performed via delegatecall. * See {notDelegated}. */ function _checkNotDelegated() internal view virtual { if (address(this) != __self) { // Must not be called through delegatecall revert UUPSUnauthorizedCallContext(); } } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call. * * As a security check, {proxiableUUID} is invoked in the new implementation, and the return value * is expected to be the implementation slot in ERC1967. * * Emits an {IERC1967-Upgraded} event. */ function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private { try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) { if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) { revert UUPSUnsupportedProxiableUUID(slot); } ERC1967Utils.upgradeToAndCall(newImplementation, data); } catch { // The implementation is not UUPS revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation); } } } // File @openzeppelin/contracts/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) pragma solidity ^0.8.20; /** * @dev Standard ERC20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); } // File node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.20; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. */ abstract contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20, IERC20Metadata, IERC20Errors { /// @custom:storage-location erc7201:openzeppelin.storage.ERC20 struct ERC20Storage { mapping(address account => uint256) _balances; mapping(address account => mapping(address spender => uint256)) _allowances; uint256 _totalSupply; string _name; string _symbol; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC20")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant ERC20StorageLocation = 0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00; function _getERC20Storage() private pure returns (ERC20Storage storage $) { assembly { $.slot := ERC20StorageLocation } } /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { ERC20Storage storage $ = _getERC20Storage(); $._name = name_; $._symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { ERC20Storage storage $ = _getERC20Storage(); return $._name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { ERC20Storage storage $ = _getERC20Storage(); return $._symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { ERC20Storage storage $ = _getERC20Storage(); return $._totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual returns (uint256) { ERC20Storage storage $ = _getERC20Storage(); return $._balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `value`. */ function transfer(address to, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _transfer(owner, to, value); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual returns (uint256) { ERC20Storage storage $ = _getERC20Storage(); return $._allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, value); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `value`. * - the caller must have allowance for ``from``'s tokens of at least * `value`. */ function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, value); _transfer(from, to, value); return true; } /** * @dev Moves a `value` amount of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _transfer(address from, address to, uint256 value) internal { if (from == address(0)) { revert ERC20InvalidSender(address(0)); } if (to == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(from, to, value); } /** * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding * this function. * * Emits a {Transfer} event. */ function _update(address from, address to, uint256 value) internal virtual { ERC20Storage storage $ = _getERC20Storage(); if (from == address(0)) { // Overflow check required: The rest of the code assumes that totalSupply never overflows $._totalSupply += value; } else { uint256 fromBalance = $._balances[from]; if (fromBalance < value) { revert ERC20InsufficientBalance(from, fromBalance, value); } unchecked { // Overflow not possible: value <= fromBalance <= totalSupply. $._balances[from] = fromBalance - value; } } if (to == address(0)) { unchecked { // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. $._totalSupply -= value; } } else { unchecked { // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. $._balances[to] += value; } } emit Transfer(from, to, value); } /** * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0). * Relies on the `_update` mechanism * * Emits a {Transfer} event with `from` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _mint(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(address(0), account, value); } /** * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply. * Relies on the `_update` mechanism. * * Emits a {Transfer} event with `to` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead */ function _burn(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidSender(address(0)); } _update(account, address(0), value); } /** * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address owner, address spender, uint256 value) internal { _approve(owner, spender, value, true); } /** * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event. * * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any * `Approval` event during `transferFrom` operations. * * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to * true using the following override: * ``` * function _approve(address owner, address spender, uint256 value, bool) internal virtual override { * super._approve(owner, spender, value, true); * } * ``` * * Requirements are the same as {_approve}. */ function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual { ERC20Storage storage $ = _getERC20Storage(); if (owner == address(0)) { revert ERC20InvalidApprover(address(0)); } if (spender == address(0)) { revert ERC20InvalidSpender(address(0)); } $._allowances[owner][spender] = value; if (emitEvent) { emit Approval(owner, spender, value); } } /** * @dev Updates `owner` s allowance for `spender` based on spent `value`. * * Does not update the allowance value in case of infinite allowance. * Revert if not enough allowance is available. * * Does not emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 value) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert ERC20InsufficientAllowance(spender, currentAllowance, value); } unchecked { _approve(owner, spender, currentAllowance - value, false); } } } } // File node_modules/@openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol) pragma solidity ^0.8.20; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /// @custom:storage-location erc7201:openzeppelin.storage.Pausable struct PausableStorage { bool _paused; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Pausable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant PausableStorageLocation = 0xcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300; function _getPausableStorage() private pure returns (PausableStorage storage $) { assembly { $.slot := PausableStorageLocation } } /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); /** * @dev The operation failed because the contract is paused. */ error EnforcedPause(); /** * @dev The operation failed because the contract is not paused. */ error ExpectedPause(); /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { PausableStorage storage $ = _getPausableStorage(); $._paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { PausableStorage storage $ = _getPausableStorage(); return $._paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { if (paused()) { revert EnforcedPause(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert ExpectedPause(); } } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { PausableStorage storage $ = _getPausableStorage(); $._paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { PausableStorage storage $ = _getPausableStorage(); $._paused = false; emit Unpaused(_msgSender()); } } // File node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Pausable.sol) pragma solidity ^0.8.20; /** * @dev ERC20 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. * * IMPORTANT: This contract does not include public pause and unpause functions. In * addition to inheriting this contract, you must define both functions, invoking the * {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate * access control, e.g. using {AccessControl} or {Ownable}. Not doing so will * make the contract pause mechanism of the contract unreachable, and thus unusable. */ abstract contract ERC20PausableUpgradeable is Initializable, ERC20Upgradeable, PausableUpgradeable { function __ERC20Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __ERC20Pausable_init_unchained() internal onlyInitializing { } /** * @dev See {ERC20-_update}. * * Requirements: * * - the contract must not be paused. */ function _update(address from, address to, uint256 value) internal virtual override whenNotPaused { super._update(from, to, value); } } // File contracts/StablecoinUpgradeable.sol // Original license: SPDX_License_Identifier: MIT pragma solidity 0.8.26; /** * @dev The ERC20 implementation with features to pause accounts and contracts, upgrade the implementation * of this contract, assign/revoke roles and control access to specific actions in the contract and only * lets this contract be initialized once. * * @custom:security-contact [email protected] */ contract StablecoinUpgradeable is Initializable, ERC20Upgradeable, UUPSUpgradeable, AccessControlUpgradeable, ERC20PausableUpgradeable, AccountPausableUpgradeable { //keccak256("MINTER") bytes32 constant public MINTER_ROLE = 0xf0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9; //keccak256("UPGRADER") bytes32 constant public UPGRADER_ROLE = 0xa615a8afb6fffcb8c6809ac0997b5c9c12b8cc97651150f14c8f6203168cff4c; //keccak256("PAUSER") bytes32 constant public PAUSER_ROLE = 0x539440820030c4994db4e31b6b800deafd503688728f932addfe7a410515c14c; //keccak256("BURNER") bytes32 constant public BURNER_ROLE = 0x9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8; //keccak256("CLAWBACKER") bytes32 constant public CLAWBACKER_ROLE = 0x715bacafb7a853b9b91b59ae724920a9eb0c006c5b318ac393fa1bc8974edd98; /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); } /** * @dev This method is used to initialize the contract with values that we want to use to bootstrap and run things. * The modifier initializer here helps us block initialization in the constructor so that we initialize value only * when deploying the proxy and not the contract itself. The initializer also tracks how many times this method is * called and it can only be called once. */ function initialize(string memory name_, string memory symbol_, address minter_, address admin_, address upgrader_, address pauser_, address clawbacker_) public initializer { __ERC20_init(name_, symbol_); __UUPSUpgradeable_init(); __AccessControl_init(); _grantRole(DEFAULT_ADMIN_ROLE, admin_); _grantRole(MINTER_ROLE, minter_); _grantRole(UPGRADER_ROLE, upgrader_); __ERC20Pausable_init(); __AccountPausable_init(); _grantRole(PAUSER_ROLE, pauser_); _grantRole(CLAWBACKER_ROLE, clawbacker_); } /** * @dev Creates a `value` amount of tokens and assigns them to `to`, by transferring it from address(0). * Relies on the `_update` mechanism * * @param to The address that will be receiving the minted amount. * @param value The amount of tokens that are being minted to the account. * * Emits a {Transfer} event with `source` set to the zero address. */ function mint(address to, uint256 value) public virtual onlyRole(MINTER_ROLE) { _mint(to, value); } /** * @dev Destroys a `value` amount of tokens from `msg.sender`, lowering the total supply. * Relies on the `_update` mechanism. * * @param value The amount of tokens that are being burned from message sender's holdings. * * Emits a {Transfer} event with `destination` set to the zero address. */ function burn(uint256 value) public virtual onlyRole(BURNER_ROLE) { _burn(msg.sender, value); } /** * @dev Destroys a `value` amount of tokens from `from` account, lowering the total supply. * Relies on the `_update` mechanism. * * @param from The address from which the tokens will be burned. * @param value The amount of tokens that will be burned. * * Emits a {Transfer} event with `destination` set to the zero address. */ function clawback(address from, uint256 value) public virtual onlyRole(CLAWBACKER_ROLE) { _burn(from, value); } /** * Allow an authorized minter to pause the circulation of ERC20 tokens from all accounts. * * Requirements: * - The contract must not be paused. */ function pause() public virtual onlyRole(PAUSER_ROLE) { _pause(); } /** * Allow an authorized minter to resume/unpause the circulation of ERC20 tokens from all account. * * Requirements: * - The contract must be paused. */ function unpause() public virtual onlyRole(PAUSER_ROLE) { _unpause(); } /** * Allow an authorized minter to pause the circulation of ERC20 tokens from a specified account. * * @param accounts An array of addresses that will be paused, restricting them from taking any value moving actions. * * Requirements: * - accounts in the {accounts} list should be unpaused */ function pauseAccounts(address[] calldata accounts) public virtual onlyRole(PAUSER_ROLE) { address lastAdd = address(0); uint256 accountsLength = accounts.length; for (uint256 i = 0; i < accountsLength; ++i) { require(accounts[i] > lastAdd, "Addresses should be sorted"); _pauseAccount(accounts[i]); lastAdd = accounts[i]; } } /** * Allow an authorized minter to resume/unpause the circulation of ERC20 tokens from a specified account. * * @param account The address that is being unpaused. * * Requirements: * - the {account} should be paused */ function unpauseAccount(address account) public virtual onlyRole(PAUSER_ROLE) { _unpauseAccount(account); } /** * An overridden method from {UUPSUpgradeable} which defines the permissions for authorizing an upgrade to a * new implementation. */ function _authorizeUpgrade(address newImplementation) internal virtual override onlyRole(UPGRADER_ROLE) {} /** * An overridden method to add modifiers to check if the accounts being used to transfer are not frozen. * * Requirements: * - the {from} account should not be paused/frozen * - the {to} account should not be paused/frozen * - the {msg.sender} account should not be paused/frozen */ function _update(address from, address to, uint256 value) internal override(ERC20Upgradeable, ERC20PausableUpgradeable) whenAccountNotPaused(from) whenAccountNotPaused(to) whenAccountNotPaused(_msgSender()) { ERC20PausableUpgradeable._update(from, to, value); } /** * An overridden method to block approvals when contract or accounts are paused. * * @param spender The account being approved by message sender to spend from their holdings. * @param value The number of tokens the spender is being allowed to spend. * * @return A boolean indicating if the approval was successful or not. */ function approve(address spender, uint256 value) public virtual override(ERC20Upgradeable) whenAccountNotPaused(spender) whenAccountNotPaused(_msgSender()) whenNotPaused returns (bool) { return super.approve(spender, value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AccountIsNotPaused","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AccountIsPaused","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"AccountPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"AccountUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CLAWBACKER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"UPGRADER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"accountPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"clawback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"minter_","type":"address"},{"internalType":"address","name":"admin_","type":"address"},{"internalType":"address","name":"upgrader_","type":"address"},{"internalType":"address","name":"pauser_","type":"address"},{"internalType":"address","name":"clawbacker_","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"pauseAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","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":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unpauseAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60a060405230608052348015610013575f80fd5b5061001c610021565b6100d3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100715760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516120256100f95f395f81816110e20152818161110b015261126c01526120255ff3fe6080604052600436106101f1575f3560e01c806370a0823111610108578063ad3cb1cc1161009d578063d547741f1161006d578063d547741f146105d9578063dd62ed3e146105f8578063e63ab1e914610617578063f3df317e14610637578063f72c0d8b14610656575f80fd5b8063ad3cb1cc14610538578063bc8c4b4f14610568578063c91f0c5314610587578063d5391393146105a6575f80fd5b806394408b9a116100d857806394408b9a146104d357806395d89b41146104f2578063a217fddf14610506578063a9059cbb14610519575f80fd5b806370a08231146104415780638456cb5914610481578063917b1ace1461049557806391d14854146104b4575f80fd5b8063313ce5671161018957806342966c681161015957806342966c68146103a5578063475ca324146103c45780634f1ef286146103f757806352d1902d1461040a5780635c975abb1461041e575f80fd5b8063313ce5671461033857806336568abe146103535780633f4ba83a1461037257806340c10f1914610386575f80fd5b806323b872dd116101c457806323b872dd146102a6578063248a9ca3146102c5578063282c51f3146102e45780632f2ff15d14610317575f80fd5b806301ffc9a7146101f557806306fdde0314610229578063095ea7b31461024a57806318160ddd14610269575b5f80fd5b348015610200575f80fd5b5061021461020f366004611a30565b610689565b60405190151581526020015b60405180910390f35b348015610234575f80fd5b5061023d6106bf565b6040516102209190611a57565b348015610255575f80fd5b50610214610264366004611aa7565b61077f565b348015610274575f80fd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02545b604051908152602001610220565b3480156102b1575f80fd5b506102146102c0366004611acf565b610806565b3480156102d0575f80fd5b506102986102df366004611b09565b61082b565b3480156102ef575f80fd5b506102987f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c881565b348015610322575f80fd5b50610336610331366004611b20565b61084b565b005b348015610343575f80fd5b5060405160128152602001610220565b34801561035e575f80fd5b5061033661036d366004611b20565b61086d565b34801561037d575f80fd5b506103366108a5565b348015610391575f80fd5b506103366103a0366004611aa7565b6108c7565b3480156103b0575f80fd5b506103366103bf366004611b09565b6108fb565b3480156103cf575f80fd5b506102987f715bacafb7a853b9b91b59ae724920a9eb0c006c5b318ac393fa1bc8974edd9881565b610336610405366004611bd5565b610933565b348015610415575f80fd5b5061029861094e565b348015610429575f80fd5b505f80516020611fd08339815191525460ff16610214565b34801561044c575f80fd5b5061029861045b366004611c33565b6001600160a01b03165f9081525f80516020611f50833981519152602052604090205490565b34801561048c575f80fd5b50610336610969565b3480156104a0575f80fd5b506103366104af366004611c4c565b610988565b3480156104bf575f80fd5b506102146104ce366004611b20565b610a9a565b3480156104de575f80fd5b506103366104ed366004611c33565b610ad0565b3480156104fd575f80fd5b5061023d610af0565b348015610511575f80fd5b506102985f81565b348015610524575f80fd5b50610214610533366004611aa7565b610b2e565b348015610543575f80fd5b5061023d604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610573575f80fd5b50610214610582366004611c33565b610b45565b348015610592575f80fd5b506103366105a1366004611cdb565b610b81565b3480156105b1575f80fd5b506102987ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc981565b3480156105e4575f80fd5b506103366105f3366004611b20565b610d5a565b348015610603575f80fd5b50610298610612366004611d90565b610d76565b348015610622575f80fd5b506102985f80516020611f9083398151915281565b348015610642575f80fd5b50610336610651366004611aa7565b610dbf565b348015610661575f80fd5b506102987fa615a8afb6fffcb8c6809ac0997b5c9c12b8cc97651150f14c8f6203168cff4c81565b5f6001600160e01b03198216637965db0b60e01b14806106b957506301ffc9a760e01b6001600160e01b03198316145b92915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f80516020611f50833981519152916106fd90611db8565b80601f016020809104026020016040519081016040528092919081815260200182805461072990611db8565b80156107745780601f1061074b57610100808354040283529160200191610774565b820191905f5260205f20905b81548152906001019060200180831161075757829003601f168201915b505050505091505090565b5f8261078a81610b45565b156107b85760405163c8c29b9960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b336107c281610b45565b156107eb5760405163c8c29b9960e01b81526001600160a01b03821660048201526024016107af565b6107f3610df3565b6107fd8585610e25565b95945050505050565b5f33610813858285610e32565b61081e858585610e8f565b60019150505b9392505050565b5f9081525f80516020611fb0833981519152602052604090206001015490565b6108548261082b565b61085d81610eec565b6108678383610ef6565b50505050565b6001600160a01b03811633146108965760405163334bd91960e11b815260040160405180910390fd5b6108a08282610f97565b505050565b5f80516020611f908339815191526108bc81610eec565b6108c4611010565b50565b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc96108f181610eec565b6108a0838361106f565b7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c861092581610eec565b61092f33836110a3565b5050565b61093b6110d7565b6109448261117b565b61092f82826111a5565b5f610957611261565b505f80516020611f7083398151915290565b5f80516020611f9083398151915261098081610eec565b6108c46112aa565b5f80516020611f9083398151915261099f81610eec565b5f82815b81811015610a9257826001600160a01b03168686838181106109c7576109c7611df0565b90506020020160208101906109dc9190611c33565b6001600160a01b031611610a325760405162461bcd60e51b815260206004820152601a60248201527f4164647265737365732073686f756c6420626520736f7274656400000000000060448201526064016107af565b610a61868683818110610a4757610a47611df0565b9050602002016020810190610a5c9190611c33565b6112f2565b858582818110610a7357610a73611df0565b9050602002016020810190610a889190611c33565b92506001016109a3565b505050505050565b5f9182525f80516020611fb0833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f80516020611f90833981519152610ae781610eec565b61092f826113a1565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f80516020611f50833981519152916106fd90611db8565b5f33610b3b818585610e8f565b5060019392505050565b6001600160a01b03165f9081527f345cc2404af916c3db112e7a6103770647a90ed78a5d681e21dc2e1174232900602052604090205460ff1690565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f81158015610bc65750825b90505f8267ffffffffffffffff166001148015610be25750303b155b905081158015610bf0575080155b15610c0e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c3857845460ff60401b1916600160401b1785555b610c428c8c611443565b610c4a611455565b610c52611455565b610c5c5f8a610ef6565b50610c877ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc98b610ef6565b50610cb27fa615a8afb6fffcb8c6809ac0997b5c9c12b8cc97651150f14c8f6203168cff4c89610ef6565b50610cbb61145d565b610cc3611455565b610cda5f80516020611f9083398151915288610ef6565b50610d057f715bacafb7a853b9b91b59ae724920a9eb0c006c5b318ac393fa1bc8974edd9887610ef6565b508315610d4c57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b610d638261082b565b610d6c81610eec565b6108678383610f97565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b7f715bacafb7a853b9b91b59ae724920a9eb0c006c5b318ac393fa1bc8974edd98610de981610eec565b6108a083836110a3565b5f80516020611fd08339815191525460ff1615610e235760405163d93c066560e01b815260040160405180910390fd5b565b5f33610b3b81858561146d565b5f610e3d8484610d76565b90505f1981146108675781811015610e8157604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016107af565b61086784848484035f611476565b6001600160a01b038316610eb857604051634b637e8f60e11b81525f60048201526024016107af565b6001600160a01b038216610ee15760405163ec442f0560e01b81525f60048201526024016107af565b6108a083838361155a565b6108c481336115fe565b5f5f80516020611fb0833981519152610f0f8484610a9a565b610f8e575f848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055610f443390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506106b9565b5f9150506106b9565b5f5f80516020611fb0833981519152610fb08484610a9a565b15610f8e575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506106b9565b611018611637565b5f80516020611fd0833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b6001600160a01b0382166110985760405163ec442f0560e01b81525f60048201526024016107af565b61092f5f838361155a565b6001600160a01b0382166110cc57604051634b637e8f60e11b81525f60048201526024016107af565b61092f825f8361155a565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061115d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166111515f80516020611f70833981519152546001600160a01b031690565b6001600160a01b031614155b15610e235760405163703e46dd60e11b815260040160405180910390fd5b7fa615a8afb6fffcb8c6809ac0997b5c9c12b8cc97651150f14c8f6203168cff4c61092f81610eec565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156111ff575060408051601f3d908101601f191682019092526111fc91810190611e04565b60015b61122757604051634c9c8ce360e01b81526001600160a01b03831660048201526024016107af565b5f80516020611f70833981519152811461125757604051632a87526960e21b8152600481018290526024016107af565b6108a08383611666565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e235760405163703e46dd60e11b815260040160405180910390fd5b6112b2610df3565b5f80516020611fd0833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611051565b806112fc81610b45565b156113255760405163c8c29b9960e01b81526001600160a01b03821660048201526024016107af565b6001600160a01b0382165f8181527f345cc2404af916c3db112e7a6103770647a90ed78a5d681e21dc2e11742329006020818152604092839020805460ff191660011790559151928352917fae7f60c1b8f645c3beffeb531169cbc446874bbf247698325318879ac850c34691015b60405180910390a1505050565b806113ab81610b45565b6113d357604051638d542b2960e01b81526001600160a01b03821660048201526024016107af565b6001600160a01b0382165f8181527f345cc2404af916c3db112e7a6103770647a90ed78a5d681e21dc2e11742329006020818152604092839020805460ff191690559151928352917f0c18efbde61ac471ead6960a3f1097735c68ecdb685ae8e2a108c28385399a659101611394565b61144b6116bb565b61092f8282611704565b610e236116bb565b6114656116bb565b610e23611754565b6108a083838360015b5f80516020611f508339815191526001600160a01b0385166114ad5760405163e602df0560e01b81525f60048201526024016107af565b6001600160a01b0384166114d657604051634a1406b160e11b81525f60048201526024016107af565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561155357836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161154a91815260200190565b60405180910390a35b5050505050565b8261156481610b45565b1561158d5760405163c8c29b9960e01b81526001600160a01b03821660048201526024016107af565b8261159781610b45565b156115c05760405163c8c29b9960e01b81526001600160a01b03821660048201526024016107af565b336115ca81610b45565b156115f35760405163c8c29b9960e01b81526001600160a01b03821660048201526024016107af565b610a92868686611774565b6116088282610a9a565b61092f5760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016107af565b5f80516020611fd08339815191525460ff16610e2357604051638dfc202b60e01b815260040160405180910390fd5b61166f82611787565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156116b3576108a082826117ea565b61092f611853565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610e2357604051631afcd79f60e31b815260040160405180910390fd5b61170c6116bb565b5f80516020611f508339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036117458482611e5f565b50600481016108678382611e5f565b61175c6116bb565b5f80516020611fd0833981519152805460ff19169055565b61177c610df3565b6108a0838383611872565b806001600160a01b03163b5f036117bc57604051634c9c8ce360e01b81526001600160a01b03821660048201526024016107af565b5f80516020611f7083398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516118069190611f1a565b5f60405180830381855af49150503d805f811461183e576040519150601f19603f3d011682016040523d82523d5f602084013e611843565b606091505b50915091506107fd8583836119ab565b3415610e235760405163b398979f60e01b815260040160405180910390fd5b5f80516020611f508339815191526001600160a01b0384166118ac5781816002015f8282546118a19190611f30565b9091555061191c9050565b6001600160a01b0384165f90815260208290526040902054828110156118fe5760405163391434e360e21b81526001600160a01b038616600482015260248101829052604481018490526064016107af565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b03831661193a576002810180548390039055611958565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161199d91815260200190565b60405180910390a350505050565b6060826119c0576119bb82611a07565b610824565b81511580156119d757506001600160a01b0384163b155b15611a0057604051639996b31560e01b81526001600160a01b03851660048201526024016107af565b5080610824565b805115611a175780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f60208284031215611a40575f80fd5b81356001600160e01b031981168114610824575f80fd5b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114611aa2575f80fd5b919050565b5f8060408385031215611ab8575f80fd5b611ac183611a8c565b946020939093013593505050565b5f805f60608486031215611ae1575f80fd5b611aea84611a8c565b9250611af860208501611a8c565b929592945050506040919091013590565b5f60208284031215611b19575f80fd5b5035919050565b5f8060408385031215611b31575f80fd5b82359150611b4160208401611a8c565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f8067ffffffffffffffff841115611b7857611b78611b4a565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff82111715611ba757611ba7611b4a565b604052838152905080828401851015611bbe575f80fd5b838360208301375f60208583010152509392505050565b5f8060408385031215611be6575f80fd5b611bef83611a8c565b9150602083013567ffffffffffffffff811115611c0a575f80fd5b8301601f81018513611c1a575f80fd5b611c2985823560208401611b5e565b9150509250929050565b5f60208284031215611c43575f80fd5b61082482611a8c565b5f8060208385031215611c5d575f80fd5b823567ffffffffffffffff811115611c73575f80fd5b8301601f81018513611c83575f80fd5b803567ffffffffffffffff811115611c99575f80fd5b8560208260051b8401011115611cad575f80fd5b6020919091019590945092505050565b5f82601f830112611ccc575f80fd5b61082483833560208501611b5e565b5f805f805f805f60e0888a031215611cf1575f80fd5b873567ffffffffffffffff811115611d07575f80fd5b611d138a828b01611cbd565b975050602088013567ffffffffffffffff811115611d2f575f80fd5b611d3b8a828b01611cbd565b965050611d4a60408901611a8c565b9450611d5860608901611a8c565b9350611d6660808901611a8c565b9250611d7460a08901611a8c565b9150611d8260c08901611a8c565b905092959891949750929550565b5f8060408385031215611da1575f80fd5b611daa83611a8c565b9150611b4160208401611a8c565b600181811c90821680611dcc57607f821691505b602082108103611dea57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611e14575f80fd5b5051919050565b601f8211156108a057805f5260205f20601f840160051c81016020851015611e405750805b601f840160051c820191505b81811015611553575f8155600101611e4c565b815167ffffffffffffffff811115611e7957611e79611b4a565b611e8d81611e878454611db8565b84611e1b565b6020601f821160018114611ebf575f8315611ea85750848201515b5f19600385901b1c1916600184901b178455611553565b5f84815260208120601f198516915b82811015611eee5787850151825560209485019460019092019101611ece565b5084821015611f0b57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82518060208501845e5f920191825250919050565b808201808211156106b957634e487b7160e01b5f52601160045260245ffdfe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc539440820030c4994db4e31b6b800deafd503688728f932addfe7a410515c14c02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300a26469706673582212200d497ac618635e954b0bef29d7dde13a2e3c79b811085406bc8e45b48ecf795464736f6c634300081a0033
Deployed Bytecode
0x6080604052600436106101f1575f3560e01c806370a0823111610108578063ad3cb1cc1161009d578063d547741f1161006d578063d547741f146105d9578063dd62ed3e146105f8578063e63ab1e914610617578063f3df317e14610637578063f72c0d8b14610656575f80fd5b8063ad3cb1cc14610538578063bc8c4b4f14610568578063c91f0c5314610587578063d5391393146105a6575f80fd5b806394408b9a116100d857806394408b9a146104d357806395d89b41146104f2578063a217fddf14610506578063a9059cbb14610519575f80fd5b806370a08231146104415780638456cb5914610481578063917b1ace1461049557806391d14854146104b4575f80fd5b8063313ce5671161018957806342966c681161015957806342966c68146103a5578063475ca324146103c45780634f1ef286146103f757806352d1902d1461040a5780635c975abb1461041e575f80fd5b8063313ce5671461033857806336568abe146103535780633f4ba83a1461037257806340c10f1914610386575f80fd5b806323b872dd116101c457806323b872dd146102a6578063248a9ca3146102c5578063282c51f3146102e45780632f2ff15d14610317575f80fd5b806301ffc9a7146101f557806306fdde0314610229578063095ea7b31461024a57806318160ddd14610269575b5f80fd5b348015610200575f80fd5b5061021461020f366004611a30565b610689565b60405190151581526020015b60405180910390f35b348015610234575f80fd5b5061023d6106bf565b6040516102209190611a57565b348015610255575f80fd5b50610214610264366004611aa7565b61077f565b348015610274575f80fd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02545b604051908152602001610220565b3480156102b1575f80fd5b506102146102c0366004611acf565b610806565b3480156102d0575f80fd5b506102986102df366004611b09565b61082b565b3480156102ef575f80fd5b506102987f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c881565b348015610322575f80fd5b50610336610331366004611b20565b61084b565b005b348015610343575f80fd5b5060405160128152602001610220565b34801561035e575f80fd5b5061033661036d366004611b20565b61086d565b34801561037d575f80fd5b506103366108a5565b348015610391575f80fd5b506103366103a0366004611aa7565b6108c7565b3480156103b0575f80fd5b506103366103bf366004611b09565b6108fb565b3480156103cf575f80fd5b506102987f715bacafb7a853b9b91b59ae724920a9eb0c006c5b318ac393fa1bc8974edd9881565b610336610405366004611bd5565b610933565b348015610415575f80fd5b5061029861094e565b348015610429575f80fd5b505f80516020611fd08339815191525460ff16610214565b34801561044c575f80fd5b5061029861045b366004611c33565b6001600160a01b03165f9081525f80516020611f50833981519152602052604090205490565b34801561048c575f80fd5b50610336610969565b3480156104a0575f80fd5b506103366104af366004611c4c565b610988565b3480156104bf575f80fd5b506102146104ce366004611b20565b610a9a565b3480156104de575f80fd5b506103366104ed366004611c33565b610ad0565b3480156104fd575f80fd5b5061023d610af0565b348015610511575f80fd5b506102985f81565b348015610524575f80fd5b50610214610533366004611aa7565b610b2e565b348015610543575f80fd5b5061023d604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610573575f80fd5b50610214610582366004611c33565b610b45565b348015610592575f80fd5b506103366105a1366004611cdb565b610b81565b3480156105b1575f80fd5b506102987ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc981565b3480156105e4575f80fd5b506103366105f3366004611b20565b610d5a565b348015610603575f80fd5b50610298610612366004611d90565b610d76565b348015610622575f80fd5b506102985f80516020611f9083398151915281565b348015610642575f80fd5b50610336610651366004611aa7565b610dbf565b348015610661575f80fd5b506102987fa615a8afb6fffcb8c6809ac0997b5c9c12b8cc97651150f14c8f6203168cff4c81565b5f6001600160e01b03198216637965db0b60e01b14806106b957506301ffc9a760e01b6001600160e01b03198316145b92915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f80516020611f50833981519152916106fd90611db8565b80601f016020809104026020016040519081016040528092919081815260200182805461072990611db8565b80156107745780601f1061074b57610100808354040283529160200191610774565b820191905f5260205f20905b81548152906001019060200180831161075757829003601f168201915b505050505091505090565b5f8261078a81610b45565b156107b85760405163c8c29b9960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b336107c281610b45565b156107eb5760405163c8c29b9960e01b81526001600160a01b03821660048201526024016107af565b6107f3610df3565b6107fd8585610e25565b95945050505050565b5f33610813858285610e32565b61081e858585610e8f565b60019150505b9392505050565b5f9081525f80516020611fb0833981519152602052604090206001015490565b6108548261082b565b61085d81610eec565b6108678383610ef6565b50505050565b6001600160a01b03811633146108965760405163334bd91960e11b815260040160405180910390fd5b6108a08282610f97565b505050565b5f80516020611f908339815191526108bc81610eec565b6108c4611010565b50565b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc96108f181610eec565b6108a0838361106f565b7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c861092581610eec565b61092f33836110a3565b5050565b61093b6110d7565b6109448261117b565b61092f82826111a5565b5f610957611261565b505f80516020611f7083398151915290565b5f80516020611f9083398151915261098081610eec565b6108c46112aa565b5f80516020611f9083398151915261099f81610eec565b5f82815b81811015610a9257826001600160a01b03168686838181106109c7576109c7611df0565b90506020020160208101906109dc9190611c33565b6001600160a01b031611610a325760405162461bcd60e51b815260206004820152601a60248201527f4164647265737365732073686f756c6420626520736f7274656400000000000060448201526064016107af565b610a61868683818110610a4757610a47611df0565b9050602002016020810190610a5c9190611c33565b6112f2565b858582818110610a7357610a73611df0565b9050602002016020810190610a889190611c33565b92506001016109a3565b505050505050565b5f9182525f80516020611fb0833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f80516020611f90833981519152610ae781610eec565b61092f826113a1565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f80516020611f50833981519152916106fd90611db8565b5f33610b3b818585610e8f565b5060019392505050565b6001600160a01b03165f9081527f345cc2404af916c3db112e7a6103770647a90ed78a5d681e21dc2e1174232900602052604090205460ff1690565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f81158015610bc65750825b90505f8267ffffffffffffffff166001148015610be25750303b155b905081158015610bf0575080155b15610c0e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c3857845460ff60401b1916600160401b1785555b610c428c8c611443565b610c4a611455565b610c52611455565b610c5c5f8a610ef6565b50610c877ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc98b610ef6565b50610cb27fa615a8afb6fffcb8c6809ac0997b5c9c12b8cc97651150f14c8f6203168cff4c89610ef6565b50610cbb61145d565b610cc3611455565b610cda5f80516020611f9083398151915288610ef6565b50610d057f715bacafb7a853b9b91b59ae724920a9eb0c006c5b318ac393fa1bc8974edd9887610ef6565b508315610d4c57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b610d638261082b565b610d6c81610eec565b6108678383610f97565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b7f715bacafb7a853b9b91b59ae724920a9eb0c006c5b318ac393fa1bc8974edd98610de981610eec565b6108a083836110a3565b5f80516020611fd08339815191525460ff1615610e235760405163d93c066560e01b815260040160405180910390fd5b565b5f33610b3b81858561146d565b5f610e3d8484610d76565b90505f1981146108675781811015610e8157604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016107af565b61086784848484035f611476565b6001600160a01b038316610eb857604051634b637e8f60e11b81525f60048201526024016107af565b6001600160a01b038216610ee15760405163ec442f0560e01b81525f60048201526024016107af565b6108a083838361155a565b6108c481336115fe565b5f5f80516020611fb0833981519152610f0f8484610a9a565b610f8e575f848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055610f443390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506106b9565b5f9150506106b9565b5f5f80516020611fb0833981519152610fb08484610a9a565b15610f8e575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506106b9565b611018611637565b5f80516020611fd0833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b6001600160a01b0382166110985760405163ec442f0560e01b81525f60048201526024016107af565b61092f5f838361155a565b6001600160a01b0382166110cc57604051634b637e8f60e11b81525f60048201526024016107af565b61092f825f8361155a565b306001600160a01b037f000000000000000000000000cfd748b9de538c9f5b1805e8db9e1d4671f7f2ec16148061115d57507f000000000000000000000000cfd748b9de538c9f5b1805e8db9e1d4671f7f2ec6001600160a01b03166111515f80516020611f70833981519152546001600160a01b031690565b6001600160a01b031614155b15610e235760405163703e46dd60e11b815260040160405180910390fd5b7fa615a8afb6fffcb8c6809ac0997b5c9c12b8cc97651150f14c8f6203168cff4c61092f81610eec565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156111ff575060408051601f3d908101601f191682019092526111fc91810190611e04565b60015b61122757604051634c9c8ce360e01b81526001600160a01b03831660048201526024016107af565b5f80516020611f70833981519152811461125757604051632a87526960e21b8152600481018290526024016107af565b6108a08383611666565b306001600160a01b037f000000000000000000000000cfd748b9de538c9f5b1805e8db9e1d4671f7f2ec1614610e235760405163703e46dd60e11b815260040160405180910390fd5b6112b2610df3565b5f80516020611fd0833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611051565b806112fc81610b45565b156113255760405163c8c29b9960e01b81526001600160a01b03821660048201526024016107af565b6001600160a01b0382165f8181527f345cc2404af916c3db112e7a6103770647a90ed78a5d681e21dc2e11742329006020818152604092839020805460ff191660011790559151928352917fae7f60c1b8f645c3beffeb531169cbc446874bbf247698325318879ac850c34691015b60405180910390a1505050565b806113ab81610b45565b6113d357604051638d542b2960e01b81526001600160a01b03821660048201526024016107af565b6001600160a01b0382165f8181527f345cc2404af916c3db112e7a6103770647a90ed78a5d681e21dc2e11742329006020818152604092839020805460ff191690559151928352917f0c18efbde61ac471ead6960a3f1097735c68ecdb685ae8e2a108c28385399a659101611394565b61144b6116bb565b61092f8282611704565b610e236116bb565b6114656116bb565b610e23611754565b6108a083838360015b5f80516020611f508339815191526001600160a01b0385166114ad5760405163e602df0560e01b81525f60048201526024016107af565b6001600160a01b0384166114d657604051634a1406b160e11b81525f60048201526024016107af565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561155357836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161154a91815260200190565b60405180910390a35b5050505050565b8261156481610b45565b1561158d5760405163c8c29b9960e01b81526001600160a01b03821660048201526024016107af565b8261159781610b45565b156115c05760405163c8c29b9960e01b81526001600160a01b03821660048201526024016107af565b336115ca81610b45565b156115f35760405163c8c29b9960e01b81526001600160a01b03821660048201526024016107af565b610a92868686611774565b6116088282610a9a565b61092f5760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016107af565b5f80516020611fd08339815191525460ff16610e2357604051638dfc202b60e01b815260040160405180910390fd5b61166f82611787565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156116b3576108a082826117ea565b61092f611853565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610e2357604051631afcd79f60e31b815260040160405180910390fd5b61170c6116bb565b5f80516020611f508339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036117458482611e5f565b50600481016108678382611e5f565b61175c6116bb565b5f80516020611fd0833981519152805460ff19169055565b61177c610df3565b6108a0838383611872565b806001600160a01b03163b5f036117bc57604051634c9c8ce360e01b81526001600160a01b03821660048201526024016107af565b5f80516020611f7083398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516118069190611f1a565b5f60405180830381855af49150503d805f811461183e576040519150601f19603f3d011682016040523d82523d5f602084013e611843565b606091505b50915091506107fd8583836119ab565b3415610e235760405163b398979f60e01b815260040160405180910390fd5b5f80516020611f508339815191526001600160a01b0384166118ac5781816002015f8282546118a19190611f30565b9091555061191c9050565b6001600160a01b0384165f90815260208290526040902054828110156118fe5760405163391434e360e21b81526001600160a01b038616600482015260248101829052604481018490526064016107af565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b03831661193a576002810180548390039055611958565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161199d91815260200190565b60405180910390a350505050565b6060826119c0576119bb82611a07565b610824565b81511580156119d757506001600160a01b0384163b155b15611a0057604051639996b31560e01b81526001600160a01b03851660048201526024016107af565b5080610824565b805115611a175780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f60208284031215611a40575f80fd5b81356001600160e01b031981168114610824575f80fd5b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114611aa2575f80fd5b919050565b5f8060408385031215611ab8575f80fd5b611ac183611a8c565b946020939093013593505050565b5f805f60608486031215611ae1575f80fd5b611aea84611a8c565b9250611af860208501611a8c565b929592945050506040919091013590565b5f60208284031215611b19575f80fd5b5035919050565b5f8060408385031215611b31575f80fd5b82359150611b4160208401611a8c565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f8067ffffffffffffffff841115611b7857611b78611b4a565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff82111715611ba757611ba7611b4a565b604052838152905080828401851015611bbe575f80fd5b838360208301375f60208583010152509392505050565b5f8060408385031215611be6575f80fd5b611bef83611a8c565b9150602083013567ffffffffffffffff811115611c0a575f80fd5b8301601f81018513611c1a575f80fd5b611c2985823560208401611b5e565b9150509250929050565b5f60208284031215611c43575f80fd5b61082482611a8c565b5f8060208385031215611c5d575f80fd5b823567ffffffffffffffff811115611c73575f80fd5b8301601f81018513611c83575f80fd5b803567ffffffffffffffff811115611c99575f80fd5b8560208260051b8401011115611cad575f80fd5b6020919091019590945092505050565b5f82601f830112611ccc575f80fd5b61082483833560208501611b5e565b5f805f805f805f60e0888a031215611cf1575f80fd5b873567ffffffffffffffff811115611d07575f80fd5b611d138a828b01611cbd565b975050602088013567ffffffffffffffff811115611d2f575f80fd5b611d3b8a828b01611cbd565b965050611d4a60408901611a8c565b9450611d5860608901611a8c565b9350611d6660808901611a8c565b9250611d7460a08901611a8c565b9150611d8260c08901611a8c565b905092959891949750929550565b5f8060408385031215611da1575f80fd5b611daa83611a8c565b9150611b4160208401611a8c565b600181811c90821680611dcc57607f821691505b602082108103611dea57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611e14575f80fd5b5051919050565b601f8211156108a057805f5260205f20601f840160051c81016020851015611e405750805b601f840160051c820191505b81811015611553575f8155600101611e4c565b815167ffffffffffffffff811115611e7957611e79611b4a565b611e8d81611e878454611db8565b84611e1b565b6020601f821160018114611ebf575f8315611ea85750848201515b5f19600385901b1c1916600184901b178455611553565b5f84815260208120601f198516915b82811015611eee5787850151825560209485019460019092019101611ece565b5084821015611f0b57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82518060208501845e5f920191825250919050565b808201808211156106b957634e487b7160e01b5f52601160045260245ffdfe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc539440820030c4994db4e31b6b800deafd503688728f932addfe7a410515c14c02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300a26469706673582212200d497ac618635e954b0bef29d7dde13a2e3c79b811085406bc8e45b48ecf795464736f6c634300081a0033
Deployed Bytecode Sourcemap
83083:6868:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45109:204;;;;;;;;;;-1:-1:-1;45109:204:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;45109:204:0;;;;;;;;67333:147;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;89667:281::-;;;;;;;;;;-1:-1:-1;89667:281:0;;;;;:::i;:::-;;:::i;68547:155::-;;;;;;;;;;-1:-1:-1;68680:14:0;;68547:155;;;1549:25:1;;;1537:2;1522:18;68547:155:0;1403:177:1;70674:249:0;;;;;;;;;;-1:-1:-1;70674:249:0;;;;;:::i;:::-;;:::i;46461:194::-;;;;;;;;;;-1:-1:-1;46461:194:0;;;;;:::i;:::-;;:::i;83705:104::-;;;;;;;;;;-1:-1:-1;83705:104:0;83743:66;83705:104;;46965:138;;;;;;;;;;-1:-1:-1;46965:138:0;;;;;:::i;:::-;;:::i;:::-;;68398:84;;;;;;;;;;-1:-1:-1;68398:84:0;;68472:2;2824:36:1;;2812:2;2797:18;68398:84:0;2682:184:1;48102:251:0;;;;;;;;;;-1:-1:-1;48102:251:0;;;;;:::i;:::-;;:::i;87124:85::-;;;;;;;;;;;;;:::i;85558:113::-;;;;;;;;;;-1:-1:-1;85558:113:0;;;;;:::i;:::-;;:::i;86024:109::-;;;;;;;;;;-1:-1:-1;86024:109:0;;;;;:::i;:::-;;:::i;83847:108::-;;;;;;;;;;-1:-1:-1;83847:108:0;83889:66;83847:108;;55231:217;;;;;;:::i;:::-;;:::i;54764:136::-;;;;;;;;;;;;;:::i;79829:148::-;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;79960:9:0;;;79829:148;;68765:174;;;;;;;;;;-1:-1:-1;68765:174:0;;;;;:::i;:::-;-1:-1:-1;;;;;68911:20:0;68830:7;68911:20;;;-1:-1:-1;;;;;;;;;;;68911:20:0;;;;;;;68765:174;86845:81;;;;;;;;;;;;;:::i;87558:406::-;;;;;;;;;;-1:-1:-1;87558:406:0;;;;;:::i;:::-;;:::i;45405:210::-;;;;;;;;;;-1:-1:-1;45405:210:0;;;;;:::i;:::-;;:::i;88239:121::-;;;;;;;;;;-1:-1:-1;88239:121:0;;;;;:::i;:::-;;:::i;67599:151::-;;;;;;;;;;;;;:::i;43949:49::-;;;;;;;;;;-1:-1:-1;43949:49:0;43994:4;43949:49;;69144:182;;;;;;;;;;-1:-1:-1;69144:182:0;;;;;:::i;:::-;;:::i;52832:58::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52832:58:0;;;;;35123:193;;;;;;;;;;-1:-1:-1;35123:193:0;;;;;:::i;:::-;;:::i;84507:628::-;;;;;;;;;;-1:-1:-1;84507:628:0;;;;;:::i;:::-;;:::i;83287:104::-;;;;;;;;;;-1:-1:-1;83287:104:0;83325:66;83287:104;;47396:140;;;;;;;;;;-1:-1:-1;47396:140:0;;;;;:::i;:::-;;:::i;69389:198::-;;;;;;;;;;-1:-1:-1;69389:198:0;;;;;:::i;:::-;;:::i;83567:104::-;;;;;;;;;;-1:-1:-1;83567:104:0;-1:-1:-1;;;;;;;;;;;83567:104:0;;86526:125;;;;;;;;;;-1:-1:-1;86526:125:0;;;;;:::i;:::-;;:::i;83427:106::-;;;;;;;;;;-1:-1:-1;83427:106:0;83467:66;83427:106;;45109:204;45194:4;-1:-1:-1;;;;;;45218:47:0;;-1:-1:-1;;;45218:47:0;;:87;;-1:-1:-1;;;;;;;;;;41693:40:0;;;45269:36;45211:94;45109:204;-1:-1:-1;;45109:204:0:o;67333:147::-;67465:7;67458:14;;67378:13;;-1:-1:-1;;;;;;;;;;;66658:20:0;67458:14;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67333:147;:::o;89667:281::-;89882:4;89788:7;34433:22;34447:7;34433:13;:22::i;:::-;34429:86;;;34479:24;;-1:-1:-1;;;34479:24:0;;-1:-1:-1;;;;;7245:32:1;;34479:24:0;;;7227:51:1;7200:18;;34479:24:0;;;;;;;;34429:86;32203:10;34433:22:::1;34447:7;34433:13;:22::i;:::-;34429:86;;;34479:24;::::0;-1:-1:-1;;;34479:24:0;;-1:-1:-1;;;;;7245:32:1;;34479:24:0::1;::::0;::::1;7227:51:1::0;7200:18;;34479:24:0::1;7081:203:1::0;34429:86:0::1;79434:19:::2;:17;:19::i;:::-;89911:29:::3;89925:7;89934:5;89911:13;:29::i;:::-;89904:36:::0;89667:281;-1:-1:-1;;;;;89667:281:0:o;70674:249::-;70761:4;32203:10;70819:37;70835:4;32203:10;70850:5;70819:15;:37::i;:::-;70867:26;70877:4;70883:2;70887:5;70867:9;:26::i;:::-;70911:4;70904:11;;;70674:249;;;;;;:::o;46461:194::-;46526:7;46623:14;;;-1:-1:-1;;;;;;;;;;;46623:14:0;;;;;:24;;;;46461:194::o;46965:138::-;47039:18;47052:4;47039:12;:18::i;:::-;44845:16;44856:4;44845:10;:16::i;:::-;47070:25:::1;47081:4;47087:7;47070:10;:25::i;:::-;;46965:138:::0;;;:::o;48102:251::-;-1:-1:-1;;;;;48196:34:0;;32203:10;48196:34;48192:104;;48254:30;;-1:-1:-1;;;48254:30:0;;;;;;;;;;;48192:104;48308:37;48320:4;48326:18;48308:11;:37::i;:::-;;48102:251;;:::o;87124:85::-;-1:-1:-1;;;;;;;;;;;44845:16:0;83605:66;44845:10;:16::i;:::-;87191:10:::1;:8;:10::i;:::-;87124:85:::0;:::o;85558:113::-;83325:66;44845:16;83325:66;44845:10;:16::i;:::-;85647::::1;85653:2;85657:5;85647;:16::i;86024:109::-:0;83743:66;44845:16;83743:66;44845:10;:16::i;:::-;86101:24:::1;86107:10;86119:5;86101;:24::i;:::-;86024:109:::0;;:::o;55231:217::-;53686:13;:11;:13::i;:::-;55347:36:::1;55365:17;55347;:36::i;:::-;55394:46;55416:17;55435:4;55394:21;:46::i;54764:136::-:0;54833:7;53966:20;:18;:20::i;:::-;-1:-1:-1;;;;;;;;;;;;54764:136:0;:::o;86845:81::-;-1:-1:-1;;;;;;;;;;;44845:16:0;83605:66;44845:10;:16::i;:::-;86910:8:::1;:6;:8::i;87558:406::-:0;-1:-1:-1;;;;;;;;;;;44845:16:0;83605:66;44845:10;:16::i;:::-;87658:15:::1;87722:8:::0;87658:15;87748:209:::1;87772:14;87768:1;:18;87748:209;;;87830:7;-1:-1:-1::0;;;;;87816:21:0::1;:8;;87825:1;87816:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;87816:21:0::1;;87808:60;;;::::0;-1:-1:-1;;;87808:60:0;;7623:2:1;87808:60:0::1;::::0;::::1;7605:21:1::0;7662:2;7642:18;;;7635:30;7701:28;7681:18;;;7674:56;7747:18;;87808:60:0::1;7421:350:1::0;87808:60:0::1;87883:26;87897:8;;87906:1;87897:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;87883:13;:26::i;:::-;87934:8;;87943:1;87934:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;87924:21:::0;-1:-1:-1;87788:3:0::1;;87748:209;;;;87647:317;;87558:406:::0;;;:::o;45405:210::-;45482:4;45576:14;;;-1:-1:-1;;;;;;;;;;;45576:14:0;;;;;;;;-1:-1:-1;;;;;45576:31:0;;;;;;;;;;;;;;;45405:210::o;88239:121::-;-1:-1:-1;;;;;;;;;;;44845:16:0;83605:66;44845:10;:16::i;:::-;88328:24:::1;88344:7;88328:15;:24::i;67599:151::-:0;67733:9;67726:16;;67646:13;;-1:-1:-1;;;;;;;;;;;66658:20:0;67726:16;;;:::i;69144:182::-;69213:4;32203:10;69269:27;32203:10;69286:2;69290:5;69269:9;:27::i;:::-;-1:-1:-1;69314:4:0;;69144:182;-1:-1:-1;;;69144:182:0:o;35123:193::-;-1:-1:-1;;;;;35290:18:0;35192:4;35290:18;;;33685:30;35290:18;;;;;;;;;35123:193::o;84507:628::-;31117:21;26433:15;;-1:-1:-1;;;26433:15:0;;;;26432:16;;26480:14;;26286:30;26865:16;;:34;;;;;26885:14;26865:34;26845:54;;26910:17;26930:11;:16;;26945:1;26930:16;:50;;;;-1:-1:-1;26958:4:0;26950:25;:30;26930:50;26910:70;;26998:12;26997:13;:30;;;;;27015:12;27014:13;26997:30;26993:93;;;27051:23;;-1:-1:-1;;;27051:23:0;;;;;;;;;;;26993:93;27096:18;;-1:-1:-1;;27096:18:0;27113:1;27096:18;;;27125:69;;;;27160:22;;-1:-1:-1;;;;27160:22:0;-1:-1:-1;;;27160:22:0;;;27125:69;84730:28:::1;84743:5;84750:7;84730:12;:28::i;:::-;84769:24;:22;:24::i;:::-;84804:22;:20;:22::i;:::-;84837:38;43994:4;84868:6:::0;84837:10:::1;:38::i;:::-;-1:-1:-1::0;84886:32:0::1;83325:66;84910:7:::0;84886:10:::1;:32::i;:::-;-1:-1:-1::0;84929:36:0::1;83467:66;84955:9:::0;84929:10:::1;:36::i;:::-;;84976:22;:20;:22::i;:::-;85009:24;:22;:24::i;:::-;85044:32;-1:-1:-1::0;;;;;;;;;;;85068:7:0;85044:10:::1;:32::i;:::-;-1:-1:-1::0;85087:40:0::1;83889:66;85115:11:::0;85087:10:::1;:40::i;:::-;;27220:14:::0;27216:104;;;27251:23;;-1:-1:-1;;;;27251:23:0;;;27294:14;;-1:-1:-1;7929:50:1;;27294:14:0;;7917:2:1;7902:18;27294:14:0;;;;;;;27216:104;26218:1109;;;;;84507:628;;;;;;;:::o;47396:140::-;47471:18;47484:4;47471:12;:18::i;:::-;44845:16;44856:4;44845:10;:16::i;:::-;47502:26:::1;47514:4;47520:7;47502:11;:26::i;69389:198::-:0;-1:-1:-1;;;;;69550:20:0;;;69469:7;69550:20;;;:13;:20;;;;;;;;:29;;;;;;;;;;;;;69389:198::o;86526:125::-;83889:66;44845:16;83889:66;44845:10;:16::i;:::-;86625:18:::1;86631:4;86637:5;86625;:18::i;80050:132::-:0;-1:-1:-1;;;;;;;;;;;79960:9:0;;;80112:63;;;80148:15;;-1:-1:-1;;;80148:15:0;;;;;;;;;;;80112:63;80050:132::o;69906:190::-;69979:4;32203:10;70035:31;32203:10;70051:7;70060:5;70035:8;:31::i;76569:487::-;76669:24;76696:25;76706:5;76713:7;76696:9;:25::i;:::-;76669:52;;-1:-1:-1;;76736:16:0;:37;76732:317;;76813:5;76794:16;:24;76790:132;;;76846:60;;-1:-1:-1;;;76846:60:0;;-1:-1:-1;;;;;8210:32:1;;76846:60:0;;;8192:51:1;8259:18;;;8252:34;;;8302:18;;;8295:34;;;8165:18;;76846:60:0;7990:345:1;76790:132:0;76965:57;76974:5;76981:7;77009:5;76990:16;:24;77016:5;76965:8;:57::i;71308:308::-;-1:-1:-1;;;;;71392:18:0;;71388:88;;71434:30;;-1:-1:-1;;;71434:30:0;;71461:1;71434:30;;;7227:51:1;7200:18;;71434:30:0;7081:203:1;71388:88:0;-1:-1:-1;;;;;71490:16:0;;71486:88;;71530:32;;-1:-1:-1;;;71530:32:0;;71559:1;71530:32;;;7227:51:1;7200:18;;71530:32:0;7081:203:1;71486:88:0;71584:24;71592:4;71598:2;71602:5;71584:7;:24::i;45830:105::-;45897:30;45908:4;32203:10;45897;:30::i;49051:396::-;49128:4;-1:-1:-1;;;;;;;;;;;49220:22:0;49228:4;49234:7;49220;:22::i;:::-;49215:225;;49259:8;:14;;;;;;;;;;;-1:-1:-1;;;;;49259:31:0;;;;;;;;;:38;;-1:-1:-1;;49259:38:0;49293:4;49259:38;;;49344:12;32203:10;;32123:98;49344:12;-1:-1:-1;;;;;49317:40:0;49335:7;-1:-1:-1;;;;;49317:40:0;49329:4;49317:40;;;;;;;;;;49379:4;49372:11;;;;;49215:225;49423:5;49416:12;;;;;49691:397;49769:4;-1:-1:-1;;;;;;;;;;;49860:22:0;49868:4;49874:7;49860;:22::i;:::-;49856:225;;;49933:5;49899:14;;;;;;;;;;;-1:-1:-1;;;;;49899:31:0;;;;;;;;;;:39;;-1:-1:-1;;49899:39:0;;;49958:40;32203:10;;49899:14;;49958:40;;49933:5;49958:40;50020:4;50013:11;;;;;80854:182;79693:16;:14;:16::i;:::-;-1:-1:-1;;;;;;;;;;;80973:17:0;;-1:-1:-1;;80973:17:0::1;::::0;;81006:22:::1;32203:10:::0;81015:12:::1;81006:22;::::0;-1:-1:-1;;;;;7245:32:1;;;7227:51;;7215:2;7200:18;81006:22:0::1;;;;;;;80902:134;80854:182::o:0;73492:213::-;-1:-1:-1;;;;;73563:21:0;;73559:93;;73608:32;;-1:-1:-1;;;73608:32:0;;73637:1;73608:32;;;7227:51:1;7200:18;;73608:32:0;7081:203:1;73559:93:0;73662:35;73678:1;73682:7;73691:5;73662:7;:35::i;74033:211::-;-1:-1:-1;;;;;74104:21:0;;74100:91;;74149:30;;-1:-1:-1;;;74149:30:0;;74176:1;74149:30;;;7227:51:1;7200:18;;74149:30:0;7081:203:1;74100:91:0;74201:35;74209:7;74226:1;74230:5;74201:7;:35::i;55682:319::-;55764:4;-1:-1:-1;;;;;55773:6:0;55756:23;;;:121;;;55871:6;-1:-1:-1;;;;;55835:42:0;:32;-1:-1:-1;;;;;;;;;;;13366:53:0;-1:-1:-1;;;;;13366:53:0;;13287:140;55835:32;-1:-1:-1;;;;;55835:42:0;;;55756:121;55738:256;;;55953:29;;-1:-1:-1;;;55953:29:0;;;;;;;;;;;88528:106;83467:66;44845:16;83467:66;44845:10;:16::i;57175:548::-;57293:17;-1:-1:-1;;;;;57275:50:0;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57275:52:0;;;;;;;;-1:-1:-1;;57275:52:0;;;;;;;;;;;;:::i;:::-;;;57271:445;;57644:60;;-1:-1:-1;;;57644:60:0;;-1:-1:-1;;;;;7245:32:1;;57644:60:0;;;7227:51:1;7200:18;;57644:60:0;7081:203:1;57271:445:0;-1:-1:-1;;;;;;;;;;;57370:40:0;;57366:122;;57438:34;;-1:-1:-1;;;57438:34:0;;;;;1549:25:1;;;1522:18;;57438:34:0;1403:177:1;57366:122:0;57502:54;57532:17;57551:4;57502:29;:54::i;56124:218::-;56199:4;-1:-1:-1;;;;;56208:6:0;56191:23;;56187:148;;56294:29;;-1:-1:-1;;;56294:29:0;;;;;;;;;;;80533:180;79434:19;:17;:19::i;:::-;-1:-1:-1;;;;;;;;;;;80653:16:0;;-1:-1:-1;;80653:16:0::1;80665:4;80653:16;::::0;;80685:20:::1;32203:10:::0;80692:12:::1;32123:98:::0;35479:243;35557:7;34433:22;34447:7;34433:13;:22::i;:::-;34429:86;;;34479:24;;-1:-1:-1;;;34479:24:0;;-1:-1:-1;;;;;7245:32:1;;34479:24:0;;;7227:51:1;7200:18;;34479:24:0;7081:203:1;34429:86:0;-1:-1:-1;;;;;35651:18:0;::::1;35577:32;35651:18:::0;;;33685:30;35651:18:::1;::::0;;;;;;;;:25;;-1:-1:-1;;35651:25:0::1;35672:4;35651:25;::::0;;35692:22;;7227:51:1;;;33685:30:0;35692:22:::1;::::0;7200:18:1;35692:22:0::1;;;;;;;;35566:156;35479:243:::0;;:::o;35862:245::-;35939:7;34779:22;34793:7;34779:13;:22::i;:::-;34774:90;;34825:27;;-1:-1:-1;;;34825:27:0;;-1:-1:-1;;;;;7245:32:1;;34825:27:0;;;7227:51:1;7200:18;;34825:27:0;7081:203:1;34774:90:0;-1:-1:-1;;;;;36033:18:0;::::1;35959:32;36033:18:::0;;;33685:30;36033:18:::1;::::0;;;;;;;;:26;;-1:-1:-1;;36033:26:0::1;::::0;;36075:24;;7227:51:1;;;33685:30:0;36075:24:::1;::::0;7200:18:1;36075:24:0::1;7081:203:1::0;66886:149:0;29124:20;:18;:20::i;:::-;66989:38:::1;67012:5;67019:7;66989:22;:38::i;54014:68::-:0;29124:20;:18;:20::i;82148:104::-;29124:20;:18;:20::i;:::-;82217:27:::1;:25;:27::i;74797:130::-:0;74882:37;74891:5;74898:7;74907:5;74914:4;75778:499;-1:-1:-1;;;;;;;;;;;;;;;;75945:19:0;;75941:91;;75988:32;;-1:-1:-1;;;75988:32:0;;76017:1;75988:32;;;7227:51:1;7200:18;;75988:32:0;7081:203:1;75941:91:0;-1:-1:-1;;;;;76046:21:0;;76042:92;;76091:31;;-1:-1:-1;;;76091:31:0;;76119:1;76091:31;;;7227:51:1;7200:18;;76091:31:0;7081:203:1;76042:92:0;-1:-1:-1;;;;;76144:20:0;;;;;;;:13;;;:20;;;;;;;;:29;;;;;;;;;:37;;;76192:78;;;;76243:7;-1:-1:-1;;;;;76227:31:0;76236:5;-1:-1:-1;;;;;76227:31:0;;76252:5;76227:31;;;;1549:25:1;;1537:2;1522:18;;1403:177;76227:31:0;;;;;;;;76192:78;75876:401;75778:499;;;;:::o;88975:307::-;89125:4;34433:22;34447:7;34433:13;:22::i;:::-;34429:86;;;34479:24;;-1:-1:-1;;;34479:24:0;;-1:-1:-1;;;;;7245:32:1;;34479:24:0;;;7227:51:1;7200:18;;34479:24:0;7081:203:1;34429:86:0;89161:2:::1;34433:22;34447:7;34433:13;:22::i;:::-;34429:86;;;34479:24;::::0;-1:-1:-1;;;34479:24:0;;-1:-1:-1;;;;;7245:32:1;;34479:24:0::1;::::0;::::1;7227:51:1::0;7200:18;;34479:24:0::1;7081:203:1::0;34429:86:0::1;32203:10:::0;34433:22:::2;34447:7;34433:13;:22::i;:::-;34429:86;;;34479:24;::::0;-1:-1:-1;;;34479:24:0;;-1:-1:-1;;;;;7245:32:1;;34479:24:0::2;::::0;::::2;7227:51:1::0;7200:18;;34479:24:0::2;7081:203:1::0;34429:86:0::2;89225:49:::3;89258:4;89264:2;89268:5;89225:32;:49::i;46071:201::-:0;46160:22;46168:4;46174:7;46160;:22::i;:::-;46155:110;;46206:47;;-1:-1:-1;;;46206:47:0;;-1:-1:-1;;;;;8721:32:1;;46206:47:0;;;8703:51:1;8770:18;;;8763:34;;;8676:18;;46206:47:0;8529:274:1;80259:130:0;-1:-1:-1;;;;;;;;;;;79960:9:0;;;80318:64;;80355:15;;-1:-1:-1;;;80355:15:0;;;;;;;;;;;14130:344;14222:37;14241:17;14222:18;:37::i;:::-;14275:27;;-1:-1:-1;;;;;14275:27:0;;;;;;;;14319:11;;:15;14315:152;;14351:53;14380:17;14399:4;14351:28;:53::i;14315:152::-;14437:18;:16;:18::i;29284:145::-;31117:21;30798:40;-1:-1:-1;;;30798:40:0;;;;29347:75;;29393:17;;-1:-1:-1;;;29393:17:0;;;;;;;;;;;67043:220;29124:20;:18;:20::i;:::-;-1:-1:-1;;;;;;;;;;;67210:7:0;:15:::1;67220:5:::0;67210:7;:15:::1;:::i;:::-;-1:-1:-1::0;67236:9:0::1;::::0;::::1;:19;67248:7:::0;67236:9;:19:::1;:::i;79044:159::-:0;29124:20;:18;:20::i;:::-;-1:-1:-1;;;;;;;;;;;79178:17:0;;-1:-1:-1;;79178:17:0::1;::::0;;79044:159::o;82475:147::-;79434:19;:17;:19::i;:::-;82584:30:::1;82598:4;82604:2;82608:5;82584:13;:30::i;13523:286::-:0;13601:17;-1:-1:-1;;;;;13601:29:0;;13634:1;13601:34;13597:121;;13659:47;;-1:-1:-1;;;13659:47:0;;-1:-1:-1;;;;;7245:32:1;;13659:47:0;;;7227:51:1;7200:18;;13659:47:0;7081:203:1;13597:121:0;-1:-1:-1;;;;;;;;;;;13728:73:0;;-1:-1:-1;;;;;;13728:73:0;-1:-1:-1;;;;;13728:73:0;;;;;;;;;;13523:286::o;4964:256::-;5047:12;5073;5087:23;5114:6;-1:-1:-1;;;;;5114:19:0;5134:4;5114:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5072:67;;;;5157:55;5184:6;5192:7;5201:10;5157:26;:55::i;18054:126::-;18105:9;:13;18101:72;;18142:19;;-1:-1:-1;;;18142:19:0;;;;;;;;;;;71940:1199;-1:-1:-1;;;;;;;;;;;;;;;;72084:18:0;;72080:558;;72240:5;72222:1;:14;;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;72080:558:0;;-1:-1:-1;72080:558:0;;-1:-1:-1;;;;;72300:17:0;;72278:19;72300:17;;;;;;;;;;;72336:19;;;72332:117;;;72383:50;;-1:-1:-1;;;72383:50:0;;-1:-1:-1;;;;;8210:32:1;;72383:50:0;;;8192:51:1;8259:18;;;8252:34;;;8302:18;;;8295:34;;;8165:18;;72383:50:0;7990:345:1;72332:117:0;-1:-1:-1;;;;;72572:17:0;;:11;:17;;;;;;;;;;72592:19;;;;72572:39;;72080:558;-1:-1:-1;;;;;72654:16:0;;72650:439;;72820:14;;;:23;;;;;;;72650:439;;;-1:-1:-1;;;;;73038:15:0;;:11;:15;;;;;;;;;;:24;;;;;;72650:439;73121:2;-1:-1:-1;;;;;73106:25:0;73115:4;-1:-1:-1;;;;;73106:25:0;;73125:5;73106:25;;;;1549::1;;1537:2;1522:18;;1403:177;73106:25:0;;;;;;;;72015:1124;71940:1199;;;:::o;5493:597::-;5641:12;5671:7;5666:417;;5695:19;5703:10;5695:7;:19::i;:::-;5666:417;;;5923:17;;:22;:49;;;;-1:-1:-1;;;;;;5949:18:0;;;:23;5923:49;5919:121;;;6000:24;;-1:-1:-1;;;6000:24:0;;-1:-1:-1;;;;;7245:32:1;;6000:24:0;;;7227:51:1;7200:18;;6000:24:0;7081:203:1;5919:121:0;-1:-1:-1;6061:10:0;6054:17;;6643:528;6776:17;;:21;6772:392;;7008:10;7002:17;7065:15;7052:10;7048:2;7044:19;7037:44;6772:392;7135:17;;-1:-1:-1;;;7135:17:0;;;;;;;;;;;14:286:1;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:418;646:2;635:9;628:21;609:4;678:6;672:13;721:6;716:2;705:9;701:18;694:34;780:6;775:2;767:6;763:15;758:2;747:9;743:18;737:50;836:1;831:2;822:6;811:9;807:22;803:31;796:42;906:2;899;895:7;890:2;882:6;878:15;874:29;863:9;859:45;855:54;847:62;;;497:418;;;;:::o;920:173::-;988:20;;-1:-1:-1;;;;;1037:31:1;;1027:42;;1017:70;;1083:1;1080;1073:12;1017:70;920:173;;;:::o;1098:300::-;1166:6;1174;1227:2;1215:9;1206:7;1202:23;1198:32;1195:52;;;1243:1;1240;1233:12;1195:52;1266:29;1285:9;1266:29;:::i;:::-;1256:39;1364:2;1349:18;;;;1336:32;;-1:-1:-1;;;1098:300:1:o;1585:374::-;1662:6;1670;1678;1731:2;1719:9;1710:7;1706:23;1702:32;1699:52;;;1747:1;1744;1737:12;1699:52;1770:29;1789:9;1770:29;:::i;:::-;1760:39;;1818:38;1852:2;1841:9;1837:18;1818:38;:::i;:::-;1585:374;;1808:48;;-1:-1:-1;;;1925:2:1;1910:18;;;;1897:32;;1585:374::o;1964:226::-;2023:6;2076:2;2064:9;2055:7;2051:23;2047:32;2044:52;;;2092:1;2089;2082:12;2044:52;-1:-1:-1;2137:23:1;;1964:226;-1:-1:-1;1964:226:1:o;2377:300::-;2445:6;2453;2506:2;2494:9;2485:7;2481:23;2477:32;2474:52;;;2522:1;2519;2512:12;2474:52;2567:23;;;-1:-1:-1;2633:38:1;2667:2;2652:18;;2633:38;:::i;:::-;2623:48;;2377:300;;;;;:::o;3102:127::-;3163:10;3158:3;3154:20;3151:1;3144:31;3194:4;3191:1;3184:15;3218:4;3215:1;3208:15;3234:715;3298:5;3330:1;3354:18;3346:6;3343:30;3340:56;;;3376:18;;:::i;:::-;-1:-1:-1;3531:2:1;3525:9;-1:-1:-1;;3444:2:1;3423:15;;3419:29;;3589:2;3577:15;3573:29;3561:42;;3654:22;;;3633:18;3618:34;;3615:62;3612:88;;;3680:18;;:::i;:::-;3716:2;3709:22;3764;;;3749:6;-1:-1:-1;3749:6:1;3801:16;;;3798:25;-1:-1:-1;3795:45:1;;;3836:1;3833;3826:12;3795:45;3886:6;3881:3;3874:4;3866:6;3862:17;3849:44;3941:1;3934:4;3925:6;3917;3913:19;3909:30;3902:41;;3234:715;;;;;:::o;3954:523::-;4031:6;4039;4092:2;4080:9;4071:7;4067:23;4063:32;4060:52;;;4108:1;4105;4098:12;4060:52;4131:29;4150:9;4131:29;:::i;:::-;4121:39;;4211:2;4200:9;4196:18;4183:32;4238:18;4230:6;4227:30;4224:50;;;4270:1;4267;4260:12;4224:50;4293:22;;4346:4;4338:13;;4334:27;-1:-1:-1;4324:55:1;;4375:1;4372;4365:12;4324:55;4398:73;4463:7;4458:2;4445:16;4440:2;4436;4432:11;4398:73;:::i;:::-;4388:83;;;3954:523;;;;;:::o;4482:186::-;4541:6;4594:2;4582:9;4573:7;4569:23;4565:32;4562:52;;;4610:1;4607;4600:12;4562:52;4633:29;4652:9;4633:29;:::i;4673:610::-;4759:6;4767;4820:2;4808:9;4799:7;4795:23;4791:32;4788:52;;;4836:1;4833;4826:12;4788:52;4876:9;4863:23;4909:18;4901:6;4898:30;4895:50;;;4941:1;4938;4931:12;4895:50;4964:22;;5017:4;5009:13;;5005:27;-1:-1:-1;4995:55:1;;5046:1;5043;5036:12;4995:55;5086:2;5073:16;5112:18;5104:6;5101:30;5098:50;;;5144:1;5141;5134:12;5098:50;5197:7;5192:2;5182:6;5179:1;5175:14;5171:2;5167:23;5163:32;5160:45;5157:65;;;5218:1;5215;5208:12;5157:65;5249:2;5241:11;;;;;5271:6;;-1:-1:-1;4673:610:1;-1:-1:-1;;;4673:610:1:o;5288:221::-;5331:5;5384:3;5377:4;5369:6;5365:17;5361:27;5351:55;;5402:1;5399;5392:12;5351:55;5424:79;5499:3;5490:6;5477:20;5470:4;5462:6;5458:17;5424:79;:::i;5514:912::-;5647:6;5655;5663;5671;5679;5687;5695;5748:3;5736:9;5727:7;5723:23;5719:33;5716:53;;;5765:1;5762;5755:12;5716:53;5805:9;5792:23;5838:18;5830:6;5827:30;5824:50;;;5870:1;5867;5860:12;5824:50;5893;5935:7;5926:6;5915:9;5911:22;5893:50;:::i;:::-;5883:60;;;5996:2;5985:9;5981:18;5968:32;6025:18;6015:8;6012:32;6009:52;;;6057:1;6054;6047:12;6009:52;6080;6124:7;6113:8;6102:9;6098:24;6080:52;:::i;:::-;6070:62;;;6151:38;6185:2;6174:9;6170:18;6151:38;:::i;:::-;6141:48;;6208:38;6242:2;6231:9;6227:18;6208:38;:::i;:::-;6198:48;;6265:39;6299:3;6288:9;6284:19;6265:39;:::i;:::-;6255:49;;6323:39;6357:3;6346:9;6342:19;6323:39;:::i;:::-;6313:49;;6381:39;6415:3;6404:9;6400:19;6381:39;:::i;:::-;6371:49;;5514:912;;;;;;;;;;:::o;6431:260::-;6499:6;6507;6560:2;6548:9;6539:7;6535:23;6531:32;6528:52;;;6576:1;6573;6566:12;6528:52;6599:29;6618:9;6599:29;:::i;:::-;6589:39;;6647:38;6681:2;6670:9;6666:18;6647:38;:::i;6696:380::-;6775:1;6771:12;;;;6818;;;6839:61;;6893:4;6885:6;6881:17;6871:27;;6839:61;6946:2;6938:6;6935:14;6915:18;6912:38;6909:161;;6992:10;6987:3;6983:20;6980:1;6973:31;7027:4;7024:1;7017:15;7055:4;7052:1;7045:15;6909:161;;6696:380;;;:::o;7289:127::-;7350:10;7345:3;7341:20;7338:1;7331:31;7381:4;7378:1;7371:15;7405:4;7402:1;7395:15;8340:184;8410:6;8463:2;8451:9;8442:7;8438:23;8434:32;8431:52;;;8479:1;8476;8469:12;8431:52;-1:-1:-1;8502:16:1;;8340:184;-1:-1:-1;8340:184:1:o;8934:518::-;9036:2;9031:3;9028:11;9025:421;;;9072:5;9069:1;9062:16;9116:4;9113:1;9103:18;9186:2;9174:10;9170:19;9167:1;9163:27;9157:4;9153:38;9222:4;9210:10;9207:20;9204:47;;;-1:-1:-1;9245:4:1;9204:47;9300:2;9295:3;9291:12;9288:1;9284:20;9278:4;9274:31;9264:41;;9355:81;9373:2;9366:5;9363:13;9355:81;;;9432:1;9418:16;;9399:1;9388:13;9355:81;;9628:1299;9754:3;9748:10;9781:18;9773:6;9770:30;9767:56;;;9803:18;;:::i;:::-;9832:97;9922:6;9882:38;9914:4;9908:11;9882:38;:::i;:::-;9876:4;9832:97;:::i;:::-;9978:4;10009:2;9998:14;;10026:1;10021:649;;;;10714:1;10731:6;10728:89;;;-1:-1:-1;10783:19:1;;;10777:26;10728:89;-1:-1:-1;;9585:1:1;9581:11;;;9577:24;9573:29;9563:40;9609:1;9605:11;;;9560:57;10830:81;;9991:930;;10021:649;8881:1;8874:14;;;8918:4;8905:18;;-1:-1:-1;;10057:20:1;;;10175:222;10189:7;10186:1;10183:14;10175:222;;;10271:19;;;10265:26;10250:42;;10378:4;10363:20;;;;10331:1;10319:14;;;;10205:12;10175:222;;;10179:3;10425:6;10416:7;10413:19;10410:201;;;10486:19;;;10480:26;-1:-1:-1;;10569:1:1;10565:14;;;10581:3;10561:24;10557:37;10553:42;10538:58;10523:74;;10410:201;-1:-1:-1;;;;10657:1:1;10641:14;;;10637:22;10624:36;;-1:-1:-1;9628:1299:1:o;10932:301::-;11061:3;11099:6;11093:13;11145:6;11138:4;11130:6;11126:17;11121:3;11115:37;11207:1;11171:16;;11196:13;;;-1:-1:-1;11171:16:1;10932:301;-1:-1:-1;10932:301:1:o;11238:222::-;11303:9;;;11324:10;;;11321:133;;;11376:10;11371:3;11367:20;11364:1;11357:31;11411:4;11408:1;11401:15;11439:4;11436:1;11429:15
Swarm Source
ipfs://0d497ac618635e954b0bef29d7dde13a2e3c79b811085406bc8e45b48ecf7954
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.