Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.boost.xyz/llms.txt

Use this file to discover all available pages before exploring further.

The ERC20 Variable Incentive is a protocol incentive that allows for a variable distribution of native and ERC-20 assets, with each claim amount being determined dynamically at claim time. On Boost creation, a predetermined amount of the specified asset is transferred into this incentive from the associated budget.
The One-Time Actions docs are under active development and will be subject to changes.

Smart Contract

Read the smart contracts

Typedoc

See technical documentation

SDK Implementation

See the source

Key Features

  • Supports native assets as well as any ERC20
  • Rewards dynamic at claim time
Unlike budgets, allowlists, and validators, incentives cannot be re-used between multiple Boosts.

Create a new ERC20VariableIncentive

import { BoostCore } from '@boostxyz/sdk/BoostCore'
import { config } from "./config";

const core = new BoostCore({ config });

await core.createBoost({
  maxParticipants: 10n,
  budget,
  action,
  allowList,
  incentives: [
    core.ERC20VariableIncentive({
      asset: '0xERC20' || zeroAddress, // use zero address for native assets
      reward: parseEther('0.5'), // Amount to multiply a claim amount by, if 0n or 1 ether, user will be transferred the whole amount asserted at claim time.
      limit: parseEther('1'), // The total budget allocated to this incentive
    }),
  ],
});

Get an existing ERC20VariableIncentive

// if an incentive address is known, directly construct it
const incentive = core.ERC20VariableIncentive("0xc55F719709bDad022B320E76f9DfF7e6F5680767")

// or if you want a budget from a specific chain
const incentiveOnBase = core.ERC20VariableIncentive(
  "0xc55F719709bDad022B320E76f9DfF7e6F5680767",
  { chainId: 8453 }
)

// or accessible off of a a pre-exiting Boost
const boost = await core.getBoost(0n)
const incentive = boost.incentives.find(incentive => incentive instanceof ERC20VariableIncentive)

Sign a claim amount

// Get the index of the incentive to claim
const incentiveIndex = boost.incentives.findIndex(incentive => incentive instanceof ERC20VariableCriteriaIncentive)

// build claim data, signing a variable amount for the incentive
const allClaimData = boost.incentives.map(incentive => {
  if (incentive instanceof ERC20VariableIncentive || incentive instanceof ERC20VariableCriteriaIncentive) {
    const rewardAmount = parseUnits("10", 18);
    return incentive.buildClaimData(rewardAmount);
  } else {
    return ''
  }
})

// Sign a valid transaction with the variable reward amount
const { data } = await axios.get('/signatures', {
  params: {
    boostId: `${chainId}:${boostCoreAddress}:${boost.id}`,
    txHash,
    claimData: allClaimData.join(',')
  }
});

// claim the ERC20VariableIncentive
const { signature, incentiveId, claimant } = data.at(incentiveIndex);
await core.claimIncentive(
  boost.id,
  incentiveId,
  claimant,
  signature,
);