Source Code
Overview
S Balance
More Info
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
25078839 | 35 hrs ago | 0 S | ||||
25076844 | 35 hrs ago | 0 S | ||||
25076844 | 35 hrs ago | 0 S | ||||
25076525 | 35 hrs ago | 0 S | ||||
25076189 | 35 hrs ago | 0 S | ||||
25075767 | 35 hrs ago | 0 S | ||||
25074610 | 35 hrs ago | 0 S | ||||
25073627 | 35 hrs ago | 0 S | ||||
25070962 | 36 hrs ago | 0 S | ||||
25070962 | 36 hrs ago | 0 S | ||||
25070686 | 36 hrs ago | 0 S | ||||
25070686 | 36 hrs ago | 0 S | ||||
25068892 | 36 hrs ago | 0 S | ||||
25068892 | 36 hrs ago | 0 S | ||||
25066415 | 37 hrs ago | 0 S | ||||
25066415 | 37 hrs ago | 0 S | ||||
25059374 | 38 hrs ago | 0 S | ||||
24944912 | 2 days ago | 0 S | ||||
24944912 | 2 days ago | 0 S | ||||
24944564 | 2 days ago | 0 S | ||||
24940033 | 2 days ago | 0 S | ||||
24940033 | 2 days ago | 0 S | ||||
24938345 | 2 days ago | 0 S | ||||
24938345 | 2 days ago | 0 S | ||||
24895526 | 2 days ago | 0 S |
Loading...
Loading
This contract contains unverified libraries: BorrowLogic, BridgeLogic, ConfiguratorLogic, EModeLogic, FlashLoanLogic, LiquidationLogic, PoolLogic, SupplyLogic
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
PoolAddressesProvider
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.10; import {Ownable} from '../../dependencies/openzeppelin/contracts/Ownable.sol'; import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; import {InitializableImmutableAdminUpgradeabilityProxy} from '../../misc/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; /** * @title PoolAddressesProvider * @author Aave * @notice Main registry of addresses part of or connected to the protocol, including permissioned roles * @dev Acts as factory of proxies and admin of those, so with right to change its implementations * @dev Owned by the Aave Governance */ contract PoolAddressesProvider is Ownable, IPoolAddressesProvider { // Identifier of the Aave Market string private _marketId; // Map of registered addresses (identifier => registeredAddress) mapping(bytes32 => address) private _addresses; // Main identifiers bytes32 private constant POOL = 'POOL'; bytes32 private constant POOL_CONFIGURATOR = 'POOL_CONFIGURATOR'; bytes32 private constant PRICE_ORACLE = 'PRICE_ORACLE'; bytes32 private constant ACL_MANAGER = 'ACL_MANAGER'; bytes32 private constant ACL_ADMIN = 'ACL_ADMIN'; bytes32 private constant PRICE_ORACLE_SENTINEL = 'PRICE_ORACLE_SENTINEL'; bytes32 private constant DATA_PROVIDER = 'DATA_PROVIDER'; /** * @dev Constructor. * @param marketId The identifier of the market. * @param owner The owner address of this contract. */ constructor(string memory marketId, address owner) { _setMarketId(marketId); transferOwnership(owner); } /// @inheritdoc IPoolAddressesProvider function getMarketId() external view override returns (string memory) { return _marketId; } /// @inheritdoc IPoolAddressesProvider function setMarketId(string memory newMarketId) external override onlyOwner { _setMarketId(newMarketId); } /// @inheritdoc IPoolAddressesProvider function getAddress(bytes32 id) public view override returns (address) { return _addresses[id]; } /// @inheritdoc IPoolAddressesProvider function setAddress(bytes32 id, address newAddress) external override onlyOwner { address oldAddress = _addresses[id]; _addresses[id] = newAddress; emit AddressSet(id, oldAddress, newAddress); } /// @inheritdoc IPoolAddressesProvider function setAddressAsProxy( bytes32 id, address newImplementationAddress ) external override onlyOwner { address proxyAddress = _addresses[id]; address oldImplementationAddress = _getProxyImplementation(id); _updateImpl(id, newImplementationAddress); emit AddressSetAsProxy(id, proxyAddress, oldImplementationAddress, newImplementationAddress); } /// @inheritdoc IPoolAddressesProvider function getPool() external view override returns (address) { return getAddress(POOL); } /// @inheritdoc IPoolAddressesProvider function setPoolImpl(address newPoolImpl) external override onlyOwner { address oldPoolImpl = _getProxyImplementation(POOL); _updateImpl(POOL, newPoolImpl); emit PoolUpdated(oldPoolImpl, newPoolImpl); } /// @inheritdoc IPoolAddressesProvider function getPoolConfigurator() external view override returns (address) { return getAddress(POOL_CONFIGURATOR); } /// @inheritdoc IPoolAddressesProvider function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external override onlyOwner { address oldPoolConfiguratorImpl = _getProxyImplementation(POOL_CONFIGURATOR); _updateImpl(POOL_CONFIGURATOR, newPoolConfiguratorImpl); emit PoolConfiguratorUpdated(oldPoolConfiguratorImpl, newPoolConfiguratorImpl); } /// @inheritdoc IPoolAddressesProvider function getPriceOracle() external view override returns (address) { return getAddress(PRICE_ORACLE); } /// @inheritdoc IPoolAddressesProvider function setPriceOracle(address newPriceOracle) external override onlyOwner { address oldPriceOracle = _addresses[PRICE_ORACLE]; _addresses[PRICE_ORACLE] = newPriceOracle; emit PriceOracleUpdated(oldPriceOracle, newPriceOracle); } /// @inheritdoc IPoolAddressesProvider function getACLManager() external view override returns (address) { return getAddress(ACL_MANAGER); } /// @inheritdoc IPoolAddressesProvider function setACLManager(address newAclManager) external override onlyOwner { address oldAclManager = _addresses[ACL_MANAGER]; _addresses[ACL_MANAGER] = newAclManager; emit ACLManagerUpdated(oldAclManager, newAclManager); } /// @inheritdoc IPoolAddressesProvider function getACLAdmin() external view override returns (address) { return getAddress(ACL_ADMIN); } /// @inheritdoc IPoolAddressesProvider function setACLAdmin(address newAclAdmin) external override onlyOwner { address oldAclAdmin = _addresses[ACL_ADMIN]; _addresses[ACL_ADMIN] = newAclAdmin; emit ACLAdminUpdated(oldAclAdmin, newAclAdmin); } /// @inheritdoc IPoolAddressesProvider function getPriceOracleSentinel() external view override returns (address) { return getAddress(PRICE_ORACLE_SENTINEL); } /// @inheritdoc IPoolAddressesProvider function setPriceOracleSentinel(address newPriceOracleSentinel) external override onlyOwner { address oldPriceOracleSentinel = _addresses[PRICE_ORACLE_SENTINEL]; _addresses[PRICE_ORACLE_SENTINEL] = newPriceOracleSentinel; emit PriceOracleSentinelUpdated(oldPriceOracleSentinel, newPriceOracleSentinel); } /// @inheritdoc IPoolAddressesProvider function getPoolDataProvider() external view override returns (address) { return getAddress(DATA_PROVIDER); } /// @inheritdoc IPoolAddressesProvider function setPoolDataProvider(address newDataProvider) external override onlyOwner { address oldDataProvider = _addresses[DATA_PROVIDER]; _addresses[DATA_PROVIDER] = newDataProvider; emit PoolDataProviderUpdated(oldDataProvider, newDataProvider); } /** * @notice Internal function to update the implementation of a specific proxied component of the protocol. * @dev If there is no proxy registered with the given identifier, it creates the proxy setting `newAddress` * as implementation and calls the initialize() function on the proxy * @dev If there is already a proxy registered, it just updates the implementation to `newAddress` and * calls the initialize() function via upgradeToAndCall() in the proxy * @param id The id of the proxy to be updated * @param newAddress The address of the new implementation */ function _updateImpl(bytes32 id, address newAddress) internal { address proxyAddress = _addresses[id]; InitializableImmutableAdminUpgradeabilityProxy proxy; bytes memory params = abi.encodeWithSignature('initialize(address)', address(this)); if (proxyAddress == address(0)) { proxy = new InitializableImmutableAdminUpgradeabilityProxy(address(this)); _addresses[id] = proxyAddress = address(proxy); proxy.initialize(newAddress, params); emit ProxyCreated(id, proxyAddress, newAddress); } else { proxy = InitializableImmutableAdminUpgradeabilityProxy(payable(proxyAddress)); proxy.upgradeToAndCall(newAddress, params); } } /** * @notice Updates the identifier of the Aave market. * @param newMarketId The new id of the market */ function _setMarketId(string memory newMarketId) internal { string memory oldMarketId = _marketId; _marketId = newMarketId; emit MarketIdSet(oldMarketId, newMarketId); } /** * @notice Returns the the implementation contract of the proxy contract by its identifier. * @dev It returns ZERO if there is no registered address with the given id * @dev It reverts if the registered address with the given id is not `InitializableImmutableAdminUpgradeabilityProxy` * @param id The id * @return The address of the implementation contract */ function _getProxyImplementation(bytes32 id) internal returns (address) { address proxyAddress = _addresses[id]; if (proxyAddress == address(0)) { return address(0); } else { address payable payableProxyAddress = payable(proxyAddress); return InitializableImmutableAdminUpgradeabilityProxy(payableProxyAddress).implementation(); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import './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. */ 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() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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'); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title IPoolAddressesProvider * @author Aave * @notice Defines the basic interface for a Pool Addresses Provider. */ interface IPoolAddressesProvider { /** * @dev Emitted when the market identifier is updated. * @param oldMarketId The old id of the market * @param newMarketId The new id of the market */ event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); /** * @dev Emitted when the pool is updated. * @param oldAddress The old address of the Pool * @param newAddress The new address of the Pool */ event PoolUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the pool configurator is updated. * @param oldAddress The old address of the PoolConfigurator * @param newAddress The new address of the PoolConfigurator */ event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the price oracle is updated. * @param oldAddress The old address of the PriceOracle * @param newAddress The new address of the PriceOracle */ event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the ACL manager is updated. * @param oldAddress The old address of the ACLManager * @param newAddress The new address of the ACLManager */ event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the ACL admin is updated. * @param oldAddress The old address of the ACLAdmin * @param newAddress The new address of the ACLAdmin */ event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the price oracle sentinel is updated. * @param oldAddress The old address of the PriceOracleSentinel * @param newAddress The new address of the PriceOracleSentinel */ event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the pool data provider is updated. * @param oldAddress The old address of the PoolDataProvider * @param newAddress The new address of the PoolDataProvider */ event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when a new proxy is created. * @param id The identifier of the proxy * @param proxyAddress The address of the created proxy contract * @param implementationAddress The address of the implementation contract */ event ProxyCreated( bytes32 indexed id, address indexed proxyAddress, address indexed implementationAddress ); /** * @dev Emitted when a new non-proxied contract address is registered. * @param id The identifier of the contract * @param oldAddress The address of the old contract * @param newAddress The address of the new contract */ event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the implementation of the proxy registered with id is updated * @param id The identifier of the contract * @param proxyAddress The address of the proxy contract * @param oldImplementationAddress The address of the old implementation contract * @param newImplementationAddress The address of the new implementation contract */ event AddressSetAsProxy( bytes32 indexed id, address indexed proxyAddress, address oldImplementationAddress, address indexed newImplementationAddress ); /** * @notice Returns the id of the Aave market to which this contract points to. * @return The market id */ function getMarketId() external view returns (string memory); /** * @notice Associates an id with a specific PoolAddressesProvider. * @dev This can be used to create an onchain registry of PoolAddressesProviders to * identify and validate multiple Aave markets. * @param newMarketId The market id */ function setMarketId(string calldata newMarketId) external; /** * @notice Returns an address by its identifier. * @dev The returned address might be an EOA or a contract, potentially proxied * @dev It returns ZERO if there is no registered address with the given id * @param id The id * @return The address of the registered for the specified id */ function getAddress(bytes32 id) external view returns (address); /** * @notice General function to update the implementation of a proxy registered with * certain `id`. If there is no proxy registered, it will instantiate one and * set as implementation the `newImplementationAddress`. * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit * setter function, in order to avoid unexpected consequences * @param id The id * @param newImplementationAddress The address of the new implementation */ function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; /** * @notice Sets an address for an id replacing the address saved in the addresses map. * @dev IMPORTANT Use this function carefully, as it will do a hard replacement * @param id The id * @param newAddress The address to set */ function setAddress(bytes32 id, address newAddress) external; /** * @notice Returns the address of the Pool proxy. * @return The Pool proxy address */ function getPool() external view returns (address); /** * @notice Updates the implementation of the Pool, or creates a proxy * setting the new `pool` implementation when the function is called for the first time. * @param newPoolImpl The new Pool implementation */ function setPoolImpl(address newPoolImpl) external; /** * @notice Returns the address of the PoolConfigurator proxy. * @return The PoolConfigurator proxy address */ function getPoolConfigurator() external view returns (address); /** * @notice Updates the implementation of the PoolConfigurator, or creates a proxy * setting the new `PoolConfigurator` implementation when the function is called for the first time. * @param newPoolConfiguratorImpl The new PoolConfigurator implementation */ function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; /** * @notice Returns the address of the price oracle. * @return The address of the PriceOracle */ function getPriceOracle() external view returns (address); /** * @notice Updates the address of the price oracle. * @param newPriceOracle The address of the new PriceOracle */ function setPriceOracle(address newPriceOracle) external; /** * @notice Returns the address of the ACL manager. * @return The address of the ACLManager */ function getACLManager() external view returns (address); /** * @notice Updates the address of the ACL manager. * @param newAclManager The address of the new ACLManager */ function setACLManager(address newAclManager) external; /** * @notice Returns the address of the ACL admin. * @return The address of the ACL admin */ function getACLAdmin() external view returns (address); /** * @notice Updates the address of the ACL admin. * @param newAclAdmin The address of the new ACL admin */ function setACLAdmin(address newAclAdmin) external; /** * @notice Returns the address of the price oracle sentinel. * @return The address of the PriceOracleSentinel */ function getPriceOracleSentinel() external view returns (address); /** * @notice Updates the address of the price oracle sentinel. * @param newPriceOracleSentinel The address of the new PriceOracleSentinel */ function setPriceOracleSentinel(address newPriceOracleSentinel) external; /** * @notice Returns the address of the data provider. * @return The address of the DataProvider */ function getPoolDataProvider() external view returns (address); /** * @notice Updates the address of the data provider. * @param newDataProvider The address of the new DataProvider */ function setPoolDataProvider(address newDataProvider) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import {InitializableUpgradeabilityProxy} from '../../dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol'; import {Proxy} from '../../dependencies/openzeppelin/upgradeability/Proxy.sol'; import {BaseImmutableAdminUpgradeabilityProxy} from './BaseImmutableAdminUpgradeabilityProxy.sol'; /** * @title InitializableAdminUpgradeabilityProxy * @author Aave * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function */ contract InitializableImmutableAdminUpgradeabilityProxy is BaseImmutableAdminUpgradeabilityProxy, InitializableUpgradeabilityProxy { /** * @dev Constructor. * @param admin The address of the admin */ constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) { // Intentionally left blank } /// @inheritdoc BaseImmutableAdminUpgradeabilityProxy function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) { BaseImmutableAdminUpgradeabilityProxy._willFallback(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; /* * @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 GSN 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 payable) { return payable(msg.sender); } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import './BaseUpgradeabilityProxy.sol'; /** * @title InitializableUpgradeabilityProxy * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing * implementation and init data. */ contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { /** * @dev Contract initializer. * @param _logic Address of the initial implementation. * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. * It should include the signature and the parameters of the function to be called, as described in * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped. */ function initialize(address _logic, bytes memory _data) public payable { require(_implementation() == address(0)); assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); _setImplementation(_logic); if (_data.length > 0) { (bool success, ) = _logic.delegatecall(_data); require(success); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; /** * @title Proxy * @dev Implements delegation of calls to other contracts, with proper * forwarding of return values and bubbling of failures. * It defines a fallback function that delegates all calls to the address * returned by the abstract _implementation() internal function. */ abstract contract Proxy { /** * @dev Fallback function. * Will run if no other function in the contract matches the call data. * Implemented entirely in `_fallback`. */ fallback() external payable { _fallback(); } /** * @dev Fallback function that will run if call data is empty. * IMPORTANT. receive() on implementation contracts will be unreachable */ receive() external payable { _fallback(); } /** * @return The Address of the implementation. */ function _implementation() internal view virtual returns (address); /** * @dev Delegates execution to an implementation contract. * This is a low level function that doesn't return to its internal call site. * It will return to the external caller whatever the implementation returns. * @param implementation Address to delegate. */ function _delegate(address implementation) internal { //solium-disable-next-line assembly { // Copy msg.data. We take full control of memory in this inline assembly // block because it will not return to Solidity code. We overwrite the // Solidity scratch pad at memory position 0. calldatacopy(0, 0, calldatasize()) // Call the implementation. // out and outsize are 0 because we don't know the size yet. let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) // Copy the returned data. returndatacopy(0, 0, returndatasize()) switch result // delegatecall returns 0 on error. case 0 { revert(0, returndatasize()) } default { return(0, returndatasize()) } } } /** * @dev Function that is run as the first thing in the fallback function. * Can be redefined in derived contracts to add functionality. * Redefinitions must call super._willFallback(). */ function _willFallback() internal virtual {} /** * @dev fallback implementation. * Extracted to enable manual triggering. */ function _fallback() internal { _willFallback(); _delegate(_implementation()); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import {BaseUpgradeabilityProxy} from '../../dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol'; /** * @title BaseImmutableAdminUpgradeabilityProxy * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern * @notice This contract combines an upgradeability proxy with an authorization * mechanism for administrative tasks. * @dev The admin role is stored in an immutable, which helps saving transactions costs * All external functions in this contract must be guarded by the * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity * feature proposal that would enable this to be done automatically. */ contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { address internal immutable _admin; /** * @dev Constructor. * @param admin_ The address of the admin */ constructor(address admin_) { _admin = admin_; } modifier ifAdmin() { if (msg.sender == _admin) { _; } else { _fallback(); } } /** * @notice Return the admin address * @return The address of the proxy admin. */ function admin() external ifAdmin returns (address) { return _admin; } /** * @notice Return the implementation address * @return The address of the implementation. */ function implementation() external ifAdmin returns (address) { return _implementation(); } /** * @notice Upgrade the backing implementation of the proxy. * @dev Only the admin can call this function. * @param newImplementation The address of the new implementation. */ function upgradeTo(address newImplementation) external ifAdmin { _upgradeTo(newImplementation); } /** * @notice Upgrade the backing implementation of the proxy and call a function * on the new implementation. * @dev This is useful to initialize the proxied contract. * @param newImplementation The address of the new implementation. * @param data Data to send as msg.data in the low level call. * It should include the signature and the parameters of the function to be called, as described in * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding. */ function upgradeToAndCall( address newImplementation, bytes calldata data ) external payable ifAdmin { _upgradeTo(newImplementation); (bool success, ) = newImplementation.delegatecall(data); require(success); } /** * @notice Only fall back when the sender is not the admin. */ function _willFallback() internal virtual override { require(msg.sender != _admin, 'Cannot call fallback function from the proxy admin'); super._willFallback(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import './Proxy.sol'; import '../contracts/Address.sol'; /** * @title BaseUpgradeabilityProxy * @dev This contract implements a proxy that allows to change the * implementation address to which it will delegate. * Such a change is called an implementation upgrade. */ contract BaseUpgradeabilityProxy is Proxy { /** * @dev Emitted when the implementation is upgraded. * @param implementation Address of the new implementation. */ event Upgraded(address indexed implementation); /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Returns the current implementation. * @return impl Address of the current implementation */ function _implementation() internal view override returns (address impl) { bytes32 slot = IMPLEMENTATION_SLOT; //solium-disable-next-line assembly { impl := sload(slot) } } /** * @dev Upgrades the proxy to a new implementation. * @param newImplementation Address of the new implementation. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Sets the implementation address of the proxy. * @param newImplementation Address of the new implementation. */ function _setImplementation(address newImplementation) internal { require( Address.isContract(newImplementation), 'Cannot set a proxy implementation to a non-contract address' ); bytes32 slot = IMPLEMENTATION_SLOT; //solium-disable-next-line assembly { sstore(slot, newImplementation) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, 'Address: insufficient balance'); (bool success, ) = recipient.call{value: amount}(''); require(success, 'Address: unable to send value, recipient may have reverted'); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, 'Address: low-level call failed'); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, 'Address: insufficient balance for call'); require(isContract(target), 'Address: call to non-contract'); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data ) internal view returns (bytes memory) { return functionStaticCall(target, data, 'Address: low-level static call failed'); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), 'Address: static call to non-contract'); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), 'Address: delegate call to non-contract'); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
{ "remappings": [ "@openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", "@openzeppelin/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/", "@pythnetwork/=lib/pyth-sdk-solidity/", "@money-market/=contracts/moneyMarket/src/", "@money-market-scripts/=contracts/moneyMarket/scripts/", "@money-market-tests/=contracts/moneyMarket/tests/", "@contracts/=contracts/", "solidity-utils/=lib/solidity-utils/src/", "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", "@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/", "ds-test/=lib/solmate/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/", "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/", "pyth-sdk-solidity/=lib/pyth-sdk-solidity/", "solmate/=lib/solmate/src/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "cancun", "viaIR": false, "libraries": { "contracts/moneyMarket/src/contracts/protocol/libraries/logic/BorrowLogic.sol": { "BorrowLogic": "0x8d2517e8eb3a288813F3d86Acf72583c93137cC7" }, "contracts/moneyMarket/src/contracts/protocol/libraries/logic/BridgeLogic.sol": { "BridgeLogic": "0x4Fa0B79Cd0382b8bf9F90755Ae2dB1004b67Ba12" }, "contracts/moneyMarket/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol": { "ConfiguratorLogic": "0x616a5cAab4973a741E18Ba95B8Dfa766de34Fb71" }, "contracts/moneyMarket/src/contracts/protocol/libraries/logic/EModeLogic.sol": { "EModeLogic": "0xfC1E2b81f2b20D829E05BcEa902a9959CE083F0A" }, "contracts/moneyMarket/src/contracts/protocol/libraries/logic/FlashLoanLogic.sol": { "FlashLoanLogic": "0xEa33385DD1De5790b49752449B8C4f88e5013ac3" }, "contracts/moneyMarket/src/contracts/protocol/libraries/logic/LiquidationLogic.sol": { "LiquidationLogic": "0x634E2130c0B8EbF1a3eF111A0337f23cFF28d19A" }, "contracts/moneyMarket/src/contracts/protocol/libraries/logic/PoolLogic.sol": { "PoolLogic": "0xedeae456C72c464E917C690DE562eC02a7b426B4" }, "contracts/moneyMarket/src/contracts/protocol/libraries/logic/SupplyLogic.sol": { "SupplyLogic": "0x16D26622643973B3ea574280998572F220Ede139" } } }
Contract ABI
API[{"inputs":[{"internalType":"string","name":"marketId","type":"string"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"ACLAdminUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"ACLManagerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"AddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"proxyAddress","type":"address"},{"indexed":false,"internalType":"address","name":"oldImplementationAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newImplementationAddress","type":"address"}],"name":"AddressSetAsProxy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"oldMarketId","type":"string"},{"indexed":true,"internalType":"string","name":"newMarketId","type":"string"}],"name":"MarketIdSet","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":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"PoolConfiguratorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"PoolDataProviderUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"PoolUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"PriceOracleSentinelUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"PriceOracleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"proxyAddress","type":"address"},{"indexed":true,"internalType":"address","name":"implementationAddress","type":"address"}],"name":"ProxyCreated","type":"event"},{"inputs":[],"name":"getACLAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getACLManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"getAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMarketId","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPoolConfigurator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPoolDataProvider","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceOracleSentinel","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAclAdmin","type":"address"}],"name":"setACLAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAclManager","type":"address"}],"name":"setACLManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"address","name":"newAddress","type":"address"}],"name":"setAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"address","name":"newImplementationAddress","type":"address"}],"name":"setAddressAsProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newMarketId","type":"string"}],"name":"setMarketId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPoolConfiguratorImpl","type":"address"}],"name":"setPoolConfiguratorImpl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newDataProvider","type":"address"}],"name":"setPoolDataProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPoolImpl","type":"address"}],"name":"setPoolImpl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPriceOracle","type":"address"}],"name":"setPriceOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPriceOracleSentinel","type":"address"}],"name":"setPriceOracleSentinel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561000f575f5ffd5b5060405161202e38038061202e83398101604081905261002e9161029f565b5f80546001600160a01b031916339081178255604051909182915f51602061200e5f395f51905f52908290a35061006482610074565b61006d81610167565b50506104b4565b5f6001805461008290610360565b80601f01602080910402602001604051908101604052809291908181526020018280546100ae90610360565b80156100f95780601f106100d0576101008083540402835291602001916100f9565b820191905f5260205f20905b8154815290600101906020018083116100dc57829003601f168201915b50505050509050816001908161010f91906103e4565b508160405161011e919061049e565b604051809103902081604051610134919061049e565b604051908190038120907fe685c8cdecc6030c45030fd54778812cb84ed8e4467c38294403d68ba7860823905f90a35050565b5f546001600160a01b031633146101c55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b03811661022a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016101bc565b5f80546040516001600160a01b03808516939216915f51602061200e5f395f51905f5291a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b5f52604160045260245ffd5b80516001600160a01b038116811461029a575f5ffd5b919050565b5f5f604083850312156102b0575f5ffd5b82516001600160401b038111156102c5575f5ffd5b8301601f810185136102d5575f5ffd5b80516001600160401b038111156102ee576102ee610270565b604051601f8201601f19908116603f011681016001600160401b038111828210171561031c5761031c610270565b604052818152828201602001871015610333575f5ffd5b8160208401602083015e5f6020838301015280945050505061035760208401610284565b90509250929050565b600181811c9082168061037457607f821691505b60208210810361039257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156103df57805f5260205f20601f840160051c810160208510156103bd5750805b601f840160051c820191505b818110156103dc575f81556001016103c9565b50505b505050565b81516001600160401b038111156103fd576103fd610270565b6104118161040b8454610360565b84610398565b6020601f821160018114610443575f831561042c5750848201515b5f19600385901b1c1916600184901b1784556103dc565b5f84815260208120601f198516915b828110156104725787850151825560209485019460019092019101610452565b508482101561048f57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82518060208501845e5f920191825250919050565b611b4d806104c15f395ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c806376d84ffc116100b4578063e4ca28b711610079578063e4ca28b71461039b578063e860accb146103ae578063ed301ca9146103f6578063f2fde38b14610409578063f67b18471461041c578063fca513a81461042f575f5ffd5b806376d84ffc1461033f5780638da5cb5b14610352578063a156440614610362578063ca446dd914610375578063e44e9ed114610388575f5ffd5b80635dcc528c116101055780635dcc528c1461022f5780635eb88d3d14610242578063631adfca14610292578063707cd716146102de578063715018a61461032457806374944cec1461032c575f5ffd5b8063026b1d5f146101415780630e67178c1461019957806321f8a721146101dd578063530e784f14610205578063568ef4701461021a575b5f5ffd5b631413d3d360e21b5f5260026020527f4fe005067814bb4b024d9515847377d15011b64593c006223b4a722952d2c05a546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b6820a1a62fa0a226a4a760b91b5f5260026020527ffab167ad2009dcb80ee379700bb4bd029d97c1181ed9d961625632c8a6f051c6546001600160a01b031661017c565b61017c6101eb366004610fd5565b5f908152600260205260409020546001600160a01b031690565b610218610213366004611000565b610476565b005b61022261052f565b6040516101909190611050565b61021861023d366004611062565b6105bf565b7414149250d157d3d49050d31157d4d1539512539153605a1b5f5260026020527f0d2c1bcee56447b4f46248272f34207a580a5c40f666a31f4e2fbb470ea53ab8546001600160a01b031661017c565b702827a7a62fa1a7a72324a3aaa920aa27a960791b5f5260026020527f90c127ef1c12c03f5781afeca3079527ea5333738078bba6fea26825bf9bf2c5546001600160a01b031661017c565b6a20a1a62fa6a0a720a3a2a960a91b5f5260026020527f9edef266ef35fd0c6e131df0f31a330f3dd4c4d19dd31ed615c21d005c68116b546001600160a01b031661017c565b610218610662565b61021861033a366004611000565b6106d3565b61021861034d366004611000565b61078c565b5f546001600160a01b031661017c565b610218610370366004611000565b610839565b610218610383366004611062565b6108ca565b610218610396366004611000565b610950565b6102186103a9366004611000565b610a01565b6c2220aa20afa82927ab24a222a960991b5f5260026020527fcd7944601aaa5cd7ccdae1bebec659e98c6aac8f12486b30e59db0d39698051f546001600160a01b031661017c565b610218610404366004611000565b610aac565b610218610417366004611000565b610b5b565b61021861042a3660046110a4565b610c42565b6b50524943455f4f5241434c4560a01b5f5260026020527f740f710666bd7a12af42df98311e541e47f7fd33d382d11602457a6d540cbd63546001600160a01b031661017c565b5f546001600160a01b031633146104a85760405162461bcd60e51b815260040161049f90611157565b60405180910390fd5b6b50524943455f4f5241434c4560a01b5f90815260026020527f740f710666bd7a12af42df98311e541e47f7fd33d382d11602457a6d540cbd6380546001600160a01b038481166001600160a01b03198316811790935560405191169283917f56b5f80d8cac1479698aa7d01605fd6111e90b15fc4d2b377417f46034876cbd9190a35050565b60606001805461053e9061118c565b80601f016020809104026020016040519081016040528092919081815260200182805461056a9061118c565b80156105b55780601f1061058c576101008083540402835291602001916105b5565b820191905f5260205f20905b81548152906001019060200180831161059857829003601f168201915b5050505050905090565b5f546001600160a01b031633146105e85760405162461bcd60e51b815260040161049f90611157565b5f828152600260205260408120546001600160a01b03169061060984610c77565b90506106158484610d0e565b6040516001600160a01b038281168252808516919084169086907f3bbd45b5429b385e3fb37ad5cd1cd1435a3c8ec32196c7937597365a3fd3e99c9060200160405180910390a450505050565b5f546001600160a01b0316331461068b5760405162461bcd60e51b815260040161049f90611157565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f546001600160a01b031633146106fc5760405162461bcd60e51b815260040161049f90611157565b7414149250d157d3d49050d31157d4d1539512539153605a1b5f90815260026020527f0d2c1bcee56447b4f46248272f34207a580a5c40f666a31f4e2fbb470ea53ab880546001600160a01b038481166001600160a01b03198316811790935560405191169283917f5326514eeca90494a14bedabcff812a0e683029ee85d1e23824d44fd14cd6ae79190a35050565b5f546001600160a01b031633146107b55760405162461bcd60e51b815260040161049f90611157565b6820a1a62fa0a226a4a760b91b5f90815260026020527ffab167ad2009dcb80ee379700bb4bd029d97c1181ed9d961625632c8a6f051c680546001600160a01b038481166001600160a01b03198316811790935560405191169283917fe9cf53972264dc95304fd424458745019ddfca0e37ae8f703d74772c41ad115b9190a35050565b5f546001600160a01b031633146108625760405162461bcd60e51b815260040161049f90611157565b5f610873631413d3d360e21b610c77565b9050610886631413d3d360e21b83610d0e565b816001600160a01b0316816001600160a01b03167f90affc163f1a2dfedcd36aa02ed992eeeba8100a4014f0b4cdc20ea265a6662760405160405180910390a35050565b5f546001600160a01b031633146108f35760405162461bcd60e51b815260040161049f90611157565b5f8281526002602052604080822080546001600160a01b031981166001600160a01b038681169182179093559251911692839186917f9ef0e8c8e52743bb38b83b17d9429141d494b8041ca6d616a6c77cebae9cd8b791a4505050565b5f546001600160a01b031633146109795760405162461bcd60e51b815260040161049f90611157565b6c2220aa20afa82927ab24a222a960991b5f90815260026020527fcd7944601aaa5cd7ccdae1bebec659e98c6aac8f12486b30e59db0d39698051f80546001600160a01b038481166001600160a01b03198316811790935560405191169283917fc853974cfbf81487a14a23565917bee63f527853bcb5fa54f2ae1cdf8a38356d9190a35050565b5f546001600160a01b03163314610a2a5760405162461bcd60e51b815260040161049f90611157565b5f610a48702827a7a62fa1a7a72324a3aaa920aa27a960791b610c77565b9050610a68702827a7a62fa1a7a72324a3aaa920aa27a960791b83610d0e565b816001600160a01b0316816001600160a01b03167f8932892569eba59c8382a089d9b732d1f49272878775235761a2a6b0309cd46560405160405180910390a35050565b5f546001600160a01b03163314610ad55760405162461bcd60e51b815260040161049f90611157565b6a20a1a62fa6a0a720a3a2a960a91b5f90815260026020527f9edef266ef35fd0c6e131df0f31a330f3dd4c4d19dd31ed615c21d005c68116b80546001600160a01b038481166001600160a01b03198316811790935560405191169283917fb30efa04327bb8a537d61cc1e5c48095345ad18ef7cc04e6bacf7dfb6caaf5079190a35050565b5f546001600160a01b03163314610b845760405162461bcd60e51b815260040161049f90611157565b6001600160a01b038116610be95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161049f565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b03163314610c6b5760405162461bcd60e51b815260040161049f90611157565b610c7481610ed5565b50565b5f818152600260205260408120546001600160a01b031680610c9b57505f92915050565b5f819050806001600160a01b0316635c60da1b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610cdc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d0091906111be565b949350505050565b50919050565b5f828152600260205260408082205490513060248201526001600160a01b039091169190819060440160408051601f198184030181529190526020810180516001600160e01b031663189acdbd60e31b17905290506001600160a01b038316610e6f5730604051610d7e90610fc8565b6001600160a01b039091168152602001604051809103905ff080158015610da7573d5f5f3e3d5ffd5b505f868152600260205260409081902080546001600160a01b0319166001600160a01b038416908117909155905163347d5e2560e21b81529194508493509063d1f5789490610dfc90879085906004016111d9565b5f604051808303815f87803b158015610e13575f5ffd5b505af1158015610e25573d5f5f3e3d5ffd5b50505050836001600160a01b0316836001600160a01b0316867f4a465a9bd819d9662563c1e11ae958f8109e437e7f4bf1c6ef0b9a7b3f35d47860405160405180910390a4610ece565b60405163278f794360e11b81528392506001600160a01b03831690634f1ef28690610ea090879085906004016111d9565b5f604051808303815f87803b158015610eb7575f5ffd5b505af1158015610ec9573d5f5f3e3d5ffd5b505050505b5050505050565b5f60018054610ee39061118c565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0f9061118c565b8015610f5a5780601f10610f3157610100808354040283529160200191610f5a565b820191905f5260205f20905b815481529060010190602001808311610f3d57829003601f168201915b505050505090508160019081610f709190611245565b5081604051610f7f9190611300565b604051809103902081604051610f959190611300565b604051908190038120907fe685c8cdecc6030c45030fd54778812cb84ed8e4467c38294403d68ba7860823905f90a35050565b6108018061131783390190565b5f60208284031215610fe5575f5ffd5b5035919050565b6001600160a01b0381168114610c74575f5ffd5b5f60208284031215611010575f5ffd5b813561101b81610fec565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61101b6020830184611022565b5f5f60408385031215611073575f5ffd5b82359150602083013561108581610fec565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156110b4575f5ffd5b813567ffffffffffffffff8111156110ca575f5ffd5b8201601f810184136110da575f5ffd5b803567ffffffffffffffff8111156110f4576110f4611090565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561112357611123611090565b60405281815282820160200186101561113a575f5ffd5b816020840160208301375f91810160200191909152949350505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806111a057607f821691505b602082108103610d0857634e487b7160e01b5f52602260045260245ffd5b5f602082840312156111ce575f5ffd5b815161101b81610fec565b6001600160a01b03831681526040602082018190525f90610d0090830184611022565b601f82111561124057805f5260205f20601f840160051c810160208510156112215750805b601f840160051c820191505b81811015610ece575f815560010161122d565b505050565b815167ffffffffffffffff81111561125f5761125f611090565b6112738161126d845461118c565b846111fc565b6020601f8211600181146112a5575f831561128e5750848201515b5f19600385901b1c1916600184901b178455610ece565b5f84815260208120601f198516915b828110156112d457878501518255602094850194600190920191016112b4565b50848210156112f157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82518060208501845e5f92019182525091905056fe60a060405234801561000f575f5ffd5b5060405161080138038061080183398101604081905261002e9161003f565b6001600160a01b031660805261006c565b5f6020828403121561004f575f5ffd5b81516001600160a01b0381168114610065575f5ffd5b9392505050565b60805161075a6100a75f395f818161011e01528181610162015281816102140152818161034801528181610371015261048c015261075a5ff3fe60806040526004361061004d575f3560e01c80633659cfe6146100645780634f1ef286146100835780635c60da1b14610096578063d1f57894146100c6578063f851a440146100d95761005c565b3661005c5761005a6100ed565b005b61005a6100ed565b34801561006f575f5ffd5b5061005a61007e366004610530565b610114565b61005a610091366004610550565b610158565b3480156100a1575f5ffd5b506100aa610209565b6040516001600160a01b03909116815260200160405180910390f35b61005a6100d43660046105e2565b610258565b3480156100e4575f5ffd5b506100aa61033d565b6100f5610393565b61011261010d5f5160206107055f395f51905f525490565b61039b565b565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101505761014d816103b9565b50565b61014d6100ed565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101fc57610191836103b9565b5f836001600160a01b031683836040516101ac9291906106a6565b5f60405180830381855af49150503d805f81146101e4576040519150601f19603f3d011682016040523d82523d5f602084013e6101e9565b606091505b50509050806101f6575f5ffd5b50505050565b6102046100ed565b505050565b5f6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361024d57505f5160206107055f395f51905f525490565b6102556100ed565b90565b5f61026e5f5160206107055f395f51905f525490565b6001600160a01b031614610280575f5ffd5b6102ab60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd6106b5565b5f5160206107055f395f51905f52146102c6576102c66106da565b6102cf826103f8565b805115610339575f826001600160a01b0316826040516102ef91906106ee565b5f60405180830381855af49150503d805f8114610327576040519150601f19603f3d011682016040523d82523d5f602084013e61032c565b606091505b5050905080610204575f5ffd5b5050565b5f6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361024d57507f000000000000000000000000000000000000000000000000000000000000000090565b610112610482565b365f5f375f5f365f845af43d5f5f3e8080156103b5573d5ff35b3d5ffd5b6103c2816103f8565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b803b6104715760405162461bcd60e51b815260206004820152603b60248201527f43616e6e6f742073657420612070726f787920696d706c656d656e746174696f60448201527f6e20746f2061206e6f6e2d636f6e74726163742061646472657373000000000060648201526084015b60405180910390fd5b5f5160206107055f395f51905f5255565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101125760405162461bcd60e51b815260206004820152603260248201527f43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e20667260448201527137b6903a343290383937bc3c9030b236b4b760711b6064820152608401610468565b80356001600160a01b038116811461052b575f5ffd5b919050565b5f60208284031215610540575f5ffd5b61054982610515565b9392505050565b5f5f5f60408486031215610562575f5ffd5b61056b84610515565b9250602084013567ffffffffffffffff811115610586575f5ffd5b8401601f81018613610596575f5ffd5b803567ffffffffffffffff8111156105ac575f5ffd5b8660208284010111156105bd575f5ffd5b939660209190910195509293505050565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156105f3575f5ffd5b6105fc83610515565b9150602083013567ffffffffffffffff811115610617575f5ffd5b8301601f81018513610627575f5ffd5b803567ffffffffffffffff811115610641576106416105ce565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610670576106706105ce565b604052818152828201602001871015610687575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b818382375f9101908152919050565b818103818111156106d457634e487b7160e01b5f52601160045260245ffd5b92915050565b634e487b7160e01b5f52600160045260245ffd5b5f82518060208501845e5f92019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca264697066735822122080e617903faf14aad845aa123719087f8e459456ce60a20e3beaf8b1f8a39ce264736f6c634300081c0033a264697066735822122086a707e7c3576042df6d4ad3b05e7e387ed500fac282c1bc499e4d7a6f1cf37064736f6c634300081c00338be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e000000000000000000000000000000000000000000000000000000000000000400000000000000000000000006cde8862969dd6db76ae4320bf60d1abd1b069dc00000000000000000000000000000000000000000000000000000000000000047465737400000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561000f575f5ffd5b506004361061013d575f3560e01c806376d84ffc116100b4578063e4ca28b711610079578063e4ca28b71461039b578063e860accb146103ae578063ed301ca9146103f6578063f2fde38b14610409578063f67b18471461041c578063fca513a81461042f575f5ffd5b806376d84ffc1461033f5780638da5cb5b14610352578063a156440614610362578063ca446dd914610375578063e44e9ed114610388575f5ffd5b80635dcc528c116101055780635dcc528c1461022f5780635eb88d3d14610242578063631adfca14610292578063707cd716146102de578063715018a61461032457806374944cec1461032c575f5ffd5b8063026b1d5f146101415780630e67178c1461019957806321f8a721146101dd578063530e784f14610205578063568ef4701461021a575b5f5ffd5b631413d3d360e21b5f5260026020527f4fe005067814bb4b024d9515847377d15011b64593c006223b4a722952d2c05a546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b6820a1a62fa0a226a4a760b91b5f5260026020527ffab167ad2009dcb80ee379700bb4bd029d97c1181ed9d961625632c8a6f051c6546001600160a01b031661017c565b61017c6101eb366004610fd5565b5f908152600260205260409020546001600160a01b031690565b610218610213366004611000565b610476565b005b61022261052f565b6040516101909190611050565b61021861023d366004611062565b6105bf565b7414149250d157d3d49050d31157d4d1539512539153605a1b5f5260026020527f0d2c1bcee56447b4f46248272f34207a580a5c40f666a31f4e2fbb470ea53ab8546001600160a01b031661017c565b702827a7a62fa1a7a72324a3aaa920aa27a960791b5f5260026020527f90c127ef1c12c03f5781afeca3079527ea5333738078bba6fea26825bf9bf2c5546001600160a01b031661017c565b6a20a1a62fa6a0a720a3a2a960a91b5f5260026020527f9edef266ef35fd0c6e131df0f31a330f3dd4c4d19dd31ed615c21d005c68116b546001600160a01b031661017c565b610218610662565b61021861033a366004611000565b6106d3565b61021861034d366004611000565b61078c565b5f546001600160a01b031661017c565b610218610370366004611000565b610839565b610218610383366004611062565b6108ca565b610218610396366004611000565b610950565b6102186103a9366004611000565b610a01565b6c2220aa20afa82927ab24a222a960991b5f5260026020527fcd7944601aaa5cd7ccdae1bebec659e98c6aac8f12486b30e59db0d39698051f546001600160a01b031661017c565b610218610404366004611000565b610aac565b610218610417366004611000565b610b5b565b61021861042a3660046110a4565b610c42565b6b50524943455f4f5241434c4560a01b5f5260026020527f740f710666bd7a12af42df98311e541e47f7fd33d382d11602457a6d540cbd63546001600160a01b031661017c565b5f546001600160a01b031633146104a85760405162461bcd60e51b815260040161049f90611157565b60405180910390fd5b6b50524943455f4f5241434c4560a01b5f90815260026020527f740f710666bd7a12af42df98311e541e47f7fd33d382d11602457a6d540cbd6380546001600160a01b038481166001600160a01b03198316811790935560405191169283917f56b5f80d8cac1479698aa7d01605fd6111e90b15fc4d2b377417f46034876cbd9190a35050565b60606001805461053e9061118c565b80601f016020809104026020016040519081016040528092919081815260200182805461056a9061118c565b80156105b55780601f1061058c576101008083540402835291602001916105b5565b820191905f5260205f20905b81548152906001019060200180831161059857829003601f168201915b5050505050905090565b5f546001600160a01b031633146105e85760405162461bcd60e51b815260040161049f90611157565b5f828152600260205260408120546001600160a01b03169061060984610c77565b90506106158484610d0e565b6040516001600160a01b038281168252808516919084169086907f3bbd45b5429b385e3fb37ad5cd1cd1435a3c8ec32196c7937597365a3fd3e99c9060200160405180910390a450505050565b5f546001600160a01b0316331461068b5760405162461bcd60e51b815260040161049f90611157565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f546001600160a01b031633146106fc5760405162461bcd60e51b815260040161049f90611157565b7414149250d157d3d49050d31157d4d1539512539153605a1b5f90815260026020527f0d2c1bcee56447b4f46248272f34207a580a5c40f666a31f4e2fbb470ea53ab880546001600160a01b038481166001600160a01b03198316811790935560405191169283917f5326514eeca90494a14bedabcff812a0e683029ee85d1e23824d44fd14cd6ae79190a35050565b5f546001600160a01b031633146107b55760405162461bcd60e51b815260040161049f90611157565b6820a1a62fa0a226a4a760b91b5f90815260026020527ffab167ad2009dcb80ee379700bb4bd029d97c1181ed9d961625632c8a6f051c680546001600160a01b038481166001600160a01b03198316811790935560405191169283917fe9cf53972264dc95304fd424458745019ddfca0e37ae8f703d74772c41ad115b9190a35050565b5f546001600160a01b031633146108625760405162461bcd60e51b815260040161049f90611157565b5f610873631413d3d360e21b610c77565b9050610886631413d3d360e21b83610d0e565b816001600160a01b0316816001600160a01b03167f90affc163f1a2dfedcd36aa02ed992eeeba8100a4014f0b4cdc20ea265a6662760405160405180910390a35050565b5f546001600160a01b031633146108f35760405162461bcd60e51b815260040161049f90611157565b5f8281526002602052604080822080546001600160a01b031981166001600160a01b038681169182179093559251911692839186917f9ef0e8c8e52743bb38b83b17d9429141d494b8041ca6d616a6c77cebae9cd8b791a4505050565b5f546001600160a01b031633146109795760405162461bcd60e51b815260040161049f90611157565b6c2220aa20afa82927ab24a222a960991b5f90815260026020527fcd7944601aaa5cd7ccdae1bebec659e98c6aac8f12486b30e59db0d39698051f80546001600160a01b038481166001600160a01b03198316811790935560405191169283917fc853974cfbf81487a14a23565917bee63f527853bcb5fa54f2ae1cdf8a38356d9190a35050565b5f546001600160a01b03163314610a2a5760405162461bcd60e51b815260040161049f90611157565b5f610a48702827a7a62fa1a7a72324a3aaa920aa27a960791b610c77565b9050610a68702827a7a62fa1a7a72324a3aaa920aa27a960791b83610d0e565b816001600160a01b0316816001600160a01b03167f8932892569eba59c8382a089d9b732d1f49272878775235761a2a6b0309cd46560405160405180910390a35050565b5f546001600160a01b03163314610ad55760405162461bcd60e51b815260040161049f90611157565b6a20a1a62fa6a0a720a3a2a960a91b5f90815260026020527f9edef266ef35fd0c6e131df0f31a330f3dd4c4d19dd31ed615c21d005c68116b80546001600160a01b038481166001600160a01b03198316811790935560405191169283917fb30efa04327bb8a537d61cc1e5c48095345ad18ef7cc04e6bacf7dfb6caaf5079190a35050565b5f546001600160a01b03163314610b845760405162461bcd60e51b815260040161049f90611157565b6001600160a01b038116610be95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161049f565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b03163314610c6b5760405162461bcd60e51b815260040161049f90611157565b610c7481610ed5565b50565b5f818152600260205260408120546001600160a01b031680610c9b57505f92915050565b5f819050806001600160a01b0316635c60da1b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610cdc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d0091906111be565b949350505050565b50919050565b5f828152600260205260408082205490513060248201526001600160a01b039091169190819060440160408051601f198184030181529190526020810180516001600160e01b031663189acdbd60e31b17905290506001600160a01b038316610e6f5730604051610d7e90610fc8565b6001600160a01b039091168152602001604051809103905ff080158015610da7573d5f5f3e3d5ffd5b505f868152600260205260409081902080546001600160a01b0319166001600160a01b038416908117909155905163347d5e2560e21b81529194508493509063d1f5789490610dfc90879085906004016111d9565b5f604051808303815f87803b158015610e13575f5ffd5b505af1158015610e25573d5f5f3e3d5ffd5b50505050836001600160a01b0316836001600160a01b0316867f4a465a9bd819d9662563c1e11ae958f8109e437e7f4bf1c6ef0b9a7b3f35d47860405160405180910390a4610ece565b60405163278f794360e11b81528392506001600160a01b03831690634f1ef28690610ea090879085906004016111d9565b5f604051808303815f87803b158015610eb7575f5ffd5b505af1158015610ec9573d5f5f3e3d5ffd5b505050505b5050505050565b5f60018054610ee39061118c565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0f9061118c565b8015610f5a5780601f10610f3157610100808354040283529160200191610f5a565b820191905f5260205f20905b815481529060010190602001808311610f3d57829003601f168201915b505050505090508160019081610f709190611245565b5081604051610f7f9190611300565b604051809103902081604051610f959190611300565b604051908190038120907fe685c8cdecc6030c45030fd54778812cb84ed8e4467c38294403d68ba7860823905f90a35050565b6108018061131783390190565b5f60208284031215610fe5575f5ffd5b5035919050565b6001600160a01b0381168114610c74575f5ffd5b5f60208284031215611010575f5ffd5b813561101b81610fec565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61101b6020830184611022565b5f5f60408385031215611073575f5ffd5b82359150602083013561108581610fec565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156110b4575f5ffd5b813567ffffffffffffffff8111156110ca575f5ffd5b8201601f810184136110da575f5ffd5b803567ffffffffffffffff8111156110f4576110f4611090565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561112357611123611090565b60405281815282820160200186101561113a575f5ffd5b816020840160208301375f91810160200191909152949350505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806111a057607f821691505b602082108103610d0857634e487b7160e01b5f52602260045260245ffd5b5f602082840312156111ce575f5ffd5b815161101b81610fec565b6001600160a01b03831681526040602082018190525f90610d0090830184611022565b601f82111561124057805f5260205f20601f840160051c810160208510156112215750805b601f840160051c820191505b81811015610ece575f815560010161122d565b505050565b815167ffffffffffffffff81111561125f5761125f611090565b6112738161126d845461118c565b846111fc565b6020601f8211600181146112a5575f831561128e5750848201515b5f19600385901b1c1916600184901b178455610ece565b5f84815260208120601f198516915b828110156112d457878501518255602094850194600190920191016112b4565b50848210156112f157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82518060208501845e5f92019182525091905056fe60a060405234801561000f575f5ffd5b5060405161080138038061080183398101604081905261002e9161003f565b6001600160a01b031660805261006c565b5f6020828403121561004f575f5ffd5b81516001600160a01b0381168114610065575f5ffd5b9392505050565b60805161075a6100a75f395f818161011e01528181610162015281816102140152818161034801528181610371015261048c015261075a5ff3fe60806040526004361061004d575f3560e01c80633659cfe6146100645780634f1ef286146100835780635c60da1b14610096578063d1f57894146100c6578063f851a440146100d95761005c565b3661005c5761005a6100ed565b005b61005a6100ed565b34801561006f575f5ffd5b5061005a61007e366004610530565b610114565b61005a610091366004610550565b610158565b3480156100a1575f5ffd5b506100aa610209565b6040516001600160a01b03909116815260200160405180910390f35b61005a6100d43660046105e2565b610258565b3480156100e4575f5ffd5b506100aa61033d565b6100f5610393565b61011261010d5f5160206107055f395f51905f525490565b61039b565b565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101505761014d816103b9565b50565b61014d6100ed565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101fc57610191836103b9565b5f836001600160a01b031683836040516101ac9291906106a6565b5f60405180830381855af49150503d805f81146101e4576040519150601f19603f3d011682016040523d82523d5f602084013e6101e9565b606091505b50509050806101f6575f5ffd5b50505050565b6102046100ed565b505050565b5f6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361024d57505f5160206107055f395f51905f525490565b6102556100ed565b90565b5f61026e5f5160206107055f395f51905f525490565b6001600160a01b031614610280575f5ffd5b6102ab60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd6106b5565b5f5160206107055f395f51905f52146102c6576102c66106da565b6102cf826103f8565b805115610339575f826001600160a01b0316826040516102ef91906106ee565b5f60405180830381855af49150503d805f8114610327576040519150601f19603f3d011682016040523d82523d5f602084013e61032c565b606091505b5050905080610204575f5ffd5b5050565b5f6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361024d57507f000000000000000000000000000000000000000000000000000000000000000090565b610112610482565b365f5f375f5f365f845af43d5f5f3e8080156103b5573d5ff35b3d5ffd5b6103c2816103f8565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b803b6104715760405162461bcd60e51b815260206004820152603b60248201527f43616e6e6f742073657420612070726f787920696d706c656d656e746174696f60448201527f6e20746f2061206e6f6e2d636f6e74726163742061646472657373000000000060648201526084015b60405180910390fd5b5f5160206107055f395f51905f5255565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101125760405162461bcd60e51b815260206004820152603260248201527f43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e20667260448201527137b6903a343290383937bc3c9030b236b4b760711b6064820152608401610468565b80356001600160a01b038116811461052b575f5ffd5b919050565b5f60208284031215610540575f5ffd5b61054982610515565b9392505050565b5f5f5f60408486031215610562575f5ffd5b61056b84610515565b9250602084013567ffffffffffffffff811115610586575f5ffd5b8401601f81018613610596575f5ffd5b803567ffffffffffffffff8111156105ac575f5ffd5b8660208284010111156105bd575f5ffd5b939660209190910195509293505050565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156105f3575f5ffd5b6105fc83610515565b9150602083013567ffffffffffffffff811115610617575f5ffd5b8301601f81018513610627575f5ffd5b803567ffffffffffffffff811115610641576106416105ce565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610670576106706105ce565b604052818152828201602001871015610687575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b818382375f9101908152919050565b818103818111156106d457634e487b7160e01b5f52601160045260245ffd5b92915050565b634e487b7160e01b5f52600160045260245ffd5b5f82518060208501845e5f92019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca264697066735822122080e617903faf14aad845aa123719087f8e459456ce60a20e3beaf8b1f8a39ce264736f6c634300081c0033a264697066735822122086a707e7c3576042df6d4ad3b05e7e387ed500fac282c1bc499e4d7a6f1cf37064736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000006cde8862969dd6db76ae4320bf60d1abd1b069dc00000000000000000000000000000000000000000000000000000000000000047465737400000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : marketId (string): test
Arg [1] : owner (address): 0x6cdE8862969dd6db76Ae4320bF60D1aBD1b069dC
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000006cde8862969dd6db76ae4320bf60d1abd1b069dc
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [3] : 7465737400000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.