Skip to main content
An embedded or MPC wallet provider (Turnkey, Privy, Dynamic, Portal, Crossmint, or another) fits the same pattern regardless of vendor: get the user’s address from the provider, build the action, hand each transaction to the provider’s own sign and send method in order, then submit and track. This page covers that pattern generically. Vendor pages below are not yet live.

Prerequisites

  • An embedded wallet provider already integrated in your app, capable of returning a wallet address and signing a raw transaction or payload for your target chain.
  • A yield.xyz API key. See Enter and exit flows for the request and poll loop this pattern plugs into.

The pattern

1

Get the user's address from the wallet provider

Every embedded wallet provider exposes a method to create or resolve a user’s wallet and return its address for a given chain. Use that address, not one you derive or cache separately, as the address on the action request: it must match the wallet that will actually sign.
2

Build the action

Call POST /v1/actions/enter (or /exit, /manage) with the yield’s yieldId, the wallet’s address, and arguments built from mechanics.arguments.enter.fields. See Discover yields and Enter and exit flows.
3

Hand each transaction to the provider's sign method, in order

Sort action.transactions by stepIndex, skip any already at a terminal status, and for each one, decode unsignedTransaction for the chain family (see Transaction signing) and pass it to the provider’s own signing method: most embedded wallet SDKs expose something shaped like wallet.signTransaction(tx) or wallet.signAndSendTransaction(tx), keyed to the chain rather than to yield.xyz. Consult your provider’s SDK for the exact call; this guide does not repeat vendor API surfaces. Wait for each transaction to confirm before moving to the next stepIndex, unless action.executionPattern is batch.
4

Submit and track

If the provider’s SDK broadcasts for you, report the resulting hash with PUT /v1/transactions/{transactionId}/submit-hash. If it only returns a signed payload, hand that to yield.xyz instead with POST /v1/transactions/{transactionId}/submit. Use one path per transaction, never both. Then poll GET /v1/transactions/{transactionId} (or the whole action) to a terminal status.
The pattern above is the same one a browser extension wallet or a raw key follows; an embedded wallet provider is another signer. Never modify unsignedTransaction before handing it to the provider, whichever provider it is.

Widget integration

If you’d rather not call the Yield API directly, @stakekit/widget accepts an externalProviders option that lets an embedded wallet drive signing inside the widget’s own flow. See Yield widget for that integration path.

Providers

Turnkey (Coming soon)

Programmable key infrastructure for embedded wallets.

Privy (Coming soon)

Embedded wallets with email, social login, and passkey auth.

Dynamic (Coming soon)

Multi-chain embedded wallets with configurable authentication.

Portal (Coming soon)

MPC-based embedded wallets.

Crossmint (Coming soon)

Wallets-as-a-service with NFT and payments infrastructure.

Next steps

Transaction signing

Decode unsignedTransaction by chain family before handing it to a provider.

Custody and signing flows

The equivalent pattern for a backend custody or HSM signer instead of a client-side wallet.