ETH Price: $1,984.51 (-1.73%)

Transaction Decoder

Block:
23324448 at Sep-09-2025 08:49:47 AM +UTC
Transaction Fee:
0.00001751160714073 ETH $0.03
Gas Used:
64,858 Gas / 0.269999185 Gwei

Emitted Events:

535 ESG.Transfer( from=[Receiver] DividendRecordsV4, to=GnosisSafeProxy, amount=1381140000000000000 )
536 ESG.Transfer( from=[Receiver] DividendRecordsV4, to=[Sender] 0xeebf785a11e0fe2803a94ef7ad86a2d9dbbe8177, amount=136732860000000000000 )
537 DividendRecordsV4.EsgClaimed( account=[Sender] 0xeebf785a11e0fe2803a94ef7ad86a2d9dbbe8177, userAmount=136732860000000000000, wallet=GnosisSafeProxy, feeAmount=1381140000000000000 )

Account State Difference:

  Address   Before After State Difference Code
0x20cD2E7E...f1561b9a9
0x941B5e4A...efcfB6396
(BuilderNet)
35.637666553504858154 Eth35.637666564202536674 Eth0.00000001069767852
0xEebF785A...9dBBe8177
0.008498208126618376 Eth
Nonce: 8
0.008480696519477646 Eth
Nonce: 9
0.00001751160714073

Execution Trace

