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)
| Parameter | Source |
|---|---|
user | Your wallet |
productId | chain_product_id |
amount | amount from prepare (on-chain units) |
deadline | deadline 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.