Трансфер jetton между кошельками

Соберёшь и отправишь Jetton transfer (TEP-74): тело сообщения, адрес wallet отправителя и forward_ton.

Куда слать transfer

Перевод jetton — сообщение с opcode transfer#0f8a7ea5 на jetton-wallet отправителя. В теле указываешь адрес получателя-owner (обычный кошелёк): его jetton-wallet вычислит/деплоит контракт отправителя.


Отправляем 1 jUSDT

typescript
// @ton/ton ^15.1.0, @ton/core ^0.59.0
import { Address, beginCell, toNano, TonClient, JettonMaster } from "@ton/ton";

const OP_TRANSFER = 0xf8a7ea5; // transfer#0f8a7ea5

function buildTransfer(opts: {
  toOwner: Address;
  amount: bigint;
  responseTo: Address;
  forwardTon: bigint;
  queryId?: bigint;
}) {
  return beginCell()
    .storeUint(OP_TRANSFER, 32)
    .storeUint(opts.queryId ?? 0n, 64)
    .storeCoins(opts.amount)
    .storeAddress(opts.toOwner)
    .storeAddress(opts.responseTo) // куда вернуть excesses
    .storeBit(false) // no custom_payload
    .storeCoins(opts.forwardTon)
    .storeBit(false) // no forward_payload
    .endCell();
}

async function sendJettonTransfer() {
  const client = new TonClient({
    endpoint: "https://toncenter.com/api/v2/jsonRPC",
  });

  // jUSDT master — mainnet
  const master = client.open(
    JettonMaster.create(
      Address.parse("EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs"),
    ),
  );

  const senderOwner = Address.parse(
    "EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N",
  );
  // Для демо шлём себе; в проде — адрес owner получателя
  const recipientOwner = senderOwner;

  const senderJettonWallet = await master.getWalletAddress(senderOwner);

  // jUSDT decimals = 6 → 1.0 = 1_000_000n
  const body = buildTransfer({
    toOwner: recipientOwner,
    amount: 1_000_000n,
    responseTo: senderOwner,
    forwardTon: toNano("0.01"), // >0 → получатель получит transfer_notification
  });

  // Отправка через свой Sender / TonConnect: to = senderJettonWallet
  // value ≈ 0.05–0.1 GRAM на газ цепочки wallet→wallet
  return {
    to: senderJettonWallet,
    value: toNano("0.05"),
    body,
  };
}

Как это работает

  • Цель сообщения — jetton-wallet отправителя, найденный через getWalletAddress.
  • amount — в минимальных единицах (human * 10^decimals).
  • forward_ton_amount > 0 → wallet получателя шлёт transfer_notification#7362d09c на owner (нужно контрактам-депозитам).
  • response_destination получает excesses — остаток Gram после газа.
  • Цепочка: owner → sender wallet → receiver wallet → (optional) notification + excesses.

Частые ошибки

Шлёшь на master или на обычный кошелёк → токены не спишутся. Только jetton-wallet отправителя.

forward_ton = 0, а депозит ждёт notification → контракт получателя не узнает о переводе.

Мало Gram в value → не хватает на gas + forward; перевод падает. См. комиссии.


Что дальше

Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация