UNPKG

@broxus/tip4

Version:

Set of ready-to-use tvm nft token contracts following tip4 standard

166 lines (141 loc) 6.06 kB
import { FactorySource } from "../build/factorySource"; import { Address, Contract, WalletTypes, toNano, getRandomNonce } from "locklift"; import { Account } from "everscale-standalone-client/nodejs"; import { NftC } from "./wrappers/nft"; import { CollectionWithUpgradableNft } from "./wrappers/collection"; import { expect } from "chai"; import { readFileSync } from "fs"; const logger = require("mocha-logger"); export type AddressN = `0:${string}` export const isValidEverAddress = (address: string): address is AddressN => /^(?:-1|0):[0-9a-fA-F]{64}$/.test(address); export declare type CollectionType = Contract<FactorySource["Collection"]>; export type CallbackType = [Address, { value: string | number; } & { payload: string; }]; export async function sleep(ms = 1000) { return new Promise(resolve => setTimeout(resolve, ms)); } export const deployAccount = async function (key_number = 0, initial_balance = 10) { const signer = (await locklift.keystore.getSigner(key_number.toString()))!; const { account } = (await locklift.factory.accounts.addNewAccount({ type: WalletTypes.EverWallet, // or WalletTypes.HighLoadWallet, //Value which will send to the new account from a giver value: toNano(initial_balance), //owner publicKey publicKey: signer!.publicKey, nonce: getRandomNonce() })); await locklift.provider.sendMessage({ sender: account.address, recipient: account.address, amount: toNano(0.1), bounce: false }); const accountBalance = await locklift.provider.getBalance(account.address); expect(Number(accountBalance)).to.be.above(0, 'Bad user balance'); logger.log(`User address: ${account.address.toString()}`); return account; } export const deployCollectionWithUpgradableNftAndMintNft = async function (account: Account, remainOnNft: 1, pathJsonFile: "metadata-template.json", accForNft: Account[]) { const Nft = locklift.factory.getContractArtifacts("NftUpgradable"); const Index = locklift.factory.getContractArtifacts("Index"); const IndexBasis = locklift.factory.getContractArtifacts("IndexBasis"); const Platform = locklift.factory.getContractArtifacts("Platform"); const signer = await locklift.keystore.getSigner('0'); remainOnNft = remainOnNft || 0; accForNft = accForNft || ""; let array_json: any; const data = readFileSync(pathJsonFile, 'utf8'); if (data) array_json = JSON.parse(data); const { contract: collection } = await locklift.factory.deployContract({ contract: "CollectionWithUpgradableNft", publicKey: (signer?.publicKey) as string, constructorParams: { codeNft: Nft.code, codePlatform: Platform.code, codeIndex: Index.code, codeIndexBasis: IndexBasis.code, owner: account.address, remainOnNft: toNano(remainOnNft), json: JSON.stringify(array_json.collection) }, initParams: { nonce_: locklift.utils.getRandomNonce() }, value: toNano(4) }); logger.log(`Collection address: ${collection.address.toString()}`); let nftMinted : NftC[] = []; if (array_json.nfts) { let ch = 0; for (const element of array_json.nfts) { let item = { "type": "Basic NFT", "name": element.name, "description": element.description, "preview": { "source": element['preview_url'], "mimetype": "image/png" }, "files": [ { "source": element.url, "mimetype": "image/png" } ], "external_url": "https://" } let payload = JSON.stringify(item); await locklift.tracing.trace( collection.methods.mintNft ({ _owner: accForNft[0].address, _json: payload }).send({ from: account.address, amount: toNano(6), }) ); // console.log('tx:' + tx.id.hash); let totalMinted = await collection.methods.totalMinted({ answerId: 0 }).call(); let nftAddress = await collection.methods.nftAddress({ answerId: 0, id: (Number(totalMinted.count) - 1).toFixed() }).call(); let nftCN = await NftC.from_addr(nftAddress.nft, accForNft[ch]); nftMinted.push(nftCN); logger.log(`Nft address: ${nftAddress.nft.toString()} owner: ${accForNft[ch].address.toString()}`); ch++; } } return [new CollectionWithUpgradableNft(collection, account), nftMinted] as const; } export const deployNFT = async function (account: Account, collection: CollectionType, nft_name: string, nft_description: string, nft_url: string, externalUrl: string, ownerNFT = account) { let item = { "type": "Basic NFT", "name": nft_name, "description": nft_description, "preview": { "source": nft_url, "mimetype": "image/png" }, "files": [ { "source": nft_url, "mimetype": "image/png" } ], "external_url": externalUrl } let payload = JSON.stringify(item) const collectionNFT = locklift.factory.getDeployedContract("Collection", collection.address); await locklift.tracing.trace( collectionNFT.methods.mintNft({ _owner: ownerNFT.address, _json: payload }).send({ from: account.address, amount: toNano(2) })); let totalMinted = await collectionNFT.methods.totalMinted({ answerId: 0 }).call(); let nftAddress = await collectionNFT.methods.nftAddress({ answerId: 0, id: (Number(totalMinted.count) - 1).toFixed() }).call(); return NftC.from_addr(nftAddress.nft, ownerNFT); }