Validate sponsorship requests
- Embedded wallet
- Custom signer
Filter grant issuance
createSponsorshipSigner({ shouldSponsor }) runs its filter before Rhinestone receives an extension token. Create the signer for the authenticated request, using the account address your application session is allowed to use:intentInput. createSponsorshipSigner() normalizes both shapes before running shouldSponsor. If your route performs additional checks, normalize the request the same way:account.address, and destination executions from the canonical input. It does not inspect source chains or assets, token requests, source-side calls, account access lists, or sponsorship settings. Validate those fields separately against intentInput when they affect your policy.For each extension-token request:- Authenticate the caller with your normal application session.
- Resolve the smart account that your session is allowed to use.
- Validate policy fields outside the built-in filter against the complete intent payload.
- Configure the account filter with the resolved address.
- Check every destination target, function selector, calldata rule, and value limit your product requires.
- Return
403without minting a token when any check fails.
verifyOneAuthAccount() can confirm that an address is recognized by the embedded wallet provider. Your application session must still establish that the current user is allowed to use it.Current enforcement boundary
Rhinestone verifies that the JWT signing key belongs to the project, that access and extension token identity claims match, and that the extension token’sjti has not already been used. The extension token also carries the canonical intent digest.The orchestrator does not currently compare that embedded digest with the submitted intent. An issuance filter therefore prevents accidental grants but is not authorization against a client that changes the payload after issuance.The embedded wallet browser flow must return the extension token to the client, so it cannot keep that grant server-side. If your threat model includes a modified or malicious embedded-wallet client, do not enable client-held sponsorship grants until downstream intent binding is enforced.Key rotation and fallback
Rotate signing keys by registering a newkid, switching issuance, then disabling the old key after outstanding tokens expire.Do not switch a rejected sponsored transaction to user-paid at submission time. With embedded wallets, sponsorshipMode: "preferred" obtains a new self-funded quote before authorization; "required" remains fail-closed. See Sponsor fees before enabling fallback.Configure budgets
Configure limits on the Dashboard’s Sponsorship screen.
Set an organization-wide monthly usage limit in the Dashboard.
Request validation answers “should this intent be sponsored?” Budgets answer
“can this sponsorship account pay for it?” Use both.
Failure behavior
Funding affects the quote and the operations the user authorizes. A user-paid fallback always needs a new quote and user approval.
Operational checklist
- Keep private keys and API keys in backend secret storage.
- Authenticate token-minting and transaction endpoints.
- Bind every account to the authenticated application session.
- Allowlist chains, contracts, functions, and values as narrowly as possible.
- Set project per-intent caps and an organization monthly limit.
- Log policy denials without logging tokens, private keys, or sensitive request data.