Rewards on stablecoin balances
What are rewards on stablecoin balances?
Rewards on stablecoin balances are payments to customers based on how much of a stablecoin they hold over a period, run as a stablecoin rewards program.
Neobanks and fintechs with their own ledger offer them to keep customer balances with them, and every period someone has to fix who held what, apply the terms and pay each customer the right amount.
Goldsky runs the schedule, reads each wallet’s balance at the record block and sends each reward to your signer; the terms, the question of whether a program fits the rules where you operate, and the keys stay with you.
Who pays rewards on stablecoin balances?
Neobanks, consumer finance apps and fintechs with their own ledger that pay rewards to customers who hold stablecoins with them.
How rewards on stablecoin balances work
The diagram follows one reward period from setting its terms to the rewards landing in customers’ wallets. Your setup may differ.
Set the reward terms
Every reward is worked out from the same rules, so they have to be fixed before the period ends.
Your team sets the rate, how balances are measured and which customers qualify, after legal review where you operate. Terms changed mid-period leave some customers paid on old rules.
Fix the record block for the period
Handled by Goldsky ComposeBalances change all the time, so each period needs one agreed point to measure them at.
Pick a block far enough behind the newest one that a reorg can’t replace it, and keep it with the period. Measuring at a block that later changes means paying on balances that never existed.
With Goldsky Compose, a task on a cron trigger runs at the end of each period, picks the record block and keeps it with the run.
Schedule a task with cron (opens in a new tab)Read each balance at the record block
Handled by Goldsky EdgeEach customer is rewarded on what their wallet held at the agreed point.
Read every wallet’s token balance at that exact block, not the latest one. A wallet left out of the read gets nothing, and someone has to pay it by hand.
Edge RPC answers
Read the eth_call reference (opens in a new tab)eth_callat any block number you pass, so the task can call the token’sbalanceOffor each wallet at the record block.Calculate each customer’s reward
Handled by Goldsky ComposeThe terms turn each balance into an amount, and the amounts have to add back up to what you budgeted.
Rounding has to be settled in the terms: round every reward down and leave the remainder unassigned, and money is left over; round up, and the payout runs short before the last customer.
The task applies your terms in its own TypeScript code, so the formula lives in your repository and every input to it is logged on the run.
How Compose logs each call (opens in a new tab)Send each reward for signing
Handled by Goldsky ComposeEach reward is a payment from your payout wallet, signed with a key you control.
Each customer is paid once per period. A retry after a timeout or a restart must not pay anyone twice.
Goldsky’s Compose webhook wallet sends the signing endpoint you host each payment as a UserOperation (the transaction format smart-account wallets use) to sign, plus a one-time EIP-7702 authorization the first time it sends on a chain, and submits it once signed; a payment that already landed isn’t sent again after a retry.
Learn about webhook wallets (opens in a new tab)Sign the reward payments
Most firms keep payout keys with a custody provider whose rules say who can approve what.
Your signing endpoint holds the limits set before the run starts: it reads the recipient and amount from each reward’s call data, checks them, then asks your custody provider to sign. A run that exceeds your limits stops before money leaves.
Deliver the rewards
The reward is paid when it lands in the customer’s wallet and shows in their balance.
Each payment sits in a block that a reorg can still replace for a short time. A payment that never confirms still counts as unpaid.
Confirm every payment and close the period
Handled by Goldsky ComposeThe period is closed when every customer owed a reward has been paid, and the record shows it.
Check each payment confirmed, resend any that a reorg dropped, and compare the total paid with the total calculated. Customers left unpaid are followed up before the next period starts.
Compose waits for the confirmations you set on each payment and resends it with the
Handle confirmations and reorgs (opens in a new tab)replaybehavior if a reorg drops it, and the run keeps the full record.
Related jobs
Join the issuer’s rewards program
The rewards come from the stablecoin’s issuer or its program, under an agreement that sets the rate and what counts.
The agreement sets the rate, how often rewards are paid and which wallets count. Rewards accrue only on wallets you’ve registered with the program, from the day you register them, so a wallet added late earns nothing for the days before.
Keep each customer’s daily balance
The program pays on the total in your wallets, and each customer is owed in proportion to what they held.
Your ledger records each customer’s stablecoin balance at the same daily cutoff the program uses. A ledger that measures at a different time splits rewards on balances that don’t match what the program counted.
Receive the rewards payment
The program pays what your wallets earned to the payout address you gave it, on the schedule it sets.
Each payment arrives as a token transfer to your payout address. For a short time the chain can still replace its newest blocks (a reorg), so a payment seen once isn’t final yet.
Record each payment to your payout address
Handled by Goldsky TurboYour team can only split a payment it knows has arrived.
Every transfer into the payout address is recorded with its amount, token, sender and transaction hash, apart from customers’ own deposits. A payment recorded twice gets split twice.
With Goldsky, your payout addresses can sit in a Turbo Pipelines dynamic table, which lives in a Postgres database, and the pipeline keeps only token transfers whose
Learn about dynamic tables (opens in a new tab)recipientis on it withdynamic_table_check(). A database sink keyed on the transfer’sidupdates the same row if a payment is delivered again.Check the payment against the program’s statement
The amount paid should match what the program says your wallets earned for the period.
Compare each payment with the rate and balances in the program’s statement for the same days. A gap means a wallet wasn’t registered, a balance was counted differently or a payment is still to come, and it’s settled before customers are credited.
Credit each customer’s share
Customers earn in proportion to what they held, after any fee you keep.
Your ledger splits the payment across customers by their daily balances, takes off your fee if you charge one, and credits each account in the same stablecoin. Rounding is set in your terms, so the shares add back up to the payment.
What you control
- Your team
- Set the reward terms
- Your providers
- Wallet or custody provider
Security and deployment
- SOC 2 Type IIIndependently audited security controls.
- Dedicated infrastructureSingle-tenant options for production workloads.
- Data residencyCloud, on-premises or co-located.
More use cases that run stablecoin accounts and cards
- Stablecoin card programsDetect stablecoin top-ups to the wallets that back a card program so spend limits update.
- Stablecoin dollar accountsOffer dollar accounts held in stablecoins, with balances and history kept in step with the chain.
- Stablecoin card program operationsWatch card-backing wallets and read balances at authorization time for stablecoin-linked cards.
- Stablecoin credit lines for card issuersTrack the stablecoin draws and repayments on a card issuer’s credit line so the lender’s book matches the chain.
Use cases built the same way
Pay rewards on stablecoin balances with Goldsky
We’ll map it to your systems and show you what Goldsky runs, so your team builds the product, not the pipelines underneath it.