ETH Price: $3,369.55 (-2.37%)

Contract

0x6B3872E786Db187c311479ed3D1513A244e31B68
Transaction Hash
Method
Block
From
To
Batch1308232452025-01-19 0:07:472 hrs ago1737245267IN
0x6B3872E7...244e31B68
0 ETH0.0000006025420.00010057
Batch1308232452025-01-19 0:07:472 hrs ago1737245267IN
0x6B3872E7...244e31B68
0 ETH0.0000009442310.00010057
Batch1308232452025-01-19 0:07:472 hrs ago1737245267IN
0x6B3872E7...244e31B68
0 ETH0.0000009891820.00010057
Batch1308232452025-01-19 0:07:472 hrs ago1737245267IN
0x6B3872E7...244e31B68
0 ETH0.0000009769680.00010057
Batch1308232442025-01-19 0:07:452 hrs ago1737245265IN
0x6B3872E7...244e31B68
0 ETH0.0000009862550.00010057
Batch1308232442025-01-19 0:07:452 hrs ago1737245265IN
0x6B3872E7...244e31B68
0 ETH0.0000008949580.00010057
Batch1308232442025-01-19 0:07:452 hrs ago1737245265IN
0x6B3872E7...244e31B68
0 ETH0.0000009688820.00010057
Batch1308232442025-01-19 0:07:452 hrs ago1737245265IN
0x6B3872E7...244e31B68
0 ETH0.0000010053470.00010057
Batch1308232442025-01-19 0:07:452 hrs ago1737245265IN
0x6B3872E7...244e31B68
0 ETH0.0000009735260.00010057
Batch1308232432025-01-19 0:07:432 hrs ago1737245263IN
0x6B3872E7...244e31B68
0 ETH0.0000009773680.00010057
Batch1308232432025-01-19 0:07:432 hrs ago1737245263IN
0x6B3872E7...244e31B68
0 ETH0.0000010095870.00010057
Batch1308232432025-01-19 0:07:432 hrs ago1737245263IN
0x6B3872E7...244e31B68
0 ETH0.0000009544340.00010057
Batch1308232432025-01-19 0:07:432 hrs ago1737245263IN
0x6B3872E7...244e31B68
0 ETH0.0000010117120.00010057
Batch1308232432025-01-19 0:07:432 hrs ago1737245263IN
0x6B3872E7...244e31B68
0 ETH0.0000009710050.00010057
Batch1308232422025-01-19 0:07:412 hrs ago1737245261IN
0x6B3872E7...244e31B68
0 ETH0.0000010020250.00010057
Batch1308232422025-01-19 0:07:412 hrs ago1737245261IN
0x6B3872E7...244e31B68
0 ETH0.0000009990010.00010057
Batch1308232422025-01-19 0:07:412 hrs ago1737245261IN
0x6B3872E7...244e31B68
0 ETH0.0000009645420.00010057
Batch1308232422025-01-19 0:07:412 hrs ago1737245261IN
0x6B3872E7...244e31B68
0 ETH0.00000098780.00010057
Batch1308232422025-01-19 0:07:412 hrs ago1737245261IN
0x6B3872E7...244e31B68
0 ETH0.0000009473170.00010057
Batch1308232422025-01-19 0:07:412 hrs ago1737245261IN
0x6B3872E7...244e31B68
0 ETH0.0000010101890.00010057
Batch1308232412025-01-19 0:07:392 hrs ago1737245259IN
0x6B3872E7...244e31B68
0 ETH0.0000010037440.00010057
Batch1308232412025-01-19 0:07:392 hrs ago1737245259IN
0x6B3872E7...244e31B68
0 ETH0.0000009856470.00010057
Batch1308232412025-01-19 0:07:392 hrs ago1737245259IN
0x6B3872E7...244e31B68
0 ETH0.0000010024420.00010057
Batch1308232412025-01-19 0:07:392 hrs ago1737245259IN
0x6B3872E7...244e31B68
0 ETH0.0000009649790.00010057
Batch1308232402025-01-19 0:07:372 hrs ago1737245257IN
0x6B3872E7...244e31B68
0 ETH0.000001001590.00010057
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BatchSafeAllowanceModuleTransfers

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 10000 runs

