Commit 6ce13f56 authored by Conner Fromknecht's avatar Conner Fromknecht

feat: add BlockNumber method to interfaces

parent c2f92c2f
...@@ -34,10 +34,11 @@ func init() { ...@@ -34,10 +34,11 @@ func init() {
var ( var (
testPrivKey *ecdsa.PrivateKey testPrivKey *ecdsa.PrivateKey
testWalletAddr common.Address testWalletAddr common.Address
testChainID *big.Int // 1 testChainID = big.NewInt(1)
testNonce = uint64(2) testNonce = uint64(2)
testGasPrice *big.Int // 3 testGasPrice = big.NewInt(3)
testGasLimit = uint64(4) testGasLimit = uint64(4)
testBlockNumber = uint64(5)
) )
// TestCraftClearingTx asserts that CraftClearingTx produces the expected // TestCraftClearingTx asserts that CraftClearingTx produces the expected
...@@ -107,6 +108,12 @@ type clearPendingTxHarness struct { ...@@ -107,6 +108,12 @@ type clearPendingTxHarness struct {
} }
func newClearPendingTxHarness(l1ClientConfig mock.L1ClientConfig) *clearPendingTxHarness { func newClearPendingTxHarness(l1ClientConfig mock.L1ClientConfig) *clearPendingTxHarness {
if l1ClientConfig.BlockNumber == nil {
l1ClientConfig.BlockNumber = func(_ context.Context) (uint64, error) {
return testBlockNumber, nil
}
}
if l1ClientConfig.NonceAt == nil { if l1ClientConfig.NonceAt == nil {
l1ClientConfig.NonceAt = func(_ context.Context, _ common.Address, _ *big.Int) (uint64, error) { l1ClientConfig.NonceAt = func(_ context.Context, _ common.Address, _ *big.Int) (uint64, error) {
return testNonce, nil return testNonce, nil
......
...@@ -13,6 +13,9 @@ import ( ...@@ -13,6 +13,9 @@ import (
// L1ClientConfig houses the internal methods that are executed by the mock // L1ClientConfig houses the internal methods that are executed by the mock
// L1Client. Any members left as nil will panic on execution. // L1Client. Any members left as nil will panic on execution.
type L1ClientConfig struct { type L1ClientConfig struct {
// BlockNumber returns the most recent block number.
BlockNumber func(context.Context) (uint64, error)
// EstimateGas tries to estimate the gas needed to execute a specific // EstimateGas tries to estimate the gas needed to execute a specific
// transaction based on the current pending state of the backend blockchain. // transaction based on the current pending state of the backend blockchain.
// There is no guarantee that this is the true gas limit requirement as // There is no guarantee that this is the true gas limit requirement as
...@@ -50,6 +53,14 @@ func NewL1Client(cfg L1ClientConfig) *L1Client { ...@@ -50,6 +53,14 @@ func NewL1Client(cfg L1ClientConfig) *L1Client {
} }
} }
// BlockNumber returns the most recent block number.
func (c *L1Client) BlockNumber(ctx context.Context) (uint64, error) {
c.mu.RLock()
defer c.mu.RUnlock()
return c.cfg.BlockNumber(ctx)
}
// EstimateGas executes the mock EstimateGas method. // EstimateGas executes the mock EstimateGas method.
func (c *L1Client) EstimateGas(ctx context.Context, call ethereum.CallMsg) (uint64, error) { func (c *L1Client) EstimateGas(ctx context.Context, call ethereum.CallMsg) (uint64, error) {
c.mu.RLock() c.mu.RLock()
...@@ -82,6 +93,16 @@ func (c *L1Client) TransactionReceipt(ctx context.Context, txHash common.Hash) ( ...@@ -82,6 +93,16 @@ func (c *L1Client) TransactionReceipt(ctx context.Context, txHash common.Hash) (
return c.cfg.TransactionReceipt(ctx, txHash) return c.cfg.TransactionReceipt(ctx, txHash)
} }
// SetBlockNumberFunc overwrites the mock BlockNumber method.
func (c *L1Client) SetBlockNumberFunc(
f func(context.Context) (uint64, error)) {
c.mu.Lock()
defer c.mu.Unlock()
c.cfg.BlockNumber = f
}
// SetEstimateGasFunc overrwrites the mock EstimateGas method. // SetEstimateGasFunc overrwrites the mock EstimateGas method.
func (c *L1Client) SetEstimateGasFunc( func (c *L1Client) SetEstimateGasFunc(
f func(context.Context, ethereum.CallMsg) (uint64, error)) { f func(context.Context, ethereum.CallMsg) (uint64, error)) {
......
...@@ -71,6 +71,9 @@ type TxManager interface { ...@@ -71,6 +71,9 @@ type TxManager interface {
// //
// NOTE: This is a subset of bind.DeployBackend. // NOTE: This is a subset of bind.DeployBackend.
type ReceiptSource interface { type ReceiptSource interface {
// BlockNumber returns the most recent block number.
BlockNumber(ctx context.Context) (uint64, error)
// TransactionReceipt queries the backend for a receipt associated with // TransactionReceipt queries the backend for a receipt associated with
// txHash. If lookup does not fail, but the transaction is not found, // txHash. If lookup does not fail, but the transaction is not found,
// nil should be returned for both values. // nil should be returned for both values.
......
...@@ -109,6 +109,9 @@ func newTestHarness() *testHarness { ...@@ -109,6 +109,9 @@ func newTestHarness() *testHarness {
type mockBackend struct { type mockBackend struct {
mu sync.RWMutex mu sync.RWMutex
// blockHeight tracks the current height of the chain.
blockHeight uint64
// txHashMinedWithGasPrice tracks the has of a mined transaction to its // txHashMinedWithGasPrice tracks the has of a mined transaction to its
// gas price. // gas price.
txHashMinedWithGasPrice map[common.Hash]*big.Int txHashMinedWithGasPrice map[common.Hash]*big.Int
...@@ -127,9 +130,18 @@ func (b *mockBackend) mine(txHash common.Hash, gasPrice *big.Int) { ...@@ -127,9 +130,18 @@ func (b *mockBackend) mine(txHash common.Hash, gasPrice *big.Int) {
b.mu.Lock() b.mu.Lock()
defer b.mu.Unlock() defer b.mu.Unlock()
b.blockHeight++
b.txHashMinedWithGasPrice[txHash] = gasPrice b.txHashMinedWithGasPrice[txHash] = gasPrice
} }
// BlockNumber returns the most recent block number.
func (b *mockBackend) BlockNumber(ctx context.Context) (uint64, error) {
b.mu.RLock()
defer b.mu.RUnlock()
return b.blockHeight, nil
}
// TransactionReceipt queries the mockBackend for a mined txHash. If none is // TransactionReceipt queries the mockBackend for a mined txHash. If none is
// found, nil is returned for both return values. Otherwise, it retruns a // found, nil is returned for both return values. Otherwise, it retruns a
// receipt containing the txHash and the gasPrice used in the GasUsed to make // receipt containing the txHash and the gasPrice used in the GasUsed to make
...@@ -392,7 +404,19 @@ func TestWaitMinedCanBeCanceled(t *testing.T) { ...@@ -392,7 +404,19 @@ func TestWaitMinedCanBeCanceled(t *testing.T) {
// first call but a success on the second call. This allows us to test that the // first call but a success on the second call. This allows us to test that the
// inner loop of WaitMined properly handles this case. // inner loop of WaitMined properly handles this case.
type failingBackend struct { type failingBackend struct {
returnSuccess bool returnSuccessBlockNumber bool
returnSuccessReceipt bool
}
// BlockNumber for the failingBackend returns errRpcFailure on the first
// invocation and a fixed block height on subsequent calls.
func (b *failingBackend) BlockNumber(ctx context.Context) (uint64, error) {
if !b.returnSuccessBlockNumber {
b.returnSuccessBlockNumber = true
return 0, errRpcFailure
}
return 1, nil
} }
// TransactionReceipt for the failingBackend returns errRpcFailure on the first // TransactionReceipt for the failingBackend returns errRpcFailure on the first
...@@ -400,13 +424,14 @@ type failingBackend struct { ...@@ -400,13 +424,14 @@ type failingBackend struct {
func (b *failingBackend) TransactionReceipt( func (b *failingBackend) TransactionReceipt(
ctx context.Context, txHash common.Hash) (*types.Receipt, error) { ctx context.Context, txHash common.Hash) (*types.Receipt, error) {
if !b.returnSuccess { if !b.returnSuccessReceipt {
b.returnSuccess = true b.returnSuccessReceipt = true
return nil, errRpcFailure return nil, errRpcFailure
} }
return &types.Receipt{ return &types.Receipt{
TxHash: txHash, TxHash: txHash,
BlockNumber: big.NewInt(1),
}, nil }, nil
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment