Я использую библиотеку @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}`);
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, созданная учетная запись токена и отчеканенный токен — все в одном). Вы должны быть в состоянии найти эту информацию по предоставленным ссылкам.
Большое спасибо. Это решило мою проблему, а также заставило меня лучше понять эту тему. Я обязательно постараюсь выполнить задание.