• 0 Голоса
    2 Сообщения
    179 Просмотры

    https://docs.ton.org/develop/dapps/ton-connect/message-builders

    Перевод с комментарием - base64

  • 0 Голоса
    2 Сообщения
    62 Просмотры

    Если эти тонны заблокированы в вашем контракте, у вас нет другого выбора, кроме как попросить получателя вывести баланс контракта. Итак, вам нужно выполнить новую операцию, чтобы вывести желаемое количество монет TON конкретному получателю.

    например:

    if (op == op::withdraw()) { throw_unless(73, equal_slices(sender_address, admin_address)); slice to_address = in_msg_body~load_msg_addr(); int amount = in_msg_body~load_coins(); ;; send raw message to "to_address" with specified withdraw "amount" ;; consider reserving some ton coins for storage and future fees return (); }
  • 0 Голоса
    1 Сообщения
    122 Просмотры

    Эй, я пытаюсь передать Jettons с помощью функции firebase. Однако я действительно страдаю от завершения функции. Я не уверен, чего мне не хватает, может быть, каких-то адресов? Я также не уверен, как мне прочитать эту ошибку.

    Вот несколько адресов (я использую openmask, а мнемоника - начальная фраза main_wallet) main_wallet_address: 0QBdd6N85lIBz193LTHESG8m9XVlH0owI6nn4hdXGy6S2u7N (с jettons) jetton_wallet: EQBh5qTitSdsZmHuHutn5_cqdwaPVHzYgSc3dRoRzAwR4dTr jetton_minter: EQAtwEufBNdM_YkCaz6fEA4AkddgcEouTrEwZJB4NNUyz3Te (символ: ТЕСТ)

    Прямо сейчас я получаю:

    {"severity":"INFO","message":"my address 0:5d77a37ce65201cf5f772d31c4486f26f575651f4a3023a9e7e217571b2e92da"} > SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON > at JSON.parse (<anonymous>) > at parseJSONFromBytes (node:internal/deps/undici/undici:5418:19) > at successSteps (node:internal/deps/undici/undici:5389:27) > at fullyReadBody (node:internal/deps/undici/undici:1500:9) > at process.processTicksAndRejections (node:internal/process/task_queues:95:5) > at async specConsumeBody (node:internal/deps/undici/undici:5398:7) > at async HttpProvider.call2 (C:\Users\style\Desktop\tonstars\functions\node_modules\tonweb\src\providers\index.js:149:24) > at async JettonMinter.getJettonData (C:\Users\style\Desktop\tonstars\functions\node_modules\tonweb\src\contract\token\ft\JettonMinter.js:87:24) > at async SendTokens (C:\Users\style\Desktop\tonstars\functions\lib\index.js:76:16) > at async C:\Users\style\Desktop\tonstars\functions\lib\index.js:53:15 > {"severity":"ERROR","message":"SyntaxError: Unexpected token '<', \"<!DOCTYPE \"... is not valid JSON\n at JSON.parse (<anonymous>)\n at parseJSONFromBytes (node:internal/deps/undici/undici:5418:19)\n at successSteps (node:internal/deps/undici/undici:5389:27)\n at fullyReadBody (node:internal/deps/undici/undici:1500:9)\n at process.processTicksAndRejections (nodt async HttpProvider.call2 (C:\\Users\\style\\Desktop\\tonsumeBody (node:internal/deps/undici/undici:5398:7)\n at async HttpProvider.call2 (C:\\Users\\style\\Desktop\\tonstars\\functions\\nstars\\functions\\node_modules\\tonweb\\src\\providers\\ at async JettonMinter.getJettonData (C:\\Users\\style\\Desktop\\tonstars\\functions\\node_modules\\tonweb\\src\\contract\\token\\ftindex.js:149:24)\n at async JettonMinter.getJettonDataers\\style\\Desktop\\tonstars\\functions\\lib\\index.js:76:16)\n at async C:\\Users\\style\\Desktop\\tonstars\\functions\\lib\\inde (C:\\Users\\style\\Desktop\\tonstars\\functions\\node_modules\\tonweb\\src\\contract\\token\\ft\\JettonMinter.js:rror: Unexpected token '<', \"<!DOCTYPE \"... is not valid JSON\n at JSON.parse (<anonymous>)\n at parseJSONFromBytes (node:inte87:24)\n at async SendTokens (C:\\Users\\style\\Desktode:internal/deps/undici/undici:5389:27)\n at fullyReadBody (node:internal/deps/undici/undici:1500:9)\n at process.processTicksAnp\\tonstars\\functions\\lib\\index.js:76:16)\n at asyn at async specConsumeBody (node:internal/deps/undici/undici:5398:7)\n at async HttpProvider.call2 (C:\\Users\\style\\Desktop\\tonstc C:\\Users\\style\\Desktop\\tonstars\\functions\\lib\\inex.js:149:24)\n at async JettonMinter.getJettonData (C:\\Users\\style\\Desktop\\tonstars\\functions\\node_modules\\tonweb\\src\\condex.js:53:15"}

    и вот код

    import TonWeb from "tonweb"; import { mnemonicToKeyPair, KeyPair } from "tonweb-mnemonic"; import { onCall } from "firebase-functions/v2/https"; import * as logger from "firebase-functions/logger"; import { defineString } from "firebase-functions/params"; import {mnemonicToWalletKey} from "@ton/crypto"; import admin from "firebase-admin"; import { WalletV3ContractR2 } from "tonweb/dist/types/contract/wallet/v3/wallet-v3-contract-r2"; const app = admin.initializeApp() const db = admin.firestore(app); const walletMnemonic = defineString("WALLET_MNEMONIC"); // main wallet mnemonic const walletPassword = defineString("WALLET_PASSWORD"); // main wallet password const apiKey = defineString("API_KEY"); // api key type WithdrawJettonsRequest = { boc: string; } type TransactionData = { amount: number; nanoAmount: number; jettonsAmount: number; jettonsNanoAmount: number; toAddress: string; status: "pending" | "success" | "failed"; timestamp: number; }; exports.withdrawJettons = onCall(async (request) => { const data = request.data as WithdrawJettonsRequest; const transactionRef = db.collection("transactions").doc(data.boc); const transactionSnapshot = await transactionRef.get(); if (!transactionSnapshot.exists) { throw new Error(`Transaction ${data.boc} not found`); } const transactionData = transactionSnapshot.data() as TransactionData; if (transactionData.status !== "pending") { throw new Error(`Transaction ${data.boc} is not pending`); } const tonweb = new TonWeb(new TonWeb.HttpProvider("https://testnet.toncenter.com/api/v2/jsonRPC", { apiKey: apiKey.value() })); const r = await SendTokens(transactionData, tonweb); await transactionRef.update({ status: "success", }) logger.info("Transaction updated") return r }); export const SendTokens = async (transactionData: TransactionData, tonweb: TonWeb) => { console.log(walletMnemonic.value()) const keyPair = await mnemonicToWalletKey(walletMnemonic.value().split(" ")); const WalletClass = tonweb.wallet.all.v3R2; const wallet = new WalletClass(tonweb.provider, { publicKey: keyPair.publicKey }); const address = await wallet.getAddress(); logger.info("my address", address.toString()); const jettonMinter = new TonWeb.token.jetton.JettonMinter(tonweb.provider, { adminAddress: address, jettonContentUri: "", jettonWalletCodeHex: "TEST", address: "0:2dc04b9f04d74cfd89026b3e9f100e0091d760704a2e4eb13064907834d532cf" }); let data; try { data = await jettonMinter.getJettonData(); } catch (e) { console.log(e) logger.error(e); throw e; } logger.info('Total supply:', data.totalSupply.toString()); logger.info('URI to off-chain metadata:', data.jettonContentUri); // logger.info('Owner address:', data.adminAddress(true, true, true)); const jettonWalletAddress = await jettonMinter.getJettonWalletAddress(address); logger.info("jetton wallet address", jettonWalletAddress.toString()) const jettonWallet = new TonWeb.token.jetton.JettonWallet(tonweb.provider, { address: jettonWalletAddress }); const jettonData = await jettonWallet.getData(); logger.info("minter address", jettonData.jettonMinterAddress.toString()); logger.info('Jetton wallet address:', address.toString(true, true, true)); const seqno = (await wallet.methods.seqno().call()) || 0; logger.info('Secno:', seqno); const comment = new Uint8Array([... new Uint8Array(4), ... new TextEncoder().encode('TS pre-sale')]); await wallet.methods.transfer({ secretKey: keyPair.secretKey, toAddress: jettonWalletAddress, // address of Jetton wallet of Jetton sender amount: TonWeb.utils.toNano('0.05'), // total amount of TONs attached to the transfer message seqno: seqno, payload: await jettonWallet.createTransferBody({ queryId: seqno, jettonAmount: transactionData.jettonsNanoAmount, // Jetton amount (in basic indivisible units) toAddress: new TonWeb.utils.Address(transactionData.toAddress), // recepient user's wallet address (not Jetton wallet) forwardAmount: TonWeb.utils.toNano('0.01'), // some amount of TONs to invoke Transfer notification message forwardPayload: comment, // text comment for Transfer notification message responseAddress: address // return the TONs after deducting commissions back to the sender's wallet address }), sendMode: 3, }).send() } ```

    Оригинал вопроса

  • Как добавить LP к токенам TON

    TON Overflow на русском
    0 Голоса
    1 Сообщения
    28 Просмотры

    Всем привет, я хотел бы знать, как добавить lp к токенам jetton, отчеканенным через ton minter.

    Я просто не хочу просто переводить деньги между кошельками, я хочу, чтобы токен был доступен для обмена и имел ценность. Как мне это сделать

    Оригинал вопроса

  • 0 Голоса
    1 Сообщения
    14 Просмотры

    Мы создаем Jetton для игры, в которую пользователи могут вносить депозиты и выводить средства со своего кошелька. Но мне было интересно, как мы можем справиться с комиссией за транзакции между кошельками, поскольку она составляет около 0,05 тонны, а при большом количестве транзакций это может стоить больше, чем мы зарабатываем

    Итак, каково решение этой проблемы? должны ли мы оплачивать сборы? если это пользователь, как я могу его оплатить (прямо сейчас у нас есть кошелек в базе данных для каждого пользователя, поэтому пока в системе нет транзакций, поскольку мы планируем создать кошелек для каждого пользователя)

    Оригинал вопроса

  • 0 Голоса
    1 Сообщения
    16 Просмотры

    Я отправил какой-то jetton на другой кошелек, но адрес назначения тела ответа не в [привычном формате вместо этого](https://blog.ton.cat/ton - address-formats/) как я могу преобразовать этот адрес во что-то, что я могу сравнить с моим собственным адресом кошелька jetton?

    "body": { "type": "jetton_transfer", "query_id": 0, "amount": 1000000000000, "destination": { "type": "addr_std", "workchain_id": 0, "address": "28c33c2eab67fa99b41ac2177d1993e4c8d7c717f09f51d2a15b3f2b62665b32" }, "response_destination": { "type": "addr_std", "workchain_id": 0, "address": "b406c5bbe23420825aebeff61bd372af180db17701b65b774979bcf1111be58a" } }

    Оригинал вопроса

  • 0 Голоса
    1 Сообщения
    44 Просмотры

    Всем привет.

    В моем приложении я разрешаю вносить и снимать немного Jetton. Я хотел бы реализовать вывод средств таким образом, чтобы пользователь компенсировал комиссию за транзакцию (что-то вроде 0,05 тонны за перевод Jetton). У меня есть несколько способов реализовать это с помощью tonSDK, например:

    попросите перевести 0,05 тонны на кошелек may, а затем отправьте Jettons * поскольку у Jetton фиксированный курс к ton - конвертируйте комиссию в Jetton и снимайте ее с вывода * добавьте некоторую сущность, например токен вывода - пользователь покупает некоторое количество токенов вывода, а затем может использовать их для вывода Jetton.

    Но я чувствую, что это можно было бы сделать проще, например, встроить функцию или, может быть, какой-нибудь хорошо известный смарт-контракт, но я совершенно новичок в этой теме.

    Не могли бы вы мне что-нибудь посоветовать?

    Оригинал вопроса

  • 0 Голоса
    1 Сообщения
    389 Просмотры

    Как нам следует написать код, если мы хотим перевести Jetton с кошелька, уже подключенного к tonconnect-ui? Я подключил кошелек и хочу отправить Jetton на адрес получателя другого человека / кошелька. Но я получаю необычную ошибку.

    Ошибка: Если я внесу, я получу ** Не удалось рассчитать комиссию ** на кошелек браузера

    const userFriendlyAddress = useTonAddress();

    const rawAddress = useTonAddress(ложь); const кошелек = useTonWallet(); const [tonConnectUI, setOptions] = useTonConnectUI();

    const jettonAddress = "EQDEPcKFlXaKddKJVUvq2Rfn2QgH7_MyFHxZek99FdMyq8XD"; const receiver_address = "UQA76t6NCey61qBTkqosAs65sSrX2jIk9BloVz3NU76yYMap";

    const jettonTransfer = async () => { let myTransaction; if (userFriendlyAddress) {

    const body = beginCell() .storeUint(0xf8a7ea5, 32) // jetton transfer op code .storeUint(0, 64) // query_id:uint64 .storeCoins(10000000) // amount:(VarUInteger 16) - Jetton amount for transfer (decimals = 6 - jUSDT, 9 - default) .storeAddress(Address.parse(userFriendlyAddress)) // destination:MsgAddress .storeAddress(Address.parse(receiver_address)) // response_destination:MsgAddress .storeUint(0, 1) // custom_payload:(Maybe ^Cell) .storeCoins(50000000) // forward_ton_amount:(VarUInteger 16) .storeUInt(0, 1) // forward_payload:(Either Cell ^Cell) .endCell(); myTransaction = { validUntil: Math.floor(Date.now() / 1000) + 360, messages: [ { address: Address.parse(jettonAddress), // sender jetton wallet amount: 100000000, // for commission fees, excess will be returned payload: body.toBoc().toString("base64"), // payload with jetton transfer body }, ], }; } try { tonConnectUI.sendTransaction(myTransaction); } catch (error) { alert(error); }

    };

    Оригинал вопроса

  • Жетоны с нулевой суммой в транзакции

    TON Overflow на русском
    0 Голоса
    3 Сообщения
    128 Просмотры

    Как нам следует написать код, если мы хотим перевести Jetton с кошелька, уже подключенного к tonconnect-ui?

  • [решено] Есть ли пример транзакции Jetton?

    TON Overflow на русском
    0 Голоса
    2 Сообщения
    31 Просмотры
  • 0 Голоса
    2 Сообщения
    21 Просмотры

    Когда кто-то создает новый Jetton, используя minter.ton.org , множитель (точность) должен быть указан в соответствующем поле ввода ("Десятичная точность вашего токена (по умолчанию 9)").

    Позже вы должны прочитать метаданные Jetton, чтобы узнать это значение.

  • Как заполучить всех джеттонов

    TON Overflow на русском
    0 Голоса
    2 Сообщения
    52 Просмотры

    Для передачи jetton рекомендуется включать "forward_ton_amount" в [сообщение о передаче].(https://github.com/ton - blockchain/TEPs/blob/master/text/0074-jettons-standard.md#1-transfer), в результате чего отправляется сообщение "transfer_notification" на "основной" адрес кошелька, чтобы вы могли отсканировать входящие сообщения с вашего кошелька, о котором идет речь, и найдите переводы jetton. Но такое поведение не является обязательным.

    Если у вас есть белый список всех Jetton (основных учетных записей), которые вы хотите поддерживать /отображать - вы можете вызвать [get_wallet_address](https://github.com/ton - blockchain/TEPs/blob/master/text/0074-jettons-standard.md#get-methods-1) примените метод ко всем из них и получите список нужно проверить бумажники Джеттона.

    В противном случае вам нужно проиндексировать весь блокчейн или воспользоваться сервисом индексации 3rdparty.

  • 1 Голоса
    2 Сообщения
    50 Просмотры

    Я полагаю, что на этот вопрос Владимир Плотвинов более или менее ответил в другом вопросе. Вы можете просмотреть его здесь:

    https://tonpie.io/topic/23274

    Для наглядности я перепечатаю его ответ:

    Вы получаете код выхода "-13". API вызвал lite-сервер и получил некоторый результат, вот почему вы получили 200 OK. -13 код выхода, я бы сказал, что это означает, что method_id не найден в smartcontract (но я не могу найти это замечание в документации).

  • Что такое нулевой адрес?

    TON Overflow на русском
    0 Голоса
    4 Сообщения
    395 Просмотры

    #uptheme

  • 0 Голоса
    2 Сообщения
    43 Просмотры

    Да, есть такие джеттоны, например, jUSDT (USDT, переведенный с Ethereum через bridge.ton.org ) имеет десятичную точность, установленную равной 6: https://tonscan.org/jetton/EQBynBO23ywHy_CgarY9NK9FTz0yDsG82PtcbSTQgGoXwiuA

    Но также легко создать такой джеттон самостоятельно, используя https://minter.ton.org. Нужно просто указать десятичную точность в соответствующем поле на веб-сайте. По умолчанию оно равно 9, и, похоже, большинство людей просто не меняют это число.

  • 0 Голоса
    2 Сообщения
    11 Просмотры

    Решено

    Да, любой желающий может развернуть жетон. Jettons - это просто смарт-контракты, похожие на ERC-20 в Ethereum. Сеть не была бы очень децентрализованной, если бы это было не так!

    Технически, "официального" развертывания ETH не существует, потому что любой желающий может создать свой собственный мост и свой собственный токен ETH. Итак, вам предстоит провести исследование, чтобы выяснить, какой смарт-контракт Jetton лучше всего использовать в качестве вашего ETH-представительства. Как бы то ни было, ton.org в настоящее время используется TON мост в качестве их канонического моста.

  • 0 Голоса
    1 Сообщения
    13 Просмотры

    Возможно ли отправить тонкоины и джеттоны в рамках одной транзакции? Если это так, то как именно это сделать?

    Этот вопрос был импортирован из чата Telegram: <***Скрыто***

    click to show

    Оригинал вопроса

  • 0 Голоса
    2 Сообщения
    14 Просмотры

    Решено

    Похоже, что контракты Jetton корректно функционируют на "TonWeb", поэтому проблема, скорее всего, связана с ошибкой в коде, развернутом человеком, задающим вопрос.

    Возможно, они допустили ошибку в процессе развертывания, или могла возникнуть проблема с их кодом. Чтобы устранить проблему, рекомендуется внимательно просмотреть их код и изучить официальные контракты Jetton на TonWeb, чтобы выявить любые различия.

    Благодаря тщательному процессу отладки они могут определить первопричину проблемы и внести необходимые изменения для ее устранения.

  • 0 Голоса
    2 Сообщения
    10 Просмотры

    Решено

    Не снимайте его!

    Контракт minter является родительским, а кошелек - дочерним. Существует один экземпляр minter и N экземпляров кошелька (N - количество владельцев вашего токена). Избавление от кошелька означало бы, что ваши пользователи не будут владеть вашими джеттонами и не смогут ничего делать с ними.

  • 0 Голоса
    2 Сообщения
    207 Просмотры

    Решено

    Следующее взято из тестового файла в tonweb. Вот все досье целиком. https://github.com/toncenter/tonweb/blob/master/src/test-jetton.js

    Этого должно быть достаточно для ваших нужд!

    const transfer = async () => { const seqno = (await wallet.methods.seqno().call()) || 0; console.log({seqno}) console.log( await wallet.methods.transfer({ secretKey: keyPair.secretKey, toAddress: JETTON_WALLET_ADDRESS, amount: TonWeb.utils.toNano('0.05'), seqno: seqno, payload: await jettonWallet.createTransferBody({ jettonAmount: TonWeb.utils.toNano('500'), toAddress: new TonWeb.utils.Address(WALLET2_ADDRESS), forwardAmount: TonWeb.utils.toNano('0.01'), forwardPayload: new TextEncoder().encode('gift'), responseAddress: walletAddress }), sendMode: 3, }).send() ); }