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
User funds never pass through a BitVoy address. Based on the content the user signed, the payment contract (PaymentRouter) distributes directly to the merchant and fee recipient within a single transaction.
What this design guarantees
| Guarantee | Detail |
|---|---|
| No intermediate custody | Distribution completes within the same transaction — no funds enter a BitVoy address. No balance remains in the Router at transaction end. This can be verified in the contract code, which is verified on each chain's explorer. |
| Tamper-proof | The signature nonce is generated as keccak256(abi.encode(intentIdBytes32, payee, feeRecipient, totalAmount, feeAmount, deadline, chainId)), binding it to the intentId, recipient, fee recipient, total amount, fee amount, deadline, and chain. No one — including the Relayer — can alter it after signing. If the content does not match, the Router reverts. |
| Funds stay put on failure | If the transaction fails, funds remain in the user's wallet. |
| Fixed fee | The fee rate is fixed at 1% and enforced on-chain. |
For details on signature methods, contract functions, and per-mode breakdown, see Appendix: Technical Details.
Gas Sponsorship by BitVoy
In gasless modes, the Relayer pays gas in native tokens. The Relayer only submits the signed content on-chain and cannot alter the transfer amount, recipient, or deadline. Gas is never deducted from the user's ERC-20 token balance. Gas sponsorship is BitVoy's service cost, not custody of user funds.
| Mode | Gas Payer |
|---|---|
| FAST (BitVoy wallet) | BitVoy (Relayer). User needs no native tokens |
| WC: eip3009 / permit2 | BitVoy (Relayer). User needs no native tokens |
| WC: approve | User (native tokens from own wallet: KAIA / POL / AVAX / ETH) |
FAST & WC Modes
FAST mode uses the BitVoy wallet (MPC passkey), WC mode uses an external wallet (e.g. MetaMask). Signing occurs entirely within the user's own wallet. Final distribution is executed on-chain by the PaymentRouter in all modes.
| Mode | User Action | Sender | Gas | Contract · Function |
|---|---|---|---|---|
| FAST | EIP-3009 signature via MPC passkey | Relayer | BitVoy | PaymentRouterV4_2 eip3009Pay (USDT: V5_2 permitAndPay) |
| WC: eip3009 | EIP-3009 signature via external wallet | Relayer | BitVoy | PaymentRouterV4_2 eip3009Pay |
| WC: permit2 (USDT) | Permit2 Witness signature via external wallet | Relayer | BitVoy | PaymentRouterV5_2 permitAndPay |
| WC: approve | Send approve and pay (2 transactions) via external wallet | User | User | PaymentRouterV4_2 pay |
Appendix: Technical Details
A. Signature Design and Relayer Permissions (FAST / WC eip3009)
| Item | Detail |
|---|---|
| Signature content | EIP-3009 transferWithAuthorization with from = User, to = PaymentRouter, value = totalAmount |
| Nonce generation | keccak256(abi.encode(intentIdBytes32, payee, feeRecipient, totalAmount, feeAmount, deadline, chainId)) — bound to intentId, recipient, fee recipient, total amount, fee amount, deadline, and chain |
| Router behavior | When Relayer calls eip3009Pay(), the Router verifies the signature, withdraws totalAmount, and distributes to merchant and fee recipient via safeTransfer. If nonce and arguments don't match, reverts — Relayer cannot substitute recipient or amount |
| Relayer's holdings | Only native tokens for gas (no user funds) |
| Fee | totalAmount * 100 / 10000 (1%) — enforced on-chain |
B. Tamper-proof mechanism by mode
| Mode | Tamper-proof |
|---|---|
| FAST / WC eip3009 | payee, feeRecipient, amounts etc. encoded in EIP-3009 nonce. Router reverts on mismatch |
| WC permit2 (USDT) | Payment content included in Permit2 Witness signature. Reverts on mismatch |
| WC approve | Amount and recipient enforced in Router.pay() calldata |
C. Checkout Flow (Steps)
FAST (BitVoy wallet)
| Step | Detail |
|---|---|
| 1. Authentication | User performs passkey authentication (BitVoy MPC) |
| 2. Typed data generation | Server generates EIP-3009 TransferWithAuthorization typed data (from = payer, to = Router, value = totalAmount, nonce = hash of checkout data) |
| 3. Signing | Client signs via MPC passkey. BitVoy server cannot sign alone |
| 4. On-chain submission | Relayer calls PaymentRouterV4_2.eip3009Pay(). For USDT, uses Permit2 Witness signature to call PaymentRouterV5_2.permitAndPay() |
| 5. Distribution | Router distributes to merchant and fee recipient within the same transaction |
WC (External Wallet)
| Step | Detail |
|---|---|
| 1. Page load | User opens the checkout page and selects a wallet |
| 2. Connection | Connect to external wallet via WalletConnect |
| 3. Sign / Submit | Depending on mode: (a) EIP-3009 signature → Relayer submits, (b) approve → pay (user submits), (c) Permit2 Witness signature → Relayer submits (USDT) |
| 4. Distribution | Router distributes to merchant and fee recipient within the same transaction |
On-Chain Contract Registry
All payment router contracts are trustless — no owner, no upgrade proxy, no admin key. Deployed bytecode is immutable and publicly verifiable on each chain's explorer.
| Chain | Contract Address | Verified | Deployed |
|---|---|---|---|
| Polygon | 0xD2561A8eE9E115C5c2547EFE1269a3811522444D | ✓ Polygonscan | 2026-09-30 |
| Avalanche | 0xBef55Dd61591dc813A8682e6e1485B49dE9cf21E | ✓ Snowtrace | 2026-10-01 |
| Base | 0xE8165806C55C75319896467CAF21135E7e312436 | ✓ Basescan | 2026-10-01 |
| Kaia | 0x745aaAa418c81a33b82ef51bcEB538d84B67d69E | ✓ Kaiascan | 2026-10-01 |
| Chain | Contract Address | Verified | Deployed |
|---|---|---|---|
| Polygon | 0x47A801Fa39E38A93b63E1E60379b27d7C5BC7811 | ✓ Polygonscan | 2026-10-01 |
| Avalanche | 0xbdc6652960718D95EEccDf8458eAC18352025184 | ✓ Snowtrace | 2026-10-01 |
| Base | 0xbe082A1Aa29709D28fCA3451838F6aAfab8b96b3 | ✓ Basescan | 2026-10-01 |
totalAmount * 100 / 10000)