Other Settings:
shanghai EvmVersion
File 1 of 2 : BatchSafeAllowanceModuleTransfers.sol
// SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.23;

import { AllowanceModule } from "./AllowanceModule.sol";
import { GnosisSafe } from "./AllowanceModule.sol";

contract BatchSafeAllowanceModuleTransfers {
    /// @notice address of the Safe Allowance Module
    AllowanceModule public immutable ALLOWANCE_MODULE;

    /// @notice Worldcoin token address
    address public immutable WLD_TOKEN;

    /// @notice TxSitter Relayer is the only one that can call the batch function
    address public owner;

    /// @notice BVI Safe that grants allowances to this contract
    GnosisSafe public immutable HOLDER;

    /// @notice Thrown when the caller is not the owner
    error OwnableUnauthorizedAccount(address account);

    /// @notice Calldata struct for batch method
    struct BatchCalldata {
        /// @notice the address of the recipient
        address payable recipient;
        /// @notice the amount to transfer to the recipient
        uint96 amount;
    }

    constructor(address _allowanceModuleAddress, address _wldToken, address _holder, address _owner) {
        ALLOWANCE_MODULE = AllowanceModule(_allowanceModuleAddress);
        WLD_TOKEN = _wldToken;
        HOLDER = GnosisSafe(_holder);
        owner = _owner;
    }

    modifier onlyOwner() {
        if (msg.sender != owner) revert OwnableUnauthorizedAccount(msg.sender);
        _;
    }

    function setOwner(address _owner) external onlyOwner {
        owner = _owner;
    }

    /// @notice Batch transfer WLD tokens to multiple addresses
    /// @dev Can only be called by the owner, which is the relayer address
    /// @param transfers the array of BatchCalldata structs with recipients and amounts to be sent
    function batch(BatchCalldata[] calldata transfers) external onlyOwner {
        for (uint256 i = 0; i < transfers.length; ++i) {
            AllowanceModule(ALLOWANCE_MODULE).executeAllowanceTransfer(
                HOLDER, WLD_TOKEN, transfers[i].recipient, transfers[i].amount
            );
        }
    }
}

File 2 of 2 : AllowanceModule.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.8.21 <0.9.0;

interface GnosisSafe {
    /// @dev Allows a Module to execute a Safe transaction without any further confirmations.
    /// @param to Destination address of module transaction.
    /// @param value Ether value of module transaction.
    /// @param data Data payload of module transaction.
    /// @param operation Operation type of module transaction.
    function execTransactionFromModule(
        address to,
        uint256 value,
        bytes calldata data,
        Enum.Operation operation
    )
        external
        returns (bool success);
}

contract Enum {
    enum Operation {
        Call,
        DelegateCall
    }
}

