인프런 커뮤니티 질문&답변

dlqhdus628님의 프로필 이미지
dlqhdus628

작성한 질문수

[D.P.(DappProject)] 디앱 프로젝트(NFT 생성, NFT 구매 및 판매)

구매 함수 (purchaseAnimalToken) 작성

vm error: out of gas

작성

·

190

1

안녕하세요. 강의 잘 듣고 있습니다:)

제가 코드를 다 쓰고 purchaseAnimalToken을 테스트 하는데

vm error: out of gas 가 뜹니다. gasLimit는 3000000로 설정되어있는데 왜 그런 걸까요?

열심히 구글링을 했는데도 답을 찾지 못해 질문 남깁니다.

pop() 때문에 에러가 나는 것 같은데 강의를 보고 똑같이 따라 했는데 왜 저만 에러가 날까요...?ㅠㅠㅠ

답변 1

0

h662님의 프로필 이미지
h662
지식공유자

구매 함수 실행 하실때 리믹스 상에서 Value에 정확한 구매 가격을 입력한 후 실행 하신게 맞으신가요??

 

해당 에러만 봐서는 판단하기가 힘드네요.
전체코드를 공유 받을 수 있을까요?

dlqhdus628님의 프로필 이미지
dlqhdus628
질문자

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "MintAnimalToken.sol";

contract SaleAnimalToken {
    MintAnimalToken public mintAnimalTokenAddress;

    constructor (address _mintAnimalTokenAddress) {
        mintAnimalTokenAddress = MintAnimalToken(_mintAnimalTokenAddress);
    }

    mapping(uint256 => uint256) public animalTokenPrices;

    uint256[] public onSaleAnimalTokenArray;

    function setForSaleAnimalToken(uint256 _animalTokenId, uint256 _price) public {
        address animalTokenOwner = mintAnimalTokenAddress.ownerOf(_animalTokenId);

        require(animalTokenOwner == msg.sender, "Caller is not animal token owner.");
        require(_price > 0, "Price is zero or lower.");
        require(animalTokenPrices[_animalTokenId] == 0, "This animal token is already on sale.");
        require(mintAnimalTokenAddress.isApprovedForAll(animalTokenOwner, address(this)), "Animal token owner did not approve token.");
        
        animalTokenPrices[_animalTokenId] = _price;
        
        onSaleAnimalTokenArray.push(_animalTokenId);
    }

    function purchaseAnimalToken(uint256 _animalTokenId) public payable {
        uint256 price = animalTokenPrices[_animalTokenId];
        address animalTokenOwner = mintAnimalTokenAddress.ownerOf(_animalTokenId);

        require(price > 0, "Animal token not sale");
        require(price <= msg.value, "Caller sent lower than price");
        require(animalTokenOwner != msg.sender, "Caller is animal token owner");

        payable(animalTokenOwner).transfer(msg.value);
        mintAnimalTokenAddress.safeTransferFrom(animalTokenOwner, msg.sender, _animalTokenId);

        animalTokenPrices[_animalTokenId] = 0;

        // if(onSaleAnimalTokenArray[i] == _animalTokenId)
        // if(animalTokenPrices[onSaleAnimalTokenArray[i]] == 0)
        for(uint256 i=0; i < onSaleAnimalTokenArray.length; i++){
            if(animalTokenPrices[onSaleAnimalTokenArray[i]] == 0){ 
                onSaleAnimalTokenArray[i] = onSaleAnimalTokenArray[onSaleAnimalTokenArray.length - 1];
                onSaleAnimalTokenArray.pop();
            }
        }
    }

    function getOnSaleAnimalTokenArrayLength() view public returns(uint256) {
        return onSaleAnimalTokenArray.length;
    }

}

전체 코드 보내드립니다. 왜 에러가 뜨는 걸까요?

댓글 달아주셔서 감사합니다:)

h662님의 프로필 이미지
h662
지식공유자

주신 코드로 실행했었는데 이상없이 잘 실행됩니다..

네트워크 상황에따라서 실행이 안되는 경우가 있어서 

다시한번 배포해서 테스트해보시고

그래도 실행이 안되면 아래 주소 들어가셔서

메타마스크의 뭄바이 테스트넷 RPC URL 변경 후 테스트 해보시길 바랍니다.

https://docs.polygon.technology/docs/develop/network-details/network/

 

잘되면 공유한번 부탁드리겠습니다 감사합니다 ^^

dlqhdus628님의 프로필 이미지
dlqhdus628
질문자

Javascript VM(London) 말고 다른 EVM으로 하니까 되더라고요. 

댓글 달아주셔서 감사합니다:)

dlqhdus628님의 프로필 이미지
dlqhdus628

작성한 질문수

질문하기