From 5a373c6529d45c797c199ad8df7f48b1175bb77c Mon Sep 17 00:00:00 2001 From: Ardit Marku Date: Fri, 12 Jul 2024 16:06:32 +0300 Subject: [PATCH] Patch DirectCall hash calculation change --- models/events.go | 5 +++-- models/receipt.go | 2 +- models/transaction.go | 4 ++-- models/transaction_test.go | 10 +++++----- storage/pebble/transactions.go | 16 +++++++--------- 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/models/events.go b/models/events.go index 190ce3792..c3bbebcd8 100644 --- a/models/events.go +++ b/models/events.go @@ -72,11 +72,12 @@ func (c *CadenceEvents) Transactions() ([]Transaction, []*StorageReceipt, error) rcps := make([]*StorageReceipt, 0) for _, e := range c.events.Events { if isTransactionExecutedEvent(e.Value) { - tx, err := decodeTransaction(e.Value) + rcp, err := decodeReceipt(e.Value) if err != nil { return nil, nil, err } - rcp, err := decodeReceipt(e.Value) + + tx, err := decodeTransaction(e.Value, rcp.BlockNumber.Uint64()) if err != nil { return nil, nil, err } diff --git a/models/receipt.go b/models/receipt.go index 7c75596ff..e55c54b56 100644 --- a/models/receipt.go +++ b/models/receipt.go @@ -142,7 +142,7 @@ func decodeReceipt(event cadence.Event) (*StorageReceipt, error) { } } - t, err := decodeTransaction(event) + t, err := decodeTransaction(event, tx.BlockHeight) if err != nil { return nil, err } diff --git a/models/transaction.go b/models/transaction.go index c87a0a596..0665432b4 100644 --- a/models/transaction.go +++ b/models/transaction.go @@ -184,7 +184,7 @@ func (tc TransactionCall) MarshalBinary() ([]byte, error) { // decodeTransaction takes a cadence event for transaction executed // and decodes it into a Transaction interface. The concrete type // will be either a TransactionCall or a DirectCall. -func decodeTransaction(event cadence.Event) (Transaction, error) { +func decodeTransaction(event cadence.Event, evmHeight uint64) (Transaction, error) { tx, err := types.DecodeTransactionEventPayload(event) if err != nil { return nil, fmt.Errorf("failed to cadence decode transaction: %w", err) @@ -203,7 +203,7 @@ func decodeTransaction(event cadence.Event) (Transaction, error) { return nil, fmt.Errorf("failed to rlp decode direct call: %w", err) } - return DirectCall{DirectCall: directCall}, nil + return DirectCall{DirectCall: directCall, blockHeight: evmHeight}, nil } gethTx := &gethTypes.Transaction{} diff --git a/models/transaction_test.go b/models/transaction_test.go index 38933c0db..4d8e4b238 100644 --- a/models/transaction_test.go +++ b/models/transaction_test.go @@ -87,7 +87,7 @@ func createTestEvent(t *testing.T, txBinary string) (cadence.Event, *types.Resul func Test_DecodeEVMTransaction(t *testing.T) { cdcEv, _ := createTestEvent(t, evmTxBinary) - decTx, err := decodeTransaction(cdcEv) + decTx, err := decodeTransaction(cdcEv, 10) require.NoError(t, err) require.IsType(t, TransactionCall{}, decTx) @@ -133,7 +133,7 @@ func Test_DecodeEVMTransaction(t *testing.T) { func Test_DecodeDirectCall(t *testing.T) { cdcEv, _ := createTestEvent(t, directCallBinary) - decTx, err := decodeTransaction(cdcEv) + decTx, err := decodeTransaction(cdcEv, 10) require.NoError(t, err) require.IsType(t, DirectCall{}, decTx) @@ -181,7 +181,7 @@ func Test_UnmarshalTransaction(t *testing.T) { cdcEv, _ := createTestEvent(t, evmTxBinary) - tx, err := decodeTransaction(cdcEv) + tx, err := decodeTransaction(cdcEv, 10) require.NoError(t, err) encodedTx, err := tx.MarshalBinary() @@ -235,7 +235,7 @@ func Test_UnmarshalTransaction(t *testing.T) { cdcEv, _ := createTestEvent(t, directCallBinary) - tx, err := decodeTransaction(cdcEv) + tx, err := decodeTransaction(cdcEv, 10) require.NoError(t, err) encodedTx, err := tx.MarshalBinary() @@ -287,7 +287,7 @@ func Test_UnmarshalTransaction(t *testing.T) { cdcEv, _ := createTestEvent(t, directCallBinary) - tx, err := decodeTransaction(cdcEv) + tx, err := decodeTransaction(cdcEv, 10) require.NoError(t, err) encodedTx, err := tx.MarshalBinary() diff --git a/storage/pebble/transactions.go b/storage/pebble/transactions.go index de279f122..594fdac7f 100644 --- a/storage/pebble/transactions.go +++ b/storage/pebble/transactions.go @@ -1,7 +1,7 @@ package pebble import ( - "encoding/binary" + "math/big" "sync" "github.com/cockroachdb/pebble" @@ -48,15 +48,13 @@ func (t *Transactions) Get(ID common.Hash) (models.Transaction, error) { return nil, err } - // TEMP: Remove this after PreviewNet is reset. - // Needed only for backwards compatibility with the - // direct call hash calculation breaking change. - heightVal, err := t.store.get(latestCadenceHeightKey) + var evmHeight uint64 + height, err := t.store.get(receiptTxIDToHeightKey, ID.Bytes()) if err != nil { - heightVal = []byte{0, 0, 0, 0, 0, 0, 0, 0} + evmHeight = 0 + } else { + evmHeight = big.NewInt(0).SetBytes(height).Uint64() } - cadenceHeight := binary.BigEndian.Uint64(heightVal) - - return models.UnmarshalTransaction(val, cadenceHeight) + return models.UnmarshalTransaction(val, evmHeight) }