ETH Price: $1,989.64 (-3.84%)

Contract

0x2deE636E57f6b76E59C3E47aE5FdC77ea41d9145
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Deploy Balance R...246822222026-03-18 5:17:239 days ago1773811043IN
0x2deE636E...ea41d9145
0 ETH0.000451790.10331635
Deploy Balance R...246822152026-03-18 5:15:599 days ago1773810959IN
0x2deE636E...ea41d9145
0 ETH0.000449820.10298983
Deploy Balance R...246822122026-03-18 5:15:239 days ago1773810923IN
0x2deE636E...ea41d9145
0 ETH0.000439590.10100567
Deploy Balance R...246822072026-03-18 5:14:239 days ago1773810863IN
0x2deE636E...ea41d9145
0 ETH0.000477550.11091774
Deploy Balance R...246822012026-03-18 5:13:119 days ago1773810791IN
0x2deE636E...ea41d9145
0 ETH0.000432610.10084645
Deploy Balance R...246821962026-03-18 5:12:119 days ago1773810731IN
0x2deE636E...ea41d9145
0 ETH0.000450320.10522776
Deploy Balance R...246821902026-03-18 5:10:599 days ago1773810659IN
0x2deE636E...ea41d9145
0 ETH0.000420330.09846117
Deploy Balance R...246784342026-03-17 16:34:359 days ago1773765275IN
0x2deE636E...ea41d9145
0 ETH0.000384480.63051154
Deploy Balance R...246784232026-03-17 16:32:239 days ago1773765143IN
0x2deE636E...ea41d9145
0 ETH0.000365120.61951099
Deploy Balance R...246784172026-03-17 16:31:119 days ago1773765071IN
0x2deE636E...ea41d9145
0 ETH0.000274890.48331332
Deploy Balance R...246784072026-03-17 16:29:119 days ago1773764951IN
0x2deE636E...ea41d9145
0 ETH0.000612331.11669278
Deploy Balance R...246783662026-03-17 16:20:479 days ago1773764447IN
0x2deE636E...ea41d9145
0 ETH0.000370330.68816649
Deploy Balance R...246783552026-03-17 16:18:359 days ago1773764315IN
0x2deE636E...ea41d9145
0 ETH0.000549371.12861452
Deploy Balance R...246783442026-03-17 16:16:239 days ago1773764183IN
0x2deE636E...ea41d9145
0 ETH0.000138030.29278395
Deploy Balance R...246783402026-03-17 16:15:359 days ago1773764135IN
0x2deE636E...ea41d9145
0 ETH0.000179230.39295718
Deploy Balance R...246783252026-03-17 16:12:359 days ago1773763955IN
0x2deE636E...ea41d9145
0 ETH0.000621681.41057086
Deploy Balance R...246781792026-03-17 15:42:5910 days ago1773762179IN
0x2deE636E...ea41d9145
0 ETH0.000283130.66567784
Deploy Balance R...246776212026-03-17 13:49:4710 days ago1773755387IN
0x2deE636E...ea41d9145
0 ETH0.000294530.74653999
Deploy Balance R...246750602026-03-17 5:14:1110 days ago1773724451IN
0x2deE636E...ea41d9145
0 ETH0.000447760.10501447
Deploy Balance R...246750502026-03-17 5:12:1110 days ago1773724331IN
0x2deE636E...ea41d9145
0 ETH0.000424670.0997204
Deploy Balance R...246750362026-03-17 5:09:2310 days ago1773724163IN
0x2deE636E...ea41d9145
0 ETH0.000452630.10641433
Deploy Balance R...246750302026-03-17 5:08:1110 days ago1773724091IN
0x2deE636E...ea41d9145
0 ETH0.00051110.12030896
Deploy Balance R...246535792026-03-14 5:18:1113 days ago1773465491IN
0x2deE636E...ea41d9145
0 ETH0.00034310.08086394
Deploy Balance R...246535692026-03-14 5:16:1113 days ago1773465371IN
0x2deE636E...ea41d9145
0 ETH0.000344110.08119844
Deploy Balance R...246391932026-03-12 5:07:4715 days ago1773292067IN
0x2deE636E...ea41d9145
0 ETH0.000642460.15178822
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
0x60a06040246822222026-03-18 5:17:239 days ago1773811043
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246822152026-03-18 5:15:599 days ago1773810959
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246822122026-03-18 5:15:239 days ago1773810923
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246822072026-03-18 5:14:239 days ago1773810863
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246822012026-03-18 5:13:119 days ago1773810791
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246821962026-03-18 5:12:119 days ago1773810731
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246821902026-03-18 5:10:599 days ago1773810659
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246784342026-03-17 16:34:359 days ago1773765275
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246784232026-03-17 16:32:239 days ago1773765143
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246784172026-03-17 16:31:119 days ago1773765071
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246784072026-03-17 16:29:119 days ago1773764951
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246783662026-03-17 16:20:479 days ago1773764447
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246783552026-03-17 16:18:359 days ago1773764315
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246783442026-03-17 16:16:239 days ago1773764183
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246783402026-03-17 16:15:359 days ago1773764135
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246783252026-03-17 16:12:359 days ago1773763955
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246781792026-03-17 15:42:5910 days ago1773762179
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246776212026-03-17 13:49:4710 days ago1773755387
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246750602026-03-17 5:14:1110 days ago1773724451
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246750502026-03-17 5:12:1110 days ago1773724331
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246750362026-03-17 5:09:2310 days ago1773724163
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246750302026-03-17 5:08:1110 days ago1773724091
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246535792026-03-14 5:18:1113 days ago1773465491
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246535692026-03-14 5:16:1113 days ago1773465371
0x2deE636E...ea41d9145
 Contract Creation0 ETH
