FROST MPC — 2-of-2 Threshold Signing
No complete private key exists anywhere. Signing requires cooperation from at least two parties.
Party 1 — User
Key share stored in the browser, encrypted with Passkey PRF → AES-256-GCM. The server cannot decrypt it.
Party 2 — BitVoy Server
Holds one encrypted share only. Cannot produce a valid signature alone. Server compromise ≠ fund loss.
Backup — Guardian Node
Stores an encrypted backup of the user's share (Party 1). Encrypted by the user with Passkey PRF → AES-256-GCM before upload — the Guardian cannot decrypt or use it for signing. Used solely for account recovery.
On-Chain Atomic Fee Splitting
Funds are split directly on-chain in the same transaction — BitVoy never receives and redistributes.
Fee splitting via executeIntentV3 in the Smart Account contract.
User signs EIP-3009 transferWithAuthorization via MPC. OP Signer submits on-chain, splitting funds atomically to merchant and fee recipient. USDT uses Permit2 + PaymentRouter as fallback.
| ❌ Custodial Pattern | ✅ BitVoy's Design | |
|---|---|---|
| Fund Flow | User → BitVoy → Merchant | Contract splits directly (SMART: inside SA, FAST: EIP-3009 direct transfers) |
| Intermediate Custody | Yes — BitVoy temporarily holds funds | None — instant distribution within the same tx |
| Tampering Risk | BitVoy could manipulate amounts | SMART: intentHash signature · FAST: EIP-3009 signature prevents tampering |
Gas Sponsorship by BitVoy
BitVoy covers gas costs in both modes — without touching the user's ERC-20 tokens.
How It Works
BitVoyPaymaster.solpaymasterAndData, authorizing gas sponsorship for this specific UserOpEntryPoint settles gas costs from the Paymaster's deposit to the Bundler — user's ERC-20 balance is never touchedpaymasterAndData Structure — 97 bytes
How It Works
transferWithAuthorization via MPC — authorizing a specific token transfer without spending gasOIDC Payment — Step-by-Step
Detailed flow for both modes showing exactly where signatures and splits occur.
computeIntentHashV3executeIntentV3 callData (V3 ABI)executeIntentV3 → atomic splitPOST /prepare — server generates EIP-3009 TransferWithAuthorization EIP-712 typed data (payee + fee)POST /relay — OP Signer submits both transferWithAuthorization calls on-chainPaymentRouter.payWithFee() (EIP-3009 not supported by USDT)| Feature | Mode | Fee Method | Contract | Mechanism |
|---|---|---|---|---|
| OIDC Payment | SMART | executeIntentV3 |
BitVoySmartAccountIBUOv3 | On-chain split inside SA |
| OIDC Payment | FAST | transferWithAuthorization |
ERC-20 Token Contract | EIP-3009 direct transfers (USDT: Permit2 fallback) |