NFT tokenOfOwnerByIndex 호출 오류

안녕하세요
발행된 NFT가 있고 어떤 주소가 balanceOf를 호출하면 100개의 토큰을 가지고 있습니다.
전체 토큰아이디를 가져오기 위해서 다름 코드를 실행하였습니다.
for (let i = 0; i < balance; i++)
{
const tid = await contractInstance.methods.tokenOfOwnerByIndex(senderAddress, i).call();
}

증상: tokenOfOwnerByIndex 함수 호출 시 0~59 인덱스까지는 정상실행 되지만 60 이후부터는 아래의 오류가 발생합니다.
이상한 것은 i = 59부터 시작해도 59는 정상실행되지만 60만 되면 오류가 발생합니다.
컨트랙트 소스는 클레이튼에서 제공되는 소스로 배포되었기 때문에
KAS에서 버퍼를 60개만 잡아놓은것은 아닌지 의심되는 상황입니다.

Error: Returned error: evm: execution reverted
at Object.ErrorResponse (…\node_modules\caver-js\packages\caver-core-helpers\src\errors.js:87:16)
at …\node_modules\caver-js\packages\caver-core-requestmanager\src\index.js:155:44
at XMLHttpRequest.request.onreadystatechange (…\node_modules\caver-js\packages\caver-core-requestmanager\caver-providers-http\src\index.js:119:13)
at XMLHttpRequestEventTarget.dispatchEvent (…\node_modules\xhr2-cookies\dist\xml-http-request-event-target.js:34:22)
at XMLHttpRequest._setReadyState (…\node_modules\xhr2-cookies\dist\xml-http-request.js:208:14)
at XMLHttpRequest._onHttpResponseEnd (…\node_modules\xhr2-cookies\dist\xml-http-request.js:318:14)
at IncomingMessage. (…\node_modules\xhr2-cookies\dist\xml-http-request.js:289:61)
at IncomingMessage.emit (node:events:538:35)
at IncomingMessage.emit (node:domain:475:12)
at endReadableNT (node:internal/streams/readable:1342:12)

try catch 구문을 이용해 문제가 발생한 부분을 스킵해보셨나요? solidity array 에서는 데이터가 저장된 메모리 위치가 이동하지않기때문에, 판매등으로 데이터가 지워진경우 해당 index값이 비워지는 형태로 만들어질 수있습니다.

따라서 for loop 보다는 while 등으로 별도의 카운터를 두셔서 진행해보시는걸 추천드립니다.

상기 문제 해결되셨으면 좋겠네요.

감사합니다.

1 Like

안녕하세요

while loop로 다시 코딩했더니 잘 나옵니다.

답변 감사드립니다.

2 Likes