diff --git a/go.mod b/go.mod index 2a1a541..0e4353c 100644 --- a/go.mod +++ b/go.mod @@ -48,7 +48,7 @@ require ( cosmossdk.io/depinject v1.0.0 // indirect cosmossdk.io/errors v1.0.1 // indirect cosmossdk.io/log v1.3.1 // indirect - cosmossdk.io/math v1.3.0 // indirect + cosmossdk.io/math v1.4.0 // indirect cosmossdk.io/store v1.1.0 // indirect cosmossdk.io/x/tx v0.13.4 // indirect cosmossdk.io/x/upgrade v0.1.4 // indirect diff --git a/go.sum b/go.sum index f7e21c9..50d43b3 100644 --- a/go.sum +++ b/go.sum @@ -31,8 +31,8 @@ cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= cosmossdk.io/log v1.3.1 h1:UZx8nWIkfbbNEWusZqzAx3ZGvu54TZacWib3EzUYmGI= cosmossdk.io/log v1.3.1/go.mod h1:2/dIomt8mKdk6vl3OWJcPk2be3pGOS8OQaLUM/3/tCM= -cosmossdk.io/math v1.3.0 h1:RC+jryuKeytIiictDslBP9i1fhkVm6ZDmZEoNP316zE= -cosmossdk.io/math v1.3.0/go.mod h1:vnRTxewy+M7BtXBNFybkuhSH4WfedVAAnERHgVFhp3k= +cosmossdk.io/math v1.4.0 h1:XbgExXFnXmF/CccPPEto40gOO7FpWu9yWNAZPN3nkNQ= +cosmossdk.io/math v1.4.0/go.mod h1:O5PkD4apz2jZs4zqFdTr16e1dcaQCc5z6lkEnrrppuk= cosmossdk.io/store v1.1.0 h1:LnKwgYMc9BInn9PhpTFEQVbL9UK475G2H911CGGnWHk= cosmossdk.io/store v1.1.0/go.mod h1:oZfW/4Fc/zYqu3JmQcQdUJ3fqu5vnYTn3LZFFy8P8ng= cosmossdk.io/x/tx v0.13.4 h1:Eg0PbJgeO0gM8p5wx6xa0fKR7hIV6+8lC56UrsvSo0Y= diff --git a/pkg/indexer/decode/actions.go b/pkg/indexer/decode/actions.go index 1bc7d62..75b978f 100644 --- a/pkg/indexer/decode/actions.go +++ b/pkg/indexer/decode/actions.go @@ -155,6 +155,10 @@ func parseIbcAction(body *astria.Action_Ibc, ctx *Context, action *storage.Actio action.Data["raw"] = base64.StdEncoding.EncodeToString(data) action.Data["type"] = typ + if ctx.HasWriteAckError { + return nil + } + switch typ { case "/ibc.core.channel.v1.MsgRecvPacket": var msg channelTypes.MsgRecvPacket @@ -201,6 +205,50 @@ func parseIbcAction(body *astria.Action_Ibc, ctx *Context, action *storage.Actio Update: amount, }) } + case "/ibc.core.channel.v1.MsgTimeout": + var msg channelTypes.MsgTimeout + if err := proto.Unmarshal(data, &msg); err != nil { + return err + } + var transfer IbcTransfer + if err := json.Unmarshal(msg.Packet.Data, &transfer); err != nil { + return nil + } + var addr string + var amount decimal.Decimal + + switch { + case internalAstria.IsAddress(transfer.Receiver): + addr = transfer.Receiver + amount = transfer.Amount.Neg() + case internalAstria.IsCompatAddress(transfer.Receiver): + a, err := internalAstria.CompatToAstria(transfer.Receiver) + if err != nil { + return err + } + addr = a + amount = transfer.Amount.Neg() + case internalAstria.IsAddress(transfer.Sender): + addr = transfer.Sender + amount = transfer.Amount.Copy() + case internalAstria.IsCompatAddress(transfer.Sender): + a, err := internalAstria.CompatToAstria(transfer.Sender) + if err != nil { + return err + } + addr = a + amount = transfer.Amount.Copy() + } + + if addr != "" { + address := ctx.Addresses.Set(addr, action.Height, amount, transfer.Denom, 0, 0) + action.BalanceUpdates = append(action.BalanceUpdates, storage.BalanceUpdate{ + Address: address, + Height: action.Height, + Currency: transfer.Denom, + Update: amount, + }) + } default: } } diff --git a/pkg/indexer/decode/actions_test.go b/pkg/indexer/decode/actions_test.go index 1f4fde5..b7c8a3c 100644 --- a/pkg/indexer/decode/actions_test.go +++ b/pkg/indexer/decode/actions_test.go @@ -109,6 +109,56 @@ func TestDecodeActions(t *testing.T) { require.Len(t, ctx.Addresses, 1) }) + t.Run("ibc action: MsgTimeout", func(t *testing.T) { + raw := "CrAECJABEgh0cmFuc2ZlchoJY2hhbm5lbC0wIgh0cmFuc2ZlcioKY2hhbm5lbC00ODLdA3siZGVub20iOiJ0cmFuc2Zlci9jaGFubmVsLTAvdXRpYSIsImFtb3VudCI6IjEwMDAwMDAiLCJzZW5kZXIiOiJhc3RyaWExM3ZwdGRhZnl0dHBtbHdwcHQwczg0NGVmZXkyY3BjMG1ldnk5MnAiLCJyZWNlaXZlciI6ImNlbGVzdGlhMTV6bTJxZWR3eGdsc2d1ZXBwbTdrNnNkNzVsNTlrNzJxaG1yd2ZnIiwibWVtbyI6IntcInJvbGx1cEJsb2NrTnVtYmVyXCI6XCIxNTMwNjVcIixcInJvbGx1cFdpdGhkcmF3YWxFdmVudElkXCI6XCIweDU5ODgzNGU0ZjYwNTkzYTdiNDFmNTVhY2RhNjEyNWUzMDg4ZTU1ZTc1NmNkYzNmMWQ5YjdhOTkxMTAyMzRmNDYuMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwXCIsXCJyb2xsdXBSZXR1cm5BZGRyZXNzXCI6XCIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGE5NDAzMDFjNTk3OGNiYzlkNzkxOThlY2E0YzE3NDRjMWViN2UyNmVcIn0ifToWCP///////////wEQ////////////AUD3x7a90r/mgRgSrhQKqhISpxIKOXJlY2VpcHRzL3BvcnRzL3RyYW5zZmVyL2NoYW5uZWxzL2NoYW5uZWwtNDgvc2VxdWVuY2VzLzE0NBL0CAo5cmVjZWlwdHMvcG9ydHMvdHJhbnNmZXIvY2hhbm5lbHMvY2hhbm5lbC00OC9zZXF1ZW5jZXMvMTQzEgEBGg4IARgBIAEqBgACpo3IAiIuCAESBwIE3JTIAiAaISDvynplXvnuNC+9UysDGUlhRoZQSPqTZIBOeCMROW3QCSIuCAESBwYMxpbIAiAaISBx69UxQztuYsMyGiN/A31rsi8B1Y2K96SN78B72LCe3SIsCAESKAgUxpbIAiA6uBfAndVrwJd7NMJ1exvBIHgmMJg+iaIvAfcFW2SMgSAiLggBEgcKKs6eyAIgGiEgMBYkDz8lUXrBosJ+rj9eiwn9toWhk1w1CfXo5Toi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" + data, err := base64.StdEncoding.DecodeString(raw) + require.NoError(t, err) + + message := &astria.Action_Ibc{ + Ibc: &v1.IbcRelay{ + RawAction: &anypb.Any{ + Value: data, + TypeUrl: "/ibc.core.channel.v1.MsgTimeout", + }, + }, + } + + wantAction := storage.Action{ + Height: 1000, + Type: types.ActionTypeIbcRelay, + Data: map[string]any{ + "raw": raw, + "type": "/ibc.core.channel.v1.MsgTimeout", + }, + BalanceUpdates: []storage.BalanceUpdate{ + { + Height: 1000, + Currency: "transfer/channel-0/utia", + Address: &storage.Address{ + Hash: "astria13vptdafyttpmlwppt0s844efey2cpc0mevy92p", + Height: 1000, + Balance: []*storage.Balance{ + { + Currency: "transfer/channel-0/utia", + Total: decimal.RequireFromString("1000000"), + }, + }, + }, + Update: decimal.RequireFromString("1000000"), + }, + }, + } + + action := storage.Action{ + Height: 1000, + } + ctx := NewContext(nil) + err = parseIbcAction(message, &ctx, &action) + require.NoError(t, err) + require.Equal(t, wantAction, action) + require.Len(t, ctx.Addresses, 1) + }) + t.Run("ibc action: MsgRecvPacket without astria address", func(t *testing.T) { raw := "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" data, err := base64.StdEncoding.DecodeString(raw) diff --git a/pkg/indexer/decode/context.go b/pkg/indexer/decode/context.go index a3b5d40..e12ce05 100644 --- a/pkg/indexer/decode/context.go +++ b/pkg/indexer/decode/context.go @@ -12,23 +12,24 @@ import ( ) type Context struct { - Addresses Addresses - Rollups Rollups - Validators Validators - RollupAddress map[string]*storage.RollupAddress - AddressActions map[string]*storage.AddressAction - SupplyChange decimal.Decimal - BytesInBlock int64 - GasUsed int64 - GasWanted int64 - DataSize int64 - ActionTypes storageTypes.Bits - Constants map[string]*storage.Constant - Bridges map[string]*storage.Bridge - Fees map[int64]*storage.Fee - Transfers []*storage.Transfer - Deposits map[int64]*storage.Deposit - Proposer string + Addresses Addresses + Rollups Rollups + Validators Validators + RollupAddress map[string]*storage.RollupAddress + AddressActions map[string]*storage.AddressAction + SupplyChange decimal.Decimal + BytesInBlock int64 + GasUsed int64 + GasWanted int64 + DataSize int64 + ActionTypes storageTypes.Bits + Constants map[string]*storage.Constant + Bridges map[string]*storage.Bridge + Fees map[int64]*storage.Fee + Transfers []*storage.Transfer + Deposits map[int64]*storage.Deposit + HasWriteAckError bool + Proposer string bridgeAssets map[string]string } @@ -83,8 +84,9 @@ func (ctx *Context) AddFee(idx int64, fee *storage.Fee) { ctx.Fees[idx] = fee } -func (ctx *Context) ClearFee() { +func (ctx *Context) ClearTx() { clear(ctx.Fees) + ctx.HasWriteAckError = false } func (ctx *Context) AddBridgeAsset(bridge, asset string) { diff --git a/pkg/indexer/parser/parseEvents.go b/pkg/indexer/parser/parseEvents.go index 42e0842..65d7e11 100644 --- a/pkg/indexer/parser/parseEvents.go +++ b/pkg/indexer/parser/parseEvents.go @@ -29,6 +29,8 @@ func parseEvents(ctx context.Context, events []types.Event, height types.Level, err = parseTxFees(ctx, events[i].Attributes, decodeCtx, api) case "tx.deposit": err = parseTxDeposit(events[i].Attributes, height, decodeCtx) + case "write_acknowledgement": + err = parseWriteAck(events[i].Attributes, decodeCtx) default: continue } @@ -155,3 +157,14 @@ func parseTxDeposit(attrs []types.EventAttribute, height types.Level, decodeCtx decodeCtx.AddDeposit(idx, deposit) return nil } + +func parseWriteAck(attrs []types.EventAttribute, decodeCtx *decode.Context) error { + for i := range attrs { + switch attrs[i].Key { + case "packet_ack": + decodeCtx.HasWriteAckError = strings.Contains(attrs[i].Value, "error") + default: + } + } + return nil +} diff --git a/pkg/indexer/parser/parseEvents_test.go b/pkg/indexer/parser/parseEvents_test.go index f2f3fd8..5aa019f 100644 --- a/pkg/indexer/parser/parseEvents_test.go +++ b/pkg/indexer/parser/parseEvents_test.go @@ -92,3 +92,51 @@ func Test_parseTxFee(t *testing.T) { require.EqualValues(t, "astria.protocol.transaction.v1.RollupDataSubmission", fee.ActionType) }) } + +func Test_parseWriteAck(t *testing.T) { + t.Run("test write_acknowledgement event", func(t *testing.T) { + attrs := []types.EventAttribute{ + { + Key: "packet_ack", + Value: `{\"error\":\"{\"0\": \"failed to execute ics20 transfer to bridge account\", \"1\": \"failed to parse memo as Ics20TransferDepositMemo\", \"2\": \"EOF while parsing a value at line 1 column 0\"}\"}`, + }, { + Key: "packet_data", + Value: `{"amount":"100000","denom":"uusdc","receiver":"astriacompat13vptdafyttpmlwppt0s844efey2cpc0mw6dhm2","sender":"noble1rmhdkl3aaw95zdecnj5paaqcjavm8sylftznrs"}`, + }, { + Key: "packet_sequence", + Value: "1", + }, { + Key: "packet_dst_port", + Value: "transfer", + }, + } + + decodeCtx := decode.NewContext(map[string]string{}) + err := parseWriteAck(attrs, &decodeCtx) + require.NoError(t, err) + require.True(t, decodeCtx.HasWriteAckError) + }) + + t.Run("test write_acknowledgement success event", func(t *testing.T) { + attrs := []types.EventAttribute{ + { + Key: "packet_ack", + Value: `{\"result\":\"AQ==\"}`, + }, { + Key: "packet_data", + Value: `{"amount":"100000","denom":"uusdc","receiver":"astriacompat13vptdafyttpmlwppt0s844efey2cpc0mw6dhm2","sender":"noble1rmhdkl3aaw95zdecnj5paaqcjavm8sylftznrs"}`, + }, { + Key: "packet_sequence", + Value: "1", + }, { + Key: "packet_dst_port", + Value: "transfer", + }, + } + + decodeCtx := decode.NewContext(map[string]string{}) + err := parseWriteAck(attrs, &decodeCtx) + require.NoError(t, err) + require.False(t, decodeCtx.HasWriteAckError) + }) +} diff --git a/pkg/indexer/parser/parseTxs.go b/pkg/indexer/parser/parseTxs.go index 6f64f2e..0a7c8d1 100644 --- a/pkg/indexer/parser/parseTxs.go +++ b/pkg/indexer/parser/parseTxs.go @@ -40,7 +40,7 @@ func parseTxs(ctx context.Context, b types.BlockData, decodeCtx *decode.Context, } txs[i-index] = &t - decodeCtx.ClearFee() + decodeCtx.ClearTx() } return txs, nil