Skip to main content
Treat sponsorship authority as permission to spend your organization’s money. Authenticate callers, validate every requested intent on the backend, and configure spend limits as a separate backstop.

Validate sponsorship requests

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:
The destination chain, account, and destination calls must all pass. Follow Set up to connect the signer to your token endpoints.The embedded wallet requests a grant twice: first with a JSON-stringified canonical draft input, then with a prepared transaction envelope containing intentInput. createSponsorshipSigner() normalizes both shapes before running shouldSponsor. If your route performs additional checks, normalize the request the same way:
Reject a payload that matches neither shape. The built-in filter receives only the destination chain, 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:
  1. Authenticate the caller with your normal application session.
  2. Resolve the smart account that your session is allowed to use.
  3. Validate policy fields outside the built-in filter against the complete intent payload.
  4. Configure the account filter with the resolved address.
  5. Check every destination target, function selector, calldata rule, and value limit your product requires.
  6. Return 403 without 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’s jti 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.
CORS and cookie attributes only constrain compatible browsers. They do not stop a script from calling a public endpoint. Use them as browser hardening, not as authorization.

Key rotation and fallback

Rotate signing keys by registering a new kid, 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.
Dashboard drawer for enabling and setting a monthly sponsorship usage limit in USD.

Set an organization-wide monthly usage limit in the Dashboard.

Unset limits are unlimited. Project caps do not divide or reserve the organization budget; every project draws from the same organization sponsorship account. The monthly limit does not reserve funds between concurrent intents, so simultaneous admissions can exceed it before their charges are recorded. Testnet sponsorship is not metered against these mainnet limits.
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.