Aprenda a usar o padrão de token NEP-171 atualizado no NEAR
Introdução
Tokens não fungíveis são registros exclusivos de propriedade no blockchain. Normalmente, um NFT está vinculado a algo interessante e raro, como uma obra de arte, um ingresso para um show, um gato colecionável, um nome de domínio ou um objeto físico real. Os NFTs podem ser comprados, vendidos, doados e podem até ser cunhados ou destruídos, dependendo das regras do contrato. Cryptokitties, Super rare e Bored Ape Yacht Club são apenas alguns exemplos populares de projetos NFT baseados em Ethereum. Podemos implementar NFTs com a mesma facilidade na NEAR.
Neste tutorial, criaremos uma arte NFT colecionável simples chamada Flarn, que consiste em um nome, uma descrição e uma imagem JPEG. Nosso contrato inteligente permitirá que os Flarns sejam criados, coletados e negociados na blockchain NEAR.
Pré-requisitos
Requisitos
- Instalar Node.js e npm
- Use o npm para instalar o NEAR CLI
- Crie uma carteira no NEAR Testnet
- Instalar Rust e Rustup
OBSERVAÇÃO PARA USUÁRIOS DE MAC M1: O repositório de exemplos NFT usado por este tutorial atualmente não pode ser compilado em produtos Apple com um chip M1. Se você não tiver acesso a um Mac baseado em Intel, poderá fazer este tutorial no GitPod. Abra este link em uma guia separada, então pule para a próxima seção: Conhecendo o contrato NFT.
Sobre os padrões NFT
Existem muitos padrões para NFTs! No entanto, o mais amplamente utilizado é de longe o ERC721 da Ethereum padrão, que define como os NFTs podem ser criados e transferidos entre outras coisas. Esse padrão funciona bem, mas como todos os padrões ERC, ele é definido apenas para a blockchain Ethereum. Os recentes altos preços de gás na Ethereum geraram muito interesse em alternativas mais acessíveis, como o NEAR.
Para apoiar o desenvolvimento NFT na NEAR, os principais desenvolvedores e partes interessadas do mercado propuseram o novo padrão NEP-171. O NEP-171 tenta lidar com todos os mesmos casos de uso de NFT que o ERC721, bem como suporte opcional para vários recursos avançados para mercados de NFT. Por exemplo, os NFTs NEP-171 podem ser oferecidos para venda em vários mercados ao mesmo tempo, e distribuições complexas de royalties estão integradas. Além disso, NFTs podem ser anexados diretamente a contratos inteligentes, como uma forma de pagamento ou como uma parte de projetos de trocas mais complexos.
Configurando o projeto
Instale o alvo WebAssembly usando rustup:
NEAR usa WebAssembly como sua máquina virtual. Muitas linguagens podem compilar para WebAssembly, mas os desenvolvedores NEAR core recomendam que todos os contratos inteligentes financeiros sejam escritos na linguagem Rust. Antes de começarmos a trabalhar no contrato Rust, precisamos instalar as ferramentas de compilação cruzada que compilam um contrato inteligente Rust no WebAssembly, usando Rustup. Execute este comando:
rustup target add wasm32-unknown-unknown
Saída de exemplo:
**info:** downloading component 'rust-std' for 'wasm32-unknown-unknown'
**info:** installing component 'rust-std' for 'wasm32-unknown-unknown'
15.6 MiB / 15.6 MiB (100 %) 8.7 MiB/s in 1s ETA: 0s
Clone o repositório NEAR NFT
Neste tutorial, modificaremos o código de exemplo NFT-171 da NEAR do repositório NEAR no Github. No Linux, Unix ou macOS, execute esses comandos no bash
(ou zsh
) shell para clonar esse repositório e instalar seus requisitos:
git clone https://github.com/near-examples/NFT
Saída de exemplo:
Cloning into 'NFT'...
remote: Enumerating objects: 1334, done.
remote: Counting objects: 100% (456/456), done.
remote: Compressing objects: 100% (90/90), done.
remote: Total 1334 (delta 397), reused 398 (delta 363), pack-reused 878
Receiving objects: 100% (1334/1334), 1.41 MiB | 2.40 MiB/s, done.
Resolving deltas: 100% (642/642), done.
Para construir o exemplo, insira este comando no shell:
CD NFT
./build.sh
Como esta é nossa primeira compilação, Cargo e Rust farão o download e criarão todas as dependências. Isto pode levar algum tempo. Quando terminar, você deve ver algo assim no final da saída:
Compiling near-sdk v3.1.0
Compiling near-contract-standards v3.2.0
Compiling approval-receiver v0.0.1 (/Users/mykle/Documents/near/flarns2.0/NFT/test-approval-receiver)
Compiling token-receiver v0.0.1 (/Users/mykle/Documents/near/flarns2.0/NFT/test-token-receiver)
Compiling non-fungible-token v1.1.0 (/Users/mykle/Documents/near/flarns2.0/NFT/nft)
Finished release [optimized] target(s) in 2m 07s
Também podemos executar todos os testes de unidade incluídos com este comando:
cargo test -- --nocapture
A saída do teste de unidade é confusa, mas no final você verá um resumo dos resultados.
test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Se você ver test result: ok
, tudo está bem.
NOTA: No momento em que este livro foi escrito, esses testes falharam em Macs baseados em M1, com um erro sobre get_fault_info
. Recomendamos que os usuários do M1 usem o Gitpod para concluir este tutorial.
Conhecendo o Contrato NFT
O contrato inteligente Rust que modificaremos está em nft/src/lib.rs
. Abra esse arquivo em seu editor. Faremos algumas alterações simples.
Se você navegar neste contrato, verá que ele implementa apenas três métodos: novo
e new_default_meta
para inicializar um novo contrato, e nft_as
para cunhar um novo NFT. Mas o contrato também importa símbolos, métodos e outros recursos de um grupo de pacotes relacionados que juntos fornecem todos os recursos principais e opcionais do padrão NEP-171. Observe também que um amplo conjunto de testes de unidade compõe mais da metade do arquivo de contrato. Também há muitos testes nos módulos importados. Faremos todos os testes depois de modificar o contrato, para ter certeza de que não quebramos nada.
Personalize o contrato
A NEP-171 exige que nosso contrato tenha um nome legível por humanos e um símbolo abreviado para uso em mercados e carteiras. Estes são definidos no new_default_meta
função que começa na linha 52.
Vamos modificar essa função para usar nosso próprio nome e símbolo. Mude o nome para "CryptoFlarns" e o símbolo para "FLARN". (Altere também o campo "base_uri" conforme mostrado; explicaremos o motivo em breve.) Quando terminar, o método deve ficar assim:
///Inicializa os contrato de propriedade de 'owner_id' com
/// metadados padrão (apenas para fins de exemplo)
#[init]
pub fn new_default_meta(owner_id: ValidAccountId) -> Self {
Self::new(
owner_id,
NFTContractMetadata {
spec: NFT_METADATA_SPEC.to_string(),
name: "CryptoFlarns".to_string(),
symbol: "FLARN".to_string(),
icon: Some(DATA_IMAGE_SVG_NEAR_ICON.to_string()),
base_uri: Some("https://nft.storage/".to_string()),
reference: None,
reference_hash: None,
},
)
}
Os contratos NEP-171 também podem ter um ícone opcional, que é mostrado na carteira NEAR e usado por marketplaces e outros aplicativos NFT. Seu contrato não precisa ter um ícone, mas como este exemplo de contrato define um, vamos alterá-lo para algo mais colorido.
A NEP-171 informa que o campo ícone
deve ser codificado em formato de data URI , para compatibilidade máxima com navegadores da web. O ícone no contrato de exemplo é um arquivo SVG simples, URI de dados codificado de acordo com este guia de Jenny Knuth. Outros formatos de arquivo de imagem, como GIF e PNG, também podem ser codificados por URI de dados, mas os SVGs são bons porque podem ser bem pequenos.
Aqui está o nosso ícone de exemplo muito simples:
O ícone é definido na linha 39 do contrato de exemplo, como uma longa string de texto. Em seu editor, altere essa linha muito longa para esta linha ainda mais longa:
const DATA_IMAGE_SVG_NEAR_ICON: &str = "data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%2764%27%20height%3D%2764%27%20xml%3Aspace%3D%27preserve%27%3E%3Crect%20width%3D%27100%25%27%20height%3D%27100%25%27%20fill%3D%27transparent%27%2F%3E%3Crect%20style%3D%27stroke%3Anone%3Bstroke-width%3A1%3Bstroke-dasharray%3Anone%3Bstroke-linecap%3Abutt%3Bstroke-dashoffset%3A0%3Bstroke-linejoin%3Amiter%3Bstroke-miterlimit%3A4%3Bfill%3A%23ffec20%3Bfill-rule%3Anonzero%3Bopacity%3A1%27%20vector-effect%3D%27non-scaling-stroke%27%20x%3D%27-32%27%20y%3D%27-32%27%20rx%3D%270%27%20ry%3D%270%27%20width%3D%2764%27%20height%3D%2764%27%20transform%3D%27translate%2832%2032%29%27%2F%3E%3Ccircle%20style%3D%27stroke%3A%23000%3Bstroke-width%3A0%3Bstroke-dasharray%3Anone%3Bstroke-linecap%3Abutt%3Bstroke-dashoffset%3A0%3Bstroke-linejoin%3Amiter%3Bstroke-miterlimit%3A4%3Bfill%3A%2370ff10%3Bfill-rule%3Anonzero%3Bopacity%3A1%27%20vector-effect%3D%27non-scaling-stroke%27%20r%3D%2735%27%20transform%3D%27matrix%28.37%200%200%20.37%2032%2032%29%27%2F%3E%3C%2Fsvg%3E";
Agora construa e teste o contrato novamente, para confirmar que não há erros de digitação:
./build.sh
cargo test -- --nocapture
Procurar Finalizado
após a construção e test result: ok
após os testes.
Projetando nosso primeiro NFT
Para este exemplo, vamos criar um novo tipo de arte NFT digital colecionável chamada Flarn. Cada NEP-171 Flarn terá um Token ID exclusivo, um Owner ID para registrar a propriedade e três partes de metadados: um nome, uma descrição e uma imagem JPEG.
Definir Metadados NFT
Na verdade, o NEP-171 não exige que os NFTs tenham nenhum metadado; você ainda pode cunhar e negociar registros de propriedade completamente em branco, se é isso que você gosta. Mas sem metadados, os NFTs seriam muito chatos! Aqui estão os tipos de metadados NFT suportados pelo padrão:
-
título
: O nome desse token específico. -
descrição
: Uma descrição mais longa do token. -
media
: URL para mídia associada. -
media_hash
: o hash sha256 codificado em base64 do conteúdo referenciado pelo campomedia
. Isso é para proteger contra adulteração fora da cadeia. -
cópias
: quantas cópias deste token específico existem -
emitido_em
: Carimbo de data e hora em que o token foi emitido ou cunhado -
expira_em
: carimbo de data/hora quando o token expira -
começa em
: Carimbo de data/hora quando o token começa a ser válido -
atualizado_em
: carimbo de data/hora quando o token foi atualizado pela última vez -
extra
: qualquer coisa extra que o NFT deseja armazenar na cadeia. Pode ser JSON em string. -
referência
: URL para um arquivo JSON off-chain com mais informações. -
referência_hash
: hash sha256 codificado em Base64 de JSON do campo de referência. Necessário sereferência
está incluído.
Para o nosso exemplo, usaremos título
, descrição
e media
, e vamos ignorar o resto. Uma vez que nós usamos media,
somos obrigados a usar também media_hash
. podemos sair cópias
em branco para dizer que nossos flarns são únicos; O número de cópias
será 1
por default, se não for especificado.
Os campos de metadados integrados do NEP-171 destinam-se a cobrir as principais necessidades da maioria dos projetos NFT. Se algum projeto NFT futuro exigir outros campos de metadados que não estejam nesta lista, o NEP-171 oferece duas opções. Você pode codificá-lo como uma string JSON no campo extra
, ou colocá-lo fora da cadeia e armazenar um link para ele na referência
campo. (Mas se você usar referência
, você também precisa armazenar um hash dos dados no campo referência_hash
, para evitar adulterações.)
Crie sua obra-prima
Você pode inventar seus próprios metadados neste ponto ou pode usar estes dados de exemplo:
-
título
: Alice -
descrição
: Alice é excepcionalmente adorável e adora longas caminhadas na praia. -
media
: \
Incluir dados fora da cadeia
Devido ao alto custo de armazenamento da Ethereum, a maioria dos Ethereum NFTs de mídia digital não armazena a mídia na blockchain. O armazenamento on-chain é muito mais barato na NEAR, mas como os arquivos de mídia são grandes, ainda será econômico armazenar nossa imagem Flarn em outro lugar. O campo media
de nosso registro on-chain conterá uma URL apontando para nossa imagem off-chain. Poderíamos hospedar essa imagem em qualquer lugar da Web que escolhermos, mas seria bom colocá-la em algum lugar sempre online, descentralizado e gratuito.
Carregue a imagem para o armazenamento NFT
Para este exemplo, usaremos o NFT.Storage, serviço livre construído especificamente para armazenar dados NFT fora da cadeia. O NFT.Storage oferece armazenamento descentralizado gratuito e largura de banda para NFTs em IPFS e Filecoin.
Passos:
- Registre uma conta e faça login em nft.storage.
- Vou à seção Files e clique no botão Upload para carregar sua imagem Flarn.
- Depois de fazer o upload do arquivo, selecione
Action -> View URL
para ver seu upload em uma nova guia do navegador. Em seguida, copie a URL dessa guia. Essa é a URL do seu conteúdo, com base em uma string IPFS Content-ID. Deve ser algo como isto:
https://ipfs.io/ipfs/bafkreic2y4z2hvfkzalogw3yeh5hntbvr4op4a5ccjo5zfhouss4mozlnm
- NEP-171 requer o campo
base_uri
do contrato para apontar para um site que terá acesso confiável aos URLs nos camposmedia
ereferência
. É por isso que definimosbase_uri
parahttps://nft.storage/
quando customizamos o contrato. Como nossa mídia é armazenada com NFT.Storage, podemos usar sua URL para este campo.
Gere o media_hash
A totalidade dos nossos arquivos de mídia armazenados no media_hash
campo, deve ser um hash SHA256 codificado em Base64 dos dados originais, para provar que o arquivo não foi adulterado. NEP-171 requer codificação Base64 do hash para portabilidade máxima entre plataformas. No entanto, a maioria das ferramentas SHA256 on-line e de linha de comando geram hashes como Hexadecimal+Unicode, portanto, também precisaremos converter isso para Base64.
Existem algumas maneiras diferentes de fazer isso. Em um sistema baseado em UNIX, use este comando:
gato flarn.jpg | shasum -a 256 | xxd -r -p | base64
Na web, você pode gerar o hash de mídia em duas etapas.
1: Envie seu arquivo para esta calculadora online SHA256 para gerar um hash SHA256 em formato hexadecimal.
2: Copie a string hexadecimal dessa ferramenta e cole-a neste conversor online Hex-Base64:
NOTA: não faça upload de dados confidenciais ou privados para esses serviços da web! Use os comandos UNIX acima se a privacidade for importante.
Se você usou nosso exemplo de imagem Flarn, as strings devem corresponder às capturas de tela. Se você estiver usando sua própria imagem, as strings serão diferentes.
Monte as peças
Agora que escolhemos nossos metadados, armazenamos nossa mídia fora da cadeia e geramos o URL de mídia e o hash de mídia, podemos construir nosso registro NFT Token. Use seu editor para criar um arquivo no diretório atual chamado token.json
, contendo um único objeto de metadados JSON. Você pode começar colando neste texto:
{
"title": "Alice",
"description": "Alice is uniquely adorable & loves long walks on the beach.",
"media": "https://bafyreiabag3ztnhe5pg7js4bj6sxuvkz3sdf76cjvcuqjoidvnfjz7vwrq.ipfs.dweb.link/",
"media_hash": "e8MzVN0Pq1ztofypQoperJC8gWo2xfs8f9few+SwHes="
}
Agora edite os seguintes valores:
- Use a URL obtida em NFT.storage como o valor de "media".
- Use o hash base64 sha256 que você gerou para "media_hash", se estiver usando um arquivo de imagem diferente do nosso exemplo.
- Use seu próprio NEAR testnet id para "receiver_id", para que você seja o proprietário do NFT recém-criado.
- Mudar
título
edescrição
para o que você quiser, ou deixe-os como estão.
Salve o arquivo e verifique-o em JSONLint.
Implantando e usando o contrato
Podemos usar o NEAR CLI para implantar esse contrato e testar se está funcionando. Se você configurou seu ambiente nos Tutoriais 1 e 2, a CLI se conectará à rede de teste de alta disponibilidade do DataHub. Se você não tiver acesso ao DataHub, ainda poderá executar a CLI com seus padrões, mas o nó testnet padrão pode ser mais lento para responder.
Conecte-se
Faça login na sua conta testnet com quase-cli
executando o seguinte comando em seu terminal.
near login
Isso abrirá sua carteira testnet NEAR em um navegador da Web, para que você possa autorizar o NEAR CLI com sua conta testnet. Feito isso, você deve ver algo como esta saída no terminal:
Logged in as [ **accountname.testnet** ] with public key [ **ed25519:BDGh7Q...** ] successfully
Para tornar este tutorial mais fácil de copiar/colar, vamos definir uma variável de ambiente com o ID da sua conta testnet. Execute o comando abaixo, substituindo accountname.testnet
com o campo Account ID gerado pornear de login
export ID=accountname.testnet
Teste se a variável de ambiente está definida corretamente executando:
echo $ID
Verifique se o ID da conta correto está impresso no terminal. Se tudo estiver correto, agora você pode implantar seu contrato.
Implante o contrato
Execute este comando para implantar o contrato em sua conta testnet:
near deploy --wasmFile res/non_fungible_token.wasm --accountId $ID
Se você já implantou um contrato nesta conta, será perguntado se deseja substituí-lo. Responder e
aqui:
This account already has a deployed contract [G6TEwD4VXXYaUjgMmTw7y41R4x2DyDjcbXdX4xkESnXX]. Do you want to proceed? (y/n)
Saída de exemplo:
Starting deployment. Account id: accountname.testnet, node: https://rpc.testnet.near.org, helper: https://helper.testnet.near.org, file: res/non_fungible_token.wasm
Transaction Id F9p9s7DKNkekZYeBcSiYt2ZMzwpuVsugDDVGcDizxBNN
To see the transaction in the transaction explorer, please open this url in your browser
https://explorer.testnet.near.org/transactions/F9p9s7DKNkekZYeBcSiYt2ZMzwpuVsugDDVGcDizxBNN
Done deploying to accountname.testnet
O link fornecido dará detalhes completos sobre a implantação no NEAR Explorer.
Inicialize o contrato
Um contrato inteligente pode definir um método de inicialização que pode ser usado para definir o estado inicial do contrato. Este contrato de exemplo NFT deve ser inicializado antes do uso. Execute este comando para inicializá-lo com os metadados padrão e defina o proprietário para sua conta de desenvolvedor:
near call $ID new_default_meta '{"owner_id": "'$ID'"}' --accountId $ID
Você pode visualizar os metadados do contrato executando a chamada view
:
near view $ID nft_metadata
Exemplo de resposta:
View call: accountname.testnet.nft_metadata()
{
spec: 'nft-1.0.0',
name: 'CryptoFlarns',
symbol: 'FLARN',
icon: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 288 288'%3E%3Cg id='l' data-name='l'%3E%3Cpath d='M187.58,79.81l-30.1,44.69a3.2,3.2,0,0,0,4.75,4.2L191.86,103a1.2,1.2,0,0,1,2,.91v80.46a1.2,1.2,0,0,1-2.12.77L102.18,77.93A15.35,15.35,0,0,0,90.47,72.5H87.34A15.34,15.34,0,0,0,72,87.84V201.16A15.34,15.34,0,0,0,87.34,216.5h0a15.35,15.35,0,0,0,13.08-7.31l30.1-44.69a3.2,3.2,0,0,0-4.75-4.2L96.14,186a1.2,1.2,0,0,1-2-.91V104.61a1.2,1.2,0,0,1,2.12-.77l89.55,107.23a15.35,15.35,0,0,0,11.71,5.43h3.13A15.34,15.34,0,0,0,216,201.16V87.84A15.34,15.34,0,0,0,200.66,72.5h0A15.35,15.35,0,0,0,187.58,79.81Z'/%3E%3C/g%3E%3C/svg%3E",
base_uri: null,
reference: null,
reference_hash: null
}
Cunhe um NFT!
Agora vamos cunhar nosso primeiro token! Execute o seguinte comando para criar uma cópia do seu NFT, usando os metadados em token.json
:
near call $ID nft_mint '{"token_id": "0", "receiver_id": "'$ID'", "token_metadata": '"`cat token.json`}" --accountId $ID --deposit 0.1
Exemplo de resposta:
Scheduling a call: accountname.testnet.nft_mint({"token_id": "2", "receiver_id": "accountname.testnet", "token_metadata": {
"title": "Alice",
"description": "Alice is uniquely adorable & loves long walks on the beach.",
"media": "https://bafyreiabag3ztnhe5pg7js4bj6sxuvkz3sdf76cjvcuqjoidvnfjz7vwrq.ipfs.dweb.link/",
"media_hash": "e8MzVN0Pq1ztofypQoperJC8gWo2xfs8f9few+SwHes="
}}) with attached 0.1 NEAR
Doing account.functionCall()
Transaction Id HQtMD9M4WnjJ4bJ8xz2A82pBMDNgMthkaegbNb4GsP7f
To see the transaction in the transaction explorer, please open this url in your browser
https://explorer.testnet.near.org/transactions/HQtMD9M4WnjJ4bJ8xz2A82pBMDNgMthkaegbNb4GsP7f
{
token_id: '2',
owner_id: 'accountname.testnet',
metadata: {
title: 'Alice',
description: 'Alice is uniquely adorable & loves long walks on the beach.',
media: 'https://bafyreiabag3ztnhe5pg7js4bj6sxuvkz3sdf76cjvcuqjoidvnfjz7vwrq.ipfs.dweb.link/',
media_hash: 'e8MzVN0Pq1ztofypQoperJC8gWo2xfs8f9few+SwHes=',
copies: null,
issued_at: null,
expires_at: null,
starts_at: null,
updated_at: null,
extra: null,
reference: null,
reference_hash: null
},
approved_account_ids: {}
}
O contrato cunhou nosso NFT. O valor de retorno da chamada do contrato é o próprio registro NFT. São praticamente os mesmos dados que enviamos, mostrados como armazenados na blockchain.
- Notar que
receiver_id
tornou-seowner_id
. - Todos os campos de metadados opcionais que não especificamos são definidos como
null
. - O campo
approved_account_id
listaria quaisquer outros usuários NEAR autorizados a manipular este NFT, mas nós não autorizamos ninguém, então essa lista está vazia.
Para ver todos os flarns que você possui, você pode chamar o contrato NFT com o seguinte comando near-cli
:
near view $ID nft_tokens_for_owner '{"account_id": "'$ID'"}'
Como este é o seu único Flarn até agora, o resultado será um array JSON contendo apenas o NFT que você já viu:
[
{
token_id: '0',
owner_id: 'accountname.testnet',
metadata: {
title: 'Alice',
description: 'Alice is uniquely adorable & loves long walks on the beach.',
media: 'https://bafyreiabag3ztnhe5pg7js4bj6sxuvkz3sdf76cjvcuqjoidvnfjz7vwrq.ipfs.dweb.link/',
media_hash: 'e8MzVN0Pq1ztofypQoperJC8gWo2xfs8f9few+SwHes=',
copies: null,
issued_at: null,
expires_at: null,
starts_at: null,
updated_at: null,
extra: null,
reference: null,
reference_hash: null
},
approved_account_ids: {}
}
]
Além disso, a carteira NEAR verificará automaticamente toda a rede em busca de NFTs que você possui, para que você possa ver seu novo Flarn em sua carteira, na guia Colecionáveis: Flarn NFT na carteira
Conclusão
Agora você implantou um contrato inteligente NFT-171 na rede de teste NEAR e cunhou um CryptoFlarn NFT. A partir daqui, você pode usar a CLI ou o NEAR Javascript SDK para transferir a propriedade desse token ou para criar mais tokens. Se seu próximo projeto NFT precisar de metadados mais complexos, você viu como isso pode ser adicionado.
Quando estiver pronto para divulgar seu novo contrato NFT, você pode facilmente indicar NEAR CLI na rede principal e implementar as mesmas etapas.
O código completo para este tutorial pode ser encontrado em GithubGenericName.
Próximos passos
A partir daqui você pode implementar uma interface web para mostrar seus NFTs, usando near-api-js para buscar os metadados das NFTs do seu contrato. Em seguida, você pode explorar outros subpadrões opcionais do NEP-171, como o Gerenciamento de Aprovação padrão (NEP-178) que permite autorizar marketplaces a negociar sua NFT em seu nome, ou o Royalties e Pagamentos padrão (NEP-199) que permite especificar como o produto de uma venda NFT deve ser distribuído.
Sobre o autor
Este tutorial foi criado por Mykle Hansen, colaborador do projeto Plantar que permite aos usuários cultivar e colher NFTs de plantas no NEAR.
Este artigo foi traduzido por Diogo Jorge. O artigo original pode ser encontrado aqui.
Oldest comments (0)