Методы пересылки токенов

Для примера возьмем блокчейн TRON. Пусть у нас есть новый “чистый” транзитный адрес В. На нем 0 TRX. На него поступили токены T. Нам нужно переслать токены Т на рабочий адрес А.
Есть два варианта пересылки:
- Транзакция с адреса B на контракт T с вызовом метода transfer() и указанием адреса получателя (A). Энергия спишется с адреса B.
- Транзакция с адреса C (который ранее получил approve() от адреса B) на контракт T с вызовом метода transferFrom() и указанием адреса отправителя (B) и получателя (A). Энергия спишется с адреса C.
Где и как взять эту энергию? Энергия может быть получена через трату основной монеты или через списание из накопленной ранее энергии (только для сети TRON).

1) Оплата за энергию основной монетой

Нужно сделать транзакцию пересылки с адреса В на контракт Т с указанием адреса А. При этом на адресе В должно быть достаточно TRX для оплаты энергии. Но на адресе В только токены Т. Поэтому перед этим на адрес В нужно с адреса С перевести достаточно TRX. Сколько нужно TRX? Столько, сколько бы хватило на уплату энергии транзакции пересылки. Сколько это точно, мы не знаем, поэтому пересылаем максимальную сумму (с запасом). После этого делаем транзакцию пересылки. Затем возвращаем остаток неиспользованных TRX на адрес С.
При следующем использованием этого адреса придется повторить все эти операции заново. При этом методе повторное использование адреса не имеет смысла.
Итоговый порядок операций:
перевод комиссии (TRX) С -> В
перевод токена В -> Т (на А) [1]
возврат неиспользованной комиссии (TRX) В -> C

2) Оплата накопленной энергией

Транзитных адресов В может быть очень много. И морозить для каждого энергию не рационально. Поэтому будем использовать функцию контракта transferFrom(), которая позволяет одному адресу переводить токены с другого адреса на третий. Но перед этим второй адрес должен разрешить первому эту операцию через функцию контракта approve(). В этом случае энергию тратит первый адрес, а токены списываются со второго.
Нужно сделать транзакцию с адреса C на контракт Т с указанием адреса В и А. При этом комиссия спишется с адреса C. Сначала надо создать транзакцию-разрешение с адреса В на контракт Т с указанием адреса C. Но на адресе В только токены Т. Поэтому перед этим на адрес В нужно с адреса С перевести достаточно TRX. Сколько нужно TRX? Столько, сколько бы хватило на уплату энергии транзакции разрешения. Сколько это точно, мы не знаем, поэтому пересылаем максимальную сумму (с запасом). Возвращаем остаток неиспользованных TRX на адрес С. Затем делаем транзакцию пересылки.
А уже при следующем поступления токена на этот адрес можем сразу после делать транзакцию пересылки.
Итоговый порядок операций (первый раз):
перевод комиссии (TRX) С -> В
разрешение на перевод токена В -> Т для C [2]
возврат неиспользованной комиссии (TRX) В -> C
перевод токена C -> Т (с В на А) [3]
Последующие разы:
перевод токена C -> Т (с В на А) [3]

Сравнение комиссий

[1] <= [3] << [2]

[операция] первый раз / последующие:
[1] 29.6 / 14.6 К энергии
[2] 22.7 / 7,7 К энергии
[3] 30 / 14.8 К энергии

Выводы

1й метод:
+ Можно использовать каждый раз новый адрес
- Высокая стоимость (нельзя использовать заморозку TRX)
- Низкая скорость - 3 транзакции

2й метод:
- Нужно использовать один адрес несколько раз!!
- Выгодно со 3й пересылки!!!
+ Высокая скорость - 1 транзакция
+ Низкая стоимость (если использовать заморозку TRX)


[TRON] Почему повысилась комиссия за пересылку USDT