Skip to main content

Smart contract reference

This reference provides contract addresses, token information and function definitions for Volet.com non-custodial payments on Ethereum, BNB Smart Chain and TRON.

For step-by-step instructions, see Ethereum and BNB Smart Chain integration or TRON integration.

Payment processor addresses​

Each supported asset uses a payment processor smart contract.

NetworkAssetProcessor contract
Ethereum Mainnet (1)ETH0x2fceE245109Cf3c535489a6F52fe11b3BBd644FF
Ethereum Mainnet (1)USDT ERC-200xe4083ED0A1101615b9092E8cD2164e2f42B4571E
BNB Smart Chain (56)BNB0x2fceE245109Cf3c535489a6F52fe11b3BBd644FF
BNB Smart Chain (56)USDT BEP-200xe4083ED0A1101615b9092E8cD2164e2f42B4571E
TRON MainnetTRXTSK9sgBTjvZa6x2yW1bXNWqvQ57WsVUQ3W
TRON MainnetUSDT TRC-20TDuE6VueULx5oivQd4MsYr9DEhNMgXNfTm

Before processing payments, confirm the deployed contract addresses and ABI with Volet.com. Contracts for other networks, assets or custom payment flows may use different addresses and interfaces.

Token addresses and decimals​

NetworkAssetToken contractDecimals
EthereumETH (native)N/A18
EthereumUSDT ERC-200xdAC17F958D2ee523a2206206994597C13D831ec76
BNB Smart ChainBNB (native)N/A18
BNB Smart ChainUSDT BEP-200x55d398326f99059fF775485246999027B319795518
TRONTRX (native)N/A6 (SUN)
TRONUSDT TRC-20TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t6

All smart contract amounts must be expressed in the asset's smallest units.

  • ETH and BNB: Use ethers.parseEther() to convert amounts to wei.
  • USDT on EVM: Use ethers.parseUnits(amount, tokenDecimals) with the appropriate token precision.
  • TRX: Use SUN, where 1 TRX = 1,000,000 SUN.
  • USDT on TRON: Use integer token base units, where 1 USDT = 1,000,000 units.

Do not use floating-point arithmetic to calculate payment amounts.

Payment contract interface​

The standard payment processor provides two main functions: previewPayment() and transfer().

interface IVoletPaymentProcessor {
function previewPayment(
uint256 amount,
bool buyerPaysCommission
) external view returns (
uint256 commission,
uint256 totalPay
);

function transfer(
address seller,
uint256 amount,
bool buyerPaysCommission,
address optionalCommissionWallet
) external payable;
}

This interface describes the payment functions used in the integration guides. Use the complete verified ABI for the deployed contract when decoding events or handling contract-specific errors.

previewPayment()​

Calculates the processing fee and the total amount the customer must pay.

Parameters

ParameterTypeDescription
amountuint256Requested payment amount in the asset's smallest units
buyerPaysCommissionboolDetermines whether the processing fee is added to the customer's payment or deducted from the merchant's proceeds

Return values

ParameterTypeDescription
commissionuint256Processing fee in the asset's smallest units
totalPayuint256Total amount the customer must pay, in the asset's smallest units

For native asset payments, pass totalPay as the transaction's value on EVM or callValue on TRON.

For USDT payments, the customer's token balance and processor allowance must be at least totalPay.

Always use the values returned by previewPayment(). Do not calculate processing fees manually.

transfer()​

Executes the payment and distributes the funds according to the contract's fee settings.

Parameters

ParameterTypeDescription
selleraddressMerchant's receiving wallet
amountuint256Requested payment amount in the asset's smallest units
buyerPaysCommissionboolDetermines who covers the processing fee
optionalCommissionWalletaddressPartner commission wallet, or the network's zero address if not applicable

Zero addresses

NetworkZero address
Ethereum / BNB Smart Chain0x0000000000000000000000000000000000000000
TRON (Base58)T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb

The transfer() function does not accept an orderId parameter. Your backend must associate each payment transaction hash (txid) with its corresponding order.

See Payment verification and order tracking for transaction matching and duplicate payment prevention.

Payment event​

The payment processors emit a PaymentProcessed event after distributing the payment to the merchant.

event PaymentProcessed(
address indexed buyer,
address indexed seller,
uint256 commission,
uint256 totalPay
);
ParameterTypeDescription
buyeraddressWallet that initiated the payment
selleraddressMerchant receiving wallet
commissionuint256Processing fee in the asset's smallest units
totalPayuint256Total amount paid by the buyer in the asset's smallest units

The amount received by the merchant is:

receivedAmount = totalPay - commission

This formula applies regardless of the buyerPaysCommission setting.

For native ETH, BNB and TRX payments, a successful finalized transaction with an authentic matching PaymentProcessed event confirms the merchant payment under the documented processor implementation.

For USDT payments, additionally verify the token's Transfer event from the payment processor to the merchant for the expected amount.

Always verify the event's emitting contract address against the approved processor address.

See Payment verification and order tracking for implementation examples.

Processing fees​

The buyerPaysCommission parameter determines how the processing fee is applied.

SettingCustomer paysMerchant receives
trueRequested amount + processing feeRequested amount
falseRequested amountRequested amount − processing fee

The actual processing fee and total payment amount are calculated by previewPayment() according to the deployed contract.

Blockchain network fees are separate from the processing fee:

  • Ethereum / BNB Smart Chain: Gas fees paid in ETH or BNB.
  • TRON: Energy and Bandwidth costs, potentially paid in TRX.

Settlement​

With non-custodial payments, the smart contract transfers funds directly to the merchant's receiving wallet.

Funds are not credited to a Volet.com account, and automatic fiat conversion is not part of this payment flow.

Contract errors​

The payment processor may return the following errors:

ErrorDescription
SellerZeroAddressThe merchant receiving address is zero
SellerIsBuyerThe buyer and merchant wallet addresses are identical
AmountIsZeroThe payment amount is zero
InvalidTotalAmountValidationThe native asset value or callValue does not match the expected total
CommissionExceedsAmountThe processing fee exceeds the amount available for deduction
SellerNotWhitelistedThe merchant wallet may not be authorised by the deployed contract
EnforcedPausePayment processing has been paused

Available errors and their exact behaviour depend on the deployed contract. Use its verified ABI to decode custom errors.

For causes and recommended actions, see Smart contract payments troubleshooting.