From 268a5a2fc7b7f0e3f66a75a1c9db3638cec24749 Mon Sep 17 00:00:00 2001 From: Julien Tregoat Date: Tue, 7 Jan 2020 11:04:00 -0500 Subject: [PATCH 1/3] Initial TransactionReceipt implementation. --- packages/arb-provider-go/connection.go | 84 ++++++++++++++++++++++ packages/arb-provider-go/validatorProxy.go | 4 +- 2 files changed, 86 insertions(+), 2 deletions(-) diff --git a/packages/arb-provider-go/connection.go b/packages/arb-provider-go/connection.go index 3988880101..8af5b1c60d 100644 --- a/packages/arb-provider-go/connection.go +++ b/packages/arb-provider-go/connection.go @@ -171,6 +171,7 @@ func (conn *ArbConnection) SendTransaction(ctx context.Context, tx *types.Transa return err } + // TODO sendTransaction shouldn't wait for the tx to be confirmed return func() error { for { resultVal, ok, err := conn.proxy.GetMessageResult(txHash) @@ -371,3 +372,86 @@ func (sub *subscription) Unsubscribe() { func (sub *subscription) Err() <-chan error { return sub.errChan } + +/////////////////////////////////////////////////////////////////////////////// +// Methods of Deploy Backend +// CodeAt is implemented above + +// TransactionReceipt returns the receipt of a transaction by transaction hash. +// Note that the receipt is not available for pending transactions. +func (conn *ArbConnection) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) { + result, ok, err := conn.proxy.GetMessageResult(txHash.Bytes()) + if err != nil { + log.Println("TransactionReceipt error:", err) + return nil, err + } else if !ok { + // transaction was not found - throw an error? + return nil, nil + } + + processed, err := evm.ProcessLog(result) + if err != nil { + log.Println("TransactionReceipt ProcessLog error:", err) + return nil, err + } + + status := uint64(0) + var logs []evm.Log + switch res := processed.(type) { + case evm.Return: + status = 1 + logs = res.Logs + case evm.Stop: + status = 1 + logs = res.Logs + default: + // Transaction unsuccessful + } + + ethMsg := processed.GetEthMsg() + + var evmLogs []*types.Log + if logs != nil { + for i, l := range logs { + addressBytes := l.ContractID.ToBytes() + + evmParsedTopics := make([]common.Hash, len(l.Topics)) + for j, t := range l.Topics { + evmParsedTopics[j] = common.BytesToHash(t[:]) + } + + evmLogs[i] = &types.Log{ + Address: common.BytesToAddress(addressBytes[12:]), + Topics: evmParsedTopics, + Data: l.Data, + BlockNumber: ethMsg.Data.Number.Uint64(), + TxHash: txHash, + TxIndex: 0, + BlockHash: txHash, + Index: uint(i), + Removed: false, + } + } + } + + var newContractAddr common.Address + if ethMsg.Data.CallData.ContractID != nil { + newContractAddr = common.BytesToAddress(ethMsg.Data.CallData.ContractID.Bytes()[12:]) + } else { + newContractAddr = common.BytesToAddress([]byte{0}) + } + + return &types.Receipt{ + PostState: []byte{0}, + Status: status, + CumulativeGasUsed: 1, + Bloom: types.BytesToBloom([]byte{0}), + Logs: evmLogs, + TxHash: txHash, + ContractAddress: newContractAddr, + GasUsed: 1, + BlockHash: txHash, + BlockNumber: ethMsg.Data.Number, + TransactionIndex: 0, + }, nil +} diff --git a/packages/arb-provider-go/validatorProxy.go b/packages/arb-provider-go/validatorProxy.go index 1789a7e1ae..20c6a5acc0 100644 --- a/packages/arb-provider-go/validatorProxy.go +++ b/packages/arb-provider-go/validatorProxy.go @@ -166,12 +166,12 @@ func (vp *ValidatorProxyImpl) CallMessage(val value.Value, sender common.Address } retBuf, err := hexutil.Decode(response.RawVal) if err != nil { - log.Println("GetMessageResult error:", err) + log.Println("CallMessage error:", err) return nil, err } retVal, err := value.UnmarshalValue(bytes.NewReader(retBuf)) if err != nil { - log.Println("ValProxy.GetMessageResult: UnmarshalValue returned error:", err) + log.Println("ValProxy.CallMessage: UnmarshalValue returned error:", err) } return retVal, err } From 501d08c7b7d9fad5cf4740842c34b506fdc6c05d Mon Sep 17 00:00:00 2001 From: Julien Tregoat Date: Tue, 7 Jan 2020 13:23:34 -0500 Subject: [PATCH 2/3] Return an error when tx not found. Use zeroed ContractAddress. --- packages/arb-provider-go/connection.go | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/packages/arb-provider-go/connection.go b/packages/arb-provider-go/connection.go index 8af5b1c60d..7dfc513a76 100644 --- a/packages/arb-provider-go/connection.go +++ b/packages/arb-provider-go/connection.go @@ -385,8 +385,7 @@ func (conn *ArbConnection) TransactionReceipt(ctx context.Context, txHash common log.Println("TransactionReceipt error:", err) return nil, err } else if !ok { - // transaction was not found - throw an error? - return nil, nil + return nil, ethereum.NotFound } processed, err := evm.ProcessLog(result) @@ -434,13 +433,6 @@ func (conn *ArbConnection) TransactionReceipt(ctx context.Context, txHash common } } - var newContractAddr common.Address - if ethMsg.Data.CallData.ContractID != nil { - newContractAddr = common.BytesToAddress(ethMsg.Data.CallData.ContractID.Bytes()[12:]) - } else { - newContractAddr = common.BytesToAddress([]byte{0}) - } - return &types.Receipt{ PostState: []byte{0}, Status: status, @@ -448,7 +440,7 @@ func (conn *ArbConnection) TransactionReceipt(ctx context.Context, txHash common Bloom: types.BytesToBloom([]byte{0}), Logs: evmLogs, TxHash: txHash, - ContractAddress: newContractAddr, + ContractAddress: common.BytesToAddress([]byte{0}), GasUsed: 1, BlockHash: txHash, BlockNumber: ethMsg.Data.Number, From f642e13e4e2407acb351514ccaf7b4f0566c96a6 Mon Sep 17 00:00:00 2001 From: Harry Kalodner Date: Wed, 12 Feb 2020 18:31:34 -0500 Subject: [PATCH 3/3] Merge fixes --- packages/arb-provider-go/connection.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/arb-provider-go/connection.go b/packages/arb-provider-go/connection.go index 01f33d94f0..f9e746c83b 100644 --- a/packages/arb-provider-go/connection.go +++ b/packages/arb-provider-go/connection.go @@ -437,17 +437,17 @@ func (conn *ArbConnection) TransactionReceipt(ctx context.Context, txHash ethcom evmParsedTopics[j] = ethcommon.BytesToHash(t[:]) } - evmLogs[i] = &types.Log{ - Address: common.BytesToAddress(addressBytes[12:]), + evmLogs = append(evmLogs, &types.Log{ + Address: ethcommon.BytesToAddress(addressBytes[12:]), Topics: evmParsedTopics, Data: l.Data, - BlockNumber: ethMsg.Data.Number.Uint64(), + BlockNumber: ethMsg.BlockNumber.Uint64(), TxHash: txHash, TxIndex: 0, BlockHash: txHash, Index: uint(i), Removed: false, - } + }) } } @@ -458,10 +458,10 @@ func (conn *ArbConnection) TransactionReceipt(ctx context.Context, txHash ethcom Bloom: types.BytesToBloom([]byte{0}), Logs: evmLogs, TxHash: txHash, - ContractAddress: common.BytesToAddress([]byte{0}), + ContractAddress: ethcommon.BytesToAddress([]byte{0}), GasUsed: 1, BlockHash: txHash, - BlockNumber: ethMsg.Data.Number, + BlockNumber: ethMsg.BlockNumber, TransactionIndex: 0, }, nil }