Как передать токен с помощью spl-token 0.1.8

У меня есть этот код, который передает токен с помощью spl-token 0.2.x.

Как заставить тот же код работать в 0.1.8? Насколько я понимаю документы, между ними не было серьезных изменений, но в более старой версии используется класс Token, но я не уверен, как его вызывать для функций getOrCreateAssociatedTokenAccount и transfer.

async function transferToken(endpoint: string, fromWallet: Keypair, address_to: string, token_id: string)
{
    const connection = new Connection(endpoint);
    const toWalletPublicKey = new PublicKey(address_to);
    const mint_key = new PublicKey(token_id);

    // From
    const from = [connection, fromWallet, mint_key, fromWallet.publicKey];
    const fromTokenAccount = await getOrCreateAssociatedTokenAccount(...from);

    // To
    const to = [connection, fromWallet, mint_key, toWalletPublicKey];
    const toTokenAccount = await getOrCreateAssociatedTokenAccount(...to);

    // Transfer
    const transferParams = [connection, fromWallet, fromTokenAccount.address, toTokenAccount.address, fromWallet.publicKey, 1, []];
    return await transfer(...transferParams);  
}

Вот как я передаю fromWalletKeyPair, загруженный из шестнадцатеричной строки.

const fromWallet = Keypair.fromSecretKey(Uint8Array.from(Buffer.from(private_key, 'hex')));
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На самом деле в версии 2 есть изменения (отсюда и главный удар версии), в данном случае это удаление класса Token в пользу тех функций, которые вы видите в примере.

Документы довольно ... плохие, но если вы посмотрите проект Github год назад, то вы увидите, как функция была перенесена понемногу.

getOrCreateAssociatedTokenAccount и transfer требуют использовать токен класса следующим образом:


const token = new Token(connection, toWalletPublicKey, mint_key, fromWallet.publicKey) // Not sure about the last argument as it is the Signer

/**
   * Retrieve the associated account or create one if not found.
   *
   * This account may then be used as a `transfer()` or `approve()` destination
   *
   * @param owner User account that will own the new account
   * @return The new associated account
   */
const fromTokenAccount = token.getOrCreateAssociatedAccountInfo(fromWallet.publicKey)

const toTokenAccount = token.getOrCreateAssociatedAccountInfo(toWalletPublicKey)

/**
* Transfer parameters
* @param source Source account
* @param destination Destination account
* @param owner Owner of the source account
* @param multiSigners Signing accounts if `owner` is a multiSig
* @param amount Number of tokens to transfer
*/
token.transfer(fromTokenAccount, toTokenAccount, fromWallet, [], 1)

Также на это частично ответили в здесь

Хорошо! Я думаю, что я неправильно создаю подписывающую сторону. Как это сделать с закрытым ключом? Вот как я создаю KeyPair (fromWallet) из сохраненного закрытого ключа.

Berry Blue 19.09.2022 17:11

Keypair.fromSecretKey(Uint8Array.from(Buffer.from(private_ke‌​y, 'hex')))

Berry Blue 19.09.2022 17:11

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

SirPeople 20.09.2022 15:12
.../node_modules/@solana/web3.js/src/transaction.ts:611 const key = signer.publicKey.toString(); ^ TypeError: Cannot read properties of undefined (reading 'toString')
Berry Blue 21.09.2022 17:45

вы отлаживаете, что подписывающая сторона, которую вы передаете, содержит как закрытый, так и открытый ключ?

SirPeople 22.09.2022 11:12

Да, подписывающая сторона содержит как закрытый, так и открытый ключ, когда я выхожу из нее. Если я передаю fromWallet вместо fromWallet.publicKey, я получаю эту ошибку. `выбросить новую ошибку('Небазовый' + БАЗОВЫЙ + 'символ') ^ Ошибка: небазовый символ 58`

Berry Blue 22.09.2022 23:33

Я также добавил, как я создаю KeyPair из сохраненной шестнадцатеричной строки закрытого ключа. Мой пример кода 0.2.0 работает с этими значениями.

Berry Blue 22.09.2022 23:36

Кроме того, если я добавляю await к token.getOrCreateAssociatedAccountInfo(fromWallet.publicKey), это дает мне эту ошибку. Error: Failed to find account

Berry Blue 22.09.2022 23:38

Другие вопросы по теме