Creating Wallets
Non-treasury and treasury wallets, passkeys, and the networks and assets each supports.
Networks and assets
Each wallet type is a moduleId.
moduleId | Networks | Assets |
|---|---|---|
evm_erc4337 | Ethereum, Base, Arbitrum, Polygon, Celo, Optimism and Plasma | USD₮ on every network (also USD₮0 on Optimism); XAUT on Ethereum, Arbitrum, Polygon and Plasma |
bitcoin | Bitcoin | BTC |
spark | Spark | BTC |
solana | Solana | USD₮ |
tron | Tron | USD₮ |
ton | TON | USD₮ |
On the EVM networks the wallet is a Safe smart account, with the same address on every chain.
How wallets are secured
| Network | Who holds the key | What the customer's passkey does |
|---|---|---|
| EVM | The passkey is an owner of the wallet's Safe | Signs each payment itself; the Safe on chain enforces it. |
| Bitcoin, Spark, Solana, Tron, TON | The wallet key is held in our signing enclave | Approves the exact transfer; the enclave signs only after verifying it. |
On every network, an API key alone cannot move funds.
Get wallet control shows, for each EVM network, the Safe's owners, how many are passkeys, its signing threshold, and whether the customer's passkey is the only key.
Passkeys
A wallet is secured by your customer's passkey. There is no seed phrase. Register a passkey on the customer's device and send its registration:
| Field | Value |
|---|---|
credentialId | The passkey's credential ID. |
credentialPublicKey | The passkey's public key. |
rpId | Your domain, the relying party of the passkey. |
origins | The origins the passkey is used from. |
One network or all
| Request | Creates |
|---|---|
| Provision wallets | A wallet on every network, all secured by the same passkey. |
| Create wallet | A wallet for one moduleId. |
Both take the customer in the x-customer-id header.
Non-treasury and treasury
Wallets are non-treasury by default. Set isTreasury: true to create a treasury wallet, which supports multiple signers, approvals and spending limits. See Treasury.
Adding another passkey
Add passkey registers a second passkey, for example a new device, approved with a passkey the customer already has. On EVM the new passkey also becomes an owner of the Safe.
If that on-chain step does not start, the response says onChain.status: "not_started" with retryable: true. Finish it with Retry passkey enrolment, naming the current owner (existingOwner) by the passkeyPublicKey from List passkeys.