Source Code
Latest 25 from a total of 870,481 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Batch | 132864196 | 320 days ago | IN | 0 ETH | 0.000000042154 | ||||
| Batch | 132864196 | 320 days ago | IN | 0 ETH | 0.000000063608 | ||||
| Batch | 132864196 | 320 days ago | IN | 0 ETH | 0.00000006361 | ||||
| Batch | 132864196 | 320 days ago | IN | 0 ETH | 0.000000067172 | ||||
| Batch | 132864196 | 320 days ago | IN | 0 ETH | 0.000000072305 | ||||
| Batch | 132864195 | 320 days ago | IN | 0 ETH | 0.000000071637 | ||||
| Batch | 132864195 | 320 days ago | IN | 0 ETH | 0.000000060802 | ||||
| Batch | 132864195 | 320 days ago | IN | 0 ETH | 0.000000066788 | ||||
| Batch | 132864195 | 320 days ago | IN | 0 ETH | 0.000000065933 | ||||
| Batch | 132864195 | 320 days ago | IN | 0 ETH | 0.000000074052 | ||||
| Batch | 132864194 | 320 days ago | IN | 0 ETH | 0.00000007153 | ||||
| Batch | 132864194 | 320 days ago | IN | 0 ETH | 0.00000006574 | ||||
| Batch | 132864194 | 320 days ago | IN | 0 ETH | 0.000000060558 | ||||
| Batch | 132864194 | 320 days ago | IN | 0 ETH | 0.000000061468 | ||||
| Batch | 132864194 | 320 days ago | IN | 0 ETH | 0.000000068549 | ||||
| Batch | 132864194 | 320 days ago | IN | 0 ETH | 0.000000065261 | ||||
| Batch | 132864193 | 320 days ago | IN | 0 ETH | 0.000000067543 | ||||
| Batch | 132864193 | 320 days ago | IN | 0 ETH | 0.000000069684 | ||||
| Batch | 132864193 | 320 days ago | IN | 0 ETH | 0.000000066688 | ||||
| Batch | 132864193 | 320 days ago | IN | 0 ETH | 0.00000006711 | ||||
| Batch | 132864193 | 320 days ago | IN | 0 ETH | 0.000000070722 | ||||
| Batch | 132864192 | 320 days ago | IN | 0 ETH | 0.000000072094 | ||||
| Batch | 132864192 | 320 days ago | IN | 0 ETH | 0.000000072473 | ||||
| Batch | 132864192 | 320 days ago | IN | 0 ETH | 0.000000063926 | ||||
| Batch | 132864192 | 320 days ago | IN | 0 ETH | 0.000000068723 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
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
Contract ABI
API[{"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
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.