Catching error messages
Catching FAILWITH errors with Webmavryk
When a contract call fails because of the FAILWITH instruction, an error is returned by the node. This error is made available by Webmavryk as an instance of the MavrykOperationError class.
try {// a contract call that fails} catch (err) {if (err instanceof MavrykOperationError) {// process the error}}
If the type of value returned by the contract is a string, the value will be available in the message property of the MavrykOperationError instance, for example:
try {const contractAddress = "KT1XemmsT8w5obkXt6eoJ8UYn4Vhsjze9zsb";const contract = await Mavryk.contract.at(contractAddress);const op = await contract.methodsObject.fail_with_string("error").send();await op.confirmation();console.log(op.hash);} catch (err) {if (err instanceof MavrykOperationError) {console.log(err.message) // will log "error"}}
However, if the value is another type, the error message will be available in the errors property.
Among other information, the MavrykOperationError instance has a property called errors whose value is an array. The last element of the array holds the error message returned by the FAILWITH instruction, i.e. the last value that was on the stack before the contract call failed. This value is an object with a with property where you can find the Michelson expression of the last value on the stack.
For example:
try {const contractAddress = "KT1XemmsT8w5obkXt6eoJ8UYn4Vhsjze9zsb";const contract = await Mavryk.contract.at(contractAddress);const op = await contract.methodsObject.fail_with_int(2).send();await op.confirmation();console.log(op.hash);} catch (err) {if (err instanceof MavrykOperationError) {console.log(err.errors[err.errors.length - 1])}}
will log the following:
{kind: 'temporary',id: 'proto.011-PtHangz2.michelson_v1.script_rejected',location: 20,with: { int: '2' }}
As the value under with is a Michelson expression, you can parse it as you usually do for more complex error messages.
For example, in the case of a pair returned by the contract, you would get this message:
{kind: "temporary",id: "proto.011-PtHangz2.michelson_v1.script_rejected",location: 22,with: {prim: "Pair",args: [{int: "2"},{string: "error"}]}}