> ## 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.

# Overview

> Learn about how to interact with an ERC20Incentive using the SDK

The ERC20 Incentive is an essential protocol incentive that allows for the distribution of native and ERC-20 assets, supporting raffle functionality as well as basic fixed rewards. On Boost creation, a predetermined amount of the specified asset is transferred into this incentive from the associated budget.

<Warning>
  The One-Time Actions docs are under active development and will be subject to changes.
</Warning>

<CardGroup cols={3}>
  <Card title="Smart Contract" icon="file-contract" href="https://github.com/boostxyz/boost-protocol/blob/main/packages/evm/contracts/incentives/ERC20Incentive.sol">
    Read the smart contracts
  </Card>

  <Card title="Typedoc" icon="file-lines" href="https://sdk.boost.xyz/classes/ERC20Incentive.html">
    See technical documentation
  </Card>

  <Card title="SDK Implementation" icon="file-code" href="https://github.com/boostxyz/boost-protocol/blob/main/packages/sdk/src/Incentives/ERC20Incentive.ts">
    See the source
  </Card>
</CardGroup>

## Key Features

* Supports native assets as well as any ERC20
* Rewards fixed at time of creation
* Raffle functionality, with full incentive balance going to random claimant

<Info>
  Unlike budgets, allowlists, and validators, incentives cannot be re-used between multiple Boosts.
</Info>

### Create a new ERC20Incentive

<CodeGroup>
  ```ts index.ts theme={null}
  import { BoostCore } from '@boostxyz/sdk/BoostCore'
  import { StrategyType } from '@boostxyz/sdk/claiming'
  import { config } from "./config";

  const core = new BoostCore({ config });

  await core.createBoost({
    maxParticipants: 10n,
    budget,
    action,
    allowList,
    incentives: [
      core.ERC20Incentive({
        asset: '0xERC20' || zeroAddress, // use zero address for native assets
        reward: parseEther("1"), // how much to distribute on each claim, with the RAFFLE stratgy, the total reward is `parseEther("1") * limit`
        limit: 10n, // how many times can this incentive be claimed
        strategy: StrategyType.POOL || StrategyType.RAFFLE,
        manager: budget.assertValidAddress(),
      }),
    ],
  });
  ```

  ```ts config.ts theme={null}
  import { http, createConfig } from '@wagmi/core'
  import { mainnet, sepolia } from '@wagmi/core/chains'

  export const config = createConfig({
    chains: [mainnet, sepolia],
    transports: {
      [mainnet.id]: http(),
      [sepolia.id]: http(),
    },
  })
  ```
</CodeGroup>

### Get an existing ERC20Incentive

<CodeGroup>
  ```ts index.ts theme={null}
  // if an incentive address is known, directly construct it
  const incentive = core.ERC20Incentive("0xc55F719709bDad022B320E76f9DfF7e6F5680767")

  // or if you want a budget from a specific chain
  const incentiveOnBase = core.ERC20Incentive(
    "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 ERC20Incentive)
  ```
</CodeGroup>
