Создаем на Flow | Изучаем FCL — 5 | Получите список NFT, хранящихся на определенном адресе

egormajj

EgorMajj

Posted on July 1, 2022

Создаем на Flow | Изучаем FCL — 5 | Получите список NFT, хранящихся на определенном адресе

Краткий обзор

В этом руководстве вы расширите свои знания о взаимодействии с смарт-контрактами с помощью скриптов Cadence. Вы узнаете, как:

  • извлекать список NFT, хранящихся на определенном адресе учетной записи (в этом примере мы будем использовать Flovatar!)
  • получать и возвращать их в виде набора пользовательских структур

Ранее в разделе "Изучение FCL"

В предыдущем посте мы узнали, как можно взаимодействовать с развернутыми контрактами и как вернуть из скрипта пользовательское значение Struct. Опираясь на эти знания, мы выполним более сложную процедуру - получим список NFT, хранящихся на аккаунте, отобразим его в нужный нам формат, а затем вернем обратно.

Приступим! 💪

Что такое Flovatar?

Flovatar - один из многих удивительных проектов NFT, построенных на Flow. Вместо того, чтобы покупать один из тысяч уникальных NFT, он предоставляет вам инструменты для создания собственной личности, соответствующей вашему стилю и предпочтениям! Вы сможете добавить свой личный стиль к окончательному персонажу Flovatar, которая будет соответствовать ВАШЕМУ стилю 😁.

Подготовка

Прежде всего, необходимо найти адрес, где в настоящее время развернут контракт. На GitHub Flovatar на первой странице указаны адреса развернутых контрактов:

  • Основная сеть — 0x921ea449dffec68a
  • Тестовая сеть — 0x0cf264811b95d465

А в файле get_flovatars.cdc контракт Flovatar имеет удобный метод getFlovatars, принимающий в качестве аргумента адрес:

import Flovatar from **0x921ea449dffec68a**
pub fun main(address:Address) : [Flovatar.FlovatarData] {
    return Flovatar.getFlovatars(address: address)
}
Enter fullscreen mode Exit fullscreen mode

Шаг 1 - Установка

Добавьте "@onflow/fcl": "1.0.0" в качестве зависимости

Шаг 2 - Настройка

Как и в прошлый раз импортируем необходимые методы и настраиваем FCL:

// Import methods from FCL
import { query, config } from "@onflow/fcl";

// Specify the API endpoint - Mainnet
const api = "https://rest-mainnet.onflow.org";

// Configure FCL to use testnet as the access node
config().put("accessNode.api", api);
Enter fullscreen mode Exit fullscreen mode

Шаг 3 - Реализация метода getFlovatars

/// Get a List of Flovatars for Address
const getFlovatars = async (adddress) => {
    // inline code from above
    const cadence = `
        import Flovatar from **0x921ea449dffec68a**

        pub fun main(address:Address) : [Flovatar.FlovatarData] {
            return Flovatar.getFlovatars(address: address)
        }
    `

    // We need to pass single argument of type Address
    const args = (arg, t) => [arg(address, t.Address)];

    const flovatars = await query({ cadence, args });
    console.log({ flovatars })
}

Enter fullscreen mode Exit fullscreen mode

Шаг 4 - Попробуйте

Давайте сделаем запрос с помощью нашего метода. Нашей целью будет Luca (создатель Flovatar) - его адрес 0x2a0eccae942667be

(async()=>{
    const user = "0x2a0eccae942667be"
    await getFlovatars(user)
})()
Enter fullscreen mode Exit fullscreen mode

Если вы посмотрите в console.log, то увидите набор объектов, представляющих Flovatars:

Image description
Не так уж и плохо, верно? Что ж... давайте попробуем развернуть это окно metadata:

Image description
Теперь это SVG для вас. Хотя вы можете извлекать эти данные каждый раз, когда пользователь обновляет страницу, в идеале вам нужно как-то кэшировать их и запрашивать только те данные, которые вам нужны.

