Source Code
Latest 5 from a total of 5 transactions
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FirstClaim
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 10000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import {Ownable} from "openzeppelin-contracts/contracts/access/Ownable.sol";
import {Ownable2Step} from "openzeppelin-contracts/contracts/access/Ownable2Step.sol";
import {IGrant} from "../IGrant.sol";
contract FirstClaim is Ownable2Step {
////////////////////////////////////////////////////////////////
// ERRORS //
////////////////////////////////////////////////////////////////
/// @notice Error that is thrown if the caller is not allowed to call the function
error OnlyAllowedCaller();
/// @notice Error that is thrown if a proposed configuration address is the zero address
error ZeroAddress();
/// @notice Error that is thrown if the grant amount is too large
error GrantAmountTooLarge();
/// @notice Error that is thrown if the max claim amount is exceeded
error MaxClaimAmountExceeded();
/// @notice Error that is thrown if the owner tries to renounce ownership
error CannotRenounceOwnership();
////////////////////////////////////////////////////////////////
// EVENTS //
////////////////////////////////////////////////////////////////
/// @notice Event emitted when a caller is added
event CallerAdded(address indexed caller);
/// @notice Event emitted when a caller is removed
event CallerRemoved(address indexed caller);
/// @notice Event emitted when the AllowanceModule is set
event AllowanceModuleSet(address indexed allowanceModule);
/// @notice Event emitted when the WLD token is set
event WldTokenSet(address indexed wldToken);
/// @notice Event emitted when the Holder is set
event HolderSet(address indexed holder);
/// @notice Event emitted when the RecurringGrantDrop is set
event RecurringGrantDropSet(address indexed recurringGrantDrop);
/// @notice Event emitted when the max claim amount is set
event MaxClaimAmountSet(uint256 maxClaimAmount);
/// @notice Event emitted when a first claim has been made
event FirstClaimClaimed(
uint256 grantId, address indexed receiver, uint256 amount, uint256 currentGrantAmount
);
////////////////////////////////////////////////////////////////
/// CONFIG STORAGE ///
////////////////////////////////////////////////////////////////
/// @notice address of the Safe Allowance Module
AllowanceModule public allowanceModule;
/// @notice Worldcoin token address
address public token;
/// @notice address that grants allowances to this contract
address public holder;
/// @notice Recurring Grant Drop contract
IRecurringGrantDrop public recurringGrantDrop;
/// @notice addresses that can call the claim function
mapping(address => bool) public allowedCallers;
/// @notice maximum claim amount safeguard
uint256 public maxClaimAmount;
////////////////////////////////////////////////////////////////
/// CONSTRUCTOR ///
////////////////////////////////////////////////////////////////
constructor(
address _allowanceModuleAddress,
address _wldToken,
address _holder,
address _recurringGrantDrop,
uint256 _maxClaimAmount
) Ownable(msg.sender) {
if (
_allowanceModuleAddress == address(0) || _wldToken == address(0)
|| _holder == address(0) || _recurringGrantDrop == address(0)
) {
revert ZeroAddress();
}
allowanceModule = AllowanceModule(_allowanceModuleAddress);
token = _wldToken;
holder = _holder;
recurringGrantDrop = IRecurringGrantDrop(_recurringGrantDrop);
maxClaimAmount = _maxClaimAmount;
}
////////////////////////////////////////////////////////////////
/// MODIFIERS ///
////////////////////////////////////////////////////////////////
/// @notice Modifier that checks if the caller is allowed to call the function
modifier onlyAllowedCaller() {
if (!allowedCallers[msg.sender]) {
revert OnlyAllowedCaller();
}
_;
}
////////////////////////////////////////////////////////////////
/// FUNCTIONS ///
////////////////////////////////////////////////////////////////
/// @notice Claim the first grant
/// @param grantId The grant ID to claim
/// @param receiver The address that will receive the tokens (this is also the signal of the ZKP)
/// @param root The root of the Merkle tree
/// @param nullifierHash The nullifier for this proof, preventing double signaling
/// @param proof The zero knowledge proof that demonstrates the claimer has a verified World ID
/// @param amount The total amount to claim
function claim(
uint256 grantId,
address receiver,
uint256 root,
uint256 nullifierHash,
uint256[8] calldata proof,
uint256 amount
) external onlyAllowedCaller {
if (amount > maxClaimAmount) {
revert MaxClaimAmountExceeded();
}
uint256 currentGrantAmount = recurringGrantDrop.grant().getAmount(grantId);
if (currentGrantAmount >= amount) {
revert GrantAmountTooLarge();
}
recurringGrantDrop.claim(grantId, receiver, root, nullifierHash, proof);
allowanceModule.executeAllowanceTransfer(
holder, token, payable(receiver), uint96(amount - currentGrantAmount)
);
emit FirstClaimClaimed(grantId, receiver, amount, currentGrantAmount);
}
////////////////////////////////////////////////////////////////
/// CONFIG FUNCTIONS ///
////////////////////////////////////////////////////////////////
function setAllowanceModule(address _allowanceModuleAddress) external onlyOwner {
if (_allowanceModuleAddress == address(0)) {
revert ZeroAddress();
}
allowanceModule = AllowanceModule(_allowanceModuleAddress);
emit AllowanceModuleSet(_allowanceModuleAddress);
}
function setWldToken(address _wldToken) external onlyOwner {
if (_wldToken == address(0)) {
revert ZeroAddress();
}
token = _wldToken;
emit WldTokenSet(_wldToken);
}
function setHolder(address _holder) external onlyOwner {
if (_holder == address(0)) {
revert ZeroAddress();
}
holder = _holder;
emit HolderSet(_holder);
}
function setRecurringGrantDrop(IRecurringGrantDrop _recurringGrantDrop) external onlyOwner {
if (address(_recurringGrantDrop) == address(0)) {
revert ZeroAddress();
}
recurringGrantDrop = _recurringGrantDrop;
emit RecurringGrantDropSet(address(_recurringGrantDrop));
}
function addCaller(address _caller) external onlyOwner {
if (_caller == address(0)) {
revert ZeroAddress();
}
allowedCallers[_caller] = true;
emit CallerAdded(_caller);
}
function removeCaller(address _caller) external onlyOwner {
if (_caller == address(0)) {
revert ZeroAddress();
}
delete allowedCallers[_caller];
emit CallerRemoved(_caller);
}
function setMaxClaimAmount(uint256 _maxClaimAmount) external onlyOwner {
maxClaimAmount = _maxClaimAmount;
emit MaxClaimAmountSet(_maxClaimAmount);
}
/// @notice Prevents the owner from renouncing ownership
/// @dev onlyOwner
function renounceOwnership() public view override onlyOwner {
revert CannotRenounceOwnership();
}
}
// an interface for the RecurringGrantDrop of this commit https://github.com/worldcoin/worldcoin-grants-contracts/commit/68cf64877cb59d5e96b3894a5c79f63a4c0ffa1f
interface IRecurringGrantDrop {
function claim(
uint256 grantId,
address receiver,
uint256 root,
uint256 nullifierHash,
uint256[8] calldata proof
) external;
function grant() external view returns (IGrant);
}
// an interface for the AllowanceModule contract deployed at these addresses
// optimism: 0x948BDE4d8670500b0F62cF5c745C82ABe7c81A65
// worldchain: 0xa9bcF56d9FCc0178414EF27a3d893C9469e437B7
interface AllowanceModule {
function executeAllowanceTransfer(
address safe,
address token,
address payable to,
uint96 amount
) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.19;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)
pragma solidity ^0.8.19;
import {Ownable} from "./Ownable.sol";
/**
* @dev Contract module which provides access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is specified at deployment time in the constructor for `Ownable`. This
* can later be changed with {transferOwnership} and {acceptOwnership}.
*
* This module is used through inheritance. It will make available all functions
* from parent (Ownable).
*/
abstract contract Ownable2Step is Ownable {
address private _pendingOwner;
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
/**
* @dev Returns the address of the pending owner.
*/
function pendingOwner() public view virtual returns (address) {
return _pendingOwner;
}
/**
* @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual override onlyOwner {
_pendingOwner = newOwner;
emit OwnershipTransferStarted(owner(), newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual override {
delete _pendingOwner;
super._transferOwnership(newOwner);
}
/**
* @dev The new owner accepts the ownership transfer.
*/
function acceptOwnership() public virtual {
address sender = _msgSender();
if (pendingOwner() != sender) {
revert OwnableUnauthorizedAccount(sender);
}
_transferOwnership(sender);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
interface IGrant {
/// @notice Error in case the grant is invalid.
error InvalidGrant();
/// @notice Error in case the grant configuration is invalid.
error InvalidConfiguration();
/// @notice Returns the amount of tokens for a grant.
/// @notice This may contain more complicated logic and is therefore not just a member variable.
/// @param grantId The grant id to get the amount for.
function getAmount(uint256 grantId) external view returns (uint256);
/// @notice Checks whether a grant is valid.
/// @param grantId The grant id to check.
function checkValidity(uint256 grantId) external view;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.19;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}{
"remappings": [
"src/=src/",
"@prb/test/=lib/prb-test/src/",
"ds-test/=lib/ds-test/src/",
"@zk-kit/=lib/zk-kit/packages/",
"@openzeppelin/=lib/openzeppelin-contracts/",
"contracts-upgradeable/=lib/world-id-contracts/lib/openzeppelin-contracts-upgradeable/contracts/",
"erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
"forge-std/=lib/forge-std/src/",
"halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
"openzeppelin-contracts-upgradeable/=lib/world-id-contracts/lib/openzeppelin-contracts-upgradeable/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"openzeppelin/=lib/openzeppelin-contracts/contracts/",
"prb-test/=lib/prb-test/src/",
"semaphore/=lib/semaphore/",
"solmate/=lib/solmate/src/",
"v3-periphery/=lib/v3-periphery/contracts/",
"world-id-contracts/=lib/world-id-contracts/src/",
"zk-kit/=lib/zk-kit/"
],
"optimizer": {
"enabled": true,
"runs": 10000,
"details": {
"peephole": true,
"inliner": true,
"deduplicate": true,
"cse": true,
"yul": true
}
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "none",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "paris",
"viaIR": false,
"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":"_recurringGrantDrop","type":"address"},{"internalType":"uint256","name":"_maxClaimAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CannotRenounceOwnership","type":"error"},{"inputs":[],"name":"GrantAmountTooLarge","type":"error"},{"inputs":[],"name":"MaxClaimAmountExceeded","type":"error"},{"inputs":[],"name":"OnlyAllowedCaller","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"allowanceModule","type":"address"}],"name":"AllowanceModuleSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"CallerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"CallerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"grantId","type":"uint256"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentGrantAmount","type":"uint256"}],"name":"FirstClaimClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"}],"name":"HolderSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxClaimAmount","type":"uint256"}],"name":"MaxClaimAmountSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recurringGrantDrop","type":"address"}],"name":"RecurringGrantDropSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wldToken","type":"address"}],"name":"WldTokenSet","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_caller","type":"address"}],"name":"addCaller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowanceModule","outputs":[{"internalType":"contract AllowanceModule","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedCallers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"grantId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"root","type":"uint256"},{"internalType":"uint256","name":"nullifierHash","type":"uint256"},{"internalType":"uint256[8]","name":"proof","type":"uint256[8]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"holder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxClaimAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recurringGrantDrop","outputs":[{"internalType":"contract IRecurringGrantDrop","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_caller","type":"address"}],"name":"removeCaller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_allowanceModuleAddress","type":"address"}],"name":"setAllowanceModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"setHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxClaimAmount","type":"uint256"}],"name":"setMaxClaimAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IRecurringGrantDrop","name":"_recurringGrantDrop","type":"address"}],"name":"setRecurringGrantDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wldToken","type":"address"}],"name":"setWldToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b50604051620011a5380380620011a5833981016040819052620000349162000186565b336200004081620000fb565b506001600160a01b03851615806200005f57506001600160a01b038416155b806200007257506001600160a01b038316155b806200008557506001600160a01b038216155b15620000a45760405163d92e233d60e01b815260040160405180910390fd5b600280546001600160a01b03199081166001600160a01b03978816179091556003805482169587169590951790945560048054851693861693909317909255600580549093169316929092179055600755620001ed565b600180546001600160a01b0319169055620001168162000119565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200018157600080fd5b919050565b600080600080600060a086880312156200019f57600080fd5b620001aa8662000169565b9450620001ba6020870162000169565b9350620001ca6040870162000169565b9250620001da6060870162000169565b9150608086015190509295509295909350565b610fa880620001fd6000396000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c8063aeef6439116100cd578063ea46ad2311610081578063eef21cd211610066578063eef21cd2146102f9578063f2fde38b1461030c578063fc0c546a1461031f57600080fd5b8063ea46ad23146102c6578063eac9b92c146102d957600080fd5b8063d979f5aa116100b2578063d979f5aa14610275578063e30c397814610288578063e534155d146102a657600080fd5b8063aeef64391461024b578063b68597fe1461026257600080fd5b80637b334154116101245780638da5cb5b116101095780638da5cb5b146101d95780639ecc226714610218578063a279d8b81461022b57600080fd5b80637b3341541461018e5780637b352f8e146101c657600080fd5b80632c189c2414610156578063715018a61461016b578063747293fb1461017357806379ba509714610186575b600080fd5b610169610164366004610e40565b61033f565b005b6101696106da565b610169610181366004610ea3565b610714565b6101696107e0565b6101b161019c366004610ea3565b60066020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6101696101d4366004610ec7565b61085c565b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bd565b610169610226366004610ea3565b61089f565b6005546101f39073ffffffffffffffffffffffffffffffffffffffff1681565b61025460075481565b6040519081526020016101bd565b610169610270366004610ea3565b610963565b610169610283366004610ea3565b610a27565b60015473ffffffffffffffffffffffffffffffffffffffff166101f3565b6004546101f39073ffffffffffffffffffffffffffffffffffffffff1681565b6101696102d4366004610ea3565b610aeb565b6002546101f39073ffffffffffffffffffffffffffffffffffffffff1681565b610169610307366004610ea3565b610baf565b61016961031a366004610ea3565b610c78565b6003546101f39073ffffffffffffffffffffffffffffffffffffffff1681565b3360009081526006602052604090205460ff16610388576040517f8d380fc000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007548111156103c4576040517f28c9130a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600554604080517f30c3eaa8000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916330c3eaa89160048083019260209291908290030181865afa158015610434573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104589190610ee0565b73ffffffffffffffffffffffffffffffffffffffff16639980ec86886040518263ffffffff1660e01b815260040161049291815260200190565b602060405180830381865afa1580156104af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d39190610efd565b905081811061050e576040517fbdaa5a5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546040517fa41e6ceb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063a41e6ceb9061056c908a908a908a908a908a90600401610f16565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b505060025460045460035473ffffffffffffffffffffffffffffffffffffffff928316945063861a92df93509082169116896105d68688610f5b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff94851660048201529284166024840152921660448201526bffffffffffffffffffffffff9091166064820152608401600060405180830381600087803b15801561066057600080fd5b505af1158015610674573d6000803e3d6000fd5b5050604080518a81526020810186905290810184905273ffffffffffffffffffffffffffffffffffffffff891692507ffd45f612a7db789bfa84a3f88f75f1310fbfb71852912e23a85dd147b59f538a915060600160405180910390a250505050505050565b6106e2610d28565b6040517f77aeb0ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61071c610d28565b73ffffffffffffffffffffffffffffffffffffffff8116610769576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526006602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517ff7762e85af7b409451f9a76004c5f755642902434eb11351ae67eb9746888b699190a250565b600154339073ffffffffffffffffffffffffffffffffffffffff168114610850576040517f118cdaa700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024015b60405180910390fd5b61085981610d7d565b50565b610864610d28565b60078190556040518181527f4a26702cef0a5c340da3d50808551e01697c367e2de8a19cb67a43d4fd2516ee9060200160405180910390a150565b6108a7610d28565b73ffffffffffffffffffffffffffffffffffffffff81166108f4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f69890564f15af2077903090f0cfaac92e774c90dd410f425bd1ba0586ebac85a90600090a250565b61096b610d28565b73ffffffffffffffffffffffffffffffffffffffff81166109b8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fdf32c1d2f8557db3fbd6e2d7e80a397a17a5b47eaf080f824c3e06d6b5112eb590600090a250565b610a2f610d28565b73ffffffffffffffffffffffffffffffffffffffff8116610a7c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f32b63d008f08c84a73171fcaa060e7b6d8e8a75198f02d361751fc1b47fdd85b90600090a250565b610af3610d28565b73ffffffffffffffffffffffffffffffffffffffff8116610b40576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f8d177dbaf8a496421c384170026838a241101c373b8636bb5362be161d0a34c790600090a250565b610bb7610d28565b73ffffffffffffffffffffffffffffffffffffffff8116610c04576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526006602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f50c35a67b454d38c20800d5b55e320f58f4c9c86a28d8ab20f03045d1a38d99a9190a250565b610c80610d28565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155610ce360005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d7b576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610847565b565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055610859816000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff8116811461085957600080fd5b6000806000806000806101a08789031215610e5a57600080fd5b863595506020870135610e6c81610e1e565b94506040870135935060608701359250610180870188811115610e8e57600080fd5b60808801925080359150509295509295509295565b600060208284031215610eb557600080fd5b8135610ec081610e1e565b9392505050565b600060208284031215610ed957600080fd5b5035919050565b600060208284031215610ef257600080fd5b8151610ec081610e1e565b600060208284031215610f0f57600080fd5b5051919050565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152604081018490526060810183905261018081016101008360808401379695505050505050565b81810381811115610f95577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9291505056fea164736f6c6343000813000a000000000000000000000000a9bcf56d9fcc0178414ef27a3d893c9469e437b70000000000000000000000002cfc85d8e48f8eab294be644d9e25c30308630030000000000000000000000008567cda1429c4682f9516fc2f95d82566f2c70080000000000000000000000002c1ca1fbbd5f28e5492cc6bf8c4e8c57354eb162000000000000000000000000000000000000000000000002b5e3af16b1880000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101515760003560e01c8063aeef6439116100cd578063ea46ad2311610081578063eef21cd211610066578063eef21cd2146102f9578063f2fde38b1461030c578063fc0c546a1461031f57600080fd5b8063ea46ad23146102c6578063eac9b92c146102d957600080fd5b8063d979f5aa116100b2578063d979f5aa14610275578063e30c397814610288578063e534155d146102a657600080fd5b8063aeef64391461024b578063b68597fe1461026257600080fd5b80637b334154116101245780638da5cb5b116101095780638da5cb5b146101d95780639ecc226714610218578063a279d8b81461022b57600080fd5b80637b3341541461018e5780637b352f8e146101c657600080fd5b80632c189c2414610156578063715018a61461016b578063747293fb1461017357806379ba509714610186575b600080fd5b610169610164366004610e40565b61033f565b005b6101696106da565b610169610181366004610ea3565b610714565b6101696107e0565b6101b161019c366004610ea3565b60066020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6101696101d4366004610ec7565b61085c565b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bd565b610169610226366004610ea3565b61089f565b6005546101f39073ffffffffffffffffffffffffffffffffffffffff1681565b61025460075481565b6040519081526020016101bd565b610169610270366004610ea3565b610963565b610169610283366004610ea3565b610a27565b60015473ffffffffffffffffffffffffffffffffffffffff166101f3565b6004546101f39073ffffffffffffffffffffffffffffffffffffffff1681565b6101696102d4366004610ea3565b610aeb565b6002546101f39073ffffffffffffffffffffffffffffffffffffffff1681565b610169610307366004610ea3565b610baf565b61016961031a366004610ea3565b610c78565b6003546101f39073ffffffffffffffffffffffffffffffffffffffff1681565b3360009081526006602052604090205460ff16610388576040517f8d380fc000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007548111156103c4576040517f28c9130a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600554604080517f30c3eaa8000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916330c3eaa89160048083019260209291908290030181865afa158015610434573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104589190610ee0565b73ffffffffffffffffffffffffffffffffffffffff16639980ec86886040518263ffffffff1660e01b815260040161049291815260200190565b602060405180830381865afa1580156104af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d39190610efd565b905081811061050e576040517fbdaa5a5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546040517fa41e6ceb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063a41e6ceb9061056c908a908a908a908a908a90600401610f16565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b505060025460045460035473ffffffffffffffffffffffffffffffffffffffff928316945063861a92df93509082169116896105d68688610f5b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff94851660048201529284166024840152921660448201526bffffffffffffffffffffffff9091166064820152608401600060405180830381600087803b15801561066057600080fd5b505af1158015610674573d6000803e3d6000fd5b5050604080518a81526020810186905290810184905273ffffffffffffffffffffffffffffffffffffffff891692507ffd45f612a7db789bfa84a3f88f75f1310fbfb71852912e23a85dd147b59f538a915060600160405180910390a250505050505050565b6106e2610d28565b6040517f77aeb0ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61071c610d28565b73ffffffffffffffffffffffffffffffffffffffff8116610769576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526006602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517ff7762e85af7b409451f9a76004c5f755642902434eb11351ae67eb9746888b699190a250565b600154339073ffffffffffffffffffffffffffffffffffffffff168114610850576040517f118cdaa700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024015b60405180910390fd5b61085981610d7d565b50565b610864610d28565b60078190556040518181527f4a26702cef0a5c340da3d50808551e01697c367e2de8a19cb67a43d4fd2516ee9060200160405180910390a150565b6108a7610d28565b73ffffffffffffffffffffffffffffffffffffffff81166108f4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f69890564f15af2077903090f0cfaac92e774c90dd410f425bd1ba0586ebac85a90600090a250565b61096b610d28565b73ffffffffffffffffffffffffffffffffffffffff81166109b8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fdf32c1d2f8557db3fbd6e2d7e80a397a17a5b47eaf080f824c3e06d6b5112eb590600090a250565b610a2f610d28565b73ffffffffffffffffffffffffffffffffffffffff8116610a7c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f32b63d008f08c84a73171fcaa060e7b6d8e8a75198f02d361751fc1b47fdd85b90600090a250565b610af3610d28565b73ffffffffffffffffffffffffffffffffffffffff8116610b40576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f8d177dbaf8a496421c384170026838a241101c373b8636bb5362be161d0a34c790600090a250565b610bb7610d28565b73ffffffffffffffffffffffffffffffffffffffff8116610c04576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526006602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f50c35a67b454d38c20800d5b55e320f58f4c9c86a28d8ab20f03045d1a38d99a9190a250565b610c80610d28565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155610ce360005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d7b576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610847565b565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055610859816000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff8116811461085957600080fd5b6000806000806000806101a08789031215610e5a57600080fd5b863595506020870135610e6c81610e1e565b94506040870135935060608701359250610180870188811115610e8e57600080fd5b60808801925080359150509295509295509295565b600060208284031215610eb557600080fd5b8135610ec081610e1e565b9392505050565b600060208284031215610ed957600080fd5b5035919050565b600060208284031215610ef257600080fd5b8151610ec081610e1e565b600060208284031215610f0f57600080fd5b5051919050565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152604081018490526060810183905261018081016101008360808401379695505050505050565b81810381811115610f95577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9291505056fea164736f6c6343000813000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a9bcf56d9fcc0178414ef27a3d893c9469e437b70000000000000000000000002cfc85d8e48f8eab294be644d9e25c30308630030000000000000000000000008567cda1429c4682f9516fc2f95d82566f2c70080000000000000000000000002c1ca1fbbd5f28e5492cc6bf8c4e8c57354eb162000000000000000000000000000000000000000000000002b5e3af16b1880000
-----Decoded View---------------
Arg [0] : _allowanceModuleAddress (address): 0xa9bcF56d9FCc0178414EF27a3d893C9469e437B7
Arg [1] : _wldToken (address): 0x2cFc85d8E48F8EAB294be644d9E25C3030863003
Arg [2] : _holder (address): 0x8567Cda1429c4682F9516fc2F95D82566f2C7008
Arg [3] : _recurringGrantDrop (address): 0x2c1Ca1FBbD5f28e5492Cc6bF8C4e8c57354eb162
Arg [4] : _maxClaimAmount (uint256): 50000000000000000000
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000a9bcf56d9fcc0178414ef27a3d893c9469e437b7
Arg [1] : 0000000000000000000000002cfc85d8e48f8eab294be644d9e25c3030863003
Arg [2] : 0000000000000000000000008567cda1429c4682f9516fc2f95d82566f2c7008
Arg [3] : 0000000000000000000000002c1ca1fbbd5f28e5492cc6bf8c4e8c57354eb162
Arg [4] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 32 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.