ERC721을 상속 받은 contract는 caver-java로 민팅할수 없나요?

ERC721을 상속받은 contract를 민팅하려고 하는데 not a program account (e.g., an account having code and storage) 오류가 발생 합니다.

kip17이 아닌 ERC721을 상속받은 contract를 caver-java로 사용하려고 해서 문제인건지 아니면 코드상 문제인지 궁금 합니다.

ERC721을 상속받은 contract를 caver-java로 호출하면 오류가 발생 할까요?

Caver caver = new Caver(rebitProp.getNetwork());
SingleKeyring deployerKeyring = caver.wallet.keyring.create(walletAddress(), walletPrivateKey());
caver.wallet.add(deployerKeyring);

KIP17 kip17 = new KIP17(caver, contractAddress());
kip17.setWallet(caver.wallet);

BigInteger tokenId = new BigInteger("1");

SendOptions sendOptions = new SendOptions(deployerKeyring.getAddress());
sendOptions.setGas("7500000");

String uri = "https://www.test.net";
TransactionReceipt.TransactionReceiptData mintReceiptData = kip17.mintWithTokenURI("0x75d9f67c8d17e536d6affb69ec3a0a5e4df2f81c", tokenId, uri, sendOptions);
System.out.println("NFT mint transaction hash : " + mintReceiptData.getTransactionHash());

안녕하세요

해당 에러는 연결된 클레이튼 endpoint node에서부터 받은 에러이고, contract가 아닌 account에 컨트랙트 호출 함수를 사용했을 경우에 발생하는 에러입니다.

코드상에서 contractAddress()를 통해서 입력된 주소가 실제 contract 주소가 맞을까요?

옙. 여기 주소로 사용 했습니다.

KIP17 kip17 = new KIP17(caver, contractAddress());
kip17.setWallet(caver.wallet);

사용한 lib 버전 입니다.

implementation 'com.klaytn.caver:core:1.10.2'
implementation ('xyz.groundx.caver:caver-java-ext-kas:1.9.0') {
	exclude group: 'io.swagger.core.v3', module: 'swagger-annotations'
}
implementation 'com.github.ipfs:java-ipfs-api:v1.4.4'

caver-java 상에서는 해당 contract가 kip17 혹은 erc721의 abi를 통한 호출이 가능하다면 kip17의 기능을 사용하실 수 있습니다.

contractAddress를 확인해보았을때 ERC721을 제대로 상속받고 있지 않은 것으로 보입니다

답변 감사합니다.

remix에서 컴파일 하고 나온 abi하고 바이트 코드로 배포 했는데도 계속 문제가 발생하는거 같습니다.

아래 코드에서 잘못된 코드가 있을까요?

// 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 {
    
    constructor(string memory _tokenName, string memory _symbolName) ERC721(_tokenName, _symbolName) {
        _mint(msg.sender, 1);
    }    
}

조금더 자세하게 설명드리자면,

첨부하신 코드는, 기본적인 ERC721 표준에 정의된 method들만 구현되어있습니다.

사용하시고자하는 기능인 mint 관련 메소드, totalsupply, burn 등과 같이 ERC721 token을 핸들링하기에 편리한 부가 메소드들은 extension에 포함되어있기 때문에 이를 별도로 추가해주셔야합니다.

예시로, mintWithTokenURI 메소드를 사용하시고 싶으시다면, ERC721MetadataMintable extension을 추가해주셔야합니다. (해당 extension은 오픈제플린 2.x 버전에만 포함되어있습니다)