Кроме того, если вы запросите учетную запись с сотнями/тысячами NFT, вы можете достигнуть предела возвращаемого значения, который составляет около ~10 Мбс.

Если вы зайдете на Flovatar Showroom и воспользуетесь инструментами разработчика в вашем браузере, вы можете узнать, что все изображения кэшируются по адресу https://flovatar.com/api/image/{id}. Давайте извлечем только NFT id и creatorAddress в окне metadata. Так мы сможем определить, является ли владелец подлинным создателем данного NFT.

Шаг 5 - Переписать скрипт Cadence

Как вы помните из прошлого поста, мы можем создать пользовательскую структуру, которая будет содержать все данные, которые мы хотим вернуть. Мы определим структуру Avatar с двумя полями: id и isCreator

/// Get a List of Flovatars for Address
const getFlovatarsImproved = async (adddress) => {
    // inline code from above
    const cadence = `
        import Flovatar from **0x921ea449dffec68a

        pub struct Avatar{
      pub let id: UInt64
      pub let isCreator: Bool

      // underscore in front of the argument allows us to pass unnamed arguments
            init(_ id: UInt64, _ isCreator: Bool){
        self.id = id
        self.isCreator = isCreator
      }
        }**

        pub fun main(address:Address) : [Avatar] {
            // Just like last time we will call "getFlovatars" method
            let flovatars = Flovatar.getFlovatars(address: address)

      // We will collect processed Flovatar data here
      let data: [Avatar] = []

      // Below is a simple loop over Flovatars collected by the contract code
      for flovatar in flovatars {
        let isCreator = flovatar.metadata.creatorAddress == address
        let avatar = Avatar(flovatar.id, isCreator)

                // append newly created instance of Avatar into resulting array
        data.append(avatar)
      }
      return data  
    }
    `

    // We need to pass single argument of type Address
    const args = (arg, t) => [arg(address, t.Address)];

    const flovatars = await query({ cadence, args });
    console.log({ flovatars })
}
Enter fullscreen mode Exit fullscreen mode

Заключение

Давайте обновим наш IIFE и попробуем снова:

(async ()=> {
    const user = "0x2a0eccae942667be"
    await getFlovatarsImproved(user)
})()
Enter fullscreen mode Exit fullscreen mode

Такое обращение приведет к гораздо меньшей нагрузке:

Image description
Содержащейся информации будет достаточно для создания ссылки (https://flovatar.com/flovatars/{id}) или изображения (https://flovatar.com/api/image/{id}) в вашем интерфейсе.

⭐ Дополнительное испытание

Используя знания из поста .find identity resolver, измените свой код, чтобы разрешить передачу .find identity в метод getFlovatars.

Информационные ресурсы

Другие источники, которые могут быть вам полезны:

  • (ENG) | Документация Flow - https://docs.onflow.org/ - более детальная информации о блокчейне Flow и как взаимодействовать с ним
  • (ENG) | Flow Portal - https://flow.com/ - your entry point to Flow
  • (ENG) | FCL JS - https://github.com/onflow/fcl-js - Исходный код и возможность поучаствовать в разработке библиотеки FCL JS library
  • (ENG) | Cadence - https://docs.onflow.org/cadence/ - Введение в язык программирования Cadence
  • Codesandbox - https://codesandbox.io - Замечательная среда разработки и прототипирования прямо в вашем браузере
💖 💪 🙅 🚩
egormajj
EgorMajj

Posted on July 1, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

What was your win this week?
weeklyretro What was your win this week?

November 29, 2024

Where GitOps Meets ClickOps
devops Where GitOps Meets ClickOps

November 29, 2024

How to Use KitOps with MLflow
beginners How to Use KitOps with MLflow

November 29, 2024

Modern C++ for LeetCode 🧑‍💻🚀
leetcode Modern C++ for LeetCode 🧑‍💻🚀

November 29, 2024