In this example, you’ll learn how to claim a reward from a Boost.

To claim a reward from a Boost, you’ll need to follow these general steps:

  1. Retrieve the Boost you want to claim from
  2. Prepare the claim data payload
  3. Execute the claim transaction

This process will differ depending on if you have set up your own validator or are using the default validator. If using the default validator, you will need to call the Boost API /signatures endpoint to generate the signature payload, otherwise you will need to build the payload yourself.

The default validator will be always be used by default unless you specify your own validator on boost creation.

In order to claim an incentive from a boost using the default validator, you will need to generate a valid signature payload. You can do this by calling the boost api /signatures endpoint and passing in the boostID and txHash.

This example assumes you have already instantiated a BoostCore client and have a valid transaction hash for the action that the claimant completed.

Claim Signature API

See additional documentation on how to build a claim signature

Generate the Signature Payload

import axios from 'axios';

const chainId = 8453; // base mainnet
const boost = await core.getBoost(3n, { chainId })

const { data } = await axios.get(`${BOOST_API_URL}/signatures`, {
  params: {
    boostId: `${chainId}:${boost.id}`,
    txHash,
  }
});

The /signatures endpoint will return an array of signatures, one for each available incentive on the boost. Each item in the array will contain the following fields:

  • signature: The signature to be used in the claim transaction
  • incentiveId: The id of the incentive being claimed
  • claimant: The address of the claimant

If using ERC20VariableIncentive or ERC20VariableCriteriaIncentive, you will need to pass in the rewardAmount as claimData to the /signatures endpoint.

Here’s an example of how you would accomplish that with multiple incentives.

const allClaimData = boost.incentives.map(incentive => {
  if (incentive instanceof ERC20VariableIncentive || incentive instanceof ERC20VariableCriteriaIncentive) {
    const rewardAmount = parseUnits("10", 18);
    return incentive.buildClaimData(rewardAmount);
  } else {
    return ''
  }
})

const { data } = await axios.get(`${BOOST_API_URL}/signatures`, {
  params: {
    boostId: `${chainId}:${boost.id}`,
    txHash,
    claimData: allClaimData.join(',')
  }
});

Claiming the incentives

Once you have a valid response from the /signatures endpoint, you can loop through the response and claim the incentives.

index.ts
import axios from 'axios';

const chainId = 8453; // base mainnet
const boost = await core.getBoost(3n, { chainId })

const { data } = await axios.get(`${BOOST_API_URL}/signatures`, {
  params: {
    boostId: `${chainId}:${boost.id}`,
    txHash,
  }
});

for (const item of data) {
  const { signature, incentiveId, claimant } = item;

  // Allow the claimant to claim the incentive
  await core.claimIncentive(
    boost.id,
    incentiveId,
    claimant,
    signature,
  );
}

claimIncentive must be called by the claimant. This is useful if you have access to the claimants wallet, like in the case of a dapp. If you are claiming on behalf of another user, you must use claimIncentiveFor.

You can also claim on behalf of another user by using the claimIncentiveFor method.

// Claim on behalf of another user
await core.claimIncentiveFor(
  boost.id,
  incentiveId, // the incentiveId (position in the array of incentives)
  "0xREFERRER", // referrer (if any). use zero address if no referrer
  signature,
  claimant, // the address of the account the claim is being made for
);