Create Incentive Program

1. Proposal to Outline the Program

You shall outline the Incentive Program as part of the listing proposal. Follow the general listing guideline here.

Read more on the Incentive Program here.

2. Deposit Rewards into Incentive Vault

The Incentive Vault is a governance-controlled account that has no private key. Once you have transferred funds into the Vault, you can then raise a proposal to distribute it via an Incentive Program. For unused funds, you can raise a proposal to transfer them out.

  • Incentive Vault on Acala: 23M5ttkmR6KcoUwA7NqBjLuMJFWCvobsD9Zy95MgaAECEhit

  • Incentive Vault on Karura: qmmNufxeWaAVN8EJK58yYNW1HDcpSLpqGThui55eT3Dfr1a

Please feel free to reach out to us to verify this before full deposit.

3. Submit On-chain Proposal

Once you are ready for a vote, then please follow the guide below to create an on-chain proposal.

The proposer must have enough a minimum deposit of

  • 200 ACA on Acala Network, or have a council member to submit it on behalf

  • 100 KAR on Karura Network, or have a council member to submit it on behalf.

1) Submit preimage

This is to generate and submit the actual on-chain execution (namely preimage).

Go to Polkadot webapp, choose the network you are proposal to e.g. Acala or Karura, then navigate to Governance - Democracy

The following is a summary of the preimage structure

  • A) Create an overarching batch call

    • B) Batch Tx #1: a scheduler call to set a starting time for Incentive Program

      • create a batch call for the content of the program

        • C) Batch Tx #1.1: set up Loyalty Bonus Ratio

        • D) Batch Tx #1.2: set up Reward Amount

    • E) Batch Tx #2: a scheduler call to set an end time for Incentive Program

      • create a batch call for the content of the program

        • F) Batch Tx #2.1: set Loyalty Bonus Ratio to 0

        • G) Batch Tx #2.2: set Reward Amount to 0

Below is a step by step guide to create the above preimage

A) Create an overarching batch call

Click on Submit preimage button.

Select utility.batchAll

B) Create Batch Tx #1: a scheduler call to set a starting time for Incentive Program

  • Click Add item

  • Select scheduler.schedule for the proposal to execute at a specific block.

  • When: enter block number for the program to be executed. For example, if your token will be listed and start trading next Tuesday at block #365505, then you can schedule the Incentive Program to start at exactly the same time.

  • Priority: 255 (default, changing to other priority may cause proposal to be rejected for network safety reasons)

  • Call: select utility.batchAll as there will be a couple of transactions included to set up the program

C) Create Batch Tx #1.1: set up Loyalty Bonus Ratio. if a user claims the incentive reward earlier, then this part of the reward will be returned to the reward pool and shared by other liquidity providers

Click Add Item under the utlity.batchAll call

Select incentive.updateClaimRewardDeductionRates

Click Add Item under the incentive.updateClaimRewardDeductionRates call

  • ModuleIncentivesPoolId: select Dex

  • AcalaPrimitivesCurrencyCurrencyId: select DexShare

  • Token A and Token B

    • If the two tokens are of different types, then they must be entered in the ascending currencyType order

      • e.g. Token shall be entered as Token A, ForeignAsset shall be entered as Token B

      • Check the currencyType order here

    • If the two tokens are of the same type, then they must be entered in the ascending tokenId order.

      • Token's tokenId can be looked up here

      • ForeignAsset tokenId can be looked up here

    • If you want to list ProjectToken-aUSD, then Token A shall be aUSD, Token B shall be ProjectToken

  • u128 (Loyalty Bonus Ratio): 18 decimal. For example 40% as 0.4, enter 400000000000000000

D) Batch Tx #1.2: set up Reward Amount that will be distributed every 5 blocks

Click Add Item under the utlity.batchAll call

Select incentive.updateIncentiveRewards

Click Add Item under the incentive.updateIncentiveRewards call to add Incentive target pool

  • ModuleIncentivesPoolId: select Dex

  • Dex: AcalaPrimitivesCurrencyCurrencyId: select DexShare

  • Token A and Token B

    • If the two tokens are of different types, then they must be entered in the ascending currencyType order

      • e.g. Token shall be entered as Token A, ForeignAsset shall be entered as Token B

      • Check the currencyType order here

    • If the two tokens are of the same type, then they must be entered in the ascending tokenId order.

      • Token's tokenId can be looked up here

      • ForeignAsset tokenId can be looked up here

    • If you want to list ProjectToken-aUSD, then Token A shall be aUSD, Token B shall be ProjectToken

Click Add Item again under the incentive.updateIncentiveRewards call to specify reward token

  • AcalaPrimitivesCurrencyCurrencyId: select ForeignAsset (select Token if reward token is native Acala token)

  • ForeignAsset: enter ForeignAssetId for the reward token

  • u128 (Reward Amount): the amount of reward token to be distributed every 5 blocks. the decimal is the same as the reward token decimal.

