You can inspect the source code of TIP-4 token implementation by .
How to deploy your own NFT collection
You need to have an installed Smart Contract Development Environment. If you haven't already, follow .
Initialize your NFT project
npx locklift init --path my-first-nft
> [INFO] New Locklift project initialized in .
> [INFO] Installing required dependencies...
> [INFO]
> added 181 packages, and audited 182 packages in 13s
> 23 packages are looking for funding
> run `npm fund` for details
> found 0 vulnerabilities
> [INFO] LockLift initialized in my-first-nft happy hacking!
Install dependencies
TIP-4 is accessible from npm. Let's install it
npm i --save-dev @itgold/everscale-tip
Implement base contracts
Next, you should implement two interfaces in two contracts. Firstly, let's deal with Nft contract. The only thing we should do for basics is implement TIP4_1Nft
Let's move to deploy action. We need two scripts for this quick start: one for Collection deploying, and second for calling mintNft function, that we have implemented.
import { toNano, WalletTypes } from "locklift";
// you can get this parameter as (await locklift.keystore.getSigner("0"))! if you have a seed phrase sets up in key section of locklift config
// or you can pass this parameter by cli or get them by some file reading for example
// if phrase or secret was not set up in key section, calling (await locklift.keystore.getSigner("0"))! will give you a different results from launch to lauch
// we just hardcode it here
const COLLECTION_DEPLOY_PUBLIC_KEY = "e85f61aaef0ea43afc14e08e6bd46c3b996974c495a881baccc58760f6349300"
async function main() {
const signer = (await locklift.keystore.getSigner("0"))!;
const collectionArtifacts = await locklift.factory.getContractArtifacts("Collection");
const nftArtifacts = await locklift.factory.getContractArtifacts("NFT");
// calculation of deployed Collection contract address
const collectionAddress = await locklift.provider.getExpectedAddress(
collectionArtifacts.abi,
{
tvc: collectionArtifacts.tvc,
publicKey: COLLECTION_DEPLOY_PUBLIC_KEY,
initParams: {} // we don't have any initParams for collection
}
);
// initialize contract object by locklift
const collectionInsance = await locklift.factory.getDeployedContract(
"Collection",
collectionAddress
);
// creating new account for Collection calling (or you can get already deployed by locklift.factory.accounts.addExistingAccount)
const { account: someAccount } = await locklift.factory.accounts.addNewAccount({
type: WalletTypes.WalletV3,
value: toNano(10),
publicKey: signer.publicKey
});
// call mintNft function
// firstly get current nft id (totalSupply) for future NFT address calculating
const {count: id} = await collectionInsance.methods.totalSupply({ answerId: 0 }).call();
await collectionInsance.methods.mintNft({}).send({ from: someAccount.address, amount: toNano(1)});
const {nft: nftAddress} = await collectionInsance.methods.nftAddress({ answerId: 0, id: id }).call();
console.log(`NFT: ${nftAddress.toString()}`);
}
main()
.then(() => process.exit(0))
.catch(e => {
console.log(e);
process.exit(1);
});
Finally, we can deploy a new token to local network. For this, make sure local node is running, if not follow the next command
docker run -d --name local-node -e USER_AGREEMENT=yes -p80:80 tonlabs/local-node
and run our scripts
npx locklift run -s ./scripts/1-deploy-collection.ts -n local
> [INFO] factorySource generated
> [INFO] Built
> Collection deployed at: 0:882c1f7af09efaf506ab313daecb6ce127acfab7d082e28e6dbcff839aa58bba
npx locklift run -s ./scripts/2-call-mintNft.ts -n local
> [INFO] factorySource generated
> [INFO] Built
> NFT: 0:64a4ea8fa80bf3d2ba78c0a602e39a045786a70b69e879f90e9abe2a2f7f33fe
Now you know how to deploy your own NFT collection and mint NFT with TIP-4 standard!