판매 등록이 완료된 NFT를 구매하기 위해서는 현재 NFT의 소유자에게 토큰을 보내주고 NFT를 받아오는 과정이 필요하다
🔍
유저가 충분한 토큰의 양을 갖고 있는지 검증하는 코드
는 아무래도 토큰을 보내는 과정에서 오류를 발생시키기 때문에 작성하지는 않았다
Contract.setProvider("HTTP://127.0.0.1:7545");
var erc20contractABI = erc20Abi;
var erc721contractABI = erc721Abi;
const server = process.env.TOKEN_ADDRESS;
const serverPK = process.env.TOKEN_PRIVATEKEY;
var erc20contract = await new Contract(erc20contractABI, process.env.ERC20ADDR);
var erc721contract = await new Contract(erc721contractABI, process.env.ERC721ADDR);
const buyerAddress = req.body.buyer;
const price = req.body.price;
const buyerPk = req.body.buyerPk;
const ownerAddress = req.body.ownerAddress;
const buyerUserName = req.body.buyerUserName;
const ownerName = req.body.ownerName;
const buyerId = req.body.buyerId;
const tokenId = req.body.tokenId;
const ownerId = req.body.ownerId;
const txData = erc20contract.methods.transfer(ownerAddress, 200).encodeABI();
const rawTransaction = {
from: buyerAddress,
to: process.env.ERC20ADDR,
gas: 100000,
data: txData,
};
web3.eth.accounts.signTransaction(rawTransaction, buyerPk).then(async (signTx) => {
web3.eth.sendSignedTransaction(signTx.rawTransaction, async (err, req) => {
if (err) {
console.log("erc20 transfer 에러 : ", err);
} else {
db.collection("users").updateOne({ address: buyerAddress }, { $inc: { erc20: -parseInt(price) } }, (err, result) => {
console.log("토큰 사용 완료");
if (err) {
console.log("토큰 감소 오류;;;");
} else {
const nftData = erc721contract.methods.transferFrom(ownerAddress, buyerAddress, parseInt(tokenId)).encodeABI();
const rawTransaction = {
from: server,
to: process.env.ERC721ADDR,
gas: 5000000,
data: nftData,
};
web3.eth.accounts.signTransaction(rawTransaction, serverPK).then((signTx) => {
web3.eth.sendSignedTransaction(signTx.rawTransaction, async (err, req) => {
if (err) {
console.log("transferFrom에러: ", err);
} else {
db.collection("nfts").updateOne(
{ _id: parseInt(tokenId) },
{
$set: {
ownerId: buyerId,
ownerName: buyerUserName,
ownerAddress: buyerAddress,
buyable: "no",
prevOwnerName: ownerName,
prevOwnerId: ownerId,
prevPrice: price,
price: 0,
},
},
(err, result) => {
if (err) {
console.log("db수정 실패?");
} else {
console.log("구매완료!!!");
res.json({ message: "구매완료!!!" });
}
}
);
}
});
});
}
});
}
});
});
});
ERC20
컨트랙트의 transfer
함수를 이용해서 NFT
의 현재 주인에게 토큰을 보내준다, 그 후 DB의 토큰 양을 감소 시킨 후 ERC721
컨트랙트의 transferFrom
함수를 서버로 실행 시켜 구매자에게 전송해 준다실제 실행 화면
계획의 마지막 부분이었던 구매 단계도 마무리 되었다 사실
Remix
를 통해서도 확인은 되지만 맞게 구성하였는지는 의심이 된다 🥲🥲
마지막으로 마치는 글을 작성하러 먼저 가야겠다 😎😀