E) Batch Tx #2: a scheduler call to set an end time for Incentive Program

Click the Add item under the first utility.batchAll in Step A)

  • Select scheduler.schedule for the proposal to execute at a specific block.

  • When: enter block number for the program to be ended. After this block number, incentive rewards will no longer be distributed. If users claim rewards after this block, they will receive all their share of the loyalty bonus.

  • Priority: 255 (default, changing to other priority may cause proposal to be rejected for network safety reasons)

  • Call: select utility.batchAll as there will be a couple of transactions included to end the program

F) Batch Tx #2.1: set Loyalty Bonus Ratio to 0

Click Add Item under the utlity.batchAll call in Step E)

Select incentive.updateClaimRewardDeductionRates

Click Add Item under the incentive.updateClaimRewardDeductionRates call

  • ModuleIncentivesPoolId: select Dex

  • AcalaPrimitivesCurrencyCurrencyId: select DexShare

  • Token A and Token B

    • Put in the same tokens in the same order as Step C)

  • u128 (Loyalty Bonus Ratio): enter 0

G) Batch Tx #2.2: set Reward Amount to 0

Click Add Item under the utlity.batchAll call in Step E)

Select incentive.updateIncentiveRewards

Click Add Item under the incentive.updateIncentiveRewards call to add Incentive target pool

  • ModuleIncentivesPoolId: select Dex

  • Dex: AcalaPrimitivesCurrencyCurrencyId: select DexShare

  • Token A and Token B

    • If the two tokens are of different types, then they must be entered in the ascending currencyType order

      • e.g. Token shall be entered as Token A, ForeignAsset shall be entered as Token B

      • Check the currencyType order here

    • If the two tokens are of the same type, then they must be entered in the ascending tokenId order.

      • Token's tokenId can be looked up here

      • ForeignAsset tokenId can be looked up here

    • If you want to list ProjectToken-aUSD, then Token A shall be aUSD, Token B shall be ProjectToken

Click Add Item again under the incentive.updateIncentiveRewards call to specify reward token

  • AcalaPrimitivesCurrencyCurrencyId: select ForeignAsset (select Token if reward token is native Acala token). Same as Step D)

  • ForeignAsset: Same as Step D)

  • u128 (Reward Amount): enter 0

Verify the preimage

You can copy the encoded call data and share it with another person to verify all the details.

The encoded call data from the above example is

0x0302080200c193050000ff0302087805040101000103010000002876e1158d050000000000000000780304010100010301000405010000ca9a3b0000000000000000000000000200801a060000ff0302087805040101000103010000000000000000000000000000000000780304010100010301000405010000000000000000000000000000000000

Paste it into Polkadot webapp - Developer - Decode to see execution steps.

Copy the preimage hash and submit the preimage.

2) Submit the Proposal

On the Governance - Democracy page, click on the Submit Proposal button, and paste the preimage hash there.

Click the Submit proposal button, and now your Referendum Proposal is online.

3) Second a Proposal

At any given time, there may be multiple proposals created. Only the most seconded (voted or supported) proposal will be tabled in for the next Referenda vote. Acala and Karura follows the same process as the Polkadot governance framework with respective set of parameters, read more on Polkadot governance process here.

Create All-in-One Proposal

You can also create a proposal that contains both listing and an Incentive Program.

Note: if the Bootstrap did not meet the liquidity requirement, it will not open on the specified block number e.g. #356660. If your incentive program is configured to start on #356660, since no LP tokens are distributed, no rewards will be distributed either.

1) Submit preimage

This is to generate and submit the actual on-chain execution (namely preimage).

Go to Polkadot webapp, choose the network you are proposal to e.g. Acala or Karura, then navigate to Governance - Democracy

The following is a summary of the preimage structure

  • A) Create an overarching batch call

    • B) Batch Tx #1: a scheduler call to list token with Bootstrap Program

    • C) Batch Tx #2: a scheduler call to set a starting time for Incentive Program

      • create a batch call for the content of the program

        • C1) Batch Tx #2.1: set up Loyalty Bonus Ratio

        • C2) Batch Tx #2.2: set up Reward Amount

    • D) Batch Tx #3: a scheduler call to set an end time for Incentive Program

      • create a batch call for the content of the program

        • D1) Batch Tx #3.1: set Loyalty Bonus Ratio to 0

        • D2) Batch Tx #3.2: set Reward Amount to 0

The encoded call data from the above example is as follows

0x03020c02009a70050000ff5b060001050100070010a5d4e8070010a5d4e813000064a7b3b6e00d130000c84e676dc11b02f915000200407e050000ff0302087805040101000103010000a0db215d000000000000000000000078030401010001030100040501000010a5d4e800000000000000000000000200801a060000ff0302087805040101000103010000000000000000000000000000000000780304010100010301000405010000000000000000000000000000000000

Paste it into Polkadot webapp - Developer - Decode to see execution steps.

2) Submit a Proposal

Click the Submit proposal button to submit the preimage call hash.

Last updated