The one thing to know first
A Chipi wallet is a SHHH smart account (account abstraction), not a plain EOA like a MetaMask account. Its__validate__ is disabled on purpose (shhh-wallet-cairo:src/account.cairo panics with 'SHHH: __validate__ disabled'), so the standard starknet.js path throws:
execute_from_outside_v2. Your exported key signs; the transaction can be paid by anyone (you or a relayer), because the OE is permissionless.
Option A — Self-sovereign (no Chipi servers, you pay gas)
You sign with your exported key, then submit the signed OE from any funded Starknet account you control. Chipi is not in the loop — this is what makes self-custody verifiable. In TypeScript, theShhhAccount adapter wraps the whole flow so it reads like starknet.js. In Python, compose the same primitives directly.
Option B — Gasless, via Chipi’s paymaster
Same signing, but hand the serialized calldata to Chipi’s relayer so you don’t fund a gas account. You still hold the key; Chipi only relays.Notes
ownerIndex0is your primary owner (the exported key). Devices you added later are other owners with their own non-extractable passkeys; exporting doesn’t touch them.- Additive, not destructive. Using the key from code doesn’t disable the app — you can keep using Face ID in the wallet and your key in code at the same time, like MetaMask.
- Mainnet only. Use the mainnet chain id and native USDC (
0x033068…b35fb, not USDC.e). - Replay protection is per-
nonce; reusing a nonce reverts withSRC9: duplicate nonce. TheShhhAccountadapter generates a fresh nonce per call. - If you ever suspect the key leaked, move your funds to a fresh wallet — there is no revoke for a raw key.
