Construye la Dapp NFT

Si es la primera vez que construyes un frontend dapp Archway, dir铆gete a la gu铆a Creando tu primera dapp para aprender a configurar el andamiaje b谩sico de tu proyecto. Una vez que est茅s sirviendo una p谩gina web que se conecta a Keplr, estar谩s listo para seguir los siguientes pasos.

Informaci贸n

Una cosa a tener en cuenta es que, por defecto, Keplr anula las tasas establecidas por el frontend. Para evitar que Keplr anule estas tarifas, establezca el valor de la opci贸n interactiva preferNoSetFee en true. Puede encontrar m谩s informaci贸n sobre estas opciones de anulaci贸n aqu铆.

Cargando la colecci贸n NFT

Como vimos en la gu铆a anterior, para consultar un contrato necesitamos conocer su direcci贸n en la cadena. Tambi茅n necesitamos una instancia de SigningArchwayClient.

// For more on setting up this handler see the "Creating Your First dapp" guide (linked to above):
const client = await SigningArchwayClient.connect('https://rpc.constantine.archway.tech');
// Replace this empty string with your deployed contract address
const contractAddress = '';

Usando las dos variables anteriores podemos escribir JavaScript para consultar la colecci贸n NFT para sus identificadores de token de la siguiente manera:

async function getNfts() {
  let entrypoint = {
    all_tokens: {},
  };
  let query = await queryHandler(contract, entrypoint);
  console.log('All NFTs of contract ' + contract + ':', query);
  return query;
}

La funci贸n getNfts devuelve un objeto tokens que contiene una matriz de todos los tokens acu帽ados por el contrato.

He aqu铆 un ejemplo de llamada:

let nfts;
async function doGetNfts() {
  nfts = await getNfts();
  console.log('All NFT ids', nfts);
}
doGetNfts();

Minting desde la dapp

Para acu帽ar desde nuestra dapp, necesitamos ensamblar los campos de metadatos para la NFT. Podemos conseguirlo creando una interfaz web con campos de formulario donde el creador de la NFT pueda a帽adir rasgos personalizados a su NFT.

Podemos simplificar nuestra tarea restante escribiendo una funci贸n que tome los metadatos NFT requeridos como par谩metros. Con esto en mente, este es el aspecto de una funci贸n de acu帽aci贸n en JavaScript:

async function mintNft(owner, tokenId, imageUrl, name, description, attributes = []) {
  // Ensure we collected the required arguments
  if (!owner || !tokenId || !imageUrl || !name || !description) {
    console.warn('Error parsing mint arguments', { owner, tokenId, imageUrl, name, description });
    return;
  }
  // Prepare Tx
  let entrypoint = {
    mint: {
      token_id: String(nfts.tokens.length),
      owner: owner,
      extension: {
        name: name,
        description: description,
        image: imageUrl,
      },
    },
  };
  // If the creator used any arbitrary custom attributes, add them to the entrypoint
  if (attributes.length) {
    entrypoint.mint.extension.attributes = attributes;
  }
  try {
    // Send Tx
    let tx = await CosmWasmClient.execute(owner, contract, entrypoint, 'auto');
    console.log('Mint Tx', tx);
    // Refresh the NFT collection to resolve the new token
    await getNfts();
  } catch (e) {
    console.warn('Error executing mint tx', e);
  }
}

He aqu铆 un ejemplo de c贸mo ser铆a llamar a nuestra funci贸n mintNft:

// Example call:
async function doMintNft() {
  let mintTx = await mintNft(
    (owner = 'archway1f395p0gg67mmfd5zcqvpnp9cxnu0hg6r9hfczq'),
    (tokenId = '2'),
    (imageUrl = 'ipfs://QmY8Ei2NQkMg8rCFiUkcXH2NPWPNKMoWLBYDwBeMNsP5sr'),
    (name = 'Archway NFT #2'),
    (description = 'Building With NFTs (and Dapps)'),
    (attributes = [{ trait_type: 'tutorial', value: 'https://docs.archway.io/developers/guides/nft-project/deploy' }])
  );
  console.log('Mint tx', mintTx);
}
doMintNft();

Transfiriendo NFTs

Ahora que podemos minar desde nuestra dapp, los par谩metros de formulario y punto de entrada para transferir NFTs son mucho m谩s sencillos. Al igual que las transferencias iniciadas desde la Developer CLI, , necesitamos la direcci贸n Archway del destinatario y el token_id que le estamos enviando. Tambi茅n necesitamos conocer la direcci贸n del propietario actual y una referencia a la direcci贸n del contrato que configuramos anteriormente.

Este es el aspecto de una funci贸n JavaScript para transferir un NFT de Archway:

async function transferNft(owner, recipient, tokenId) {
  if (!owner || !recipient || !tokenId) {
    console.warn('Error parsing transfer_nft arguments', { owner, recipient, tokenId });
    return;
  }
  // Prepare Tx
  let entrypoint = {
    transfer_nft: {
      recipient: recipient,
      token_id: tokenId,
    },
  };
  // Send Tx
  try {
    let tx = await SigningArchwayClient.connectWithSigner(network.endpoint, wallet);
    console.log('Transfer Tx', tx);
    // Refresh the NFT collection
    await getNfts();
  } catch (e) {
    console.warn('Error executing NFT transfer', e);
  }
}

Llamar a la funci贸n anterior podr铆a tener este aspecto:

// Example call:
async function doTransferNft() {
  let transferTx = await transferNft(
    (owner = 'archway1f395p0gg67mmfd5zcqvpnp9cxnu0hg6r9hfczq'),
    (recipient = 'archway1y00hm50lffnxt5m0kuy9afk83gyuye684zwcr5'),
    (tokenId = '2')
  );
  console.log('Transfer tx', transferTx);
}
doTransferNft();

Mostrando el NFT

La funci贸n getNfts que creamos devuelve todos los identificadores de token acu帽ados por el contrato, pero es necesario un paso m谩s antes de que podamos mostrar los NFT de nuestra colecci贸n en nuestra dapp. Para leer los metadatos de un NFT llamamos al punto de entrada nft_info que ejecutamos desde CLI en la lecci贸n anterior.

Este es el aspecto de la carga de metadatos de tokens mediante JavaScript:

async function getTokenMeta(tokenId) {
  if (typeof tokenId !== 'string') {
    console.warn('Invalid token ID. Token ID must be a string, but got ' + typeof tokenId);
    return;
  }
  let entrypoint = {
    nft_info: {
      token_id: tokenId,
    },
  };
  let query = await this.handlers.query(contract, entrypoint);
  console.log('NFT contract succesfully  queried for token ID ' + tokenId, query);
  return query;
}

Un ejemplo de llamada a la funci贸n getTokenMeta podr铆a ser el siguiente:

// Example call:
async function doGetTokenMeta() {
  let token2 = await getTokenMeta('2');
  console.log('Metadata for token_id: "2"', token2);
}
doGetTokenMeta();

Informaci贸n

Nota: Si su imagen NFT fue subida a IPFS, usando una url IPFS como ipfs://... su aplicaci贸n web necesitar谩 resolver la fuente de la imagen desde una pasarela IPFS (lea m谩s sobre pasarelas y proveedores IPFS).

Clonalo y int茅ntalo tu mismo!

Esta gu铆a se centra en las caracter铆sticas principales de las NFTs de Archway, algunos aspectos b谩sicos del desarrollo web no se han visto en detalle, pero encontrar谩s frontends de ejemplo que funcionan para este proyecto en el repositorio de ejemplos de dapp.

Last updated