More Info
Private Name Tags
ContractCreator
TokenTracker
Multichain Info
4 addresses found via
Latest 25 from a total of 1,438 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 17236642 | 24 days ago | IN | 0 ETH | 0.00000002 | ||||
Withdraw | 16888989 | 32 days ago | IN | 0 ETH | 0.00000001 | ||||
Withdraw | 15975761 | 53 days ago | IN | 0 ETH | 0.00000019 | ||||
Withdraw | 15893770 | 55 days ago | IN | 0 ETH | 0.00000063 | ||||
Withdraw | 15846045 | 56 days ago | IN | 0 ETH | 0.00000013 | ||||
Withdraw | 15755315 | 58 days ago | IN | 0 ETH | 0.00000018 | ||||
Withdraw | 14880873 | 79 days ago | IN | 0 ETH | 0.00000047 | ||||
Withdraw | 14737355 | 82 days ago | IN | 0 ETH | 0.00000019 | ||||
Withdraw | 13470298 | 111 days ago | IN | 0 ETH | 0.00000064 | ||||
Withdraw | 13354467 | 114 days ago | IN | 0 ETH | 0.00000004 | ||||
Withdraw | 13311573 | 115 days ago | IN | 0 ETH | 0.00000012 | ||||
Withdraw | 13249117 | 116 days ago | IN | 0 ETH | 0.00000016 | ||||
Withdraw | 13058980 | 121 days ago | IN | 0 ETH | 0.00000016 | ||||
Approve | 12990523 | 122 days ago | IN | 0 ETH | 0.0000001 | ||||
Deposit | 12990512 | 122 days ago | IN | 0 ETH | 0.00000025 | ||||
Withdraw | 12977857 | 123 days ago | IN | 0 ETH | 0.00000013 | ||||
Withdraw | 12967413 | 123 days ago | IN | 0 ETH | 0.00000015 | ||||
Withdraw | 12967388 | 123 days ago | IN | 0 ETH | 0.00000014 | ||||
Withdraw | 12947848 | 123 days ago | IN | 0 ETH | 0.00000013 | ||||
Withdraw | 12947835 | 123 days ago | IN | 0 ETH | 0.00000013 | ||||
Withdraw | 12947621 | 123 days ago | IN | 0 ETH | 0.00000013 | ||||
Withdraw | 12935984 | 124 days ago | IN | 0 ETH | 0.00000013 | ||||
Withdraw | 12935970 | 124 days ago | IN | 0 ETH | 0.00000013 | ||||
Withdraw | 12872654 | 125 days ago | IN | 0 ETH | 0.00000069 | ||||
Withdraw | 12840642 | 126 days ago | IN | 0 ETH | 0.00000031 |
Loading...
Loading
Contract Name:
Vault_Blast
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: AGPL-3.0-only pragma solidity 0.8.19; import { BlastConfig } from './blast-config/BlastConfig.sol'; import { Vault } from '../Vault.sol'; /** * @title Vault_Blast * @notice The vault contract */ contract Vault_Blast is Vault, BlastConfig { /** * @notice Initializes the contract * @param _asset The vault asset address * @param _name The ERC20 token name * @param _symbol The ERC20 token symbol * @param _assetSpenders The addresses of initial asset spenders * @param _depositAllowed The initial state of deposit availability * @param _variableRepaymentEnabled The initial state of variable token and balance actions * @param _owner The address of the initial owner of the contract * @param _managers The addresses of initial managers of the contract * @param _addOwnerToManagers The flag to optionally add the owner to the list of managers */ constructor( address _asset, string memory _name, string memory _symbol, address[] memory _assetSpenders, bool _depositAllowed, bool _variableRepaymentEnabled, address _owner, address[] memory _managers, bool _addOwnerToManagers ) Vault( _asset, _name, _symbol, _assetSpenders, _depositAllowed, _variableRepaymentEnabled, _owner, _managers, _addOwnerToManagers ) { blastConfigureClaimableAssets(); } function _isBlastConfigAuthorized() internal view override returns (bool) { return isManager(msg.sender); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.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 Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _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 anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.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 Pausable is Context { /** * @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. */ constructor() { _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()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @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 ReentrancyGuard { // 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; constructor() { _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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; import { ITokenBalance } from './interfaces/ITokenBalance.sol'; import { ManagerRole } from './roles/ManagerRole.sol'; import './helpers/TransferHelper.sol' as TransferHelper; import './Constants.sol' as Constants; /** * @title BalanceManagement * @notice Base contract for the withdrawal of tokens, except for reserved ones */ abstract contract BalanceManagement is ManagerRole { /** * @notice Emitted when the specified token is reserved */ error ReservedTokenError(); /** * @notice Performs the withdrawal of tokens, except for reserved ones * @dev Use the "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" address for the native token * @param _tokenAddress The address of the token * @param _tokenAmount The amount of the token */ function cleanup(address _tokenAddress, uint256 _tokenAmount) external onlyManager { if (isReservedToken(_tokenAddress)) { revert ReservedTokenError(); } if (_tokenAddress == Constants.NATIVE_TOKEN_ADDRESS) { TransferHelper.safeTransferNative(msg.sender, _tokenAmount); } else { TransferHelper.safeTransfer(_tokenAddress, msg.sender, _tokenAmount); } } /** * @notice Getter of the token balance of the current contract * @dev Use the "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" address for the native token * @param _tokenAddress The address of the token * @return The token balance of the current contract */ function tokenBalance(address _tokenAddress) public view returns (uint256) { if (_tokenAddress == Constants.NATIVE_TOKEN_ADDRESS) { return address(this).balance; } else { return ITokenBalance(_tokenAddress).balanceOf(address(this)); } } /** * @notice Getter of the reserved token flag * @dev Override to add reserved token addresses * @param _tokenAddress The address of the token * @return The reserved token flag */ function isReservedToken(address _tokenAddress) public view virtual returns (bool) { // The function returns false by default. // The explicit return statement is omitted to avoid the unused parameter warning. // See https://github.com/ethereum/solidity/issues/5295 } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; import { IBlast, IERC20Rebasing, YieldMode, GasMode } from './interfaces/IBlast.sol'; import { BlastContracts } from './BlastContracts.sol'; abstract contract BlastConfig is BlastContracts { /** * @dev Modifier to check if the caller is authorized to perform Blast configuration */ modifier onlyBlastConfigAuthorized(bool _initAllowed) { require( (_initAllowed && address(this).code.length == 0) || _isBlastConfigAuthorized(), 'BlastConfig: Unauthorized' ); _; } /** * @notice Blast: claimable assets configuration */ function blastConfigureClaimableAssets() public virtual onlyBlastConfigAuthorized(true) { BLAST.configureClaimableYield(); // The default is YieldMode.VOID BLAST.configureClaimableGas(); // The default is GasMode.VOID USDB.configure(YieldMode.CLAIMABLE); // The default is YieldMode.AUTOMATIC WETH.configure(YieldMode.CLAIMABLE); // The default is YieldMode.AUTOMATIC } /** * @notice Blast: token yield configuration * @param _token Token reference * @param _yieldMode Yield mode */ function blastConfigureTokenYield( IERC20Rebasing _token, YieldMode _yieldMode ) public virtual onlyBlastConfigAuthorized(true) { _token.configure(_yieldMode); } /** * @notice Blast: governor configuration * @param _governor Governor address */ function blastConfigureGovernor( address _governor ) public virtual onlyBlastConfigAuthorized(true) { BLAST.configureGovernor(_governor); } /** * @notice Blast: points operator configuration * @param _pointsOperator Blast points operator address */ function blastConfigurePointsOperator( address _pointsOperator ) public virtual onlyBlastConfigAuthorized(true) { BLAST_POINTS.configurePointsOperator(_pointsOperator); } /** * @notice Blast: token yield claim * @param _token Token reference * @param _recipient Recipient address * @param _amount Token amount */ function blastClaimTokenYield( IERC20Rebasing _token, address _recipient, uint256 _amount ) public virtual onlyBlastConfigAuthorized(false) { _token.claim(_recipient, _amount); } function _isBlastConfigAuthorized() internal virtual returns (bool); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; import { IBlast, IERC20Rebasing, IBlastPoints } from './interfaces/IBlast.sol'; contract BlastContracts { /** * @dev Blast gas fees and ETH yield contract reference * @dev Gas fees: https://docs.blast.io/building/guides/gas-fees * @dev ETH yield: https://docs.blast.io/building/guides/eth-yield */ IBlast public constant BLAST = IBlast(0x4300000000000000000000000000000000000002); /** * @dev Blast USDB contract reference * @dev See https://docs.blast.io/building/guides/weth-yield */ IERC20Rebasing public constant USDB = IERC20Rebasing(0x4300000000000000000000000000000000000003); /** * @dev Blast WETH contract reference * @dev See https://docs.blast.io/building/guides/weth-yield */ IERC20Rebasing public constant WETH = IERC20Rebasing(0x4300000000000000000000000000000000000004); /** * @dev Blast points contract reference * @dev See https://docs.blast.io/airdrop/api */ IBlastPoints public constant BLAST_POINTS = IBlastPoints(0x2536FE9ab3F511540F2f9e2eC2A805005C3Dd800); }
// SPDX-License-Identifier: BSL 1.1 - Copyright 2024 MetaLayer Labs Ltd. pragma solidity 0.8.19; enum YieldMode { AUTOMATIC, VOID, CLAIMABLE } enum GasMode { VOID, CLAIMABLE } interface IBlast { // configure function configureContract( address contractAddress, YieldMode _yield, GasMode gasMode, address governor ) external; function configure(YieldMode _yield, GasMode gasMode, address governor) external; // base configuration options function configureClaimableYield() external; function configureClaimableYieldOnBehalf(address contractAddress) external; function configureAutomaticYield() external; function configureAutomaticYieldOnBehalf(address contractAddress) external; function configureVoidYield() external; function configureVoidYieldOnBehalf(address contractAddress) external; function configureClaimableGas() external; function configureClaimableGasOnBehalf(address contractAddress) external; function configureVoidGas() external; function configureVoidGasOnBehalf(address contractAddress) external; function configureGovernor(address _governor) external; function configureGovernorOnBehalf(address _newGovernor, address contractAddress) external; // claim yield function claimYield( address contractAddress, address recipientOfYield, uint256 amount ) external returns (uint256); function claimAllYield( address contractAddress, address recipientOfYield ) external returns (uint256); // claim gas function claimAllGas( address contractAddress, address recipientOfGas ) external returns (uint256); function claimGasAtMinClaimRate( address contractAddress, address recipientOfGas, uint256 minClaimRateBips ) external returns (uint256); function claimMaxGas( address contractAddress, address recipientOfGas ) external returns (uint256); function claimGas( address contractAddress, address recipientOfGas, uint256 gasToClaim, uint256 gasSecondsToConsume ) external returns (uint256); // read functions function readClaimableYield(address contractAddress) external view returns (uint256); function readYieldConfiguration(address contractAddress) external view returns (uint8); function readGasParams( address contractAddress ) external view returns (uint256 etherSeconds, uint256 etherBalance, uint256 lastUpdated, GasMode); } interface IERC20Rebasing { // changes the yield mode of the caller and update the balance // to reflect the configuration function configure(YieldMode) external returns (uint256); // "claimable" yield mode accounts can call this this claim their yield // to another address function claim(address recipient, uint256 amount) external returns (uint256); // read the claimable amount for an account function getClaimableAmount(address account) external view returns (uint256); } interface IBlastPoints { function configurePointsOperator(address operator) external; }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; import { ManagerRole } from './roles/ManagerRole.sol'; import './helpers/AddressHelper.sol' as AddressHelper; import './Constants.sol' as Constants; import './DataStructures.sol' as DataStructures; /** * @title CallerGuard * @notice Base contract to control access from other contracts */ abstract contract CallerGuard is ManagerRole { /** * @dev Caller guard mode enumeration */ enum CallerGuardMode { ContractForbidden, ContractList, ContractAllowed } /** * @dev Caller guard mode value */ CallerGuardMode public callerGuardMode = CallerGuardMode.ContractForbidden; /** * @dev Registered contract list for "ContractList" mode */ address[] public listedCallerGuardContractList; /** * @dev Registered contract list indices for "ContractList" mode */ mapping(address /*account*/ => DataStructures.OptionalValue /*index*/) public listedCallerGuardContractIndexMap; /** * @notice Emitted when the caller guard mode is set * @param callerGuardMode The caller guard mode */ event SetCallerGuardMode(CallerGuardMode indexed callerGuardMode); /** * @notice Emitted when a registered contract for "ContractList" mode is added or removed * @param contractAddress The contract address * @param isListed The registered contract list inclusion flag */ event SetListedCallerGuardContract(address indexed contractAddress, bool indexed isListed); /** * @notice Emitted when the caller is not allowed to perform the intended action */ error CallerGuardError(address caller); /** * @dev Modifier to check if the caller is allowed to perform the intended action */ modifier checkCaller() { if (msg.sender != tx.origin) { bool condition = (callerGuardMode == CallerGuardMode.ContractAllowed || (callerGuardMode == CallerGuardMode.ContractList && isListedCallerGuardContract(msg.sender))); if (!condition) { revert CallerGuardError(msg.sender); } } _; } /** * @notice Sets the caller guard mode * @param _callerGuardMode The caller guard mode */ function setCallerGuardMode(CallerGuardMode _callerGuardMode) external onlyManager { callerGuardMode = _callerGuardMode; emit SetCallerGuardMode(_callerGuardMode); } /** * @notice Updates the list of registered contracts for the "ContractList" mode * @param _items The addresses and flags for the contracts */ function setListedCallerGuardContracts( DataStructures.AccountToFlag[] calldata _items ) external onlyManager { for (uint256 index; index < _items.length; index++) { DataStructures.AccountToFlag calldata item = _items[index]; if (item.flag) { AddressHelper.requireContract(item.account); } DataStructures.uniqueAddressListUpdate( listedCallerGuardContractList, listedCallerGuardContractIndexMap, item.account, item.flag, Constants.LIST_SIZE_LIMIT_DEFAULT ); emit SetListedCallerGuardContract(item.account, item.flag); } } /** * @notice Getter of the registered contract count * @return The registered contract count */ function listedCallerGuardContractCount() external view returns (uint256) { return listedCallerGuardContractList.length; } /** * @notice Getter of the complete list of registered contracts * @return The complete list of registered contracts */ function fullListedCallerGuardContractList() external view returns (address[] memory) { return listedCallerGuardContractList; } /** * @notice Getter of a listed contract flag * @param _account The contract address * @return The listed contract flag */ function isListedCallerGuardContract(address _account) public view returns (bool) { return listedCallerGuardContractIndexMap[_account].isSet; } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; /** * @dev The default token decimals value */ uint256 constant DECIMALS_DEFAULT = 18; /** * @dev The maximum uint256 value for swap amount limit settings */ uint256 constant INFINITY = type(uint256).max; /** * @dev The default limit of account list size */ uint256 constant LIST_SIZE_LIMIT_DEFAULT = 100; /** * @dev The limit of swap router list size */ uint256 constant LIST_SIZE_LIMIT_ROUTERS = 200; /** * @dev The factor for percentage settings. Example: 100 is 0.1% */ uint256 constant MILLIPERCENT_FACTOR = 100_000; /** * @dev The de facto standard address to denote the native token */ address constant NATIVE_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; /** * @notice Optional value structure * @dev Is used in mappings to allow zero values * @param isSet Value presence flag * @param value Numeric value */ struct OptionalValue { bool isSet; uint256 value; } /** * @notice Key-to-value structure * @dev Is used as an array parameter item to perform multiple key-value settings * @param key Numeric key * @param value Numeric value */ struct KeyToValue { uint256 key; uint256 value; } /** * @notice Key-to-value structure for address values * @dev Is used as an array parameter item to perform multiple key-value settings with address values * @param key Numeric key * @param value Address value */ struct KeyToAddressValue { uint256 key; address value; } /** * @notice Address-to-flag structure * @dev Is used as an array parameter item to perform multiple settings * @param account Account address * @param flag Flag value */ struct AccountToFlag { address account; bool flag; } /** * @notice Emitted when a list exceeds the size limit */ error ListSizeLimitError(); /** * @notice Sets or updates a value in a combined map (a mapping with a key list and key index mapping) * @param _map The mapping reference * @param _keyList The key list reference * @param _keyIndexMap The key list index mapping reference * @param _key The numeric key * @param _value The address value * @param _sizeLimit The map and list size limit * @return isNewKey True if the key was just added, otherwise false */ function combinedMapSet( mapping(uint256 => address) storage _map, uint256[] storage _keyList, mapping(uint256 => OptionalValue) storage _keyIndexMap, uint256 _key, address _value, uint256 _sizeLimit ) returns (bool isNewKey) { isNewKey = !_keyIndexMap[_key].isSet; if (isNewKey) { uniqueListAdd(_keyList, _keyIndexMap, _key, _sizeLimit); } _map[_key] = _value; } /** * @notice Removes a value from a combined map (a mapping with a key list and key index mapping) * @param _map The mapping reference * @param _keyList The key list reference * @param _keyIndexMap The key list index mapping reference * @param _key The numeric key * @return isChanged True if the combined map was changed, otherwise false */ function combinedMapRemove( mapping(uint256 => address) storage _map, uint256[] storage _keyList, mapping(uint256 => OptionalValue) storage _keyIndexMap, uint256 _key ) returns (bool isChanged) { isChanged = _keyIndexMap[_key].isSet; if (isChanged) { delete _map[_key]; uniqueListRemove(_keyList, _keyIndexMap, _key); } } /** * @notice Adds a value to a unique value list (a list with value index mapping) * @param _list The list reference * @param _indexMap The value index mapping reference * @param _value The numeric value * @param _sizeLimit The list size limit * @return isChanged True if the list was changed, otherwise false */ function uniqueListAdd( uint256[] storage _list, mapping(uint256 => OptionalValue) storage _indexMap, uint256 _value, uint256 _sizeLimit ) returns (bool isChanged) { isChanged = !_indexMap[_value].isSet; if (isChanged) { if (_list.length >= _sizeLimit) { revert ListSizeLimitError(); } _indexMap[_value] = OptionalValue(true, _list.length); _list.push(_value); } } /** * @notice Removes a value from a unique value list (a list with value index mapping) * @param _list The list reference * @param _indexMap The value index mapping reference * @param _value The numeric value * @return isChanged True if the list was changed, otherwise false */ function uniqueListRemove( uint256[] storage _list, mapping(uint256 => OptionalValue) storage _indexMap, uint256 _value ) returns (bool isChanged) { OptionalValue storage indexItem = _indexMap[_value]; isChanged = indexItem.isSet; if (isChanged) { uint256 itemIndex = indexItem.value; uint256 lastIndex = _list.length - 1; if (itemIndex != lastIndex) { uint256 lastValue = _list[lastIndex]; _list[itemIndex] = lastValue; _indexMap[lastValue].value = itemIndex; } _list.pop(); delete _indexMap[_value]; } } /** * @notice Adds a value to a unique address value list (a list with value index mapping) * @param _list The list reference * @param _indexMap The value index mapping reference * @param _value The address value * @param _sizeLimit The list size limit * @return isChanged True if the list was changed, otherwise false */ function uniqueAddressListAdd( address[] storage _list, mapping(address => OptionalValue) storage _indexMap, address _value, uint256 _sizeLimit ) returns (bool isChanged) { isChanged = !_indexMap[_value].isSet; if (isChanged) { if (_list.length >= _sizeLimit) { revert ListSizeLimitError(); } _indexMap[_value] = OptionalValue(true, _list.length); _list.push(_value); } } /** * @notice Removes a value from a unique address value list (a list with value index mapping) * @param _list The list reference * @param _indexMap The value index mapping reference * @param _value The address value * @return isChanged True if the list was changed, otherwise false */ function uniqueAddressListRemove( address[] storage _list, mapping(address => OptionalValue) storage _indexMap, address _value ) returns (bool isChanged) { OptionalValue storage indexItem = _indexMap[_value]; isChanged = indexItem.isSet; if (isChanged) { uint256 itemIndex = indexItem.value; uint256 lastIndex = _list.length - 1; if (itemIndex != lastIndex) { address lastValue = _list[lastIndex]; _list[itemIndex] = lastValue; _indexMap[lastValue].value = itemIndex; } _list.pop(); delete _indexMap[_value]; } } /** * @notice Adds or removes a value to/from a unique address value list (a list with value index mapping) * @dev The list size limit is checked on items adding only * @param _list The list reference * @param _indexMap The value index mapping reference * @param _value The address value * @param _flag The value inclusion flag * @param _sizeLimit The list size limit * @return isChanged True if the list was changed, otherwise false */ function uniqueAddressListUpdate( address[] storage _list, mapping(address => OptionalValue) storage _indexMap, address _value, bool _flag, uint256 _sizeLimit ) returns (bool isChanged) { return _flag ? uniqueAddressListAdd(_list, _indexMap, _value, _sizeLimit) : uniqueAddressListRemove(_list, _indexMap, _value); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; /** * @notice Emitted when an attempt to burn a token fails */ error TokenBurnError(); /** * @notice Emitted when an attempt to mint a token fails */ error TokenMintError(); /** * @notice Emitted when a zero address is specified where it is not allowed */ error ZeroAddressError();
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; /** * @notice Emitted when the account is not a contract * @param account The account address */ error NonContractAddressError(address account); /** * @notice Function to check if the account is a contract * @return The account contract status flag */ function isContract(address _account) view returns (bool) { return _account.code.length > 0; } /** * @notice Function to require an account to be a contract */ function requireContract(address _account) view { if (!isContract(_account)) { revert NonContractAddressError(_account); } } /** * @notice Function to require an account to be a contract or a zero address */ function requireContractOrZeroAddress(address _account) view { if (_account != address(0)) { requireContract(_account); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; /** * @notice Emitted when an approval action fails */ error SafeApproveError(); /** * @notice Emitted when a transfer action fails */ error SafeTransferError(); /** * @notice Emitted when a transferFrom action fails */ error SafeTransferFromError(); /** * @notice Emitted when a transfer of the native token fails */ error SafeTransferNativeError(); /** * @notice Safely approve the token to the account * @param _token The token address * @param _to The token approval recipient address * @param _value The token approval amount */ function safeApprove(address _token, address _to, uint256 _value) { // 0x095ea7b3 is the selector for "approve(address,uint256)" (bool success, bytes memory data) = _token.call( abi.encodeWithSelector(0x095ea7b3, _to, _value) ); bool condition = success && (data.length == 0 || abi.decode(data, (bool))); if (!condition) { revert SafeApproveError(); } } /** * @notice Safely transfer the token to the account * @param _token The token address * @param _to The token transfer recipient address * @param _value The token transfer amount */ function safeTransfer(address _token, address _to, uint256 _value) { // 0xa9059cbb is the selector for "transfer(address,uint256)" (bool success, bytes memory data) = _token.call( abi.encodeWithSelector(0xa9059cbb, _to, _value) ); bool condition = success && (data.length == 0 || abi.decode(data, (bool))); if (!condition) { revert SafeTransferError(); } } /** * @notice Safely transfer the token between the accounts * @param _token The token address * @param _from The token transfer source address * @param _to The token transfer recipient address * @param _value The token transfer amount */ function safeTransferFrom(address _token, address _from, address _to, uint256 _value) { // 0x23b872dd is the selector for "transferFrom(address,address,uint256)" (bool success, bytes memory data) = _token.call( abi.encodeWithSelector(0x23b872dd, _from, _to, _value) ); bool condition = success && (data.length == 0 || abi.decode(data, (bool))); if (!condition) { revert SafeTransferFromError(); } } /** * @notice Safely transfer the native token to the account * @param _to The native token transfer recipient address * @param _value The native token transfer amount */ function safeTransferNative(address _to, uint256 _value) { (bool success, ) = _to.call{ value: _value }(new bytes(0)); if (!success) { revert SafeTransferNativeError(); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; /** * @title ITokenBalance * @notice Token balance interface */ interface ITokenBalance { /** * @notice Getter of the token balance by the account * @param _account The account address * @return Token balance */ function balanceOf(address _account) external view returns (uint256); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; /** * @title ITokenBurn * @notice Token burning interface */ interface ITokenBurn { /** * @notice Burns tokens from the account, reducing the total supply * @param _from The token holder account address * @param _amount The number of tokens to burn * @return Token burning success status */ function burn(address _from, uint256 _amount) external returns (bool); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; /** * @title ITokenDecimals * @notice Token decimals interface */ interface ITokenDecimals { /** * @notice Getter of the token decimals * @return Token decimals */ function decimals() external pure returns (uint8); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; import { ERC20 } from 'solmate/src/tokens/ERC20.sol'; import { BurnerRole } from './roles/BurnerRole.sol'; import { MinterRole } from './roles/MinterRole.sol'; import { MultichainRouterRole } from './roles/MultichainRouterRole.sol'; import { Pausable } from './Pausable.sol'; import { ZeroAddressError } from './Errors.sol'; import './Constants.sol' as Constants; /** * @title MultichainTokenBase * @notice Base contract that implements the Multichain token logic */ abstract contract MultichainTokenBase is Pausable, ERC20, MultichainRouterRole { /** * @dev Anyswap ERC20 standard */ address public immutable underlying; bool private immutable useExplicitAccess; /** * @notice Emitted when token burning is not allowed to the caller */ error BurnAccessError(); /** * @notice Emitted when the token allowance is not sufficient for burning */ error BurnAllowanceError(); /** * @notice Emitted when token minting is not allowed to the caller */ error MintAccessError(); /** * @notice Initializes the MultichainTokenBase properties of descendant contracts * @param _name The ERC20 token name * @param _symbol The ERC20 token symbol * @param _decimals The ERC20 token decimals * @param _useExplicitAccess The mint and burn actions access flag */ constructor( string memory _name, string memory _symbol, uint8 _decimals, bool _useExplicitAccess ) ERC20(_name, _symbol, _decimals) { underlying = address(0); useExplicitAccess = _useExplicitAccess; } /** * @notice Updates the Multichain Router role status for the account * @param _account The account address * @param _value The Multichain Router role status flag */ function setMultichainRouter(address _account, bool _value) external onlyManager { _setMultichainRouter(_account, _value); } /** * @notice Mints tokens and assigns them to the account, increasing the total supply * @dev The mint function returns a boolean value, as required by the Anyswap ERC20 standard * @param _to The token receiver account address * @param _amount The number of tokens to mint * @return Token minting success status */ function mint(address _to, uint256 _amount) external whenNotPaused returns (bool) { bool condition = isMultichainRouter(msg.sender) || (useExplicitAccess && _isExplicitMinter()); if (!condition) { revert MintAccessError(); } _mint(_to, _amount); return true; } /** * @notice Burns tokens from the account, reducing the total supply * @dev The burn function returns a boolean value, as required by the Anyswap ERC20 standard * @param _from The token holder account address * @param _amount The number of tokens to burn * @return Token burning success status */ function burn(address _from, uint256 _amount) external whenNotPaused returns (bool) { bool condition = isMultichainRouter(msg.sender) || (useExplicitAccess && _isExplicitBurner()); if (!condition) { revert BurnAccessError(); } if (_from == address(0)) { revert ZeroAddressError(); } uint256 allowed = allowance[_from][msg.sender]; if (allowed < _amount) { revert BurnAllowanceError(); } if (allowed != Constants.INFINITY) { // Cannot overflow because the allowed value // is greater or equal to the amount unchecked { allowance[_from][msg.sender] = allowed - _amount; } } _burn(_from, _amount); return true; } /** * @dev Override to add explicit minter access */ function _isExplicitMinter() internal view virtual returns (bool) { return false; } /** * @dev Override to add explicit burner access */ function _isExplicitBurner() internal view virtual returns (bool) { return false; } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; import { Pausable as PausableBase } from '@openzeppelin/contracts/security/Pausable.sol'; import { ManagerRole } from './roles/ManagerRole.sol'; /** * @title Pausable * @notice Base contract that implements the emergency pause mechanism */ abstract contract Pausable is PausableBase, ManagerRole { /** * @notice Enter pause state */ function pause() external onlyManager whenNotPaused { _pause(); } /** * @notice Exit pause state */ function unpause() external onlyManager whenPaused { _unpause(); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; import { RoleBearers } from './RoleBearers.sol'; /** * @title AssetSpenderRole * @notice Base contract that implements the Asset Spender role */ abstract contract AssetSpenderRole is RoleBearers { bytes32 private constant ROLE_KEY = keccak256('AssetSpender'); /** * @notice Emitted when the Asset Spender role status for the account is updated * @param account The account address * @param value The Asset Spender role status flag */ event SetAssetSpender(address indexed account, bool indexed value); /** * @notice Emitted when the caller is not an Asset Spender role bearer */ error OnlyAssetSpenderError(); /** * @dev Modifier to check if the caller is an Asset Spender role bearer */ modifier onlyAssetSpender() { if (!isAssetSpender(msg.sender)) { revert OnlyAssetSpenderError(); } _; } /** * @notice Getter of the Asset Spender role bearer count * @return The Asset Spender role bearer count */ function assetSpenderCount() external view returns (uint256) { return _roleBearerCount(ROLE_KEY); } /** * @notice Getter of the complete list of the Asset Spender role bearers * @return The complete list of the Asset Spender role bearers */ function fullAssetSpenderList() external view returns (address[] memory) { return _fullRoleBearerList(ROLE_KEY); } /** * @notice Getter of the Asset Spender role bearer status * @param _account The account address */ function isAssetSpender(address _account) public view returns (bool) { return _isRoleBearer(ROLE_KEY, _account); } function _setAssetSpender(address _account, bool _value) internal { _setRoleBearer(ROLE_KEY, _account, _value); emit SetAssetSpender(_account, _value); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; import { RoleBearers } from './RoleBearers.sol'; /** * @title BurnerRole * @notice Base contract that implements the Burner role */ abstract contract BurnerRole is RoleBearers { bytes32 private constant ROLE_KEY = keccak256('Burner'); /** * @notice Emitted when the Burner role status for the account is updated * @param account The account address * @param value The Burner role status flag */ event SetBurner(address indexed account, bool indexed value); /** * @notice Getter of the Burner role bearer count * @return The Burner role bearer count */ function burnerCount() external view returns (uint256) { return _roleBearerCount(ROLE_KEY); } /** * @notice Getter of the complete list of the Burner role bearers * @return The complete list of the Burner role bearers */ function fullBurnerList() external view returns (address[] memory) { return _fullRoleBearerList(ROLE_KEY); } /** * @notice Getter of the Burner role bearer status * @param _account The account address */ function isBurner(address _account) public view returns (bool) { return _isRoleBearer(ROLE_KEY, _account); } function _setBurner(address _account, bool _value) internal { _setRoleBearer(ROLE_KEY, _account, _value); emit SetBurner(_account, _value); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; import { Ownable } from '@openzeppelin/contracts/access/Ownable.sol'; import { RoleBearers } from './RoleBearers.sol'; /** * @title ManagerRole * @notice Base contract that implements the Manager role. * The manager role is a high-permission role for core team members only. * Managers can set vaults and routers addresses, fees, cross-chain protocols, * and other parameters for Interchain (cross-chain) swaps and single-network swaps. * Please note, the manager role is unique for every contract, * hence different addresses may be assigned as managers for different contracts. */ abstract contract ManagerRole is Ownable, RoleBearers { bytes32 private constant ROLE_KEY = keccak256('Manager'); /** * @notice Emitted when the Manager role status for the account is updated * @param account The account address * @param value The Manager role status flag */ event SetManager(address indexed account, bool indexed value); /** * @notice Emitted when the Manager role status for the account is renounced * @param account The account address */ event RenounceManagerRole(address indexed account); /** * @notice Emitted when the caller is not a Manager role bearer */ error OnlyManagerError(); /** * @dev Modifier to check if the caller is a Manager role bearer */ modifier onlyManager() { if (!isManager(msg.sender)) { revert OnlyManagerError(); } _; } /** * @notice Updates the Manager role status for the account * @param _account The account address * @param _value The Manager role status flag */ function setManager(address _account, bool _value) public onlyOwner { _setRoleBearer(ROLE_KEY, _account, _value); emit SetManager(_account, _value); } /** * @notice Renounces the Manager role */ function renounceManagerRole() external onlyManager { _setRoleBearer(ROLE_KEY, msg.sender, false); emit RenounceManagerRole(msg.sender); } /** * @notice Getter of the Manager role bearer count * @return The Manager role bearer count */ function managerCount() external view returns (uint256) { return _roleBearerCount(ROLE_KEY); } /** * @notice Getter of the complete list of the Manager role bearers * @return The complete list of the Manager role bearers */ function fullManagerList() external view returns (address[] memory) { return _fullRoleBearerList(ROLE_KEY); } /** * @notice Getter of the Manager role bearer status * @param _account The account address */ function isManager(address _account) public view returns (bool) { return _isRoleBearer(ROLE_KEY, _account); } function _initRoles( address _owner, address[] memory _managers, bool _addOwnerToManagers ) internal { address ownerAddress = _owner == address(0) ? msg.sender : _owner; for (uint256 index; index < _managers.length; index++) { setManager(_managers[index], true); } if (_addOwnerToManagers && !isManager(ownerAddress)) { setManager(ownerAddress, true); } if (ownerAddress != msg.sender) { transferOwnership(ownerAddress); } } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; import { RoleBearers } from './RoleBearers.sol'; /** * @title MinterRole * @notice Base contract that implements the Minter role */ abstract contract MinterRole is RoleBearers { bytes32 private constant ROLE_KEY = keccak256('Minter'); /** * @notice Emitted when the Minter role status for the account is updated * @param account The account address * @param value The Minter role status flag */ event SetMinter(address indexed account, bool indexed value); /** * @notice Getter of the Minter role bearer count * @return The Minter role bearer count */ function minterCount() external view returns (uint256) { return _roleBearerCount(ROLE_KEY); } /** * @notice Getter of the complete list of the Minter role bearers * @return The complete list of the Minter role bearers */ function fullMinterList() external view returns (address[] memory) { return _fullRoleBearerList(ROLE_KEY); } /** * @notice Getter of the Minter role bearer status * @param _account The account address */ function isMinter(address _account) public view returns (bool) { return _isRoleBearer(ROLE_KEY, _account); } function _setMinter(address _account, bool _value) internal { _setRoleBearer(ROLE_KEY, _account, _value); emit SetMinter(_account, _value); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; import { RoleBearers } from './RoleBearers.sol'; /** * @title MultichainRouterRole * @notice Base contract that implements the Multichain Router role */ abstract contract MultichainRouterRole is RoleBearers { bytes32 private constant ROLE_KEY = keccak256('MultichainRouter'); /** * @notice Emitted when the Multichain Router role status for the account is updated * @param account The account address * @param value The Multichain Router role status flag */ event SetMultichainRouter(address indexed account, bool indexed value); /** * @notice Getter of the Multichain Router role bearer count * @return The Multichain Router role bearer count */ function multichainRouterCount() external view returns (uint256) { return _roleBearerCount(ROLE_KEY); } /** * @notice Getter of the complete list of the Multichain Router role bearers * @return The complete list of the Multichain Router role bearers */ function fullMultichainRouterList() external view returns (address[] memory) { return _fullRoleBearerList(ROLE_KEY); } /** * @notice Getter of the Multichain Router role bearer status * @param _account The account address */ function isMultichainRouter(address _account) public view returns (bool) { return _isRoleBearer(ROLE_KEY, _account); } function _setMultichainRouter(address _account, bool _value) internal { _setRoleBearer(ROLE_KEY, _account, _value); emit SetMultichainRouter(_account, _value); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; import '../Constants.sol' as Constants; import '../DataStructures.sol' as DataStructures; /** * @title RoleBearers * @notice Base contract that implements role-based access control * @dev A custom implementation providing full role bearer lists */ abstract contract RoleBearers { mapping(bytes32 /*roleKey*/ => address[] /*roleBearers*/) private roleBearerTable; mapping(bytes32 /*roleKey*/ => mapping(address /*account*/ => DataStructures.OptionalValue /*status*/)) private roleBearerIndexTable; function _setRoleBearer(bytes32 _roleKey, address _account, bool _value) internal { DataStructures.uniqueAddressListUpdate( roleBearerTable[_roleKey], roleBearerIndexTable[_roleKey], _account, _value, Constants.LIST_SIZE_LIMIT_DEFAULT ); } function _isRoleBearer(bytes32 _roleKey, address _account) internal view returns (bool) { return roleBearerIndexTable[_roleKey][_account].isSet; } function _roleBearerCount(bytes32 _roleKey) internal view returns (uint256) { return roleBearerTable[_roleKey].length; } function _fullRoleBearerList(bytes32 _roleKey) internal view returns (address[] memory) { return roleBearerTable[_roleKey]; } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; /** * @title SystemVersionId * @notice Base contract providing the system version identifier */ abstract contract SystemVersionId { /** * @dev The system version identifier */ uint256 public constant SYSTEM_VERSION_ID = uint256(keccak256('Initial')); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; import { ITokenBurn } from './interfaces/ITokenBurn.sol'; import { ITokenDecimals } from './interfaces/ITokenDecimals.sol'; import { AssetSpenderRole } from './roles/AssetSpenderRole.sol'; import { BalanceManagement } from './BalanceManagement.sol'; import { SystemVersionId } from './SystemVersionId.sol'; import { VaultBase } from './VaultBase.sol'; import { TokenBurnError } from './Errors.sol'; import './helpers/AddressHelper.sol' as AddressHelper; import './helpers/TransferHelper.sol' as TransferHelper; /** * @title Vault * @notice The vault contract */ contract Vault is SystemVersionId, VaultBase, AssetSpenderRole, BalanceManagement { /** * @dev The variable token contract address, can be a zero address */ address public variableToken; /** * @dev The state of variable token and balance actions */ bool public variableRepaymentEnabled; /** * @notice Emitted when the state of variable token and balance actions is updated * @param variableRepaymentEnabled The state of variable token and balance actions */ event SetVariableRepaymentEnabled(bool indexed variableRepaymentEnabled); /** * @notice Emitted when the variable token contract address is updated * @param variableToken The address of the variable token contract */ event SetVariableToken(address indexed variableToken); /** * @notice Emitted when the variable tokens are redeemed for the vault asset * @param caller The address of the vault asset receiver account * @param amount The amount of redeemed variable tokens */ event RedeemVariableToken(address indexed caller, uint256 amount); /** * @notice Emitted when the variable token decimals do not match the vault asset */ error TokenDecimalsError(); /** * @notice Emitted when a variable token or balance action is not allowed */ error VariableRepaymentNotEnabledError(); /** * @notice Emitted when setting the variable token is attempted while the token is already set */ error VariableTokenAlreadySetError(); /** * @notice Emitted when a variable token action is attempted while the token address is not set */ error VariableTokenNotSetError(); /** * @notice Deploys the Vault contract * @param _asset The vault asset address * @param _name The ERC20 token name * @param _symbol The ERC20 token symbol * @param _assetSpenders The addresses of initial asset spenders * @param _depositAllowed The initial state of deposit availability * @param _variableRepaymentEnabled The initial state of variable token and balance actions * @param _owner The address of the initial owner of the contract * @param _managers The addresses of initial managers of the contract * @param _addOwnerToManagers The flag to optionally add the owner to the list of managers */ constructor( address _asset, string memory _name, string memory _symbol, address[] memory _assetSpenders, bool _depositAllowed, bool _variableRepaymentEnabled, address _owner, address[] memory _managers, bool _addOwnerToManagers ) VaultBase(_asset, _name, _symbol, _depositAllowed) { for (uint256 index; index < _assetSpenders.length; index++) { _setAssetSpender(_assetSpenders[index], true); } _setVariableRepaymentEnabled(_variableRepaymentEnabled); _initRoles(_owner, _managers, _addOwnerToManagers); } /** * @notice Updates the Asset Spender role status for the account * @param _account The account address * @param _value The Asset Spender role status flag */ function setAssetSpender(address _account, bool _value) external onlyManager { _setAssetSpender(_account, _value); } /** * @notice Sets the variable token contract address * @dev Setting the address value is possible only once * @param _variableToken The address of the variable token contract */ function setVariableToken(address _variableToken) external onlyManager { if (variableToken != address(0)) { revert VariableTokenAlreadySetError(); } AddressHelper.requireContract(_variableToken); if (ITokenDecimals(_variableToken).decimals() != decimals) { revert TokenDecimalsError(); } variableToken = _variableToken; emit SetVariableToken(_variableToken); } /** * @notice Updates the state of variable token and balance actions * @param _variableRepaymentEnabled The state of variable token and balance actions */ function setVariableRepaymentEnabled(bool _variableRepaymentEnabled) external onlyManager { _setVariableRepaymentEnabled(_variableRepaymentEnabled); } /** * @notice Requests the vault asset tokens * @param _amount The amount of the vault asset tokens * @param _to The address of the vault asset tokens receiver * @param _forVariableBalance True if the request is made for a variable balance repayment, otherwise false * @return assetAddress The address of the vault asset token */ function requestAsset( uint256 _amount, address _to, bool _forVariableBalance ) external whenNotPaused onlyAssetSpender returns (address assetAddress) { if (_forVariableBalance && !variableRepaymentEnabled) { revert VariableRepaymentNotEnabledError(); } TransferHelper.safeTransfer(asset, _to, _amount); return asset; } /** * @notice Redeems variable tokens for the vault asset * @param _amount The number of variable tokens to redeem */ function redeemVariableToken(uint256 _amount) external whenNotPaused nonReentrant checkCaller { checkVariableTokenState(); bool burnSuccess = ITokenBurn(variableToken).burn(msg.sender, _amount); if (!burnSuccess) { revert TokenBurnError(); } emit RedeemVariableToken(msg.sender, _amount); TransferHelper.safeTransfer(asset, msg.sender, _amount); } /** * @notice Checks the status of the variable token and balance actions and the variable token address * @dev Throws an error if variable token actions are not allowed * @return The address of the variable token */ function checkVariableTokenState() public view returns (address) { if (!variableRepaymentEnabled) { revert VariableRepaymentNotEnabledError(); } if (variableToken == address(0)) { revert VariableTokenNotSetError(); } return variableToken; } /** * @notice Getter of the reserved token flag * @dev Returns true if the provided token address is the address of the vault asset * @param _tokenAddress The address of the token * @return The reserved token flag */ function isReservedToken(address _tokenAddress) public view override returns (bool) { return _tokenAddress == asset; } function _setVariableRepaymentEnabled(bool _variableRepaymentEnabled) private { variableRepaymentEnabled = _variableRepaymentEnabled; emit SetVariableRepaymentEnabled(_variableRepaymentEnabled); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.19; import { ERC20 } from 'solmate/src/tokens/ERC20.sol'; import { ReentrancyGuard } from '@openzeppelin/contracts/security/ReentrancyGuard.sol'; import { ITokenDecimals } from './interfaces/ITokenDecimals.sol'; import { CallerGuard } from './CallerGuard.sol'; import { MultichainTokenBase } from './MultichainTokenBase.sol'; import './helpers/TransferHelper.sol' as TransferHelper; import './Constants.sol' as Constants; /** * @title VaultBase * @notice Base contract that implements the vault logic */ abstract contract VaultBase is MultichainTokenBase, ReentrancyGuard, CallerGuard { /** * @dev The vault asset address */ address public immutable asset; /** * @dev The total vault token supply limit */ uint256 public totalSupplyLimit; /** * @notice Emitted when the total supply limit is set * @param limit The total supply limit value */ event SetTotalSupplyLimit(uint256 limit); /** * @notice Emitted when a deposit action is performed * @param caller The address of the depositor account * @param assetAmount The amount of the deposited asset */ event Deposit(address indexed caller, uint256 assetAmount); /** * @notice Emitted when a withdrawal action is performed * @param caller The address of the withdrawal account * @param assetAmount The amount of the withdrawn asset */ event Withdraw(address indexed caller, uint256 assetAmount); /** * @notice Emitted when the total supply limit is exceeded */ error TotalSupplyLimitError(); /** * @notice Emitted when a deposit is attempted with a zero amount */ error ZeroAmountError(); /** * @notice Initializes the VaultBase properties of descendant contracts * @param _asset The vault asset address * @param _name The ERC20 token name * @param _symbol The ERC20 token symbol * @param _depositAllowed The initial state of deposit availability */ constructor( address _asset, string memory _name, string memory _symbol, bool _depositAllowed ) MultichainTokenBase(_name, _symbol, ITokenDecimals(_asset).decimals(), false) { asset = _asset; _setTotalSupplyLimit(_depositAllowed ? Constants.INFINITY : 0); } /** * @notice Sets the total supply * @dev Decimals = vault token decimals = asset decimals * @param _limit The total supply limit value */ function setTotalSupplyLimit(uint256 _limit) external onlyManager { _setTotalSupplyLimit(_limit); } /** * @notice Performs a deposit action. User deposits usdc/usdt for iusdc/iusdt used in Stablecoin Farm. * @param _assetAmount The amount of the deposited asset */ function deposit(uint256 _assetAmount) external virtual whenNotPaused nonReentrant checkCaller { if (_assetAmount == 0) { revert ZeroAmountError(); } if (totalSupply + _assetAmount > totalSupplyLimit) { revert TotalSupplyLimitError(); } // Need to transfer before minting or ERC777s could reenter TransferHelper.safeTransferFrom(asset, msg.sender, address(this), _assetAmount); _mint(msg.sender, _assetAmount); emit Deposit(msg.sender, _assetAmount); } /** * @notice Performs a withdrawal action * @param _assetAmount The amount of the withdrawn asset */ function withdraw( uint256 _assetAmount ) external virtual whenNotPaused nonReentrant checkCaller { _burn(msg.sender, _assetAmount); emit Withdraw(msg.sender, _assetAmount); TransferHelper.safeTransfer(asset, msg.sender, _assetAmount); } function _setTotalSupplyLimit(uint256 _limit) private { totalSupplyLimit = _limit; emit SetTotalSupplyLimit(_limit); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_asset","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address[]","name":"_assetSpenders","type":"address[]"},{"internalType":"bool","name":"_depositAllowed","type":"bool"},{"internalType":"bool","name":"_variableRepaymentEnabled","type":"bool"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address[]","name":"_managers","type":"address[]"},{"internalType":"bool","name":"_addOwnerToManagers","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BurnAccessError","type":"error"},{"inputs":[],"name":"BurnAllowanceError","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"CallerGuardError","type":"error"},{"inputs":[],"name":"ListSizeLimitError","type":"error"},{"inputs":[],"name":"MintAccessError","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NonContractAddressError","type":"error"},{"inputs":[],"name":"OnlyAssetSpenderError","type":"error"},{"inputs":[],"name":"OnlyManagerError","type":"error"},{"inputs":[],"name":"ReservedTokenError","type":"error"},{"inputs":[],"name":"SafeTransferError","type":"error"},{"inputs":[],"name":"SafeTransferFromError","type":"error"},{"inputs":[],"name":"SafeTransferNativeError","type":"error"},{"inputs":[],"name":"TokenBurnError","type":"error"},{"inputs":[],"name":"TokenDecimalsError","type":"error"},{"inputs":[],"name":"TotalSupplyLimitError","type":"error"},{"inputs":[],"name":"VariableRepaymentNotEnabledError","type":"error"},{"inputs":[],"name":"VariableTokenAlreadySetError","type":"error"},{"inputs":[],"name":"VariableTokenNotSetError","type":"error"},{"inputs":[],"name":"ZeroAddressError","type":"error"},{"inputs":[],"name":"ZeroAmountError","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"assetAmount","type":"uint256"}],"name":"Deposit","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":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RedeemVariableToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"RenounceManagerRole","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAssetSpender","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum CallerGuard.CallerGuardMode","name":"callerGuardMode","type":"uint8"}],"name":"SetCallerGuardMode","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"bool","name":"isListed","type":"bool"}],"name":"SetListedCallerGuardContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetMultichainRouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"SetTotalSupplyLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"variableRepaymentEnabled","type":"bool"}],"name":"SetVariableRepaymentEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"variableToken","type":"address"}],"name":"SetVariableToken","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":"amount","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":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"assetAmount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BLAST","outputs":[{"internalType":"contract IBlast","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLAST_POINTS","outputs":[{"internalType":"contract IBlastPoints","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM_VERSION_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDB","outputs":[{"internalType":"contract IERC20Rebasing","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IERC20Rebasing","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetSpenderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Rebasing","name":"_token","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"blastClaimTokenYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blastConfigureClaimableAssets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governor","type":"address"}],"name":"blastConfigureGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pointsOperator","type":"address"}],"name":"blastConfigurePointsOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20Rebasing","name":"_token","type":"address"},{"internalType":"enum YieldMode","name":"_yieldMode","type":"uint8"}],"name":"blastConfigureTokenYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"callerGuardMode","outputs":[{"internalType":"enum CallerGuard.CallerGuardMode","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkVariableTokenState","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"cleanup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assetAmount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fullAssetSpenderList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fullListedCallerGuardContractList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fullManagerList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fullMultichainRouterList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isAssetSpender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isListedCallerGuardContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isMultichainRouter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"isReservedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listedCallerGuardContractCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"listedCallerGuardContractIndexMap","outputs":[{"internalType":"bool","name":"isSet","type":"bool"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"listedCallerGuardContractList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managerCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"multichainRouterCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"redeemVariableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceManagerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"bool","name":"_forVariableBalance","type":"bool"}],"name":"requestAsset","outputs":[{"internalType":"address","name":"assetAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setAssetSpender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum CallerGuard.CallerGuardMode","name":"_callerGuardMode","type":"uint8"}],"name":"setCallerGuardMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"internalType":"struct AccountToFlag[]","name":"_items","type":"tuple[]"}],"name":"setListedCallerGuardContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setMultichainRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setTotalSupplyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_variableRepaymentEnabled","type":"bool"}],"name":"setVariableRepaymentEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_variableToken","type":"address"}],"name":"setVariableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"tokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlying","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"variableRepaymentEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"variableToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assetAmount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
610140604052600a805460ff191690553480156200001c57600080fd5b50604051620042e1380380620042e18339810160408190526200003f9162000c36565b888888888888888888888888878282856001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200008d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000b3919062000d4e565b6000805460ff19168155838383620000cb33620001d6565b6003620000d9848262000e09565b506004620000e8838262000e09565b5060ff81166080524660a052620000fe6200022f565b60c0525050600060e0525015156101005250506001600955506001600160a01b03841661012052620001408162000137576000620002cb565b600019620002cb565b5050505060005b86518110156200019557620001808782815181106200016a576200016a62000ed5565b602002602001015160016200030660201b60201c565b806200018c8162000f01565b91505062000147565b50620001a1846200036f565b620001ae838383620003b8565b505050505050505050620001c76200047260201b60201c565b5050505050505050506200100a565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600360405162000263919062000f1d565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b600d8190556040518181527f95e8c9f3b9477918d3e5407ba96fac8e2084722c9562942bac414734bdf8f8049060200160405180910390a150565b620003337fab6730ecea49587e6c50637868078921bc389a6c228c95e1c7259ae5a61c21748383620006b1565b604051811515906001600160a01b038416907fc6b049f4dc9561b397b0cef913ea5f18165b682b193be62c0bbbf9ca8763aeba90600090a35050565b600e805460ff60a01b1916600160a01b831515908102919091179091556040517fdf888ec24e9081be857eb58887c4c9e546edf94ee7dbc643c07f69dd32c0d13590600090a250565b60006001600160a01b03841615620003d15783620003d3565b335b905060005b8351811015620004265762000411848281518110620003fb57620003fb62000ed5565b60200260200101516001620006da60201b60201c565b806200041d8162000f01565b915050620003d8565b508180156200043d57506200043b816200074d565b155b15620004505762000450816001620006da565b6001600160a01b03811633146200046c576200046c816200078f565b50505050565b6001303b1580620004885750620004886200080e565b620004da5760405162461bcd60e51b815260206004820152601960248201527f426c617374436f6e6669673a20556e617574686f72697a65640000000000000060448201526064015b60405180910390fd5b7343000000000000000000000000000000000000026001600160a01b031663f098767a6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200052a57600080fd5b505af11580156200053f573d6000803e3d6000fd5b505050507343000000000000000000000000000000000000026001600160a01b0316634e606c476040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200059357600080fd5b505af1158015620005a8573d6000803e3d6000fd5b5050604051631a33757d60e01b81527343000000000000000000000000000000000000039250631a33757d9150620005e69060029060040162000f9b565b6020604051808303816000875af115801562000606573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200062c919062000fc4565b50604051631a33757d60e01b815273430000000000000000000000000000000000000490631a33757d90620006679060029060040162000f9b565b6020604051808303816000875af115801562000687573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006ad919062000fc4565b5050565b600083815260016020908152604080832060029092529091206200046c91908484606462000820565b620006e462000853565b620007117f6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6f8383620006b1565b604051811515906001600160a01b038416907fbe9474bb3e78da7e315cdffa5cfa30b767fcc95bbf44a6197da60228eea1028690600090a35050565b6001600160a01b03811660009081527f260b29b219d450563ddb0e5ca806bdadb1e125f7e8c506de0443797dd7122728602052604081205460ff165b92915050565b6200079962000853565b6001600160a01b038116620008005760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620004d1565b6200080b81620001d6565b50565b60006200081b336200074d565b905090565b6000826200083b5762000835868686620008b7565b62000849565b6200084986868685620009ec565b9695505050505050565b6000546001600160a01b03610100909104163314620008b55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620004d1565b565b6001600160a01b0381166000908152602083905260409020805460ff16908115620009e45760018082015486549091600091620008f5919062000fde565b90508082146200098957600087828154811062000916576200091662000ed5565b9060005260206000200160009054906101000a90046001600160a01b03169050808884815481106200094c576200094c62000ed5565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905592909116815290879052604090206001018290555b868054806200099c576200099c62000ff4565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038716825287905260408120805460ff191681556001015550505b509392505050565b6001600160a01b03821660009081526020849052604090205460ff1615801562000a99578454821162000a325760405163b1655e3360e01b815260040160405180910390fd5b6040805180820182526001808252875460208084019182526001600160a01b03881660008181528a83529586209451855460ff1916901515178555915193830193909355885491820189558884529190922090910180546001600160a01b03191690911790555b949350505050565b80516001600160a01b038116811462000ab957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000aff5762000aff62000abe565b604052919050565b600082601f83011262000b1957600080fd5b81516001600160401b0381111562000b355762000b3562000abe565b602062000b4b601f8301601f1916820162000ad4565b828152858284870101111562000b6057600080fd5b60005b8381101562000b8057858101830151828201840152820162000b63565b506000928101909101919091529392505050565b600082601f83011262000ba657600080fd5b815160206001600160401b0382111562000bc45762000bc462000abe565b8160051b62000bd582820162000ad4565b928352848101820192828101908785111562000bf057600080fd5b83870192505b8483101562000c1a5762000c0a8362000aa1565b8252918301919083019062000bf6565b979650505050505050565b8051801515811462000ab957600080fd5b60008060008060008060008060006101208a8c03121562000c5657600080fd5b62000c618a62000aa1565b60208b01519099506001600160401b038082111562000c7f57600080fd5b62000c8d8d838e0162000b07565b995060408c015191508082111562000ca457600080fd5b62000cb28d838e0162000b07565b985060608c015191508082111562000cc957600080fd5b62000cd78d838e0162000b94565b975062000ce760808d0162000c25565b965062000cf760a08d0162000c25565b955062000d0760c08d0162000aa1565b945060e08c015191508082111562000d1e57600080fd5b5062000d2d8c828d0162000b94565b92505062000d3f6101008b0162000c25565b90509295985092959850929598565b60006020828403121562000d6157600080fd5b815160ff8116811462000d7357600080fd5b9392505050565b600181811c9082168062000d8f57607f821691505b60208210810362000db057634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000e0457600081815260208120601f850160051c8101602086101562000ddf5750805b601f850160051c820191505b8181101562000e005782815560010162000deb565b5050505b505050565b81516001600160401b0381111562000e255762000e2562000abe565b62000e3d8162000e36845462000d7a565b8462000db6565b602080601f83116001811462000e75576000841562000e5c5750858301515b600019600386901b1c1916600185901b17855562000e00565b600085815260208120601f198616915b8281101562000ea65788860151825594840194600190910190840162000e85565b508582101562000ec55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820162000f165762000f1662000eeb565b5060010190565b600080835462000f2d8162000d7a565b6001828116801562000f48576001811462000f5e5762000f8f565b60ff198416875282151583028701945062000f8f565b8760005260208060002060005b8581101562000f865781548a82015290840190820162000f6b565b50505082870194505b50929695505050505050565b602081016003831062000fbe57634e487b7160e01b600052602160045260246000fd5b91905290565b60006020828403121562000fd757600080fd5b5051919050565b8181038181111562000789576200078962000eeb565b634e487b7160e01b600052603160045260246000fd5b60805160a05160c05160e0516101005161012051613248620010996000396000818161066e015281816106ce0152818161105b015281816110bb01528181611398015281816114e50152818161150e0152611b4401526000818161141e01526117e0015260006107970152600061116b0152600061113b0152600081816105c8015261162f01526132486000f3fe608060405234801561001057600080fd5b50600436106103f15760003560e01c80636b56a69111610215578063ad53040911610125578063dd62ed3e116100b8578063f2fde38b11610087578063f2fde38b146109c4578063f3ae2415146109d7578063f977350c146109ea578063fe14e8c3146109fd578063fe8fc8d414610a1057600080fd5b8063dd62ed3e1461096b578063e3725b1514610996578063eedc966a1461099e578063f00ecca3146109b157600080fd5b8063c116a3cb116100f4578063c116a3cb1461092a578063c2c518e11461093d578063d505accf14610945578063d883d8b11461095857600080fd5b8063ad530409146108ed578063ad5c464814610900578063b6b55f251461090e578063bac21a221461092157600080fd5b80638da5cb5b116101a85780639c90dfa1116101775780639c90dfa11461086e5780639dc29fac146108ac578063a5e90eee146108bf578063a8c9a27a146108d2578063a9059cbb146108da57600080fd5b80638da5cb5b1461082f57806395d89b4114610845578063964236941461084d57806397d757761461086057600080fd5b80637b25b4d4116101e45780637b25b4d4146107e15780637c3d6de1146107f45780637ecebe00146108075780638456cb591461082757600080fd5b80636b56a6911461078a5780636f307dc31461079257806370a08231146107b9578063715018a6146107d957600080fd5b8063313ce5671161031057806340c10f19116102a35780634ba3bf7e116102725780634ba3bf7e1461072c5780635c05468b1461073f5780635c56ca35146107525780635c975abb14610765578063607ab5e51461077057600080fd5b806340c10f19146106ab578063440d7248146106be5780634b15b2a9146106fe5780634b8f90251461071157600080fd5b806338405ec3116102df57806338405ec31461065657806338d52e0f146106695780633ef43212146106905780633f4ba83a146106a357600080fd5b8063313ce567146105c357806331a0edec146105fc578063341328c51461060a5780633644e5151461064e57600080fd5b806318160ddd116103885780632a3ffb8a116103575780632a3ffb8a1461053f5780632c966a341461057d5780632e1a7d4d1461059d57806330eb1278146105b057600080fd5b806318160ddd146104fd5780631b5c1d0e1461050657806323b872dd1461051957806327b257491461052c57600080fd5b80630f937410116103c45780630f93741014610481578063103b7397146104895780631581c5bf146104c757806317daf0b4146104d157600080fd5b806304e535e2146103f657806306fdde0314610414578063093f0e2714610429578063095ea7b31461045e575b600080fd5b6103fe610a24565b60405161040b9190612bc7565b60405180910390f35b61041c610a86565b60405161040b9190612c38565b6104507f22ad9585a395edc8067b50da4778cafbb7fa2c4bbd7619fad6aeba403857fd7481565b60405190815260200161040b565b61047161046c366004612c80565b610b14565b604051901515815260200161040b565b6103fe610b81565b6000805160206131b383398151915260005260016020527f3c2285c553468ca8f30447b24bb463c127f1b840e23a0cafa23caa79d906669a54610450565b6104cf610b9f565b005b6104716104df366004612cac565b6001600160a01b03166000908152600c602052604090205460ff1690565b61045060055481565b6104cf610514366004612cd0565b610d6c565b610471610527366004612ce9565b610d9e565b6104cf61053a366004612cac565b610e7e565b6000805160206131f383398151915260005260016020527f5a35d0a0fb7e3bcb482aad5b9886840a8073f28d39a0181c254a9e207a44109454610450565b610585610f1f565b6040516001600160a01b03909116815260200161040b565b6104cf6105ab366004612cd0565b610f85565b6104cf6105be366004612c80565b61108b565b6105ea7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff909116815260200161040b565b6105856003604360981b0181565b610637610618366004612cac565b600c602052600090815260409020805460019091015460ff9091169082565b60408051921515835260208301919091520161040b565b610450611137565b6104cf610664366004612ce9565b61118d565b6105857f000000000000000000000000000000000000000000000000000000000000000081565b6104cf61069e366004612cd0565b61122d565b6104cf6113c9565b6104716106b9366004612c80565b611401565b6104716106cc366004612cac565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b61058561070c366004612d38565b61147b565b610585732536fe9ab3f511540f2f9e2ec2a805005c3dd80081565b6104cf61073a366004612d7a565b611534565b61047161074d366004612cac565b611564565b610471610760366004612cac565b61157e565b60005460ff16610471565b600a5461077d9060ff1681565b60405161040b9190612de7565b600b54610450565b6105857f000000000000000000000000000000000000000000000000000000000000000081565b6104506107c7366004612cac565b60066020526000908152604090205481565b6104cf611598565b6105856107ef366004612cd0565b6115aa565b6104cf610802366004612cac565b6115d4565b610450610815366004612cac565b60086020526000908152604090205481565b6104cf61171e565b60005461010090046001600160a01b0316610585565b61041c611754565b6104cf61085b366004612cac565b611761565b6105856002604360981b0181565b60008051602061319383398151915260005260016020527fb6368b31e79ffb73a14a00fbd9c0dbbe43a3a26df7f98e18d14334693e18dfce54610450565b6104716108ba366004612c80565b6117c3565b6104cf6108cd366004612d7a565b6118dc565b6103fe611939565b6104716108e8366004612c80565b611952565b6104cf6108fb366004612e07565b6119b8565b6105856004604360981b0181565b6104cf61091c366004612cd0565b611a5c565b610450600d5481565b6104cf610938366004612d7a565b611bb4565b6104cf611be4565b6104cf610953366004612e44565b611c51565b6104cf610966366004612eb5565b611e95565b610450610979366004612ed2565b600760209081526000928352604080842090915290825290205481565b6103fe611ec4565b6104506109ac366004612cac565b611edd565b600e54610585906001600160a01b031681565b6104cf6109d2366004612cac565b611f73565b6104716109e5366004612cac565b611fe9565b6104cf6109f8366004612f00565b612003565b6104cf610a0b366004612f1d565b61208b565b600e5461047190600160a01b900460ff1681565b6060600b805480602002602001604051908101604052809291908181526020018280548015610a7c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a5e575b5050505050905090565b60038054610a9390612f92565b80601f0160208091040260200160405190810160405280929190818152602001828054610abf90612f92565b8015610b0c5780601f10610ae157610100808354040283529160200191610b0c565b820191906000526020600020905b815481529060010190602001808311610aef57829003601f168201915b505050505081565b3360008181526007602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610b6f9086815260200190565b60405180910390a35060015b92915050565b6060610b9a60008051602061319383398151915261219c565b905090565b6001303b1580610bb25750610bb2612208565b610bd75760405162461bcd60e51b8152600401610bce90612fcc565b60405180910390fd5b6002604360981b016001600160a01b031663f098767a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c1957600080fd5b505af1158015610c2d573d6000803e3d6000fd5b505050506002604360981b016001600160a01b0316634e606c476040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c7357600080fd5b505af1158015610c87573d6000803e3d6000fd5b5050604051631a33757d60e01b81526003604360981b019250631a33757d9150610cb690600290600401612de7565b6020604051808303816000875af1158015610cd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf99190613003565b50604051631a33757d60e01b81526004604360981b0190631a33757d90610d2590600290600401612de7565b6020604051808303816000875af1158015610d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d689190613003565b5050565b610d7533611fe9565b610d9257604051637c3ea23f60e01b815260040160405180910390fd5b610d9b81612213565b50565b6001600160a01b03831660009081526007602090815260408083203384529091528120546000198114610dfa57610dd58382613032565b6001600160a01b03861660009081526007602090815260408083203384529091529020555b6001600160a01b03851660009081526006602052604081208054859290610e22908490613032565b90915550506001600160a01b03808516600081815260066020526040908190208054870190555190918716906000805160206131d383398151915290610e6b9087815260200190565b60405180910390a3506001949350505050565b6001303b1580610e915750610e91612208565b610ead5760405162461bcd60e51b8152600401610bce90612fcc565b6040516336b91f2b60e01b81526001600160a01b0383166004820152732536fe9ab3f511540f2f9e2ec2a805005c3dd800906336b91f2b906024015b600060405180830381600087803b158015610f0357600080fd5b505af1158015610f17573d6000803e3d6000fd5b505050505050565b600e54600090600160a01b900460ff16610f4c57604051634dd32fa760e11b815260040160405180910390fd5b600e546001600160a01b0316610f7557604051630d51877360e21b815260040160405180910390fd5b50600e546001600160a01b031690565b610f8d61224e565b610f95612294565b3332146110175760006002600a5460ff166002811115610fb757610fb7612db3565b1480610ff357506001600a5460ff166002811115610fd757610fd7612db3565b148015610ff35750336000908152600c602052604090205460ff165b90508061101557604051630fa0970d60e11b8152336004820152602401610bce565b505b61102133826122ed565b60405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a26110817f00000000000000000000000000000000000000000000000000000000000000003383612357565b610d9b6001600955565b61109433611fe9565b6110b157604051637c3ea23f60e01b815260040160405180910390fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116908316036110fd57604051634477699960e11b815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b0383160161112c57610d683382612441565b610d68823383612357565b60007f0000000000000000000000000000000000000000000000000000000000000000461461116857610b9a6124cf565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000611197612208565b6111b35760405162461bcd60e51b8152600401610bce90612fcc565b604051635569f64b60e11b81526001600160a01b0384811660048301526024820184905285169063aad3ec96906044016020604051808303816000875af1158015611202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112269190613003565b5050505050565b61123561224e565b61123d612294565b3332146112bf5760006002600a5460ff16600281111561125f5761125f612db3565b148061129b57506001600a5460ff16600281111561127f5761127f612db3565b14801561129b5750336000908152600c602052604090205460ff165b9050806112bd57604051630fa0970d60e11b8152336004820152602401610bce565b505b6112c7610f1f565b50600e54604051632770a7eb60e21b8152336004820152602481018390526000916001600160a01b031690639dc29fac906044016020604051808303816000875af115801561131a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133e9190613045565b90508061135e5760405163a294042360e01b815260040160405180910390fd5b60405182815233907f16aab25bf023c1724fe661e47886a1083e99fb9533f0947445acb8974a6778c89060200160405180910390a26113be7f00000000000000000000000000000000000000000000000000000000000000003384612357565b50610d9b6001600955565b6113d233611fe9565b6113ef57604051637c3ea23f60e01b815260040160405180910390fd5b6113f7612569565b6113ff6125b2565b565b600061140b61224e565b600061141633611564565b8061144757507f00000000000000000000000000000000000000000000000000000000000000008015611447575060005b905080611467576040516371d2156960e01b815260040160405180910390fd5b6114718484612604565b5060019392505050565b600061148561224e565b61148e3361157e565b6114ab5760405163085c44cb60e31b815260040160405180910390fd5b8180156114c25750600e54600160a01b900460ff16155b156114e057604051634dd32fa760e11b815260040160405180910390fd5b61150b7f00000000000000000000000000000000000000000000000000000000000000008486612357565b507f00000000000000000000000000000000000000000000000000000000000000009392505050565b61153d33611fe9565b61155a57604051637c3ea23f60e01b815260040160405180910390fd5b610d688282612656565b6000610b7b6000805160206131f3833981519152836126ab565b6000610b7b600080516020613193833981519152836126ab565b6115a06126d6565b6113ff6000612736565b600b81815481106115ba57600080fd5b6000918252602090912001546001600160a01b0316905081565b6115dd33611fe9565b6115fa57604051637c3ea23f60e01b815260040160405180910390fd5b600e546001600160a01b0316156116245760405163b347c0ad60e01b815260040160405180910390fd5b61162d8161278f565b7f000000000000000000000000000000000000000000000000000000000000000060ff16816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561168f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b39190613062565b60ff16146116d457604051637265cffd60e11b815260040160405180910390fd5b600e80546001600160a01b0319166001600160a01b0383169081179091556040517fb366d6f570d256c768970b0082f8d0cea95a76afa28b518f9e6eb033d84e656a90600090a250565b61172733611fe9565b61174457604051637c3ea23f60e01b815260040160405180910390fd5b61174c61224e565b6113ff6127c2565b60048054610a9390612f92565b6001303b15806117745750611774612208565b6117905760405162461bcd60e51b8152600401610bce90612fcc565b604051631d70c8d360e31b81526001600160a01b03831660048201526002604360981b019063eb86469890602401610ee9565b60006117cd61224e565b60006117d833611564565b8061180957507f00000000000000000000000000000000000000000000000000000000000000008015611809575060005b905080611829576040516305fb1f3f60e51b815260040160405180910390fd5b6001600160a01b03841661185057604051633efa09af60e01b815260040160405180910390fd5b6001600160a01b038416600090815260076020908152604080832033845290915290205483811015611895576040516308688c9b60e01b815260040160405180910390fd5b60001981146118c7576001600160a01b0385166000908152600760209081526040808320338452909152902084820390555b6118d185856122ed565b506001949350505050565b6118e46126d6565b6118fd6000805160206131b383398151915283836127ff565b604051811515906001600160a01b038416907fbe9474bb3e78da7e315cdffa5cfa30b767fcc95bbf44a6197da60228eea1028690600090a35050565b6060610b9a6000805160206131f383398151915261219c565b33600090815260066020526040812080548391908390611973908490613032565b90915550506001600160a01b038316600081815260066020526040908190208054850190555133906000805160206131d383398151915290610b6f9086815260200190565b6001303b15806119cb57506119cb612208565b6119e75760405162461bcd60e51b8152600401610bce90612fcc565b604051631a33757d60e01b81526001600160a01b03841690631a33757d90611a13908590600401612de7565b6020604051808303816000875af1158015611a32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a569190613003565b50505050565b611a6461224e565b611a6c612294565b333214611aee5760006002600a5460ff166002811115611a8e57611a8e612db3565b1480611aca57506001600a5460ff166002811115611aae57611aae612db3565b148015611aca5750336000908152600c602052604090205460ff165b905080611aec57604051630fa0970d60e11b8152336004820152602401610bce565b505b80600003611b0f57604051636e0ccc0760e01b815260040160405180910390fd5b600d5481600554611b20919061307f565b1115611b3f57604051637872c6e360e01b815260040160405180910390fd5b611b6b7f0000000000000000000000000000000000000000000000000000000000000000333084612826565b611b753382612604565b60405181815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2610d9b6001600955565b611bbd33611fe9565b611bda57604051637c3ea23f60e01b815260040160405180910390fd5b610d688282612921565b611bed33611fe9565b611c0a57604051637c3ea23f60e01b815260040160405180910390fd5b611c246000805160206131b38339815191523360006127ff565b60405133907f6cc2c67081f55c2fffb7c008fa995fbbf890f48c7c16fba93d8220f00dc84cc590600090a2565b42841015611ca15760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610bce565b60006001611cad611137565b6001600160a01b038a811660008181526008602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611db9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611def5750876001600160a01b0316816001600160a01b0316145b611e2c5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610bce565b6001600160a01b0390811660009081526007602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b611e9e33611fe9565b611ebb57604051637c3ea23f60e01b815260040160405180910390fd5b610d9b81612976565b6060610b9a6000805160206131b383398151915261219c565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03831601611f0b575047919050565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015611f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7b9190613003565b611f7b6126d6565b6001600160a01b038116611fe05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bce565b610d9b81612736565b6000610b7b6000805160206131b3833981519152836126ab565b61200c33611fe9565b61202957604051637c3ea23f60e01b815260040160405180910390fd5b600a805482919060ff1916600183600281111561204857612048612db3565b021790555080600281111561205f5761205f612db3565b6040517f332a9f1d3bd9b0f7abbd95838fed6b417589632d0eb33f2d8ae6e2aa17178efd90600090a250565b61209433611fe9565b6120b157604051637c3ea23f60e01b815260040160405180910390fd5b60005b8181101561219757368383838181106120cf576120cf613092565b90506040020190508060200160208101906120ea9190612eb5565b15612104576121046120ff6020830183612cac565b61278f565b61212f600b600c6121186020850185612cac565b6121286040860160208701612eb5565b60646129bf565b506121406040820160208301612eb5565b151561214f6020830183612cac565b6001600160a01b03167f1470aed653fa8a8ce4c7b2f41287634199f7ec3c4f5fd0ace97d82cf006beec360405160405180910390a3508061218f816130a8565b9150506120b4565b505050565b6000818152600160209081526040918290208054835181840281018401909452808452606093928301828280156121fc57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116121de575b50505050509050919050565b6000610b9a33611fe9565b600d8190556040518181527f95e8c9f3b9477918d3e5407ba96fac8e2084722c9562942bac414734bdf8f8049060200160405180910390a150565b60005460ff16156113ff5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bce565b6002600954036122e65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bce565b6002600955565b6001600160a01b03821660009081526006602052604081208054839290612315908490613032565b90915550506005805482900390556040518181526000906001600160a01b038416906000805160206131d3833981519152906020015b60405180910390a35050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916123b391906130c1565b6000604051808303816000865af19150503d80600081146123f0576040519150601f19603f3d011682016040523d82523d6000602084013e6123f5565b606091505b509150915060008280156124215750815115806124215750818060200190518101906124219190613045565b905080610f1757604051632fdb1b7f60e11b815260040160405180910390fd5b604080516000808252602082019092526001600160a01b03841690839060405161246b91906130c1565b60006040518083038185875af1925050503d80600081146124a8576040519150601f19603f3d011682016040523d82523d6000602084013e6124ad565b606091505b505090508061219757604051632e05b05360e21b815260040160405180910390fd5b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600360405161250191906130dd565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60005460ff166113ff5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610bce565b6125ba612569565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b8060056000828254612616919061307f565b90915550506001600160a01b0382166000818152600660209081526040808320805486019055518481526000805160206131d3833981519152910161234b565b61266f6000805160206131f383398151915283836127ff565b604051811515906001600160a01b038416907f2b535dea3b8ec7fb244a57e39a42aee5f6f4871306457173aa18f49a96e8c78090600090a35050565b60009182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000546001600160a01b036101009091041633146113ff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bce565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b6001600160a01b0381163b610d9b57604051638c50d7cd60e01b81526001600160a01b0382166004820152602401610bce565b6127ca61224e565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586125e73390565b60008381526001602090815260408083206002909252909120611a569190848460646129bf565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161288a91906130c1565b6000604051808303816000865af19150503d80600081146128c7576040519150601f19603f3d011682016040523d82523d6000602084013e6128cc565b606091505b509150915060008280156128f85750815115806128f85750818060200190518101906128f89190613045565b90508061291857604051632d9d5b4160e01b815260040160405180910390fd5b50505050505050565b61293a60008051602061319383398151915283836127ff565b604051811515906001600160a01b038416907fc6b049f4dc9561b397b0cef913ea5f18165b682b193be62c0bbbf9ca8763aeba90600090a35050565b600e805460ff60a01b1916600160a01b831515908102919091179091556040517fdf888ec24e9081be857eb58887c4c9e546edf94ee7dbc643c07f69dd32c0d13590600090a250565b6000826129d6576129d18686866129ec565b6129e2565b6129e286868685612b14565b9695505050505050565b6001600160a01b0381166000908152602083905260409020805460ff16908115612b0c5760018082015486549091600091612a279190613032565b9050808214612ab4576000878281548110612a4457612a44613092565b9060005260206000200160009054906101000a90046001600160a01b0316905080888481548110612a7757612a77613092565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905592909116815290879052604090206001018290555b86805480612ac457612ac461317c565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038716825287905260408120805460ff191681556001015550505b509392505050565b6001600160a01b03821660009081526020849052604090205460ff16158015612bbf5784548211612b585760405163b1655e3360e01b815260040160405180910390fd5b6040805180820182526001808252875460208084019182526001600160a01b03881660008181528a83529586209451855460ff1916901515178555915193830193909355885491820189558884529190922090910180546001600160a01b03191690911790555b949350505050565b6020808252825182820181905260009190848201906040850190845b81811015612c085783516001600160a01b031683529284019291840191600101612be3565b50909695505050505050565b60005b83811015612c2f578181015183820152602001612c17565b50506000910152565b6020815260008251806020840152612c57816040850160208701612c14565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610d9b57600080fd5b60008060408385031215612c9357600080fd5b8235612c9e81612c6b565b946020939093013593505050565b600060208284031215612cbe57600080fd5b8135612cc981612c6b565b9392505050565b600060208284031215612ce257600080fd5b5035919050565b600080600060608486031215612cfe57600080fd5b8335612d0981612c6b565b92506020840135612d1981612c6b565b929592945050506040919091013590565b8015158114610d9b57600080fd5b600080600060608486031215612d4d57600080fd5b833592506020840135612d5f81612c6b565b91506040840135612d6f81612d2a565b809150509250925092565b60008060408385031215612d8d57600080fd5b8235612d9881612c6b565b91506020830135612da881612d2a565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60038110610d9b57634e487b7160e01b600052602160045260246000fd5b60208101612df483612dc9565b91905290565b60038110610d9b57600080fd5b60008060408385031215612e1a57600080fd5b8235612e2581612c6b565b91506020830135612da881612dfa565b60ff81168114610d9b57600080fd5b600080600080600080600060e0888a031215612e5f57600080fd5b8735612e6a81612c6b565b96506020880135612e7a81612c6b565b955060408801359450606088013593506080880135612e9881612e35565b9699959850939692959460a0840135945060c09093013592915050565b600060208284031215612ec757600080fd5b8135612cc981612d2a565b60008060408385031215612ee557600080fd5b8235612ef081612c6b565b91506020830135612da881612c6b565b600060208284031215612f1257600080fd5b8135612cc981612dfa565b60008060208385031215612f3057600080fd5b823567ffffffffffffffff80821115612f4857600080fd5b818501915085601f830112612f5c57600080fd5b813581811115612f6b57600080fd5b8660208260061b8501011115612f8057600080fd5b60209290920196919550909350505050565b600181811c90821680612fa657607f821691505b602082108103612fc657634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526019908201527f426c617374436f6e6669673a20556e617574686f72697a656400000000000000604082015260600190565b60006020828403121561301557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610b7b57610b7b61301c565b60006020828403121561305757600080fd5b8151612cc981612d2a565b60006020828403121561307457600080fd5b8151612cc981612e35565b80820180821115610b7b57610b7b61301c565b634e487b7160e01b600052603260045260246000fd5b6000600182016130ba576130ba61301c565b5060010190565b600082516130d3818460208701612c14565b9190910192915050565b600080835481600182811c9150808316806130f957607f831692505b6020808410820361311857634e487b7160e01b86526022600452602486fd5b81801561312c57600181146131415761316e565b60ff198616895284151585028901965061316e565b60008a81526020902060005b868110156131665781548b82015290850190830161314d565b505084890196505b509498975050505050505050565b634e487b7160e01b600052603160045260246000fdfeab6730ecea49587e6c50637868078921bc389a6c228c95e1c7259ae5a61c21746d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef98e2d91934cad395982d17afdb76da8ef5d5f4e6341e368f19914b44485e5886a26469706673582212205f06a16c47af8830b92db4108e9bc907e7cbd55dc7349b2689ee71dcce0f140864736f6c6343000813003300000000000000000000000043000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000072e28c7f34100afefc399fcc0ae041b8fe5841ae00000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000e496e746572706f727420555344420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005695553444200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000007b2e3fc7510d1a51b3bef735f9854465892193540000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103f15760003560e01c80636b56a69111610215578063ad53040911610125578063dd62ed3e116100b8578063f2fde38b11610087578063f2fde38b146109c4578063f3ae2415146109d7578063f977350c146109ea578063fe14e8c3146109fd578063fe8fc8d414610a1057600080fd5b8063dd62ed3e1461096b578063e3725b1514610996578063eedc966a1461099e578063f00ecca3146109b157600080fd5b8063c116a3cb116100f4578063c116a3cb1461092a578063c2c518e11461093d578063d505accf14610945578063d883d8b11461095857600080fd5b8063ad530409146108ed578063ad5c464814610900578063b6b55f251461090e578063bac21a221461092157600080fd5b80638da5cb5b116101a85780639c90dfa1116101775780639c90dfa11461086e5780639dc29fac146108ac578063a5e90eee146108bf578063a8c9a27a146108d2578063a9059cbb146108da57600080fd5b80638da5cb5b1461082f57806395d89b4114610845578063964236941461084d57806397d757761461086057600080fd5b80637b25b4d4116101e45780637b25b4d4146107e15780637c3d6de1146107f45780637ecebe00146108075780638456cb591461082757600080fd5b80636b56a6911461078a5780636f307dc31461079257806370a08231146107b9578063715018a6146107d957600080fd5b8063313ce5671161031057806340c10f19116102a35780634ba3bf7e116102725780634ba3bf7e1461072c5780635c05468b1461073f5780635c56ca35146107525780635c975abb14610765578063607ab5e51461077057600080fd5b806340c10f19146106ab578063440d7248146106be5780634b15b2a9146106fe5780634b8f90251461071157600080fd5b806338405ec3116102df57806338405ec31461065657806338d52e0f146106695780633ef43212146106905780633f4ba83a146106a357600080fd5b8063313ce567146105c357806331a0edec146105fc578063341328c51461060a5780633644e5151461064e57600080fd5b806318160ddd116103885780632a3ffb8a116103575780632a3ffb8a1461053f5780632c966a341461057d5780632e1a7d4d1461059d57806330eb1278146105b057600080fd5b806318160ddd146104fd5780631b5c1d0e1461050657806323b872dd1461051957806327b257491461052c57600080fd5b80630f937410116103c45780630f93741014610481578063103b7397146104895780631581c5bf146104c757806317daf0b4146104d157600080fd5b806304e535e2146103f657806306fdde0314610414578063093f0e2714610429578063095ea7b31461045e575b600080fd5b6103fe610a24565b60405161040b9190612bc7565b60405180910390f35b61041c610a86565b60405161040b9190612c38565b6104507f22ad9585a395edc8067b50da4778cafbb7fa2c4bbd7619fad6aeba403857fd7481565b60405190815260200161040b565b61047161046c366004612c80565b610b14565b604051901515815260200161040b565b6103fe610b81565b6000805160206131b383398151915260005260016020527f3c2285c553468ca8f30447b24bb463c127f1b840e23a0cafa23caa79d906669a54610450565b6104cf610b9f565b005b6104716104df366004612cac565b6001600160a01b03166000908152600c602052604090205460ff1690565b61045060055481565b6104cf610514366004612cd0565b610d6c565b610471610527366004612ce9565b610d9e565b6104cf61053a366004612cac565b610e7e565b6000805160206131f383398151915260005260016020527f5a35d0a0fb7e3bcb482aad5b9886840a8073f28d39a0181c254a9e207a44109454610450565b610585610f1f565b6040516001600160a01b03909116815260200161040b565b6104cf6105ab366004612cd0565b610f85565b6104cf6105be366004612c80565b61108b565b6105ea7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff909116815260200161040b565b6105856003604360981b0181565b610637610618366004612cac565b600c602052600090815260409020805460019091015460ff9091169082565b60408051921515835260208301919091520161040b565b610450611137565b6104cf610664366004612ce9565b61118d565b6105857f000000000000000000000000430000000000000000000000000000000000000381565b6104cf61069e366004612cd0565b61122d565b6104cf6113c9565b6104716106b9366004612c80565b611401565b6104716106cc366004612cac565b7f00000000000000000000000043000000000000000000000000000000000000036001600160a01b0390811691161490565b61058561070c366004612d38565b61147b565b610585732536fe9ab3f511540f2f9e2ec2a805005c3dd80081565b6104cf61073a366004612d7a565b611534565b61047161074d366004612cac565b611564565b610471610760366004612cac565b61157e565b60005460ff16610471565b600a5461077d9060ff1681565b60405161040b9190612de7565b600b54610450565b6105857f000000000000000000000000000000000000000000000000000000000000000081565b6104506107c7366004612cac565b60066020526000908152604090205481565b6104cf611598565b6105856107ef366004612cd0565b6115aa565b6104cf610802366004612cac565b6115d4565b610450610815366004612cac565b60086020526000908152604090205481565b6104cf61171e565b60005461010090046001600160a01b0316610585565b61041c611754565b6104cf61085b366004612cac565b611761565b6105856002604360981b0181565b60008051602061319383398151915260005260016020527fb6368b31e79ffb73a14a00fbd9c0dbbe43a3a26df7f98e18d14334693e18dfce54610450565b6104716108ba366004612c80565b6117c3565b6104cf6108cd366004612d7a565b6118dc565b6103fe611939565b6104716108e8366004612c80565b611952565b6104cf6108fb366004612e07565b6119b8565b6105856004604360981b0181565b6104cf61091c366004612cd0565b611a5c565b610450600d5481565b6104cf610938366004612d7a565b611bb4565b6104cf611be4565b6104cf610953366004612e44565b611c51565b6104cf610966366004612eb5565b611e95565b610450610979366004612ed2565b600760209081526000928352604080842090915290825290205481565b6103fe611ec4565b6104506109ac366004612cac565b611edd565b600e54610585906001600160a01b031681565b6104cf6109d2366004612cac565b611f73565b6104716109e5366004612cac565b611fe9565b6104cf6109f8366004612f00565b612003565b6104cf610a0b366004612f1d565b61208b565b600e5461047190600160a01b900460ff1681565b6060600b805480602002602001604051908101604052809291908181526020018280548015610a7c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a5e575b5050505050905090565b60038054610a9390612f92565b80601f0160208091040260200160405190810160405280929190818152602001828054610abf90612f92565b8015610b0c5780601f10610ae157610100808354040283529160200191610b0c565b820191906000526020600020905b815481529060010190602001808311610aef57829003601f168201915b505050505081565b3360008181526007602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610b6f9086815260200190565b60405180910390a35060015b92915050565b6060610b9a60008051602061319383398151915261219c565b905090565b6001303b1580610bb25750610bb2612208565b610bd75760405162461bcd60e51b8152600401610bce90612fcc565b60405180910390fd5b6002604360981b016001600160a01b031663f098767a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c1957600080fd5b505af1158015610c2d573d6000803e3d6000fd5b505050506002604360981b016001600160a01b0316634e606c476040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c7357600080fd5b505af1158015610c87573d6000803e3d6000fd5b5050604051631a33757d60e01b81526003604360981b019250631a33757d9150610cb690600290600401612de7565b6020604051808303816000875af1158015610cd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf99190613003565b50604051631a33757d60e01b81526004604360981b0190631a33757d90610d2590600290600401612de7565b6020604051808303816000875af1158015610d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d689190613003565b5050565b610d7533611fe9565b610d9257604051637c3ea23f60e01b815260040160405180910390fd5b610d9b81612213565b50565b6001600160a01b03831660009081526007602090815260408083203384529091528120546000198114610dfa57610dd58382613032565b6001600160a01b03861660009081526007602090815260408083203384529091529020555b6001600160a01b03851660009081526006602052604081208054859290610e22908490613032565b90915550506001600160a01b03808516600081815260066020526040908190208054870190555190918716906000805160206131d383398151915290610e6b9087815260200190565b60405180910390a3506001949350505050565b6001303b1580610e915750610e91612208565b610ead5760405162461bcd60e51b8152600401610bce90612fcc565b6040516336b91f2b60e01b81526001600160a01b0383166004820152732536fe9ab3f511540f2f9e2ec2a805005c3dd800906336b91f2b906024015b600060405180830381600087803b158015610f0357600080fd5b505af1158015610f17573d6000803e3d6000fd5b505050505050565b600e54600090600160a01b900460ff16610f4c57604051634dd32fa760e11b815260040160405180910390fd5b600e546001600160a01b0316610f7557604051630d51877360e21b815260040160405180910390fd5b50600e546001600160a01b031690565b610f8d61224e565b610f95612294565b3332146110175760006002600a5460ff166002811115610fb757610fb7612db3565b1480610ff357506001600a5460ff166002811115610fd757610fd7612db3565b148015610ff35750336000908152600c602052604090205460ff165b90508061101557604051630fa0970d60e11b8152336004820152602401610bce565b505b61102133826122ed565b60405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a26110817f00000000000000000000000043000000000000000000000000000000000000033383612357565b610d9b6001600955565b61109433611fe9565b6110b157604051637c3ea23f60e01b815260040160405180910390fd5b6001600160a01b037f00000000000000000000000043000000000000000000000000000000000000038116908316036110fd57604051634477699960e11b815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b0383160161112c57610d683382612441565b610d68823383612357565b60007f0000000000000000000000000000000000000000000000000000000000013e31461461116857610b9a6124cf565b507f1ecdb96be300f73193fa5609ddf9218a77a56c21364898b2c687f9c89c39cb8590565b6000611197612208565b6111b35760405162461bcd60e51b8152600401610bce90612fcc565b604051635569f64b60e11b81526001600160a01b0384811660048301526024820184905285169063aad3ec96906044016020604051808303816000875af1158015611202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112269190613003565b5050505050565b61123561224e565b61123d612294565b3332146112bf5760006002600a5460ff16600281111561125f5761125f612db3565b148061129b57506001600a5460ff16600281111561127f5761127f612db3565b14801561129b5750336000908152600c602052604090205460ff165b9050806112bd57604051630fa0970d60e11b8152336004820152602401610bce565b505b6112c7610f1f565b50600e54604051632770a7eb60e21b8152336004820152602481018390526000916001600160a01b031690639dc29fac906044016020604051808303816000875af115801561131a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133e9190613045565b90508061135e5760405163a294042360e01b815260040160405180910390fd5b60405182815233907f16aab25bf023c1724fe661e47886a1083e99fb9533f0947445acb8974a6778c89060200160405180910390a26113be7f00000000000000000000000043000000000000000000000000000000000000033384612357565b50610d9b6001600955565b6113d233611fe9565b6113ef57604051637c3ea23f60e01b815260040160405180910390fd5b6113f7612569565b6113ff6125b2565b565b600061140b61224e565b600061141633611564565b8061144757507f00000000000000000000000000000000000000000000000000000000000000008015611447575060005b905080611467576040516371d2156960e01b815260040160405180910390fd5b6114718484612604565b5060019392505050565b600061148561224e565b61148e3361157e565b6114ab5760405163085c44cb60e31b815260040160405180910390fd5b8180156114c25750600e54600160a01b900460ff16155b156114e057604051634dd32fa760e11b815260040160405180910390fd5b61150b7f00000000000000000000000043000000000000000000000000000000000000038486612357565b507f00000000000000000000000043000000000000000000000000000000000000039392505050565b61153d33611fe9565b61155a57604051637c3ea23f60e01b815260040160405180910390fd5b610d688282612656565b6000610b7b6000805160206131f3833981519152836126ab565b6000610b7b600080516020613193833981519152836126ab565b6115a06126d6565b6113ff6000612736565b600b81815481106115ba57600080fd5b6000918252602090912001546001600160a01b0316905081565b6115dd33611fe9565b6115fa57604051637c3ea23f60e01b815260040160405180910390fd5b600e546001600160a01b0316156116245760405163b347c0ad60e01b815260040160405180910390fd5b61162d8161278f565b7f000000000000000000000000000000000000000000000000000000000000001260ff16816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561168f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b39190613062565b60ff16146116d457604051637265cffd60e11b815260040160405180910390fd5b600e80546001600160a01b0319166001600160a01b0383169081179091556040517fb366d6f570d256c768970b0082f8d0cea95a76afa28b518f9e6eb033d84e656a90600090a250565b61172733611fe9565b61174457604051637c3ea23f60e01b815260040160405180910390fd5b61174c61224e565b6113ff6127c2565b60048054610a9390612f92565b6001303b15806117745750611774612208565b6117905760405162461bcd60e51b8152600401610bce90612fcc565b604051631d70c8d360e31b81526001600160a01b03831660048201526002604360981b019063eb86469890602401610ee9565b60006117cd61224e565b60006117d833611564565b8061180957507f00000000000000000000000000000000000000000000000000000000000000008015611809575060005b905080611829576040516305fb1f3f60e51b815260040160405180910390fd5b6001600160a01b03841661185057604051633efa09af60e01b815260040160405180910390fd5b6001600160a01b038416600090815260076020908152604080832033845290915290205483811015611895576040516308688c9b60e01b815260040160405180910390fd5b60001981146118c7576001600160a01b0385166000908152600760209081526040808320338452909152902084820390555b6118d185856122ed565b506001949350505050565b6118e46126d6565b6118fd6000805160206131b383398151915283836127ff565b604051811515906001600160a01b038416907fbe9474bb3e78da7e315cdffa5cfa30b767fcc95bbf44a6197da60228eea1028690600090a35050565b6060610b9a6000805160206131f383398151915261219c565b33600090815260066020526040812080548391908390611973908490613032565b90915550506001600160a01b038316600081815260066020526040908190208054850190555133906000805160206131d383398151915290610b6f9086815260200190565b6001303b15806119cb57506119cb612208565b6119e75760405162461bcd60e51b8152600401610bce90612fcc565b604051631a33757d60e01b81526001600160a01b03841690631a33757d90611a13908590600401612de7565b6020604051808303816000875af1158015611a32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a569190613003565b50505050565b611a6461224e565b611a6c612294565b333214611aee5760006002600a5460ff166002811115611a8e57611a8e612db3565b1480611aca57506001600a5460ff166002811115611aae57611aae612db3565b148015611aca5750336000908152600c602052604090205460ff165b905080611aec57604051630fa0970d60e11b8152336004820152602401610bce565b505b80600003611b0f57604051636e0ccc0760e01b815260040160405180910390fd5b600d5481600554611b20919061307f565b1115611b3f57604051637872c6e360e01b815260040160405180910390fd5b611b6b7f0000000000000000000000004300000000000000000000000000000000000003333084612826565b611b753382612604565b60405181815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2610d9b6001600955565b611bbd33611fe9565b611bda57604051637c3ea23f60e01b815260040160405180910390fd5b610d688282612921565b611bed33611fe9565b611c0a57604051637c3ea23f60e01b815260040160405180910390fd5b611c246000805160206131b38339815191523360006127ff565b60405133907f6cc2c67081f55c2fffb7c008fa995fbbf890f48c7c16fba93d8220f00dc84cc590600090a2565b42841015611ca15760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610bce565b60006001611cad611137565b6001600160a01b038a811660008181526008602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611db9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611def5750876001600160a01b0316816001600160a01b0316145b611e2c5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610bce565b6001600160a01b0390811660009081526007602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b611e9e33611fe9565b611ebb57604051637c3ea23f60e01b815260040160405180910390fd5b610d9b81612976565b6060610b9a6000805160206131b383398151915261219c565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03831601611f0b575047919050565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015611f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7b9190613003565b611f7b6126d6565b6001600160a01b038116611fe05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bce565b610d9b81612736565b6000610b7b6000805160206131b3833981519152836126ab565b61200c33611fe9565b61202957604051637c3ea23f60e01b815260040160405180910390fd5b600a805482919060ff1916600183600281111561204857612048612db3565b021790555080600281111561205f5761205f612db3565b6040517f332a9f1d3bd9b0f7abbd95838fed6b417589632d0eb33f2d8ae6e2aa17178efd90600090a250565b61209433611fe9565b6120b157604051637c3ea23f60e01b815260040160405180910390fd5b60005b8181101561219757368383838181106120cf576120cf613092565b90506040020190508060200160208101906120ea9190612eb5565b15612104576121046120ff6020830183612cac565b61278f565b61212f600b600c6121186020850185612cac565b6121286040860160208701612eb5565b60646129bf565b506121406040820160208301612eb5565b151561214f6020830183612cac565b6001600160a01b03167f1470aed653fa8a8ce4c7b2f41287634199f7ec3c4f5fd0ace97d82cf006beec360405160405180910390a3508061218f816130a8565b9150506120b4565b505050565b6000818152600160209081526040918290208054835181840281018401909452808452606093928301828280156121fc57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116121de575b50505050509050919050565b6000610b9a33611fe9565b600d8190556040518181527f95e8c9f3b9477918d3e5407ba96fac8e2084722c9562942bac414734bdf8f8049060200160405180910390a150565b60005460ff16156113ff5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bce565b6002600954036122e65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bce565b6002600955565b6001600160a01b03821660009081526006602052604081208054839290612315908490613032565b90915550506005805482900390556040518181526000906001600160a01b038416906000805160206131d3833981519152906020015b60405180910390a35050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916123b391906130c1565b6000604051808303816000865af19150503d80600081146123f0576040519150601f19603f3d011682016040523d82523d6000602084013e6123f5565b606091505b509150915060008280156124215750815115806124215750818060200190518101906124219190613045565b905080610f1757604051632fdb1b7f60e11b815260040160405180910390fd5b604080516000808252602082019092526001600160a01b03841690839060405161246b91906130c1565b60006040518083038185875af1925050503d80600081146124a8576040519150601f19603f3d011682016040523d82523d6000602084013e6124ad565b606091505b505090508061219757604051632e05b05360e21b815260040160405180910390fd5b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600360405161250191906130dd565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60005460ff166113ff5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610bce565b6125ba612569565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b8060056000828254612616919061307f565b90915550506001600160a01b0382166000818152600660209081526040808320805486019055518481526000805160206131d3833981519152910161234b565b61266f6000805160206131f383398151915283836127ff565b604051811515906001600160a01b038416907f2b535dea3b8ec7fb244a57e39a42aee5f6f4871306457173aa18f49a96e8c78090600090a35050565b60009182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000546001600160a01b036101009091041633146113ff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bce565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b6001600160a01b0381163b610d9b57604051638c50d7cd60e01b81526001600160a01b0382166004820152602401610bce565b6127ca61224e565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586125e73390565b60008381526001602090815260408083206002909252909120611a569190848460646129bf565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161288a91906130c1565b6000604051808303816000865af19150503d80600081146128c7576040519150601f19603f3d011682016040523d82523d6000602084013e6128cc565b606091505b509150915060008280156128f85750815115806128f85750818060200190518101906128f89190613045565b90508061291857604051632d9d5b4160e01b815260040160405180910390fd5b50505050505050565b61293a60008051602061319383398151915283836127ff565b604051811515906001600160a01b038416907fc6b049f4dc9561b397b0cef913ea5f18165b682b193be62c0bbbf9ca8763aeba90600090a35050565b600e805460ff60a01b1916600160a01b831515908102919091179091556040517fdf888ec24e9081be857eb58887c4c9e546edf94ee7dbc643c07f69dd32c0d13590600090a250565b6000826129d6576129d18686866129ec565b6129e2565b6129e286868685612b14565b9695505050505050565b6001600160a01b0381166000908152602083905260409020805460ff16908115612b0c5760018082015486549091600091612a279190613032565b9050808214612ab4576000878281548110612a4457612a44613092565b9060005260206000200160009054906101000a90046001600160a01b0316905080888481548110612a7757612a77613092565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905592909116815290879052604090206001018290555b86805480612ac457612ac461317c565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038716825287905260408120805460ff191681556001015550505b509392505050565b6001600160a01b03821660009081526020849052604090205460ff16158015612bbf5784548211612b585760405163b1655e3360e01b815260040160405180910390fd5b6040805180820182526001808252875460208084019182526001600160a01b03881660008181528a83529586209451855460ff1916901515178555915193830193909355885491820189558884529190922090910180546001600160a01b03191690911790555b949350505050565b6020808252825182820181905260009190848201906040850190845b81811015612c085783516001600160a01b031683529284019291840191600101612be3565b50909695505050505050565b60005b83811015612c2f578181015183820152602001612c17565b50506000910152565b6020815260008251806020840152612c57816040850160208701612c14565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610d9b57600080fd5b60008060408385031215612c9357600080fd5b8235612c9e81612c6b565b946020939093013593505050565b600060208284031215612cbe57600080fd5b8135612cc981612c6b565b9392505050565b600060208284031215612ce257600080fd5b5035919050565b600080600060608486031215612cfe57600080fd5b8335612d0981612c6b565b92506020840135612d1981612c6b565b929592945050506040919091013590565b8015158114610d9b57600080fd5b600080600060608486031215612d4d57600080fd5b833592506020840135612d5f81612c6b565b91506040840135612d6f81612d2a565b809150509250925092565b60008060408385031215612d8d57600080fd5b8235612d9881612c6b565b91506020830135612da881612d2a565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60038110610d9b57634e487b7160e01b600052602160045260246000fd5b60208101612df483612dc9565b91905290565b60038110610d9b57600080fd5b60008060408385031215612e1a57600080fd5b8235612e2581612c6b565b91506020830135612da881612dfa565b60ff81168114610d9b57600080fd5b600080600080600080600060e0888a031215612e5f57600080fd5b8735612e6a81612c6b565b96506020880135612e7a81612c6b565b955060408801359450606088013593506080880135612e9881612e35565b9699959850939692959460a0840135945060c09093013592915050565b600060208284031215612ec757600080fd5b8135612cc981612d2a565b60008060408385031215612ee557600080fd5b8235612ef081612c6b565b91506020830135612da881612c6b565b600060208284031215612f1257600080fd5b8135612cc981612dfa565b60008060208385031215612f3057600080fd5b823567ffffffffffffffff80821115612f4857600080fd5b818501915085601f830112612f5c57600080fd5b813581811115612f6b57600080fd5b8660208260061b8501011115612f8057600080fd5b60209290920196919550909350505050565b600181811c90821680612fa657607f821691505b602082108103612fc657634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526019908201527f426c617374436f6e6669673a20556e617574686f72697a656400000000000000604082015260600190565b60006020828403121561301557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610b7b57610b7b61301c565b60006020828403121561305757600080fd5b8151612cc981612d2a565b60006020828403121561307457600080fd5b8151612cc981612e35565b80820180821115610b7b57610b7b61301c565b634e487b7160e01b600052603260045260246000fd5b6000600182016130ba576130ba61301c565b5060010190565b600082516130d3818460208701612c14565b9190910192915050565b600080835481600182811c9150808316806130f957607f831692505b6020808410820361311857634e487b7160e01b86526022600452602486fd5b81801561312c57600181146131415761316e565b60ff198616895284151585028901965061316e565b60008a81526020902060005b868110156131665781548b82015290850190830161314d565b505084890196505b509498975050505050505050565b634e487b7160e01b600052603160045260246000fdfeab6730ecea49587e6c50637868078921bc389a6c228c95e1c7259ae5a61c21746d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef98e2d91934cad395982d17afdb76da8ef5d5f4e6341e368f19914b44485e5886a26469706673582212205f06a16c47af8830b92db4108e9bc907e7cbd55dc7349b2689ee71dcce0f140864736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000043000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000072e28c7f34100afefc399fcc0ae041b8fe5841ae00000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000e496e746572706f727420555344420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005695553444200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000007b2e3fc7510d1a51b3bef735f9854465892193540000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _asset (address): 0x4300000000000000000000000000000000000003
Arg [1] : _name (string): Interport USDB
Arg [2] : _symbol (string): iUSDB
Arg [3] : _assetSpenders (address[]): 0x7b2E3FC7510D1A51b3bef735F985446589219354
Arg [4] : _depositAllowed (bool): False
Arg [5] : _variableRepaymentEnabled (bool): True
Arg [6] : _owner (address): 0x72E28c7F34100AfefC399fcc0AE041B8fe5841AE
-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 0000000000000000000000004300000000000000000000000000000000000003
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [6] : 00000000000000000000000072e28c7f34100afefc399fcc0ae041b8fe5841ae
Arg [7] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [9] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [10] : 496e746572706f72742055534442000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [12] : 6955534442000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [14] : 0000000000000000000000007b2e3fc7510d1a51b3bef735f985446589219354
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.