TypeError: x.pubkey.toBase58 не является функцией

Я использую библиотеку @solana/spl-token для создания и чеканки токенов. Функция createMint() выдает ошибку.

TypeError: x.pubkey.toBase58 is not a function
    at /home/denimcodes/Projects/solpay/node_modules/.pnpm/@solana+web3.js@1.66.2/node_modules/@solana/web3.js/lib/index.cjs.js:1565:23
    at Array.sort (<anonymous>)
    at Transaction.compileMessage (/home/denimcodes/Projects/solpay/node_modules/.pnpm/@solana+web3.js@1.66.2/node_modules/@solana/web3.js/lib/index.cjs.js:1553:17)
    at Transaction._compile (/home/denimcodes/Projects/solpay/node_modules/.pnpm/@solana+web3.js@1.66.2/node_modules/@solana/web3.js/lib/index.cjs.js:1660:26)
    at Transaction.sign (/home/denimcodes/Projects/solpay/node_modules/.pnpm/@solana+web3.js@1.66.2/node_modules/@solana/web3.js/lib/index.cjs.js:1765:26)
    at Connection.sendTransaction (/home/denimcodes/Projects/solpay/node_modules/.pnpm/@solana+web3.js@1.66.2/node_modules/@solana/web3.js/lib/index.cjs.js:6734:21)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async sendAndConfirmTransaction (/home/denimcodes/Projects/solpay/node_modules/.pnpm/@solana+web3.js@1.66.2/node_modules/@solana/web3.js/lib/index.cjs.js:2219:21)
    at async mintTo (file:///home/denimcodes/Projects/solpay/node_modules/.pnpm/@solana+spl-token@0.3.6_@solana+web3.js@1.66.2/node_modules/@solana/spl-token/lib/esm/actions/mintTo.js:23:12)
    at async file:///home/denimcodes/Projects/solpay/main.mjs:40:1

Здесь я разместил полный код

import {
  getOrCreateAssociatedTokenAccount,
  mintTo,
  getAccount,
  getMint,
  createMint,
} from "@solana/spl-token";
import {
  Keypair,
  Connection,
  clusterApiUrl,
  LAMPORTS_PER_SOL,
} from "@solana/web3.js";

const payer = Keypair.generate();
const mintAuthority = payer;
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");

const airdropSignature = await connection.requestAirdrop(
  payer.publicKey,
  LAMPORTS_PER_SOL
);
await connection.confirmTransaction(airdropSignature);

const mint = await createMint(
  connection,
  payer,
  mintAuthority.publicKey,
  mintAuthority.publicKey,
  9
);

const tokenAccount = await getOrCreateAssociatedTokenAccount(
  connection,
  payer,
  mint,
  mintAuthority.publicKey
);

await mintTo(
  connection,
  payer,
  mint,
  tokenAccount,
  mintAuthority,
  100 * (10 ^ 9)
);

const mintInfo = await getMint(connection, mint);
console.info(`Mint supply: ${mintInfo.supply}`);

const tokenAccountInfo = await getAccount(connection, tokenAccount);
console.info(`Token account amount: ${tokenAccountInfo.amount}`);
[JS за 1 час] - 9. Асинхронный
[JS за 1 час] - 9. Асинхронный
JavaScript является однопоточным, то есть он может обрабатывать только одну задачу за раз. Для обработки длительных задач, таких как сетевые запросы,...
Подъем в javascript
Подъем в javascript
Hoisting - это поведение в JavaScript, при котором переменные и объявления функций автоматически "перемещаются" в верхнюю часть соответствующих...
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
В этом руководстве вы узнаете, как использовать API парсинга квитанций за 5 минут с помощью JavaScript. Eden AI предоставляет простой и удобный для...
Хук useOnClickOutside в ReactJS
Хук useOnClickOutside в ReactJS
Как разработчик ReactJS, вы, возможно, сталкивались с ситуацией, когда вам нужно закрыть модальное или выпадающее меню, когда кто-то щелкает за его...
Хуки (часть-2) - useEffect
Хуки (часть-2) - useEffect
Хук useEffect - один из самых мощных и универсальных инструментов в арсенале разработчика React. Он позволяет вам управлять побочными эффектами в...
Простое руководство по тестированию взаимодействия с пользователем с помощью библиотеки тестирования React
Простое руководство по тестированию взаимодействия с пользователем с помощью библиотеки тестирования React
В предыдущем посте я показал вам на примерах, как писать базовые тесты в React. Важнейшей частью пользовательского интерфейса приложений является...
0
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

X.pubkey.toBase58 не является функцией, которая обычно вызывается, когда один из PublicKeys, передаваемый в инструкцию (в качестве параметра, например, с mintTo), либо не является фактическим PublicKey, либо является искаженным PublicKey, как определено в @solana /web3.js.

В этом случае вы передаете ответ от getOrCreateAssociatedTokenAccount на вызов mintTo, как показано ниже:

const **tokenAccount** = await *getOrCreateAssociatedTokenAccount*(
  connection,
  payer,
  mint,
  mintAuthority.publicKey
);

await mintTo(
  connection,
  payer,
  mint,
  **tokenAccount**,
  mintAuthority,
  100 * (10 ^ 9)
);

Ваша проблема в том, что ответ от getOrCreateAssociatedTokenAccount возвращает не просто PublicKey, а скорее Учетную запись. Таким образом, учетная запись токена является недопустимым объектом PublicKey.

Чтобы это исправить, вам просто нужно разыменовать адрес учетной записи токена, например

const **tokenAccount** = await *getOrCreateAssociatedTokenAccount*(
  connection,
  payer,
  mint,
  mintAuthority.publicKey
);

await mintTo(
  connection,
  payer,
  mint,
  **tokenAccount.address**,
  mintAuthority,
  100 * (10 ^ 9)
);

Удачи в вашем путешествии по Солане :) Если вам нужна дополнительная задача, создайте одну транзакцию, содержащую все эти инструкции, чтобы она выполнялась атомарно (созданная учетная запись Mint, созданная учетная запись токена и отчеканенный токен — все в одном). Вы должны быть в состоянии найти эту информацию по предоставленным ссылкам.

Большое спасибо. Это решило мою проблему, а также заставило меня лучше понять эту тему. Я обязательно постараюсь выполнить задание.

Denim Basumatary 18.11.2022 08:49

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