Caver 사용시 receipt값이 넘어오지 않습니다

안녕하세요 생성한 토큰으로 결제를 하여 mint하는 컨트랙트를 만들고 있는데
IDE상에서는 pending 후 tx가 넘어오지 않고
caver-js로도 receipt가 넘어오지 않습니다.

허나 스코프상 tx는 정상적으로 처리되어
토큰결제, nft 민팅까지 되는 상황입니다.

지금까지 알아낸 케이스는 토큰 결제로직(전송)을 빼면 reciept가 넘어옵니다.

또한 ground에서 제공한
KIP37 컨트랙트에서는 토큰전송함수 실행시 pending 없이 receipt를 주고
KIP17 컨트랙트에서는 토큰전송함수 실행시 receipt가 안 넘어오는 이상한 상황입니다.
아래는 mint 로직을 제거한 토큰 전송 함수 코드입니다 .


pragma solidity ^0.5.0;


contract MotifInterface {
    function transferFrom(address from, address to, uint256 amount) external returns (bool success);
}


contract KIP17Token is KIP17Full, KIP17Mintable, KIP17MetadataMintable, KIP17Burnable, KIP17Pausable {
    constructor (string memory name, string memory symbol) public KIP17Full(name, symbol) {
    }
    
    address private _motif = 0xE9c9e2B8150c55604a726F5283e3c92F91950339;
    
    function _transferMotif(address from, address to, uint256 amount) public{
        MotifInterface motif = MotifInterface(_motif);
        bool result = motif.transferFrom(from, to, amount);

    }
    

}


tx 정보입니다.

무엇이 문제일까요…?
caver-js에서 callback으로 txhash는 얻을 수 있으나,
그 txhash로

  const receipt = await caver.rpc.klay.getTransactionReceipt(transactionHash);

했을 때 event 값이 없어서 문제입니다.

@yong_jung

안녕하세요 :slight_smile:
질문을 좀 더 구체적으로 이해하고자 사용하신 소스코드의 공유를 부탁드립니다.

글 마지막 부분에서 말씀하신 내용은 Receipt은 조회가 되는데 Event Logs를 못찾겠다는 말씀이실까요~?

이 부분도 확인 부탁드립니다.

답변이 늦어서 죄송합니다.
모든 소스는 klaytn-contracts/contracts/token at master · klaytn/klaytn-contracts · GitHub
에 있는 소스를 사용했습니다.

contract MotifInterface {
    function transferFrom(address from, address to, uint256 amount) external returns (bool success);
}


contract KIP17Token is KIP17Full, KIP17Mintable, KIP17MetadataMintable, KIP17Burnable, KIP17Pausable {
    constructor (string memory name, string memory symbol) public KIP17Full(name, symbol) {
    }
    
    address private _motif = 0xE9c9e2B8150c55604a726F5283e3c92F91950339;
    
    function _transferMotif(address from, address to, uint256 amount) public{
        MotifInterface motif = MotifInterface(_motif);
        bool result = motif.transferFrom(from, to, amount);

    }
   
}

이부분만 제가 KIP17Token에 토큰전송함수 추가한 것입니다.

그런데 KIP17은 토큰전송함수를 프론트에서 실행하면 스코프상에는 정상적으로 tx성공이 확인되는데
receipt 값이 promise로 넘어오지 않아서 그다음 로직이 실행이 안되고 있습니다.

event_log는 해결하였습니다!

@yong_jung

Contract 소스코드는 공유를 해주셨으니
작성하신 코드도 공유 부탁드릴게요…!

말씀해주신 케이스는 작성하신 코드를 봐야 원활하게 논의가 이루어질 수 있을 거 같습니다.

프론트는 react 기반으로 구성중이며

  const contractAbi = KIP17_Abi
      && new caver.klay.Contract(KIP17_Abi, contract.contractAddress)
와같이 객체를 생성했고

      return await contractAbi.methods. _transferMotif(account, to,  amount)
      .send({
        from: account,
        gas: '300000',
      });

로 실행하였습니다.

이 다음 로직이 있는데 tx 서명후 리턴이 promise로 안와서 실행이 안되고 함수가 끝나버리는 현상입니다.
그래서 임시방편으로

    await contractAbi.methods.contractAbi.methods. _transferMotif(account, to,  amount)
      .send({
        from: account,
        gas: '300000',
      }, async (err, transactionHash) => {
        const receipt = await caver.rpc.klay.getTransactionReceipt(transactionHash);
   });

이와같이 callback 으로 txhash 받은 다음에 receipt를 얻게 변경하였습니다.
함수실행전에 approve는 당연히 했습니다.
감사합니다.

@yong_jung

안녕하세요. 코드를 공유해주셨는데, 현재 이 코드만으로는 저희측에서 재현이 어려운 상황입니다.
추가적으로 현재 Caver를 사용하시는 방법이 Best Practice와는 거리가 좀 멀어보입니다.

하여 사용자분이 사용하신 것과 최대한 유사한 상황의 예제 소스코드를 첨부드립니다.

caver-js-examples/index.js at master · klaytn/caver-js-examples · GitHub 를 참고해주시기 바라고 해당 예제소스 코드의 107번 라인에 아래의 라인들을 추가해주셔서 테스트 해보시는 것도 권장드립니다.

    const receipt2 = await contract.methods.set('k2', 'v2').send({from: deployerKeyring.address, gas: 1000000 })
    console.log(receipt2)

질문자분이 사용하신 사용법과 최대한 비슷하게 사용을 했습니다.

첨부드린 예제의 Caver 사용법을 한 번 확인해주시기 바랍니다.

또 에러가 재현된다면, 저희 측에서 쉽게 재현해볼 수 있게끔 예제 코드를 구성해주시면 감사하겠습니다.