The path
1
Sign in with a wallet
SIWE only. No email, no password. The
merchants row is created on first sign-in, and the merchant wallet is screened for sanctions at this point.2
Attest a payout recipient
Call
setRecipient on MerchantRegistry from the wallet that will own the settlement. This is ownerless and msg.sender-scoped, so nobody else can attest on the merchant’s behalf.Optional in the sense that effectiveRecipient is identity-default — an unattested merchant resolves to themselves — but an explicit attestation is what makes the anchor check meaningful.3
Deploy the pool, per chain
The merchant signs the prepared factory transaction from the dashboard and pays native gas. Roughly 29.37 on TRON**.No contract change is needed for this: the pool address is CREATE2-deterministic and its init code commits the recipients, so anyone can deploy it.
4
Get the embed snippet
SDK keys and the iframe snippet unlock only once the pool has code on-chain.
5
Pin the settlement anchor
Put the payout wallet in the embed on the merchant’s own site. This is the root of the client-side verification chain and the thing a database compromise cannot reach.
Why deployment gates integration
The gate sits at integration, not at signup and not at checkout. A merchant can create an account and explore freely, but cannot ship anything until their pool exists.
- It stops an unproven account from spending platform money. The keeper previously deployed pools lazily on its own gas at first use. Ten thousand fake accounts would cost 288,200 on TRON**. The cost is not the point on EVM; the unauthenticated ability to make the platform spend is.
- A live integration always has a settlement destination. No customer can pay into a configuration that was never finished.
Rail availability per chain
The deposit rail works before deployment because a sweep into an undeployed pool is a plain ERC-20 transfer that becomes distributable the moment the pool exists. The connect rail does not, because
deposit() is a contract call that reverts against an address with no code.
Keep a keeper-side rescue path for a customer payment that lands while a pool is somehow still undeployed. Never strand a real payment over a merchant’s unfinished setup step.