Not every position earns rewards. A vault’s apy in
list_earn_vaults already includes any Merkl reward rate, but that rate is a vault-wide figure. Rewards only reach a wallet when the campaign is a forwarding-capable type and the wrapper’s total rewards in that token clear Merkl’s per-token hourly minimum.How Merkl rewards work with Earn
Turnkey deploys a FeeWrapper between the user’s wallet and the underlying vault. Merkl can attribute rewards from forwarding-capable campaigns through the wrapper to the end depositor automatically — no separate campaign needed for your wrapper. Some campaign types (plain ERC-20 campaigns) do not forward and strand rewards at the adapter; those will not appear in a wallet’s claimable rewards. Claims are sent from the user’s wallet. The Merkl Distributor (0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae, same address on all supported chains) only accepts claims signed by the earner — third-party senders revert with NotWhitelisted. Claimed tokens are paid to the claiming wallet.
Check rewards
Calllist_earn_rewards to fetch a wallet’s current reward state across all chains (or a single chain with the optional caip2 filter):
cURL
pending rewards are not yet claimable — they will move to claimable after the next Merkl root publication (roots update roughly every 8 hours).
Claim rewards
Submit anACTIVITY_TYPE_EARN_CLAIM_REWARDS activity to claim all currently claimable rewards for a wallet on a given chain in a single transaction:
cURL
claimRequestId used to poll status. Pass sponsor: true in parameters to cover the claim’s gas through Gas Station; otherwise the signWith wallet pays gas itself.
A claim with nothing currently claimable on that chain is rejected with an invalid-argument error, so check list_earn_rewards first — rewards that are still pending cannot be claimed.
signWith must be the wallet that earned the rewards. The Merkl Distributor rejects claims where the sender does not match the earner.Poll claim status (required)
cURL
status is PENDING, COMPLETED, or FAILED. On COMPLETED the response includes claimTxHash. On FAILED it includes an error field.
SDK usage
JavaScript
Next steps
- Track positions — see your current value and yield
- Withdraw from a vault — partial or full exit