DividendRecordsV4.CALL( )
  • ESG.transfer( dst=0xfe386A3dc8620C577658404b229Ea196f947cd22, rawAmount=1381140000000000000 ) => ( True )
  • ESG.transfer( dst=0xEebF785A11E0FE2803A94EF7Ad86A2D9dBBe8177, rawAmount=136732860000000000000 ) => ( True )
    File 1 of 3: DividendRecordsV4
    pragma solidity >=0.5.16;
    pragma experimental ABIEncoderV2;
    import "./EIP20Interface.sol";
    contract DividendRecordsV4 {
        /// @notice ESG token
        EIP20Interface public esg;
        /// @notice Emitted when ESG is claimed 
        event EsgClaimed(address account, uint userAmount, address wallet, uint feeAmount);
        address public _marketingWalletAddress;
        uint256 public _feeRate = 1;
        mapping (address => uint256) public bonuslist;
        address public owner;
        constructor(address esgAddress, address _marketingWallet) public {
            owner = msg.sender;
            _marketingWalletAddress = _marketingWallet;
            esg = EIP20Interface(esgAddress);
        }
        modifier onlyOwner() {
            require(msg.sender == owner, "Only owner can call this function.");
            _;
        }
        function setFeeRate(uint256 _fee) onlyOwner public {
            require(_fee <= 100, "Fee rate must be less than or equal to 100%");
            _feeRate = _fee;
        }
        function setFeeWallets(address _wallet) onlyOwner public {
            require(_wallet != address(0), "Invalid address");
            _marketingWalletAddress = _wallet;
        }
        function setEsgAmount(address[] memory _to, uint256[] memory _amount) onlyOwner public returns (bool) {
            require(_to.length == _amount.length, "The length of the two arrays must be the same");
            for (uint256 i = 0; i < _to.length; i++) {
                bonuslist[_to[i]] += _amount[i];
            }
            return true;
        }
        function claim() public returns (bool) {
            require(bonuslist[msg.sender] > 0, "No locked amount.");
            uint256 totalAmount = bonuslist[msg.sender];
            bonuslist[msg.sender] = 0;
            uint256 feeWallet = totalAmount * _feeRate / 100;
            uint256 userAmount = totalAmount - feeWallet;
            
            esg.transfer(_marketingWalletAddress, feeWallet);
            esg.transfer(msg.sender, userAmount);
            emit EsgClaimed(msg.sender, userAmount, _marketingWalletAddress, feeWallet);
            return true;
        }
        function transferOwnership(address newOwner) onlyOwner public {
            require(newOwner != address(0), "New owner is the zero address");
            owner = newOwner;
        }
    }
    pragma solidity ^0.5.16;
    /**
     * @title ERC 20 Token Standard Interface
     *  https://eips.ethereum.org/EIPS/eip-20
     */
    interface EIP20Interface {
        function name() external view returns (string memory);
        function symbol() external view returns (string memory);
        function decimals() external view returns (uint8);
        /**
          * @notice Get the total number of tokens in circulation
          * @return The supply of tokens
          */
        function totalSupply() external view returns (uint256);
        /**
         * @notice Gets the balance of the specified address
         * @param owner The address from which the balance will be retrieved
         * @return The balance
         */
        function balanceOf(address owner) external view returns (uint256 balance);
        /**
          * @notice Transfer `amount` tokens from `msg.sender` to `dst`
          * @param dst The address of the destination account
          * @param amount The number of tokens to transfer
          * @return Whether or not the transfer succeeded
          */
        function transfer(address dst, uint256 amount) external returns (bool success);
        /**
          * @notice Transfer `amount` tokens from `src` to `dst`
          * @param src The address of the source account
          * @param dst The address of the destination account
          * @param amount The number of tokens to transfer
          * @return Whether or not the transfer succeeded
          */
        function transferFrom(address src, address dst, uint256 amount) external returns (bool success);
        /**
          * @notice Approve `spender` to transfer up to `amount` from `src`
          * @dev This will overwrite the approval amount for `spender`
          *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
          * @param spender The address of the account which may transfer tokens
          * @param amount The number of tokens that are approved (-1 means infinite)
          * @return Whether or not the approval succeeded
          */
        function approve(address spender, uint256 amount) external returns (bool success);
        /**
          * @notice Get the current allowance from `owner` for `spender`
          * @param owner The address of the account which owns the tokens to be spent
          * @param spender The address of the account which may transfer tokens
          * @return The number of tokens allowed to be spent (-1 means infinite)
          */
        function allowance(address owner, address spender) external view returns (uint256 remaining);
        event Transfer(address indexed from, address indexed to, uint256 amount);
        event Approval(address indexed owner, address indexed spender, uint256 amount);
    }

    File 2 of 3: GnosisSafeProxy
    // SPDX-License-Identifier: LGPL-3.0-only
    pragma solidity >=0.7.0 <0.9.0;
    
    /// @title IProxy - Helper interface to access masterCopy of the Proxy on-chain
    /// @author Richard Meissner - <richard@gnosis.io>
    interface IProxy {
        function masterCopy() external view returns (address);
    }
    
    /// @title GnosisSafeProxy - Generic proxy contract allows to execute all transactions applying the code of a master contract.
    /// @author Stefan George - <stefan@gnosis.io>
    /// @author Richard Meissner - <richard@gnosis.io>
    contract GnosisSafeProxy {
        // 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;
    
        /// @dev 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())
            }
        }
    }
    
    /// @title Proxy Factory - Allows to create new proxy contact and execute a message call to the new proxy within one transaction.
    /// @author Stefan George - <stefan@gnosis.pm>
    contract GnosisSafeProxyFactory {
        event ProxyCreation(GnosisSafeProxy proxy, address singleton);
    
        /// @dev Allows to create new proxy contact and execute a message call to the new proxy within one transaction.
        /// @param singleton Address of singleton contract.
        /// @param data Payload for message call sent to new proxy contract.
        function createProxy(address singleton, bytes memory data) public returns (GnosisSafeProxy proxy) {
            proxy = new GnosisSafeProxy(singleton);
            if (data.length > 0)
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    if eq(call(gas(), proxy, 0, add(data, 0x20), mload(data), 0, 0), 0) {
                        revert(0, 0)
                    }
                }
            emit ProxyCreation(proxy, singleton);
        }
    
        /// @dev Allows to retrieve the runtime code of a deployed Proxy. This can be used to check that the expected Proxy was deployed.
        function proxyRuntimeCode() public pure returns (bytes memory) {
            return type(GnosisSafeProxy).runtimeCode;
        }
    
        /// @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(GnosisSafeProxy).creationCode;
        }
    
        /// @dev Allows to create new proxy contact using CREATE2 but it doesn't run the initializer.
        ///      This method is only meant as an utility to be called from other methods
        /// @param _singleton Address of singleton contract.
        /// @param initializer Payload for message call sent to new proxy contract.
        /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.
        function deployProxyWithNonce(
            address _singleton,
            bytes memory initializer,
            uint256 saltNonce
        ) internal returns (GnosisSafeProxy proxy) {
            // If the initializer changes the proxy address should change too. Hashing the initializer data is cheaper than just concatinating it
            bytes32 salt = keccak256(abi.encodePacked(keccak256(initializer), saltNonce));
            bytes memory deploymentData = abi.encodePacked(type(GnosisSafeProxy).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");
        }
    
        /// @dev Allows to create new proxy contact and execute a message call to the new proxy within one transaction.
        /// @param _singleton Address of singleton contract.
        /// @param initializer Payload for message call sent to new proxy contract.
        /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.
        function createProxyWithNonce(
            address _singleton,
            bytes memory initializer,
            uint256 saltNonce
        ) public returns (GnosisSafeProxy proxy) {
            proxy = deployProxyWithNonce(_singleton, initializer, saltNonce);
            if (initializer.length > 0)
                // 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)
                    }
                }
            emit ProxyCreation(proxy, _singleton);
        }
    
        /// @dev Allows to create new proxy contact, execute a message call to the new proxy and call a specified callback within one transaction
        /// @param _singleton Address of singleton contract.
        /// @param initializer Payload for message call sent to new proxy contract.
        /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.
        /// @param callback Callback that will be invoced after the new proxy contract has been successfully deployed and initialized.
        function createProxyWithCallback(
            address _singleton,
            bytes memory initializer,
            uint256 saltNonce,
            IProxyCreationCallback callback
        ) public returns (GnosisSafeProxy proxy) {
            uint256 saltNonceWithCallback = uint256(keccak256(abi.encodePacked(saltNonce, callback)));
            proxy = createProxyWithNonce(_singleton, initializer, saltNonceWithCallback);
            if (address(callback) != address(0)) callback.proxyCreated(proxy, _singleton, initializer, saltNonce);
        }
    
        /// @dev Allows to get the address for a new proxy contact created via `createProxyWithNonce`
        ///      This method is only meant for address calculation purpose when you use an initializer that would revert,
        ///      therefore the response is returned with a revert. When calling this method set `from` to the address of the proxy factory.
        /// @param _singleton Address of singleton contract.
        /// @param initializer Payload for message call sent to new proxy contract.
        /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.
        function calculateCreateProxyWithNonceAddress(
            address _singleton,
            bytes calldata initializer,
            uint256 saltNonce
        ) external returns (GnosisSafeProxy proxy) {
            proxy = deployProxyWithNonce(_singleton, initializer, saltNonce);
            revert(string(abi.encodePacked(proxy)));
        }
    }
    
    interface IProxyCreationCallback {
        function proxyCreated(
            GnosisSafeProxy proxy,
            address _singleton,
            bytes calldata initializer,
            uint256 saltNonce
        ) external;
    }

    File 3 of 3: ESG
    pragma solidity ^0.5.16;
    
    contract ESG {
        /// @notice EIP-20 token name for this token
        string public constant name = "ESG";
    
        /// @notice EIP-20 token symbol for this token
        string public constant symbol = "ESG";
    
        /// @notice EIP-20 token decimals for this token
        uint8 public constant decimals = 18;
    
        /// @notice Total number of tokens in circulation
        uint public constant totalSupply = 49000000e18; // 49 million ESG in Ethereum
    
        /// @notice Allowance amounts on behalf of others
        mapping (address => mapping (address => uint96)) internal allowances;
    
        /// @notice Official record of token balances for each account
        mapping (address => uint96) internal balances;
    
        /// @notice A record of each accounts delegate
        mapping (address => address) public delegates;
    
        /// @notice A checkpoint for marking number of votes from a given block
        struct Checkpoint {
            uint32 fromBlock;
            uint96 votes;
        }
    
        /// @notice A record of votes checkpoints for each account, by index
        mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;
    
        /// @notice The number of checkpoints for each account
        mapping (address => uint32) public numCheckpoints;
    
        /// @notice The EIP-712 typehash for the contract's domain
        bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");
    
        /// @notice The EIP-712 typehash for the delegation struct used by the contract
        bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");
    
        /// @notice A record of states for signing / validating signatures
        mapping (address => uint) public nonces;
    
        /// @notice An event thats emitted when an account changes its delegate
        event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
    
        /// @notice An event thats emitted when a delegate account's vote balance changes
        event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);
    
        /// @notice The standard EIP-20 transfer event
        event Transfer(address indexed from, address indexed to, uint256 amount);
    
        /// @notice The standard EIP-20 approval event
        event Approval(address indexed owner, address indexed spender, uint256 amount);
    
        /**
         * @notice Construct a new ESG token
         * @param account The initial account to grant all the tokens
         */
        constructor (address account) public{
            balances[account] = uint96(totalSupply);
            emit Transfer(address(0), account, totalSupply);
        }
    
        /**
         * @notice Get the number of tokens `spender` is approved to spend on behalf of `account`
         * @param account The address of the account holding the funds
         * @param spender The address of the account spending the funds
         * @return The number of tokens approved
         */
        function allowance(address account, address spender) external view returns (uint) {
            return allowances[account][spender];
        }
    
        /**
         * @notice Approve `spender` to transfer up to `amount` from `src`
         * @dev This will overwrite the approval amount for `spender`
         *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
         * @param spender The address of the account which may transfer tokens
         * @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
         * @return Whether or not the approval succeeded
         */
        function approve(address spender, uint rawAmount) external returns (bool) {
            uint96 amount;
            if (rawAmount == uint(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)) {
                amount = uint96(0xffffffffffffffffffffffff);
            } else {
                amount = safe96(rawAmount, "ESG::approve: amount exceeds 96 bits");
            }
    
            allowances[msg.sender][spender] = amount;
    
            emit Approval(msg.sender, spender, amount);
            return true;
        }
    
        /**
         * @notice Get the number of tokens held by the `account`
         * @param account The address of the account to get the balance of
         * @return The number of tokens held
         */
        function balanceOf(address account) external view returns (uint) {
            return balances[account];
        }
    
        /**
         * @notice Transfer `amount` tokens from `msg.sender` to `dst`
         * @param dst The address of the destination account
         * @param rawAmount The number of tokens to transfer
         * @return Whether or not the transfer succeeded
         */
        function transfer(address dst, uint rawAmount) external returns (bool) {
            uint96 amount = safe96(rawAmount, "ESG::transfer: amount exceeds 96 bits");
            _transferTokens(msg.sender, dst, amount);
            return true;
        }
    
        /**
         * @notice Transfer `amount` tokens from `src` to `dst`
         * @param src The address of the source account
         * @param dst The address of the destination account
         * @param rawAmount The number of tokens to transfer
         * @return Whether or not the transfer succeeded
         */
        function transferFrom(address src, address dst, uint rawAmount) external returns (bool) {
            address spender = msg.sender;
            uint96 spenderAllowance = allowances[src][spender];
            uint96 amount = safe96(rawAmount, "ESG::transferFrom: amount exceeds 96 bits");
    
            if (spender != src && spenderAllowance != uint96(0xffffffffffffffffffffffff)) {
                uint96 newAllowance = sub96(spenderAllowance, amount, "ESG::transferFrom: transfer amount exceeds spender allowance");
                allowances[src][spender] = newAllowance;
    
                emit Approval(src, spender, newAllowance);
            }
    
            _transferTokens(src, dst, amount);
            return true;
        }
    
        /**
         * @notice Delegate votes from `msg.sender` to `delegatee`
         * @param delegatee The address to delegate votes to
         */
        function delegate(address delegatee) external {
            return _delegate(msg.sender, delegatee);
        }
    
        /**
         * @notice Delegates votes from signatory to `delegatee`
         * @param delegatee The address to delegate votes to
         * @param nonce The contract state required to match the signature
         * @param expiry The time at which to expire the signature
         * @param v The recovery byte of the signature
         * @param r Half of the ECDSA signature pair
         * @param s Half of the ECDSA signature pair
         */
        function delegateBySig(address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s) external {
            bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this)));
            bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));
            bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
            address signatory = ecrecover(digest, v, r, s);
            require(signatory != address(0), "ESG::delegateBySig: invalid signature");
            require(nonce == nonces[signatory]++, "ESG::delegateBySig: invalid nonce");
            require(block.timestamp <= expiry, "ESG::delegateBySig: signature expired");
            return _delegate(signatory, delegatee);
        }
    
        /**
         * @notice Gets the current votes balance for `account`
         * @param account The address to get votes balance
         * @return The number of current votes for `account`
         */
        function getCurrentVotes(address account) external view returns (uint96) {
            uint32 nCheckpoints = numCheckpoints[account];
            return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
        }
    
        /**
         * @notice Determine the prior number of votes for an account as of a block number
         * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
         * @param account The address of the account to check
         * @param blockNumber The block number to get the vote balance at
         * @return The number of votes the account had as of the given block
         */
        function getPriorVotes(address account, uint blockNumber) external view returns (uint96) {
            require(blockNumber < block.number, "ESG::getPriorVotes: not yet determined");
    
            uint32 nCheckpoints = numCheckpoints[account];
            if (nCheckpoints == 0) {
                return 0;
            }
    
            // First check most recent balance
            if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
                return checkpoints[account][nCheckpoints - 1].votes;
            }
    
            // Next check implicit zero balance
            if (checkpoints[account][0].fromBlock > blockNumber) {
                return 0;
            }
    
            uint32 lower = 0;
            uint32 upper = nCheckpoints - 1;
            while (upper > lower) {
                uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
                Checkpoint memory cp = checkpoints[account][center];
                if (cp.fromBlock == blockNumber) {
                    return cp.votes;
                } else if (cp.fromBlock < blockNumber) {
                    lower = center;
                } else {
                    upper = center - 1;
                }
            }
            return checkpoints[account][lower].votes;
        }
    
        function _delegate(address delegator, address delegatee) internal {
            address currentDelegate = delegates[delegator];
            uint96 delegatorBalance = balances[delegator];
            delegates[delegator] = delegatee;
    
            emit DelegateChanged(delegator, currentDelegate, delegatee);
    
            _moveDelegates(currentDelegate, delegatee, delegatorBalance);
        }
    
        function _transferTokens(address src, address dst, uint96 amount) internal {
            require(src != address(0), "ESG::_transferTokens: cannot transfer from the zero address");
            require(dst != address(0), "ESG::_transferTokens: cannot transfer to the zero address");
    
            balances[src] = sub96(balances[src], amount, "ESG::_transferTokens: transfer amount exceeds balance");
            balances[dst] = add96(balances[dst], amount, "ESG::_transferTokens: transfer amount overflows");
            emit Transfer(src, dst, amount);
    
            _moveDelegates(delegates[src], delegates[dst], amount);
        }
    
        function _moveDelegates(address srcRep, address dstRep, uint96 amount) internal {
            if (srcRep != dstRep && amount > 0) {
                if (srcRep != address(0)) {
                    uint32 srcRepNum = numCheckpoints[srcRep];
                    uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                    uint96 srcRepNew = sub96(srcRepOld, amount, "ESG::_moveDelegates: vote amount underflows");
                    _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
                }
    
                if (dstRep != address(0)) {
                    uint32 dstRepNum = numCheckpoints[dstRep];
                    uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                    uint96 dstRepNew = add96(dstRepOld, amount, "ESG::_moveDelegates: vote amount overflows");
                    _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
                }
            }
        }
    
        function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint96 oldVotes, uint96 newVotes) internal {
          uint32 blockNumber = safe32(block.number, "ESG::_writeCheckpoint: block number exceeds 32 bits");
    
          if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
              checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
          } else {
              checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
              numCheckpoints[delegatee] = nCheckpoints + 1;
          }
    
          emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
        }
    
        function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
            require(n < 2**32, errorMessage);
            return uint32(n);
        }
    
        function safe96(uint n, string memory errorMessage) internal pure returns (uint96) {
            require(n < 2**96, errorMessage);
            return uint96(n);
        }
    
        function add96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) {
            uint96 c = a + b;
            require(c >= a, errorMessage);
            return c;
        }
    
        function sub96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) {
            require(b <= a, errorMessage);
            return a - b;
        }
    
        function getChainId() internal pure returns (uint) {
            uint256 chainId;
            assembly { chainId := chainid() }
            return chainId;
        }
    }