Para
Non-custodial embedded wallet infrastructure using MPC for building embedded wallet integrations across web, mobile, and server platforms supporting EVM, Solana, and Cosmos chains.
Para SDK Implementation Supplement
Concrete build-time details: packages, initialization, authentication, signing, connectors, account abstraction, and configuration for building Para integrations.
1. SDK Package Matrix
All@getpara/* packages must use the same version as each other. Always pin every @getpara/* dependency to the same release to avoid mismatches.
Core SDKs
Signing Integration Packages
Connector Packages
External Wallet Connector Packages
Account Abstraction Companion Deps
Required Companion Dependency
All React examples require:2. Initialization Patterns
React / Next.js (ParaProvider)
config prop accepts:
layout.tsx):
ParaProvider also accepts an optional callbacks prop for event handling:
Vue / Svelte (ParaWeb - imperative)
Server (ParaServer)
React Native / Expo (ParaMobile)
{ disableWorkers: true } option is required for React Native because Web Workers are not available.
Chrome Extension (storage overrides)
chromeStorageOverrides object maps chrome.storage.local / chrome.storage.session to replace localStorage / sessionStorage which are not available in extension service workers. See examples-hub/web/with-chrome-extension/src/lib/chrome-storage.ts for the full implementation.
3. REST API — Default for Server-Side Wallets
When a backend needs to create wallets or sign on behalf of users (pre-created wallets, agent wallets, automated signing), use the REST API. It is the recommended path for nearly all server-side integrations: no SDK to install, no user share to store or encrypt, no MPC ceremony to run per signature. Para’s enclave holds the key material; your server holds only an API key. Only fall back to SDK-based pregeneration when the flow requires direct user-share control (see Section 7). For typed TypeScript access, use@getpara/rest-sdk. Otherwise call the HTTP API from any language.
Base URLs
Authentication Header
Endpoints
sign-transaction, sign-message, sign-typed-data, sign-authorization, transfer, balance, transactions, and estimate-fee endpoints under /v1/wallets/{walletId}/. Full spec: https://docs.getpara.com/openapi.yaml
Create Wallet Request
type:"EVM"|"SOLANA"|"COSMOS"|"STELLAR"userIdentifierType:"EMAIL"|"PHONE"|"CUSTOM_ID"|"GUEST_ID"|"TELEGRAM"|"DISCORD"|"TWITTER"|"FARCASTER"scheme:"DKLS"|"CGGMP"|"ED25519"(optional, defaults based on wallet type)cosmosPrefix: string (optional, for Cosmos wallets)
Sign Raw Request
Error Codes
Example Node.js client
Wallet Claiming
Wallets created over REST are claimable the same way as SDK pregen wallets: when a user signs up through the client SDK with the same identifier (e.g., the same email), the wallet transfers to their account automatically. No server-side action is required.4. Environment Variables
Naming Conventions by Framework
Common Variables
5. Authentication Flows
Email Auth (React hooks pattern)
loginUrl from Step 1 must be displayed to the user in an iframe or popup - it’s the passkey verification page hosted by Para.
Email Auth (Imperative / Svelte / Vue)
OAuth Auth (React hooks)
Verify iframe listener
When showing theloginUrl in an iframe, listen for the close message:
6. Signing Integration Code
Viem v2
Ethers v6
Ethers v5
Solana Web3.js v1
CosmJS
7. Advanced: SDK Wallet Pregeneration
Most server integrations should use the REST API (Section 3) instead of this section. SDK pregeneration requires you to store, encrypt, and restore the wallet’s user share yourself, and to run an MPC ceremony for every signature. Use it only when the flow needs direct user-share control — for example, signing with SDK ecosystem integrations (ethers, viem, @solana/web3.js adapters) before the wallet is claimed. Existing SDK pregen integrations can move over: https://docs.getpara.com/v3/rest/migrate-from-sdk-pregenCreate pre-generated wallet
Restore user share for signing
AES-GCM Encryption Pattern
SQLite Storage Schema
8. Account Abstraction Patterns
Alchemy ERC-4337
Alchemy EIP-7702
ZeroDev ERC-4337
ZeroDev EIP-7702
Gelato ERC-4337
Gelato EIP-7702
Thirdweb ERC-4337
Porto EIP-7702
Porto operates on Base Sepolia with a unique EOA-to-smart-account upgrade flow. Seeexamples-hub/web/with-react-nextjs/aa-porto-7702/ for the full implementation using Account.from(), Key.createSecp256k1(), and RelayActions.prepareUpgradeAccount().
Rhinestone ERC-4337
Rhinestone provides cross-chain account abstraction using@rhinestone/sdk. See examples-hub/web/with-react-nextjs/aa-rhinestone-4337/ for cross-chain USDC transfers (Arbitrum->Base) with sponsored transactions.
9. Connector Integrations
Wagmi Connector
@getpara/react-sdk-lite (not the full @getpara/react-sdk) to avoid bundle bloat, since the connector provides its own modal.
RainbowKit
Graz (Cosmos)
defineChainInfo and ParaGrazConfig type are imported from graz, not from @getpara/graz-integration.
10. Session Management
Check and keep alive
Export / Import session (server transfer)
Issue JWT
11. ParaModal Configuration
TheparaModalConfig prop on <ParaSDKProvider> (or the config object for paraConnector) accepts:
Note: Password and PIN screens render in an iframe and use the Developer Portal theme settings, not paraModalConfig.theme.
12. Mobile Setup Requirements
Required Native Modules (Expo)
Metro Config (polyfills)
Babel Config
iOS Passkey Setup
For passkey support on iOS, you must configure your app’s Associated Domains capability with awebcredentials: entry pointing to your domain. The domain must serve an apple-app-site-association file. See examples-hub/mobile/with-expo-one-click-login/ios/ for an example Xcode project configuration.
Key Init Option
Always pass{ disableWorkers: true } when initializing ParaMobile - Web Workers are not available in React Native.
13. Vite Polyfill Configuration
Vue and Svelte projects using Vite needvite-plugin-node-polyfills because the Para SDK uses Node.js built-in modules (buffer, crypto, stream).
@getpara/web-sdk. The @getpara/react-sdk with Next.js does not need this (Next.js handles polyfills via npx setup-para postinstall script).
14. React Hook Reference
CSS Import
ParaModal requires its stylesheet:ParaProvider renders an embedded ParaModal by default. Do not render a separate <ParaModal /> unless config.disableEmbeddedModal is set to true.
From @getpara/react-sdk
Account & Connection:
useAccount()->{ isConnected, isConnecting, address, embedded }-embedded.walletscontains wallet arrayuseClient()-> Para client instance (for passing to signer constructors)useIsFullyLoggedIn()->boolean | undefineduseParaStatus()->ParaStatus(readiness and Farcaster Mini App detection)useModal()->{ isOpen, openModal, closeModal }useWallet()->Wallet | null | undefined(active wallet)useWalletState()->{ selectedWallet, setSelectedWallet, updateSelectedWallet }useLinkedAccounts()->LinkedAccounts & { userId: string }
useSignUpOrLogIn()->{ signUpOrLogIn, signUpOrLogInAsync, isPending }useVerifyOAuth()->{ verifyOAuth, isPending }useVerifyFarcaster()->{ verifyFarcaster, isPending }useVerifyNewAccount()->{ verifyNewAccount, verifyNewAccountAsync }useWaitForLogin()->{ waitForLogin, isPending }useWaitForWalletCreation()->{ waitForWalletCreation, isPending }useLoginExternalWallet()->{ loginExternalWallet, loginExternalWalletAsync }useLogout()->{ logout, logoutAsync }useAddAuthMethod()->{ addCredential, addCredentialAsync }useLinkAccount()->{ linkAccount, isPending, error }
useSignMessage()->{ signMessage, signMessageAsync }- signs base64-encoded message with wallet IDuseSignTransaction()->{ signTransaction, signTransactionAsync }
useKeepSessionAlive()->{ keepSessionAlive, keepSessionAliveAsync }useIssueJwt()->{ issueJwt, issueJwtAsync }->{ token, keyId }
useCreateWallet()->{ createWallet, createWalletAsync }useCreateWalletPerType()->{ createWalletPerType, createWalletPerTypeAsync }- create wallets for multiple chain typesuseCreateGuestWallets()->{ createGuestWallets, createGuestWalletsAsync }useWalletBalance()->string | null- balance in native units
From @getpara/react-sdk/evm
EVM-specific hooks for direct Viem client access. @getpara/react-sdk includes @getpara/viem-v2-integration; install viem when your app imports Viem helpers directly:
useViemClient({ address, walletClientConfig })->{ viemClient }- returns a Viem WalletClient pre-configured with the Para signer
createParaAccount / createParaViemClient directly.
From @getpara/react-sdk/viem
useViemAccount({ address? })->{ viemAccount: Account | null, isLoading }- lower-level access to the viem Account without creating a full WalletClient
From @getpara/react-sdk/solana
useSolanaSigner({ rpc, walletId? })->{ solanaSigner: SignerWalletAdapter | null, isLoading }- for Solana Signers v2 integration
From @getpara/react-sdk/cosmos
useCosmjsProtoSigner({ prefix?, walletId?, messageSigningTimeoutMs? })->{ protoSigner: OfflineDirectSigner | null, isLoading }- for CosmJS proto signinguseCosmjsAminoSigner({ prefix?, walletId?, messageSigningTimeoutMs? })->{ aminoSigner: OfflineAminoSigner | null, isLoading }- for CosmJS amino signing
15. Testing Credentials
Beta Environment
- Environment:
Environment.BETA/"BETA" - Portal base URL:
https://app.beta.getpara.com - API base URL:
https://api.beta.getpara.com
Test Email Pattern
Use any email ending in@test.getpara.com (e.g., dev@test.getpara.com, test1@test.getpara.com). Any OTP code works (e.g., 123456, 000000).
Test Phone Numbers
Use US numbers (+1) with format(area code)-555-xxxx (e.g., (425)-555-1234, (206)-555-9876). Any OTP code works.
User Limits
50 users per beta account. Delete test users via Developer Portal -> Users section. Users can only be deleted in BETA; in production, wallets are permanent.Post-Install Setup
Many Next.js examples include apostinstall script:
npm install.