Erc721 토큰을 민팅하는데 "not a program account"가 발행 합니다

ERC721을 상속 받아 간단하게 contract를 만들어서 deploy 했습니다.

contract : 0xf2dc36a46e46cf3beca14575f5056a957b896ac3
wallet : 0xb373c647d3a4a29309e5ae367eb2d36661cf60c9

mint 할때 not a program account (e.g., an account having code and storage) 오류가 발생합니다.

어디서 잘못된걸까요?

solidity코드에서 문제인건지 정보를 알고 싶습니다.

error

java.io.IOException: not a program account (e.g., an account having code and storage)
	at com.klaytn.caver.contract.ContractMethod.sendTransaction(ContractMethod.java:1067) ~[core-1.10.2.jar:?]
	at com.klaytn.caver.contract.ContractMethod.send(ContractMethod.java:290) ~[core-1.10.2.jar:?]
	at com.klaytn.caver.contract.ContractMethod.send(ContractMethod.java:242) ~[core-1.10.2.jar:?]
	at com.klaytn.caver.kct.kip17.KIP17.mint(KIP17.java:1419) ~[core-1.10.2.jar:?]

solidity

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

import "@openzeppelin/contracts@4.9.2/token/ERC721/ERC721.sol";

/// @custom:security-contact work.work@gmail.com
contract MyTokenSingleMinting is ERC721 {

    // base uri
    string private baseUri;
    
    constructor(string memory _tokenName, string memory _symbolName, string memory _baseUri) ERC721(_tokenName, _symbolName) {
        baseUri = _baseUri;
    }

    function _baseURI() internal view override returns (string memory) {
        return baseUri;
    }
}

caver-java example

Caver caver = new Caver("https://public-en-baobab.klaytn.net"); // https://api.baobab.klaytn.net:8651
SingleKeyring deployerKeyring = caver.wallet.keyring.createWithSingleKey(WalletAddress(), WalletPrivateKey());
caver.wallet.add(deployerKeyring);

// Create a KIP17 instance
KIP17 kip17 = new KIP17(caver, contractAddress());
kip17.setWallet(caver.wallet);

SendOptions sendOptions = new SendOptions(productContract.getWalletAddress());
sendOptions.setGas("25000");

// Mint a NFT token
TransactionReceipt.TransactionReceiptData mintReceiptData = kip17.mint(WalletAddress(), new BigInteger("1"), sendOptions);

안녕하세요, 먼저 contractAddress() 함수를 직접 구현하신것으로 보이는데 공유해주시면 좋을 것 같습니다.

위 링크를 들어가셔서 보시면 0xf2dc36a46e46cf3beca14575f5056a957b896ac3 컨트랙트가 제대로 deploy되지 않은 것을 보실 수 있을 것 입니다. 컨트랙트 배포에 실패하여 이후에 컨트랙트를 활용하는 코드가 실패한 것입니다.

컨트랙트 배포가 실패한 이유는 Solidity 최신 버전인 0.8.20을 현재 Klaytn이 지원하지 않기 때문입니다. 곧 출시될 Klaytn v1.11.0 에 해당 버전 지원이 가능하게 될 예정이니 그동안은 아래 방법 중 하나를 택하여 컨트랙트를 배포하시길 바랍니다.

  1. Solidity 0.8.19 이하 버전 사용
    작성하신 솔리디티 파일의 첫줄 pragma solidity ^0.8.20; 부분을 pragma solidity ^0.8.19; 로 변경하시면, 정상적으로 컨트랙트가 배포될 것입니다.

  2. Solidity 컴파일 시 paris EVM 설정 사용
    target EVM을 paris로 설정하시면, Solidity 0.8.20을 사용하실 수 있습니다.
    Remix나 Solc 등을 이용하여 컴파일 하실 때, EVM 종류를 설정하는 옵션이 있습니다. 이 값을 paris로 설정하시면, 최신 솔리디티 버전도 사용 가능합니다.

2 Likes

contractAddress() 함수는 그냥 주소만 리턴하는 함수 입니다.

답변 감사합니다.
말씀하신대로 한번 수정해서 다시 시도해 보겠습니다.