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개의 좋아요