강아즤 귀여워,, 고양이랑 강아지가 세상을 구한다,,,
const addNewErc721Token = async() =>{
const tokenContract = await new web3.eth.Contract(erc721Abi, newErc721addr); // 컨트랙트의 ABI와 주소로 *컨트랙트 객체 생성*
console.log(tokenContract);
console.log(erc721Abi);
const name = await tokenContract.methods.name().call();
const symbol = await tokenContract.methods.symbol().call();
const totalSupply = await tokenContract.methods.totalSupply().call();
let arr = [];
for(let i = 1; i <= totalSupply; i++){
arr.push(i);
}
for(let tokenId of arr){
const tokenOwner = await tokenContract.methods.ownerOf(tokenId).call();
if(String(tokenOwner).toLowerCase() === account){
const tokenURI = await tokenContract.methods.tokenURI(tokenId).call();
setErc721list((prev)=>{
return [...prev, {name, symbol, tokenId, tokenURI}];
})
}
}
}
web3.js를 사용해서 컨트랙트 객체를 생성하고
컨트랙트 객체를 통해 컨트랙트 함수를 호출하여 계정이 가지고 있는 토큰의 목록 저장
new web3.eth.Contract()
으로 컨트랙트 객체 생성 후 tokenContract
에 담기
컨트랙트 객체 생성을 위해 ABI와 address 필요
const name = await tokenContract.methods.name().call();
const symbol = await tokenContract.methods.symbol().call();
const totalSupply = await tokenContract.methods.totalSupply().call();
Contract 객체를 통해 함수 실행 시, 뒤에 call()
을 붙여 주어야 함
for(let tokenId of arr){
const tokenOwner = await tokenContract.methods.ownerOf(tokenId).call();
if(String(tokenOwner).toLowerCase() === account){
const tokenURI = await tokenContract.methods.tokenURI(tokenId).call();
setErc721list((prev)=>{
return [...prev, {name, symbol, tokenId, tokenURI}];
})
}
}
tokenContract.methods.tokenURI(tokenId).call()
로 각 토큰의 오너 주소를 받아옴
tokenOwner
와 account(dApp으로 연결한 계정 주소)
가 일치하는지 확인
일치한다면 tokenContract.methods.tokenURI(tokenId).call()
로 토큰의 URI 값 가져옴
erc721list에 토큰 정보 저장
컨트랙트 함수 호출은 비동기적으로 실행되므로
반복문을 사용하기 위해서는for...of
사용
Component는 2가지
<TokenList>
: 자신이 가지고 있는 모든 토큰의 목록 출력
<Erc721>
: ERC721 토큰만 출력
import Erc721 from "./Erc721";
import React from 'react';
function TokenList({erc721list}){
return(
<div className="tokenlist">
<Erc721 erc721list={erc721list}/>
</div>
)
}
export default TokenList;
import React from 'react';
function Erc721({erc721list}){
return(
<div className="erc721list">
{erc721list.map((token)=>{
return (
<div className="erc721Token" key={token.tokenId}>
Name: <span className="name">{token.name}</span>
(<span className="symbol">{token.symbol}</span>)
<div className="nft">id: {token.tokenId}</div>
<img src={token.tokenURI} width={300}/>
</div>
);
})}
</div>
)
}
export default Erc721;
마무리로 App.js
에 <TokenList erc721list={erc721list}/>
추가
npm start
를 한 다음에 지갑 연결하고 컨트랙트 주소 입력
: 해당 컨트랙트를 통해서 발행된 토큰 중에서 연결된 지갑 주소로 민팅된 NFT 출력
참고로 erc721Abi
를 console에 찍으면 이렇게 함수가 보기 쉽게 나온당
🥰web3.js로 NFT 받기 끝!🥰