Source Code
Overview
S Balance
0 S
More Info
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Loading...
Loading
Contract Name:
UniversalCashier
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "./interfaces/IUniversalCashier.sol"; contract UniversalCashier is Initializable, PausableUpgradeable, Ownable2StepUpgradeable, ReentrancyGuardUpgradeable, IUniversalCashier { // State variables mapping(address => uint256) public balances; mapping(address => uint256) public lockedBalances; mapping(address => bool) public authorizedGames; address public treasury; // Events event Deposited(address indexed player, uint256 amount); event Withdrawn(address indexed player, uint256 amount); event GameAuthorized(address indexed game, bool status); event BalanceLocked(address indexed player, uint256 amount); event BalanceUnlocked(address indexed player, uint256 amount); event TreasuryUpdated(address indexed newTreasury); /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); } function initialize() public initializer { __Pausable_init(); __Ownable2Step_init(); __ReentrancyGuard_init(); } // Core functions function deposit() external payable override whenNotPaused { require(msg.value > 0, "Must deposit something"); balances[msg.sender] += msg.value; emit Deposited(msg.sender, msg.value); } function withdraw(uint256 amount) external override nonReentrant whenNotPaused { require(amount > 0, "Amount must be greater than 0"); require(getAvailableBalance(msg.sender) >= amount, "Insufficient available balance"); balances[msg.sender] -= amount; (bool success, ) = msg.sender.call{value: amount}(""); require(success, "Transfer failed"); emit Withdrawn(msg.sender, amount); } function getBalance(address player) external view override returns (uint256) { return balances[player]; } // Game interactions function debitPlayer(address player, uint256 amount) external override returns (bool) { require(authorizedGames[msg.sender], "Only authorized games"); require(getAvailableBalance(player) >= amount, "Insufficient available balance"); balances[player] -= amount; return true; } function creditPlayer(address player, uint256 amount) external override { require(authorizedGames[msg.sender], "Only authorized games"); balances[player] += amount; } // Balance locking function lockBalance(address player, uint256 amount) external override { require(authorizedGames[msg.sender], "Only authorized games"); require(getAvailableBalance(player) >= amount, "Insufficient available balance"); lockedBalances[player] += amount; emit BalanceLocked(player, amount); } function unlockBalance(address player, uint256 amount) external override { require(authorizedGames[msg.sender], "Only authorized games"); require(lockedBalances[player] >= amount, "Insufficient locked balance"); lockedBalances[player] -= amount; emit BalanceUnlocked(player, amount); } function getLockedBalance(address player) external view override returns (uint256) { return lockedBalances[player]; } function getAvailableBalance(address player) public view override returns (uint256) { return balances[player] - lockedBalances[player]; } // Game authorization function authorizeGame(address game) external override onlyOwner { require(game != address(0), "Invalid game address"); authorizedGames[game] = true; emit GameAuthorized(game, true); } function unauthorizeGame(address game) external override onlyOwner { authorizedGames[game] = false; emit GameAuthorized(game, false); } // Admin functions function setTreasury(address _treasury) external override onlyOwner { require(_treasury != address(0), "Invalid treasury address"); treasury = _treasury; emit TreasuryUpdated(_treasury); } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } receive() external payable { require(authorizedGames[msg.sender], "Only authorized games can send funds"); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol) pragma solidity ^0.8.0; import "./OwnableUpgradeable.sol"; import {Initializable} from "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership} and {acceptOwnership}. * * This module is used through inheritance. It will make available all functions * from parent (Ownable). */ abstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable { address private _pendingOwner; event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner); function __Ownable2Step_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable2Step_init_unchained() internal onlyInitializing { } /** * @dev Returns the address of the pending owner. */ function pendingOwner() public view virtual returns (address) { return _pendingOwner; } /** * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual override onlyOwner { _pendingOwner = newOwner; emit OwnershipTransferStarted(owner(), newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner. * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual override { delete _pendingOwner; super._transferOwnership(newOwner); } /** * @dev The new owner accepts the ownership transfer. */ function acceptOwnership() public virtual { address sender = _msgSender(); require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner"); _transferOwnership(sender); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import {Initializable} from "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @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 Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 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 functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _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 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _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() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @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 { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import {Initializable} from "../proxy/utils/Initializable.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _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) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; import {Initializable} from "../proxy/utils/Initializable.sol"; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @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.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @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, it is bubbled up by this * function (like regular Solidity function calls). * * 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. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @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`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) 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(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) pragma solidity ^0.8.0; import {Initializable} from "../proxy/utils/Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract 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; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; interface IUniversalCashier { // Core functions function deposit() external payable; function withdraw(uint256 amount) external; function getBalance(address player) external view returns (uint256); // Game interactions function debitPlayer(address player, uint256 amount) external returns (bool); function creditPlayer(address player, uint256 amount) external; // Balance locking function lockBalance(address player, uint256 amount) external; function unlockBalance(address player, uint256 amount) external; function getLockedBalance(address player) external view returns (uint256); function getAvailableBalance(address player) external view returns (uint256); // Game authorization function authorizeGame(address game) external; function unauthorizeGame(address game) external; // Admin function setTreasury(address _treasury) external; }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BalanceLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BalanceUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"game","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"GameAuthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newTreasury","type":"address"}],"name":"TreasuryUpdated","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":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"game","type":"address"}],"name":"authorizeGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorizedGames","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"creditPlayer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"debitPlayer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"}],"name":"getAvailableBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"}],"name":"getLockedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"lockBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockedBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"game","type":"address"}],"name":"unauthorizeGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unlockBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b5061001961001e565b6100dd565b600054610100900460ff161561008a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116146100db576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b611330806100ec6000396000f3fe60806040526004361061016a5760003560e01c80637837e170116100d15780639e492b991161008a578063e30c397811610064578063e30c3978146104a4578063f0f44260146104c2578063f2fde38b146104e2578063f8b2cb4f1461050257600080fd5b80639e492b9914610436578063c408689314610466578063d0e30db01461049c57600080fd5b80637837e1701461039957806379ba5097146103b95780638129fc1c146103ce5780638456cb59146103e35780638da5cb5b146103f85780639bfca0c01461041657600080fd5b80635c975abb116101235780635c975abb146102c85780635e4402df146102ec57806361d027b31461030c5780636c24a76f14610344578063715018a6146103645780637384ab5a1461037957600080fd5b80630426dcef146101e65780630483a7f61461020657806327e235e3146102465780632e1a7d4d146102735780633f4ba83a14610293578063469c32b1146102a857600080fd5b366101e15733600090815260fd602052604090205460ff166101df5760405162461bcd60e51b8152602060048201526024808201527f4f6e6c7920617574686f72697a65642067616d65732063616e2073656e642066604482015263756e647360e01b60648201526084015b60405180910390fd5b005b600080fd5b3480156101f257600080fd5b506101df6102013660046111a8565b610538565b34801561021257600080fd5b506102336102213660046111d2565b60fc6020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561025257600080fd5b506102336102613660046111d2565b60fb6020526000908152604090205481565b34801561027f57600080fd5b506101df61028e3660046111f4565b61063f565b34801561029f57600080fd5b506101df6107b8565b3480156102b457600080fd5b506101df6102c33660046111d2565b6107ca565b3480156102d457600080fd5b5060335460ff165b604051901515815260200161023d565b3480156102f857600080fd5b506101df6103073660046111d2565b610828565b34801561031857600080fd5b5060fe5461032c906001600160a01b031681565b6040516001600160a01b03909116815260200161023d565b34801561035057600080fd5b5061023361035f3660046111d2565b6108d4565b34801561037057600080fd5b506101df610908565b34801561038557600080fd5b506101df6103943660046111a8565b61091a565b3480156103a557600080fd5b506101df6103b43660046111a8565b61097a565b3480156103c557600080fd5b506101df610a39565b3480156103da57600080fd5b506101df610ab0565b3480156103ef57600080fd5b506101df610bd0565b34801561040457600080fd5b506065546001600160a01b031661032c565b34801561042257600080fd5b506102dc6104313660046111a8565b610be0565b34801561044257600080fd5b506102dc6104513660046111d2565b60fd6020526000908152604090205460ff1681565b34801561047257600080fd5b506102336104813660046111d2565b6001600160a01b0316600090815260fc602052604090205490565b6101df610c6d565b3480156104b057600080fd5b506097546001600160a01b031661032c565b3480156104ce57600080fd5b506101df6104dd3660046111d2565b610d19565b3480156104ee57600080fd5b506101df6104fd3660046111d2565b610dc1565b34801561050e57600080fd5b5061023361051d3660046111d2565b6001600160a01b0316600090815260fb602052604090205490565b33600090815260fd602052604090205460ff166105675760405162461bcd60e51b81526004016101d69061120d565b6001600160a01b038216600090815260fc60205260409020548111156105cf5760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e74206c6f636b65642062616c616e6365000000000060448201526064016101d6565b6001600160a01b038216600090815260fc6020526040812080548392906105f7908490611252565b90915550506040518181526001600160a01b038316907f43e8fb9d4f009c90c55a3fa108b177b794704d61af7af6f6512db7883f8ed843906020015b60405180910390a25050565b610647610e32565b61064f610e8b565b6000811161069f5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e203000000060448201526064016101d6565b806106a9336108d4565b10156106c75760405162461bcd60e51b81526004016101d690611265565b33600090815260fb6020526040812080548392906106e6908490611252565b9091555050604051600090339083908381818185875af1925050503d806000811461072d576040519150601f19603f3d011682016040523d82523d6000602084013e610732565b606091505b50509050806107755760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016101d6565b60405182815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a2506107b5600160c955565b50565b6107c0610ed8565b6107c8610f32565b565b6107d2610ed8565b6001600160a01b038116600081815260fd60209081526040808320805460ff19169055519182527fd516aed749348a7021e9cab766a9aac5bfd476b12501d5f21bb5435ee50ede7b91015b60405180910390a250565b610830610ed8565b6001600160a01b03811661087d5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642067616d65206164647265737360601b60448201526064016101d6565b6001600160a01b038116600081815260fd6020908152604091829020805460ff1916600190811790915591519182527fd516aed749348a7021e9cab766a9aac5bfd476b12501d5f21bb5435ee50ede7b910161081d565b6001600160a01b038116600090815260fc602090815260408083205460fb9092528220546109029190611252565b92915050565b610910610ed8565b6107c86000610f84565b33600090815260fd602052604090205460ff166109495760405162461bcd60e51b81526004016101d69061120d565b6001600160a01b038216600090815260fb60205260408120805483929061097190849061129c565b90915550505050565b33600090815260fd602052604090205460ff166109a95760405162461bcd60e51b81526004016101d69061120d565b806109b3836108d4565b10156109d15760405162461bcd60e51b81526004016101d690611265565b6001600160a01b038216600090815260fc6020526040812080548392906109f990849061129c565b90915550506040518181526001600160a01b038316907fd9aa477835e0d1939105c95f6883421ecfbf69c27b4825f650ac8c3fa975f28090602001610633565b60975433906001600160a01b03168114610aa75760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016101d6565b6107b581610f84565b600054610100900460ff1615808015610ad05750600054600160ff909116105b80610aea5750303b158015610aea575060005460ff166001145b610b4d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016101d6565b6000805460ff191660011790558015610b70576000805461ff0019166101001790555b610b78610f9d565b610b80610fcc565b610b88610ffb565b80156107b5576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b610bd8610ed8565b6107c861102a565b33600090815260fd602052604081205460ff16610c0f5760405162461bcd60e51b81526004016101d69061120d565b81610c19846108d4565b1015610c375760405162461bcd60e51b81526004016101d690611265565b6001600160a01b038316600090815260fb602052604081208054849290610c5f908490611252565b909155506001949350505050565b610c75610e8b565b60003411610cbe5760405162461bcd60e51b81526020600482015260166024820152754d757374206465706f73697420736f6d657468696e6760501b60448201526064016101d6565b33600090815260fb602052604081208054349290610cdd90849061129c565b909155505060405134815233907f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c49060200160405180910390a2565b610d21610ed8565b6001600160a01b038116610d775760405162461bcd60e51b815260206004820152601860248201527f496e76616c69642074726561737572792061646472657373000000000000000060448201526064016101d6565b60fe80546001600160a01b0319166001600160a01b0383169081179091556040517f7dae230f18360d76a040c81f050aa14eb9d6dc7901b20fc5d855e2a20fe814d190600090a250565b610dc9610ed8565b609780546001600160a01b0383166001600160a01b03199091168117909155610dfa6065546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600260c95403610e845760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101d6565b600260c955565b60335460ff16156107c85760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016101d6565b600160c955565b6065546001600160a01b031633146107c85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101d6565b610f3a611067565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b609780546001600160a01b03191690556107b5816110b0565b600054610100900460ff16610fc45760405162461bcd60e51b81526004016101d6906112af565b6107c8611102565b600054610100900460ff16610ff35760405162461bcd60e51b81526004016101d6906112af565b6107c8611135565b600054610100900460ff166110225760405162461bcd60e51b81526004016101d6906112af565b6107c8611165565b611032610e8b565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610f673390565b60335460ff166107c85760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016101d6565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166111295760405162461bcd60e51b81526004016101d6906112af565b6033805460ff19169055565b600054610100900460ff1661115c5760405162461bcd60e51b81526004016101d6906112af565b6107c833610f84565b600054610100900460ff16610ed15760405162461bcd60e51b81526004016101d6906112af565b80356001600160a01b03811681146111a357600080fd5b919050565b600080604083850312156111bb57600080fd5b6111c48361118c565b946020939093013593505050565b6000602082840312156111e457600080fd5b6111ed8261118c565b9392505050565b60006020828403121561120657600080fd5b5035919050565b6020808252601590820152744f6e6c7920617574686f72697a65642067616d657360581b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156109025761090261123c565b6020808252601e908201527f496e73756666696369656e7420617661696c61626c652062616c616e63650000604082015260600190565b808201808211156109025761090261123c565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea26469706673582212209792af0294346f509af495b7147f70379f7dd45bbc85b86ddf842e5af5b1bc8a64736f6c63430008130033
Deployed Bytecode
0x60806040526004361061016a5760003560e01c80637837e170116100d15780639e492b991161008a578063e30c397811610064578063e30c3978146104a4578063f0f44260146104c2578063f2fde38b146104e2578063f8b2cb4f1461050257600080fd5b80639e492b9914610436578063c408689314610466578063d0e30db01461049c57600080fd5b80637837e1701461039957806379ba5097146103b95780638129fc1c146103ce5780638456cb59146103e35780638da5cb5b146103f85780639bfca0c01461041657600080fd5b80635c975abb116101235780635c975abb146102c85780635e4402df146102ec57806361d027b31461030c5780636c24a76f14610344578063715018a6146103645780637384ab5a1461037957600080fd5b80630426dcef146101e65780630483a7f61461020657806327e235e3146102465780632e1a7d4d146102735780633f4ba83a14610293578063469c32b1146102a857600080fd5b366101e15733600090815260fd602052604090205460ff166101df5760405162461bcd60e51b8152602060048201526024808201527f4f6e6c7920617574686f72697a65642067616d65732063616e2073656e642066604482015263756e647360e01b60648201526084015b60405180910390fd5b005b600080fd5b3480156101f257600080fd5b506101df6102013660046111a8565b610538565b34801561021257600080fd5b506102336102213660046111d2565b60fc6020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561025257600080fd5b506102336102613660046111d2565b60fb6020526000908152604090205481565b34801561027f57600080fd5b506101df61028e3660046111f4565b61063f565b34801561029f57600080fd5b506101df6107b8565b3480156102b457600080fd5b506101df6102c33660046111d2565b6107ca565b3480156102d457600080fd5b5060335460ff165b604051901515815260200161023d565b3480156102f857600080fd5b506101df6103073660046111d2565b610828565b34801561031857600080fd5b5060fe5461032c906001600160a01b031681565b6040516001600160a01b03909116815260200161023d565b34801561035057600080fd5b5061023361035f3660046111d2565b6108d4565b34801561037057600080fd5b506101df610908565b34801561038557600080fd5b506101df6103943660046111a8565b61091a565b3480156103a557600080fd5b506101df6103b43660046111a8565b61097a565b3480156103c557600080fd5b506101df610a39565b3480156103da57600080fd5b506101df610ab0565b3480156103ef57600080fd5b506101df610bd0565b34801561040457600080fd5b506065546001600160a01b031661032c565b34801561042257600080fd5b506102dc6104313660046111a8565b610be0565b34801561044257600080fd5b506102dc6104513660046111d2565b60fd6020526000908152604090205460ff1681565b34801561047257600080fd5b506102336104813660046111d2565b6001600160a01b0316600090815260fc602052604090205490565b6101df610c6d565b3480156104b057600080fd5b506097546001600160a01b031661032c565b3480156104ce57600080fd5b506101df6104dd3660046111d2565b610d19565b3480156104ee57600080fd5b506101df6104fd3660046111d2565b610dc1565b34801561050e57600080fd5b5061023361051d3660046111d2565b6001600160a01b0316600090815260fb602052604090205490565b33600090815260fd602052604090205460ff166105675760405162461bcd60e51b81526004016101d69061120d565b6001600160a01b038216600090815260fc60205260409020548111156105cf5760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e74206c6f636b65642062616c616e6365000000000060448201526064016101d6565b6001600160a01b038216600090815260fc6020526040812080548392906105f7908490611252565b90915550506040518181526001600160a01b038316907f43e8fb9d4f009c90c55a3fa108b177b794704d61af7af6f6512db7883f8ed843906020015b60405180910390a25050565b610647610e32565b61064f610e8b565b6000811161069f5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e203000000060448201526064016101d6565b806106a9336108d4565b10156106c75760405162461bcd60e51b81526004016101d690611265565b33600090815260fb6020526040812080548392906106e6908490611252565b9091555050604051600090339083908381818185875af1925050503d806000811461072d576040519150601f19603f3d011682016040523d82523d6000602084013e610732565b606091505b50509050806107755760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016101d6565b60405182815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a2506107b5600160c955565b50565b6107c0610ed8565b6107c8610f32565b565b6107d2610ed8565b6001600160a01b038116600081815260fd60209081526040808320805460ff19169055519182527fd516aed749348a7021e9cab766a9aac5bfd476b12501d5f21bb5435ee50ede7b91015b60405180910390a250565b610830610ed8565b6001600160a01b03811661087d5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642067616d65206164647265737360601b60448201526064016101d6565b6001600160a01b038116600081815260fd6020908152604091829020805460ff1916600190811790915591519182527fd516aed749348a7021e9cab766a9aac5bfd476b12501d5f21bb5435ee50ede7b910161081d565b6001600160a01b038116600090815260fc602090815260408083205460fb9092528220546109029190611252565b92915050565b610910610ed8565b6107c86000610f84565b33600090815260fd602052604090205460ff166109495760405162461bcd60e51b81526004016101d69061120d565b6001600160a01b038216600090815260fb60205260408120805483929061097190849061129c565b90915550505050565b33600090815260fd602052604090205460ff166109a95760405162461bcd60e51b81526004016101d69061120d565b806109b3836108d4565b10156109d15760405162461bcd60e51b81526004016101d690611265565b6001600160a01b038216600090815260fc6020526040812080548392906109f990849061129c565b90915550506040518181526001600160a01b038316907fd9aa477835e0d1939105c95f6883421ecfbf69c27b4825f650ac8c3fa975f28090602001610633565b60975433906001600160a01b03168114610aa75760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016101d6565b6107b581610f84565b600054610100900460ff1615808015610ad05750600054600160ff909116105b80610aea5750303b158015610aea575060005460ff166001145b610b4d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016101d6565b6000805460ff191660011790558015610b70576000805461ff0019166101001790555b610b78610f9d565b610b80610fcc565b610b88610ffb565b80156107b5576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b610bd8610ed8565b6107c861102a565b33600090815260fd602052604081205460ff16610c0f5760405162461bcd60e51b81526004016101d69061120d565b81610c19846108d4565b1015610c375760405162461bcd60e51b81526004016101d690611265565b6001600160a01b038316600090815260fb602052604081208054849290610c5f908490611252565b909155506001949350505050565b610c75610e8b565b60003411610cbe5760405162461bcd60e51b81526020600482015260166024820152754d757374206465706f73697420736f6d657468696e6760501b60448201526064016101d6565b33600090815260fb602052604081208054349290610cdd90849061129c565b909155505060405134815233907f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c49060200160405180910390a2565b610d21610ed8565b6001600160a01b038116610d775760405162461bcd60e51b815260206004820152601860248201527f496e76616c69642074726561737572792061646472657373000000000000000060448201526064016101d6565b60fe80546001600160a01b0319166001600160a01b0383169081179091556040517f7dae230f18360d76a040c81f050aa14eb9d6dc7901b20fc5d855e2a20fe814d190600090a250565b610dc9610ed8565b609780546001600160a01b0383166001600160a01b03199091168117909155610dfa6065546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600260c95403610e845760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101d6565b600260c955565b60335460ff16156107c85760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016101d6565b600160c955565b6065546001600160a01b031633146107c85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101d6565b610f3a611067565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b609780546001600160a01b03191690556107b5816110b0565b600054610100900460ff16610fc45760405162461bcd60e51b81526004016101d6906112af565b6107c8611102565b600054610100900460ff16610ff35760405162461bcd60e51b81526004016101d6906112af565b6107c8611135565b600054610100900460ff166110225760405162461bcd60e51b81526004016101d6906112af565b6107c8611165565b611032610e8b565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610f673390565b60335460ff166107c85760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016101d6565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166111295760405162461bcd60e51b81526004016101d6906112af565b6033805460ff19169055565b600054610100900460ff1661115c5760405162461bcd60e51b81526004016101d6906112af565b6107c833610f84565b600054610100900460ff16610ed15760405162461bcd60e51b81526004016101d6906112af565b80356001600160a01b03811681146111a357600080fd5b919050565b600080604083850312156111bb57600080fd5b6111c48361118c565b946020939093013593505050565b6000602082840312156111e457600080fd5b6111ed8261118c565b9392505050565b60006020828403121561120657600080fd5b5035919050565b6020808252601590820152744f6e6c7920617574686f72697a65642067616d657360581b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156109025761090261123c565b6020808252601e908201527f496e73756666696369656e7420617661696c61626c652062616c616e63650000604082015260600190565b808201808211156109025761090261123c565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea26469706673582212209792af0294346f509af495b7147f70379f7dd45bbc85b86ddf842e5af5b1bc8a64736f6c63430008130033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.