Blockmunity (5)

이민기·2022년 3월 7일
0

Blockmunity

목록 보기
6/7
post-thumbnail

Blockmunity

7. ✓ NFT 구매

판매 등록이 완료된 NFT를 구매하기 위해서는 현재 NFT의 소유자에게 토큰을 보내주고 NFT를 받아오는 과정이 필요하다

🔍 유저가 충분한 토큰의 양을 갖고 있는지 검증하는 코드는 아무래도 토큰을 보내는 과정에서 오류를 발생시키기 때문에 작성하지는 않았다


Code🖋

 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를 통해서도 확인은 되지만 맞게 구성하였는지는 의심이 된다 🥲🥲
마지막으로 마치는 글을 작성하러 먼저 가야겠다 😎😀

profile
블로그를 옮기는 중입니다. https://min71.dev

0개의 댓글