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.
| Network | Asset | Processor contract |
|---|---|---|
Ethereum Mainnet (1) | ETH | 0x2fceE245109Cf3c535489a6F52fe11b3BBd644FF |
Ethereum Mainnet (1) | USDT ERC-20 | 0xe4083ED0A1101615b9092E8cD2164e2f42B4571E |
BNB Smart Chain (56) | BNB | 0x2fceE245109Cf3c535489a6F52fe11b3BBd644FF |
BNB Smart Chain (56) | USDT BEP-20 | 0xe4083ED0A1101615b9092E8cD2164e2f42B4571E |
| TRON Mainnet | TRX | TSK9sgBTjvZa6x2yW1bXNWqvQ57WsVUQ3W |
| TRON Mainnet | USDT TRC-20 | TDuE6VueULx5oivQd4MsYr9DEhNMgXNfTm |
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
| Network | Asset | Token contract | Decimals |
|---|---|---|---|
| Ethereum | ETH (native) | N/A | 18 |
| Ethereum | USDT ERC-20 | 0xdAC17F958D2ee523a2206206994597C13D831ec7 | 6 |
| BNB Smart Chain | BNB (native) | N/A | 18 |
| BNB Smart Chain | USDT BEP-20 | 0x55d398326f99059fF775485246999027B3197955 | 18 |
| TRON | TRX (native) | N/A | 6 (SUN) |
| TRON | USDT TRC-20 | TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t | 6 |
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
| Parameter | Type | Description |
|---|---|---|
amount | uint256 | Requested payment amount in the asset's smallest units |
buyerPaysCommission | bool | Determines whether the processing fee is added to the customer's payment or deducted from the merchant's proceeds |
Return values
| Parameter | Type | Description |
|---|---|---|
commission | uint256 | Processing fee in the asset's smallest units |
totalPay | uint256 | Total 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
| Parameter | Type | Description |
|---|---|---|
seller | address | Merchant's receiving wallet |
amount | uint256 | Requested payment amount in the asset's smallest units |
buyerPaysCommission | bool | Determines who covers the processing fee |
optionalCommissionWallet | address | Partner commission wallet, or the network's zero address if not applicable |
Zero addresses
| Network | Zero address |
|---|---|
| Ethereum / BNB Smart Chain | 0x0000000000000000000000000000000000000000 |
| 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
);
| Parameter | Type | Description |
|---|---|---|
buyer | address | Wallet that initiated the payment |
seller | address | Merchant receiving wallet |
commission | uint256 | Processing fee in the asset's smallest units |
totalPay | uint256 | Total 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.
| Setting | Customer pays | Merchant receives |
|---|---|---|
true | Requested amount + processing fee | Requested amount |
false | Requested amount | Requested 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:
| Error | Description |
|---|---|
SellerZeroAddress | The merchant receiving address is zero |
SellerIsBuyer | The buyer and merchant wallet addresses are identical |
AmountIsZero | The payment amount is zero |
InvalidTotalAmountValidation | The native asset value or callValue does not match the expected total |
CommissionExceedsAmount | The processing fee exceeds the amount available for deduction |
SellerNotWhitelisted | The merchant wallet may not be authorised by the deployed contract |
EnforcedPause | Payment 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.
Related guides
- Smart contract integration — overview of non-custodial payment integration.
- Ethereum and BNB Smart Chain integration — accept ETH, BNB and USDT.
- TRON integration — accept TRX and USDT TRC-20.
- Payment verification and order tracking — verify transactions and match payments to orders.
- Troubleshooting — resolve common wallet and payment errors.