Skip to content
Developers

Search D0 documentation

Search the D0 Checkout integration guide

Connect Wallet

Create the payment

Implement the small adapter Checkout calls after the payer reviews an amount and confirms the wallet action.

EVM + Solana + TRONPartner controlledPolicy driven

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.

json
{
  "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.

FamilyImplementation responsibility
EVMSwitch to Ethereum or BSC, simulate an ERC-20 transfer, then submit with the fresh chain-pinned wallet client.
SolanaResolve token accounts, build and simulate the SPL Token transfer, then sign and send through the selected Wallet Standard provider.
TRONBuild a TRC-20 transfer with the host-connected TRON provider, request signature and broadcast the signed transaction.

Build the adapter

tsx
import type {
  D0fiPartnerContractDepositConfig,
  D0fiPartnerContractDepositRequest,
} from '@d0fi/checkout-react';
tsx
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.

© 2026 D0 Labs Inc.Checkout React SDK v0.1.0