0x60a06040246391932026-03-12 5:07:4715 days ago1773292067
0x2deE636E...ea41d9145
 Contract Creation0 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PayBalanceFactory

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 999999 runs

Other Settings:
london EvmVersion
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.12;

import "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
import "openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "openzeppelin-contracts/contracts/utils/Create2.sol";
import "solmate/utils/SSTORE2.sol";

/// Factory to deploy PayBalanceReader contracts at deterministic addresses.
contract PayBalanceFactory {
    bytes32 private constant SALT = bytes32(0);

    /// Emitted when a new PayBalanceReader is deployed
    event Deploy(address indexed reader, uint256 nTokens);

    /// Predicts the address where a PayBalanceReader will be deployed.
    function getBalanceReader(
        IERC20[] memory _tokens
    ) public view returns (address addr, uint256 codeSize) {
        bytes memory bytecode = _getCreationBytecode(_tokens);
        addr = Create2.computeAddress(SALT, keccak256(bytecode));
        codeSize = addr.code.length;
    }

    /// Deploys a PayBalanceReader deterministically, using CREATE2.
    function deployBalanceReader(
        IERC20[] memory _tokens
    ) public returns (address) {
        bytes memory bytecode = _getCreationBytecode(_tokens);
        address reader = Create2.deploy(0, SALT, bytecode);
        emit Deploy(reader, _tokens.length);
        return reader;
    }

    function _getCreationBytecode(
        IERC20[] memory _tokens
    ) private pure returns (bytes memory) {
        require(_tokens.length > 0, "No tokens provided");
        bytes memory creationBytecode = type(PayBalanceReader).creationCode;
        return abi.encodePacked(creationBytecode, abi.encode(_tokens));
    }
}

