Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
There are no matching entriesUpdate your filters to view other transactions | |||||||||
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
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 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/IBeacon.sol@v5.0.1
// 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/Address.sol@v5.0.1
// 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/StorageSlot.sol@v5.0.1
// 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/ERC1967Utils.sol@v5.0.1
// 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/IERC20.sol@v5.0.1
// 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/IERC20Metadata.sol@v5.0.1
// 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/Initializable.sol@v5.0.1
// 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/ContextUpgradeable.sol@v5.0.1
// 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 bugs@ripple.com
*/
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/IAccessControl.sol@v5.0.1
// 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/IERC165.sol@v5.0.1
// 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/ERC165Upgradeable.sol@v5.0.1
// 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/AccessControlUpgradeable.sol@v5.0.1
// 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/draft-IERC1822.sol@v5.0.1
// 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/UUPSUpgradeable.sol@v5.0.1
// 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/draft-IERC6093.sol@v5.0.1
// 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/ERC20Upgradeable.sol@v5.0.1
// 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/PausableUpgradeable.sol@v5.0.1
// 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/ERC20PausableUpgradeable.sol@v5.0.1
// 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 bugs@ripple.com
*/
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
Contract ABI
API[{"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
Net Worth in USD
$142.10
Net Worth in ETH
0.071876
Token Allocations
RLUSD
69.37%
ETH
17.86%
USDT
10.28%
Others
2.49%
Multichain Portfolio | 34 Chains
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.