Closed myungjunChae closed 2 years ago
function getStakedNftList(address userAddress, address nftAddress)public view returns(NftLendingStatus[] memory){
NftLendingStatus[] memory nftLendingStatusList;
uint256 length = stakedNft[userAddress][nftAddress].length;
for(uint256 i = 0 ; i < length ; i++){
nftLendingStatusList.push(safeGetNftLendingStatus(userAddress, nftAddress, i));
}
return nftLendingStatusList;
}
는 어떻게 생각하시나요? 2차원 배열이 너무 유틸성이 부족하네요 ㅠㅠ
---- multi value return ---- js에서 호출하는 부분 ---- const testRs = await lendingContract.getStakedNftList(owner, nftContract.address); console.log(testRs[0]); //or testRs["0"] //resultNft console.log(testRs[1]); //or testRs["1"] //resultAddr
function _search(address userAddress, address nftAddress) public view returns (NftLendingStatus[] memory) { NftLendingStatus[] memory lendingStatus = stakedNft[userAddress][ nftAddress ]; return lendingStatus; }
@jjgob 네 safeGet을 사용하면, 데이터가 없으면 에러가 나오긴하거든요. 위와 같이 처리해도 어쩌피 빈 배열을 리턴할거니 괜찮을 것 같습니다!
@myungjunChae 일단 명준님 작성한거 에러납니다. memory 배열에 for문으로 하나하나 할당하려면 어제 얘기한것처럼 사이즈 픽스되어야 하고 push안먹고 배열[0]=값 이런식으로 넣어야 합니다.
@jjgob 위와 같이 처리해도 괜찮을 것 같다는건 유나님 코드 말씀이였습니다 :) 저건 수도코드라 놓친 부분이 있나보네요!
@jjgob 유나님 말씀대로 Dynamic array는 storage만 지원되고, memory array는 사이즈가 픽스되어야할 것 같은데요. https://ethereum.stackexchange.com/questions/46761/how-to-fill-dynamic-in-memory-array
uint[] memory result = new uint[](n);
이런 식으로도 처리할 수 있다고 합니다~
와우~ 이런 방법이 있네요. 어디든 길은 있군요. 좋은 정보 감사합니다~
function getStakedNftListByUser(address userAddress)
public
view
returns (NftLendingStatus[][] memory, address[] memory)
{
uint256 fixCnt = 0;
for (uint256 i = 0; i < dataHolder.getWhiteListNftList().length; i++) {
address tempNftAddrA = dataHolder.getWhiteListNftList()[i];
NftLendingStatus[] memory statusArr = getStakedNftList(
userAddress,
tempNftAddrA
);
if (statusArr.length > 0) {
fixCnt++;
}
}
uint256 rsCnt = 0;
NftLendingStatus[][] memory resultNft = new NftLendingStatus[][](
fixCnt
);
address[] memory resultAddr = new address[](fixCnt);
for (uint256 j = 0; j < dataHolder.getWhiteListNftList().length; j++) {
address tempNftAddrB = dataHolder.getWhiteListNftList()[j];
NftLendingStatus[] memory statusArr = getStakedNftList(
userAddress,
tempNftAddrB
);
if (statusArr.length > 0) {
resultNft[rsCnt] = statusArr;
resultAddr[rsCnt] = tempNftAddrB;
rsCnt++;
}
}
return (resultNft, resultAddr);
}
----------test.js-------------------------- const testRs = await lendingContract.getStakedNftListByUser(owner); console.log(testRs[0]); //or testRs["0"] //resultNft console.log(testRs[1]); //or testRs["1"] //resultAddr