Skip to content

Add on-chain credit redemption contract for converting credits to rewards #31

Description

@prodbycorne

Overview

Credits accrued via the farming-pool (get_credits, calculate_credits) have no on-chain redemption mechanism. They exist as an accounting value in storage but cannot currently be converted to any reward token. A CreditRedeemer contract is needed to close this loop.

Design

CreditRedeemer
  ├── initialize(admin, reward_token, pool: Address, credits_per_token: u128)
  ├── redeem(user)          — burns user credits, transfers reward tokens
  ├── set_credits_per_token(admin, new_rate)
  └── redemption_info() -> RedemptionInfo

Redemption Flow

  1. User calls redeem
  2. Redeemer reads user's total credits from the farming-pool contract via cross-contract call
  3. Computes reward_amount = total_credits / credits_per_token
  4. Marks credits as redeemed (stores redeemed_credits for the user)
  5. Transfers reward_amount of reward_token to user
  6. Emits redeemed event

Credit Snapshot Problem

Credits accrue continuously — the redeemer cannot "burn" them from the pool contract. Instead, use a snapshot model:

  • CreditRedeemer stores credits_at_last_redemption per user
  • On redeem: redeemable_credits = current_credits - credits_at_last_redemption
  • Updates the snapshot after redemption
pub struct RedeemKey {
    pub user: Address,
    pub last_redeemed_credits: i128,
}

Token Supply Consideration

The admin must fund the CreditRedeemer contract address with enough reward_token balance before redemptions can proceed. Add a reward_balance() getter.

Acceptance Criteria

  • contracts/credit-redeemer/ created
  • Cross-contract call to FarmingPoolClient::get_credits (or calculate_credits)
  • Snapshot model prevents double-redemption without burning credits
  • set_credits_per_token admin function for rate adjustment
  • reward_balance getter returns contract's current token balance
  • Tests: first redeem, second redeem (only new credits), zero redeemable credits
  • Test: insufficient reward token balance returns typed error

Metadata

Metadata

Assignees

Labels

GrantFox OSSIssue tracked in GrantFox OSSMaybe RewardedIssue may be eligible for a GrantFox rewardOfficial CampaignCampaign: Official CampaignfeatureNew feature or capability

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions