Connect Wallet
Create the payment
Implement the small adapter Checkout calls after the payer reviews an amount and confirms the wallet action.
Load policy from your backend
Return the wallet family, network reference, asset reference, receiving address and decimals from an authenticated backend endpoint. The pair must come from the Checkout Session catalog—not URL parameters or other browser-controlled input.
{
"network": "ETH",
"asset": "USDT",
"walletFamily": "evm",
"networkReference": "eip155:1",
"assetReference": "0xTOKEN_CONTRACT",
"destinationAddress": "0xRECEIVING_ADDRESS",
"destinationLabel": "Your treasury",
"decimals": 6
}Dispatch to a chain adapter
Keep one normalized Checkout adapter, then dispatch transaction creation by walletFamily. Each implementation must return the final network transaction signature or hash.
| Family | Implementation responsibility |
|---|---|
| EVM | Switch to Ethereum or BSC, simulate an ERC-20 transfer, then submit with the fresh chain-pinned wallet client. |
| Solana | Resolve token accounts, build and simulate the SPL Token transfer, then sign and send through the selected Wallet Standard provider. |
| TRON | Build a TRC-20 transfer with the host-connected TRON provider, request signature and broadcast the signed transaction. |
Build the adapter
import type {
D0fiPartnerContractDepositConfig,
D0fiPartnerContractDepositRequest,
} from '@d0fi/checkout-react';const partnerContractDeposit = {
network: policy.network,
asset: policy.asset,
contractAddress: policy.assetReference,
contractLabel: `Pay with ${policy.asset}`,
destinationAddress: policy.destinationAddress,
destinationLabel: policy.destinationLabel,
explorerTransactionUrl: explorerBaseFor(policy.network),
account: accountFor(policy.walletFamily),
async execute(request) {
assertRequestMatchesPolicy(request, policy);
const transactionHash = await submitTransfer({
walletFamily: policy.walletFamily,
networkReference: policy.networkReference,
assetReference: policy.assetReference,
destinationAddress: policy.destinationAddress,
amount: request.amount,
decimals: policy.decimals,
expectedWalletAddress: request.walletAddress,
});
await registerSubmittedTransaction({
sessionId: request.session.id,
transactionHash,
network: policy.network,
asset: policy.asset,
idempotencyKey: request.idempotencyKey,
});
return { transactionHash };
},
} satisfies D0fiPartnerContractDepositConfig;Validate before signing
- Require the connected address to match
request.walletAddress. - Require network, asset and wallet family to match the current server policy.
- Compare asset and destination references using chain-appropriate normalization.
- Simulate the exact transaction before asking the wallet to submit it.
For EVM payments, request a fresh chain-pinned wallet client after switching networks. Do not reuse a client captured before the switch. Apply the equivalent network check for Solana and TRON.
Render the rail
Pass the adapter to D0fiCheckoutExperience and explicitly enable connectWallet. The row is not rendered when either side of that contract is missing.