/// Efficiently fetches token balances using SSTORE2 for address storage.
contract PayBalanceReader {
    /// Pointer to SSTORE2 storage containing packed token addresses
    address public immutable pointer;

    constructor(IERC20[] memory _tokens) {
        bytes memory packed = new bytes(_tokens.length * 20);
        for (uint256 i = 0; i < _tokens.length; ++i) {
            bytes20 tokenAddr = bytes20(address(_tokens[i]));
            assembly {
                mstore(add(add(packed, 32), mul(i, 20)), tokenAddr)
            }
        }
        pointer = SSTORE2.write(packed);
    }

    /// Returns list of ERC-20 tokens by reading from SSTORE2 storage
    function getAllTokens() public view returns (IERC20[] memory) {
        bytes memory packed = SSTORE2.read(pointer);
        uint256 n = packed.length / 20;
        IERC20[] memory tokens = new IERC20[](n);
        for (uint256 i = 0; i < n; ++i) {
            bytes20 tokenAddr;
            assembly {
                tokenAddr := mload(add(add(packed, 32), mul(i, 20)))
            }
            tokens[i] = IERC20(address(tokenAddr));
        }
        return tokens;
    }

    /// Get the balances for all saved tokens and the balance of the native
    /// asset (the last array element) for a given owner.
    /// Also returns the block number at which the balances were fetched.
    function getTokenBalances(
        address owner
    ) public view returns (uint256[] memory balances, uint256 blockNumber) {
        IERC20[] memory tokens = getAllTokens();
        uint256 n = tokens.length;

        balances = new uint256[](n + 1);
        for (uint256 i = 0; i < n; ++i) {
            balances[i] = tokens[i].balanceOf(owner);
        }

        balances[n] = owner.balance;
        blockNumber = block.number;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
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: MIT
// OpenZeppelin Contracts (last updated v5.1.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 ERC-20 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.1.0) (utils/Create2.sol)

pragma solidity ^0.8.20;

import {Errors} from "./Errors.sol";

/**
 * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.
 * `CREATE2` can be used to compute in advance the address where a smart
 * contract will be deployed, which allows for interesting new mechanisms known
 * as 'counterfactual interactions'.
 *
 * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more
 * information.
 */
library Create2 {
    /**
     * @dev There's no code to deploy.
     */
    error Create2EmptyBytecode();

    /**
     * @dev Deploys a contract using `CREATE2`. The address where the contract
     * will be deployed can be known in advance via {computeAddress}.
     *
     * The bytecode for a contract can be obtained from Solidity with
     * `type(contractName).creationCode`.
     *
     * Requirements:
     *
     * - `bytecode` must not be empty.
     * - `salt` must have not been used for `bytecode` already.
     * - the factory must have a balance of at least `amount`.
     * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.
     */
    function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) {
        if (address(this).balance < amount) {
            revert Errors.InsufficientBalance(address(this).balance, amount);
        }
        if (bytecode.length == 0) {
            revert Create2EmptyBytecode();
        }
        assembly ("memory-safe") {
            addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)
            // if no address was created, and returndata is not empty, bubble revert
            if and(iszero(addr), not(iszero(returndatasize()))) {
                let p := mload(0x40)
                returndatacopy(p, 0, returndatasize())
                revert(p, returndatasize())
            }
        }
        if (addr == address(0)) {
            revert Errors.FailedDeployment();
        }
    }

    /**
     * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the
     * `bytecodeHash` or `salt` will result in a new destination address.
     */
    function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {
        return computeAddress(salt, bytecodeHash, address(this));
    }

    /**
     * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at
     * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.
     */
    function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) {
        assembly ("memory-safe") {
            let ptr := mload(0x40) // Get free memory pointer

            // |                   | ↓ ptr ...  ↓ ptr + 0x0B (start) ...  ↓ ptr + 0x20 ...  ↓ ptr + 0x40 ...   |
            // |-------------------|---------------------------------------------------------------------------|
            // | bytecodeHash      |                                                        CCCCCCCCCCCCC...CC |
            // | salt              |                                      BBBBBBBBBBBBB...BB                   |
            // | deployer          | 000000...0000AAAAAAAAAAAAAAAAAAA...AA                                     |
            // | 0xFF              |            FF                                                             |
            // |-------------------|---------------------------------------------------------------------------|
            // | memory            | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |
            // | keccak(start, 85) |            ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |

            mstore(add(ptr, 0x40), bytecodeHash)
            mstore(add(ptr, 0x20), salt)
            mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes
            let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff
            mstore8(start, 0xff)
            addr := and(keccak256(start, 85), 0xffffffffffffffffffffffffffffffffffffffff)
        }
    }
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Read and write to persistent storage at a fraction of the cost.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SSTORE2.sol)
/// @author Modified from 0xSequence (https://github.com/0xSequence/sstore2/blob/master/contracts/SSTORE2.sol)
library SSTORE2 {
    uint256 internal constant DATA_OFFSET = 1; // We skip the first byte as it's a STOP opcode to ensure the contract can't be called.

    /*//////////////////////////////////////////////////////////////
                               WRITE LOGIC
    //////////////////////////////////////////////////////////////*/

    function write(bytes memory data) internal returns (address pointer) {
        // Prefix the bytecode with a STOP opcode to ensure it cannot be called.
        bytes memory runtimeCode = abi.encodePacked(hex"00", data);

        bytes memory creationCode = abi.encodePacked(
            //---------------------------------------------------------------------------------------------------------------//
            // Opcode  | Opcode + Arguments  | Description  | Stack View                                                     //
            //---------------------------------------------------------------------------------------------------------------//
            // 0x60    |  0x600B             | PUSH1 11     | codeOffset                                                     //
            // 0x59    |  0x59               | MSIZE        | 0 codeOffset                                                   //
            // 0x81    |  0x81               | DUP2         | codeOffset 0 codeOffset                                        //
            // 0x38    |  0x38               | CODESIZE     | codeSize codeOffset 0 codeOffset                               //
            // 0x03    |  0x03               | SUB          | (codeSize - codeOffset) 0 codeOffset                           //
            // 0x80    |  0x80               | DUP          | (codeSize - codeOffset) (codeSize - codeOffset) 0 codeOffset   //
            // 0x92    |  0x92               | SWAP3        | codeOffset (codeSize - codeOffset) 0 (codeSize - codeOffset)   //
            // 0x59    |  0x59               | MSIZE        | 0 codeOffset (codeSize - codeOffset) 0 (codeSize - codeOffset) //
            // 0x39    |  0x39               | CODECOPY     | 0 (codeSize - codeOffset)                                      //
            // 0xf3    |  0xf3               | RETURN       |                                                                //
            //---------------------------------------------------------------------------------------------------------------//
            hex"60_0B_59_81_38_03_80_92_59_39_F3", // Returns all code in the contract except for the first 11 (0B in hex) bytes.
            runtimeCode // The bytecode we want the contract to have after deployment. Capped at 1 byte less than the code size limit.
        );

        /// @solidity memory-safe-assembly
        assembly {
            // Deploy a new contract with the generated creation code.
            // We start 32 bytes into the code to avoid copying the byte length.
            pointer := create(0, add(creationCode, 32), mload(creationCode))
        }

        require(pointer != address(0), "DEPLOYMENT_FAILED");
    }

    /*//////////////////////////////////////////////////////////////
                               READ LOGIC
    //////////////////////////////////////////////////////////////*/

    function read(address pointer) internal view returns (bytes memory) {
        return readBytecode(pointer, DATA_OFFSET, pointer.code.length - DATA_OFFSET);
    }

    function read(address pointer, uint256 start) internal view returns (bytes memory) {
        start += DATA_OFFSET;

        return readBytecode(pointer, start, pointer.code.length - start);
    }

    function read(
        address pointer,
        uint256 start,
        uint256 end
    ) internal view returns (bytes memory) {
        start += DATA_OFFSET;
        end += DATA_OFFSET;

        require(pointer.code.length >= end, "OUT_OF_BOUNDS");

        return readBytecode(pointer, start, end - start);
    }

    /*//////////////////////////////////////////////////////////////
                          INTERNAL HELPER LOGIC
    //////////////////////////////////////////////////////////////*/

    function readBytecode(
        address pointer,
        uint256 start,
        uint256 size
    ) private view returns (bytes memory data) {
        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            data := mload(0x40)

            // Update the free memory pointer to prevent overriding our data.
            // We use and(x, not(31)) as a cheaper equivalent to sub(x, mod(x, 32)).
            // Adding 31 to size and running the result through the logic above ensures
            // the memory pointer remains word-aligned, following the Solidity convention.
            mstore(0x40, add(data, and(add(add(size, 32), 31), not(31))))

            // Store the size of the data in the first 32 byte chunk of free memory.
            mstore(data, size)

            // Copy the code into memory right after the 32 bytes we used to store the size.
            extcodecopy(pointer, add(data, 32), start, size)
        }
    }
}

