> ## 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 ERC20PeggedIncentive using the SDK

The ERC20 Pegged Incentive is a specialized protocol incentive that allows for the distribution of ERC-20 assets with rewards pegged to the value of another token. This enables creating rewards that maintain a specific value relative to a pegged asset. When users claim rewards, they receive an amount of the reward token equivalent in value to the pegged amount.

<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/ERC20PeggedIncentive.sol">
    Read the smart contracts
  </Card>

  <Card title="Typedoc" icon="file-lines" href="https://sdk.boost.xyz/classes/ERC20PeggedIncentive.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/ERC20PeggedIncentive.ts">
    See the source
  </Card>
</CardGroup>

## Key Features

* Rewards pegged to the value of another token (e.g., USDC) or native chain token (e.g., ETH)
* Dynamic reward amounts based on current price ratios
* Supports any ERC20 token as the reward asset
* Total distribution limit in reward asset tokens
* Managed access for incentive control and clawbacks

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

<Info>
  To peg rewards to the chain's native token (e.g., ETH), use `zeroAddress` (0x0000000000000000000000000000000000000000) as the peg parameter. This tells the protocol to use the native token's price for calculations.
</Info>

### Create a new ERC20PeggedIncentive

<CodeGroup>
  ```ts index.ts theme={null}
  import { BoostCore } from '@boostxyz/sdk/BoostCore'
  import { config } from "./config";
  import { parseUnits, zeroAddress } from 'viem'

  const core = new BoostCore({ config });

  await core.createBoost({
    maxParticipants: 10n,
    budget,
    action,
    allowList,
    incentives: [
      core.ERC20PeggedIncentive({
        asset: '0xRewardToken', // token that will be distributed
        peg: '0xPeggedToken' || zeroAddress, // token to peg the reward value to (e.g., USDC or ETH)
        reward: parseUnits("1", 6), // amount in pegged token value (e.g., 1 USDC worth)
        limit: parseUnits("1000", 18), // maximum total amount of asset token (in wei) that can be distributed as rewards
        manager: "0xManager", // address with administrative control over the incentive
      }),
    ],
  });
  ```

  ```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>

<Info>
  The manager parameter specifies an address that has administrative control over the incentive. This address can perform management operations like triggering clawbacks of undistributed rewards if needed.
</Info>

### Get an existing ERC20PeggedIncentive

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

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