Overview
xDAI Balance
0 xDAI
xDAI Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 4 internal transactions
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
30293057 | 374 days ago | Contract Creation | 0 xDAI | |||
30293057 | 374 days ago | Contract Creation | 0 xDAI | |||
30293057 | 374 days ago | Contract Creation | 0 xDAI | |||
30293054 | 374 days ago | Contract Creation | 0 xDAI |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
PoolAddressesProvider
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import {Ownable} from '../../dependencies/openzeppelin/contracts/Ownable.sol'; import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol'; import {InitializableImmutableAdminUpgradeabilityProxy} from '../libraries/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 // 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); } } } }
// 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 './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.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 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(); } /** * @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.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 {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 {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(); } }
{ "remappings": [ "aave-v3-core/=src/core/", "aave-v3-periphery/=src/periphery/", "aave-collector-unification/=lib/aave-collector-unification/", "solidity-utils/=lib/solidity-utils/src/", "aave-helpers/=lib/aave-helpers/src/", "aave-address-book/=lib/aave-address-book/src/", "forge-std/=lib/forge-std/src/", "ds-test/=lib/forge-std/lib/ds-test/src/", "@aave/core-v2/=lib/aave-collector-unification/lib/protocol-v2/", "@aave/core-v3/=lib/aave-address-book/lib/aave-v3-core/", "@aave/periphery-v3/=lib/aave-address-book/lib/aave-v3-periphery/", "governance-crosschain-bridges/=lib/aave-helpers/lib/governance-crosschain-bridges/", "protocol-v2/=lib/aave-collector-unification/lib/protocol-v2/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "libraries": { "src/core/contracts/protocol/libraries/logic/BorrowLogic.sol": { "BorrowLogic": "0xB64D41e260D21E9976acF420A9846aB7C76cCbF2" }, "src/core/contracts/protocol/libraries/logic/BridgeLogic.sol": { "BridgeLogic": "0x86635418D1F55C26EEa3EDf9AD60De7D11E515Fe" }, "src/core/contracts/protocol/libraries/logic/ConfiguratorLogic.sol": { "ConfiguratorLogic": "0x0a5996586813d614f138E8E51A38435Ac65D9FaC" }, "src/core/contracts/protocol/libraries/logic/EModeLogic.sol": { "EModeLogic": "0x28DB20A0E2123a286191D267045483dA890dAea3" }, "src/core/contracts/protocol/libraries/logic/FlashLoanLogic.sol": { "FlashLoanLogic": "0xd633446d5A5ae4480baEd3a8a370af9fbe97a9Dc" }, "src/core/contracts/protocol/libraries/logic/LiquidationLogic.sol": { "LiquidationLogic": "0xf36B25a326b3bB7004Af81f16c778c293974B1ad" }, "src/core/contracts/protocol/libraries/logic/PoolLogic.sol": { "PoolLogic": "0xfA7d21e571EE900C7Df8880417aE50224fAF9EF9" }, "src/core/contracts/protocol/libraries/logic/SupplyLogic.sol": { "SupplyLogic": "0x7307CCE2d4DF0f3529b8E018A47dF51257271f9a" } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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
60806040523480156200001157600080fd5b5060405162002071380380620020718339810160408190526200003491620002f1565b600080546001600160a01b0319163390811782556040519091829160008051602062002051833981519152908290a3506200006f8262000082565b6200007a8162000187565b505062000537565b6000600180546200009390620003be565b80601f0160208091040260200160405190810160405280929190818152602001828054620000c190620003be565b8015620001125780601f10620000e65761010080835404028352916020019162000112565b820191906000526020600020905b815481529060010190602001808311620000f457829003601f168201915b5050505050905081600190816200012a91906200044d565b50816040516200013b919062000519565b60405180910390208160405162000153919062000519565b604051908190038120907fe685c8cdecc6030c45030fd54778812cb84ed8e4467c38294403d68ba786082390600090a35050565b6000546001600160a01b03163314620001e75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b0381166200024e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620001de565b600080546040516001600160a01b03808516939216916000805160206200205183398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620002cb578181015183820152602001620002b1565b50506000910152565b80516001600160a01b0381168114620002ec57600080fd5b919050565b600080604083850312156200030557600080fd5b82516001600160401b03808211156200031d57600080fd5b818501915085601f8301126200033257600080fd5b81518181111562000347576200034762000298565b604051601f8201601f19908116603f0116810190838211818310171562000372576200037262000298565b816040528281528860208487010111156200038c57600080fd5b6200039f836020830160208801620002ae565b8096505050505050620003b560208401620002d4565b90509250929050565b600181811c90821680620003d357607f821691505b602082108103620003f457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200044857600081815260208120601f850160051c81016020861015620004235750805b601f850160051c820191505b8181101562000444578281556001016200042f565b5050505b505050565b81516001600160401b0381111562000469576200046962000298565b62000481816200047a8454620003be565b84620003fa565b602080601f831160018114620004b95760008415620004a05750858301515b600019600386901b1c1916600185901b17855562000444565b600085815260208120601f198616915b82811015620004ea57888601518255948401946001909101908401620004c9565b5085821015620005095787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082516200052d818460208701620002ae565b9190910192915050565b611b0a80620005476000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806376d84ffc116100b8578063e4ca28b71161007c578063e4ca28b714610254578063e860accb14610267578063ed301ca91461026f578063f2fde38b14610282578063f67b184714610295578063fca513a8146102a857600080fd5b806376d84ffc146101f75780638da5cb5b1461020a578063a15644061461021b578063ca446dd91461022e578063e44e9ed11461024157600080fd5b80635dcc528c1161010a5780635dcc528c146101b15780635eb88d3d146101c4578063631adfca146101cc578063707cd716146101d4578063715018a6146101dc57806374944cec146101e457600080fd5b8063026b1d5f146101475780630e67178c1461016c57806321f8a72114610174578063530e784f14610187578063568ef4701461019c575b600080fd5b61014f6102b0565b6040516001600160a01b0390911681526020015b60405180910390f35b61014f6102c7565b61014f610182366004610f18565b6102da565b61019a610195366004610f46565b6102f5565b005b6101a46103b0565b6040516101639190610fba565b61019a6101bf366004610fcd565b610442565b61014f6104e7565b61014f61050a565b61014f610529565b61019a610542565b61019a6101f2366004610f46565b6105b6565b61019a610205366004610f46565b610671565b6000546001600160a01b031661014f565b61019a610229366004610f46565b610720565b61019a61023c366004610fcd565b6107b3565b61019a61024f366004610f46565b61083b565b61019a610262366004610f46565b6108ee565b61014f61099b565b61019a61027d366004610f46565b6109b6565b61019a610290366004610f46565b610a67565b61019a6102a3366004611013565b610b51565b61014f610b87565b60006102c2631413d3d360e21b6102da565b905090565b60006102c26820a1a62fa0a226a4a760b91b5b6000908152600260205260409020546001600160a01b031690565b6000546001600160a01b031633146103285760405162461bcd60e51b815260040161031f906110c4565b60405180910390fd5b6b50524943455f4f5241434c4560a01b600090815260026020527f740f710666bd7a12af42df98311e541e47f7fd33d382d11602457a6d540cbd6380546001600160a01b038481166001600160a01b03198316811790935560405191169283917f56b5f80d8cac1479698aa7d01605fd6111e90b15fc4d2b377417f46034876cbd9190a35050565b6060600180546103bf906110f9565b80601f01602080910402602001604051908101604052809291908181526020018280546103eb906110f9565b80156104385780601f1061040d57610100808354040283529160200191610438565b820191906000526020600020905b81548152906001019060200180831161041b57829003601f168201915b5050505050905090565b6000546001600160a01b0316331461046c5760405162461bcd60e51b815260040161031f906110c4565b6000828152600260205260408120546001600160a01b03169061048e84610ba1565b905061049a8484610c3e565b6040516001600160a01b038281168252808516919084169086907f3bbd45b5429b385e3fb37ad5cd1cd1435a3c8ec32196c7937597365a3fd3e99c9060200160405180910390a450505050565b60006102c27414149250d157d3d49050d31157d4d1539512539153605a1b6102da565b60006102c2702827a7a62fa1a7a72324a3aaa920aa27a960791b6102da565b60006102c26a20a1a62fa6a0a720a3a2a960a91b6102da565b6000546001600160a01b0316331461056c5760405162461bcd60e51b815260040161031f906110c4565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146105e05760405162461bcd60e51b815260040161031f906110c4565b7414149250d157d3d49050d31157d4d1539512539153605a1b600090815260026020527f0d2c1bcee56447b4f46248272f34207a580a5c40f666a31f4e2fbb470ea53ab880546001600160a01b038481166001600160a01b03198316811790935560405191169283917f5326514eeca90494a14bedabcff812a0e683029ee85d1e23824d44fd14cd6ae79190a35050565b6000546001600160a01b0316331461069b5760405162461bcd60e51b815260040161031f906110c4565b6820a1a62fa0a226a4a760b91b600090815260026020527ffab167ad2009dcb80ee379700bb4bd029d97c1181ed9d961625632c8a6f051c680546001600160a01b038481166001600160a01b03198316811790935560405191169283917fe9cf53972264dc95304fd424458745019ddfca0e37ae8f703d74772c41ad115b9190a35050565b6000546001600160a01b0316331461074a5760405162461bcd60e51b815260040161031f906110c4565b600061075c631413d3d360e21b610ba1565b905061076f631413d3d360e21b83610c3e565b816001600160a01b0316816001600160a01b03167f90affc163f1a2dfedcd36aa02ed992eeeba8100a4014f0b4cdc20ea265a6662760405160405180910390a35050565b6000546001600160a01b031633146107dd5760405162461bcd60e51b815260040161031f906110c4565b60008281526002602052604080822080546001600160a01b031981166001600160a01b038681169182179093559251911692839186917f9ef0e8c8e52743bb38b83b17d9429141d494b8041ca6d616a6c77cebae9cd8b791a4505050565b6000546001600160a01b031633146108655760405162461bcd60e51b815260040161031f906110c4565b6c2220aa20afa82927ab24a222a960991b600090815260026020527fcd7944601aaa5cd7ccdae1bebec659e98c6aac8f12486b30e59db0d39698051f80546001600160a01b038481166001600160a01b03198316811790935560405191169283917fc853974cfbf81487a14a23565917bee63f527853bcb5fa54f2ae1cdf8a38356d9190a35050565b6000546001600160a01b031633146109185760405162461bcd60e51b815260040161031f906110c4565b6000610937702827a7a62fa1a7a72324a3aaa920aa27a960791b610ba1565b9050610957702827a7a62fa1a7a72324a3aaa920aa27a960791b83610c3e565b816001600160a01b0316816001600160a01b03167f8932892569eba59c8382a089d9b732d1f49272878775235761a2a6b0309cd46560405160405180910390a35050565b60006102c26c2220aa20afa82927ab24a222a960991b6102da565b6000546001600160a01b031633146109e05760405162461bcd60e51b815260040161031f906110c4565b6a20a1a62fa6a0a720a3a2a960a91b600090815260026020527f9edef266ef35fd0c6e131df0f31a330f3dd4c4d19dd31ed615c21d005c68116b80546001600160a01b038481166001600160a01b03198316811790935560405191169283917fb30efa04327bb8a537d61cc1e5c48095345ad18ef7cc04e6bacf7dfb6caaf5079190a35050565b6000546001600160a01b03163314610a915760405162461bcd60e51b815260040161031f906110c4565b6001600160a01b038116610af65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161031f565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610b7b5760405162461bcd60e51b815260040161031f906110c4565b610b8481610e14565b50565b60006102c26b50524943455f4f5241434c4560a01b6102da565b6000818152600260205260408120546001600160a01b031680610bc75750600092915050565b6000819050806001600160a01b0316635c60da1b6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610c0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c30919061112d565b949350505050565b50919050565b6000828152600260205260408082205490513060248201526001600160a01b039091169190819060440160408051601f198184030181529190526020810180516001600160e01b031663189acdbd60e31b17905290506001600160a01b038316610da95730604051610caf90610f0b565b6001600160a01b039091168152602001604051809103906000f080158015610cdb573d6000803e3d6000fd5b506000868152600260205260409081902080546001600160a01b0319166001600160a01b038416908117909155905163347d5e2560e21b81529194508493509063d1f5789490610d31908790859060040161114a565b600060405180830381600087803b158015610d4b57600080fd5b505af1158015610d5f573d6000803e3d6000fd5b50505050836001600160a01b0316836001600160a01b0316867f4a465a9bd819d9662563c1e11ae958f8109e437e7f4bf1c6ef0b9a7b3f35d47860405160405180910390a4610e0d565b60405163278f794360e11b81528392506001600160a01b03831690634f1ef28690610dda908790859060040161114a565b600060405180830381600087803b158015610df457600080fd5b505af1158015610e08573d6000803e3d6000fd5b505050505b5050505050565b600060018054610e23906110f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4f906110f9565b8015610e9c5780601f10610e7157610100808354040283529160200191610e9c565b820191906000526020600020905b815481529060010190602001808311610e7f57829003601f168201915b505050505090508160019081610eb291906111bd565b5081604051610ec1919061127d565b604051809103902081604051610ed7919061127d565b604051908190038120907fe685c8cdecc6030c45030fd54778812cb84ed8e4467c38294403d68ba786082390600090a35050565b61083b8061129a83390190565b600060208284031215610f2a57600080fd5b5035919050565b6001600160a01b0381168114610b8457600080fd5b600060208284031215610f5857600080fd5b8135610f6381610f31565b9392505050565b60005b83811015610f85578181015183820152602001610f6d565b50506000910152565b60008151808452610fa6816020860160208601610f6a565b601f01601f19169290920160200192915050565b602081526000610f636020830184610f8e565b60008060408385031215610fe057600080fd5b823591506020830135610ff281610f31565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561102557600080fd5b813567ffffffffffffffff8082111561103d57600080fd5b818401915084601f83011261105157600080fd5b81358181111561106357611063610ffd565b604051601f8201601f19908116603f0116810190838211818310171561108b5761108b610ffd565b816040528281528760208487010111156110a457600080fd5b826020860160208301376000928101602001929092525095945050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061110d57607f821691505b602082108103610c3857634e487b7160e01b600052602260045260246000fd5b60006020828403121561113f57600080fd5b8151610f6381610f31565b6001600160a01b0383168152604060208201819052600090610c3090830184610f8e565b601f8211156111b857600081815260208120601f850160051c810160208610156111955750805b601f850160051c820191505b818110156111b4578281556001016111a1565b5050505b505050565b815167ffffffffffffffff8111156111d7576111d7610ffd565b6111eb816111e584546110f9565b8461116e565b602080601f83116001811461122057600084156112085750858301515b600019600386901b1c1916600185901b1785556111b4565b600085815260208120601f198616915b8281101561124f57888601518255948401946001909101908401611230565b508582101561126d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000825161128f818460208701610f6a565b919091019291505056fe60a060405234801561001057600080fd5b5060405161083b38038061083b83398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b60805161078d6100ae60003960008181610112015281816101560152818161020e0152818161034d015281816103760152610499015261078d6000f3fe60806040526004361061004a5760003560e01c80633659cfe6146100545780634f1ef286146100745780635c60da1b14610087578063d1f57894146100b8578063f851a440146100cb575b6100526100e0565b005b34801561006057600080fd5b5061005261006f36600461053e565b610108565b610052610082366004610560565b61014c565b34801561009357600080fd5b5061009c610202565b6040516001600160a01b03909116815260200160405180910390f35b6100526100c63660046105f9565b610253565b3480156100d757600080fd5b5061009c610341565b6100e8610398565b6101066101016000805160206107388339815191525490565b6103a0565b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361014457610141816103c4565b50565b6101416100e0565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101f557610185836103c4565b6000836001600160a01b031683836040516101a19291906106bb565b600060405180830381855af49150503d80600081146101dc576040519150601f19603f3d011682016040523d82523d6000602084013e6101e1565b606091505b50509050806101ef57600080fd5b50505050565b6101fd6100e0565b505050565b60006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361024857506000805160206107388339815191525490565b6102506100e0565b90565b600061026b6000805160206107388339815191525490565b6001600160a01b03161461027e57600080fd5b6102a960017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd6106cb565b600080516020610738833981519152146102c5576102c56106f2565b6102ce82610404565b80511561033d576000826001600160a01b0316826040516102ef9190610708565b600060405180830381855af49150503d806000811461032a576040519150601f19603f3d011682016040523d82523d6000602084013e61032f565b606091505b50509050806101fd57600080fd5b5050565b60006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361024857507f000000000000000000000000000000000000000000000000000000000000000090565b61010661048f565b3660008037600080366000845af43d6000803e8080156103bf573d6000f35b3d6000fd5b6103cd81610404565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b803b61047d5760405162461bcd60e51b815260206004820152603b60248201527f43616e6e6f742073657420612070726f787920696d706c656d656e746174696f60448201527f6e20746f2061206e6f6e2d636f6e74726163742061646472657373000000000060648201526084015b60405180910390fd5b60008051602061073883398151915255565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101065760405162461bcd60e51b815260206004820152603260248201527f43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e20667260448201527137b6903a343290383937bc3c9030b236b4b760711b6064820152608401610474565b80356001600160a01b038116811461053957600080fd5b919050565b60006020828403121561055057600080fd5b61055982610522565b9392505050565b60008060006040848603121561057557600080fd5b61057e84610522565b9250602084013567ffffffffffffffff8082111561059b57600080fd5b818601915086601f8301126105af57600080fd5b8135818111156105be57600080fd5b8760208285010111156105d057600080fd5b6020830194508093505050509250925092565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561060c57600080fd5b61061583610522565b9150602083013567ffffffffffffffff8082111561063257600080fd5b818501915085601f83011261064657600080fd5b813581811115610658576106586105e3565b604051601f8201601f19908116603f01168101908382118183101715610680576106806105e3565b8160405282815288602084870101111561069957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b8183823760009101908152919050565b818103818111156106ec57634e487b7160e01b600052601160045260246000fd5b92915050565b634e487b7160e01b600052600160045260246000fd5b6000825160005b81811015610729576020818601810151858301520161070f565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220c2739b6c7a5c189b6ae3e090b765ee0e5cf43e02c5f695572aa25c4c8f68cc1b64736f6c63430008130033a26469706673582212209c8a684768abe9832467dd1b1faeea7aec090cb58c6c070a7796e27faf869dc664736f6c634300081300338be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000c08c599c22bfd4a729e33e1ed9b49456abad000500000000000000000000000000000000000000000000000000000000000000154161766520563320476e6f736973204d61726b65740000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101425760003560e01c806376d84ffc116100b8578063e4ca28b71161007c578063e4ca28b714610254578063e860accb14610267578063ed301ca91461026f578063f2fde38b14610282578063f67b184714610295578063fca513a8146102a857600080fd5b806376d84ffc146101f75780638da5cb5b1461020a578063a15644061461021b578063ca446dd91461022e578063e44e9ed11461024157600080fd5b80635dcc528c1161010a5780635dcc528c146101b15780635eb88d3d146101c4578063631adfca146101cc578063707cd716146101d4578063715018a6146101dc57806374944cec146101e457600080fd5b8063026b1d5f146101475780630e67178c1461016c57806321f8a72114610174578063530e784f14610187578063568ef4701461019c575b600080fd5b61014f6102b0565b6040516001600160a01b0390911681526020015b60405180910390f35b61014f6102c7565b61014f610182366004610f18565b6102da565b61019a610195366004610f46565b6102f5565b005b6101a46103b0565b6040516101639190610fba565b61019a6101bf366004610fcd565b610442565b61014f6104e7565b61014f61050a565b61014f610529565b61019a610542565b61019a6101f2366004610f46565b6105b6565b61019a610205366004610f46565b610671565b6000546001600160a01b031661014f565b61019a610229366004610f46565b610720565b61019a61023c366004610fcd565b6107b3565b61019a61024f366004610f46565b61083b565b61019a610262366004610f46565b6108ee565b61014f61099b565b61019a61027d366004610f46565b6109b6565b61019a610290366004610f46565b610a67565b61019a6102a3366004611013565b610b51565b61014f610b87565b60006102c2631413d3d360e21b6102da565b905090565b60006102c26820a1a62fa0a226a4a760b91b5b6000908152600260205260409020546001600160a01b031690565b6000546001600160a01b031633146103285760405162461bcd60e51b815260040161031f906110c4565b60405180910390fd5b6b50524943455f4f5241434c4560a01b600090815260026020527f740f710666bd7a12af42df98311e541e47f7fd33d382d11602457a6d540cbd6380546001600160a01b038481166001600160a01b03198316811790935560405191169283917f56b5f80d8cac1479698aa7d01605fd6111e90b15fc4d2b377417f46034876cbd9190a35050565b6060600180546103bf906110f9565b80601f01602080910402602001604051908101604052809291908181526020018280546103eb906110f9565b80156104385780601f1061040d57610100808354040283529160200191610438565b820191906000526020600020905b81548152906001019060200180831161041b57829003601f168201915b5050505050905090565b6000546001600160a01b0316331461046c5760405162461bcd60e51b815260040161031f906110c4565b6000828152600260205260408120546001600160a01b03169061048e84610ba1565b905061049a8484610c3e565b6040516001600160a01b038281168252808516919084169086907f3bbd45b5429b385e3fb37ad5cd1cd1435a3c8ec32196c7937597365a3fd3e99c9060200160405180910390a450505050565b60006102c27414149250d157d3d49050d31157d4d1539512539153605a1b6102da565b60006102c2702827a7a62fa1a7a72324a3aaa920aa27a960791b6102da565b60006102c26a20a1a62fa6a0a720a3a2a960a91b6102da565b6000546001600160a01b0316331461056c5760405162461bcd60e51b815260040161031f906110c4565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146105e05760405162461bcd60e51b815260040161031f906110c4565b7414149250d157d3d49050d31157d4d1539512539153605a1b600090815260026020527f0d2c1bcee56447b4f46248272f34207a580a5c40f666a31f4e2fbb470ea53ab880546001600160a01b038481166001600160a01b03198316811790935560405191169283917f5326514eeca90494a14bedabcff812a0e683029ee85d1e23824d44fd14cd6ae79190a35050565b6000546001600160a01b0316331461069b5760405162461bcd60e51b815260040161031f906110c4565b6820a1a62fa0a226a4a760b91b600090815260026020527ffab167ad2009dcb80ee379700bb4bd029d97c1181ed9d961625632c8a6f051c680546001600160a01b038481166001600160a01b03198316811790935560405191169283917fe9cf53972264dc95304fd424458745019ddfca0e37ae8f703d74772c41ad115b9190a35050565b6000546001600160a01b0316331461074a5760405162461bcd60e51b815260040161031f906110c4565b600061075c631413d3d360e21b610ba1565b905061076f631413d3d360e21b83610c3e565b816001600160a01b0316816001600160a01b03167f90affc163f1a2dfedcd36aa02ed992eeeba8100a4014f0b4cdc20ea265a6662760405160405180910390a35050565b6000546001600160a01b031633146107dd5760405162461bcd60e51b815260040161031f906110c4565b60008281526002602052604080822080546001600160a01b031981166001600160a01b038681169182179093559251911692839186917f9ef0e8c8e52743bb38b83b17d9429141d494b8041ca6d616a6c77cebae9cd8b791a4505050565b6000546001600160a01b031633146108655760405162461bcd60e51b815260040161031f906110c4565b6c2220aa20afa82927ab24a222a960991b600090815260026020527fcd7944601aaa5cd7ccdae1bebec659e98c6aac8f12486b30e59db0d39698051f80546001600160a01b038481166001600160a01b03198316811790935560405191169283917fc853974cfbf81487a14a23565917bee63f527853bcb5fa54f2ae1cdf8a38356d9190a35050565b6000546001600160a01b031633146109185760405162461bcd60e51b815260040161031f906110c4565b6000610937702827a7a62fa1a7a72324a3aaa920aa27a960791b610ba1565b9050610957702827a7a62fa1a7a72324a3aaa920aa27a960791b83610c3e565b816001600160a01b0316816001600160a01b03167f8932892569eba59c8382a089d9b732d1f49272878775235761a2a6b0309cd46560405160405180910390a35050565b60006102c26c2220aa20afa82927ab24a222a960991b6102da565b6000546001600160a01b031633146109e05760405162461bcd60e51b815260040161031f906110c4565b6a20a1a62fa6a0a720a3a2a960a91b600090815260026020527f9edef266ef35fd0c6e131df0f31a330f3dd4c4d19dd31ed615c21d005c68116b80546001600160a01b038481166001600160a01b03198316811790935560405191169283917fb30efa04327bb8a537d61cc1e5c48095345ad18ef7cc04e6bacf7dfb6caaf5079190a35050565b6000546001600160a01b03163314610a915760405162461bcd60e51b815260040161031f906110c4565b6001600160a01b038116610af65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161031f565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610b7b5760405162461bcd60e51b815260040161031f906110c4565b610b8481610e14565b50565b60006102c26b50524943455f4f5241434c4560a01b6102da565b6000818152600260205260408120546001600160a01b031680610bc75750600092915050565b6000819050806001600160a01b0316635c60da1b6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610c0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c30919061112d565b949350505050565b50919050565b6000828152600260205260408082205490513060248201526001600160a01b039091169190819060440160408051601f198184030181529190526020810180516001600160e01b031663189acdbd60e31b17905290506001600160a01b038316610da95730604051610caf90610f0b565b6001600160a01b039091168152602001604051809103906000f080158015610cdb573d6000803e3d6000fd5b506000868152600260205260409081902080546001600160a01b0319166001600160a01b038416908117909155905163347d5e2560e21b81529194508493509063d1f5789490610d31908790859060040161114a565b600060405180830381600087803b158015610d4b57600080fd5b505af1158015610d5f573d6000803e3d6000fd5b50505050836001600160a01b0316836001600160a01b0316867f4a465a9bd819d9662563c1e11ae958f8109e437e7f4bf1c6ef0b9a7b3f35d47860405160405180910390a4610e0d565b60405163278f794360e11b81528392506001600160a01b03831690634f1ef28690610dda908790859060040161114a565b600060405180830381600087803b158015610df457600080fd5b505af1158015610e08573d6000803e3d6000fd5b505050505b5050505050565b600060018054610e23906110f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4f906110f9565b8015610e9c5780601f10610e7157610100808354040283529160200191610e9c565b820191906000526020600020905b815481529060010190602001808311610e7f57829003601f168201915b505050505090508160019081610eb291906111bd565b5081604051610ec1919061127d565b604051809103902081604051610ed7919061127d565b604051908190038120907fe685c8cdecc6030c45030fd54778812cb84ed8e4467c38294403d68ba786082390600090a35050565b61083b8061129a83390190565b600060208284031215610f2a57600080fd5b5035919050565b6001600160a01b0381168114610b8457600080fd5b600060208284031215610f5857600080fd5b8135610f6381610f31565b9392505050565b60005b83811015610f85578181015183820152602001610f6d565b50506000910152565b60008151808452610fa6816020860160208601610f6a565b601f01601f19169290920160200192915050565b602081526000610f636020830184610f8e565b60008060408385031215610fe057600080fd5b823591506020830135610ff281610f31565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561102557600080fd5b813567ffffffffffffffff8082111561103d57600080fd5b818401915084601f83011261105157600080fd5b81358181111561106357611063610ffd565b604051601f8201601f19908116603f0116810190838211818310171561108b5761108b610ffd565b816040528281528760208487010111156110a457600080fd5b826020860160208301376000928101602001929092525095945050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061110d57607f821691505b602082108103610c3857634e487b7160e01b600052602260045260246000fd5b60006020828403121561113f57600080fd5b8151610f6381610f31565b6001600160a01b0383168152604060208201819052600090610c3090830184610f8e565b601f8211156111b857600081815260208120601f850160051c810160208610156111955750805b601f850160051c820191505b818110156111b4578281556001016111a1565b5050505b505050565b815167ffffffffffffffff8111156111d7576111d7610ffd565b6111eb816111e584546110f9565b8461116e565b602080601f83116001811461122057600084156112085750858301515b600019600386901b1c1916600185901b1785556111b4565b600085815260208120601f198616915b8281101561124f57888601518255948401946001909101908401611230565b508582101561126d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000825161128f818460208701610f6a565b919091019291505056fe60a060405234801561001057600080fd5b5060405161083b38038061083b83398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b60805161078d6100ae60003960008181610112015281816101560152818161020e0152818161034d015281816103760152610499015261078d6000f3fe60806040526004361061004a5760003560e01c80633659cfe6146100545780634f1ef286146100745780635c60da1b14610087578063d1f57894146100b8578063f851a440146100cb575b6100526100e0565b005b34801561006057600080fd5b5061005261006f36600461053e565b610108565b610052610082366004610560565b61014c565b34801561009357600080fd5b5061009c610202565b6040516001600160a01b03909116815260200160405180910390f35b6100526100c63660046105f9565b610253565b3480156100d757600080fd5b5061009c610341565b6100e8610398565b6101066101016000805160206107388339815191525490565b6103a0565b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361014457610141816103c4565b50565b6101416100e0565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101f557610185836103c4565b6000836001600160a01b031683836040516101a19291906106bb565b600060405180830381855af49150503d80600081146101dc576040519150601f19603f3d011682016040523d82523d6000602084013e6101e1565b606091505b50509050806101ef57600080fd5b50505050565b6101fd6100e0565b505050565b60006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361024857506000805160206107388339815191525490565b6102506100e0565b90565b600061026b6000805160206107388339815191525490565b6001600160a01b03161461027e57600080fd5b6102a960017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd6106cb565b600080516020610738833981519152146102c5576102c56106f2565b6102ce82610404565b80511561033d576000826001600160a01b0316826040516102ef9190610708565b600060405180830381855af49150503d806000811461032a576040519150601f19603f3d011682016040523d82523d6000602084013e61032f565b606091505b50509050806101fd57600080fd5b5050565b60006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361024857507f000000000000000000000000000000000000000000000000000000000000000090565b61010661048f565b3660008037600080366000845af43d6000803e8080156103bf573d6000f35b3d6000fd5b6103cd81610404565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b803b61047d5760405162461bcd60e51b815260206004820152603b60248201527f43616e6e6f742073657420612070726f787920696d706c656d656e746174696f60448201527f6e20746f2061206e6f6e2d636f6e74726163742061646472657373000000000060648201526084015b60405180910390fd5b60008051602061073883398151915255565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101065760405162461bcd60e51b815260206004820152603260248201527f43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e20667260448201527137b6903a343290383937bc3c9030b236b4b760711b6064820152608401610474565b80356001600160a01b038116811461053957600080fd5b919050565b60006020828403121561055057600080fd5b61055982610522565b9392505050565b60008060006040848603121561057557600080fd5b61057e84610522565b9250602084013567ffffffffffffffff8082111561059b57600080fd5b818601915086601f8301126105af57600080fd5b8135818111156105be57600080fd5b8760208285010111156105d057600080fd5b6020830194508093505050509250925092565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561060c57600080fd5b61061583610522565b9150602083013567ffffffffffffffff8082111561063257600080fd5b818501915085601f83011261064657600080fd5b813581811115610658576106586105e3565b604051601f8201601f19908116603f01168101908382118183101715610680576106806105e3565b8160405282815288602084870101111561069957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b8183823760009101908152919050565b818103818111156106ec57634e487b7160e01b600052601160045260246000fd5b92915050565b634e487b7160e01b600052600160045260246000fd5b6000825160005b81811015610729576020818601810151858301520161070f565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220c2739b6c7a5c189b6ae3e090b765ee0e5cf43e02c5f695572aa25c4c8f68cc1b64736f6c63430008130033a26469706673582212209c8a684768abe9832467dd1b1faeea7aec090cb58c6c070a7796e27faf869dc664736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000c08c599c22bfd4a729e33e1ed9b49456abad000500000000000000000000000000000000000000000000000000000000000000154161766520563320476e6f736973204d61726b65740000000000000000000000
-----Decoded View---------------
Arg [0] : marketId (string): Aave V3 Gnosis Market
Arg [1] : owner (address): 0xC08C599C22bfD4a729E33e1Ed9b49456Abad0005
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 000000000000000000000000c08c599c22bfd4a729e33e1ed9b49456abad0005
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [3] : 4161766520563320476e6f736973204d61726b65740000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 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.