Galliun MVP supports Sui and Solana only. New chains follow a consistent pattern across API verification, SDK wallet modules, and platform payment rails.
SDK side
- Create a wallet module at
packages/sdk/src/chains/<chain>/ - Implement
PaymentWalletAdapterwithaddress()andpay()— thepay()method must execute an atomic direct split (all legs in one transaction) - Export a factory function from
packages/sdk/src/index.ts - Update SDK docs in
apps/docsand engineering docs indocs/supported-chains.md
Platform side
- Create API verification adapter at
apps/api/src/payments/adapters/<chain>.ts - Add chain to
SUPPORTED_CHAINSin@galliun/shared - Configure payment rails (RPC, network, provider recipient, platform fee recipient, USDC asset, decimals)
- Register adapter in
apps/api/src/bootstrap.ts - Update
.cursor/rules/supported-chains-source-of-truth.mdcanddocs/supported-chains.md
Payment config requirements
Each chain needs:
- RPC URL
- Network name (mainnet/testnet/devnet)
- Provider recipient address (from org payment rail)
- Platform fee recipient address (from API env:
GALLIUN_*_PLATFORM_FEE_RECIPIENT) - USDC asset identifier (Sui coin type or Solana mint)
- Decimals (6 for USDC)
Verifier expectations
- Transaction must exist and succeed
- Payer must match proof (fee payer / sender where determinable)
- Payer must not equal any split recipient address
- Each split leg must receive the exact required amount
- Asset type must match the requirement and env config
- Network must match config
Replay protection
All chains use the shared Convex claimPayment flow. Chain adapters verify on-chain only — never bypass replay checks.
Do not
- Put chain-specific logic in x402 middleware
- Skip Convex claim before on-chain verification
- Hardcode chain logic in route handlers
- Reintroduce single-recipient
exactor custodial treasury flows
Removed chains
EVM/Base adapters, the finance worker, and custodial treasury flows were removed. See Base / EVM (removed).