diff --git a/packages/guardian-prover-health-check/.default.env b/packages/guardian-prover-health-check/.default.env index cef98351a0b..c8b2ee5a5db 100644 --- a/packages/guardian-prover-health-check/.default.env +++ b/packages/guardian-prover-health-check/.default.env @@ -1,5 +1,5 @@ HTTP_PORT=4103 -PROMETHEUS_HTTP_PORT=6062 +METRICS_HTTP_PORT=6062 DATABASE_USER=root DATABASE_PASSWORD=root DATABASE_NAME=healthcheck @@ -7,7 +7,7 @@ DATABASE_HOST=localhost:3306 DATABASE_MAX_IDLE_CONNS=50 DATABASE_MAX_OPEN_CONNS=3000 DATABASE_CONN_MAX_LIFETIME_IN_MS=100000 -GUARDIAN_PROVER_CONTRACT_ADDRESS=0x0E801D84Fa97b50751Dbf25036d067dCf18858bF -GUARDIAN_PROVER_ENDPOINTS=https://guardian-prover-1.internal.taiko.xyz,https://guardian-prover-2.internal.taiko.xyz,https://guardian-prover-3.internal.taiko.xyz,https://guardian-prover-4.internal.taiko.xyz,https://guardian-prover-5.internal.taiko.xyz -RPC_URL=wss://l1ws.internal.taiko.xyz +GUARDIAN_PROVER_CONTRACT_ADDRESS=0xDf8038e9f4535040D7421A89ead398b3A38366EC +L1_RPC_URL=wss://l1ws.internal.taiko.xyz +L2_RPC_URL=wss://ws.internal.taiko.xyz INTERVAL=12s \ No newline at end of file diff --git a/packages/guardian-prover-health-check/cmd/flags/healthcheck.go b/packages/guardian-prover-health-check/cmd/flags/healthcheck.go index 78f913e43b2..a0861296d69 100644 --- a/packages/guardian-prover-health-check/cmd/flags/healthcheck.go +++ b/packages/guardian-prover-health-check/cmd/flags/healthcheck.go @@ -8,13 +8,6 @@ import ( // required flags var ( - GuardianProverEndpoints = &cli.StringSliceFlag{ - Name: "guardianProverEndpoints", - Usage: "List of guardian prover endpoints", - Category: healthCheckCategory, - EnvVars: []string{"GUARDIAN_PROVER_ENDPOINTS"}, - Required: true, - } GuardianProverContractAddress = &cli.StringFlag{ Name: "guardianProverContractAddress", Usage: "Address of the GuardianProver contract", @@ -22,11 +15,18 @@ var ( EnvVars: []string{"GUARDIAN_PROVER_CONTRACT_ADDRESS"}, Required: true, } - RPCUrl = &cli.StringFlag{ - Name: "rpcUrl", - Usage: "RPC Url", + L1RPCUrl = &cli.StringFlag{ + Name: "l1RpcUrl", + Usage: "L1 RPC Url", + Category: healthCheckCategory, + EnvVars: []string{"L1_RPC_URL"}, + Required: true, + } + L2RPCUrl = &cli.StringFlag{ + Name: "l2RpcUrl", + Usage: "L2 RPC Url", Category: healthCheckCategory, - EnvVars: []string{"RPC_URL"}, + EnvVars: []string{"L2_RPC_URL"}, Required: true, } ) @@ -52,21 +52,13 @@ var ( Value: "*", EnvVars: []string{"HTTP_CORS_ORIGINS"}, } - Interval = &cli.DurationFlag{ - Name: "interval", - Usage: "Health check interval duration", - Category: healthCheckCategory, - Value: 12 * time.Second, - EnvVars: []string{"INTERVAL"}, - } ) var HealthCheckFlags = MergeFlags(CommonFlags, []cli.Flag{ HTTPPort, CORSOrigins, Backoff, - GuardianProverEndpoints, GuardianProverContractAddress, - Interval, - RPCUrl, + L1RPCUrl, + L2RPCUrl, }) diff --git a/packages/guardian-prover-health-check/guardianprover.go b/packages/guardian-prover-health-check/guardianprover.go index d206ee42acb..df7e3bbc6a8 100644 --- a/packages/guardian-prover-health-check/guardianprover.go +++ b/packages/guardian-prover-health-check/guardianprover.go @@ -1,14 +1,47 @@ package guardianproverhealthcheck import ( + "encoding/base64" + "errors" "math/big" - "net/url" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/prometheus/client_golang/prometheus" ) type GuardianProver struct { - Address common.Address - ID *big.Int - Endpoint *url.URL + Address common.Address + ID *big.Int + HealthCheckCounter prometheus.Counter + SignedBlockCounter prometheus.Counter +} + +func SignatureToGuardianProver( + msg []byte, + b64EncodedSig string, + guardianProvers []GuardianProver, +) (*GuardianProver, error) { + b64DecodedSig, err := base64.StdEncoding.DecodeString(b64EncodedSig) + if err != nil { + return nil, err + } + + // recover the public key from the signature + r, err := crypto.SigToPub(msg, b64DecodedSig) + if err != nil { + return nil, err + } + + // convert it to address type + recoveredAddr := crypto.PubkeyToAddress(*r) + + // see if any of our known guardian provers have that recovered address + for _, p := range guardianProvers { + if recoveredAddr.Cmp(p.Address) == 0 { + return &p, nil + } + } + + return nil, errors.New("signature does not recover to known guardian prover") } diff --git a/packages/guardian-prover-health-check/healthchecker/config.go b/packages/guardian-prover-health-check/healthchecker/config.go index 8a8eb2b648f..c16c2bbbdbf 100644 --- a/packages/guardian-prover-health-check/healthchecker/config.go +++ b/packages/guardian-prover-health-check/healthchecker/config.go @@ -3,7 +3,6 @@ package healthchecker import ( "database/sql" "strings" - "time" "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/cmd/flags" "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" @@ -30,10 +29,9 @@ type Config struct { CORSOrigins []string Backoff uint64 HTTPPort uint64 - GuardianProverEndpoints []string GuardianProverContractAddress string - RPCUrl string - Interval time.Duration + L1RPCUrl string + L2RPCUrl string OpenDBFunc func() (DB, error) } @@ -48,11 +46,10 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { DatabaseMaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), DatabaseMaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), CORSOrigins: strings.Split(c.String(flags.CORSOrigins.Name), ","), - GuardianProverEndpoints: c.StringSlice(flags.GuardianProverEndpoints.Name), GuardianProverContractAddress: c.String(flags.GuardianProverContractAddress.Name), - RPCUrl: c.String(flags.RPCUrl.Name), + L1RPCUrl: c.String(flags.L1RPCUrl.Name), + L2RPCUrl: c.String(flags.L2RPCUrl.Name), HTTPPort: c.Uint64(flags.HTTPPort.Name), - Interval: c.Duration(flags.Interval.Name), OpenDBFunc: func() (DB, error) { return db.OpenDBConnection(db.DBConnectionOpts{ Name: c.String(flags.DatabaseUsername.Name), diff --git a/packages/guardian-prover-health-check/healthchecker/config_test.go b/packages/guardian-prover-health-check/healthchecker/config_test.go index 6776e04c064..b7455dcfd4e 100644 --- a/packages/guardian-prover-health-check/healthchecker/config_test.go +++ b/packages/guardian-prover-health-check/healthchecker/config_test.go @@ -1,7 +1,6 @@ package healthchecker import ( - "strings" "testing" "github.com/stretchr/testify/assert" @@ -12,7 +11,6 @@ import ( var ( guardianProverAddress = "0x63FaC9201494f0bd17B9892B9fae4d52fe3BD377" - guardianProverEndpoints = "http://endpoint.com,http://endpoint2.com" databaseMaxIdleConns = "10" databaseMaxOpenConns = "10" databaseMaxConnLifetime = "30" @@ -40,8 +38,8 @@ func TestNewConfigFromCliContext(t *testing.T) { assert.Equal(t, "dbpass", c.DatabasePassword) assert.Equal(t, "dbname", c.DatabaseName) assert.Equal(t, "dbhost", c.DatabaseHost) - assert.Equal(t, "rpcUrl", c.RPCUrl) - assert.Equal(t, strings.Split(guardianProverEndpoints, ","), c.GuardianProverEndpoints) + assert.Equal(t, "l1RpcUrl", c.L1RPCUrl) + assert.Equal(t, "l2RpcUrl", c.L2RPCUrl) assert.Equal(t, guardianProverAddress, c.GuardianProverContractAddress) assert.Equal(t, []string{"*"}, c.CORSOrigins) assert.Equal(t, uint64(10), c.DatabaseMaxIdleConns) @@ -64,13 +62,13 @@ func TestNewConfigFromCliContext(t *testing.T) { "--" + flags.DatabasePassword.Name, "dbpass", "--" + flags.DatabaseHost.Name, "dbhost", "--" + flags.DatabaseName.Name, "dbname", - "--" + flags.RPCUrl.Name, "rpcUrl", + "--" + flags.L1RPCUrl.Name, "l1RpcUrl", + "--" + flags.L2RPCUrl.Name, "l2RpcUrl", "--" + flags.CORSOrigins.Name, "*", "--" + flags.DatabaseMaxOpenConns.Name, databaseMaxOpenConns, "--" + flags.DatabaseMaxIdleConns.Name, databaseMaxIdleConns, "--" + flags.DatabaseConnMaxLifetime.Name, databaseMaxConnLifetime, "--" + flags.HTTPPort.Name, HTTPPort, "--" + flags.GuardianProverContractAddress.Name, guardianProverAddress, - "--" + flags.GuardianProverEndpoints.Name, guardianProverEndpoints, })) } diff --git a/packages/guardian-prover-health-check/healthchecker/healthchecker.go b/packages/guardian-prover-health-check/healthchecker/healthchecker.go index 9d4c10a9314..b67623a93c7 100644 --- a/packages/guardian-prover-health-check/healthchecker/healthchecker.go +++ b/packages/guardian-prover-health-check/healthchecker/healthchecker.go @@ -2,22 +2,19 @@ package healthchecker import ( "context" - "encoding/base64" - "encoding/json" "errors" "fmt" - "io" "log/slog" "math/big" "net/http" - "net/url" - "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" "github.com/labstack/echo/v4" + "github.com/labstack/gommon/log" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/bindings/guardianprover" hchttp "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/http" @@ -25,15 +22,10 @@ import ( "github.com/urfave/cli/v2" ) -var ( - msg = crypto.Keccak256Hash([]byte("HEART_BEAT")).Bytes() -) - type HealthChecker struct { ctx context.Context cancelCtx context.CancelFunc healthCheckRepo guardianproverhealthcheck.HealthCheckRepository - interval time.Duration guardianProverContract *guardianprover.GuardianProver numGuardians uint64 guardianProvers []guardianproverhealthcheck.GuardianProver @@ -41,11 +33,6 @@ type HealthChecker struct { httpPort uint64 } -type healthCheckResponse struct { - ProverAddress string `json:"prover"` - HeartBeatSignature string `json:"heartBeatSignature"` -} - func (h *HealthChecker) Name() string { return "healthchecker" } @@ -78,19 +65,29 @@ func InitFromConfig(ctx context.Context, h *HealthChecker, cfg *Config) (err err return err } + signedBlockRepo, err := repo.NewSignedBlockRepository(db) + if err != nil { + return err + } + statRepo, err := repo.NewStatRepository(db) if err != nil { return err } - ethClient, err := ethclient.Dial(cfg.RPCUrl) + l1EthClient, err := ethclient.Dial(cfg.L1RPCUrl) + if err != nil { + return err + } + + l2EthClient, err := ethclient.Dial(cfg.L2RPCUrl) if err != nil { return err } guardianProverContract, err := guardianprover.NewGuardianProver( common.HexToAddress(cfg.GuardianProverContractAddress), - ethClient, + l1EthClient, ) if err != nil { return err @@ -114,22 +111,28 @@ func InitFromConfig(ctx context.Context, h *HealthChecker, cfg *Config) (err err return err } - endpoint, err := url.Parse(cfg.GuardianProverEndpoints[i]) - if err != nil { - return err - } + log.Info("setting guardian prover address", "address", guardianAddress.Hex(), "id", guardianId.Uint64()) guardianProvers = append(guardianProvers, guardianproverhealthcheck.GuardianProver{ - Address: guardianAddress, - ID: guardianId, - Endpoint: endpoint, + Address: guardianAddress, + ID: guardianId, + HealthCheckCounter: promauto.NewCounter(prometheus.CounterOpts{ + Name: fmt.Sprintf("guardian_prover_%v_health_checks_ops_total", guardianId.Uint64()), + Help: "The total number of health checks", + }), + SignedBlockCounter: promauto.NewCounter(prometheus.CounterOpts{ + Name: fmt.Sprintf("guardian_prover_%v_signed_block_ops_total", guardianId.Uint64()), + Help: "The total number of signed blocks", + }), }) } h.httpSrv, err = hchttp.NewServer(hchttp.NewServerOpts{ Echo: echo.New(), + EthClient: l2EthClient, HealthCheckRepo: healthCheckRepo, StatRepo: statRepo, + SignedBlockRepo: signedBlockRepo, GuardianProvers: guardianProvers, }) @@ -140,7 +143,6 @@ func InitFromConfig(ctx context.Context, h *HealthChecker, cfg *Config) (err err h.guardianProvers = guardianProvers h.numGuardians = numGuardians.Uint64() h.healthCheckRepo = healthCheckRepo - h.interval = cfg.Interval h.guardianProverContract = guardianProverContract h.httpPort = cfg.HTTPPort @@ -156,109 +158,5 @@ func (h *HealthChecker) Start() error { } }() - go h.checkGuardianProversOnInterval() - return nil } - -func (h *HealthChecker) checkGuardianProversOnInterval() { - t := time.NewTicker(h.interval) - - for { - select { - case <-h.ctx.Done(): - return - case <-t.C: - for _, g := range h.guardianProvers { - resp, recoveredAddr, err := h.checkGuardianProver(g) - if err != nil { - slog.Error( - "error checking guardian prover endpoint", - "endpoint", g.Endpoint, - "id", g.ID, - "address", g.Address.Hex(), - "recoveredAddr", recoveredAddr, - "error", err, - ) - } - - var sig string = "" - - if resp != nil { - sig = resp.HeartBeatSignature - } - - err = h.healthCheckRepo.Save( - guardianproverhealthcheck.SaveHealthCheckOpts{ - GuardianProverID: g.ID.Uint64(), - Alive: sig != "", - ExpectedAddress: g.Address.Hex(), - RecoveredAddress: recoveredAddr, - SignedResponse: sig, - }, - ) - - if err != nil { - slog.Error("error saving failed health check to database", - "endpoint", g.Endpoint, - "id", g.ID, - "address", g.Address.Hex(), - "recoveredAddr", recoveredAddr, - "sig", sig, - "error", err, - ) - } else { - slog.Info("saved health check to database", - "endpoint", g.Endpoint, - "id", g.ID, - "address", g.Address.Hex(), - "recoveredAddr", recoveredAddr, - "sig", sig, - ) - } - } - } - } -} - -func (h *HealthChecker) checkGuardianProver( - g guardianproverhealthcheck.GuardianProver, -) (*healthCheckResponse, string, error) { - slog.Info("checking guardian prover", "id", g.ID, "endpoint", g.Endpoint) - - healthCheckResponse := &healthCheckResponse{} - - resp, err := http.Get(g.Endpoint.String() + "/status") - if err != nil { - // save fail to db - return healthCheckResponse, "", err - } - - b, err := io.ReadAll(resp.Body) - if err != nil { - return healthCheckResponse, "", err - } - - if err := json.Unmarshal(b, healthCheckResponse); err != nil { - return healthCheckResponse, "", err - } - - if g.Address.Cmp(common.HexToAddress(healthCheckResponse.ProverAddress)) != 0 { - slog.Error("address mismatch", "expected", g.Address.Hex(), "received", healthCheckResponse.ProverAddress) - return healthCheckResponse, "", errors.New("prover address provided was not the address expected") - } - - b64DecodedSig, err := base64.StdEncoding.DecodeString(healthCheckResponse.HeartBeatSignature) - if err != nil { - return healthCheckResponse, "", err - } - - pubKey, err := crypto.SigToPub(msg, b64DecodedSig) - if err != nil { - return healthCheckResponse, "", err - } - - recoveredAddr := crypto.PubkeyToAddress(*pubKey) - - return healthCheckResponse, recoveredAddr.Hex(), nil -} diff --git a/packages/guardian-prover-health-check/http/get_signed_blocks.go b/packages/guardian-prover-health-check/http/get_signed_blocks.go new file mode 100644 index 00000000000..0cbeeaa2340 --- /dev/null +++ b/packages/guardian-prover-health-check/http/get_signed_blocks.go @@ -0,0 +1,112 @@ +package http + +import ( + "math/big" + "net/http" + "strconv" + + echo "github.com/labstack/echo/v4" + "github.com/labstack/gommon/log" + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" +) + +var ( + numBlocks uint64 = 100 +) + +type block struct { + BlockHash string `json:"blockHash"` + Signature string `json:"signature"` + GuardianProverID uint64 `json:"guardianProverID"` +} + +// map of blockID to signed block data +type blockResponse map[uint64][]block + +// GetSignedBlocks +// +// returns signed block data by each guardian prover. +// +// @Summary Get signed blocks +// @ID get-signed-blocks +// @Accept json +// @Produce json +// @Success 200 {object} blockResponse +// @Router /signedBlocks[get] + +func (srv *Server) GetSignedBlocks(c echo.Context) error { + // getSignedBlocks should rewind either startingBlockID - numBlocksToReturn if startingBlockID + // is passed in, but it is optional, so if it is not, we should get latest and rewind from + // there. + var start uint64 = 0 + + if c.QueryParam("start") != "" { + var err error + + start, err = strconv.ParseUint(c.QueryParam("start"), 10, 64) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, err) + } + } + + // if no start timestamp was provided, we can get the latest block, and return + // defaultNumBlocksToReturn blocks signed before latest, if our guardian prover has signed them. + if start == 0 { + latestBlock, err := srv.ethClient.BlockByNumber(c.Request().Context(), nil) + if err != nil { + if err != nil { + log.Error("Failed to get latest L2 block", "error", err) + return echo.NewHTTPError(http.StatusInternalServerError, err) + } + } + + // if latestBlock is greater than the number of blocks to return, we only want to return + // the most recent N blocks signed by this guardian prover. + if latestBlock.NumberU64() > numBlocks { + blockNum := latestBlock.NumberU64() - numBlocks + + block, err := srv.ethClient.BlockByNumber( + c.Request().Context(), + new(big.Int).SetUint64(blockNum), + ) + if err != nil { + log.Error("Failed to get L2 block", "error", err, "blockNum", blockNum) + return echo.NewHTTPError(http.StatusInternalServerError, err) + } + + start = block.NumberU64() + } + } + + signedBlocks, err := srv.signedBlockRepo.GetByStartingBlockID( + guardianproverhealthcheck.GetSignedBlocksByStartingBlockIDOpts{ + StartingBlockID: start, + }, + ) + + if err != nil { + log.Error("Failed to get latest L2 block", "error", err) + return echo.NewHTTPError(http.StatusInternalServerError, err) + } + + // sort signed blocks for easier to consume data + blocks := make(blockResponse) + // then iterate over each one and create a more easily parsable api response + // for the frontend to consume, arranged by a mapping of block ID + // to the signed blocks for each prover by that block ID. + for _, v := range signedBlocks { + b := block{ + GuardianProverID: v.GuardianProverID, + BlockHash: v.BlockHash, + Signature: v.Signature, + } + + if _, ok := blocks[v.BlockID]; !ok { + blocks[v.BlockID] = make([]block, 0) + } + + blocks[v.BlockID] = append(blocks[v.BlockID], b) + } + + return c.JSON(http.StatusOK, blocks) +} diff --git a/packages/guardian-prover-health-check/http/post_health_check.go b/packages/guardian-prover-health-check/http/post_health_check.go new file mode 100644 index 00000000000..fc8742d0856 --- /dev/null +++ b/packages/guardian-prover-health-check/http/post_health_check.go @@ -0,0 +1,75 @@ +package http + +import ( + "log/slog" + "net/http" + + "github.com/ethereum/go-ethereum/crypto" + echo "github.com/labstack/echo/v4" + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" +) + +var ( + msg = crypto.Keccak256Hash([]byte("HEART_BEAT")).Bytes() +) + +type healthCheckReq struct { + ProverAddress string `json:"prover"` + HeartBeatSignature string `json:"heartBeatSignature"` +} + +// PostHealthCheck +// +// post a health check from a guardian prover +// +// @Summary Post healthcheck +// @ID post-health-check +// @Accept json +// @Produce json +// @Success 200 null +// @Router /healthCheck [post] + +func (srv *Server) PostHealthCheck(c echo.Context) error { + req := &healthCheckReq{} + + // bind incoming request + if err := c.Bind(req); err != nil { + return c.JSON(http.StatusBadRequest, err) + } + + recoveredGuardianProver, err := guardianproverhealthcheck.SignatureToGuardianProver( + msg, + req.HeartBeatSignature, + srv.guardianProvers, + ) + + // if not, we want to return an error + if err != nil { + return c.JSON(http.StatusBadRequest, err) + } + + // otherwise, we can store it in the database. + // expected address and recovered address will be the same until we have an auth + // mechanism which will allow us to store health checks that ecrecover to an unexpected + // address. + if err := srv.healthCheckRepo.Save(guardianproverhealthcheck.SaveHealthCheckOpts{ + GuardianProverID: recoveredGuardianProver.ID.Uint64(), + Alive: true, + ExpectedAddress: recoveredGuardianProver.Address.Hex(), + RecoveredAddress: recoveredGuardianProver.Address.Hex(), + SignedResponse: req.HeartBeatSignature, + }); err != nil { + return c.JSON(http.StatusBadRequest, err) + } + + // increment health check metric + for _, v := range srv.guardianProvers { + if v.Address.Hex() == recoveredGuardianProver.Address.Hex() { + v.HealthCheckCounter.Inc() + } + } + + slog.Info("successful health check", "guardianProver", recoveredGuardianProver.Address.Hex()) + + return c.JSON(http.StatusOK, nil) +} diff --git a/packages/guardian-prover-health-check/http/post_signed_block.go b/packages/guardian-prover-health-check/http/post_signed_block.go new file mode 100644 index 00000000000..421aadd3350 --- /dev/null +++ b/packages/guardian-prover-health-check/http/post_signed_block.go @@ -0,0 +1,73 @@ +package http + +import ( + "log/slog" + "net/http" + + "github.com/ethereum/go-ethereum/common" + echo "github.com/labstack/echo/v4" + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" +) + +type signedBlock struct { + BlockID uint64 `json:"blockID"` + BlockHash string `json:"blockHash"` + Signature string `json:"signature"` + Prover common.Address `json:"proverAddress"` +} + +// PostSignedBlock +// +// post a signed block to store in the database +// +// @Summary Post signed block +// @ID post-signed-block +// @Accept json +// @Produce json +// @Success 200 null +// @Router /signedBlock [post] + +func (srv *Server) PostSignedBlock(c echo.Context) error { + req := &signedBlock{} + + // bind incoming request + if err := c.Bind(req); err != nil { + slog.Error("error binding request", "error", err) + return c.JSON(http.StatusBadRequest, err) + } + + recoveredGuardianProver, err := guardianproverhealthcheck.SignatureToGuardianProver( + common.HexToHash(req.BlockHash).Bytes(), + req.Signature, + srv.guardianProvers, + ) + + // if not, we want to return an error + if err != nil { + slog.Error("error recovering guardian prover", "error", err) + return c.JSON(http.StatusBadRequest, err) + } + + // otherwise, we can store it in the database. + if err := srv.signedBlockRepo.Save(guardianproverhealthcheck.SaveSignedBlockOpts{ + GuardianProverID: recoveredGuardianProver.ID.Uint64(), + BlockID: req.BlockID, + BlockHash: req.BlockHash, + Signature: req.Signature, + RecoveredAddress: recoveredGuardianProver.Address.Hex(), + }); err != nil { + slog.Error("error saving signed block to db", "error", err) + return c.JSON(http.StatusBadRequest, err) + } + + // increment signed block metric + for _, v := range srv.guardianProvers { + if v.Address.Hex() == recoveredGuardianProver.Address.Hex() { + v.SignedBlockCounter.Inc() + } + } + + slog.Info("successful signed block", "guardianProver", recoveredGuardianProver.Address.Hex()) + + return c.JSON(http.StatusOK, nil) +} diff --git a/packages/guardian-prover-health-check/http/post_signed_block_test.go b/packages/guardian-prover-health-check/http/post_signed_block_test.go new file mode 100644 index 00000000000..88e10bdf4b7 --- /dev/null +++ b/packages/guardian-prover-health-check/http/post_signed_block_test.go @@ -0,0 +1,46 @@ +package http + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/cyberhorsey/webutils/testutils" + "github.com/labstack/echo/v4" +) + +func Test_PostSignedBlock(t *testing.T) { + srv := newTestServer("") + + tests := []struct { + name string + body signedBlock + wantStatus int + }{ + { + "signatureNotRecoverableToGuardianProverAddress", + signedBlock{ + BlockID: 1, + BlockHash: "0x123", + Signature: "0x123", + }, + http.StatusBadRequest, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + req := testutils.NewUnauthenticatedRequest( + echo.POST, + "/signedBlock", + tt.body, + ) + + rec := httptest.NewRecorder() + + srv.ServeHTTP(rec, req) + + testutils.AssertStatusAndBody(t, rec, tt.wantStatus, []string{}) + }) + } +} diff --git a/packages/guardian-prover-health-check/http/routes.go b/packages/guardian-prover-health-check/http/routes.go index 4148c8128c7..8cb96da3a3c 100644 --- a/packages/guardian-prover-health-check/http/routes.go +++ b/packages/guardian-prover-health-check/http/routes.go @@ -14,5 +14,9 @@ func (srv *Server) configureRoutes() { srv.echo.GET("/stats/:id", srv.GetStatsByGuardianProverID) - srv.echo.GET("/signedBlocks", srv.GetBlocks) + srv.echo.GET("/signedBlocks", srv.GetSignedBlocks) + + srv.echo.POST("/signedBlock", srv.PostSignedBlock) + + srv.echo.POST("/healthCheck", srv.PostHealthCheck) } diff --git a/packages/guardian-prover-health-check/http/server.go b/packages/guardian-prover-health-check/http/server.go index 6da9945115e..8815b46ab52 100644 --- a/packages/guardian-prover-health-check/http/server.go +++ b/packages/guardian-prover-health-check/http/server.go @@ -5,6 +5,7 @@ import ( "net/http" "os" + "github.com/ethereum/go-ethereum/ethclient" "github.com/labstack/echo/v4/middleware" guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" @@ -25,14 +26,18 @@ import ( // Server represents an guardian prover health check http server instance. type Server struct { echo *echo.Echo + ethClient *ethclient.Client healthCheckRepo guardianproverhealthcheck.HealthCheckRepository + signedBlockRepo guardianproverhealthcheck.SignedBlockRepository statRepo guardianproverhealthcheck.StatRepository guardianProvers []guardianproverhealthcheck.GuardianProver } type NewServerOpts struct { Echo *echo.Echo + EthClient *ethclient.Client HealthCheckRepo guardianproverhealthcheck.HealthCheckRepository + SignedBlockRepo guardianproverhealthcheck.SignedBlockRepository StatRepo guardianproverhealthcheck.StatRepository CorsOrigins []string GuardianProvers []guardianproverhealthcheck.GuardianProver @@ -41,9 +46,11 @@ type NewServerOpts struct { func NewServer(opts NewServerOpts) (*Server, error) { srv := &Server{ echo: opts.Echo, + ethClient: opts.EthClient, healthCheckRepo: opts.HealthCheckRepo, statRepo: opts.StatRepo, guardianProvers: opts.GuardianProvers, + signedBlockRepo: opts.SignedBlockRepo, } corsOrigins := opts.CorsOrigins diff --git a/packages/guardian-prover-health-check/http/server_test.go b/packages/guardian-prover-health-check/http/server_test.go index 564c131b2e5..c71717e7e83 100644 --- a/packages/guardian-prover-health-check/http/server_test.go +++ b/packages/guardian-prover-health-check/http/server_test.go @@ -20,6 +20,7 @@ func newTestServer(url string) *Server { echo: echo.New(), healthCheckRepo: mock.NewHealthCheckRepository(), statRepo: mock.NewStatRepository(), + signedBlockRepo: mock.NewSignedBlockRepository(), guardianProvers: make([]guardianproverhealthcheck.GuardianProver, 0), } diff --git a/packages/guardian-prover-health-check/migrations/1666651001_create_signed_blocks_table.sql b/packages/guardian-prover-health-check/migrations/1666651001_create_signed_blocks_table.sql new file mode 100644 index 00000000000..ac768258fc8 --- /dev/null +++ b/packages/guardian-prover-health-check/migrations/1666651001_create_signed_blocks_table.sql @@ -0,0 +1,20 @@ +-- +goose Up +-- +goose StatementBegin +CREATE TABLE IF NOT EXISTS signed_blocks ( + id int NOT NULL PRIMARY KEY AUTO_INCREMENT, + guardian_prover_id int NOT NULL, + block_id int NOT NULL, + signature varchar(5000) NOT NULL, + block_hash VARCHAR(255) NOT NULL, + recovered_address varchar(42) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + UNIQUE key `guardian_prover_id_block_id` (`guardian_prover_id`, `block_id`), + UNIQUE key `guardian_prover_id_block_hash` (`guardian_prover_id`, `block_hash`) +); + +-- +goose StatementEnd +-- +goose Down +-- +goose StatementBegin +DROP TABLE signed_blocks; +-- +goose StatementEnd \ No newline at end of file diff --git a/packages/guardian-prover-health-check/mock/signed_block_repo.go b/packages/guardian-prover-health-check/mock/signed_block_repo.go new file mode 100644 index 00000000000..1d942f58a0e --- /dev/null +++ b/packages/guardian-prover-health-check/mock/signed_block_repo.go @@ -0,0 +1,42 @@ +package mock + +import ( + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" +) + +type SignedBlockRepo struct { + signedBlocks []*guardianproverhealthcheck.SignedBlock +} + +func NewSignedBlockRepository() *SignedBlockRepo { + return &SignedBlockRepo{ + signedBlocks: make([]*guardianproverhealthcheck.SignedBlock, 0), + } +} + +func (r *SignedBlockRepo) Save(opts guardianproverhealthcheck.SaveSignedBlockOpts) error { + r.signedBlocks = append(r.signedBlocks, &guardianproverhealthcheck.SignedBlock{ + GuardianProverID: opts.GuardianProverID, + BlockID: opts.BlockID, + BlockHash: opts.BlockHash, + Signature: opts.Signature, + RecoveredAddress: opts.RecoveredAddress, + }, + ) + + return nil +} + +func (r *SignedBlockRepo) GetByStartingBlockID( + opts guardianproverhealthcheck.GetSignedBlocksByStartingBlockIDOpts, +) ([]*guardianproverhealthcheck.SignedBlock, error) { + sb := make([]*guardianproverhealthcheck.SignedBlock, 0) + + for _, v := range r.signedBlocks { + if v.BlockID >= opts.StartingBlockID { + sb = append(sb, v) + } + } + + return sb, nil +} diff --git a/packages/guardian-prover-health-check/repo/signed_block.go b/packages/guardian-prover-health-check/repo/signed_block.go new file mode 100644 index 00000000000..acab3ca4252 --- /dev/null +++ b/packages/guardian-prover-health-check/repo/signed_block.go @@ -0,0 +1,51 @@ +package repo + +import ( + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" + "gorm.io/gorm" +) + +type SignedBlockRepository struct { + db DB +} + +func NewSignedBlockRepository(db DB) (*SignedBlockRepository, error) { + if db == nil { + return nil, ErrNoDB + } + + return &SignedBlockRepository{ + db: db, + }, nil +} + +func (r *SignedBlockRepository) startQuery() *gorm.DB { + return r.db.GormDB().Table("signed_blocks") +} + +func (r *SignedBlockRepository) Save(opts guardianproverhealthcheck.SaveSignedBlockOpts) error { + b := &guardianproverhealthcheck.SignedBlock{ + GuardianProverID: opts.GuardianProverID, + BlockID: opts.BlockID, + BlockHash: opts.BlockHash, + RecoveredAddress: opts.RecoveredAddress, + Signature: opts.Signature, + } + if err := r.startQuery().Create(b).Error; err != nil { + return err + } + + return nil +} + +func (r *SignedBlockRepository) GetByStartingBlockID( + opts guardianproverhealthcheck.GetSignedBlocksByStartingBlockIDOpts, +) ([]*guardianproverhealthcheck.SignedBlock, error) { + var sb []*guardianproverhealthcheck.SignedBlock + + if err := r.startQuery().Where("block_id >= ?", opts.StartingBlockID).Find(&sb).Error; err != nil { + return nil, err + } + + return sb, nil +} diff --git a/packages/guardian-prover-health-check/repo/signed_block_test.go b/packages/guardian-prover-health-check/repo/signed_block_test.go new file mode 100644 index 00000000000..2c94c50adc4 --- /dev/null +++ b/packages/guardian-prover-health-check/repo/signed_block_test.go @@ -0,0 +1,69 @@ +package repo + +import ( + "testing" + + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" + "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" + "gopkg.in/go-playground/assert.v1" +) + +func Test_NewSignedBlockRepo(t *testing.T) { + tests := []struct { + name string + db DB + wantErr error + }{ + { + "success", + &db.DB{}, + nil, + }, + { + "noDb", + nil, + ErrNoDB, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := NewSignedBlockRepository(tt.db) + assert.Equal(t, tt.wantErr, err) + }) + } +} + +func TestIntegration_SignedBlock_Save(t *testing.T) { + db, close, err := testMysql(t) + assert.Equal(t, nil, err) + + defer close() + + SignedBlockRepo, err := NewSignedBlockRepository(db) + assert.Equal(t, nil, err) + tests := []struct { + name string + opts guardianproverhealthcheck.SaveSignedBlockOpts + wantErr error + }{ + { + "success", + guardianproverhealthcheck.SaveSignedBlockOpts{ + GuardianProverID: 1, + RecoveredAddress: "0x123", + Signature: "0x456", + BlockID: 1, + BlockHash: "0x987", + }, + nil, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err = SignedBlockRepo.Save(tt.opts) + assert.Equal(t, tt.wantErr, err) + }) + } +} diff --git a/packages/guardian-prover-health-check/signed_block.go b/packages/guardian-prover-health-check/signed_block.go new file mode 100644 index 00000000000..537ba61457e --- /dev/null +++ b/packages/guardian-prover-health-check/signed_block.go @@ -0,0 +1,33 @@ +package guardianproverhealthcheck + +import ( + "time" +) + +type SignedBlock struct { + GuardianProverID uint64 `json:"guardianProverID"` + BlockID uint64 `json:"blockID"` + BlockHash string `json:"blockHash"` + Signature string `json:"signature"` + RecoveredAddress string `json:"recoveredAddress"` + CreatedAt time.Time `jsom:"createdAt"` +} + +type SaveSignedBlockOpts struct { + GuardianProverID uint64 + BlockID uint64 + BlockHash string + Signature string + RecoveredAddress string +} + +type GetSignedBlocksByStartingBlockIDOpts struct { + StartingBlockID uint64 +} + +// SignedBlockRepository defines database interaction methods to create and get +// signed blocks submitted by guardian provers. +type SignedBlockRepository interface { + Save(opts SaveSignedBlockOpts) error + GetByStartingBlockID(opts GetSignedBlocksByStartingBlockIDOpts) ([]*SignedBlock, error) +} diff --git a/packages/protocol/contracts/4844/BlobHashReader.yulp b/packages/protocol/contracts/4844/BlobHashReader.yulp index 7490d5c1c8f..27fab8646ba 100644 --- a/packages/protocol/contracts/4844/BlobHashReader.yulp +++ b/packages/protocol/contracts/4844/BlobHashReader.yulp @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz // An implemenatation of IBlobHashReader object "BlobHashReader" { diff --git a/packages/protocol/contracts/4844/IBlobHashReader.sol b/packages/protocol/contracts/4844/IBlobHashReader.sol index 49a9da97508..202c11bfe28 100644 --- a/packages/protocol/contracts/4844/IBlobHashReader.sol +++ b/packages/protocol/contracts/4844/IBlobHashReader.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/4844/Lib4844.sol b/packages/protocol/contracts/4844/Lib4844.sol index 2f47308649e..a070f55858e 100644 --- a/packages/protocol/contracts/4844/Lib4844.sol +++ b/packages/protocol/contracts/4844/Lib4844.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/ITaikoL1.sol b/packages/protocol/contracts/L1/ITaikoL1.sol index 358082dcc09..46aac217bef 100644 --- a/packages/protocol/contracts/L1/ITaikoL1.sol +++ b/packages/protocol/contracts/L1/ITaikoL1.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index fa61f9399e8..6877b7c11c0 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/TaikoErrors.sol b/packages/protocol/contracts/L1/TaikoErrors.sol index c946c6720dd..52c6a25e53a 100644 --- a/packages/protocol/contracts/L1/TaikoErrors.sol +++ b/packages/protocol/contracts/L1/TaikoErrors.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/TaikoEvents.sol b/packages/protocol/contracts/L1/TaikoEvents.sol index 332f66dbc8d..4185e56a049 100644 --- a/packages/protocol/contracts/L1/TaikoEvents.sol +++ b/packages/protocol/contracts/L1/TaikoEvents.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 59a361982a2..948eb385547 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/TaikoToken.sol b/packages/protocol/contracts/L1/TaikoToken.sol index c55c02fc626..5c06bc856b7 100644 --- a/packages/protocol/contracts/L1/TaikoToken.sol +++ b/packages/protocol/contracts/L1/TaikoToken.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/gov/TaikoGovernor.sol b/packages/protocol/contracts/L1/gov/TaikoGovernor.sol index f2614364e87..8688d42dfee 100644 --- a/packages/protocol/contracts/L1/gov/TaikoGovernor.sol +++ b/packages/protocol/contracts/L1/gov/TaikoGovernor.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/gov/TaikoTimelockController.sol b/packages/protocol/contracts/L1/gov/TaikoTimelockController.sol index 3c01f8d5dfe..e1457b55ea8 100644 --- a/packages/protocol/contracts/L1/gov/TaikoTimelockController.sol +++ b/packages/protocol/contracts/L1/gov/TaikoTimelockController.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol index 14e5b42fb79..4241a4c03df 100644 --- a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol +++ b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/hooks/IHook.sol b/packages/protocol/contracts/L1/hooks/IHook.sol index a042fe15511..d0c403e64c2 100644 --- a/packages/protocol/contracts/L1/hooks/IHook.sol +++ b/packages/protocol/contracts/L1/hooks/IHook.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/libs/LibDepositing.sol b/packages/protocol/contracts/L1/libs/LibDepositing.sol index adc615bd6cd..5a933186970 100644 --- a/packages/protocol/contracts/L1/libs/LibDepositing.sol +++ b/packages/protocol/contracts/L1/libs/LibDepositing.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index a1d3f9c0496..ada8cefa5a9 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 5cf4f92f9f0..3303fa4d05e 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol index c2ff829675c..9dc9d3ec5a6 100644 --- a/packages/protocol/contracts/L1/libs/LibUtils.sol +++ b/packages/protocol/contracts/L1/libs/LibUtils.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index 4950cdcdcad..255261dc2d5 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/provers/GuardianProver.sol b/packages/protocol/contracts/L1/provers/GuardianProver.sol index 43d2bc988ff..70db9454b04 100644 --- a/packages/protocol/contracts/L1/provers/GuardianProver.sol +++ b/packages/protocol/contracts/L1/provers/GuardianProver.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/provers/Guardians.sol b/packages/protocol/contracts/L1/provers/Guardians.sol index 664e8ddbcab..d9799f93cfe 100644 --- a/packages/protocol/contracts/L1/provers/Guardians.sol +++ b/packages/protocol/contracts/L1/provers/Guardians.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/tiers/ITierProvider.sol b/packages/protocol/contracts/L1/tiers/ITierProvider.sol index 96f97657c8d..baaf312dad3 100644 --- a/packages/protocol/contracts/L1/tiers/ITierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/ITierProvider.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/tiers/TaikoA6TierProvider.sol b/packages/protocol/contracts/L1/tiers/TaikoA6TierProvider.sol index e7043bc395f..e2dc81de045 100644 --- a/packages/protocol/contracts/L1/tiers/TaikoA6TierProvider.sol +++ b/packages/protocol/contracts/L1/tiers/TaikoA6TierProvider.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/verifiers/GuardianVerifier.sol b/packages/protocol/contracts/L1/verifiers/GuardianVerifier.sol index f3f573cb636..19278f452d7 100644 --- a/packages/protocol/contracts/L1/verifiers/GuardianVerifier.sol +++ b/packages/protocol/contracts/L1/verifiers/GuardianVerifier.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/verifiers/IVerifier.sol b/packages/protocol/contracts/L1/verifiers/IVerifier.sol index 53408da976a..409f55914b1 100644 --- a/packages/protocol/contracts/L1/verifiers/IVerifier.sol +++ b/packages/protocol/contracts/L1/verifiers/IVerifier.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/verifiers/PlonkVerifier.yulp b/packages/protocol/contracts/L1/verifiers/PlonkVerifier.yulp index 570e425c7dc..4a916812db0 100644 --- a/packages/protocol/contracts/L1/verifiers/PlonkVerifier.yulp +++ b/packages/protocol/contracts/L1/verifiers/PlonkVerifier.yulp @@ -1,11 +1,19 @@ // Code generated - DO NOT EDIT. // Generated using https://github.com/privacy-scaling-explorations/snark-verifier + // SPDX-License-Identifier: MIT // _____ _ _ _ _ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz object "plonk_verifier" { code { function allocate(size) -> ptr { diff --git a/packages/protocol/contracts/L1/verifiers/PseZkVerifier.sol b/packages/protocol/contracts/L1/verifiers/PseZkVerifier.sol index fe24b9c5e87..d7e6db3bbec 100644 --- a/packages/protocol/contracts/L1/verifiers/PseZkVerifier.sol +++ b/packages/protocol/contracts/L1/verifiers/PseZkVerifier.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/verifiers/SgxAndZkVerifier.sol b/packages/protocol/contracts/L1/verifiers/SgxAndZkVerifier.sol index fd4fa5b60f8..cc29915099e 100644 --- a/packages/protocol/contracts/L1/verifiers/SgxAndZkVerifier.sol +++ b/packages/protocol/contracts/L1/verifiers/SgxAndZkVerifier.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L1/verifiers/SgxVerifier.sol b/packages/protocol/contracts/L1/verifiers/SgxVerifier.sol index a693993a621..8708a1aa930 100644 --- a/packages/protocol/contracts/L1/verifiers/SgxVerifier.sol +++ b/packages/protocol/contracts/L1/verifiers/SgxVerifier.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L2/Lib1559Math.sol b/packages/protocol/contracts/L2/Lib1559Math.sol index 6d72283e92b..bc183f26830 100644 --- a/packages/protocol/contracts/L2/Lib1559Math.sol +++ b/packages/protocol/contracts/L2/Lib1559Math.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L2/TaikoL2.sol b/packages/protocol/contracts/L2/TaikoL2.sol index 79eb60de3af..6e94d2b49fc 100644 --- a/packages/protocol/contracts/L2/TaikoL2.sol +++ b/packages/protocol/contracts/L2/TaikoL2.sol @@ -3,17 +3,25 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; import "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; -import "../common/EssentialContract.sol"; import "../common/ICrossChainSync.sol"; +import "../signal/ISignalService.sol"; import "../libs/LibAddress.sol"; import "../libs/LibMath.sol"; -import "../signal/ISignalService.sol"; import "./Lib1559Math.sol"; +import "./CrossChainOwned.sol"; import "./TaikoL2Signer.sol"; /// @title TaikoL2 @@ -22,7 +30,7 @@ import "./TaikoL2Signer.sol"; /// It is used to anchor the latest L1 block details to L2 for cross-layer /// communication, manage EIP-1559 parameters for gas pricing, and store /// verified L1 block information. -contract TaikoL2 is EssentialContract, TaikoL2Signer, ICrossChainSync { +contract TaikoL2 is CrossChainOwned, TaikoL2Signer, ICrossChainSync { using LibAddress for address; using LibMath for uint256; @@ -37,13 +45,11 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, ICrossChainSync { mapping(uint256 l1height => ICrossChainSync.Snippet) public snippets; // A hash to check the integrity of public inputs. - address public signalService; // slot 3 - bytes32 public publicInputHash; // slot 4 - - uint64 public gasExcess; // slot 5 + bytes32 public publicInputHash; // slot 3 + uint64 public gasExcess; // slot 4 uint64 public latestSyncedL1Height; - uint256[145] private __gap; + uint256[146] private __gap; event Anchored(bytes32 parentHash, uint64 gasExcess); @@ -55,13 +61,18 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, ICrossChainSync { error L2_TOO_LATE(); /// @notice Initializes the TaikoL2 contract. - /// @param _signalService Address of the {ISignalService} contract. + /// @param _addressManager Address of the AddressManager contract. + /// @param _l1ChainId The ID of the base layer. /// @param _gasExcess The initial gasExcess. - function init(address _signalService, uint64 _gasExcess) external initializer { - __Essential_init(); - - if (_signalService == address(0)) revert L2_INVALID_PARAM(); - signalService = _signalService; + function init( + address _addressManager, + uint64 _l1ChainId, + uint64 _gasExcess + ) + external + initializer + { + __CrossChainOwned_init(_addressManager, _l1ChainId); if (block.chainid <= 1 || block.chainid >= type(uint64).max) { revert L2_INVALID_CHAIN_ID(); @@ -125,7 +136,7 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, ICrossChainSync { // Store the L1's signal root as a signal to the local signal service to // allow for multi-hop bridging. - ISignalService(signalService).sendSignal(l1SignalRoot); + ISignalService(resolve("signal_service", false)).sendSignal(l1SignalRoot); emit CrossChainSynced(uint64(block.number), l1Height, l1BlockHash, l1SignalRoot); // Update state variables diff --git a/packages/protocol/contracts/L2/TaikoL2EIP1559Configurable.sol b/packages/protocol/contracts/L2/TaikoL2EIP1559Configurable.sol index c5ba3e4364e..5f3dc7e7127 100644 --- a/packages/protocol/contracts/L2/TaikoL2EIP1559Configurable.sol +++ b/packages/protocol/contracts/L2/TaikoL2EIP1559Configurable.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/L2/TaikoL2Signer.sol b/packages/protocol/contracts/L2/TaikoL2Signer.sol index 54c6ca6a48a..7a960a441a0 100644 --- a/packages/protocol/contracts/L2/TaikoL2Signer.sol +++ b/packages/protocol/contracts/L2/TaikoL2Signer.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/bridge/Bridge.sol b/packages/protocol/contracts/bridge/Bridge.sol index 8eee83bffb1..b3429bcfe3b 100644 --- a/packages/protocol/contracts/bridge/Bridge.sol +++ b/packages/protocol/contracts/bridge/Bridge.sol @@ -3,6 +3,15 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz + pragma solidity 0.8.20; import "../common/EssentialContract.sol"; diff --git a/packages/protocol/contracts/bridge/IBridge.sol b/packages/protocol/contracts/bridge/IBridge.sol index 4d2d413bef4..91a721a26d7 100644 --- a/packages/protocol/contracts/bridge/IBridge.sol +++ b/packages/protocol/contracts/bridge/IBridge.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/common/AddressManager.sol b/packages/protocol/contracts/common/AddressManager.sol index f0b4fcd98f6..32511a4d7e2 100644 --- a/packages/protocol/contracts/common/AddressManager.sol +++ b/packages/protocol/contracts/common/AddressManager.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/common/AddressResolver.sol b/packages/protocol/contracts/common/AddressResolver.sol index 09aa4173843..df5e155dbfe 100644 --- a/packages/protocol/contracts/common/AddressResolver.sol +++ b/packages/protocol/contracts/common/AddressResolver.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/common/AuthorizableContract.sol b/packages/protocol/contracts/common/AuthorizableContract.sol index 8de911345c6..78615d9547e 100644 --- a/packages/protocol/contracts/common/AuthorizableContract.sol +++ b/packages/protocol/contracts/common/AuthorizableContract.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/common/EssentialContract.sol b/packages/protocol/contracts/common/EssentialContract.sol index 5d75e63f75e..bfdfd115e59 100644 --- a/packages/protocol/contracts/common/EssentialContract.sol +++ b/packages/protocol/contracts/common/EssentialContract.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/common/ICrossChainSync.sol b/packages/protocol/contracts/common/ICrossChainSync.sol index c1c532dc4da..c6ecf8e0293 100644 --- a/packages/protocol/contracts/common/ICrossChainSync.sol +++ b/packages/protocol/contracts/common/ICrossChainSync.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/common/OwnerUUPSUpgradable.sol b/packages/protocol/contracts/common/OwnerUUPSUpgradable.sol index e904220fd89..c67d4e3b8d2 100644 --- a/packages/protocol/contracts/common/OwnerUUPSUpgradable.sol +++ b/packages/protocol/contracts/common/OwnerUUPSUpgradable.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/libs/LibAddress.sol b/packages/protocol/contracts/libs/LibAddress.sol index b132ca006bb..5e3ed81a4c8 100644 --- a/packages/protocol/contracts/libs/LibAddress.sol +++ b/packages/protocol/contracts/libs/LibAddress.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/libs/LibDeploy.sol b/packages/protocol/contracts/libs/LibDeploy.sol index 282b45c6c1c..1a6158c13fa 100644 --- a/packages/protocol/contracts/libs/LibDeploy.sol +++ b/packages/protocol/contracts/libs/LibDeploy.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/libs/LibMath.sol b/packages/protocol/contracts/libs/LibMath.sol index 4e51b52e60c..453d2868ffd 100644 --- a/packages/protocol/contracts/libs/LibMath.sol +++ b/packages/protocol/contracts/libs/LibMath.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/signal/SignalService.sol b/packages/protocol/contracts/signal/SignalService.sol index df9235d355d..29083708bf5 100644 --- a/packages/protocol/contracts/signal/SignalService.sol +++ b/packages/protocol/contracts/signal/SignalService.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/team/TimelockTokenPool.sol b/packages/protocol/contracts/team/TimelockTokenPool.sol index e610d04dcd8..4ee73dd9f9d 100644 --- a/packages/protocol/contracts/team/TimelockTokenPool.sol +++ b/packages/protocol/contracts/team/TimelockTokenPool.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/team/airdrop/ERC20Airdrop.sol b/packages/protocol/contracts/team/airdrop/ERC20Airdrop.sol index f8dbd60edb2..89ccafec042 100644 --- a/packages/protocol/contracts/team/airdrop/ERC20Airdrop.sol +++ b/packages/protocol/contracts/team/airdrop/ERC20Airdrop.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/team/airdrop/ERC20Airdrop2.sol b/packages/protocol/contracts/team/airdrop/ERC20Airdrop2.sol index b420c1a753a..dcaeb0a9792 100644 --- a/packages/protocol/contracts/team/airdrop/ERC20Airdrop2.sol +++ b/packages/protocol/contracts/team/airdrop/ERC20Airdrop2.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/team/airdrop/ERC721Airdrop.sol b/packages/protocol/contracts/team/airdrop/ERC721Airdrop.sol index 771be95984a..6e43dbba96a 100644 --- a/packages/protocol/contracts/team/airdrop/ERC721Airdrop.sol +++ b/packages/protocol/contracts/team/airdrop/ERC721Airdrop.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/team/airdrop/MerkleClaimable.sol b/packages/protocol/contracts/team/airdrop/MerkleClaimable.sol index e4ab7e21ae2..56489811500 100644 --- a/packages/protocol/contracts/team/airdrop/MerkleClaimable.sol +++ b/packages/protocol/contracts/team/airdrop/MerkleClaimable.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/test/erc20/FreeMintERC20.sol b/packages/protocol/contracts/test/erc20/FreeMintERC20.sol index 013cb904388..38f7c080829 100644 --- a/packages/protocol/contracts/test/erc20/FreeMintERC20.sol +++ b/packages/protocol/contracts/test/erc20/FreeMintERC20.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/test/erc20/MayFailFreeMintERC20.sol b/packages/protocol/contracts/test/erc20/MayFailFreeMintERC20.sol index a85abdd675c..c0427076219 100644 --- a/packages/protocol/contracts/test/erc20/MayFailFreeMintERC20.sol +++ b/packages/protocol/contracts/test/erc20/MayFailFreeMintERC20.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/tokenvault/BaseNFTVault.sol b/packages/protocol/contracts/tokenvault/BaseNFTVault.sol index ba647edc63a..f4c06d88d22 100644 --- a/packages/protocol/contracts/tokenvault/BaseNFTVault.sol +++ b/packages/protocol/contracts/tokenvault/BaseNFTVault.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/tokenvault/BaseVault.sol b/packages/protocol/contracts/tokenvault/BaseVault.sol index 2eaa8eae4d1..84d6fb6fa5c 100644 --- a/packages/protocol/contracts/tokenvault/BaseVault.sol +++ b/packages/protocol/contracts/tokenvault/BaseVault.sol @@ -3,6 +3,15 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz + pragma solidity 0.8.20; import "lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/IERC165Upgradeable.sol"; diff --git a/packages/protocol/contracts/tokenvault/BridgedERC1155.sol b/packages/protocol/contracts/tokenvault/BridgedERC1155.sol index 14ffb2219c8..4151f563e74 100644 --- a/packages/protocol/contracts/tokenvault/BridgedERC1155.sol +++ b/packages/protocol/contracts/tokenvault/BridgedERC1155.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/tokenvault/BridgedERC20.sol b/packages/protocol/contracts/tokenvault/BridgedERC20.sol index b0bf8397cdd..eea58c1d2d6 100644 --- a/packages/protocol/contracts/tokenvault/BridgedERC20.sol +++ b/packages/protocol/contracts/tokenvault/BridgedERC20.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/tokenvault/BridgedERC20Base.sol b/packages/protocol/contracts/tokenvault/BridgedERC20Base.sol index d68d33d378a..2aeb37572f7 100644 --- a/packages/protocol/contracts/tokenvault/BridgedERC20Base.sol +++ b/packages/protocol/contracts/tokenvault/BridgedERC20Base.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/tokenvault/BridgedERC721.sol b/packages/protocol/contracts/tokenvault/BridgedERC721.sol index 76d36c7ab96..98c065f6c11 100644 --- a/packages/protocol/contracts/tokenvault/BridgedERC721.sol +++ b/packages/protocol/contracts/tokenvault/BridgedERC721.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/tokenvault/ERC1155Vault.sol b/packages/protocol/contracts/tokenvault/ERC1155Vault.sol index 5210dbfa244..d7328a26d47 100644 --- a/packages/protocol/contracts/tokenvault/ERC1155Vault.sol +++ b/packages/protocol/contracts/tokenvault/ERC1155Vault.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/tokenvault/ERC20Vault.sol b/packages/protocol/contracts/tokenvault/ERC20Vault.sol index e8048788939..1df70e35587 100644 --- a/packages/protocol/contracts/tokenvault/ERC20Vault.sol +++ b/packages/protocol/contracts/tokenvault/ERC20Vault.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/tokenvault/ERC721Vault.sol b/packages/protocol/contracts/tokenvault/ERC721Vault.sol index aedd9ff5f7b..08a72f70982 100644 --- a/packages/protocol/contracts/tokenvault/ERC721Vault.sol +++ b/packages/protocol/contracts/tokenvault/ERC721Vault.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/tokenvault/IBridgedERC20.sol b/packages/protocol/contracts/tokenvault/IBridgedERC20.sol index 24c0975fe7a..5c92e8e2fc0 100644 --- a/packages/protocol/contracts/tokenvault/IBridgedERC20.sol +++ b/packages/protocol/contracts/tokenvault/IBridgedERC20.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/tokenvault/LibBridgedToken.sol b/packages/protocol/contracts/tokenvault/LibBridgedToken.sol index c346763e290..a8b0b422741 100644 --- a/packages/protocol/contracts/tokenvault/LibBridgedToken.sol +++ b/packages/protocol/contracts/tokenvault/LibBridgedToken.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/contracts/tokenvault/adaptors/USDCAdaptor.sol b/packages/protocol/contracts/tokenvault/adaptors/USDCAdaptor.sol index a0134a3cdce..fa4851d7571 100644 --- a/packages/protocol/contracts/tokenvault/adaptors/USDCAdaptor.sol +++ b/packages/protocol/contracts/tokenvault/adaptors/USDCAdaptor.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/genesis/GenerateGenesis.g.sol b/packages/protocol/genesis/GenerateGenesis.g.sol index da473e4f283..ba0b6b05722 100644 --- a/packages/protocol/genesis/GenerateGenesis.g.sol +++ b/packages/protocol/genesis/GenerateGenesis.g.sol @@ -20,7 +20,9 @@ contract TestGenerateGenesis is Test, AddressResolver { vm.readFile(string.concat(vm.projectRoot(), "/deployments/genesis_config.json")); string private genesisAllocJSON = vm.readFile(string.concat(vm.projectRoot(), "/deployments/genesis_alloc.json")); - address private owner = configJSON.readAddress(".contractOwner"); + address private ownerTimelockController = configJSON.readAddress(".ownerTimelockController"); + address private ownerSecurityCouncil = configJSON.readAddress(".ownerSecurityCouncil"); + uint256 private ownerChainId = configJSON.readUint(".ownerChainId"); function testSharedContractsDeployment() public { assertEq(block.chainid, 167); @@ -59,7 +61,7 @@ contract TestGenerateGenesis is Test, AddressResolver { checkDeployedCode("RollupAddressManager"); // check proxy implementations - checkProxyImplementation("TaikoL2", "TaikoL2Impl"); + checkProxyImplementation("TaikoL2", "TaikoL2Impl", ownerTimelockController); checkProxyImplementation("RollupAddressManager", "RollupAddressManagerImpl"); // check proxies @@ -71,7 +73,7 @@ contract TestGenerateGenesis is Test, AddressResolver { AddressManager addressManagerProxy = AddressManager(getPredeployedContractAddress("SharedAddressManager")); - assertEq(owner, addressManagerProxy.owner()); + assertEq(ownerSecurityCouncil, addressManagerProxy.owner()); checkSavedAddress(addressManagerProxy, "Bridge", "bridge"); checkSavedAddress(addressManagerProxy, "ERC20Vault", "erc20_vault"); @@ -95,7 +97,7 @@ contract TestGenerateGenesis is Test, AddressResolver { AddressManager addressManagerProxy = AddressManager(getPredeployedContractAddress("RollupAddressManager")); - assertEq(owner, addressManagerProxy.owner()); + assertEq(ownerSecurityCouncil, addressManagerProxy.owner()); checkSavedAddress(addressManagerProxy, "TaikoL2", "taiko"); checkSavedAddress(addressManagerProxy, "SignalService", "signal_service"); @@ -115,6 +117,9 @@ contract TestGenerateGenesis is Test, AddressResolver { function testTaikoL2() public { TaikoL2 taikoL2Proxy = TaikoL2(getPredeployedContractAddress("TaikoL2")); + assertEq(ownerTimelockController, taikoL2Proxy.owner()); + assertEq(ownerChainId, taikoL2Proxy.ownerChainId()); + vm.startPrank(taikoL2Proxy.GOLDEN_TOUCH_ADDRESS()); for (uint32 i = 0; i < 300; ++i) { vm.roll(block.number + 1); @@ -152,7 +157,7 @@ contract TestGenerateGenesis is Test, AddressResolver { function testSingletonBridge() public { Bridge bridgeProxy = Bridge(payable(getPredeployedContractAddress("Bridge"))); - assertEq(owner, bridgeProxy.owner()); + assertEq(ownerSecurityCouncil, bridgeProxy.owner()); vm.expectRevert(Bridge.B_PERMISSION_DENIED.selector); bridgeProxy.processMessage( @@ -175,7 +180,7 @@ contract TestGenerateGenesis is Test, AddressResolver { assertEq(bridgeProxy.paused(), false); - vm.startPrank(owner); + vm.startPrank(ownerSecurityCouncil); bridgeProxy.pause(); assertEq(bridgeProxy.paused(), true); @@ -218,7 +223,7 @@ contract TestGenerateGenesis is Test, AddressResolver { AddressManager addressManager = AddressManager(getPredeployedContractAddress("SharedAddressManager")); - assertEq(owner, erc20VaultProxy.owner()); + assertEq(ownerSecurityCouncil, erc20VaultProxy.owner()); vm.startPrank(addressManager.owner()); addressManager.setAddress(1, "bridge", bridgeAddress); @@ -244,7 +249,7 @@ contract TestGenerateGenesis is Test, AddressResolver { AddressManager addressManager = AddressManager(getPredeployedContractAddress("SharedAddressManager")); - assertEq(owner, erc721VaultProxy.owner()); + assertEq(ownerSecurityCouncil, erc721VaultProxy.owner()); vm.startPrank(addressManager.owner()); addressManager.setAddress(1, "bridge", bridgeAddress); @@ -269,7 +274,7 @@ contract TestGenerateGenesis is Test, AddressResolver { AddressManager addressManager = AddressManager(getPredeployedContractAddress("SharedAddressManager")); - assertEq(owner, erc1155VaultProxy.owner()); + assertEq(ownerSecurityCouncil, erc1155VaultProxy.owner()); vm.startPrank(addressManager.owner()); addressManager.setAddress(1, "bridge", bridgeProxyAddress); @@ -293,7 +298,7 @@ contract TestGenerateGenesis is Test, AddressResolver { SignalService signalServiceProxy = SignalService(getPredeployedContractAddress("SignalService")); - assertEq(owner, signalServiceProxy.owner()); + assertEq(ownerSecurityCouncil, signalServiceProxy.owner()); signalServiceProxy.sendSignal(keccak256(abi.encodePacked(block.prevrandao))); @@ -304,7 +309,7 @@ contract TestGenerateGenesis is Test, AddressResolver { ) ); - vm.startPrank(owner); + vm.startPrank(ownerSecurityCouncil); SignalService signalService = SignalService(payable(getPredeployedContractAddress("SignalServiceImpl"))); @@ -335,11 +340,22 @@ contract TestGenerateGenesis is Test, AddressResolver { assertEq(address(contractAddress).code, vm.parseBytes(deployedCode)); } + function checkProxyImplementation( string memory proxyName, string memory contractName ) private + { + return checkProxyImplementation(proxyName, contractName, ownerSecurityCouncil); + } + + function checkProxyImplementation( + string memory proxyName, + string memory contractName, + address owner + ) + private { vm.startPrank(owner); address contractAddress = getPredeployedContractAddress(contractName); diff --git a/packages/protocol/genesis/test_config.js b/packages/protocol/genesis/test_config.js index abb25629703..aa65ccec1ce 100644 --- a/packages/protocol/genesis/test_config.js +++ b/packages/protocol/genesis/test_config.js @@ -2,7 +2,9 @@ const ADDRESS_LENGTH = 40; module.exports = { - contractOwner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + ownerTimelockController: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + ownerSecurityCouncil: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + ownerChainId: 1, chainId: 167, seedAccounts: [ { diff --git a/packages/protocol/script/AuthorizeRemoteTaikoProtocols.s.sol b/packages/protocol/script/AuthorizeRemoteTaikoProtocols.s.sol index b9556ca29c2..0e2a77672fc 100644 --- a/packages/protocol/script/AuthorizeRemoteTaikoProtocols.s.sol +++ b/packages/protocol/script/AuthorizeRemoteTaikoProtocols.s.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/script/DeployOnL1.s.sol b/packages/protocol/script/DeployOnL1.s.sol index 75adb0188b4..d03af5af2ff 100644 --- a/packages/protocol/script/DeployOnL1.s.sol +++ b/packages/protocol/script/DeployOnL1.s.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/script/SetAddress.s.sol b/packages/protocol/script/SetAddress.s.sol index 24f2a714ca5..568fbd7c317 100644 --- a/packages/protocol/script/SetAddress.s.sol +++ b/packages/protocol/script/SetAddress.s.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/script/SetRemoteBridgeSuites.s.sol b/packages/protocol/script/SetRemoteBridgeSuites.s.sol index a23ca236ad8..750bfdbd719 100644 --- a/packages/protocol/script/SetRemoteBridgeSuites.s.sol +++ b/packages/protocol/script/SetRemoteBridgeSuites.s.sol @@ -3,6 +3,14 @@ // |_ _|_ _(_) |_____ | | __ _| |__ ___ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ +// +// Email: security@taiko.xyz +// Website: https://taiko.xyz +// GitHub: https://github.com/taikoxyz +// Discord: https://discord.gg/taikoxyz +// Twitter: https://twitter.com/taikoxyz +// Blog: https://mirror.xyz/labs.taiko.eth +// Youtube: https://www.youtube.com/@taikoxyz pragma solidity 0.8.20; diff --git a/packages/protocol/test/DeployCapability.sol b/packages/protocol/test/DeployCapability.sol index fd3c6661601..a726337d38b 100644 --- a/packages/protocol/test/DeployCapability.sol +++ b/packages/protocol/test/DeployCapability.sol @@ -1,8 +1,4 @@ // SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ pragma solidity 0.8.20; diff --git a/packages/protocol/test/L1/Guardians.t.sol b/packages/protocol/test/L1/Guardians.t.sol index da13a9e4356..92e780ae195 100644 --- a/packages/protocol/test/L1/Guardians.t.sol +++ b/packages/protocol/test/L1/Guardians.t.sol @@ -31,7 +31,7 @@ contract TestSignalService is TaikoTest { deployProxy({ name: "guardians", impl: address(new DummyGuardians()), - data: bytes.concat(DummyGuardians.init.selector) + data: abi.encodeCall(DummyGuardians.init, ()) }) ); } diff --git a/packages/protocol/test/L2/TaikoL2.t.sol b/packages/protocol/test/L2/TaikoL2.t.sol index 7784ade85ae..aa351aaa9ea 100644 --- a/packages/protocol/test/L2/TaikoL2.t.sol +++ b/packages/protocol/test/L2/TaikoL2.t.sol @@ -17,40 +17,36 @@ contract TestTaikoL2 is TaikoTest { // same as `block_gas_limit` in foundry.toml uint32 public constant BLOCK_GAS_LIMIT = 30_000_000; - AddressManager public addressManager; - SignalService public ss; + address public addressManager; TaikoL2EIP1559Configurable public L2; SkipBasefeeCheckL2 public L2skip; function setUp() public { - addressManager = AddressManager( - deployProxy({ - name: "address_manager", - impl: address(new AddressManager()), - data: bytes.concat(AddressManager.init.selector) - }) - ); - - ss = SignalService( - deployProxy({ - name: "signal_service", - impl: address(new SignalService()), - data: bytes.concat(SignalService.init.selector), - registerTo: address(addressManager), - owner: address(0) - }) - ); + addressManager = deployProxy({ + name: "address_manager", + impl: address(new AddressManager()), + data: abi.encodeCall(AddressManager.init, ()) + }); + + deployProxy({ + name: "signal_service", + impl: address(new SignalService()), + data: abi.encodeCall(SignalService.init, ()), + registerTo: addressManager, + owner: address(0) + }); uint64 gasExcess = 0; uint8 quotient = 8; uint32 gasTarget = 60_000_000; + uint64 l1ChainId = 12_345; L2 = TaikoL2EIP1559Configurable( payable( deployProxy({ name: "taiko_l2", impl: address(new TaikoL2EIP1559Configurable()), - data: bytes.concat(TaikoL2.init.selector, abi.encode(address(ss), gasExcess)) + data: abi.encodeCall(TaikoL2.init, (addressManager, l1ChainId, gasExcess)) }) ) ); @@ -63,7 +59,7 @@ contract TestTaikoL2 is TaikoTest { deployProxy({ name: "taiko_l2", impl: address(new SkipBasefeeCheckL2()), - data: bytes.concat(TaikoL2.init.selector, abi.encode(address(ss), gasExcess)) + data: abi.encodeCall(TaikoL2.init, (addressManager, l1ChainId, gasExcess)) }) ) ); @@ -258,11 +254,6 @@ contract TestTaikoL2 is TaikoTest { L2skip.anchor(l1Hash, l1SignalRoot, l1Height, parentGasLimit); } - function registerAddress(bytes32 nameHash, address addr) internal { - addressManager.setAddress(uint64(block.chainid), nameHash, addr); - console2.log(block.chainid, uint256(nameHash), unicode"→", addr); - } - // Semi-random number generator function pickRandomNumber( uint256 randomNum, diff --git a/packages/protocol/test/common/EssentialContract.t.sol b/packages/protocol/test/common/EssentialContract.t.sol index f78a6bbc392..2b4d48ace6a 100644 --- a/packages/protocol/test/common/EssentialContract.t.sol +++ b/packages/protocol/test/common/EssentialContract.t.sol @@ -28,7 +28,7 @@ contract Target2 is Target1 { contract TestOwnerUUPSUpgradable is TaikoTest { function test_essential_behind_1967_proxy() external { - bytes memory data = bytes.concat(Target1.init.selector); + bytes memory data = abi.encodeCall(Target1.init, ()); vm.startPrank(Alice); ERC1967Proxy proxy = new ERC1967Proxy(address(new Target1()), data); Target1 target = Target1(address(proxy)); @@ -49,7 +49,7 @@ contract TestOwnerUUPSUpgradable is TaikoTest { target.adjust(); address v2 = address(new Target2()); - data = bytes.concat(Target2.update.selector); + data = abi.encodeCall(Target2.update, ()); vm.prank(Bob); vm.expectRevert(); @@ -67,7 +67,7 @@ contract TestOwnerUUPSUpgradable is TaikoTest { // This tests shows that the admin() and owner() cannot be the same, otherwise, // the owner cannot transact delegated functions on implementation. function test_essential_behind_transparent_proxy() external { - bytes memory data = bytes.concat(Target1.init.selector); + bytes memory data = abi.encodeCall(Target1.init, ()); vm.startPrank(Alice); TransparentUpgradeableProxy proxy = new TransparentUpgradeableProxy(address(new Target1()), Bob, data); diff --git a/packages/protocol/test/signal/SignalService.t.sol b/packages/protocol/test/signal/SignalService.t.sol index 280d0492ec2..dc8b97db94d 100644 --- a/packages/protocol/test/signal/SignalService.t.sol +++ b/packages/protocol/test/signal/SignalService.t.sol @@ -19,7 +19,7 @@ contract TestSignalService is TaikoTest { deployProxy({ name: "address_manager", impl: address(new AddressManager()), - data: bytes.concat(AddressManager.init.selector), + data: abi.encodeCall(AddressManager.init, ()), registerTo: address(addressManager), owner: address(0) }) @@ -29,7 +29,7 @@ contract TestSignalService is TaikoTest { deployProxy({ name: "signal_service", impl: address(new SignalService()), - data: bytes.concat(SignalService.init.selector) + data: abi.encodeCall(SignalService.init, ()) }) ); @@ -37,7 +37,7 @@ contract TestSignalService is TaikoTest { deployProxy({ name: "signal_service", impl: address(new SignalService()), - data: bytes.concat(SignalService.init.selector) + data: abi.encodeCall(SignalService.init, ()) }) ); diff --git a/packages/protocol/test/team/TimelockTokenPool.t.sol b/packages/protocol/test/team/TimelockTokenPool.t.sol index e0f4caff512..4b658ad3419 100644 --- a/packages/protocol/test/team/TimelockTokenPool.t.sol +++ b/packages/protocol/test/team/TimelockTokenPool.t.sol @@ -20,7 +20,7 @@ contract TestTimelockTokenPool is TaikoTest { deployProxy({ name: "time_lock_token_pool", impl: address(new TimelockTokenPool()), - data: bytes.concat(TimelockTokenPool.init.selector, abi.encode(address(tko), Vault)) + data: abi.encodeCall(TimelockTokenPool.init, (address(tko), Vault)) }) ); } diff --git a/packages/protocol/test/team/airdrop/MerkleClaimable.t.sol b/packages/protocol/test/team/airdrop/MerkleClaimable.t.sol index 49cfd6920c8..a7afe7e11bf 100644 --- a/packages/protocol/test/team/airdrop/MerkleClaimable.t.sol +++ b/packages/protocol/test/team/airdrop/MerkleClaimable.t.sol @@ -27,9 +27,7 @@ contract TestERC20Airdrop is TaikoTest { deployProxy({ name: "airdrop", impl: address(new ERC20Airdrop()), - data: bytes.concat( - ERC20Airdrop.init.selector, abi.encode(0, 0, merkleRoot, address(token), owner) - ) + data: abi.encodeCall(ERC20Airdrop.init, (0, 0, merkleRoot, address(token), owner)) }) ); @@ -39,9 +37,8 @@ contract TestERC20Airdrop is TaikoTest { deployProxy({ name: "airdrop", impl: address(new ERC20Airdrop2()), - data: bytes.concat( - ERC20Airdrop2.init.selector, - abi.encode(0, 0, merkleRoot, address(token), owner, 10 days) + data: abi.encodeCall( + ERC20Airdrop2.init, (0, 0, merkleRoot, address(token), owner, 10 days) ) }) ); diff --git a/packages/protocol/test/tokenvault/BridgedERC20.t.sol b/packages/protocol/test/tokenvault/BridgedERC20.t.sol index cae02838b10..3162437cd63 100644 --- a/packages/protocol/test/tokenvault/BridgedERC20.t.sol +++ b/packages/protocol/test/tokenvault/BridgedERC20.t.sol @@ -12,7 +12,7 @@ contract TestBridgedERC20 is TaikoTest { manager = deployProxy({ name: "address_manager", impl: address(new AddressManager()), - data: bytes.concat(AddressManager.init.selector) + data: abi.encodeCall(AddressManager.init, ()) }); register(manager, "erc20_vault", vault); @@ -130,9 +130,8 @@ contract TestBridgedERC20 is TaikoTest { deployProxy({ name: "bridged_token1", impl: address(new BridgedERC20()), - data: bytes.concat( - BridgedERC20.init.selector, - abi.encode(address(manager), srcToken, srcChainId, srcDecimals, name, name) + data: abi.encodeCall( + BridgedERC20.init, (address(manager), srcToken, srcChainId, srcDecimals, name, name) ), registerTo: manager, owner: owner diff --git a/packages/protocol/test/tokenvault/ERC1155Vault.t.sol b/packages/protocol/test/tokenvault/ERC1155Vault.t.sol index d01484dc499..8e1f2623c98 100644 --- a/packages/protocol/test/tokenvault/ERC1155Vault.t.sol +++ b/packages/protocol/test/tokenvault/ERC1155Vault.t.sol @@ -111,7 +111,7 @@ contract ERC1155VaultTest is TaikoTest { deployProxy({ name: "address_manager", impl: address(new AddressManager()), - data: bytes.concat(AddressManager.init.selector) + data: abi.encodeCall(AddressManager.init, ()) }) ); @@ -120,7 +120,7 @@ contract ERC1155VaultTest is TaikoTest { deployProxy({ name: "bridge", impl: address(new Bridge()), - data: bytes.concat(Bridge.init.selector, abi.encode(addressManager)), + data: abi.encodeCall(Bridge.init, (address(addressManager))), registerTo: address(addressManager), owner: address(0) }) @@ -132,7 +132,7 @@ contract ERC1155VaultTest is TaikoTest { deployProxy({ name: "bridge", impl: address(new Bridge()), - data: bytes.concat(Bridge.init.selector, abi.encode(addressManager)), + data: abi.encodeCall(Bridge.init, (address(addressManager))), registerTo: address(addressManager), owner: address(0) }) @@ -143,7 +143,7 @@ contract ERC1155VaultTest is TaikoTest { deployProxy({ name: "signal_service", impl: address(new SignalService()), - data: bytes.concat(SignalService.init.selector) + data: abi.encodeCall(SignalService.init, ()) }) ); @@ -151,7 +151,7 @@ contract ERC1155VaultTest is TaikoTest { deployProxy({ name: "erc1155_vault", impl: address(new ERC1155Vault()), - data: bytes.concat(BaseVault.init.selector, abi.encode(address(addressManager))) + data: abi.encodeCall(BaseVault.init, (address(addressManager))) }) ); @@ -159,7 +159,7 @@ contract ERC1155VaultTest is TaikoTest { deployProxy({ name: "erc1155_vault", impl: address(new ERC1155Vault()), - data: bytes.concat(BaseVault.init.selector, abi.encode(address(addressManager))) + data: abi.encodeCall(BaseVault.init, (address(addressManager))) }) ); @@ -170,7 +170,7 @@ contract ERC1155VaultTest is TaikoTest { deployProxy({ name: "signal_service", impl: address(new SkipProofCheckSignal()), - data: bytes.concat(SignalService.init.selector) + data: abi.encodeCall(SignalService.init, ()) }) ); diff --git a/packages/protocol/test/tokenvault/ERC20Vault.t.sol b/packages/protocol/test/tokenvault/ERC20Vault.t.sol index f01970cb72d..44b0ac7603f 100644 --- a/packages/protocol/test/tokenvault/ERC20Vault.t.sol +++ b/packages/protocol/test/tokenvault/ERC20Vault.t.sol @@ -89,9 +89,7 @@ contract TestERC20Vault is TaikoTest { deployProxy({ name: "taiko_token", impl: address(new TaikoToken()), - data: bytes.concat( - TaikoToken.init.selector, abi.encode("Taiko Token", "TTKOk", address(this)) - ) + data: abi.encodeCall(TaikoToken.init, ("Taiko Token", "TTKOk", address(this))) }) ); @@ -99,7 +97,7 @@ contract TestERC20Vault is TaikoTest { deployProxy({ name: "address_manager", impl: address(new AddressManager()), - data: bytes.concat(AddressManager.init.selector) + data: abi.encodeCall(AddressManager.init, ()) }) ); @@ -109,7 +107,7 @@ contract TestERC20Vault is TaikoTest { deployProxy({ name: "erc20_vault", impl: address(new ERC20Vault()), - data: bytes.concat(BaseVault.init.selector, abi.encode(address(addressManager))) + data: abi.encodeCall(BaseVault.init, (address(addressManager))) }) ); @@ -117,7 +115,7 @@ contract TestERC20Vault is TaikoTest { deployProxy({ name: "erc20_vault", impl: address(new ERC20Vault()), - data: bytes.concat(BaseVault.init.selector, abi.encode(address(addressManager))) + data: abi.encodeCall(BaseVault.init, (address(addressManager))) }) ); @@ -129,7 +127,7 @@ contract TestERC20Vault is TaikoTest { deployProxy({ name: "bridge", impl: address(new Bridge()), - data: bytes.concat(Bridge.init.selector, abi.encode(addressManager)), + data: abi.encodeCall(Bridge.init, (address(addressManager))), registerTo: address(addressManager), owner: address(0) }) @@ -143,7 +141,7 @@ contract TestERC20Vault is TaikoTest { deployProxy({ name: "signal_service", impl: address(new SignalService()), - data: bytes.concat(SignalService.init.selector), + data: abi.encodeCall(SignalService.init, ()), registerTo: address(0), owner: address(0) }) diff --git a/packages/protocol/test/tokenvault/ERC721Vault.t.sol b/packages/protocol/test/tokenvault/ERC721Vault.t.sol index b67aafd935a..dc25777b94c 100644 --- a/packages/protocol/test/tokenvault/ERC721Vault.t.sol +++ b/packages/protocol/test/tokenvault/ERC721Vault.t.sol @@ -127,7 +127,7 @@ contract ERC721VaultTest is TaikoTest { deployProxy({ name: "address_manager", impl: address(new AddressManager()), - data: bytes.concat(AddressManager.init.selector) + data: abi.encodeCall(AddressManager.init, ()) }) ); @@ -136,7 +136,7 @@ contract ERC721VaultTest is TaikoTest { deployProxy({ name: "bridge", impl: address(new Bridge()), - data: bytes.concat(Bridge.init.selector, abi.encode(addressManager)), + data: abi.encodeCall(Bridge.init, (address(addressManager))), registerTo: address(addressManager), owner: address(0) }) @@ -148,7 +148,7 @@ contract ERC721VaultTest is TaikoTest { deployProxy({ name: "bridge", impl: address(new Bridge()), - data: bytes.concat(Bridge.init.selector, abi.encode(addressManager)), + data: abi.encodeCall(Bridge.init, (address(addressManager))), registerTo: address(addressManager), owner: address(0) }) @@ -159,7 +159,7 @@ contract ERC721VaultTest is TaikoTest { deployProxy({ name: "signal_service", impl: address(new SignalService()), - data: bytes.concat(SignalService.init.selector) + data: abi.encodeCall(SignalService.init, ()) }) ); @@ -167,7 +167,7 @@ contract ERC721VaultTest is TaikoTest { deployProxy({ name: "erc721_vault", impl: address(new ERC721Vault()), - data: bytes.concat(BaseVault.init.selector, abi.encode(address(addressManager))) + data: abi.encodeCall(BaseVault.init, (address(addressManager))) }) ); @@ -175,7 +175,7 @@ contract ERC721VaultTest is TaikoTest { deployProxy({ name: "erc721_vault", impl: address(new ERC721Vault()), - data: bytes.concat(BaseVault.init.selector, abi.encode(address(addressManager))) + data: abi.encodeCall(BaseVault.init, (address(addressManager))) }) ); @@ -186,7 +186,7 @@ contract ERC721VaultTest is TaikoTest { deployProxy({ name: "signal_service", impl: address(new SkipProofCheckSignal()), - data: bytes.concat(SignalService.init.selector) + data: abi.encodeCall(SignalService.init, ()) }) ); diff --git a/packages/protocol/utils/generate_genesis/interface.ts b/packages/protocol/utils/generate_genesis/interface.ts index 054b7837f3f..36759d1b462 100644 --- a/packages/protocol/utils/generate_genesis/interface.ts +++ b/packages/protocol/utils/generate_genesis/interface.ts @@ -1,6 +1,7 @@ export interface Config { - contractOwner: string; - contractAdmin: string; + ownerTimelockController: string; + ownerSecurityCouncil: string; + ownerChainId: number; chainId: number; seedAccounts: Array<{ [key: string]: number; diff --git a/packages/protocol/utils/generate_genesis/main.ts b/packages/protocol/utils/generate_genesis/main.ts index a792c95a1c5..d50bd9d9f0e 100644 --- a/packages/protocol/utils/generate_genesis/main.ts +++ b/packages/protocol/utils/generate_genesis/main.ts @@ -18,13 +18,15 @@ async function main() { : path.join(process.cwd(), process.argv[2]), ); - const contractOwner = config.contractOwner; + const ownerTimelockController = config.ownerTimelockController; + const ownerSecurityCouncil = config.ownerSecurityCouncil; const chainId = config.chainId; const seedAccounts = config.seedAccounts; const predeployERC20 = config.predeployERC20; if ( - !ethers.utils.isAddress(contractOwner) || + !ethers.utils.isAddress(ownerTimelockController) || + !ethers.utils.isAddress(ownerSecurityCouncil) || !Number.isInteger(chainId) || !Array.isArray(seedAccounts) || !seedAccounts.every((seedAccount) => { @@ -38,7 +40,8 @@ async function main() { ) { throw new Error( `invalid input: ${JSON.stringify({ - contractOwner, + ownerTimelockController, + ownerSecurityCouncil, chainId, seedAccounts, })}`, diff --git a/packages/protocol/utils/generate_genesis/taikoL2.ts b/packages/protocol/utils/generate_genesis/taikoL2.ts index 39d1e9d4ed5..b7e33c9a0c1 100644 --- a/packages/protocol/utils/generate_genesis/taikoL2.ts +++ b/packages/protocol/utils/generate_genesis/taikoL2.ts @@ -17,7 +17,13 @@ export async function deployTaikoL2( config: Config, result: Result, ): Promise { - const { contractOwner, chainId, seedAccounts } = config; + const { + ownerTimelockController, + ownerSecurityCouncil, + ownerChainId, + chainId, + seedAccounts, + } = config; const alloc: any = {}; @@ -42,7 +48,9 @@ export async function deployTaikoL2( console.log("\n"); const contractConfigs: any = await generateContractConfigs( - contractOwner, + ownerTimelockController, + ownerSecurityCouncil, + ownerChainId, chainId, config.contractAddresses, config.param1559, @@ -112,7 +120,9 @@ export async function deployTaikoL2( // generateContractConfigs returns all L2 contracts address, deployedBytecode, // and initialized variables. async function generateContractConfigs( - contractOwner: string, + ownerTimelockController: string, + ownerSecurityCouncil: string, + ownerChainId: number, chainId: number, hardCodedAddresses: any, param1559: any, @@ -192,7 +202,7 @@ async function generateContractConfigs( addressMap[contractName] = hardCodedAddresses[contractName]; } else { addressMap[contractName] = ethers.utils.getCreate2Address( - contractOwner, + ownerSecurityCouncil, ethers.utils.keccak256( ethers.utils.toUtf8Bytes(`${chainId}${contractName}`), ), @@ -212,7 +222,7 @@ async function generateContractConfigs( contractArtifacts.SharedAddressManagerImpl.deployedBytecode .object, variables: { - _owner: contractOwner, + _owner: ownerSecurityCouncil, }, }, SharedAddressManager: { @@ -224,7 +234,7 @@ async function generateContractConfigs( _initialized: 1, _initializing: false, // Ownable2Upgradeable - _owner: contractOwner, + _owner: ownerSecurityCouncil, // AddressManager addresses: { [chainId]: { @@ -267,7 +277,7 @@ async function generateContractConfigs( addressMap, ), variables: { - _owner: contractOwner, + _owner: ownerSecurityCouncil, }, }, Bridge: { @@ -281,7 +291,7 @@ async function generateContractConfigs( _reentry: 1, // _FALSE _paused: 1, // _FALSE // Ownable2Upgradeable - _owner: contractOwner, + _owner: ownerSecurityCouncil, // AddressResolver addressManager: addressMap.SharedAddressManager, }, @@ -297,7 +307,7 @@ async function generateContractConfigs( addressMap, ), variables: { - _owner: contractOwner, + _owner: ownerSecurityCouncil, }, }, ERC20Vault: { @@ -312,7 +322,7 @@ async function generateContractConfigs( _reentry: 1, // _FALSE _paused: 1, // _FALSE // Ownable2Upgradeable - _owner: contractOwner, + _owner: ownerSecurityCouncil, // AddressResolver addressManager: addressMap.SharedAddressManager, }, @@ -328,7 +338,7 @@ async function generateContractConfigs( addressMap, ), variables: { - _owner: contractOwner, + _owner: ownerSecurityCouncil, }, }, ERC721Vault: { @@ -343,7 +353,7 @@ async function generateContractConfigs( _reentry: 1, // _FALSE _paused: 1, // _FALSE // Ownable2Upgradeable - _owner: contractOwner, + _owner: ownerSecurityCouncil, // AddressResolver addressManager: addressMap.SharedAddressManager, }, @@ -359,7 +369,7 @@ async function generateContractConfigs( addressMap, ), variables: { - _owner: contractOwner, + _owner: ownerSecurityCouncil, }, }, ERC1155Vault: { @@ -374,7 +384,7 @@ async function generateContractConfigs( _reentry: 1, // _FALSE _paused: 1, // _FALSE // Ownable2Upgradeable - _owner: contractOwner, + _owner: ownerSecurityCouncil, // AddressResolver addressManager: addressMap.SharedAddressManager, }, @@ -405,7 +415,7 @@ async function generateContractConfigs( addressMap, ), variables: { - _owner: contractOwner, + _owner: ownerSecurityCouncil, }, }, SignalService: { @@ -420,7 +430,7 @@ async function generateContractConfigs( _reentry: 1, // _FALSE _paused: 1, // _FALSE // Ownable2Upgradeable - _owner: contractOwner, + _owner: ownerSecurityCouncil, authorizedAddresses: { [addressMap.TaikoL2]: ethers.utils.hexZeroPad( ethers.utils.hexlify(chainId), @@ -441,7 +451,7 @@ async function generateContractConfigs( addressMap, ), variables: { - _owner: contractOwner, + _owner: ownerTimelockController, }, }, TaikoL2: { @@ -450,8 +460,9 @@ async function generateContractConfigs( variables: { // TaikoL2 // Ownable2Upgradeable - _owner: contractOwner, - signalService: addressMap.SignalService, + _owner: ownerTimelockController, + addressManager: addressMap.RollupAddressManager, + ownerChainId, gasExcess: param1559.gasExcess, // keccak256(abi.encodePacked(block.chainid, basefee, ancestors)) publicInputHash: `${ethers.utils.solidityKeccak256( @@ -479,7 +490,7 @@ async function generateContractConfigs( contractArtifacts.RollupAddressManagerImpl.deployedBytecode .object, variables: { - _owner: contractOwner, + _owner: ownerSecurityCouncil, }, }, RollupAddressManager: { @@ -491,13 +502,16 @@ async function generateContractConfigs( _initialized: 1, _initializing: false, // Ownable2Upgradeable - _owner: contractOwner, + _owner: ownerSecurityCouncil, // AddressManager addresses: { [chainId]: { [ethers.utils.hexlify( ethers.utils.toUtf8Bytes("taiko"), )]: addressMap.TaikoL2, + [ethers.utils.hexlify( + ethers.utils.toUtf8Bytes("bridge"), + )]: addressMap.Bridge, [ethers.utils.hexlify( ethers.utils.toUtf8Bytes("signal_service"), )]: addressMap.SignalService,