likelion-liquidity / liquidity-contract

MIT License
7 stars 1 forks source link

유저가 스테이킹한 NFT 정보를 반환하는 함수 작성 #39

Closed myungjunChae closed 2 years ago

jjgob commented 2 years ago
function getStakedNftList(address userAddress, address nftAddress)
    public
    view
    returns (NftLendingStatus[][2] memory, address[2] memory)
{
    //테스트
    NftLendingStatus[][2] memory resultNft;
    resultNft[0] = _search(userAddress, nftAddress);
    resultNft[1] = _search(userAddress, nftAddress);

    address[2] memory resultAddr;
    resultAddr[0] = nftAddress;
    resultAddr[1] = nftAddress;

    return (resultNft, resultAddr);

    //하고자 했던거!!
    // NftLendingStatus[][] memory resultNft;
    // address[] memory resultAddr;
    // uint256 count = 0;
    // for (uint256 i = 0; i < dataHolder.getWhiteListNftList().length; i++) {
    //     address nftAddress = dataHolder.getWhiteListNftList()[i];
    //     NftLendingStatus[] memory statusArr = _search(userAddress, nftAddress);
    //     if (statusArr.length > 0) {
    //         resultNft[count] = statusArr;
    //         resultAddr[count] = nftAddress;
    //         count++;
    //     }
    // }
    // return (resultAddr, resultNft);
}

function _search(address userAddress, address nftAddress)
    public
    view
    returns (NftLendingStatus[] memory)
{
    NftLendingStatus[] memory lendingStatus = stakedNft[userAddress][
        nftAddress
    ];
    return lendingStatus;
}
myungjunChae commented 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차원 배열이 너무 유틸성이 부족하네요 ㅠㅠ

jjgob commented 2 years ago

---- 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

jjgob commented 2 years ago

이거 위에 _search랑 같은거 아니에요?

function _search(address userAddress, address nftAddress) public view returns (NftLendingStatus[] memory) { NftLendingStatus[] memory lendingStatus = stakedNft[userAddress][ nftAddress ]; return lendingStatus; }

myungjunChae commented 2 years ago

@jjgob 네 safeGet을 사용하면, 데이터가 없으면 에러가 나오긴하거든요. 위와 같이 처리해도 어쩌피 빈 배열을 리턴할거니 괜찮을 것 같습니다!

jjgob commented 2 years ago

@myungjunChae 일단 명준님 작성한거 에러납니다. memory 배열에 for문으로 하나하나 할당하려면 어제 얘기한것처럼 사이즈 픽스되어야 하고 push안먹고 배열[0]=값 이런식으로 넣어야 합니다.

myungjunChae commented 2 years ago

@jjgob 위와 같이 처리해도 괜찮을 것 같다는건 유나님 코드 말씀이였습니다 :) 저건 수도코드라 놓친 부분이 있나보네요!

myungjunChae commented 2 years ago

@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);

이런 식으로도 처리할 수 있다고 합니다~

jjgob commented 2 years ago

와우~ 이런 방법이 있네요. 어디든 길은 있군요. 좋은 정보 감사합니다~

jjgob commented 2 years ago

@myungjunChae 알려주신 방법대로 하니, 원하는 결과값 나오네요.

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