跳到主要内容

Earn Contract

Relevant parts of the Earn (ERC-1155) contract interface. The address is per chain — read it from GET /earn/domain (domain.verifyingContract) or POST /earn/subscribe/prepare (contract_address).

// Subscribe with a backend EIP-712 signature
function subscribe(uint256 productId, uint256 amount, uint256 deadline, bytes calldata signature) external;

// Claim principal + interest after settlement (burns the receipt NFT)
function claim(uint256 productId) external;

// Refund principal when a product is cancelled
function emergencyClaim(uint256 productId) external;

function getSubscription(uint256 productId, address user)
external view returns (uint256 amount, uint256 expectedReturn, uint256 actualReturn, uint256 subscribedAt, bool claimed);

function getProductConfig(uint256 productId)
external view returns (string memory name, uint256 annualRateBps, uint256 durationDays, uint256 totalQuota, uint256 minAmount, uint256 maxAmountPerUser);

function getProductTiming(uint256 productId)
external view returns (uint256 subscribeStartTime, uint256 subscribeEndTime, uint256 settleTime, uint256 actualSettleTime);

event Subscribed(uint256 indexed productId, address indexed user, uint256 amount, uint256 expectedReturn);
event ProductSettled(uint256 indexed productId, uint256 totalPrincipal, uint256 totalInterest);
event Claimed(uint256 indexed productId, address indexed user, uint256 principal, uint256 interest);

EIP-712

EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)
Subscribe(address user,uint256 productId,uint256 amount,uint256 deadline)
ParameterSource
userYour wallet
productIdchain_product_id
amountamount from prepare (on-chain units)
deadlinedeadline from prepare (30 min)

Claiming

await earn.claim(chain_product_id); // status == settled
await earn.emergencyClaim(chain_product_id); // status == cancelled

The backend indexes Claimed (about 12 s polling) and updates the subscription record (claimed, claimed_at, claim_tx_hash, nft_status: redeemed).

Notes

  • Each prepare signature is single-use and expires after 30 min.
  • The receipt NFT is soulbound: it cannot be transferred or approved to another address.