【前言】
既然沒有辦法用既有的資源找出 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
代表持有狀態。其中的 accountAddress
與 Asset
當然就是利用上面宣告過的資料啦!
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();
}, []);
測試成功!
試試看用我的以太坊帳號~~(大家可以 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!
再來試試看麻吉大哥另外擁有的一個 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 加密工具。
其實他除了擁有許多數學工具之外,在回傳的時候裡面會有三個東東出現。這邊就不多作介紹裡面的工具了,有興趣的朋友可以直接去他們的 Doc 看看!
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 就幾乎要結束啦!衷心祈禱不要出什麼大問題。
【參考資料】
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