Перейти к основному содержимому

Справочник по смарт-контрактам

В справочнике собраны адреса контрактов, данные токенов и описания функций для некастодиальных платежей Volet.com в Ethereum, BNB Smart Chain и TRON.

Пошаговые инструкции — в руководствах Интеграция с Ethereum и BNB Smart Chain и Интеграция с TRON.

Адреса платёжных процессоров​

Для каждого поддерживаемого актива используется свой смарт-контракт — платёжный процессор.

СетьАктивКонтракт-процессор
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

Прежде чем принимать платежи, сверьте адреса развёрнутых контрактов и ABI с Volet.com. У контрактов для других сетей, активов или нестандартных платёжных сценариев могут быть другие адреса и интерфейсы.

Адреса и decimals токенов​

СетьАктивКонтракт токенаDecimals
EthereumETH (нативный)—18
EthereumUSDT ERC-200xdAC17F958D2ee523a2206206994597C13D831ec76
BNB Smart ChainBNB (нативный)—18
BNB Smart ChainUSDT BEP-200x55d398326f99059fF775485246999027B319795518
TRONTRX (нативный)—6 (SUN)
TRONUSDT TRC-20TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t6

Все суммы для смарт-контракта указываются в минимальных единицах актива.

  • ETH и BNB: переводите суммы в wei с помощью ethers.parseEther().
  • USDT в EVM-сетях: используйте ethers.parseUnits(amount, tokenDecimals) с точностью соответствующего токена.
  • TRX: используйте SUN, 1 TRX = 1 000 000 SUN.
  • USDT в TRON: используйте целые базовые единицы токена, 1 USDT = 1 000 000 единиц.

Не рассчитывайте суммы платежей в арифметике с плавающей точкой.

Интерфейс платёжного контракта​

У стандартного платёжного процессора две основные функции: previewPayment() и 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;
}

Этот интерфейс описывает платёжные функции, которые используются в руководствах по интеграции. Для декодирования событий и обработки ошибок конкретного контракта используйте полный верифицированный ABI развёрнутого контракта.

previewPayment()​

Рассчитывает комиссию за обработку и полную сумму, которую должен заплатить клиент.

Параметры

ПараметрТипОписание
amountuint256Запрошенная сумма платежа в минимальных единицах актива
buyerPaysCommissionboolОпределяет, добавляется ли комиссия за обработку к платежу клиента или вычитается из выручки мерчанта

Возвращаемые значения

ПараметрТипОписание
commissionuint256Комиссия за обработку в минимальных единицах актива
totalPayuint256Полная сумма к оплате клиентом в минимальных единицах актива

Для платежей в нативном активе передайте totalPay как value транзакции в EVM или как callValue в TRON.

Для платежей в USDT баланс токенов клиента и разрешение (allowance) для процессора должны быть не меньше totalPay.

Всегда используйте значения, которые возвращает previewPayment(). Не рассчитывайте комиссию за обработку вручную.

transfer()​

Выполняет платёж и распределяет средства по настройкам комиссии контракта.

Параметры

ПараметрТипОписание
selleraddressКошелёк мерчанта для приёма средств
amountuint256Запрошенная сумма платежа в минимальных единицах актива
buyerPaysCommissionboolОпределяет, кто платит комиссию за обработку
optionalCommissionWalletaddressКошелёк партнёра для получения комиссии или нулевой адрес сети, если партнёра нет

Нулевые адреса

СетьНулевой адрес
Ethereum / BNB Smart Chain0x0000000000000000000000000000000000000000
TRON (Base58)T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb

Функция transfer() не принимает параметр orderId. Ваш бэкенд должен сам связывать хеш каждой платёжной транзакции (txid) с соответствующим заказом.

О сопоставлении транзакций и защите от повторных платежей — в статье Проверка платежей и отслеживание заказов.

Событие платежа​

После распределения платежа на кошелёк мерчанта платёжные процессоры генерируют событие PaymentProcessed.

event PaymentProcessed(
address indexed buyer,
address indexed seller,
uint256 commission,
uint256 totalPay
);
ПараметрТипОписание
buyeraddressКошелёк, с которого инициирован платёж
selleraddressКошелёк мерчанта для приёма средств
commissionuint256Комиссия за обработку в минимальных единицах актива
totalPayuint256Полная сумма, уплаченная покупателем, в минимальных единицах актива

Сумма, которую получает мерчант:

receivedAmount = totalPay - commission

Формула верна при любом значении buyerPaysCommission.

Для платежей в нативных ETH, BNB и TRX успешная финализированная транзакция с подлинным совпадающим событием PaymentProcessed подтверждает платёж мерчанту в рамках задокументированной реализации процессора.

Для платежей в USDT дополнительно проверьте событие Transfer токена с переводом от платёжного процессора мерчанту на ожидаемую сумму.

Всегда сверяйте адрес контракта, сгенерировавшего событие, с утверждённым адресом процессора.

Примеры реализации — в статье Проверка платежей и отслеживание заказов.

Комиссия за обработку​

Параметр buyerPaysCommission определяет, как применяется комиссия за обработку.

ЗначениеКлиент платитМерчант получает
trueЗапрошенная сумма + комиссия за обработкуЗапрошенная сумма
falseЗапрошенная суммаЗапрошенная сумма − комиссия за обработку

Фактическую комиссию за обработку и полную сумму платежа рассчитывает previewPayment() по правилам развёрнутого контракта.

Комиссии блокчейн-сети оплачиваются отдельно от комиссии за обработку:

  • Ethereum / BNB Smart Chain: газ, оплачивается в ETH или BNB.
  • TRON: расход Energy и Bandwidth, который может оплачиваться в TRX.

Расчёты​

При некастодиальных платежах смарт-контракт переводит средства напрямую на кошелёк мерчанта для приёма средств.

Средства не зачисляются на аккаунт Volet.com, и автоматическая конвертация в фиат в этот платёжный сценарий не входит.

Ошибки контракта​

Платёжный процессор может вернуть следующие ошибки:

ОшибкаОписание
SellerZeroAddressАдрес мерчанта для приёма средств — нулевой
SellerIsBuyerАдреса кошельков покупателя и мерчанта совпадают
AmountIsZeroСумма платежа равна нулю
InvalidTotalAmountValidationvalue или callValue нативного актива не совпадает с ожидаемой суммой
CommissionExceedsAmountКомиссия за обработку больше суммы, из которой её можно вычесть
SellerNotWhitelistedРазвёрнутый контракт, возможно, не разрешает приём на этот кошелёк мерчанта
EnforcedPauseОбработка платежей приостановлена

Набор ошибок и их точное поведение зависят от развёрнутого контракта. Для декодирования пользовательских ошибок используйте его верифицированный ABI.

Причины и рекомендуемые действия — в статье Устранение неполадок с платежами через смарт-контракты.