π€Claiming Onchain Rewards
This article shows how to claim rewards from your FuulProject contract.
1. Getting claimable amount
The more reliable and real time claimable rewards information will be on the subgraphs
To get the total unclaimed rewards for a specific user and Fuul project, use the availableToClaim
parameter returned in the following query.
userBalances(
where: {
owner_contains_nocase: "0x12345",
project_: {
deployedAddress:"0x12345"
}}
) {
availableToClaim
claimed
currency
project {
id
deployedAddress
}
}
You can also filter out by currency like this:
userBalances(
where: {
owner_contains_nocase: "0x12345",
currency_contains: "0x0000000000000000000000000000000000000000",
project_: {
deployedAddress:"0x12345"
}}
) {
availableToClaim
claimed
currency
project {
id
deployedAddress
}
}
2. Building claim function argument
The claim
function argument is an array of claimCheck
struct elements.
// Solidity interface
struct ClaimCheck {
address projectAddress;
address currency;
uint256 amount;
uint256[] tokenIds; // used for NFTs
uint256[] amounts; // used for NFTs
}
For example, to claim 10 ETH from a deployed FuulContract on Base, this will have to. be called:
const claimChecks = [
{
projectAddress: 'FuulProject contract address', // On the Handy Links section on the app
currency: '0x0000000000000000000000000000000000000000',
amount: ethers.utils.formatEther(10),
tokenIds: [], // Empty because it's an ERC20
amounts: [], // Empty because it's an ERC20
},
];
Your claimChecks
array can contain multiple elements, belonging to different projects and currencies.
3. Making the transaction
To perform a claim, the transaction must always be directed to the FuulManager
contract.
The address is always 0xC38E3A10B5818601b29c83F195E8b5854AAE45aF
on the networks we are deployed (Polygon, Arbitrum One, Optimism, Base).
So, the complete code, using ethers.js, would be the following:
// Build claimChecks
const claimChecks = [
{
projectAddress: 'FuulProject contract address', // On the Handy Links section on the app
currency: '0x0000000000000000000000000000000000000000',
amount: ethers.utils.formatEther(10),
tokenIds: [], // Empty because it's an ERC20
amounts: [], // Empty because it's an ERC20
},
];
// Get FuulManager contract
const address = "0xC38E3A10B5818601b29c83F195E8b5854AAE45aF";
const abi = [
"function claim(ClaimCheck[] calldata claimChecks) external"
];
const [user1] = await ethers.getSigners();
const fuulManager = new ethers.Contract(address, abi, user1);
// Make the transaction
const tx = await fuulManager.claim(claimChecks);
Last updated