Source Code
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 16535190 | 340 days ago | Contract Creation | 0 FRAX |
Cross-Chain Transactions
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:
FusionProxyFactory
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 800 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; import "./FusionProxy.sol"; import "../external/FusionContext.sol"; import "../base/Verifier.sol"; import "../libraries/Conversion.sol"; import "../interfaces/IFusion.sol"; import "../libraries/Conversion.sol"; /** * @title Fusion Proxy Factory - Allows to create a new proxy contract and execute a message call to the new proxy within one transaction. * @author Anoy Roy Chowdhury - <[email protected]> */ contract FusionProxyFactory { event ProxyCreation(FusionProxy indexed proxy, address singleton); /// @dev Allows to retrieve the creation code used for the Proxy deployment. With this it is easily possible to calculate predicted address. function proxyCreationCode() public pure returns (bytes memory) { return type(FusionProxy).creationCode; } /** * @notice Internal method to create a new proxy contract using CREATE2. * @param Singleton Address of the singleton contract. * @param TxHash The common public input for proof verification. * @param TxVerifier Address of the TxVerifier contract. * @param TxHash The common public input for proof verification. * @param salt Create2 salt to use for calculating the address of the new proxy contract. * @param to Contract address for optional delegate call. * @param data Data payload for optional delegate call. * @return proxy Address of the new proxy contract. */ function deployProxy( address Singleton, bytes32 TxHash, address TxVerifier, bytes32 salt, address to, bytes calldata data ) internal returns (FusionProxy proxy) { require(isContract(Singleton), "Singleton contract not deployed"); bytes memory deploymentData = abi.encodePacked( type(FusionProxy).creationCode, uint256(uint160(Singleton)) ); // solhint-disable-next-line no-inline-assembly assembly { proxy := create2( 0x0, add(0x20, deploymentData), mload(deploymentData), salt ) } require(address(proxy) != address(0), "Create2 call failed"); bytes memory initializer = getInitializer(TxVerifier, TxHash, to, data); // solhint-disable-next-line no-inline-assembly assembly { if eq( call( gas(), proxy, 0, add(initializer, 0x20), mload(initializer), 0, 0 ), 0 ) { revert(0, 0) } } } /** * @notice Deploys a new proxy with the current singleton. * @param RegistryData Data payload for the registry. * @param to Contract address for optional delegate call. * @param data Data payload for optional delegate call. */ function createProxyWithTxHash( bytes calldata RegistryData, address to, bytes calldata data ) public returns (FusionProxy proxy) { (address Singleton, bytes32 TxHash, address _txVerifier) = abi.decode( RegistryData, (address, bytes32, address) ); proxy = _createProxyWithTxHash( Singleton, TxHash, _txVerifier, to, data ); } /** * @notice Deploys a new proxy with `_singleton` singleton. * @param _singleton Address of the singleton contract. * @param _txHash The common public input for proof verification. * @param _txVerifier Address of the TxVerifier contract. * @param to Contract address for optional delegate call. * @param data Data payload for optional delegate call. * @dev The domain name is used to calculate the salt for the CREATE2 call. */ function _createProxyWithTxHash( address _singleton, bytes32 _txHash, address _txVerifier, address to, bytes calldata data ) internal returns (FusionProxy proxy) { // If the domain changes the proxy address should change too. bytes32 salt = keccak256(abi.encodePacked(_txHash, _txVerifier)); proxy = deployProxy(_singleton, _txHash, _txVerifier, salt, to, data); emit ProxyCreation(proxy, _singleton); } /** * @notice Returns true if `account` is a contract. * @dev This function will return false if invoked during the constructor of a contract, * as the code is not actually created until after the constructor finishes. * @param account The address being queried * @return True if `account` is a contract */ function isContract(address account) internal view returns (bool) { uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @notice Returns the initializer for the Fusion contract. * @param _txVerifier The address of the TxVerifier contract. * @param _txHash The common public input for proof verification. * @param _to Contract address for optional delegate call. * @param _data Data payload for optional delegate call. */ function getInitializer( address _txVerifier, bytes32 _txHash, address _to, bytes calldata _data ) internal pure returns (bytes memory) { return abi.encodeWithSelector( IFusion.setupFusion.selector, _txVerifier, _txHash, _to, _data ); } }
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @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 value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` 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 value
) external returns (bool);
}// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; /** * @title UltraVerifierInterface - Interface for verification of proofs * @author Anoy Roy Chowdhury - <[email protected]> * @notice This Interface is used to verify proofs using UltraVerifier */ interface UltraVerifierInterface { function verify( bytes calldata _proof, bytes32[] calldata _publicInputs ) external view returns (bool); } /** * @title Verifier - Base contract for verification of proofs * @dev This contract is used to verify proofs using UltraVerifier */ abstract contract Verifier { /** * @notice Verifies the proof and returns the result of verification. * @param _proof The proof inputs * @param _publicInputs The public inputs * @param _verifier The address of the verifier contract */ function verifyProof( bytes calldata _proof, bytes32[] memory _publicInputs, address _verifier ) internal view returns (bool) { return UltraVerifierInterface(_verifier).verify(_proof, _publicInputs); } }
// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
/**
* @dev FusionContext - A contract that charges fees for the transaction.
* @author Anoy Roy Chowdhury - <[email protected]>
*/
abstract contract FusionContext {
/**
* @notice Charges the fees for the transaction.
* @param startGas Gas used before calling the function
* @param gasPrice gas price of the transaction
* @param baseGas base gas deducted by the relayer
* @param GasTank address of the GasTank
* @param token address of the token
*/
function chargeFees(
uint256 startGas,
uint256 gasPrice,
uint256 baseGas,
address GasTank,
address token
) internal {
uint256 gasUsed = startGas - gasleft();
uint256 gasFee = (gasUsed + baseGas) * gasPrice;
if (token != address(0)) {
uint8 decimals = IERC20Metadata(token).decimals();
uint256 transferAmount = gasFee / 10 ** (18 - decimals);
// Low-level call with additional check for tokens without return value
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(
IERC20.transfer.selector,
GasTank,
transferAmount
)
);
bool transferSucceeded = success &&
(data.length == 0 || abi.decode(data, (bool)));
if (!transferSucceeded) {
revert("Fusion: fee transfer failed");
}
} else {
(bool success, ) = GasTank.call{value: gasFee}("");
if (!success) {
revert("Fusion: fee transfer failed");
}
}
}
}// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.9.0;
import {Enum} from "../libraries/Enum.sol";
import {Transaction} from "../libraries/Transaction.sol";
import {Quote} from "../libraries/Quote.sol";
/**
* @title IFusion - Fusion Wallet Interface
* @author Anoy Roy Chowdhury - <[email protected]>
*/
interface IFusion {
event SetupFusion(address txVerifier, bytes32 txHash);
/**
* @notice Initializes the Fusion Wallet
* @param _txVerifier The address of the Noir based ZK-SNARK verifier contract
* @param _txHash The hash used as a public inputs for verifiers
* @param to The destination address of the call to execute
* @param data The data of the call to
*/
function setupFusion(
address _txVerifier,
bytes32 _txHash,
address to,
bytes calldata data
) external;
/**
* @notice Executes a transaction
* @param _proof The zk-SNARK proof
* @param txData call to perform
*/
function executeTx(
bytes calldata _proof,
Transaction.TransactionData calldata txData
) external payable returns (bool success);
/**
* @notice Executes a batch of transactions
* @param _proof The zk-SNARK proof
* @param transactions Array of Transaction objects
*/
function executeBatchTx(
bytes calldata _proof,
Transaction.TransactionData[] calldata transactions
) external payable;
/**
* @notice Executes a transaction with a trusted forwarder
* @param _proof The zk-SNARK proof
* @param txData call to perform
* @param quote The gas quote
*/
function executeTxWithProvider(
bytes calldata _proof,
Transaction.TransactionData calldata txData,
Quote.GasQuote calldata quote
) external payable;
/**
* @notice Executes a batch of transactions with a trusted forwarder
* @param _proof The zk-SNARK proof
* @param transactions Array of Transaction objects
* @param quote The gas quote
*/
function executeBatchTxWithProvider(
bytes calldata _proof,
Transaction.TransactionData[] calldata transactions,
Quote.GasQuote calldata quote
) external payable;
/**
* @notice Verifies if the proof is valid or not
* @param _hash the message which is used to verify zero-knowledge proof
* @param _signature Noir based zero-knowledge proof
* @return magicValue The magic value indicating if the signature is valid
*/
function isValidSignature(
bytes32 _hash,
bytes calldata _signature
) external view returns (bytes4 magicValue);
/**
* @notice Returns the nonce of the Fusion Wallet
* @return The current nonce value
*/
function getNonce() external view returns (uint256);
/**
* @notice Returns the version of the contract
* @return The version string
*/
function VERSION() external view returns (string memory);
/**
* @notice Returns the address of the transaction verifier
* @return The address of the verifier contract
*/
function TxVerifier() external view returns (address);
/**
* @notice Returns the transaction hash used as public input
* @return The transaction hash
*/
function TxHash() external view returns (bytes32);
}// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; /** * @title Conversion - A contract that can convert to publicInputs compatible with UltraVerifier * @notice This contract is a library that provides functions to convert between different types * @author Anoy Roy Chowdhury - <[email protected]> */ library Conversion { /** * @notice Convert a bytes32 value to a padded bytes32 value * @param value The value to be converted to bytes32 */ function convertToPaddedByte32( bytes32 value ) internal pure returns (bytes32) { bytes32 paddedValue; paddedValue = bytes32(uint256(value) >> (31 * 8)); return paddedValue; } /** * @notice Convert the message hash to public inputs * @param _message The message hash * @param _hash The hash of the user that verifies the proof */ function convertToInputs( bytes32 _message, bytes32 _hash ) internal pure returns (bytes32[] memory) { bytes32[] memory byte32Inputs = new bytes32[](33); bytes32 messageHash = getEthSignedMessageHash(_message); for (uint256 i = 0; i < 32; i++) { byte32Inputs[i] = convertToPaddedByte32(messageHash[i]); } byte32Inputs[32] = _hash; return byte32Inputs; } /** * @notice Get the hash of a message that was signed * @param _messageHash The hash of the message that was signed */ function getEthSignedMessageHash( bytes32 _messageHash ) public pure returns (bytes32) { return keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", _messageHash ) ); } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; /** * @title Enum - Collection of enums used in Fusion contracts. * @author Anoy Roy Chowdhury - <[email protected]> */ library Enum { enum Operation { Call, DelegateCall } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; /** * @title Quote - Collection of structs used in Fusion gas quotes. * @author Anoy Roy Chowdhury - <[email protected]> */ library Quote { // GasQuote struct struct GasQuote { address token; uint256 gasPrice; uint256 baseGas; uint256 estimatedFees; address gasRecipient; uint48 deadline; } }
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.9.0;
import {Enum} from "./Enum.sol";
/**
* @title Transaction - Library for handling transactions in Fusion Wallet
* @author Anoy Roy Chowdhury - <[email protected]>
*/
library Transaction {
struct TransactionData {
address to;
uint256 value;
bytes data;
Enum.Operation operation;
uint256 gasLimit;
}
/**
* @notice Encode the transaction data with nonce
* @param _tx The transaction data
* @param _nonce The nonce of the Fusion Wallet
* @param _chainId The chain id of the network
* @param _token The token address
* @param _gasPrice The gas price
* @param _baseGas The base gas
*/
function encodeWithNonce(
TransactionData memory _tx,
uint256 _nonce,
uint256 _chainId,
address _token,
uint256 _gasPrice,
uint256 _baseGas,
uint48 _deadline
) internal pure returns (bytes memory) {
return
abi.encode(
_tx.to,
_tx.value,
_tx.data,
uint8(_tx.operation),
_nonce,
_chainId,
_token,
_gasPrice,
_baseGas,
_deadline,
_tx.gasLimit
);
}
/**
* @notice Get the hash of a transaction
* @param _tx The transaction data
* @param _nonce The nonce of the Fusion Wallet
* @param _chainId The chain id of the network
* @param _token The token address
* @param _gasPrice The gas price
* @param _baseGas The base gas
*/
function getTxHash(
TransactionData memory _tx,
uint256 _nonce,
uint256 _chainId,
address _token,
uint256 _gasPrice,
uint256 _baseGas,
uint48 _deadline
) internal pure returns (bytes32) {
return
keccak256(
encodeWithNonce(
_tx,
_nonce,
_chainId,
_token,
_gasPrice,
_baseGas,
_deadline
)
);
}
/**
* @notice Get the hash of a batch of transactions
* @param _txs All the transactions in the batch
* @param _nonce The nonce of the Fusion Wallet
* @param _chainId The chain id of the network
* @param _token The token address
* @param _gasPrice The gas price
* @param _baseGas The base gas
*/
function getTxBatchHash(
TransactionData[] memory _txs,
uint256 _nonce,
uint256 _chainId,
address _token,
uint256 _gasPrice,
uint256 _baseGas,
uint48 _deadline
) internal pure returns (bytes32) {
bytes memory txsData;
for (uint256 i = 0; i < _txs.length; i++) {
txsData = abi.encodePacked(
txsData,
encodeWithNonce(
_txs[i],
_nonce,
_chainId,
_token,
_gasPrice,
_baseGas,
_deadline
)
);
}
return keccak256(txsData);
}
}// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; /** * @title IProxy - Helper interface to access the singleton address of the Proxy on-chain. * @author Richard Meissner - <[email protected]> */ interface IProxy { function masterCopy() external view returns (address); } /** * @title FusionProxy - Generic proxy contract allows to execute all transactions applying the code of a master contract. * @author Stefan George - <[email protected]> * @author Richard Meissner - <[email protected]> * @author Anoy Roy Chowdhury - <[email protected]> */ contract FusionProxy { // Singleton always needs to be first declared variable, to ensure that it is at the same location in the contracts to which calls are delegated. // To reduce deployment costs this variable is internal and needs to be retrieved via `getStorageAt` address internal singleton; /** * @notice Constructor function sets address of singleton contract. * @param _singleton Singleton address. */ constructor(address _singleton) { require(_singleton != address(0), "Invalid singleton address provided"); singleton = _singleton; } /// @dev Fallback function forwards all transactions and returns all received return data. fallback() external payable { // solhint-disable-next-line no-inline-assembly assembly { let _singleton := and( sload(0), 0xffffffffffffffffffffffffffffffffffffffff ) // 0xa619486e == keccak("masterCopy()"). The value is right padded to 32-bytes with 0s if eq( calldataload(0), 0xa619486e00000000000000000000000000000000000000000000000000000000 ) { mstore(0, _singleton) return(0, 0x20) } calldatacopy(0, 0, calldatasize()) let success := delegatecall( gas(), _singleton, 0, calldatasize(), 0, 0 ) returndatacopy(0, 0, returndatasize()) if eq(success, 0) { revert(0, returndatasize()) } return(0, returndatasize()) } } }
{
"optimizer": {
"enabled": true,
"runs": 800,
"details": {
"yulDetails": {
"optimizerSteps": "u"
}
}
},
"evmVersion": "paris",
"viaIR": true,
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract FusionProxy","name":"proxy","type":"address"},{"indexed":false,"internalType":"address","name":"singleton","type":"address"}],"name":"ProxyCreation","type":"event"},{"inputs":[{"internalType":"bytes","name":"RegistryData","type":"bytes"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"createProxyWithTxHash","outputs":[{"internalType":"contract FusionProxy","name":"proxy","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxyCreationCode","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"}]Contract Creation Code
60806040523461001a5760405161098f610020823961098f90f35b600080fdfe608060405260043610156200001357600080fd5b60003560e01c806353e5d93514620000365763d1d34a8a0362000048576200020f565b620000c5565b60009103126200004857565b600080fd5b60005b838110620000615750506000910152565b818101518382015260200162000050565b62000097620000a1602093620000ab936200008b815190565b80835293849260200190565b958691016200004d565b601f01601f191690565b0190565b6020808252620000c29291019062000072565b90565b346200004857620000d83660046200003c565b620000f3620000e662000297565b60405191829182620000af565b0390f35b909182601f83011215620000485781359167ffffffffffffffff8311620000485760200192600183028401116200004857565b6001600160a01b031690565b6001600160a01b0381165b036200004857565b90503590620001588262000136565b565b91906060838203126200004857823567ffffffffffffffff811162000048578162000187918501620000f7565b92909362000199836020830162000149565b92604082013567ffffffffffffffff81116200004857620001bb9201620000f7565b9091565b6200012a620000c2620000c2926001600160a01b031690565b620000c290620001bf565b620000c290620001d8565b620001f990620001e3565b9052565b602081019291620001589190620001ee565b346200004857620000f3620002346200022a3660046200015a565b9392909262000305565b60405191829182620001fd565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff8211176200027a57604052565b62000241565b90620001586200028f60405190565b928362000257565b610259620002a86020820162000280565b9080825262000701602083013990565b8062000141565b905035906200015882620002b8565b90916060828403126200004857620000c2620002eb848462000149565b936040620002fd8260208701620002bf565b940162000149565b620003386200032d6200033f92620000c29796959462000323600090565b50810190620002ce565b9391929092620001e3565b92620001e3565b9162000363565b620001f9906001600160a01b031660601b90565b01809262000346565b95949290620003c8949262000376600090565b50604051620003ab81602081016200039e8587836020816200035a620000ab93601496959052565b9081038252038262000257565b620003bf620003b8825190565b9160200190565b2091886200052b565b917f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e2356200041b620003f985620001e3565b926200040460405190565b918291826001600160a01b03909116815260200190565b0390a2565b156200042857565b60405162461bcd60e51b815260206004820152601f60248201527f53696e676c65746f6e20636f6e7472616374206e6f74206465706c6f796564006044820152606490fd5b620000c2620000c2620000c2926001600160a01b031690565b620000ab620004a1926020926200049b815190565b94859290565b938491016200004d565b620004be620000ab916020949362000486565b918252565b6200012a620000c2620000c29290565b620000c290620004c3565b15620004e657565b60405162461bcd60e51b815260206004820152601360248201527f437265617465322063616c6c206661696c6564000000000000000000000000006044820152606490fd5b95620005f7936200039e620005b0620005fd94989a999795976200054d600090565b50620005636200055d8262000623565b62000420565b6200059662000590610259926200057d6020850162000280565b93808552620007016020860139620001d8565b6200046d565b90620005a160405190565b938492602084019283620004ab565b8051906020016000f597620005c589620001e3565b93600097889788978897620005ef620005e26200012a8b620004d3565b916001600160a01b031690565b1415620004de565b620006bc565b60208151910182885af114620006105750565b80fd5b620000c2620000c2620000c29290565b3b6200063862000634600062000613565b9190565b1190565b90826000939282370152565b9190620000a1816200066281620000ab9560209181520190565b80956200063c565b909391620000c295936200069e620006ae9262000697608086019860008701906001600160a01b03169052565b6020850152565b6001600160a01b03166040830152565b606081850391015262000648565b9193620000c293620006f09295620006d2606090565b5060405163e4d52aa760e01b6020820152968795602487016200066a565b602082018103825203826200025756fe608060405234610028576100196100146100c0565b6101a1565b604051608b6101ce8239608b90f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761006457604052565b61002d565b9061007d61007660405190565b9283610043565b565b6001600160a01b031690565b90565b6001600160a01b0381160361002857565b9050519061007d8261008e565b906020828203126100285761008b9161009f565b61008b610259803803806100d381610069565b9283398101906100ac565b61007f61008b61008b9290565b61008b906100de565b156100fb57565b60405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b6064820152608490fd5b61008b9061007f906001600160a01b031682565b61008b9061014b565b61008b9061015f565b9061018161008b61019d92610168565b82546001600160a01b0319166001600160a01b03919091161790565b9055565b61007d906101c66101b561007f60006100eb565b6001600160a01b03831614156100f4565b600061017156fe60806040526000805473ffffffffffffffffffffffffffffffffffffffff16903563530ca43760e11b14604c576000808092368280378136915af43d82803e146047573d6000f35b3d6000fd5b60005260206000f3fea264697066735822122080910b9407e55bea2fc5c4480d166cebd732618c84af8d8238f8c4ccc7d9955764736f6c63430008180033a2646970667358221220a7e4947857ef61a221b7336525f9f87bd79af5d7c03a1e1974802101603f37e364736f6c63430008180033
Deployed Bytecode
0x608060405260043610156200001357600080fd5b60003560e01c806353e5d93514620000365763d1d34a8a0362000048576200020f565b620000c5565b60009103126200004857565b600080fd5b60005b838110620000615750506000910152565b818101518382015260200162000050565b62000097620000a1602093620000ab936200008b815190565b80835293849260200190565b958691016200004d565b601f01601f191690565b0190565b6020808252620000c29291019062000072565b90565b346200004857620000d83660046200003c565b620000f3620000e662000297565b60405191829182620000af565b0390f35b909182601f83011215620000485781359167ffffffffffffffff8311620000485760200192600183028401116200004857565b6001600160a01b031690565b6001600160a01b0381165b036200004857565b90503590620001588262000136565b565b91906060838203126200004857823567ffffffffffffffff811162000048578162000187918501620000f7565b92909362000199836020830162000149565b92604082013567ffffffffffffffff81116200004857620001bb9201620000f7565b9091565b6200012a620000c2620000c2926001600160a01b031690565b620000c290620001bf565b620000c290620001d8565b620001f990620001e3565b9052565b602081019291620001589190620001ee565b346200004857620000f3620002346200022a3660046200015a565b9392909262000305565b60405191829182620001fd565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff8211176200027a57604052565b62000241565b90620001586200028f60405190565b928362000257565b610259620002a86020820162000280565b9080825262000701602083013990565b8062000141565b905035906200015882620002b8565b90916060828403126200004857620000c2620002eb848462000149565b936040620002fd8260208701620002bf565b940162000149565b620003386200032d6200033f92620000c29796959462000323600090565b50810190620002ce565b9391929092620001e3565b92620001e3565b9162000363565b620001f9906001600160a01b031660601b90565b01809262000346565b95949290620003c8949262000376600090565b50604051620003ab81602081016200039e8587836020816200035a620000ab93601496959052565b9081038252038262000257565b620003bf620003b8825190565b9160200190565b2091886200052b565b917f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e2356200041b620003f985620001e3565b926200040460405190565b918291826001600160a01b03909116815260200190565b0390a2565b156200042857565b60405162461bcd60e51b815260206004820152601f60248201527f53696e676c65746f6e20636f6e7472616374206e6f74206465706c6f796564006044820152606490fd5b620000c2620000c2620000c2926001600160a01b031690565b620000ab620004a1926020926200049b815190565b94859290565b938491016200004d565b620004be620000ab916020949362000486565b918252565b6200012a620000c2620000c29290565b620000c290620004c3565b15620004e657565b60405162461bcd60e51b815260206004820152601360248201527f437265617465322063616c6c206661696c6564000000000000000000000000006044820152606490fd5b95620005f7936200039e620005b0620005fd94989a999795976200054d600090565b50620005636200055d8262000623565b62000420565b6200059662000590610259926200057d6020850162000280565b93808552620007016020860139620001d8565b6200046d565b90620005a160405190565b938492602084019283620004ab565b8051906020016000f597620005c589620001e3565b93600097889788978897620005ef620005e26200012a8b620004d3565b916001600160a01b031690565b1415620004de565b620006bc565b60208151910182885af114620006105750565b80fd5b620000c2620000c2620000c29290565b3b6200063862000634600062000613565b9190565b1190565b90826000939282370152565b9190620000a1816200066281620000ab9560209181520190565b80956200063c565b909391620000c295936200069e620006ae9262000697608086019860008701906001600160a01b03169052565b6020850152565b6001600160a01b03166040830152565b606081850391015262000648565b9193620000c293620006f09295620006d2606090565b5060405163e4d52aa760e01b6020820152968795602487016200066a565b602082018103825203826200025756fe608060405234610028576100196100146100c0565b6101a1565b604051608b6101ce8239608b90f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761006457604052565b61002d565b9061007d61007660405190565b9283610043565b565b6001600160a01b031690565b90565b6001600160a01b0381160361002857565b9050519061007d8261008e565b906020828203126100285761008b9161009f565b61008b610259803803806100d381610069565b9283398101906100ac565b61007f61008b61008b9290565b61008b906100de565b156100fb57565b60405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b6064820152608490fd5b61008b9061007f906001600160a01b031682565b61008b9061014b565b61008b9061015f565b9061018161008b61019d92610168565b82546001600160a01b0319166001600160a01b03919091161790565b9055565b61007d906101c66101b561007f60006100eb565b6001600160a01b03831614156100f4565b600061017156fe60806040526000805473ffffffffffffffffffffffffffffffffffffffff16903563530ca43760e11b14604c576000808092368280378136915af43d82803e146047573d6000f35b3d6000fd5b60005260206000f3fea264697066735822122080910b9407e55bea2fc5c4480d166cebd732618c84af8d8238f8c4ccc7d9955764736f6c63430008180033a2646970667358221220a7e4947857ef61a221b7336525f9f87bd79af5d7c03a1e1974802101603f37e364736f6c63430008180033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.