diff --git a/bridge/config.json b/bridge/config.json index ca6861cc0..3ef4f4687 100644 --- a/bridge/config.json +++ b/bridge/config.json @@ -1,6 +1,6 @@ { "l1_config": { - "confirmations": "number=6", + "confirmations": "0x6", "endpoint": "https://goerli.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161", "l1_messenger_address": "0x0000000000000000000000000000000000000000", "rollup_contract_address": "0x0000000000000000000000000000000000000000", @@ -11,7 +11,7 @@ "endpoint": "/var/lib/jenkins/workspace/SequencerPipeline/MyPrivateNetwork/geth.ipc", "check_pending_time": 3, "escalate_blocks": 100, - "confirmations": "number=1", + "confirmations": "0x1", "escalate_multiple_num": 11, "escalate_multiple_den": 10, "max_gas_price": 10000000000, @@ -24,7 +24,7 @@ } }, "l2_config": { - "confirmations": "number=1", + "confirmations": "0x1", "endpoint": "/var/lib/jenkins/workspace/SequencerPipeline/MyPrivateNetwork/geth.ipc", "l2_messenger_address": "0x0000000000000000000000000000000000000000", "relayer_config": { @@ -34,7 +34,7 @@ "endpoint": "https://goerli.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161", "check_pending_time": 10, "escalate_blocks": 100, - "confirmations": "number=6", + "confirmations": "0x6", "escalate_multiple_num": 11, "escalate_multiple_den": 10, "max_gas_price": 10000000000, diff --git a/bridge/config/l1_config.go b/bridge/config/l1_config.go index 3fd5f160a..a7671cf65 100644 --- a/bridge/config/l1_config.go +++ b/bridge/config/l1_config.go @@ -1,15 +1,14 @@ package config import ( - "scroll-tech/bridge/utils" - "github.com/scroll-tech/go-ethereum/common" + "github.com/scroll-tech/go-ethereum/rpc" ) // L1Config loads l1eth configuration items. type L1Config struct { // Confirmations block height confirmations number. - Confirmations utils.ConfirmationParams `json:"confirmations"` + Confirmations rpc.BlockNumber `json:"confirmations"` // l1 eth node url. Endpoint string `json:"endpoint"` // The start height to sync event from layer 1 diff --git a/bridge/config/l2_config.go b/bridge/config/l2_config.go index bd1e3c4c6..1dbe338d2 100644 --- a/bridge/config/l2_config.go +++ b/bridge/config/l2_config.go @@ -3,7 +3,7 @@ package config import ( "encoding/json" - "scroll-tech/bridge/utils" + "github.com/scroll-tech/go-ethereum/rpc" "github.com/scroll-tech/go-ethereum/common" ) @@ -11,7 +11,7 @@ import ( // L2Config loads l2geth configuration items. type L2Config struct { // Confirmations block height confirmations number. - Confirmations utils.ConfirmationParams `json:"confirmations"` + Confirmations rpc.BlockNumber `json:"confirmations"` // l2geth node url. Endpoint string `json:"endpoint"` // The messenger contract address deployed on layer 2 chain. diff --git a/bridge/config/relayer_config.go b/bridge/config/relayer_config.go index f43625a44..5de094c1f 100644 --- a/bridge/config/relayer_config.go +++ b/bridge/config/relayer_config.go @@ -6,10 +6,9 @@ import ( "fmt" "math/big" - "scroll-tech/bridge/utils" - "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/crypto" + "github.com/scroll-tech/go-ethereum/rpc" ) // SenderConfig The config for transaction sender @@ -21,7 +20,7 @@ type SenderConfig struct { // The number of blocks to wait to escalate increase gas price of the transaction. EscalateBlocks uint64 `json:"escalate_blocks"` // The gap number between a block be confirmed and the latest block. - Confirmations utils.ConfirmationParams `json:"confirmations"` + Confirmations rpc.BlockNumber `json:"confirmations"` // The numerator of gas price escalate multiple. EscalateMultipleNum uint64 `json:"escalate_multiple_num"` // The denominator of gas price escalate multiple. diff --git a/bridge/go.mod b/bridge/go.mod index c406c723f..4f325275b 100644 --- a/bridge/go.mod +++ b/bridge/go.mod @@ -5,7 +5,7 @@ go 1.18 require ( github.com/iden3/go-iden3-crypto v0.0.13 github.com/orcaman/concurrent-map v1.0.0 - github.com/scroll-tech/go-ethereum v1.10.14-0.20230127005331-08ba436d8bb3 + github.com/scroll-tech/go-ethereum v1.10.14-0.20230210091139-8224bc8b9ca5 github.com/stretchr/testify v1.8.0 github.com/urfave/cli/v2 v2.10.2 golang.org/x/sync v0.1.0 @@ -32,7 +32,7 @@ require ( github.com/rjeczalik/notify v0.9.1 // indirect github.com/rogpeppe/go-internal v1.8.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/scroll-tech/zktrie v0.4.1 // indirect + github.com/scroll-tech/zktrie v0.4.3 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/tklauser/go-sysconf v0.3.10 // indirect github.com/tklauser/numcpus v0.4.0 // indirect diff --git a/bridge/go.sum b/bridge/go.sum index f1a83f48d..5db11b4e2 100644 --- a/bridge/go.sum +++ b/bridge/go.sum @@ -350,11 +350,10 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/scroll-tech/go-ethereum v1.10.14-0.20230127005331-08ba436d8bb3 h1:kYPsjs9hr579hMFuHXrOy0zveCLHD/kC+PGv9wnadvM= -github.com/scroll-tech/go-ethereum v1.10.14-0.20230127005331-08ba436d8bb3/go.mod h1:jurIpDQ0hqtp9//xxeWzr8X9KMP/+TYn+vz3K1wZrv0= -github.com/scroll-tech/zktrie v0.3.0/go.mod h1:CuJFlG1/soTJJBAySxCZgTF7oPvd5qF6utHOEciC43Q= -github.com/scroll-tech/zktrie v0.4.1 h1:+enbK4g6/Pj76Do6Pz+ncaqJuYczua+yhP3Phs0pD3E= -github.com/scroll-tech/zktrie v0.4.1/go.mod h1:XvNo7vAk8yxNyTjBDj5WIiFzYW4bx/gJ78+NK6Zn6Uk= +github.com/scroll-tech/go-ethereum v1.10.14-0.20230210091139-8224bc8b9ca5 h1:CvkJOFK7Zapepx6Dwyc+86dZWWypXhSP4RFJmv6EJDk= +github.com/scroll-tech/go-ethereum v1.10.14-0.20230210091139-8224bc8b9ca5/go.mod h1:OH4ZTAz6RM1IL0xcQ1zM6+Iy9s2vtcYqqwcEQdfHV7g= +github.com/scroll-tech/zktrie v0.4.3 h1:RyhusIu8F8u5ITmzqZjkAwlL6jdC9TK9i6tfuJoZcpk= +github.com/scroll-tech/zktrie v0.4.3/go.mod h1:XvNo7vAk8yxNyTjBDj5WIiFzYW4bx/gJ78+NK6Zn6Uk= github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= diff --git a/bridge/l1/watcher.go b/bridge/l1/watcher.go index 30e5303d8..a355f570b 100644 --- a/bridge/l1/watcher.go +++ b/bridge/l1/watcher.go @@ -12,6 +12,7 @@ import ( "github.com/scroll-tech/go-ethereum/ethclient" "github.com/scroll-tech/go-ethereum/log" "github.com/scroll-tech/go-ethereum/metrics" + "github.com/scroll-tech/go-ethereum/rpc" "scroll-tech/database" "scroll-tech/database/orm" @@ -43,7 +44,7 @@ type Watcher struct { db database.OrmFactory // The number of new blocks to wait for a block to be confirmed - confirmations utils.ConfirmationParams + confirmations rpc.BlockNumber messengerAddress common.Address messengerABI *abi.ABI @@ -58,7 +59,7 @@ type Watcher struct { // NewWatcher returns a new instance of Watcher. The instance will be not fully prepared, // and still needs to be finalized and ran by calling `watcher.Start`. -func NewWatcher(ctx context.Context, client *ethclient.Client, startHeight uint64, confirmations utils.ConfirmationParams, messengerAddress common.Address, rollupAddress common.Address, db database.OrmFactory) *Watcher { +func NewWatcher(ctx context.Context, client *ethclient.Client, startHeight uint64, confirmations rpc.BlockNumber, messengerAddress common.Address, rollupAddress common.Address, db database.OrmFactory) *Watcher { savedHeight, err := db.GetLayer1LatestWatchedHeight() if err != nil { log.Warn("Failed to fetch height from db", "err", err) diff --git a/bridge/l2/watcher.go b/bridge/l2/watcher.go index a7f3ea056..2a6be9a7a 100644 --- a/bridge/l2/watcher.go +++ b/bridge/l2/watcher.go @@ -15,6 +15,7 @@ import ( "github.com/scroll-tech/go-ethereum/event" "github.com/scroll-tech/go-ethereum/log" "github.com/scroll-tech/go-ethereum/metrics" + "github.com/scroll-tech/go-ethereum/rpc" bridge_abi "scroll-tech/bridge/abi" "scroll-tech/bridge/utils" @@ -45,7 +46,7 @@ type WatcherClient struct { orm database.OrmFactory - confirmations utils.ConfirmationParams + confirmations rpc.BlockNumber messengerAddress common.Address messengerABI *abi.ABI @@ -59,7 +60,7 @@ type WatcherClient struct { } // NewL2WatcherClient take a l2geth instance to generate a l2watcherclient instance -func NewL2WatcherClient(ctx context.Context, client *ethclient.Client, confirmations utils.ConfirmationParams, bpCfg *config.BatchProposerConfig, messengerAddress common.Address, orm database.OrmFactory) *WatcherClient { +func NewL2WatcherClient(ctx context.Context, client *ethclient.Client, confirmations rpc.BlockNumber, bpCfg *config.BatchProposerConfig, messengerAddress common.Address, orm database.OrmFactory) *WatcherClient { savedHeight, err := orm.GetLayer2LatestWatchedHeight() if err != nil { log.Warn("fetch height from db failed", "err", err) diff --git a/bridge/l2/watcher_test.go b/bridge/l2/watcher_test.go index 5f43338b7..c99f032e6 100644 --- a/bridge/l2/watcher_test.go +++ b/bridge/l2/watcher_test.go @@ -12,10 +12,9 @@ import ( "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/core/types" "github.com/scroll-tech/go-ethereum/ethclient" + "github.com/scroll-tech/go-ethereum/rpc" "github.com/stretchr/testify/assert" - "scroll-tech/bridge/utils" - "scroll-tech/bridge/config" "scroll-tech/bridge/mock_bridge" "scroll-tech/bridge/sender" @@ -38,7 +37,7 @@ func testCreateNewWatcherAndStop(t *testing.T) { defer rc.Stop() l1cfg := cfg.L1Config - l1cfg.RelayerConfig.SenderConfig.Confirmations = utils.ConfirmationParams{Type: utils.BlockNumberConfirmation, Number: 0} + l1cfg.RelayerConfig.SenderConfig.Confirmations = rpc.LatestBlockNumber newSender, err := sender.NewSender(context.Background(), l1cfg.RelayerConfig.SenderConfig, l1cfg.RelayerConfig.MessageSenderPrivateKeys) assert.NoError(t, err) @@ -192,7 +191,7 @@ func testFetchMultipleSentMessageInOneBlock(t *testing.T) { } func prepareRelayerClient(l2Cli *ethclient.Client, bpCfg *config.BatchProposerConfig, db database.OrmFactory, contractAddr common.Address) *WatcherClient { - confirmations := utils.ConfirmationParams{Type: utils.BlockNumberConfirmation, Number: 0} + confirmations := rpc.LatestBlockNumber return NewL2WatcherClient(context.Background(), l2Cli, confirmations, bpCfg, contractAddr, db) } diff --git a/bridge/sender/sender_test.go b/bridge/sender/sender_test.go index 50fb24071..fef86bd7b 100644 --- a/bridge/sender/sender_test.go +++ b/bridge/sender/sender_test.go @@ -14,12 +14,11 @@ import ( cmap "github.com/orcaman/concurrent-map" "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/crypto" + "github.com/scroll-tech/go-ethereum/rpc" "github.com/stretchr/testify/assert" "scroll-tech/common/docker" - "scroll-tech/bridge/utils" - "scroll-tech/bridge/config" "scroll-tech/bridge/sender" ) @@ -70,7 +69,7 @@ func testBatchSender(t *testing.T, batchSize int) { } senderCfg := cfg.L1Config.RelayerConfig.SenderConfig - senderCfg.Confirmations = utils.ConfirmationParams{Type: utils.BlockNumberConfirmation, Number: 0} + senderCfg.Confirmations = rpc.LatestBlockNumber newSender, err := sender.NewSender(context.Background(), senderCfg, privateKeys) if err != nil { t.Fatal(err) diff --git a/bridge/tests/bridge_test.go b/bridge/tests/bridge_test.go index 2da7dbf44..69e3d4cbf 100644 --- a/bridge/tests/bridge_test.go +++ b/bridge/tests/bridge_test.go @@ -6,19 +6,18 @@ import ( "math/big" "testing" - "scroll-tech/common/docker" - - "scroll-tech/bridge/utils" - - "scroll-tech/bridge/config" - "scroll-tech/bridge/mock_bridge" - "github.com/scroll-tech/go-ethereum/accounts/abi/bind" "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/core/types" "github.com/scroll-tech/go-ethereum/crypto" "github.com/scroll-tech/go-ethereum/ethclient" + "github.com/scroll-tech/go-ethereum/rpc" "github.com/stretchr/testify/assert" + + "scroll-tech/bridge/config" + "scroll-tech/bridge/mock_bridge" + + "scroll-tech/common/docker" ) var ( @@ -66,10 +65,10 @@ func setupEnv(t *testing.T) { // Load config. cfg, err = config.NewConfig("../config.json") assert.NoError(t, err) - cfg.L1Config.Confirmations = utils.ConfirmationParams{Type: utils.BlockNumberConfirmation, Number: 0} + cfg.L1Config.Confirmations = rpc.LatestBlockNumber cfg.L1Config.RelayerConfig.MessageSenderPrivateKeys = []*ecdsa.PrivateKey{messagePrivateKey} cfg.L1Config.RelayerConfig.RollupSenderPrivateKeys = []*ecdsa.PrivateKey{rollupPrivateKey} - cfg.L2Config.Confirmations = utils.ConfirmationParams{Type: utils.BlockNumberConfirmation, Number: 0} + cfg.L2Config.Confirmations = rpc.LatestBlockNumber cfg.L2Config.RelayerConfig.MessageSenderPrivateKeys = []*ecdsa.PrivateKey{messagePrivateKey} cfg.L2Config.RelayerConfig.RollupSenderPrivateKeys = []*ecdsa.PrivateKey{rollupPrivateKey} diff --git a/bridge/tests/l2_message_relay_test.go b/bridge/tests/l2_message_relay_test.go index ef74460a7..6a418d289 100644 --- a/bridge/tests/l2_message_relay_test.go +++ b/bridge/tests/l2_message_relay_test.go @@ -3,20 +3,20 @@ package tests import ( "context" "math/big" - "scroll-tech/database" - "scroll-tech/database/migrate" - "scroll-tech/database/orm" "testing" - "scroll-tech/bridge/utils" - - "scroll-tech/bridge/l1" - "scroll-tech/bridge/l2" - "github.com/scroll-tech/go-ethereum/accounts/abi/bind" "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/core/types" + "github.com/scroll-tech/go-ethereum/rpc" "github.com/stretchr/testify/assert" + + "scroll-tech/database" + "scroll-tech/database/migrate" + "scroll-tech/database/orm" + + "scroll-tech/bridge/l1" + "scroll-tech/bridge/l2" ) func testRelayL2MessageSucceed(t *testing.T) { @@ -35,7 +35,7 @@ func testRelayL2MessageSucceed(t *testing.T) { defer l2Relayer.Stop() // Create L2Watcher - confirmations := utils.ConfirmationParams{Type: utils.BlockNumberConfirmation, Number: 0} + confirmations := rpc.LatestBlockNumber l2Watcher := l2.NewL2WatcherClient(context.Background(), l2Client, confirmations, l2Cfg.BatchProposerConfig, l2Cfg.L2MessengerAddress, db) // Create L1Watcher diff --git a/bridge/utils/confirmation.go b/bridge/utils/confirmation.go index ea5d49424..db707d8b9 100644 --- a/bridge/utils/confirmation.go +++ b/bridge/utils/confirmation.go @@ -2,111 +2,24 @@ package utils import ( "context" - "encoding/json" "fmt" "math/big" - "regexp" - "strconv" "github.com/scroll-tech/go-ethereum/core/types" "github.com/scroll-tech/go-ethereum/rpc" ) -var pattern = regexp.MustCompile(`^number=(\d{1,3})$`) - -// ConfirmationType defines the type of confirmation logic used by the watcher or the relayer. -type ConfirmationType int - -const ( - // FinalizedTagConfirmation means that we consider a block confirmed based on the "finalized" Ethereum tag. - FinalizedTagConfirmation ConfirmationType = iota - - // SafeTagConfirmation means that we consider a block confirmed based on the "safe" Ethereum tag. - SafeTagConfirmation - - // BlockNumberConfirmation means that we consider a block confirmed after waiting for a certain number of blocks. - BlockNumberConfirmation -) - -// ConfirmationParams defines the confirmation configuration parameters used by the watcher or the relayer. -type ConfirmationParams struct { - // Type shows whether we confirm by specific block tags or by block number. - Type ConfirmationType - - // Number specifies the number of blocks after which a block is considered confirmed. - // This field can only be used when Type is set to Number. - Number uint64 -} - -// UnmarshalJSON implements custom JSON decoding from JSON string to ConfirmationParams. -func (c *ConfirmationParams) UnmarshalJSON(input []byte) error { - var raw string - - if err := json.Unmarshal(input, &raw); err != nil { - return err - } - - if raw == "finalized" { - c.Type = FinalizedTagConfirmation - return nil - } - - if raw == "safe" { - c.Type = SafeTagConfirmation - return nil - } - - matches := pattern.FindStringSubmatch(raw) - if len(matches) != 2 { - return fmt.Errorf("invalid configuration value for confirmations: %v", raw) - } - - number, err := strconv.Atoi(matches[1]) - if err != nil { - return fmt.Errorf("invalid configuration value for confirmations: %v", raw) - } - - c.Type = BlockNumberConfirmation - c.Number = uint64(number) - return nil -} - -// MarshalJSON implements custom JSON encoding from ConfirmationParams to JSON string. -func (c *ConfirmationParams) MarshalJSON() ([]byte, error) { - var raw string - - switch c.Type { - case FinalizedTagConfirmation: - raw = "finalized" - - case SafeTagConfirmation: - raw = "safe" - - case BlockNumberConfirmation: - raw = fmt.Sprintf("number=%d", c.Number) - - default: - return nil, fmt.Errorf("unable to marshal unknown confirmation type: %v", c.Type) - } - - return json.Marshal(&raw) -} - type ethClient interface { BlockNumber(ctx context.Context) (uint64, error) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) } -// GetLatestConfirmedBlockNumber queries the RPC provider and returns the latest -// confirmed block number according to the provided confirmation parameters. -func GetLatestConfirmedBlockNumber(ctx context.Context, client ethClient, confirmations ConfirmationParams) (uint64, error) { - switch confirmations.Type { - // use eth_getBlockByNumber and a tag - case FinalizedTagConfirmation: - case SafeTagConfirmation: +// GetLatestConfirmedBlockNumber get confirmed block number by rpc.BlockNumber type. +func GetLatestConfirmedBlockNumber(ctx context.Context, client ethClient, confirm rpc.BlockNumber) (uint64, error) { + switch true { + case confirm == rpc.SafeBlockNumber || confirm == rpc.FinalizedBlockNumber: var tag *big.Int - - if confirmations.Type == FinalizedTagConfirmation { + if confirm == rpc.FinalizedBlockNumber { tag = big.NewInt(int64(rpc.FinalizedBlockNumber)) } else { tag = big.NewInt(int64(rpc.SafeBlockNumber)) @@ -116,29 +29,28 @@ func GetLatestConfirmedBlockNumber(ctx context.Context, client ethClient, confir if err != nil { return 0, err } - - if !header.Number.IsUint64() { - return 0, fmt.Errorf("received invalid block number: %v", header.Number) + if !header.Number.IsInt64() { + return 0, fmt.Errorf("received invalid block confirm: %v", header.Number) } - return header.Number.Uint64(), nil - - // use eth_blockNumber - case BlockNumberConfirmation: + case confirm == rpc.LatestBlockNumber: number, err := client.BlockNumber(ctx) if err != nil { return 0, err } - - if number >= confirmations.Number { - return number - confirmations.Number, nil + return number, nil + case confirm.Int64() >= 0: // If it's positive integer, consider it as a certain confirm value. + number, err := client.BlockNumber(ctx) + if err != nil { + return 0, err } + cfmNum := uint64(confirm.Int64()) + if number >= cfmNum { + return number - cfmNum, nil + } return 0, nil - default: - return 0, fmt.Errorf("unknown confirmation type: %v", confirmations.Type) + return 0, fmt.Errorf("unknown confirmation type: %v", confirm) } - - return 0, nil } diff --git a/bridge/utils/confirmation_test.go b/bridge/utils/confirmation_test.go index 69a8124af..94a97f3bc 100644 --- a/bridge/utils/confirmation_test.go +++ b/bridge/utils/confirmation_test.go @@ -4,72 +4,79 @@ import ( "context" "encoding/json" "math/big" - "strings" "testing" - "scroll-tech/bridge/utils" - - "github.com/scroll-tech/go-ethereum/core/types" "github.com/stretchr/testify/assert" + + "github.com/scroll-tech/go-ethereum/common/math" + "github.com/scroll-tech/go-ethereum/core/types" + "github.com/scroll-tech/go-ethereum/rpc" + + "scroll-tech/bridge/utils" +) + +var ( + tests = []struct { + input string + mustFail bool + expected rpc.BlockNumber + }{ + {`"0x"`, true, rpc.BlockNumber(0)}, + {`"0x0"`, false, rpc.BlockNumber(0)}, + {`"0X1"`, false, rpc.BlockNumber(1)}, + {`"0x00"`, true, rpc.BlockNumber(0)}, + {`"0x01"`, true, rpc.BlockNumber(0)}, + {`"0x1"`, false, rpc.BlockNumber(1)}, + {`"0x12"`, false, rpc.BlockNumber(18)}, + {`"0x7fffffffffffffff"`, false, rpc.BlockNumber(math.MaxInt64)}, + {`"0x8000000000000000"`, true, rpc.BlockNumber(0)}, + {"0", true, rpc.BlockNumber(0)}, + {`"ff"`, true, rpc.BlockNumber(0)}, + {`"safe"`, false, rpc.SafeBlockNumber}, + {`"finalized"`, false, rpc.FinalizedBlockNumber}, + {`"pending"`, false, rpc.PendingBlockNumber}, + {`"latest"`, false, rpc.LatestBlockNumber}, + {`"earliest"`, false, rpc.EarliestBlockNumber}, + {`someString`, true, rpc.BlockNumber(0)}, + {`""`, true, rpc.BlockNumber(0)}, + {``, true, rpc.BlockNumber(0)}, + } ) func TestUnmarshalJSON(t *testing.T) { - var params utils.ConfirmationParams - - decoder := json.NewDecoder(strings.NewReader(`"finalized"`)) - decoder.DisallowUnknownFields() - err := decoder.Decode(¶ms) - assert.Nil(t, err) - assert.Equal(t, utils.FinalizedTagConfirmation, params.Type) - - decoder = json.NewDecoder(strings.NewReader(`"safe"`)) - decoder.DisallowUnknownFields() - err = decoder.Decode(¶ms) - assert.Nil(t, err) - assert.Equal(t, utils.SafeTagConfirmation, params.Type) - - decoder = json.NewDecoder(strings.NewReader(`"number=6"`)) - decoder.DisallowUnknownFields() - err = decoder.Decode(¶ms) - assert.Nil(t, err) - assert.Equal(t, utils.BlockNumberConfirmation, params.Type) - assert.Equal(t, uint64(6), params.Number) - - decoder = json.NewDecoder(strings.NewReader(`"number=999"`)) - decoder.DisallowUnknownFields() - err = decoder.Decode(¶ms) - assert.Nil(t, err) - assert.Equal(t, utils.BlockNumberConfirmation, params.Type) - assert.Equal(t, uint64(999), params.Number) - - decoder = json.NewDecoder(strings.NewReader(`"number=1000"`)) - decoder.DisallowUnknownFields() - err = decoder.Decode(¶ms) - assert.NotNil(t, err) - - decoder = json.NewDecoder(strings.NewReader(`"number=6x"`)) - decoder.DisallowUnknownFields() - err = decoder.Decode(¶ms) - assert.NotNil(t, err) - - decoder = json.NewDecoder(strings.NewReader(`"latest"`)) - decoder.DisallowUnknownFields() - err = decoder.Decode(¶ms) - assert.NotNil(t, err) + for i, test := range tests { + var num rpc.BlockNumber + err := json.Unmarshal([]byte(test.input), &num) + if test.mustFail && err == nil { + t.Errorf("Test %d should fail", i) + continue + } + if !test.mustFail && err != nil { + t.Errorf("Test %d should pass but got err: %v", i, err) + continue + } + if num != test.expected { + t.Errorf("Test %d got unexpected value, want %d, got %d", i, test.expected, num) + } + } } func TestMarshalJSON(t *testing.T) { - bytes, err := json.Marshal(&utils.ConfirmationParams{Type: utils.FinalizedTagConfirmation, Number: 6}) - assert.Nil(t, err) - assert.Equal(t, `"finalized"`, string(bytes)) + for i, test := range tests { + var num rpc.BlockNumber + want, err := json.Marshal(test.expected) + assert.Nil(t, err) + if !test.mustFail { + err = json.Unmarshal([]byte(test.input), &num) + assert.Nil(t, err) + got, err := json.Marshal(&num) + assert.Nil(t, err) + if string(want) != string(got) { + t.Errorf("Test %d got unexpected value, want %d, got %d", i, test.expected, num) - bytes, err = json.Marshal(&utils.ConfirmationParams{Type: utils.SafeTagConfirmation, Number: 6}) - assert.Nil(t, err) - assert.Equal(t, `"safe"`, string(bytes)) - - bytes, err = json.Marshal(&utils.ConfirmationParams{Type: utils.BlockNumberConfirmation, Number: 6}) - assert.Nil(t, err) - assert.Equal(t, `"number=6"`, string(bytes)) + } + } + } } type MockEthClient struct { @@ -89,12 +96,12 @@ func TestGetLatestConfirmedBlockNumber(t *testing.T) { client := MockEthClient{} client.val = 5 - confirmed, err := utils.GetLatestConfirmedBlockNumber(ctx, &client, utils.ConfirmationParams{Type: utils.BlockNumberConfirmation, Number: 6}) + confirmed, err := utils.GetLatestConfirmedBlockNumber(ctx, &client, 6) assert.Nil(t, err) assert.Equal(t, uint64(0), confirmed) client.val = 7 - confirmed, err = utils.GetLatestConfirmedBlockNumber(ctx, &client, utils.ConfirmationParams{Type: utils.BlockNumberConfirmation, Number: 6}) + confirmed, err = utils.GetLatestConfirmedBlockNumber(ctx, &client, 6) assert.Nil(t, err) assert.Equal(t, uint64(1), confirmed) } diff --git a/common/version/version.go b/common/version/version.go index 832078ea4..89f635e06 100644 --- a/common/version/version.go +++ b/common/version/version.go @@ -5,7 +5,7 @@ import ( "runtime/debug" ) -var tag = "prealpha-v12.0" +var tag = "prealpha-v13.0" var commit = func() string { if info, ok := debug.ReadBuildInfo(); ok { diff --git a/tests/integration-test/common.go b/tests/integration-test/common.go index cd20ab4c3..732b315d1 100644 --- a/tests/integration-test/common.go +++ b/tests/integration-test/common.go @@ -13,6 +13,7 @@ import ( "time" "github.com/scroll-tech/go-ethereum/crypto" + "github.com/scroll-tech/go-ethereum/rpc" "github.com/stretchr/testify/assert" "scroll-tech/database" @@ -28,8 +29,6 @@ import ( "scroll-tech/common/cmd" "scroll-tech/common/docker" - "scroll-tech/bridge/utils" - _ "scroll-tech/coordinator/cmd/app" coordinatorConfig "scroll-tech/coordinator/config" ) @@ -121,7 +120,7 @@ func runSender(t *testing.T, endpoint string) *sender.Sender { Endpoint: endpoint, CheckPendingTime: 3, EscalateBlocks: 100, - Confirmations: utils.ConfirmationParams{Type: utils.BlockNumberConfirmation, Number: 0}, + Confirmations: rpc.LatestBlockNumber, EscalateMultipleNum: 11, EscalateMultipleDen: 10, TxType: "LegacyTx",