Caver에서 트랜잭션 에러 메시지 출력이 가능한가요?

function mint(uint256 _count) public payable {
require(
saleEnable,
“Sale is not enable”
);
}

해당 컨트랙트를 호출하여 에러가 발생했을 때 받은 에러 메시지(Sale is not enable)를 띄워주고 싶습니다.

web3의 경우 handleRevert 파라미터를 설정하면 해당 트랜잭션 에러 로그에 같이 찍힌다고 알고있는데
caver에서는 어떻게 해당 메시지를 받아올 수 있나요?

해당 컨트랙트 method의 실행은 실제로는 send() 메소드를 이용하기 때문에, send메소드에서 발생하는 에러를 통해 처리하실 수 있습니다. 아래 문서를 확인해주세요.

caver.contract - Klaytn Docs

이 결과값을 이용해 아래와 같이 event emitter를 이용해 event발생을 listen해서 에러처리를 하시면 될것 같습니다. 예를들어 아래 예제와 같이 수행하시면 됩니다.

myContract.methods.<your methods>().send({ from: '0x{address in hex}', gas: 1000000 })
   .on('transactionHash', function(hash) {
    ...
  })
  .on('receipt', function(receipt) {
    console.log(receipt)
  })
  .on('error', console.error)
caver.klay.sendTransaction({
      type: 'SMART_CONTRACT_EXECUTION',
      from: this.state.account,
      to: contract,
      gas: '20000000',
      value:caver.utils.toPeb(String(count*0.01), 'KLAY'),
      data
    }).once('transactionHash', async (transactionHash) => {
      console.log(transactionHash)
    })
    .once('receipt', receipt => {
      console.log('receipt', receipt)
    })
    .once('error', error => {
      console.log('error', error.message)
    })

이 코드로 실행하여 테스트하고 있는데
contract의 saleEnable 상태를 true로 설정하면 정상작동하고
false로 설정시 에러가 발생하는데
해당 에러 메시지가 항상 error evm: execution reverted 로 고정되어 있고 메시지를 얻을 수 없습니다.

현재 caver-js 1.3.2 버전 사용중입니다.

caver에서는 evm: execution reverted 에러 발생의 경우 에러메시지만을 전송하기 때문에
에러의 정확한 원인의 로깅은 불가능하다고 합니다.

대안으로는 try - catch 를 이용해 오류가 발생한 경우 추가로 컨트랙트에서 saleEnable 의 상태를 확인하고 오류메시지를 출력하는 방법이 가능하지 않을까 싶습니다.

1 Like