Создание TON NFT с помощью tonweb.js
Создание NFT в TON занимает довольно много времени, поэтому появилась идея создать скрипт на JS, который бы регистрировал их сам (использовал бы заранее переданное название, описание и ссылку на картинку). В интернете не нашел полноценного туториала, поэтому пытался что-то слепить с помощью ChatGPT. Вызов этого кода получает приватный и публичный ключ, адрес кошелька, нфт адрес, выводит в консоль. Но вот на моменте деплоя выводит ошибку:
Error deploying NFT: LITE_SERVER_UNKNOWN: cannot apply external message to current state : Failed to unpack account state
Если получится, подскажите, пожалуйста, как решить проблему, либо же ткните носом в адекватный туториал по этой задаче. Спасибо заранее!
Код:
<script src="https://unpkg.com/[email protected]/dist/tonweb.js"></script>
<script>
(async () => {
const TonWeb = window.TonWeb;
const nacl = TonWeb.utils.nacl;
// Тестовая seed фраза (только для примера, не используйте в реальных кошельках)
const seedPhrase = 'word word word word word word word word ...';
// Конвертация seed фразы в seed байты
function sha256(message) {
const msgBuffer = new TextEncoder().encode(message);
return crypto.subtle.digest('SHA-256', msgBuffer).then(hashBuffer => {
return new Uint8Array(hashBuffer);
});
}
// Генерация пары ключей из seed байтов
const seedBytes = await sha256(seedPhrase);
const keyPair = nacl.sign.keyPair.fromSeed(seedBytes.slice(0, 32));
const privateKey = keyPair.secretKey;
const publicKey = keyPair.publicKey;
console.log('Private Key:', Array.from(privateKey).map(b => b.toString(16).padStart(2, '0')).join(''));
console.log('Public Key:', Array.from(publicKey).map(b => b.toString(16).padStart(2, '0')).join(''));
// Инициализация TonWeb
const tonweb = new TonWeb(new TonWeb.HttpProvider("https://toncenter.com/api/v2/jsonRPC"));
// Создание экземпляра кошелька
const WalletClass = tonweb.wallet.all.v3R2;
const wallet = new WalletClass(tonweb.provider, {
publicKey,
wc: 0
});
// Адрес кошелька
const walletAddress = await wallet.getAddress();
console.log('Wallet Address:', walletAddress.toString(true, true, true));
// Создание данных NFT
const dataCell = new TonWeb.boc.Cell();
dataCell.bits.writeUint(1, 8); // Версия
dataCell.bits.writeString('Name'); // Имя NFT
dataCell.bits.writeString('Description'); // Описание NFT
dataCell.bits.writeString('https://digiseller.com/preview/571739/p1_3928716_0318d8b7.jpg'); // URL изображения
// Создание NFT
const NftItem = TonWeb.token.nft.NftItem;
const nftItem = new NftItem(tonweb.provider, {
ownerAddress: walletAddress,
data: dataCell
});
// Функция для развертывания NFT контракта
async function deployNft() {
try {
const nftAddress = await nftItem.getAddress();
console.log('NFT Address:', nftAddress.toString(true, true, true));
const seqno = await wallet.methods.seqno().call();
const transfer = await wallet.methods.transfer({
secretKey: privateKey,
toAddress: nftAddress.toString(true, true, true),
amount: TonWeb.utils.toNano("0.05"), // 0.05 TON для развертывания
seqno,
payload: null,
sendMode: 3,
}).send();
console.log('NFT Deployed:', transfer);
} catch (error) {
console.error('Error deploying NFT:', error);
}
}
// Вызов функции для развертывания NFT контракта
await deployNft();
})();
</script>