File 6 of 6 : Errors.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)

pragma solidity ^0.8.20;

/**
 * @dev Collection of common custom errors used in multiple contracts
 *
 * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.
 * It is recommended to avoid relying on the error API for critical functionality.
 *
 * _Available since v5.1._
 */
library Errors {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error InsufficientBalance(uint256 balance, uint256 needed);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedCall();

    /**
     * @dev The deployment failed.
     */
    error FailedDeployment();

    /**
     * @dev A necessary precompile is missing.
     */
    error MissingPrecompile(address);
}

Settings
{
  "remappings": [
    "@axelar-network/=lib/axelar-gmp-sdk-solidity/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/",
    "@layerzerolabs/oft-evm/=lib/devtools/packages/oft-evm/",
    "@layerzerolabs/oapp-evm/=lib/devtools/packages/oapp-evm/",
    "@layerzerolabs/lz-evm-protocol-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/",
    "@layerzerolabs/lz-evm-messagelib-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/messagelib/",
    "@layerzerolabs/lz-evm-oapp-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/",
    "@stargatefinance/stg-evm-v2/=lib/stargate-v2/packages/stg-evm-v2/",
    "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "LayerZero-v2/=lib/LayerZero-v2/",
    "axelar-gmp-sdk-solidity/=lib/axelar-gmp-sdk-solidity/contracts/",
    "devtools/=lib/devtools/packages/toolbox-foundry/src/",
    "ds-test/=lib/solmate/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/",
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
    "solmate/=lib/solmate/src/",
    "stargate-v2/=lib/stargate-v2/packages/stg-evm-v2/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "viaIR": true
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"name":"Create2EmptyBytecode","type":"error"},{"inputs":[],"name":"FailedDeployment","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"reader","type":"address"},{"indexed":false,"internalType":"uint256","name":"nTokens","type":"uint256"}],"name":"Deploy","type":"event"},{"inputs":[{"internalType":"contract IERC20[]","name":"_tokens","type":"address[]"}],"name":"deployBalanceReader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20[]","name":"_tokens","type":"address[]"}],"name":"getBalanceReader","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"codeSize","type":"uint256"}],"stateMutability":"view","type":"function"}]