contract AllowanceModule {
    string public constant NAME = "Allowance Module";
    string public constant VERSION = "0.1.0";

    // Safe -> Delegate -> Allowance
    mapping(address => mapping(address => mapping(address => Allowance))) public allowances;
    // Safe -> Delegate -> Tokens
    mapping(address => mapping(address => address[])) public tokens;
    // Safe -> Delegates double linked list entry points
    mapping(address => uint48) public delegatesStart;
    // Safe -> Delegates double linked list
    mapping(address => mapping(uint48 => Delegate)) public delegates;

    // We use a double linked list for the delegates. The id is the first 6 bytes.
    // To double check the address in case of collision, the address is part of the struct.
    struct Delegate {
        address delegate;
        uint48 prev;
        uint48 next;
    }

    // The allowance info is optimized to fit into one word of storage.
    struct Allowance {
        uint96 amount;
        uint96 spent;
        uint16 resetTimeMin; // Maximum reset time span is 65k minutes
        uint32 lastResetMin;
        bool initialized;
    }

    event AddDelegate(address indexed safe, address delegate);
    event RemoveDelegate(address indexed safe, address delegate);
    event ExecuteAllowanceTransfer(address indexed safe, address delegate, address token, address to, uint96 value);
    event PayAllowanceTransfer(
        address indexed safe, address delegate, address paymentToken, address paymentReceiver, uint96 payment
    );
    event SetAllowance(address indexed safe, address delegate, address token, uint96 allowanceAmount, uint16 resetTime);
    event ResetAllowance(address indexed safe, address delegate, address token);
    event DeleteAllowance(address indexed safe, address delegate, address token);

    /// @dev Allows to update the allowance for a specified token. This can only be done via a Safe transaction.
    /// @param delegate Delegate whose allowance should be updated.
    /// @param token Token contract address.
    /// @param allowanceAmount allowance in smallest token unit.
    /// @param resetTimeMin Time after which the allowance should reset
    /// @param resetBaseMin Time based on which the reset time should be increased
    function setAllowance(
        address delegate,
        address token,
        uint96 allowanceAmount,
        uint16 resetTimeMin,
        uint32 resetBaseMin
    )
        public
    {
        require(delegate != address(0), "delegate != address(0)");
        require(
            delegates[msg.sender][uint48(uint160(delegate))].delegate == delegate,
            "delegates[msg.sender][uint48(uint160(delegate))].delegate == delegate"
        );
        Allowance memory allowance = getAllowance(msg.sender, delegate, token);
        if (!allowance.initialized) {
            // New token
            allowance.initialized = true;
            tokens[msg.sender][delegate].push(token);
        }
        // Divide by 60 to get current time in minutes
        // solium-disable-next-line security/no-block-members
        uint32 currentMin = uint32(block.timestamp / 60);
        if (resetBaseMin > 0) {
            require(resetBaseMin <= currentMin, "resetBaseMin <= currentMin");
            require(resetTimeMin > 0, "resetTimeMin == 0");
            allowance.lastResetMin = currentMin - ((currentMin - resetBaseMin) % resetTimeMin);
        } else if (allowance.lastResetMin == 0) {
            allowance.lastResetMin = currentMin;
        }
        allowance.resetTimeMin = resetTimeMin;
        allowance.amount = allowanceAmount;
        updateAllowance(msg.sender, delegate, token, allowance);
        emit SetAllowance(msg.sender, delegate, token, allowanceAmount, resetTimeMin);
    }

    function getAllowance(
        address safe,
        address delegate,
        address token
    )
        private
        view
        returns (Allowance memory allowance)
    {
        allowance = allowances[safe][delegate][token];
        // solium-disable-next-line security/no-block-members
        uint32 currentMin = uint32(block.timestamp / 60);
        // Check if we should reset the time. We do this on load to minimize storage read/ writes
        if (allowance.resetTimeMin > 0 && allowance.lastResetMin <= currentMin - allowance.resetTimeMin) {
            allowance.spent = 0;
            // Resets happen in regular intervals and `lastResetMin` should be aligned to that
            allowance.lastResetMin = currentMin - ((currentMin - allowance.lastResetMin) % allowance.resetTimeMin);
        }
        return allowance;
    }

    function updateAllowance(address safe, address delegate, address token, Allowance memory allowance) private {
        allowances[safe][delegate][token] = allowance;
    }

    /// @dev Allows to reset the allowance for a specific delegate and token.
    /// @param delegate Delegate whose allowance should be updated.
    /// @param token Token contract address.
    function resetAllowance(address delegate, address token) public {
        Allowance memory allowance = getAllowance(msg.sender, delegate, token);
        allowance.spent = 0;
        updateAllowance(msg.sender, delegate, token, allowance);
        emit ResetAllowance(msg.sender, delegate, token);
    }

    /// @dev Allows to remove the allowance for a specific delegate and token. This will set all values except
    /// `initialized` to 0.
    /// @param delegate Delegate whose allowance should be updated.
    /// @param token Token contract address.
    function deleteAllowance(address delegate, address token) public {
        Allowance memory allowance = getAllowance(msg.sender, delegate, token);
        allowance.amount = 0;
        allowance.spent = 0;
        allowance.resetTimeMin = 0;
        allowance.lastResetMin = 0;
        updateAllowance(msg.sender, delegate, token, allowance);
        emit DeleteAllowance(msg.sender, delegate, token);
    }

    /// @dev Allows to use the allowance to perform a transfer.
    /// @param safe The Safe whose funds should be used.
    /// @param token Token contract address.
    /// @param to Address that should receive the tokens.
    /// @param amount Amount that should be transferred.
    function executeAllowanceTransfer(GnosisSafe safe, address token, address payable to, uint96 amount) public {
        require(amount > 0, "amount == 0");

        // Get current state
        address delegate = msg.sender;
        Allowance memory allowance = getAllowance(address(safe), delegate, token);

        // Update state
        uint96 newSpent = allowance.spent + amount;
        // Check new spent amount
        require(newSpent <= allowance.amount, "newSpent <= allowance.amount");
        allowance.spent = newSpent;
        updateAllowance(address(safe), delegate, token, allowance);

        // Transfer token
        transfer(safe, token, to, amount);
        emit ExecuteAllowanceTransfer(address(safe), delegate, token, to, amount);
    }

    function transfer(GnosisSafe safe, address token, address payable to, uint96 amount) private {
        if (token == address(0)) {
            // solium-disable-next-line security/no-send
            require(
                safe.execTransactionFromModule(to, amount, "", Enum.Operation.Call), "Could not execute ether transfer"
            );
        } else {
            bytes memory data = abi.encodeWithSignature("transfer(address,uint256)", to, amount);
            require(
                safe.execTransactionFromModule(token, 0, data, Enum.Operation.Call), "Could not execute token transfer"
            );
        }
    }

    function getTokens(address safe, address delegate) public view returns (address[] memory) {
        return tokens[safe][delegate];
    }

    function getTokenAllowance(address safe, address delegate, address token) public view returns (uint256[4] memory) {
        Allowance memory allowance = getAllowance(safe, delegate, token);
        return [
            uint256(allowance.amount),
            uint256(allowance.spent),
            uint256(allowance.resetTimeMin),
            uint256(allowance.lastResetMin)
        ];
    }

    /// @dev Allows to add a delegate.
    /// @param delegate Delegate that should be added.
    function addDelegate(address delegate) public {
        uint48 index = uint48(uint160(delegate));
        require(index != uint256(0), "index != uint(0)");
        address currentDelegate = delegates[msg.sender][index].delegate;
        if (currentDelegate != address(0)) {
            // We have a collision for the indices of delegates
            require(currentDelegate == delegate, "currentDelegate == delegate");
            // Delegate already exists, nothing to do
            return;
        }
        uint48 startIndex = delegatesStart[msg.sender];
        delegates[msg.sender][index] = Delegate(delegate, 0, startIndex);
        delegates[msg.sender][startIndex].prev = index;
        delegatesStart[msg.sender] = index;
        emit AddDelegate(msg.sender, delegate);
    }

    /// @dev Allows to remove a delegate.
    /// @param delegate Delegate that should be removed.
    /// @param removeAllowances Indicator if allowances should also be removed. This should be set to `true` unless this
    /// causes an out of gas, in this case the allowances should be "manually" deleted via `deleteAllowance`.
    function removeDelegate(address delegate, bool removeAllowances) public {
        Delegate memory current = delegates[msg.sender][uint48(uint160(delegate))];
        // Delegate doesn't exists, nothing to do
        if (current.delegate == address(0)) return;
        if (removeAllowances) {
            address[] storage delegateTokens = tokens[msg.sender][delegate];
            for (uint256 i = 0; i < delegateTokens.length; i++) {
                address token = delegateTokens[i];
                // Set all allowance params except `initialized` to 0
                Allowance memory allowance = getAllowance(msg.sender, delegate, token);
                allowance.amount = 0;
                allowance.spent = 0;
                allowance.resetTimeMin = 0;
                allowance.lastResetMin = 0;
                updateAllowance(msg.sender, delegate, token, allowance);
                emit DeleteAllowance(msg.sender, delegate, token);
            }
        }
        if (current.prev == 0) {
            delegatesStart[msg.sender] = current.next;
        } else {
            delegates[msg.sender][current.prev].next = current.next;
        }
        if (current.next != 0) {
            delegates[msg.sender][current.next].prev = current.prev;
        }
        delete delegates[msg.sender][uint48(uint160(delegate))];
        emit RemoveDelegate(msg.sender, delegate);
    }

    function getDelegates(
        address safe,
        uint48 start,
        uint8 pageSize
    )
        public
        view
        returns (address[] memory results, uint48 next)
    {
        results = new address[](pageSize);
        uint8 i = 0;
        uint48 initialIndex = (start != 0) ? start : delegatesStart[safe];
        Delegate memory current = delegates[safe][initialIndex];
        while (current.delegate != address(0) && i < pageSize) {
            results[i] = current.delegate;
            i++;
            current = delegates[safe][current.next];
        }
        next = uint48(uint160(current.delegate));
        // Set the length of the array the number that has been used.
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            mstore(results, i)
        }
    }
}

