More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,410 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Call Component | 57150689 | 21 hrs ago | IN | 0 AVAX | 0.00007344 | ||||
Call Component | 57150687 | 21 hrs ago | IN | 0 AVAX | 0.00034591 | ||||
Call Component | 57150680 | 21 hrs ago | IN | 0 AVAX | 0.00021644 | ||||
Call Component | 57120494 | 37 hrs ago | IN | 0 AVAX | 0.00077062 | ||||
Call Component | 57120489 | 37 hrs ago | IN | 0 AVAX | 0.00097534 | ||||
Call Component | 57120486 | 37 hrs ago | IN | 0 AVAX | 0.00029724 | ||||
Call Component | 57120482 | 37 hrs ago | IN | 0 AVAX | 0.00074904 | ||||
Call Component | 57120477 | 37 hrs ago | IN | 0 AVAX | 0.00008045 | ||||
Call Component | 57120473 | 37 hrs ago | IN | 0 AVAX | 0.00026531 | ||||
Call Component | 57120461 | 37 hrs ago | IN | 0 AVAX | 0.00048815 | ||||
Call Component | 57069062 | 2 days ago | IN | 0 AVAX | 0.00066495 | ||||
Call Component | 57069058 | 2 days ago | IN | 0 AVAX | 0.00007344 | ||||
Call Component | 57069054 | 2 days ago | IN | 0 AVAX | 0.00020153 | ||||
Call Component | 57069044 | 2 days ago | IN | 0 AVAX | 0.00030458 | ||||
Call Component | 57018709 | 3 days ago | IN | 0 AVAX | 0.00057787 | ||||
Call Component | 57018705 | 3 days ago | IN | 0 AVAX | 0.00052908 | ||||
Call Component | 57018702 | 3 days ago | IN | 0 AVAX | 0.00007344 | ||||
Call Component | 57018700 | 3 days ago | IN | 0 AVAX | 0.000818 | ||||
Call Component | 57018693 | 3 days ago | IN | 0 AVAX | 0.00031206 | ||||
Call Component | 56967551 | 4 days ago | IN | 0 AVAX | 0.00022868 | ||||
Call Component | 56967549 | 4 days ago | IN | 0 AVAX | 0.00007345 | ||||
Call Component | 56967547 | 4 days ago | IN | 0 AVAX | 0.00101176 | ||||
Call Component | 56967540 | 4 days ago | IN | 0 AVAX | 0.00024399 | ||||
Call Component | 56916398 | 5 days ago | IN | 0 AVAX | 0.0004075 | ||||
Call Component | 56916395 | 5 days ago | IN | 0 AVAX | 0.00319764 |
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
29178804 | 659 days ago | Contract Creation | 0 AVAX |
Loading...
Loading
Contract Name:
FeeManager
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import {IERC20} from "openzeppelin/token/ERC20/IERC20.sol"; import {SafeOwnable} from "solrary/access/SafeOwnable.sol"; import {IFeeManager} from "./interfaces/IFeeManager.sol"; import {IFeeBank, FeeBank} from "./FeeBank.sol"; import {Address} from "./libraries/Address.sol"; /** * @title Fee Manager * @author Trader Joe * @notice This contract allows to let the fee bank contract to delegate call to any contract without * any risk of overwriting the storage variables of the fee bank contract. */ contract FeeManager is SafeOwnable, IFeeManager { using Address for address; IFeeBank internal immutable _FEE_BANK; uint256 internal _verifiedRound; mapping(address => Component) private _components; /** * @dev Modifier to check if the caller is a verified component operator of a verified component. */ modifier onlyVerifiedComponentOperator(address component) { Component storage _component = _components[component]; uint256 round = _component.verifiedRound; if (round == 0) revert FeeManager__ComponentNotVerified(); if (_component.operators[msg.sender] != round) revert FeeManager__OnlyComponentOperator(); _; } /** * @dev Constructor that creates the fee bank. */ constructor() { _FEE_BANK = new FeeBank(); } /** * @notice Returns the fee bank address. * @return The fee bank address. */ function getFeeBank() external view override returns (IFeeBank) { return _FEE_BANK; } /** * @notice Returns whether a component is verified. * @param component The component address. * @return Whether the component is verified, true if verified, false otherwise. */ function isVerifiedComponent(address component) external view override returns (bool) { return _components[component].verifiedRound > 0; } /** * @notice Returns whether an operator is allowed to call a component. * @param component The component address. * @param operator The operator address. * @return Whether the operator is allowed to call the component, true if allowed, false otherwise. */ function isComponentOperator(address component, address operator) external view override returns (bool) { Component storage _component = _components[component]; uint256 round = _component.verifiedRound; return round > 0 && _component.operators[operator] == round; } /** * @notice Return the result of multiple static calls to different contracts. * @param targets The target contracts. * @param data The data to static call. * @return results The return data from the static calls. */ function batchStaticCall(address[] calldata targets, bytes[] calldata data) external view override returns (bytes[] memory results) { if (targets.length != data.length) revert FeeManager__InvalidLength(); results = new bytes[](targets.length); for (uint256 i; i < targets.length;) { (bool success, bytes memory result) = targets[i].staticcall(data[i]); unchecked { if (success) results[i++] = result; } } } /** * @notice Verifies a component. * @dev Only callable by the owner. * @param component The component address. */ function verifyComponent(address component) external override onlyOwner { if (component == address(_FEE_BANK)) revert FeeManager__FeeBankIsNotAComponent(); Component storage _component = _components[component]; uint256 round = _component.verifiedRound; if (round > 0) revert FeeManager__ComponentAlreadyVerified(); uint256 verifiedRound = ++_verifiedRound; _component.verifiedRound = verifiedRound; emit ComponentVerified(component, verifiedRound); } /** * @notice Unverifies a component. * @dev Only callable by the owner. * @param component The component address. */ function unverifyComponent(address component) external override onlyOwner { Component storage _component = _components[component]; if (_component.verifiedRound == 0) revert FeeManager__ComponentNotVerified(); _component.verifiedRound = 0; emit ComponentUnverified(component); } /** * @notice Adds an operator to a component. * @dev Only callable by the owner. * @param component The component address. * @param operator The operator address. */ function addComponentOperator(address component, address operator) external override onlyOwner { Component storage _component = _components[component]; uint256 round = _component.verifiedRound; if (round == 0) revert FeeManager__ComponentNotVerified(); if (_component.operators[operator] == round) revert FeeManager__ComponentOperatorAlreadyAdded(); _component.operators[operator] = round; emit ComponentOperatorAdded(component, operator, round); } /** * @notice Removes an operator from a component. * @dev Only callable by the owner. * @param component The component address. * @param operator The operator address. */ function removeComponentOperator(address component, address operator) external override onlyOwner { Component storage _component = _components[component]; uint256 round = _component.verifiedRound; if (round == 0) revert FeeManager__ComponentNotVerified(); if (_component.operators[operator] != round) revert FeeManager__ComponentOperatorNotAdded(); _component.operators[operator] = 0; emit ComponentOperatorRemoved(component, operator); } /** * @notice Calls a component and returns the result. * @dev Only callable by a verified component operator. * @param component The component address. * @param data The data to call the component with. * @return The result of the call. */ function callComponent(address component, bytes calldata data) external override returns (bytes memory) { return _callComponent(component, data); } /** * @notice Calls multiple components and returns the results. * @dev Only callable by a verified operator of each component. * @param components The component addresses. * @param data The data to call the components with. * @return The results of the calls. */ function callComponents(address[] calldata components, bytes[] calldata data) external override returns (bytes[] memory) { if (components.length != data.length) revert FeeManager__InvalidLength(); bytes[] memory results = new bytes[](components.length); for (uint256 i; i < components.length;) { results[i] = _callComponent(components[i], data[i]); unchecked { ++i; } } return results; } /** * @notice Calls a contract `target` with `data` and returns the result. * @dev Only callable by the owner. * @param target The target contract address. * @param data The data to call the contract with. * @return returnData The result of the call. */ function directCall(address target, bytes calldata data) external override onlyOwner returns (bytes memory returnData) { if (data.length == 0) { target.sendValue(address(this).balance); } else { returnData = target.directCall(data); } } /** * @dev Calls a component and returns the result. This function is used to delegate call to the fee bank. * Only callable by a verified component operator. * @param component The component address. * @param data The data to call the component with. * @return The result of the call. */ function _callComponent(address component, bytes calldata data) internal onlyVerifiedComponentOperator(component) returns (bytes memory) { return _FEE_BANK.delegateCall(component, data); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; interface ISafeOwnable { error SafeOwnable__OnlyOwner(); error SafeOwnable__OnlyPendingOwner(); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); event PendingOwnerSet(address indexed owner, address indexed pendingOwner); function owner() external view returns (address); function pendingOwner() external view returns (address); function setPendingOwner(address newPendingOwner) external; function becomeOwner() external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import "./ISafeOwnable.sol"; /** * @title Safe Ownable * @author 0x0Louis * @notice This contract is used to manage the ownership of a contract in a two-step process. */ abstract contract SafeOwnable is ISafeOwnable { address private _owner; address private _pendingOwner; /** * @dev Modifier that checks if the caller is the owner. */ modifier onlyOwner() { if (msg.sender != owner()) revert SafeOwnable__OnlyOwner(); _; } /** * @dev Modifier that checks if the caller is the pending owner. */ modifier onlyPendingOwner() { if (msg.sender != pendingOwner()) revert SafeOwnable__OnlyPendingOwner(); _; } /** * @notice Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(msg.sender); } /** * @notice Returns the address of the current owner. */ function owner() public view virtual override returns (address) { return _owner; } /** * @notice Returns the address of the pending owner. */ function pendingOwner() public view virtual override returns (address) { return _pendingOwner; } /** * @notice Sets the pending owner to a new address. * @param newOwner The address to transfer ownership to. */ function setPendingOwner(address newOwner) public virtual override onlyOwner { _setPendingOwner(newOwner); } /** * @notice Accepts ownership of the contract. * @dev Can only be called by the pending owner. */ function becomeOwner() public virtual override onlyPendingOwner { _transferOwnership(_pendingOwner); _setPendingOwner(address(0)); } /** Private Functions */ /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * @param newOwner The address to transfer ownership to. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev Sets the pending owner to a new address. * @param newPendingOwner The address to transfer ownership to. */ function _setPendingOwner(address newPendingOwner) internal virtual { _pendingOwner = newPendingOwner; emit PendingOwnerSet(msg.sender, newPendingOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import {Address} from "./libraries/Address.sol"; import {IFeeBank} from "./interfaces/IFeeBank.sol"; /** * @title Fee Bank * @author Trader Joe * @notice This contracts holds fees from the different products of the protocol. * The fee manager can call any contract from this contract to execute different actions. */ contract FeeBank is IFeeBank { using Address for address; address internal immutable _FEE_MANAGER; /** * @notice Modifier to check if the caller is the fee manager. */ modifier onlyFeeManager() { if (msg.sender != _FEE_MANAGER) revert FeeBank__OnlyFeeManager(); _; } /** * @dev Constructor that sets the fee manager address. * Needs to be deployed by the fee manager itself. */ constructor() { _FEE_MANAGER = msg.sender; } /** * @notice Returns the fee manager address. * @return The fee manager address. */ function getFeeManager() external view override returns (address) { return _FEE_MANAGER; } /** * @notice Delegate calls to a contract. * @dev Only callable by the fee manager. * @param target The target contract. * @param data The data to delegate call. * @return The return data from the delegate call. */ function delegateCall(address target, bytes calldata data) external onlyFeeManager returns (bytes memory) { return target.delegateCall(data); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; interface IFeeBank { error FeeBank__NonContract(); error FeeBank__CallFailed(); error FeeBank__OnlyFeeManager(); function getFeeManager() external view returns (address); function delegateCall(address target, bytes calldata data) external returns (bytes memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import {IERC20} from "openzeppelin/token/ERC20/IERC20.sol"; import {ISafeOwnable} from "solrary/access/ISafeOwnable.sol"; import {IFeeBank} from "./IFeeBank.sol"; interface IFeeManager is ISafeOwnable { error FeeManager__ComponentNotVerified(); error FeeManager__OnlyComponentOperator(); error FeeManager__ComponentAlreadyVerified(); error FeeManager__ComponentOperatorAlreadyAdded(); error FeeManager__ComponentOperatorNotAdded(); error FeeManager__FeeBankIsNotAComponent(); error FeeManager__InvalidLength(); struct Component { mapping(address => uint256) operators; uint256 verifiedRound; } event ComponentVerified(address indexed component, uint256 indexed round); event ComponentUnverified(address indexed component); event ComponentOperatorAdded(address indexed component, address indexed operator, uint256 indexed round); event ComponentOperatorRemoved(address indexed component, address indexed operator); function getFeeBank() external view returns (IFeeBank); function isVerifiedComponent(address component) external view returns (bool); function isComponentOperator(address component, address operator) external view returns (bool); function batchStaticCall(address[] calldata targets, bytes[] calldata data) external view returns (bytes[] memory results); function verifyComponent(address component) external; function unverifyComponent(address component) external; function addComponentOperator(address component, address operator) external; function removeComponentOperator(address component, address operator) external; function callComponent(address component, bytes calldata data) external returns (bytes memory); function callComponents(address[] calldata component, bytes[] calldata data) external returns (bytes[] memory); function directCall(address target, bytes calldata data) external returns (bytes memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; library Address { error Address__SendFailed(); error Address__NonContract(); error Address__CallFailed(); /** * @dev Sends the given amount of ether to the given address, forwarding all available gas and reverting on errors. * @param target The address to send ether to. * @param value The amount of ether to send. */ function sendValue(address target, uint256 value) internal { (bool success,) = target.call{value: value}(""); if (!success) revert Address__SendFailed(); } /** * @dev Calls the target contract with the given data and bubbles up errors. * @param target The target contract. * @param data The data to call the target contract with. * @return The return data from the call. */ function directCall(address target, bytes memory data) internal returns (bytes memory) { return directCallWithValue(target, data, 0); } /** * @dev Calls the target contract with the given data and bubbles up errors. * @param target The target contract. * @param data The data to call the target contract with. * @param value The amount of ether to send to the target contract. * @return The return data from the call. */ function directCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { (bool success, bytes memory returnData) = target.call{value: value}(data); _catchError(target, success, returnData); return returnData; } /** * @dev Delegate calls the target contract with the given data and bubbles up errors. * @param target The target contract. * @param data The data to delegate call the target contract with. * @return The return data from the delegate call. */ function delegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returnData) = target.delegatecall(data); _catchError(target, success, returnData); return returnData; } /** * @dev Bubbles up errors from the target contract, target must be a contract. * @param target The target contract. * @param success The success flag from the call. * @param returnData The return data from the call. */ function _catchError(address target, bool success, bytes memory returnData) private view { if (success) { if (returnData.length == 0 && target.code.length == 0) { revert Address__NonContract(); } } else { if (returnData.length > 0) { assembly { revert(add(32, returnData), mload(returnData)) } } else { revert Address__CallFailed(); } } } }
{ "remappings": [ "ds-test/=lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "joe-v2/=lib/joe-v2/src/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "openzeppelin/=lib/openzeppelin-contracts/contracts/", "solrary/=lib/solrary/src/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Address__CallFailed","type":"error"},{"inputs":[],"name":"Address__NonContract","type":"error"},{"inputs":[],"name":"Address__SendFailed","type":"error"},{"inputs":[],"name":"FeeManager__ComponentAlreadyVerified","type":"error"},{"inputs":[],"name":"FeeManager__ComponentNotVerified","type":"error"},{"inputs":[],"name":"FeeManager__ComponentOperatorAlreadyAdded","type":"error"},{"inputs":[],"name":"FeeManager__ComponentOperatorNotAdded","type":"error"},{"inputs":[],"name":"FeeManager__FeeBankIsNotAComponent","type":"error"},{"inputs":[],"name":"FeeManager__InvalidLength","type":"error"},{"inputs":[],"name":"FeeManager__OnlyComponentOperator","type":"error"},{"inputs":[],"name":"SafeOwnable__OnlyOwner","type":"error"},{"inputs":[],"name":"SafeOwnable__OnlyPendingOwner","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"component","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"uint256","name":"round","type":"uint256"}],"name":"ComponentOperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"component","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"ComponentOperatorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"component","type":"address"}],"name":"ComponentUnverified","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"component","type":"address"},{"indexed":true,"internalType":"uint256","name":"round","type":"uint256"}],"name":"ComponentVerified","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":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"PendingOwnerSet","type":"event"},{"inputs":[{"internalType":"address","name":"component","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"addComponentOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"batchStaticCall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"becomeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"component","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"callComponent","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"components","type":"address[]"},{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"callComponents","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"directCall","outputs":[{"internalType":"bytes","name":"returnData","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getFeeBank","outputs":[{"internalType":"contract IFeeBank","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"component","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isComponentOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"component","type":"address"}],"name":"isVerifiedComponent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"component","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"removeComponentOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setPendingOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"component","type":"address"}],"name":"unverifyComponent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"component","type":"address"}],"name":"verifyComponent","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405234801561001057600080fd5b5061001a33610054565b604051610026906100a4565b604051809103906000f080158015610042573d6000803e3d6000fd5b506001600160a01b03166080526100b1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6103838061123383390190565b6080516111596100da60003960008181610209015281816109180152610a8701526111596000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80636b6447ae11610097578063c42069ec11610066578063c42069ec14610240578063e30c397814610253578063f9dca98914610264578063fdd6eaed1461026c57600080fd5b80636b6447ae146101cf5780638da5cb5b146101e2578063ac78496d14610207578063becf77791461022d57600080fd5b806346fbdb55116100d357806346fbdb5514610176578063552284d7146101965780635bb0431d146101a9578063669dcec9146101bc57600080fd5b80631450ce22146100fa57806314c5ae621461010f5780631e9d963514610138575b600080fd5b61010d610108366004610d1f565b61027f565b005b61012261011d366004610d9e565b61036a565b60405161012f9190610e66565b60405180910390f35b610166610146366004610ec8565b6001600160a01b0316600090815260036020526040902060010154151590565b604051901515815260200161012f565b610189610184366004610ee3565b61046a565b60405161012f9190610f66565b6101666101a4366004610d1f565b610481565b6101896101b7366004610ee3565b6104cd565b61010d6101ca366004610d1f565b610579565b61010d6101dd366004610ec8565b610664565b6000546001600160a01b03165b6040516001600160a01b03909116815260200161012f565b7f00000000000000000000000000000000000000000000000000000000000000006101ef565b61012261023b366004610d9e565b610707565b61010d61024e366004610ec8565b610868565b6001546001600160a01b03166101ef565b61010d61089f565b61010d61027a366004610ec8565b6108eb565b6000546001600160a01b031633146102aa57604051631c1d490560e21b815260040160405180910390fd5b6001600160a01b03821660009081526003602052604090206001810154806102e55760405163ae469f1d60e01b815260040160405180910390fd5b6001600160a01b038316600090815260208390526040902054811461031d57604051630eb25ec760e11b815260040160405180910390fd5b6001600160a01b038084166000818152602085905260408082208290555191928716917fe47eb1ae85338794d8dd5529f47fe49e96c025db48f915399c303e9872b7456d9190a350505050565b606083821461038c576040516329f2386760e01b815260040160405180910390fd5b60008467ffffffffffffffff8111156103a7576103a7610f79565b6040519080825280602002602001820160405280156103da57816020015b60608152602001906001900390816103c55790505b50905060005b858110156104605761043b8787838181106103fd576103fd610f8f565b90506020020160208101906104129190610ec8565b86868481811061042457610424610f8f565b90506020028101906104369190610fa5565b610a01565b82828151811061044d5761044d610f8f565b60209081029190910101526001016103e0565b5095945050505050565b6060610477848484610a01565b90505b9392505050565b6001600160a01b0382166000908152600360205260408120600181015480158015906104c457506001600160a01b03841660009081526020839052604090205481145b95945050505050565b60606104e16000546001600160a01b031690565b6001600160a01b0316336001600160a01b03161461051257604051631c1d490560e21b815260040160405180910390fd5b8161052f5761052a6001600160a01b03851647610b12565b61047a565b61047783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506001600160a01b03881692915050610b8b565b6000546001600160a01b031633146105a457604051631c1d490560e21b815260040160405180910390fd5b6001600160a01b03821660009081526003602052604090206001810154806105df5760405163ae469f1d60e01b815260040160405180910390fd5b6001600160a01b03831660009081526020839052604090205481141561061857604051633e37ccfb60e11b815260040160405180910390fd5b6001600160a01b038084166000818152602085905260408082208590555184938816917f4ed75292a1dcc025209b6b838c3c0b769310bd1d2910bf2e56cb2fbc7f4c5d8c91a450505050565b6000546001600160a01b0316331461068f57604051631c1d490560e21b815260040160405180910390fd5b6001600160a01b038116600090815260036020526040902060018101546106c95760405163ae469f1d60e01b815260040160405180910390fd5b6000600182018190556040516001600160a01b038416917f28395b05bf9eaf40ab2f61e39137d518737cf216df8c7b25e1e6f23fc08fcef191a25050565b6060838214610729576040516329f2386760e01b815260040160405180910390fd5b8367ffffffffffffffff81111561074257610742610f79565b60405190808252806020026020018201604052801561077557816020015b60608152602001906001900390816107605790505b50905060005b8481101561085f5760008087878481811061079857610798610f8f565b90506020020160208101906107ad9190610ec8565b6001600160a01b03168686858181106107c8576107c8610f8f565b90506020028101906107da9190610fa5565b6040516107e8929190610fec565b600060405180830381855afa9150503d8060008114610823576040519150601f19603f3d011682016040523d82523d6000602084013e610828565b606091505b50915091508115610858578084848060010195508151811061084c5761084c610f8f565b60200260200101819052505b505061077b565b50949350505050565b6000546001600160a01b0316331461089357604051631c1d490560e21b815260040160405180910390fd5b61089c81610b99565b50565b6001546001600160a01b031633146108ca576040516301bd182d60e41b815260040160405180910390fd5b6001546108df906001600160a01b0316610be5565b6108e96000610b99565b565b6000546001600160a01b0316331461091657604051631c1d490560e21b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316141561096957604051632003d68d60e21b815260040160405180910390fd5b6001600160a01b0381166000908152600360205260409020600181015480156109a55760405163381c6f9b60e01b815260040160405180910390fd5b60006002600081546109b690610ffc565b91829055506001840181905560405190915081906001600160a01b038616907fc2bc7bba60b0c97bca88aaf37563aceadc8c6d96e0d4b5043b9500c4df5d775090600090a350505050565b6001600160a01b03831660009081526003602052604090206001810154606091859180610a415760405163ae469f1d60e01b815260040160405180910390fd5b336000908152602083905260409020548114610a7057604051635b86172f60e01b815260040160405180910390fd5b604051632b73dbd560e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906356e7b7aa90610ac0908a908a908a90600401611025565b6000604051808303816000875af1158015610adf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b079190810190611065565b979650505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610b5f576040519150601f19603f3d011682016040523d82523d6000602084013e610b64565b606091505b5050905080610b8657604051633ec93ffb60e21b815260040160405180910390fd5b505050565b606061047a83836000610c35565b600180546001600160a01b0319166001600160a01b03831690811790915560405133907fa86864fa6b65f969d5ac8391ddaac6a0eba3f41386cbf6e78c3e4d6c59eb115f90600090a350565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060600080856001600160a01b03168486604051610c539190611107565b60006040518083038185875af1925050503d8060008114610c90576040519150601f19603f3d011682016040523d82523d6000602084013e610c95565b606091505b50915091506104c48683838115610cdb578051158015610cbd57506001600160a01b0383163b155b15610b8657604051631c4430c960e21b815260040160405180910390fd5b805115610cea57805181602001fd5b604051630ac7997b60e41b815260040160405180910390fd5b80356001600160a01b0381168114610d1a57600080fd5b919050565b60008060408385031215610d3257600080fd5b610d3b83610d03565b9150610d4960208401610d03565b90509250929050565b60008083601f840112610d6457600080fd5b50813567ffffffffffffffff811115610d7c57600080fd5b6020830191508360208260051b8501011115610d9757600080fd5b9250929050565b60008060008060408587031215610db457600080fd5b843567ffffffffffffffff80821115610dcc57600080fd5b610dd888838901610d52565b90965094506020870135915080821115610df157600080fd5b50610dfe87828801610d52565b95989497509550505050565b60005b83811015610e25578181015183820152602001610e0d565b83811115610e34576000848401525b50505050565b60008151808452610e52816020860160208601610e0a565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015610ebb57603f19888603018452610ea9858351610e3a565b94509285019290850190600101610e8d565b5092979650505050505050565b600060208284031215610eda57600080fd5b61047a82610d03565b600080600060408486031215610ef857600080fd5b610f0184610d03565b9250602084013567ffffffffffffffff80821115610f1e57600080fd5b818601915086601f830112610f3257600080fd5b813581811115610f4157600080fd5b876020828501011115610f5357600080fd5b6020830194508093505050509250925092565b60208152600061047a6020830184610e3a565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610fbc57600080fd5b83018035915067ffffffffffffffff821115610fd757600080fd5b602001915036819003821315610d9757600080fd5b8183823760009101908152919050565b600060001982141561101e57634e487b7160e01b600052601160045260246000fd5b5060010190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b60006020828403121561107757600080fd5b815167ffffffffffffffff8082111561108f57600080fd5b818401915084601f8301126110a357600080fd5b8151818111156110b5576110b5610f79565b604051601f8201601f19908116603f011681019083821181831017156110dd576110dd610f79565b816040528281528760208487010111156110f657600080fd5b610b07836020830160208801610e0a565b60008251611119818460208701610e0a565b919091019291505056fea264697066735822122086a65220438bd41072cf16f725c57c2434214f9c01dbdf4a6244008f952779c164736f6c634300080a003360a060405234801561001057600080fd5b503360805260805161034e610035600039600081816071015260a8015261034e6000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806356e7b7aa1461003b578063f2d6382614610064575b600080fd5b61004e610049366004610208565b61009b565b60405161005b91906102c9565b60405180910390f35b6040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016815260200161005b565b6060336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146100e657604051633859417b60e01b815260040160405180910390fd5b61013083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506001600160a01b03881692915050610138565b949350505050565b6060600080846001600160a01b03168460405161015591906102fc565b600060405180830381855af49150503d8060008114610190576040519150601f19603f3d011682016040523d82523d6000602084013e610195565b606091505b509150915061013085838381156101e05780511580156101bd57506001600160a01b0383163b155b156101db57604051631c4430c960e21b815260040160405180910390fd5b505050565b8051156101ef57805181602001fd5b604051630ac7997b60e41b815260040160405180910390fd5b60008060006040848603121561021d57600080fd5b83356001600160a01b038116811461023457600080fd5b9250602084013567ffffffffffffffff8082111561025157600080fd5b818601915086601f83011261026557600080fd5b81358181111561027457600080fd5b87602082850101111561028657600080fd5b6020830194508093505050509250925092565b60005b838110156102b457818101518382015260200161029c565b838111156102c3576000848401525b50505050565b60208152600082518060208401526102e8816040850160208701610299565b601f01601f19169190910160400192915050565b6000825161030e818460208701610299565b919091019291505056fea2646970667358221220b8277034d7d77fd952c1725d736dfad6781431f7474c7d91d8069cd1fd96f15364736f6c634300080a0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80636b6447ae11610097578063c42069ec11610066578063c42069ec14610240578063e30c397814610253578063f9dca98914610264578063fdd6eaed1461026c57600080fd5b80636b6447ae146101cf5780638da5cb5b146101e2578063ac78496d14610207578063becf77791461022d57600080fd5b806346fbdb55116100d357806346fbdb5514610176578063552284d7146101965780635bb0431d146101a9578063669dcec9146101bc57600080fd5b80631450ce22146100fa57806314c5ae621461010f5780631e9d963514610138575b600080fd5b61010d610108366004610d1f565b61027f565b005b61012261011d366004610d9e565b61036a565b60405161012f9190610e66565b60405180910390f35b610166610146366004610ec8565b6001600160a01b0316600090815260036020526040902060010154151590565b604051901515815260200161012f565b610189610184366004610ee3565b61046a565b60405161012f9190610f66565b6101666101a4366004610d1f565b610481565b6101896101b7366004610ee3565b6104cd565b61010d6101ca366004610d1f565b610579565b61010d6101dd366004610ec8565b610664565b6000546001600160a01b03165b6040516001600160a01b03909116815260200161012f565b7f00000000000000000000000060233142befce7d4ed73e7793ead2d6190fccaab6101ef565b61012261023b366004610d9e565b610707565b61010d61024e366004610ec8565b610868565b6001546001600160a01b03166101ef565b61010d61089f565b61010d61027a366004610ec8565b6108eb565b6000546001600160a01b031633146102aa57604051631c1d490560e21b815260040160405180910390fd5b6001600160a01b03821660009081526003602052604090206001810154806102e55760405163ae469f1d60e01b815260040160405180910390fd5b6001600160a01b038316600090815260208390526040902054811461031d57604051630eb25ec760e11b815260040160405180910390fd5b6001600160a01b038084166000818152602085905260408082208290555191928716917fe47eb1ae85338794d8dd5529f47fe49e96c025db48f915399c303e9872b7456d9190a350505050565b606083821461038c576040516329f2386760e01b815260040160405180910390fd5b60008467ffffffffffffffff8111156103a7576103a7610f79565b6040519080825280602002602001820160405280156103da57816020015b60608152602001906001900390816103c55790505b50905060005b858110156104605761043b8787838181106103fd576103fd610f8f565b90506020020160208101906104129190610ec8565b86868481811061042457610424610f8f565b90506020028101906104369190610fa5565b610a01565b82828151811061044d5761044d610f8f565b60209081029190910101526001016103e0565b5095945050505050565b6060610477848484610a01565b90505b9392505050565b6001600160a01b0382166000908152600360205260408120600181015480158015906104c457506001600160a01b03841660009081526020839052604090205481145b95945050505050565b60606104e16000546001600160a01b031690565b6001600160a01b0316336001600160a01b03161461051257604051631c1d490560e21b815260040160405180910390fd5b8161052f5761052a6001600160a01b03851647610b12565b61047a565b61047783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506001600160a01b03881692915050610b8b565b6000546001600160a01b031633146105a457604051631c1d490560e21b815260040160405180910390fd5b6001600160a01b03821660009081526003602052604090206001810154806105df5760405163ae469f1d60e01b815260040160405180910390fd5b6001600160a01b03831660009081526020839052604090205481141561061857604051633e37ccfb60e11b815260040160405180910390fd5b6001600160a01b038084166000818152602085905260408082208590555184938816917f4ed75292a1dcc025209b6b838c3c0b769310bd1d2910bf2e56cb2fbc7f4c5d8c91a450505050565b6000546001600160a01b0316331461068f57604051631c1d490560e21b815260040160405180910390fd5b6001600160a01b038116600090815260036020526040902060018101546106c95760405163ae469f1d60e01b815260040160405180910390fd5b6000600182018190556040516001600160a01b038416917f28395b05bf9eaf40ab2f61e39137d518737cf216df8c7b25e1e6f23fc08fcef191a25050565b6060838214610729576040516329f2386760e01b815260040160405180910390fd5b8367ffffffffffffffff81111561074257610742610f79565b60405190808252806020026020018201604052801561077557816020015b60608152602001906001900390816107605790505b50905060005b8481101561085f5760008087878481811061079857610798610f8f565b90506020020160208101906107ad9190610ec8565b6001600160a01b03168686858181106107c8576107c8610f8f565b90506020028101906107da9190610fa5565b6040516107e8929190610fec565b600060405180830381855afa9150503d8060008114610823576040519150601f19603f3d011682016040523d82523d6000602084013e610828565b606091505b50915091508115610858578084848060010195508151811061084c5761084c610f8f565b60200260200101819052505b505061077b565b50949350505050565b6000546001600160a01b0316331461089357604051631c1d490560e21b815260040160405180910390fd5b61089c81610b99565b50565b6001546001600160a01b031633146108ca576040516301bd182d60e41b815260040160405180910390fd5b6001546108df906001600160a01b0316610be5565b6108e96000610b99565b565b6000546001600160a01b0316331461091657604051631c1d490560e21b815260040160405180910390fd5b7f00000000000000000000000060233142befce7d4ed73e7793ead2d6190fccaab6001600160a01b0316816001600160a01b0316141561096957604051632003d68d60e21b815260040160405180910390fd5b6001600160a01b0381166000908152600360205260409020600181015480156109a55760405163381c6f9b60e01b815260040160405180910390fd5b60006002600081546109b690610ffc565b91829055506001840181905560405190915081906001600160a01b038616907fc2bc7bba60b0c97bca88aaf37563aceadc8c6d96e0d4b5043b9500c4df5d775090600090a350505050565b6001600160a01b03831660009081526003602052604090206001810154606091859180610a415760405163ae469f1d60e01b815260040160405180910390fd5b336000908152602083905260409020548114610a7057604051635b86172f60e01b815260040160405180910390fd5b604051632b73dbd560e11b81526001600160a01b037f00000000000000000000000060233142befce7d4ed73e7793ead2d6190fccaab16906356e7b7aa90610ac0908a908a908a90600401611025565b6000604051808303816000875af1158015610adf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b079190810190611065565b979650505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610b5f576040519150601f19603f3d011682016040523d82523d6000602084013e610b64565b606091505b5050905080610b8657604051633ec93ffb60e21b815260040160405180910390fd5b505050565b606061047a83836000610c35565b600180546001600160a01b0319166001600160a01b03831690811790915560405133907fa86864fa6b65f969d5ac8391ddaac6a0eba3f41386cbf6e78c3e4d6c59eb115f90600090a350565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060600080856001600160a01b03168486604051610c539190611107565b60006040518083038185875af1925050503d8060008114610c90576040519150601f19603f3d011682016040523d82523d6000602084013e610c95565b606091505b50915091506104c48683838115610cdb578051158015610cbd57506001600160a01b0383163b155b15610b8657604051631c4430c960e21b815260040160405180910390fd5b805115610cea57805181602001fd5b604051630ac7997b60e41b815260040160405180910390fd5b80356001600160a01b0381168114610d1a57600080fd5b919050565b60008060408385031215610d3257600080fd5b610d3b83610d03565b9150610d4960208401610d03565b90509250929050565b60008083601f840112610d6457600080fd5b50813567ffffffffffffffff811115610d7c57600080fd5b6020830191508360208260051b8501011115610d9757600080fd5b9250929050565b60008060008060408587031215610db457600080fd5b843567ffffffffffffffff80821115610dcc57600080fd5b610dd888838901610d52565b90965094506020870135915080821115610df157600080fd5b50610dfe87828801610d52565b95989497509550505050565b60005b83811015610e25578181015183820152602001610e0d565b83811115610e34576000848401525b50505050565b60008151808452610e52816020860160208601610e0a565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015610ebb57603f19888603018452610ea9858351610e3a565b94509285019290850190600101610e8d565b5092979650505050505050565b600060208284031215610eda57600080fd5b61047a82610d03565b600080600060408486031215610ef857600080fd5b610f0184610d03565b9250602084013567ffffffffffffffff80821115610f1e57600080fd5b818601915086601f830112610f3257600080fd5b813581811115610f4157600080fd5b876020828501011115610f5357600080fd5b6020830194508093505050509250925092565b60208152600061047a6020830184610e3a565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610fbc57600080fd5b83018035915067ffffffffffffffff821115610fd757600080fd5b602001915036819003821315610d9757600080fd5b8183823760009101908152919050565b600060001982141561101e57634e487b7160e01b600052601160045260246000fd5b5060010190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b60006020828403121561107757600080fd5b815167ffffffffffffffff8082111561108f57600080fd5b818401915084601f8301126110a357600080fd5b8151818111156110b5576110b5610f79565b604051601f8201601f19908116603f011681019083821181831017156110dd576110dd610f79565b816040528281528760208487010111156110f657600080fd5b610b07836020830160208801610e0a565b60008251611119818460208701610e0a565b919091019291505056fea264697066735822122086a65220438bd41072cf16f725c57c2434214f9c01dbdf4a6244008f952779c164736f6c634300080a0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ 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.