60808060405234601557610d35908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c80633875f3dc1461011b57634229ea131461003257600080fd5b3461011657610040366101e9565b610049816102d8565b8051156100ec57805160009160200182f53d15198115166100e05773ffffffffffffffffffffffffffffffffffffffff1680156100b657807faf354defc104ba9267634f156652b1f1cfbd10746c329e2bdd48abd4c9cff9296020809451604051908152a2604051908152f35b7fb06ebf3d0000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b7f4ca249dc0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b3461011657604073ffffffffffffffffffffffffffffffffffffffff6055600b61014c610147366101e9565b6102d8565b6020815191012084519085820152600060208201523081520160ff81532016803b82519182526020820152f35b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176101ba57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126101165760043567ffffffffffffffff811161011657816023820112156101165780600401359167ffffffffffffffff83116101ba578260051b916040519361025b6020850186610179565b84526024602085019382010191821161011657602401915b8183106102805750505090565b823573ffffffffffffffffffffffffffffffffffffffff8116810361011657815260209283019201610273565b9081519160005b8381106102c5575050016000815290565b80602080928401015181850152016102b4565b8051156103d457604051906108cd6102f36020820184610179565b80835261043360208401396040519060408201602080840152815180915260206060840192019060005b8181106103a85750505091610379826103636103a59461037396037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610179565b60405194859360208501906102ad565b906102ad565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610179565b90565b825173ffffffffffffffffffffffffffffffffffffffff1684526020938401939092019160010161031d565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f20746f6b656e732070726f766964656400000000000000000000000000006044820152fdfe60a0604052346100d7576108cd803803809161001a826100f2565b60a03960208160a00191126100d75760a051906001600160401b0382116100d7578060bf830112156100d75760a0820151906001600160401b0382116100dc578160051b92604051926100706020860185610118565b835260c060208401948201019182116100d75760c001925b8184106100b75761009883610180565b6040516105b69081610317823960805181818161012901526104640152f35b83516001600160a01b03811681036100d757815260209384019301610088565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60a0601f91909101601f19168101906001600160401b038211908210176100dc57604052565b601f909101601f19168101906001600160401b038211908210176100dc57604052565b6001600160401b0381116100dc57601f01601f191660200190565b805182101561016a5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b90815160148102908082046014149015171561022f5761019f8161013b565b906101ad6040519283610118565b8082526101bc601f199161013b565b0136602083013760005b835181101561021e578061020e6101fe6101f26101e560019589610156565b516001600160a01b031690565b6001600160a01b031690565b60601b6001600160601b03191690565b60206014830285010152016101c6565b5061022a919250610270565b608052565b634e487b7160e01b600052601160045260246000fd5b9081519160005b83811061025d575050016000815290565b806020809284010151818501520161024c565b61029c61028e91604051928391600060208401526021830190610245565b03601f198101835282610118565b6040516102c68161028e60208201946a600b5981380380925939f360a81b8652602b830190610245565b51906000f0906001600160a01b038216156102dd57565b60405162461bcd60e51b81526020600482015260116024820152701111541313d65351539517d19052531151607a1b6044820152606490fdfe6080604052600436101561001257600080fd5b60003560e01c80632a5c792a146100475780632f5f3b3c146100425763764f3aa81461003d57600080fd5b610192565b6100de565b346100d95760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d95761007e610462565b60405180916020820160208352815180915260206040840192019060005b8181106100aa575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff1684528594506020938401939092019160010161009c565b600080fd5b346100d95760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d957602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b929190604084019060408552805180925260206060860191019160005b81811061017c57505060209150930152565b835183526020938401939092019160010161016a565b346100d95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d95760043573ffffffffffffffffffffffffffffffffffffffff811681036100d9576101e9610462565b80516101fc6101f782610557565b6103d0565b9160005b82811061022b5750506102186102279331918361041f565b5260405191829143908361014d565b0390f35b61026e61025561023b838561041f565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201529190602090839060249082905afa801561030f576001926000916102e1575b506102da828761041f565b5201610200565b610302915060203d8111610308575b6102fa8183610372565b810190610565565b386102cf565b503d6102f0565b610574565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176103b357604052565b610343565b67ffffffffffffffff81116103b35760051b60200190565b906103da826103b8565b6103e76040519182610372565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061041582946103b8565b0190602036910137565b80518210156104335760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f0000000000000000000000000000000000000000000000000000000000000000803b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820190828211610552576001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603e604051950116840160405282845260208401903c8051601490046104fa816103d0565b9160005b82811061050b5750505090565b8061054c61052761025560206014600196028701015160601c90565b610531838861041f565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016104fe565b610314565b906001820180921161055257565b908160209103126100d9575190565b6040513d6000823e3d90fdfea2646970667358221220252b955297c2684e823be6e070c5262908373d17aa0fe210e08e38005d7639cc64736f6c634300081a0033a2646970667358221220acc78e9d7e9ce18d2d93425846f83412cf96838e0acf651691eb27064a6d815d64736f6c634300081a0033

