diff --git a/node/pkg/gwrelayer/gwrelayer.go b/node/pkg/gwrelayer/gwrelayer.go index 732fd51d84..615598ed9a 100644 --- a/node/pkg/gwrelayer/gwrelayer.go +++ b/node/pkg/gwrelayer/gwrelayer.go @@ -424,7 +424,7 @@ func SubmitVAAToContract( return txResp, fmt.Errorf("out of gas: %s", txResp.TxResponse.RawLog) } - if strings.Contains(txResp.TxResponse.RawLog, "failed") && !strings.Contains(txResp.TxResponse.RawLog, "VaaAlreadyExecuted") { + if strings.Contains(txResp.TxResponse.RawLog, "failed") && !canIgnoreFailure(txResp.TxResponse.RawLog) { return txResp, fmt.Errorf("submit failed: %s", txResp.TxResponse.RawLog) } @@ -441,3 +441,8 @@ func SubmitVAAToContract( return txResp, nil } + +// canIgnoreFailure checks for returns from the contract that aren't really errors. +func canIgnoreFailure(rawLog string) bool { + return strings.Contains(rawLog, "VaaAlreadyExecuted") || strings.Contains(rawLog, "this asset has already been attested") +} diff --git a/node/pkg/gwrelayer/gwrelayer_test.go b/node/pkg/gwrelayer/gwrelayer_test.go index 89abacd737..3c61a8e7da 100644 --- a/node/pkg/gwrelayer/gwrelayer_test.go +++ b/node/pkg/gwrelayer/gwrelayer_test.go @@ -180,3 +180,9 @@ func Test_shouldPublishToIbcTranslatorShouldIgnoreUnknownEmitter(t *testing.T) { assert.NoError(t, err) assert.False(t, shouldPub) } + +func Test_canIgnoreFailure(t *testing.T) { + assert.True(t, canIgnoreFailure("failed to execute message; message index: 0: Generic error: VaaAlreadyExecuted: execute wasm contract failed")) + assert.True(t, canIgnoreFailure("failed to execute message; message index: 0: Generic error: this asset has already been attested: execute wasm contract failed")) + assert.False(t, canIgnoreFailure("failed to execute message; message index: 0: Generic error: some other failure: execute wasm contract failed")) +}