From d580a88e857b53af3555251ac666b3455cee5a85 Mon Sep 17 00:00:00 2001 From: Jeffery Walsh Date: Tue, 7 Feb 2023 13:07:45 -0800 Subject: [PATCH 01/10] wip --- packages/relayer/.default.env | 2 ++ packages/relayer/cli/cli.go | 22 +++++++++---------- packages/relayer/indexer/service.go | 2 ++ packages/relayer/message/process_message.go | 4 ++-- packages/relayer/message/processor.go | 15 ++++++++----- .../relayer/proof/encoded_signal_proof.go | 10 ++++----- packages/status-page/src/App.svelte | 1 + .../src/components/StatusIndicator.svelte | 2 +- packages/status-page/src/domain/status.ts | 4 ++-- .../status-page/src/pages/home/Home.svelte | 3 +-- .../src/utils/displayStatusValue.ts | 3 ++- .../src/utils/getAvailableSlots.ts | 7 +++--- packages/status-page/src/utils/getBlockFee.ts | 6 ++--- packages/status-page/src/utils/getConfig.ts | 2 +- .../src/utils/getLastVerifiedBlockId.ts | 2 +- .../status-page/src/utils/getNextBlockId.ts | 6 ++--- .../status-page/src/utils/getPendingBlocks.ts | 4 ++-- .../status-page/src/utils/getProofReward.ts | 6 ++--- 18 files changed, 55 insertions(+), 46 deletions(-) diff --git a/packages/relayer/.default.env b/packages/relayer/.default.env index 5097c633e8..4931fa4a15 100644 --- a/packages/relayer/.default.env +++ b/packages/relayer/.default.env @@ -12,6 +12,8 @@ L1_BRIDGE_ADDRESS=0x3612E284D763f42f5E4CB72B1602b23DAEC3cA60 L2_BRIDGE_ADDRESS=0x0000777700000000000000000000000000000004 L1_TAIKO_ADDRESS=0x7B3AF414448ba906f02a1CA307C56c4ADFF27ce7 L2_TAIKO_ADDRESS=0x0000777700000000000000000000000000000001 +L1_SIGNAL_SERVICE_ADDRESS=0x0000777700000000000000000000000000000001 +L2_SIGNAL_SERVICE_ADDRESS=0x0000777700000000000000000000000000000001 L1_RPC_URL=wss://l1ws.a1.taiko.xyz L2_RPC_URL=wss://l2ws.a1.taiko.xyz CONFIRMATIONS_BEFORE_PROCESSING=13 diff --git a/packages/relayer/cli/cli.go b/packages/relayer/cli/cli.go index 989988d63d..0ea2690cf6 100644 --- a/packages/relayer/cli/cli.go +++ b/packages/relayer/cli/cli.go @@ -198,12 +198,12 @@ func makeIndexers( RPCClient: l1RpcClient, DestRPCClient: l2RpcClient, - ECDSAKey: os.Getenv("RELAYER_ECDSA_KEY"), - BridgeAddress: common.HexToAddress(os.Getenv("L1_BRIDGE_ADDRESS")), - DestBridgeAddress: common.HexToAddress(os.Getenv("L2_BRIDGE_ADDRESS")), - DestTaikoAddress: common.HexToAddress(os.Getenv("L2_TAIKO_ADDRESS")), - SrcTaikoAddress: common.HexToAddress(os.Getenv("L1_TAIKO_ADDRESS")), - + ECDSAKey: os.Getenv("RELAYER_ECDSA_KEY"), + BridgeAddress: common.HexToAddress(os.Getenv("L1_BRIDGE_ADDRESS")), + DestBridgeAddress: common.HexToAddress(os.Getenv("L2_BRIDGE_ADDRESS")), + DestTaikoAddress: common.HexToAddress(os.Getenv("L2_TAIKO_ADDRESS")), + SrcTaikoAddress: common.HexToAddress(os.Getenv("L1_TAIKO_ADDRESS")), + SrcSignalServiceAddress: common.HexToAddress(os.Getenv("L1_SIGNAL_SERVICE_ADDRESS")), BlockBatchSize: uint64(blockBatchSize), NumGoroutines: numGoroutines, SubscriptionBackoff: subscriptionBackoff, @@ -227,11 +227,11 @@ func makeIndexers( RPCClient: l2RpcClient, DestRPCClient: l1RpcClient, - ECDSAKey: os.Getenv("RELAYER_ECDSA_KEY"), - BridgeAddress: common.HexToAddress(os.Getenv("L2_BRIDGE_ADDRESS")), - DestBridgeAddress: common.HexToAddress(os.Getenv("L1_BRIDGE_ADDRESS")), - DestTaikoAddress: common.HexToAddress(os.Getenv("L1_TAIKO_ADDRESS")), - + ECDSAKey: os.Getenv("RELAYER_ECDSA_KEY"), + BridgeAddress: common.HexToAddress(os.Getenv("L2_BRIDGE_ADDRESS")), + DestBridgeAddress: common.HexToAddress(os.Getenv("L1_BRIDGE_ADDRESS")), + DestTaikoAddress: common.HexToAddress(os.Getenv("L1_TAIKO_ADDRESS")), + SrcSignalServiceAddress: common.HexToAddress(os.Getenv("L2_SIGNAL_SERVICE_ADDRESS")), BlockBatchSize: uint64(blockBatchSize), NumGoroutines: numGoroutines, SubscriptionBackoff: subscriptionBackoff, diff --git a/packages/relayer/indexer/service.go b/packages/relayer/indexer/service.go index b5a761f605..9d64482aae 100644 --- a/packages/relayer/indexer/service.go +++ b/packages/relayer/indexer/service.go @@ -63,6 +63,7 @@ type NewServiceOpts struct { DestBridgeAddress common.Address SrcTaikoAddress common.Address DestTaikoAddress common.Address + SrcSignalServiceAddress common.Address BlockBatchSize uint64 NumGoroutines int SubscriptionBackoff time.Duration @@ -159,6 +160,7 @@ func NewService(opts NewServiceOpts) (*Service, error) { SrcETHClient: opts.EthClient, ProfitableOnly: opts.ProfitableOnly, HeaderSyncIntervalSeconds: opts.HeaderSyncIntervalInSeconds, + SrcSignalServiceAddress: opts.SrcSignalServiceAddress, }) if err != nil { return nil, errors.Wrap(err, "message.NewProcessor") diff --git a/packages/relayer/message/process_message.go b/packages/relayer/message/process_message.go index 1b5a34ef50..00ef8499ca 100644 --- a/packages/relayer/message/process_message.go +++ b/packages/relayer/message/process_message.go @@ -50,9 +50,9 @@ func (p *Processor) ProcessMessage( key := hex.EncodeToString(hashed) - encodedSignalProof, err := p.prover.EncodedSignalProof(ctx, p.rpc, event.Raw.Address, key, latestSyncedHeader) + encodedSignalProof, err := p.prover.EncodedSignalProof(ctx, p.rpc, p.srcSignalServiceAddress, key, latestSyncedHeader) if err != nil { - log.Errorf("srcChainID: %v, destChainID: %v, txHash: %v: signal: %v, from: %v", + log.Errorf("srcChainID: %v, destChainID: %v, txHash: %v: msgHash: %v, from: %v", event.Message.SrcChainId, event.Message.DestChainId, event.Raw.TxHash.Hex(), diff --git a/packages/relayer/message/processor.go b/packages/relayer/message/processor.go index f25a69a962..a9dedaa1d7 100644 --- a/packages/relayer/message/processor.go +++ b/packages/relayer/message/processor.go @@ -32,9 +32,10 @@ type Processor struct { mu *sync.Mutex - destNonce uint64 - relayerAddr common.Address - confirmations uint64 + destNonce uint64 + relayerAddr common.Address + srcSignalServiceAddress common.Address + confirmations uint64 profitableOnly relayer.ProfitableOnly headerSyncIntervalSeconds int64 @@ -50,6 +51,7 @@ type NewProcessorOpts struct { EventRepo relayer.EventRepository DestHeaderSyncer relayer.HeaderSyncer RelayerAddress common.Address + SrcSignalServiceAddress common.Address Confirmations uint64 ProfitableOnly relayer.ProfitableOnly HeaderSyncIntervalSeconds int64 @@ -106,9 +108,10 @@ func NewProcessor(opts NewProcessorOpts) (*Processor, error) { mu: &sync.Mutex{}, - destNonce: 0, - relayerAddr: opts.RelayerAddress, - confirmations: opts.Confirmations, + destNonce: 0, + relayerAddr: opts.RelayerAddress, + srcSignalServiceAddress: opts.SrcSignalServiceAddress, + confirmations: opts.Confirmations, profitableOnly: opts.ProfitableOnly, headerSyncIntervalSeconds: opts.HeaderSyncIntervalSeconds, diff --git a/packages/relayer/proof/encoded_signal_proof.go b/packages/relayer/proof/encoded_signal_proof.go index 7de65ac3ea..4e7d26681e 100644 --- a/packages/relayer/proof/encoded_signal_proof.go +++ b/packages/relayer/proof/encoded_signal_proof.go @@ -19,7 +19,7 @@ import ( func (p *Prover) EncodedSignalProof( ctx context.Context, caller relayer.Caller, - bridgeAddress common.Address, + signalServiceAddress common.Address, key string, blockHash common.Hash, ) ([]byte, error) { @@ -28,7 +28,7 @@ func (p *Prover) EncodedSignalProof( return nil, errors.Wrap(err, "p.blockHeader") } - encodedStorageProof, err := p.encodedStorageProof(ctx, caller, bridgeAddress, key, blockHeader.Height.Int64()) + encodedStorageProof, err := p.encodedStorageProof(ctx, caller, signalServiceAddress, key, blockHeader.Height.Int64()) if err != nil { return nil, errors.Wrap(err, "p.getEncodedStorageProof") } @@ -52,18 +52,18 @@ func (p *Prover) EncodedSignalProof( func (p *Prover) encodedStorageProof( ctx context.Context, c relayer.Caller, - bridgeAddress common.Address, + signalServiceAddress common.Address, key string, blockNumber int64, ) ([]byte, error) { var ethProof StorageProof - log.Infof("getting proof for: %v, key: %v, blockNum: %v", bridgeAddress, key, blockNumber) + log.Infof("getting proof for: %v, key: %v, blockNum: %v", signalServiceAddress, key, blockNumber) err := c.CallContext(ctx, ðProof, "eth_getProof", - bridgeAddress, + signalServiceAddress, []string{key}, hexutil.EncodeBig(new(big.Int).SetInt64(blockNumber)), ) diff --git a/packages/status-page/src/App.svelte b/packages/status-page/src/App.svelte index 58088e0f6f..d44797de51 100644 --- a/packages/status-page/src/App.svelte +++ b/packages/status-page/src/App.svelte @@ -8,6 +8,7 @@ import { ethers } from "ethers"; setupI18n({ withLocale: "en" }); + console.log(import.meta.env.VITE_L1_RPC_URL); const l1Provider = new ethers.providers.JsonRpcProvider( import.meta.env.VITE_L1_RPC_URL ); diff --git a/packages/status-page/src/components/StatusIndicator.svelte b/packages/status-page/src/components/StatusIndicator.svelte index a9ffd9b982..a44c7e869b 100644 --- a/packages/status-page/src/components/StatusIndicator.svelte +++ b/packages/status-page/src/components/StatusIndicator.svelte @@ -50,7 +50,7 @@ statusValue = 0; } } catch (e) { - console.error(e); + console.error(header, e); } if (watchStatusFunc) { diff --git a/packages/status-page/src/domain/status.ts b/packages/status-page/src/domain/status.ts index 3e675488ea..972bb73522 100644 --- a/packages/status-page/src/domain/status.ts +++ b/packages/status-page/src/domain/status.ts @@ -1,6 +1,6 @@ -import type { ethers } from "ethers"; +import type { BigNumber, ethers } from "ethers"; -type Status = string | number | boolean; +type Status = string | number | boolean | BigNumber; type StatusIndicatorProp = { statusFunc?: ( diff --git a/packages/status-page/src/pages/home/Home.svelte b/packages/status-page/src/pages/home/Home.svelte index d7bcf3724f..7364ecb4cf 100644 --- a/packages/status-page/src/pages/home/Home.svelte +++ b/packages/status-page/src/pages/home/Home.svelte @@ -209,7 +209,6 @@ try { const stateVars = await getStateVariables(l1Provider, l1TaikoAddress); - // TODO: remove. this check prevents this code from running before we deploy next testnet // since the state vars have had large changes. if (stateVars.length < 10) { @@ -240,7 +239,7 @@ }); statusIndicators.push({ - status: stateVars[9], + status: stateVars[6], provider: l1Provider, contractAddress: l1TaikoAddress, header: "Average Block Time", diff --git a/packages/status-page/src/utils/displayStatusValue.ts b/packages/status-page/src/utils/displayStatusValue.ts index 627a7477ce..ebbd79dd9e 100644 --- a/packages/status-page/src/utils/displayStatusValue.ts +++ b/packages/status-page/src/utils/displayStatusValue.ts @@ -1,6 +1,7 @@ import { ethers } from "ethers"; +import type { Status } from "src/domain/status"; -export const displayStatusValue = (value: string | number | boolean) => { +export const displayStatusValue = (value: Status) => { if (typeof value === "string") { if (!value) return "0x"; if (ethers.utils.isHexString(value)) { diff --git a/packages/status-page/src/utils/getAvailableSlots.ts b/packages/status-page/src/utils/getAvailableSlots.ts index 831a985e22..94614e6aad 100644 --- a/packages/status-page/src/utils/getAvailableSlots.ts +++ b/packages/status-page/src/utils/getAvailableSlots.ts @@ -7,8 +7,9 @@ export const getAvailableSlots = async ( ): Promise => { const contract: Contract = new Contract(contractAddress, TaikoL1, provider); const stateVariables = await contract.getStateVariables(); - const nextBlockId = stateVariables[3]; - const latestVerifiedId = stateVariables[2]; + const nextBlockId = stateVariables[4]; + const latestVerifiedId = stateVariables[8]; const pendingBlocks = nextBlockId - latestVerifiedId - 1; - return Math.abs(pendingBlocks - 2048); + const config = await contract.getConfig(); + return Math.abs(pendingBlocks - config.maxNumBlocks); }; diff --git a/packages/status-page/src/utils/getBlockFee.ts b/packages/status-page/src/utils/getBlockFee.ts index 6c73f97209..971ad54db1 100644 --- a/packages/status-page/src/utils/getBlockFee.ts +++ b/packages/status-page/src/utils/getBlockFee.ts @@ -1,11 +1,11 @@ -import { Contract, ethers } from "ethers"; +import { BigNumber, Contract, ethers } from "ethers"; import TaikoL1 from "../constants/abi/TaikoL1"; export const getBlockFee = async ( provider: ethers.providers.JsonRpcProvider, contractAddress: string -): Promise => { +): Promise => { const contract: Contract = new Contract(contractAddress, TaikoL1, provider); const fee = await contract.getBlockFee(); - return fee; + return ethers.utils.formatEther(fee); }; diff --git a/packages/status-page/src/utils/getConfig.ts b/packages/status-page/src/utils/getConfig.ts index a66be0994c..6eb7c4a76b 100644 --- a/packages/status-page/src/utils/getConfig.ts +++ b/packages/status-page/src/utils/getConfig.ts @@ -1,4 +1,4 @@ -import { BigNumber, Contract, ethers } from "ethers"; +import { Contract, ethers } from "ethers"; import TaikoL1 from "../constants/abi/TaikoL1"; export const getConfig = async ( diff --git a/packages/status-page/src/utils/getLastVerifiedBlockId.ts b/packages/status-page/src/utils/getLastVerifiedBlockId.ts index e36c455557..56002f3da6 100644 --- a/packages/status-page/src/utils/getLastVerifiedBlockId.ts +++ b/packages/status-page/src/utils/getLastVerifiedBlockId.ts @@ -7,6 +7,6 @@ export const getLastVerifiedBlockId = async ( ): Promise => { const contract: Contract = new Contract(contractAddress, TaikoL1, provider); const stateVariables = await contract.getStateVariables(); - const latestVerifiedId = stateVariables[2]; + const latestVerifiedId = stateVariables[8]; return BigNumber.from(latestVerifiedId).toNumber(); }; diff --git a/packages/status-page/src/utils/getNextBlockId.ts b/packages/status-page/src/utils/getNextBlockId.ts index 9da8dded93..a472c98885 100644 --- a/packages/status-page/src/utils/getNextBlockId.ts +++ b/packages/status-page/src/utils/getNextBlockId.ts @@ -4,9 +4,9 @@ import TaikoL1 from "../constants/abi/TaikoL1"; export const getNextBlockId = async ( provider: ethers.providers.JsonRpcProvider, contractAddress: string -): Promise => { +): Promise => { const contract: Contract = new Contract(contractAddress, TaikoL1, provider); const stateVariables = await contract.getStateVariables(); - const nextBlockId = stateVariables[3]; - return BigNumber.from(nextBlockId).toNumber(); + const nextBlockId = stateVariables[4]; + return nextBlockId; }; diff --git a/packages/status-page/src/utils/getPendingBlocks.ts b/packages/status-page/src/utils/getPendingBlocks.ts index f74452c3c3..f7a3008a2c 100644 --- a/packages/status-page/src/utils/getPendingBlocks.ts +++ b/packages/status-page/src/utils/getPendingBlocks.ts @@ -7,7 +7,7 @@ export const getPendingBlocks = async ( ): Promise => { const contract: Contract = new Contract(contractAddress, TaikoL1, provider); const stateVariables = await contract.getStateVariables(); - const nextBlockId = stateVariables[3]; - const latestVerifiedId = stateVariables[2]; + const nextBlockId = stateVariables[4]; + const latestVerifiedId = stateVariables[8]; return nextBlockId - latestVerifiedId - 1; }; diff --git a/packages/status-page/src/utils/getProofReward.ts b/packages/status-page/src/utils/getProofReward.ts index d7fb4fa33c..186ee067ae 100644 --- a/packages/status-page/src/utils/getProofReward.ts +++ b/packages/status-page/src/utils/getProofReward.ts @@ -1,11 +1,11 @@ -import { Contract, ethers } from "ethers"; +import { BigNumber, Contract, ethers } from "ethers"; import TaikoL1 from "../constants/abi/TaikoL1"; export const getProofReward = async ( provider: ethers.providers.JsonRpcProvider, contractAddress: string -): Promise => { +): Promise => { const contract: Contract = new Contract(contractAddress, TaikoL1, provider); const fee = await contract.getProofReward(); - return fee; + return ethers.utils.formatEther(fee); }; From 16c8ce8799236077cd4f77bd6cc755b464f6427f Mon Sep 17 00:00:00 2001 From: Jeffery Walsh Date: Tue, 7 Feb 2023 17:19:43 -0800 Subject: [PATCH 02/10] updat abi --- .../status-page/src/constants/abi/TaikoL1.ts | 187 ++++++++++++++---- 1 file changed, 145 insertions(+), 42 deletions(-) diff --git a/packages/status-page/src/constants/abi/TaikoL1.ts b/packages/status-page/src/constants/abi/TaikoL1.ts index b265ffdb68..4eca5b67bf 100644 --- a/packages/status-page/src/constants/abi/TaikoL1.ts +++ b/packages/status-page/src/constants/abi/TaikoL1.ts @@ -276,30 +276,6 @@ export default [ stateMutability: "view", type: "function", }, - { - inputs: [ - { - internalType: "uint256", - name: "id", - type: "uint256", - }, - { - internalType: "bytes32", - name: "parentHash", - type: "bytes32", - }, - ], - name: "getBlockProvers", - outputs: [ - { - internalType: "address[]", - name: "", - type: "address[]", - }, - ], - stateMutability: "view", - type: "function", - }, { inputs: [], name: "getConfig", @@ -436,6 +412,21 @@ export default [ name: "enableTokenomics", type: "bool", }, + { + internalType: "bool", + name: "enablePublicInputsCheck", + type: "bool", + }, + { + internalType: "bool", + name: "enableProofValidation", + type: "bool", + }, + { + internalType: "bool", + name: "enableOracleProver", + type: "bool", + }, ], internalType: "struct TaikoData.Config", name: "", @@ -445,6 +436,47 @@ export default [ stateMutability: "pure", type: "function", }, + { + inputs: [ + { + internalType: "uint256", + name: "id", + type: "uint256", + }, + { + internalType: "bytes32", + name: "parentHash", + type: "bytes32", + }, + ], + name: "getForkChoice", + outputs: [ + { + components: [ + { + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + { + internalType: "uint64", + name: "provenAt", + type: "uint64", + }, + { + internalType: "address[]", + name: "provers", + type: "address[]", + }, + ], + internalType: "struct TaikoData.ForkChoice", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [], name: "getLatestSyncedHeader", @@ -528,24 +560,61 @@ export default [ name: "getStateVariables", outputs: [ { - internalType: "uint64", - name: "", - type: "uint64", - }, - { - internalType: "uint64", - name: "", - type: "uint64", - }, - { - internalType: "uint64", - name: "", - type: "uint64", - }, - { - internalType: "uint256", + components: [ + { + internalType: "uint64", + name: "genesisHeight", + type: "uint64", + }, + { + internalType: "uint64", + name: "genesisTimestamp", + type: "uint64", + }, + { + internalType: "uint64", + name: "statusBits", + type: "uint64", + }, + { + internalType: "uint256", + name: "feeBase", + type: "uint256", + }, + { + internalType: "uint64", + name: "nextBlockId", + type: "uint64", + }, + { + internalType: "uint64", + name: "lastProposedAt", + type: "uint64", + }, + { + internalType: "uint64", + name: "avgBlockTime", + type: "uint64", + }, + { + internalType: "uint64", + name: "latestVerifiedHeight", + type: "uint64", + }, + { + internalType: "uint64", + name: "latestVerifiedId", + type: "uint64", + }, + { + internalType: "uint64", + name: "avgProofTime", + type: "uint64", + }, + ], + internalType: "struct LibUtils.StateVariables", name: "", - type: "uint256", + type: "tuple", }, ], stateMutability: "view", @@ -563,7 +632,7 @@ export default [ outputs: [ { internalType: "bytes32", - name: "header", + name: "", type: "bytes32", }, ], @@ -625,6 +694,30 @@ export default [ stateMutability: "nonpayable", type: "function", }, + { + inputs: [ + { + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + internalType: "bytes32", + name: "parentHash", + type: "bytes32", + }, + ], + name: "isBlockVerifiable", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [ { @@ -743,6 +836,11 @@ export default [ name: "name", type: "string", }, + { + internalType: "bool", + name: "allowZeroAddress", + type: "bool", + }, ], name: "resolve", outputs: [ @@ -767,6 +865,11 @@ export default [ name: "name", type: "string", }, + { + internalType: "bool", + name: "allowZeroAddress", + type: "bool", + }, ], name: "resolve", outputs: [ From 4c1b6f4714620793ee4b385f80d4d3720b216d97 Mon Sep 17 00:00:00 2001 From: Jeffery Walsh Date: Tue, 7 Feb 2023 17:28:53 -0800 Subject: [PATCH 03/10] fix --- packages/status-page/src/utils/getNextBlockId.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/status-page/src/utils/getNextBlockId.ts b/packages/status-page/src/utils/getNextBlockId.ts index c13db63d97..faf225bb93 100644 --- a/packages/status-page/src/utils/getNextBlockId.ts +++ b/packages/status-page/src/utils/getNextBlockId.ts @@ -4,7 +4,7 @@ import TaikoL1 from "../constants/abi/TaikoL1"; export const getNextBlockId = async ( provider: ethers.providers.JsonRpcProvider, contractAddress: string -): Promise => { +): Promise => { const contract: Contract = new Contract(contractAddress, TaikoL1, provider); const stateVariables = await contract.getStateVariables(); const nextBlockId = stateVariables.nextBlockId; From ef61745c8e196d92d328624be9985765a86c9c33 Mon Sep 17 00:00:00 2001 From: Jeffery Walsh Date: Tue, 7 Feb 2023 17:30:33 -0800 Subject: [PATCH 04/10] signalservice addr --- packages/relayer/.default.env | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/relayer/.default.env b/packages/relayer/.default.env index 4931fa4a15..9b1e28b1e1 100644 --- a/packages/relayer/.default.env +++ b/packages/relayer/.default.env @@ -12,8 +12,8 @@ L1_BRIDGE_ADDRESS=0x3612E284D763f42f5E4CB72B1602b23DAEC3cA60 L2_BRIDGE_ADDRESS=0x0000777700000000000000000000000000000004 L1_TAIKO_ADDRESS=0x7B3AF414448ba906f02a1CA307C56c4ADFF27ce7 L2_TAIKO_ADDRESS=0x0000777700000000000000000000000000000001 -L1_SIGNAL_SERVICE_ADDRESS=0x0000777700000000000000000000000000000001 -L2_SIGNAL_SERVICE_ADDRESS=0x0000777700000000000000000000000000000001 +L1_SIGNAL_SERVICE_ADDRESS=0x403cc7802725928652a3d116Bb1781005e2e76d3 +L2_SIGNAL_SERVICE_ADDRESS=0x8BDa62dc6c0160Bce2C3a9360755dF030575985a L1_RPC_URL=wss://l1ws.a1.taiko.xyz L2_RPC_URL=wss://l2ws.a1.taiko.xyz CONFIRMATIONS_BEFORE_PROCESSING=13 From 862eed60f3cd54b6f7228dbb98873bbfe59be399 Mon Sep 17 00:00:00 2001 From: Jeffery Walsh Date: Tue, 7 Feb 2023 18:07:08 -0800 Subject: [PATCH 05/10] fixes --- .../status-page/src/pages/home/Home.svelte | 52 ++++++++++++++----- .../src/utils/getAvailableSlots.ts | 3 +- .../status-page/src/utils/truncateString.ts | 4 ++ 3 files changed, 44 insertions(+), 15 deletions(-) create mode 100644 packages/status-page/src/utils/truncateString.ts diff --git a/packages/status-page/src/pages/home/Home.svelte b/packages/status-page/src/pages/home/Home.svelte index 7364ecb4cf..b9a3aeb291 100644 --- a/packages/status-page/src/pages/home/Home.svelte +++ b/packages/status-page/src/pages/home/Home.svelte @@ -17,6 +17,7 @@ import type { Status, StatusIndicatorProp } from "../../domain/status"; import { getConfig } from "../../utils/getConfig"; import { getStateVariables } from "../../utils/getStateVariables"; + import { truncateString } from "../../utils/truncateString"; export let l1Provider: ethers.providers.JsonRpcProvider; export let l1TaikoAddress: string; @@ -177,6 +178,7 @@ onMount(async () => { try { const config = await getConfig(l1Provider, l1TaikoAddress); + console.log(config); if (!Object.hasOwn(config, "enableTokenomics")) return; if (config.enableTokenomics) { statusIndicators.push({ @@ -209,18 +211,19 @@ try { const stateVars = await getStateVariables(l1Provider, l1TaikoAddress); - // TODO: remove. this check prevents this code from running before we deploy next testnet - // since the state vars have had large changes. - if (stateVars.length < 10) { - return; - } statusIndicators.push({ - status: stateVars[4], provider: l1Provider, contractAddress: l1TaikoAddress, header: "Latest Proposal", - intervalInMs: 0, + intervalInMs: 5 * 1000, + statusFunc: async ( + provider: ethers.providers.JsonRpcProvider, + address: string + ) => { + const stateVars = await getStateVariables(provider, address); + return stateVars.lastProposedAt.toNumber(); + }, colorFunc: function (status: Status) { return "green"; // todo: whats green, yellow, red? }, @@ -228,35 +231,58 @@ }); statusIndicators.push({ - status: stateVars[9], provider: l1Provider, contractAddress: l1TaikoAddress, + statusFunc: async ( + provider: ethers.providers.JsonRpcProvider, + address: string + ) => { + const stateVars = await getStateVariables(provider, address); + return stateVars.avgProofTime.toNumber(); + }, + colorFunc: function (status: Status) { + return "green"; // todo: whats green, yellow, red? + }, header: "Average Proof Time", - intervalInMs: 0, - colorFunc: null, + intervalInMs: 5 * 1000, tooltip: "The current average proof time, updated when a block is successfully proven.", }); statusIndicators.push({ - status: stateVars[6], provider: l1Provider, contractAddress: l1TaikoAddress, header: "Average Block Time", - intervalInMs: 0, + intervalInMs: 5 * 1000, colorFunc: function (status: Status) { return "green"; // todo: whats green, yellow, red? }, + statusFunc: async ( + provider: ethers.providers.JsonRpcProvider, + address: string + ) => { + const stateVars = await getStateVariables(provider, address); + return stateVars.avgBlockTime.toNumber(); + }, tooltip: "The current average block time, updated when a block is successfully proposed.", }); statusIndicators.push({ - status: `${ethers.utils.parseEther(stateVars[3])} ${feeTokenSymbol}`, provider: l1Provider, contractAddress: l1TaikoAddress, header: "Fee Base", intervalInMs: 0, + statusFunc: async ( + provider: ethers.providers.JsonRpcProvider, + address: string + ) => { + const stateVars = await getStateVariables(provider, address); + return `${truncateString( + ethers.utils.formatEther(stateVars.feeBase), + 6 + )} ${feeTokenSymbol}`; + }, colorFunc: function (status: Status) { return "green"; // todo: whats green, yellow, red? }, diff --git a/packages/status-page/src/utils/getAvailableSlots.ts b/packages/status-page/src/utils/getAvailableSlots.ts index 128d31049b..6aaa5a4104 100644 --- a/packages/status-page/src/utils/getAvailableSlots.ts +++ b/packages/status-page/src/utils/getAvailableSlots.ts @@ -10,6 +10,5 @@ export const getAvailableSlots = async ( const nextBlockId = stateVariables.nextBlockId; const latestVerifiedId = stateVariables.latestVerifiedId; const pendingBlocks = nextBlockId - latestVerifiedId - 1; - const config = await contract.getConfig(); - return Math.abs(pendingBlocks - config.maxNumBlocks); + return Math.abs(pendingBlocks - 2048); }; diff --git a/packages/status-page/src/utils/truncateString.ts b/packages/status-page/src/utils/truncateString.ts new file mode 100644 index 0000000000..3e969178e2 --- /dev/null +++ b/packages/status-page/src/utils/truncateString.ts @@ -0,0 +1,4 @@ +export const truncateString = (str: string, maxLength: number = 10) => { + if (!str) return ""; + return str.length > maxLength ? `${str.substring(0, maxLength)}` : str; +}; From ccf467846265261eb48e6702d08437b518567e03 Mon Sep 17 00:00:00 2001 From: Jeffery Walsh Date: Tue, 7 Feb 2023 18:15:19 -0800 Subject: [PATCH 06/10] reward/fee --- .../status-page/src/pages/home/Home.svelte | 55 +++++++++---------- .../status-page/src/utils/getProofReward.ts | 9 ++- 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/packages/status-page/src/pages/home/Home.svelte b/packages/status-page/src/pages/home/Home.svelte index b9a3aeb291..19fd657a1a 100644 --- a/packages/status-page/src/pages/home/Home.svelte +++ b/packages/status-page/src/pages/home/Home.svelte @@ -177,41 +177,38 @@ onMount(async () => { try { - const config = await getConfig(l1Provider, l1TaikoAddress); - console.log(config); - if (!Object.hasOwn(config, "enableTokenomics")) return; - if (config.enableTokenomics) { - statusIndicators.push({ - statusFunc: getBlockFee, - watchStatusFunc: null, - provider: l1Provider, - contractAddress: l1TaikoAddress, - header: "Block Fee", - intervalInMs: 15000, - colorFunc: null, - tooltip: - "The current fee to propose a block to the TaikoL1 smart contract.", - }); + statusIndicators.push({ + statusFunc: getBlockFee, + watchStatusFunc: null, + provider: l1Provider, + contractAddress: l1TaikoAddress, + header: "Block Fee", + intervalInMs: 15000, + colorFunc: function (status: Status) { + return "green"; // todo: whats green, yellow, red? + }, + tooltip: + "The current fee to propose a block to the TaikoL1 smart contract.", + }); - statusIndicators.push({ - statusFunc: getProofReward, - watchStatusFunc: null, - provider: l1Provider, - contractAddress: l1TaikoAddress, - header: "Proof Reward", - intervalInMs: 15000, - colorFunc: null, - tooltip: - "The current reward for successfully submitting a proof for a proposed block on the TaikoL1 smart contract.", - }); - } + statusIndicators.push({ + statusFunc: getProofReward, + watchStatusFunc: null, + provider: l1Provider, + contractAddress: l1TaikoAddress, + header: "Proof Reward", + intervalInMs: 15000, + colorFunc: function (status: Status) { + return "green"; // todo: whats green, yellow, red? + }, + tooltip: + "The current reward for successfully submitting a proof for a proposed block on the TaikoL1 smart contract.", + }); } catch (e) { console.error(e); } try { - const stateVars = await getStateVariables(l1Provider, l1TaikoAddress); - statusIndicators.push({ provider: l1Provider, contractAddress: l1TaikoAddress, diff --git a/packages/status-page/src/utils/getProofReward.ts b/packages/status-page/src/utils/getProofReward.ts index 186ee067ae..8bfcd4dbf4 100644 --- a/packages/status-page/src/utils/getProofReward.ts +++ b/packages/status-page/src/utils/getProofReward.ts @@ -1,11 +1,16 @@ import { BigNumber, Contract, ethers } from "ethers"; import TaikoL1 from "../constants/abi/TaikoL1"; +import { truncateString } from "./truncateString"; export const getProofReward = async ( provider: ethers.providers.JsonRpcProvider, contractAddress: string ): Promise => { const contract: Contract = new Contract(contractAddress, TaikoL1, provider); - const fee = await contract.getProofReward(); - return ethers.utils.formatEther(fee); + const state = await contract.getStateVariables(); + const fee = await contract.getProofReward( + new Date().getMilliseconds(), + state.lastProposedAt + ); + return truncateString(ethers.utils.formatEther(fee), 8); }; From 69d01ee5e0817d34cf8a15f67ef2fda5eaf2de39 Mon Sep 17 00:00:00 2001 From: Jeffery Walsh Date: Tue, 7 Feb 2023 18:29:28 -0800 Subject: [PATCH 07/10] add lastProvenAt --- packages/protocol/contracts/L1/TaikoData.sol | 2 +- packages/protocol/contracts/L1/libs/LibProving.sol | 2 ++ packages/protocol/contracts/L1/libs/LibUtils.sol | 4 +++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index a95b0edaca..66604ec36c 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -101,7 +101,7 @@ library TaikoData { // the proof time moving average, note that for each block, only the // first proof's time is considered. uint64 avgProofTime; - uint64 __reservedC1; + uint64 lastProvenAt; // Reserved uint256[42] __gap; } diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 62b366ced3..a1f3a51c28 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -365,6 +365,8 @@ library LibProving { fc.provers.push(prover); + state.lastProvenAt = uint64(block.timestamp); + emit BlockProven({ id: target.id, parentHash: parentHash, diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol index bd4e0d6722..51e4719fea 100644 --- a/packages/protocol/contracts/L1/libs/LibUtils.sol +++ b/packages/protocol/contracts/L1/libs/LibUtils.sol @@ -30,6 +30,7 @@ library LibUtils { uint64 latestVerifiedHeight; uint64 latestVerifiedId; uint64 avgProofTime; + uint64 lastProvenAt; } event Halted(bool halted); @@ -74,7 +75,8 @@ library LibUtils { avgBlockTime: state.avgBlockTime, latestVerifiedHeight: state.latestVerifiedHeight, latestVerifiedId: state.latestVerifiedId, - avgProofTime: state.avgProofTime + avgProofTime: state.avgProofTime, + lastProvenAt: state.lastProvenAt }); } From f6382f4aa5e1fd0da8066533674ddf140f876fb7 Mon Sep 17 00:00:00 2001 From: Jeffery Walsh Date: Tue, 7 Feb 2023 18:31:26 -0800 Subject: [PATCH 08/10] lastProvenAt --- .../status-page/src/pages/home/Home.svelte | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/packages/status-page/src/pages/home/Home.svelte b/packages/status-page/src/pages/home/Home.svelte index 19fd657a1a..ce58b90787 100644 --- a/packages/status-page/src/pages/home/Home.svelte +++ b/packages/status-page/src/pages/home/Home.svelte @@ -227,6 +227,24 @@ tooltip: "The most recent block proposal on TaikoL1 contract.", }); + statusIndicators.push({ + provider: l1Provider, + contractAddress: l1TaikoAddress, + header: "Latest Proof", + intervalInMs: 5 * 1000, + statusFunc: async ( + provider: ethers.providers.JsonRpcProvider, + address: string + ) => { + const stateVars = await getStateVariables(provider, address); + return stateVars.lastProvenAt.toNumber(); + }, + colorFunc: function (status: Status) { + return "green"; // todo: whats green, yellow, red? + }, + tooltip: "The most recent block proof submitted on TaikoL1 contract.", + }); + statusIndicators.push({ provider: l1Provider, contractAddress: l1TaikoAddress, From 376a45b72497b6bbeac261bde55e7c6cb39fd1fa Mon Sep 17 00:00:00 2001 From: Jeffery Walsh Date: Tue, 7 Feb 2023 18:35:29 -0800 Subject: [PATCH 09/10] human readble provenat and proposedat --- packages/status-page/src/pages/home/Home.svelte | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/status-page/src/pages/home/Home.svelte b/packages/status-page/src/pages/home/Home.svelte index ce58b90787..808facddac 100644 --- a/packages/status-page/src/pages/home/Home.svelte +++ b/packages/status-page/src/pages/home/Home.svelte @@ -219,7 +219,9 @@ address: string ) => { const stateVars = await getStateVariables(provider, address); - return stateVars.lastProposedAt.toNumber(); + return new Date( + stateVars.lastProposedAt.toNumber() * 1000 + ).toString(); }, colorFunc: function (status: Status) { return "green"; // todo: whats green, yellow, red? @@ -237,7 +239,7 @@ address: string ) => { const stateVars = await getStateVariables(provider, address); - return stateVars.lastProvenAt.toNumber(); + return new Date(stateVars.lastProvenAt.toNumber() * 1000).toString(); }, colorFunc: function (status: Status) { return "green"; // todo: whats green, yellow, red? From b8d6f941aa3360e7a63d37d90a659b6c7e48000d Mon Sep 17 00:00:00 2001 From: Jeffery Walsh Date: Tue, 7 Feb 2023 20:08:07 -0800 Subject: [PATCH 10/10] revert provenat --- packages/protocol/contracts/L1/TaikoData.sol | 2 +- .../protocol/contracts/L1/libs/LibProving.sol | 2 -- .../protocol/contracts/L1/libs/LibUtils.sol | 4 +--- .../status-page/src/pages/home/Home.svelte | 19 ++++++++++++------- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 66604ec36c..a95b0edaca 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -101,7 +101,7 @@ library TaikoData { // the proof time moving average, note that for each block, only the // first proof's time is considered. uint64 avgProofTime; - uint64 lastProvenAt; + uint64 __reservedC1; // Reserved uint256[42] __gap; } diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index a1f3a51c28..62b366ced3 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -365,8 +365,6 @@ library LibProving { fc.provers.push(prover); - state.lastProvenAt = uint64(block.timestamp); - emit BlockProven({ id: target.id, parentHash: parentHash, diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol index 51e4719fea..bd4e0d6722 100644 --- a/packages/protocol/contracts/L1/libs/LibUtils.sol +++ b/packages/protocol/contracts/L1/libs/LibUtils.sol @@ -30,7 +30,6 @@ library LibUtils { uint64 latestVerifiedHeight; uint64 latestVerifiedId; uint64 avgProofTime; - uint64 lastProvenAt; } event Halted(bool halted); @@ -75,8 +74,7 @@ library LibUtils { avgBlockTime: state.avgBlockTime, latestVerifiedHeight: state.latestVerifiedHeight, latestVerifiedId: state.latestVerifiedId, - avgProofTime: state.avgProofTime, - lastProvenAt: state.lastProvenAt + avgProofTime: state.avgProofTime }); } diff --git a/packages/status-page/src/pages/home/Home.svelte b/packages/status-page/src/pages/home/Home.svelte index 808facddac..1e2f8a5f4d 100644 --- a/packages/status-page/src/pages/home/Home.svelte +++ b/packages/status-page/src/pages/home/Home.svelte @@ -1,5 +1,5 @@