Deployed Bytecode

0x6080604052600436101561001257600080fd5b60003560e01c80633875f3dc1461011b57634229ea131461003257600080fd5b3461011657610040366101e9565b610049816102d8565b8051156100ec57805160009160200182f53d15198115166100e05773ffffffffffffffffffffffffffffffffffffffff1680156100b657807faf354defc104ba9267634f156652b1f1cfbd10746c329e2bdd48abd4c9cff9296020809451604051908152a2604051908152f35b7fb06ebf3d0000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b7f4ca249dc0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b3461011657604073ffffffffffffffffffffffffffffffffffffffff6055600b61014c610147366101e9565b6102d8565b6020815191012084519085820152600060208201523081520160ff81532016803b82519182526020820152f35b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176101ba57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126101165760043567ffffffffffffffff811161011657816023820112156101165780600401359167ffffffffffffffff83116101ba578260051b916040519361025b6020850186610179565b84526024602085019382010191821161011657602401915b8183106102805750505090565b823573ffffffffffffffffffffffffffffffffffffffff8116810361011657815260209283019201610273565b9081519160005b8381106102c5575050016000815290565b80602080928401015181850152016102b4565b8051156103d457604051906108cd6102f36020820184610179565b80835261043360208401396040519060408201602080840152815180915260206060840192019060005b8181106103a85750505091610379826103636103a59461037396037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610179565b60405194859360208501906102ad565b906102ad565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610179565b90565b825173ffffffffffffffffffffffffffffffffffffffff1684526020938401939092019160010161031d565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f20746f6b656e732070726f766964656400000000000000000000000000006044820152fdfe60a0604052346100d7576108cd803803809161001a826100f2565b60a03960208160a00191126100d75760a051906001600160401b0382116100d7578060bf830112156100d75760a0820151906001600160401b0382116100dc578160051b92604051926100706020860185610118565b835260c060208401948201019182116100d75760c001925b8184106100b75761009883610180565b6040516105b69081610317823960805181818161012901526104640152f35b83516001600160a01b03811681036100d757815260209384019301610088565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60a0601f91909101601f19168101906001600160401b038211908210176100dc57604052565b601f909101601f19168101906001600160401b038211908210176100dc57604052565b6001600160401b0381116100dc57601f01601f191660200190565b805182101561016a5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b90815160148102908082046014149015171561022f5761019f8161013b565b906101ad6040519283610118565b8082526101bc601f199161013b565b0136602083013760005b835181101561021e578061020e6101fe6101f26101e560019589610156565b516001600160a01b031690565b6001600160a01b031690565b60601b6001600160601b03191690565b60206014830285010152016101c6565b5061022a919250610270565b608052565b634e487b7160e01b600052601160045260246000fd5b9081519160005b83811061025d575050016000815290565b806020809284010151818501520161024c565b61029c61028e91604051928391600060208401526021830190610245565b03601f198101835282610118565b6040516102c68161028e60208201946a600b5981380380925939f360a81b8652602b830190610245565b51906000f0906001600160a01b038216156102dd57565b60405162461bcd60e51b81526020600482015260116024820152701111541313d65351539517d19052531151607a1b6044820152606490fdfe6080604052600436101561001257600080fd5b60003560e01c80632a5c792a146100475780632f5f3b3c146100425763764f3aa81461003d57600080fd5b610192565b6100de565b346100d95760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d95761007e610462565b60405180916020820160208352815180915260206040840192019060005b8181106100aa575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff1684528594506020938401939092019160010161009c565b600080fd5b346100d95760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d957602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b929190604084019060408552805180925260206060860191019160005b81811061017c57505060209150930152565b835183526020938401939092019160010161016a565b346100d95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d95760043573ffffffffffffffffffffffffffffffffffffffff811681036100d9576101e9610462565b80516101fc6101f782610557565b6103d0565b9160005b82811061022b5750506102186102279331918361041f565b5260405191829143908361014d565b0390f35b61026e61025561023b838561041f565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201529190602090839060249082905afa801561030f576001926000916102e1575b506102da828761041f565b5201610200565b610302915060203d8111610308575b6102fa8183610372565b810190610565565b386102cf565b503d6102f0565b610574565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176103b357604052565b610343565b67ffffffffffffffff81116103b35760051b60200190565b906103da826103b8565b6103e76040519182610372565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061041582946103b8565b0190602036910137565b80518210156104335760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f0000000000000000000000000000000000000000000000000000000000000000803b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820190828211610552576001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603e604051950116840160405282845260208401903c8051601490046104fa816103d0565b9160005b82811061050b5750505090565b8061054c61052761025560206014600196028701015160601c90565b610531838861041f565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016104fe565b610314565b906001820180921161055257565b908160209103126100d9575190565b6040513d6000823e3d90fdfea2646970667358221220252b955297c2684e823be6e070c5262908373d17aa0fe210e08e38005d7639cc64736f6c634300081a0033a2646970667358221220acc78e9d7e9ce18d2d93425846f83412cf96838e0acf651691eb27064a6d815d64736f6c634300081a0033

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.