Jetons Non Fongibles (NFTs)

Comment créer un NFT

Pour créer un NFT, vous devez :

  1. Télécharger l'image sur IPFS comme Arweave
  2. Télécharger les métadonnées json sur IPFS comme Arweave
  3. Appeler metaplex pour créer un compte pour le NFT

Télécharger sur Arweave

Press </> button to view full source
// 1. Upload image to Arweave
const data = fs.readFileSync("./code/nfts/arweave-upload/lowres-dog.png");

const transaction = await arweave.createTransaction({
  data: data,
});

transaction.addTag("Content-Type", "image/png");

const wallet = JSON.parse(fs.readFileSync("wallet.json", "utf-8"))
await arweave.transactions.sign(transaction, wallet);

const response = await arweave.transactions.post(transaction);
console.log(response);

const id = transaction.id;
const imageUrl = id ? `https://arweave.net/${id}` : undefined;

// 2. Upload metadata to Arweave

const metadataRequest = JSON.stringify(metadata);

const metadataTransaction = await arweave.createTransaction({
  data: metadataRequest,
});

metadataTransaction.addTag("Content-Type", "application/json");

await arweave.transactions.sign(metadataTransaction, wallet);

await arweave.transactions.post(metadataTransaction);
#  1. Load your arweave wallet
your_ar_wallet = Wallet('wallet.json')

#  2. Upload image to Arweave
with open('./code/nfts/arweave-upload/lowres-dog.png', 'rb') as f:
    img_in_bytes = f.read()

transaction = Transaction(your_ar_wallet, data=img_in_bytes)
transaction.add_tag('Content-Type', 'image/png')
transaction.sign()
transaction.send()

image_url = API_URL+"/"+transaction.id

#  3. Upload metadata to Arweave
meta_transaction = Transaction(your_ar_wallet, data=json.dumps(metadata))
meta_transaction.add_tag('Content-Type', 'text/html')
meta_transaction.sign()
meta_transaction.send()

metadata_url = API_URL+"/"+meta_transaction.id

Créer le NFT

Si vous avez déjà téléchargé l'image et les métadonnées, vous pouvez créer le NFT avec le code suivant.

Press </> button to view full source
const mintNFTResponse = await metaplex.nfts().create({
  uri: "https://ffaaqinzhkt4ukhbohixfliubnvpjgyedi3f2iccrq4efh3s.arweave.net/KUAIIbk6p8oo4XHRcq0U__C2r0mwQaNl0gQow4Qp9yk",
  maxSupply: 1,
});

Remarque

Vous ne pouvez pas créer un NFT avec un créateur différent de celui de votre portefeuille. Si vous rencontrez des problèmes de créateur, assurez-vous que vos métadonnées vous mentionnent en tant que créateur.

Comment obtenir les métadonnées des NFTs

Les métadonnées des NFTs de Metaplex sont stockées sur Arweave. Afin d'obtenir les métadonnées d'Arweave, vous devez récupérer le PDA de Metaplex et décoder les données du compte.

Press </> button to view full source
const connection = new Connection(clusterApiUrl("mainnet-beta"));
const keypair = Keypair.generate();

const metaplex = new Metaplex(connection);
metaplex.use(keypairIdentity(keypair));

const mint = new PublicKey("Ay1U9DWphDgc7hq58Yj1yHabt91zTzvV2YJbAWkPNbaK");

const nft = await metaplex.nfts().findByMint(mint);

console.log(nft.metadata);

Comment obtenir le propriétaire d'un NFT

Si vous avez la clé de création (mint key) d'un NFT, vous pouvez trouver son propriétaire actuel en regardant le plus grand compte de jetons pour ce mint.

Rappelez-vous que les NFTs ont une offre de 1, et qu'ils sont indivisibles, ce qui signifie qu'un seul compte de jetons détiendra ce jeton à un moment donné, tandis que tous les autres comptes de jetons pour cette clé de création auront un solde de 0.

Une fois que le plus grand compte de jeton est identifié, nous pouvons retrouver son propriétaire.

Press </> button to view full source
const connection = new Connection("https://api.mainnet-beta.solana.com");
const tokenMint = "9ARngHhVaCtH5JFieRdSS5Y8cdZk2TMF4tfGSWFB9iSK";
const largestAccounts = await connection.getTokenLargestAccounts(
  new PublicKey(tokenMint)
);
const largestAccountInfo = await connection.getParsedAccountInfo(
  largestAccounts.value[0].address
);
console.log(largestAccountInfo.value.data.parsed.info.owner);

Comment obtenir les adresses de création des NFTs

Si vous connaissez la clé publique de la Candy Machine, vous pouvez obtenir la liste de toutes les adresses de création des NFTs générées par cette Candy Machine en utilisant le code suivant. Notez que nous pouvons utiliser le filtre memcmp suivant car, dans la v1, le premier créateur est toujours l'adresse de la Candy Machine.

Candy Machine V1

Press </> button to view full source
const getMintAddresses = async (firstCreatorAddress: PublicKey) => {
  const metadataAccounts = await connection.getProgramAccounts(
    TOKEN_METADATA_PROGRAM,
    {
      // The mint address is located at byte 33 and lasts for 32 bytes.
      dataSlice: { offset: 33, length: 32 },

      filters: [
        // Only get Metadata accounts.
        { dataSize: MAX_METADATA_LEN },

        // Filter using the first creator.
        {
          memcmp: {
            offset: CREATOR_ARRAY_START,
            bytes: firstCreatorAddress.toBase58(),
          },
        },
      ],
    }
  );

  return metadataAccounts.map((metadataAccountInfo) =>
    bs58.encode(metadataAccountInfo.account.data)
  );
};

getMintAddresses(candyMachineId);

Candy Machine V2

Si vous utilisez une Candy Machine v2, vous devrez d'abord accéder à son adresse "Candy Machine Creator" qui est un simple PDA utilisant candy_machine et l'adresse de la Candy Machine v2 comme seeds. Une fois que vous avez l'adresse du créateur, vous pouvez l'utiliser de la même manière que pour la v1.

Press </> button to view full source
const getCandyMachineCreator = async (
  candyMachine: PublicKey
): Promise<[PublicKey, number]> =>
  PublicKey.findProgramAddress(
    [Buffer.from("candy_machine"), candyMachine.toBuffer()],
    CANDY_MACHINE_V2_PROGRAM
  );

const candyMachineCreator = await getCandyMachineCreator(candyMachineId);
getMintAddresses(candyMachineCreator[0]);

Comment récupérer tous les NFTs d'un portefeuille ?

Pour obtenir tous les NFTs d'un portefeuille, vous devrez obtenir tous les comptes de jetons et ensuite analyser lesquels sont des NFTs. Tout cela peut être fait en utilisant findDataByOwneropen in new window de la bibliothèque js Metaplex.

Press </> button to view full source
const connection = new Connection(clusterApiUrl("mainnet-beta"), "confirmed");
const keypair = Keypair.generate();

const metaplex = new Metaplex(connection);
metaplex.use(keypairIdentity(keypair));

const owner = new PublicKey("2R4bHmSBHkHAskerTHE6GE1Fxbn31kaD5gHqpsPySVd7");
const allNFTs = await metaplex.nfts().findAllByOwner(owner);

console.log(allNFTs);
Last Updated: 10/5/2022, 2:09:02 PM