Settings
{
  "remappings": [
    "@prb/test/=lib/prb-test/src/",
    "forge-std/=lib/forge-std/src/",
    "src/=src/",
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "@safe-contracts/=lib/safe-contracts/contracts/",
    "@forge-std/=lib/forge-std/src/",
    "@v3-periphery/=lib/v3-periphery/",
    "@uniswap/v3-core/=lib/v3-core/",
    "@safe-tools/=lib/safe-tools/",
    "solady/=lib/safe-tools/lib/solady/src/",
    "safe-contracts/=lib/safe-tools/lib/safe-contracts/contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/",
    "prb-test/=lib/prb-test/src/",
    "safe-tools/=lib/safe-tools/src/",
    "solmate/=lib/solmate/src/",
    "v3-core/=lib/v3-core/",
    "v3-periphery/=lib/v3-periphery/contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 10000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "shanghai",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_allowanceModuleAddress","type":"address"},{"internalType":"address","name":"_wldToken","type":"address"},{"internalType":"address","name":"_holder","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ALLOWANCE_MODULE","outputs":[{"internalType":"contract AllowanceModule","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER","outputs":[{"internalType":"contract GnosisSafe","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WLD_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint96","name":"amount","type":"uint96"}],"internalType":"struct BatchSafeAllowanceModuleTransfers.BatchCalldata[]","name":"transfers","type":"tuple[]"}],"name":"batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e060405234801561000f575f80fd5b506040516105f13803806105f183398101604081905261002e9161007b565b6001600160a01b0393841660805291831660a052821660c0525f80546001600160a01b031916919092161790556100cc565b80516001600160a01b0381168114610076575f80fd5b919050565b5f805f806080858703121561008e575f80fd5b61009785610060565b93506100a560208601610060565b92506100b360408601610060565b91506100c160608601610060565b905092959194509250565b60805160a05160c0516104e86101095f395f818160a0015261028f01525f818161013601526102b001525f818160f0015261025301526104e85ff3fe608060405234801561000f575f80fd5b506004361061006f575f3560e01c806332d44c611161004d57806332d44c61146100eb5780638da5cb5b14610112578063cdb7354a14610131575f80fd5b806313af403514610073578063170dce2f146100885780632be529d81461009b575b5f80fd5b6100866100813660046103f2565b610158565b005b610086610096366004610414565b6101f5565b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b5f546100c29073ffffffffffffffffffffffffffffffffffffffff1681565b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146101af576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610247576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016101a6565b5f5b818110156103c9577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663861a92df7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008686868181106102e1576102e1610483565b6102f792602060409092020190810191506103f2565b87878781811061030957610309610483565b905060400201602001602081019061032191906104b0565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff94851660048201529284166024840152921660448201526bffffffffffffffffffffffff90911660648201526084015f604051808303815f87803b1580156103a8575f80fd5b505af11580156103ba573d5f803e3d5ffd5b50505050806001019050610249565b505050565b73ffffffffffffffffffffffffffffffffffffffff811681146103ef575f80fd5b50565b5f60208284031215610402575f80fd5b813561040d816103ce565b9392505050565b5f8060208385031215610425575f80fd5b823567ffffffffffffffff8082111561043c575f80fd5b818501915085601f83011261044f575f80fd5b81358181111561045d575f80fd5b8660208260061b8501011115610471575f80fd5b60209290920196919550909350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156104c0575f80fd5b81356bffffffffffffffffffffffff8116811461040d575f80fdfea164736f6c6343000817000a000000000000000000000000948bde4d8670500b0f62cf5c745c82abe7c81a65000000000000000000000000dc6ff44d5d932cbd77b52e5612ba0529dc6226f10000000000000000000000007a21dac79655178e72234b95b6a52ddc25adc16d000000000000000000000000cac1a7ce337957bd737aba084fe0441392e97b21

Deployed Bytecode

0x608060405234801561000f575f80fd5b506004361061006f575f3560e01c806332d44c611161004d57806332d44c61146100eb5780638da5cb5b14610112578063cdb7354a14610131575f80fd5b806313af403514610073578063170dce2f146100885780632be529d81461009b575b5f80fd5b6100866100813660046103f2565b610158565b005b610086610096366004610414565b6101f5565b6100c27f0000000000000000000000007a21dac79655178e72234b95b6a52ddc25adc16d81565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100c27f000000000000000000000000948bde4d8670500b0f62cf5c745c82abe7c81a6581565b5f546100c29073ffffffffffffffffffffffffffffffffffffffff1681565b6100c27f000000000000000000000000dc6ff44d5d932cbd77b52e5612ba0529dc6226f181565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146101af576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610247576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016101a6565b5f5b818110156103c9577f000000000000000000000000948bde4d8670500b0f62cf5c745c82abe7c81a6573ffffffffffffffffffffffffffffffffffffffff1663861a92df7f0000000000000000000000007a21dac79655178e72234b95b6a52ddc25adc16d7f000000000000000000000000dc6ff44d5d932cbd77b52e5612ba0529dc6226f18686868181106102e1576102e1610483565b6102f792602060409092020190810191506103f2565b87878781811061030957610309610483565b905060400201602001602081019061032191906104b0565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff94851660048201529284166024840152921660448201526bffffffffffffffffffffffff90911660648201526084015f604051808303815f87803b1580156103a8575f80fd5b505af11580156103ba573d5f803e3d5ffd5b50505050806001019050610249565b505050565b73ffffffffffffffffffffffffffffffffffffffff811681146103ef575f80fd5b50565b5f60208284031215610402575f80fd5b813561040d816103ce565b9392505050565b5f8060208385031215610425575f80fd5b823567ffffffffffffffff8082111561043c575f80fd5b818501915085601f83011261044f575f80fd5b81358181111561045d575f80fd5b8660208260061b8501011115610471575f80fd5b60209290920196919550909350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156104c0575f80fd5b81356bffffffffffffffffffffffff8116811461040d575f80fdfea164736f6c6343000817000a

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000948bde4d8670500b0f62cf5c745c82abe7c81a65000000000000000000000000dc6ff44d5d932cbd77b52e5612ba0529dc6226f10000000000000000000000007a21dac79655178e72234b95b6a52ddc25adc16d000000000000000000000000cac1a7ce337957bd737aba084fe0441392e97b21

-----Decoded View---------------
Arg [0] : _allowanceModuleAddress (address): 0x948BDE4d8670500b0F62cF5c745C82ABe7c81A65
Arg [1] : _wldToken (address): 0xdC6fF44d5d932Cbd77B52E5612Ba0529DC6226F1
Arg [2] : _holder (address): 0x7A21Dac79655178E72234B95B6a52dDC25adC16D
Arg [3] : _owner (address): 0xcac1A7ce337957bd737ABA084Fe0441392E97b21

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000948bde4d8670500b0f62cf5c745c82abe7c81a65
Arg [1] : 000000000000000000000000dc6ff44d5d932cbd77b52e5612ba0529dc6226f1
Arg [2] : 0000000000000000000000007a21dac79655178e72234b95b6a52ddc25adc16d
Arg [3] : 000000000000000000000000cac1a7ce337957bd737aba084fe0441392e97b21


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.