iT邦幫忙

2021 iThome 鐵人賽

DAY 22
1
Modern Web

All In One NFT Website Development系列 第 22

Day 22【Tokens' Owner】你好啊大哥哥,真沒想到你可以到二十三樓來呢!不過就到這裡為止了,接下來由我歐噴系的JS來做你的對手!

1630527477151.png

【前言】
既然沒有辦法用既有的資源找出 Ownership,那我就自己寫!但 Opensea.js 真的因為資源不多所以學習的過程非常困難阿!感覺就像打到了快要頂的怪塔,結果遇見鎖鏈的康尼的感覺一樣,是一個半路殺出來的違和魔王阿。

【紙上談兵】
這邊先延續之前 opensea.js 的部分,導入一些套件然後進行一些基本的連線!

import * as Web3 from 'web3'
import React, { useEffect, useState } from "react";
import { OpenSeaPort, Network } from 'opensea-js'
import styled from "styled-components";

const provider = new Web3.providers.HttpProvider('https://mainnet.infura.io')

const seaport = new OpenSeaPort(provider, {
  networkName: Network.Main
})

首先進行一些基本的宣告,a 被我定義成我現在想要找的 Asset 的物件,因為不想跟真實回傳的 Asset 搞混所以這邊改叫做 a。想當然 accountAddress 就是現在登入者的帳號啦!而 OwnerShip 也非常淺顯易懂就是確認這個 OwnerShip 是不是成立。

export function OwnerOf(props) {
  const [a, setA] = useState({
    tokenAddress: "", 
    tokenId: "",
    schemaName: 'ERC721'
  });
  const [accountAddress, setAccountAddress] = useState("")
  const [OwnerShip, setOwnerShip] = useState(false)
  ...
  return (
    ...
  );
}

這邊使用 useEffect() 隨時更新,利用 async 匿名同步函數來取得資料。其中 balance 會利用 seaport.getAssetBalance() 來回傳一個 BigNumber 代表持有狀態。其中的 accountAddressAsset 當然就是利用上面宣告過的資料啦!

export function OwnerOf(props) {
  ...
  useEffect(() => {
    const fetchData = async () => {
      const balance = await seaport.getAssetBalance({
        accountAddress: accountAddress,
        asset: {
          tokenAddress: a.tokenAddress,
          tokenId: a.tokenId,
          schemaName: a.schemaName
         },
      })
      console.log(balance);
    };
    fetchData();
  }, []);

  return (
    ...
  );
}

【提槍上陣】
因為我沒有持有任何 NFT,所以這邊先借一下麻吉大哥的帳號還有他的猴子 NFT測試一下!

Bored Ape Yacht Club - With MachiBigBrother Ethereum Address

useEffect(() => {
    const fetchData = async () => {
      const balance = await seaport.getAssetBalance({
        accountAddress: '0x020ca66c30bec2c4fe3861a94e4db4a498a35872',
				// https://opensea.io/MachiBigBrother
        asset: {
          tokenAddress: "0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D",
					// https://opensea.io/assets/0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d/6445
          tokenId: "6445",
          schemaName: 'ERC721',
         },
      })
      console.log(balance);
    };
    fetchData();
  }, []);

測試成功!

CHECKERTRUE.png

試試看用我的以太坊帳號~~(大家可以 Donate 給我歐)~~。

Bored Ape Yacht Club - With My Ethereum Address

useEffect(() => {
    const fetchData = async () => {
      const balance = await seaport.getAssetBalance({
        accountAddress: '0x7E4c2f441f615fF4a8E275319a2182F66b0963F7',
        asset: {
          tokenAddress: "0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D",
					// https://opensea.io/assets/0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d/6445
          tokenId: "6445",
          schemaName: 'ERC721',
         },
      })
      console.log(balance);
    };
    fetchData();
  }, []);

結論是 0!

CHECKER FLASE.png

再來試試看麻吉大哥另外擁有的一個 NFT 來確認也是成功!

Bored Ape Kennel Club - With MachiBigBrother Ethereum Address

useEffect(() => {
    const fetchData = async () => {
      const balance = await seaport.getAssetBalance({
        accountAddress: '0x020ca66c30bec2c4fe3861a94e4db4a498a35872',
				// https://opensea.io/MachiBigBrother
        asset: {
          tokenAddress: "0xba30E5F9Bb24caa003E9f2f0497Ad287FDF95623",
					// https://opensea.io/assets/0xba30e5f9bb24caa003e9f2f0497ad287fdf95623/6380
          tokenId: "6380",
          schemaName: 'ERC721',
         },
      })
      console.log(balance);
    };
    fetchData();
  }, []);

目前已知架設在 Polygon 上的 NFT 沒辦法使用這個服務,會有錯誤報說當前 smart contract 沒辦法找到 Owner,這也是 opensea.js 討論區裡面一個被熱烈討論的問題,希望之後開發者會有機會開發出這個功能!為這個世界上提供程式碼的天使們祈禱!

【Big Number.js】
這邊微微微微微微補充說明一下 Big Number 這個東西!顧名思義他就是一個大數用的數學工具,也是一個有用的 (512-bit, 1024-bit) RSA 加密工具。

bignumber

其實他除了擁有許多數學工具之外,在回傳的時候裡面會有三個東東出現。這邊就不多作介紹裡面的工具了,有興趣的朋友可以直接去他們的 Doc 看看!

  • c 表 coefficient,也就是係數。是一個以 1e14 範圍內呈現的數字陣列。
  • e 表 exponent,也就是指數。會是一個介在 -1000000000 和 1000000000 之間的整數
  • s 表 sign,也就是正負號。以 -1 或 1 表示。

c, e 以及 s 皆可以為 null,以下可以看看官方文件提供的例子!

x = new BigNumber(0.123)              // '0.123'
x.toExponential()                     // '1.23e-1'
x.c                                   // '1,2,3'
x.e                                   // -1
x.s                                   // 1

y = new Number(-123.4567000e+2)       // '-12345.67'
y.toExponential()                     // '-1.234567e+4'
z = new BigNumber('-123.4567000e+2')  // '-12345.67'
z.toExponential()                     // '-1.234567e+4'
z.c                                   // '1,2,3,4,5,6,7'
z.e                                   // 4
z.s                                   // -1

【小結】
這邊算是測試成功啦,自從那天下載 opensea.js 失敗之後,目前為止算是蠻順利的!真的是非常慶幸阿。明天就要把這個頁面跟其他頁面連接在一起,如果連接成功的話這個 Project 就幾乎要結束啦!衷心祈禱不要出什麼大問題。

bf548a7a66367451b9c336f10ff4ba30.jpg

【參考資料】
Developer Tutorials
GitHub - ProjectOpenSea/opensea-js: JavaScript SDK for the OpenSea marketplace. Let your users buy or sell cryptogoods on your own site!
opensea-js
ships-log/index.js at master · ProjectOpenSea/ships-log


上一篇
Day 21【Tokens' Owner】[問卦] 宋芸樺和夏宇喬到底是不同一個人?
下一篇
Day 23【Tokens' Owner】FUN SIDE PROJECT
系列文
All In One NFT Website Development32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
ShawnGood
iT邦新手 5 級 ‧ 2022-04-27 11:47:01

學到了n樓梗 /images/emoticon/emoticon37.gif

我要留言

立即登入留言