More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 810,707 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Batch | 130823245 | 2 hrs ago | IN | 0 ETH | 0.000000602542 | ||||
Batch | 130823245 | 2 hrs ago | IN | 0 ETH | 0.000000944231 | ||||
Batch | 130823245 | 2 hrs ago | IN | 0 ETH | 0.000000989182 | ||||
Batch | 130823245 | 2 hrs ago | IN | 0 ETH | 0.000000976968 | ||||
Batch | 130823244 | 2 hrs ago | IN | 0 ETH | 0.000000986255 | ||||
Batch | 130823244 | 2 hrs ago | IN | 0 ETH | 0.000000894958 | ||||
Batch | 130823244 | 2 hrs ago | IN | 0 ETH | 0.000000968882 | ||||
Batch | 130823244 | 2 hrs ago | IN | 0 ETH | 0.000001005347 | ||||
Batch | 130823244 | 2 hrs ago | IN | 0 ETH | 0.000000973526 | ||||
Batch | 130823243 | 2 hrs ago | IN | 0 ETH | 0.000000977368 | ||||
Batch | 130823243 | 2 hrs ago | IN | 0 ETH | 0.000001009587 | ||||
Batch | 130823243 | 2 hrs ago | IN | 0 ETH | 0.000000954434 | ||||
Batch | 130823243 | 2 hrs ago | IN | 0 ETH | 0.000001011712 | ||||
Batch | 130823243 | 2 hrs ago | IN | 0 ETH | 0.000000971005 | ||||
Batch | 130823242 | 2 hrs ago | IN | 0 ETH | 0.000001002025 | ||||
Batch | 130823242 | 2 hrs ago | IN | 0 ETH | 0.000000999001 | ||||
Batch | 130823242 | 2 hrs ago | IN | 0 ETH | 0.000000964542 | ||||
Batch | 130823242 | 2 hrs ago | IN | 0 ETH | 0.0000009878 | ||||
Batch | 130823242 | 2 hrs ago | IN | 0 ETH | 0.000000947317 | ||||
Batch | 130823242 | 2 hrs ago | IN | 0 ETH | 0.000001010189 | ||||
Batch | 130823241 | 2 hrs ago | IN | 0 ETH | 0.000001003744 | ||||
Batch | 130823241 | 2 hrs ago | IN | 0 ETH | 0.000000985647 | ||||
Batch | 130823241 | 2 hrs ago | IN | 0 ETH | 0.000001002442 | ||||
Batch | 130823241 | 2 hrs ago | IN | 0 ETH | 0.000000964979 | ||||
Batch | 130823240 | 2 hrs ago | IN | 0 ETH | 0.00000100159 |
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
Contract Source Code (Solidity Standard Json-Input format)
// 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 ); } } }
// 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) } } }
{ "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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.