From a5ae14b4376c82fe70a5c979e39c2be941d6498e Mon Sep 17 00:00:00 2001 From: Zygimantas <5236121+Zygimantass@users.noreply.github.com> Date: Wed, 21 Jan 2026 15:11:23 +0100 Subject: [PATCH 01/13] feat(validator): add operational docs --- src/pages/guide/node/operate-validator.mdx | 145 ++++++ vocs.config.ts | 566 +++++++++++---------- 2 files changed, 431 insertions(+), 280 deletions(-) create mode 100644 src/pages/guide/node/operate-validator.mdx diff --git a/src/pages/guide/node/operate-validator.mdx b/src/pages/guide/node/operate-validator.mdx new file mode 100644 index 00000000..266f0905 --- /dev/null +++ b/src/pages/guide/node/operate-validator.mdx @@ -0,0 +1,145 @@ +--- +title: Operate your validator node +description: Day-to-day operations for Tempo validators. Node lifecycle, upgrades, key rotation, monitoring, and troubleshooting. +--- + +# Operate your validator + +This guide covers day-to-day operations for running a Tempo validator in production. + +## Node Lifecycle + +### Starting and Stopping + +Use `SIGINT` (Ctrl+C) or `SIGTERM` to gracefully stop the node: + +```bash +# If running directly +kill -INT + +# If running via systemd +sudo systemctl stop tempo +``` + +The node will finish processing the current block before shutting down. Avoid using `SIGKILL` as it may corrupt the database. + +### Resetting your validator's data + +Validators can safely restart from a snapshot if needed: + +```bash +# Stop the node +sudo systemctl stop tempo + +# Remove old data (keep your signing key!) +rm -rf /db + +# Download fresh snapshot +tempo download --datadir + +# Start the node +sudo systemctl start tempo +``` + +After restarting, your validator will rejoin the active set once it syncs to the chain tip and participates in the next DKG ceremony (up to 3 hours). +Your node needs to wait for the next DKG ceremony to receive its' signing share. + +### Changing your validator's instance + +If needed, you can also migrate your validator to another instance (e.g. move to another bare-metal server). +This requires shutting down your old node, downloading a snapshot and starting with the consensus key. + +The new validator needs to have the same IP address and port as the old one, since the Tempo validator contract does not currently support updating the IP address. + +Since your validator is starting from fresh state, you will need to wait for the next DKG ceremony for your validator to receive a signing share (up to 3 hours). + +## Key Management + +### Signing Key Rotation + +To rotate your validator's signing key: + +1. Generate a new keypair: + +```bash +tempo consensus generate-private-key --output +tempo consensus calculate-public-key --private-key +``` + +2. Contact the Tempo team to update your validator's public key on-chain + +3. Once confirmed, update your node configuration to use the new key and restart + +:::warning +The old validator identity must be deactivated before the new one is activated +::: + +### Signing Share Recovery + +If you lose your signing share (stored on the database in `/consensus/`), your validator will automatically receive a new share at the next DKG ceremony. This takes up to 3 hours depending on the epoch stage. + +## Log Management + +### Parsing Logs + +Tempo logs include ANSI escape codes for colors. To strip them for grep/awk: + +```bash +# Strip colors when searching +sudo journalctl -u tempo | sed 's/\x1b\[[0-9;]*m//g' | grep "error" + +# Or disable colors at runtime +RUST_LOG_STYLE=never tempo node ... +``` + +### Log Levels + +Control verbosity with `RUST_LOG`: + +```bash +# Default (info) +RUST_LOG=info + +# Debug consensus only +RUST_LOG=info,tempo_commonware_node::consensus=debug + +# Quiet mode (warnings and errors only) +RUST_LOG=warn +``` + +## Metrics glossary + +This is a table of the most important metrics to watch on your validator node: + +| Metric Name | Description | When to alert? | Meaning | +| --- | --- | --- | --- | +| `consensus_engine_dkg_manager_ceremony_successes_total` | Number of successful DKG ceremonies | Critical when it hasn't increased in 12 hours | Your node has participated in a successful DKG ceremony | +| `consensus_engine_dkg_manager_ceremony_failures_total` | Number of failed DKG ceremonies | Warning when it increases | Your node has failed to participate in a DKG ceremony | +| `consensus_engine_marshal_finalized_height` | Latest finalized height your node is aware of | Warning when it hasn't increased in 1 hour, critical when it hasn't increased in 3 hours | Your node is aware of the latest finalized height | +| `consensus_engine_marshal_processed_height` | Latest height your node has processed | Critical when it hasn't increased in an hour, warning when it's behind finalized height | Your node is processing blocks | +| `consensus_network_spawner_connections` | Number of active peers on the consensus layer | Warning when it's below the expected validator count, critical when it's 0 | Your node is connected to the consensus layer | +| `consensus_engine_consensus_voter_inbound_messages_total` | Number of inbound messages related to voting on the consensus layer | Warning when it's not increasing and your node is synced | Your node is receiving voting messages from the consensus layer | +| `reth_sync_checkpoint` | Current sync progress | Warning on when there are no changes in the `Finish` stage | Your node is syncing with the network | +| `reth_payloads_resolved_block` | Number of built and resolved payloads | Warning when it hasn't increased in 12 hours | Your node has built and resolved blocks | + +## Troubleshooting + +### Node stalled at specific height + +If your node stops syncing at a specific block: + +1. Check if other validators are also stuck (e.g. on the [Tempo Explorer](https://explore.tempo.xyz)) +2. Check for errors in logs: + ```bash + sudo journalctl -u tempo -n 5000 | grep -i "error\|panic\|fatal" + ``` +3. Try restarting from snapshot if the issue persists + +### Not receiving signing share + +If `consensus_engine_dkg_manager_ceremony_successes_total` stays at 0 after 6-12 hours: + +1. Verify your IP is whitelisted correctly +2. Check firewall allows inbound/outbound on port 30303 +3. Confirm your node is synced and connected to consensus peers +4. Wait for the next DKG ceremony (runs every ~3 hours) diff --git a/vocs.config.ts b/vocs.config.ts index 7c9fc785..24ea1ac4 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -1,156 +1,157 @@ -import { Changelog, defineConfig, McpSource } from 'vocs/config' +import { Changelog, defineConfig, McpSource } from "vocs/config"; const baseUrl = (() => { - if (process.env.VERCEL_ENV === 'production') - return `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}` - if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}` - return '' -})() + if (process.env.VERCEL_ENV === "production") + return `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}`; + if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}`; + return ""; +})(); export default defineConfig({ - changelog: Changelog.github({ prereleases: true, repo: 'tempoxyz/tempo' }), + changelog: Changelog.github({ prereleases: true, repo: "tempoxyz/tempo" }), checkDeadlinks: false, - title: 'Tempo', - titleTemplate: '%s ⋅ Tempo', - description: 'Documentation for the Tempo network and protocol specifications', + title: "Tempo", + titleTemplate: "%s ⋅ Tempo", + description: + "Documentation for the Tempo network and protocol specifications", mcp: { enabled: true, sources: [ - McpSource.github({ repo: 'tempoxyz/tempo' }), - McpSource.github({ repo: 'paradigmxyz/reth' }), - McpSource.github({ repo: 'foundry-rs/foundry' }), - McpSource.github({ repo: 'wevm/viem' }), - McpSource.github({ repo: 'wevm/wagmi' }), - McpSource.github({ repo: 'tempoxyz/tempo-ts' }), + McpSource.github({ repo: "tempoxyz/tempo" }), + McpSource.github({ repo: "paradigmxyz/reth" }), + McpSource.github({ repo: "foundry-rs/foundry" }), + McpSource.github({ repo: "wevm/viem" }), + McpSource.github({ repo: "wevm/wagmi" }), + McpSource.github({ repo: "tempoxyz/tempo-ts" }), ], }, baseUrl: baseUrl || undefined, - ogImageUrl: (path, { baseUrl } = { baseUrl: '' }) => - path === '/' + ogImageUrl: (path, { baseUrl } = { baseUrl: "" }) => + path === "/" ? `${baseUrl}/og-docs.png` : `${baseUrl}/api/og?title=%title&description=%description`, logoUrl: { - light: '/lockup-light.svg', - dark: '/lockup-dark.svg', + light: "/lockup-light.svg", + dark: "/lockup-dark.svg", }, iconUrl: { - light: '/icon-light.png', - dark: '/icon-dark.png', + light: "/icon-light.png", + dark: "/icon-dark.png", }, - rootDir: '.', + rootDir: ".", socials: [ { - icon: 'github', - link: 'https://github.com/tempoxyz', + icon: "github", + link: "https://github.com/tempoxyz", }, { - icon: 'x', - link: 'https://twitter.com/tempo', + icon: "x", + link: "https://twitter.com/tempo", }, ], sidebar: { - '/': [ + "/": [ { - text: 'Home', - link: '/', + text: "Home", + link: "/", }, { - text: 'Changelog', - link: '/changelog', + text: "Changelog", + link: "/changelog", }, { - text: 'Integrate Tempo Testnet', + text: "Integrate Tempo Testnet", items: [ { - text: 'Overview', - link: '/quickstart/integrate-tempo', + text: "Overview", + link: "/quickstart/integrate-tempo", }, { - text: 'Connect to the Network', - link: '/quickstart/connection-details', + text: "Connect to the Network", + link: "/quickstart/connection-details", }, { - text: 'Get Faucet Funds', - link: '/quickstart/faucet', + text: "Get Faucet Funds", + link: "/quickstart/faucet", }, { - text: 'Developer Tools', - link: '/quickstart/developer-tools', + text: "Developer Tools", + link: "/quickstart/developer-tools", }, { - text: 'EVM Differences', - link: '/quickstart/evm-compatibility', + text: "EVM Differences", + link: "/quickstart/evm-compatibility", }, { - text: 'Predeployed Contracts', - link: '/quickstart/predeployed-contracts', + text: "Predeployed Contracts", + link: "/quickstart/predeployed-contracts", }, { - text: 'Wallet Developers', - link: '/quickstart/wallet-developers', + text: "Wallet Developers", + link: "/quickstart/wallet-developers", }, ], }, { - text: 'Start Building on Tempo', + text: "Start Building on Tempo", items: [ { - text: 'Use Tempo Transactions', - link: '/guide/tempo-transaction', + text: "Use Tempo Transactions", + link: "/guide/tempo-transaction", }, { - text: 'Create & Use Accounts', + text: "Create & Use Accounts", collapsed: true, items: [ { - text: 'Overview', - link: '/guide/use-accounts', + text: "Overview", + link: "/guide/use-accounts", }, { - text: 'Embed Passkey accounts', - link: '/guide/use-accounts/embed-passkeys', + text: "Embed Passkey accounts", + link: "/guide/use-accounts/embed-passkeys", }, { - text: 'Connect to wallets', - link: '/guide/use-accounts/connect-to-wallets', + text: "Connect to wallets", + link: "/guide/use-accounts/connect-to-wallets", }, { - text: 'Add funds to your balance', - link: '/guide/use-accounts/add-funds', + text: "Add funds to your balance", + link: "/guide/use-accounts/add-funds", }, ], }, { - text: 'Make Payments', + text: "Make Payments", collapsed: true, items: [ { - text: 'Overview', - link: '/guide/payments', + text: "Overview", + link: "/guide/payments", }, { - text: 'Send a payment', - link: '/guide/payments/send-a-payment', + text: "Send a payment", + link: "/guide/payments/send-a-payment", }, { - text: 'Accept a payment', - link: '/guide/payments/accept-a-payment', + text: "Accept a payment", + link: "/guide/payments/accept-a-payment", }, { - text: 'Attach a transfer memo', - link: '/guide/payments/transfer-memos', + text: "Attach a transfer memo", + link: "/guide/payments/transfer-memos", }, { - text: 'Pay fees in any stablecoin', - link: '/guide/payments/pay-fees-in-any-stablecoin', + text: "Pay fees in any stablecoin", + link: "/guide/payments/pay-fees-in-any-stablecoin", }, { - text: 'Sponsor user fees', - link: '/guide/payments/sponsor-user-fees', + text: "Sponsor user fees", + link: "/guide/payments/sponsor-user-fees", }, { - text: 'Send parallel transactions', - link: '/guide/payments/send-parallel-transactions', + text: "Send parallel transactions", + link: "/guide/payments/send-parallel-transactions", }, // { // text: 'Start a subscription 🚧', @@ -165,346 +166,350 @@ export default defineConfig({ ], }, { - text: 'Issue Stablecoins', + text: "Issue Stablecoins", collapsed: true, items: [ { - text: 'Overview', - link: '/guide/issuance', + text: "Overview", + link: "/guide/issuance", }, { - text: 'Create a stablecoin', - link: '/guide/issuance/create-a-stablecoin', + text: "Create a stablecoin", + link: "/guide/issuance/create-a-stablecoin", }, { - text: 'Mint stablecoins', - link: '/guide/issuance/mint-stablecoins', + text: "Mint stablecoins", + link: "/guide/issuance/mint-stablecoins", }, { - text: 'Use your stablecoin for fees', - link: '/guide/issuance/use-for-fees', + text: "Use your stablecoin for fees", + link: "/guide/issuance/use-for-fees", }, { - text: 'Distribute rewards', - link: '/guide/issuance/distribute-rewards', + text: "Distribute rewards", + link: "/guide/issuance/distribute-rewards", }, { - text: 'Manage your stablecoin', - link: '/guide/issuance/manage-stablecoin', + text: "Manage your stablecoin", + link: "/guide/issuance/manage-stablecoin", }, ], }, { - text: 'Exchange Stablecoins', + text: "Exchange Stablecoins", collapsed: true, items: [ { - text: 'Overview', - link: '/guide/stablecoin-dex', + text: "Overview", + link: "/guide/stablecoin-dex", }, { - text: 'Managing fee liquidity', - link: '/guide/stablecoin-dex/managing-fee-liquidity', + text: "Managing fee liquidity", + link: "/guide/stablecoin-dex/managing-fee-liquidity", }, { - text: 'Executing swaps', - link: '/guide/stablecoin-dex/executing-swaps', + text: "Executing swaps", + link: "/guide/stablecoin-dex/executing-swaps", }, { - text: 'View the orderbook', - link: '/guide/stablecoin-dex/view-the-orderbook', + text: "View the orderbook", + link: "/guide/stablecoin-dex/view-the-orderbook", }, { - text: 'Providing liquidity', - link: '/guide/stablecoin-dex/providing-liquidity', + text: "Providing liquidity", + link: "/guide/stablecoin-dex/providing-liquidity", }, ], }, ], }, { - text: 'Tempo Protocol Specs', + text: "Tempo Protocol Specs", items: [ { - text: 'Overview', - link: '/protocol', + text: "Overview", + link: "/protocol", }, { - text: 'TIP-20 Tokens', + text: "TIP-20 Tokens", collapsed: true, items: [ { - text: 'Overview', - link: '/protocol/tip20/overview', + text: "Overview", + link: "/protocol/tip20/overview", }, { - text: 'Specification', - link: '/protocol/tip20/spec', + text: "Specification", + link: "/protocol/tip20/spec", }, { - text: 'Reference Implementation', - link: 'https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/TIP20.sol', + text: "Reference Implementation", + link: "https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/TIP20.sol", }, { - text: 'Rust Implementation', - link: 'https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip20', + text: "Rust Implementation", + link: "https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip20", }, ], }, { - text: 'TIP-20 Rewards', + text: "TIP-20 Rewards", collapsed: true, items: [ { - text: 'Overview', - link: '/protocol/tip20-rewards/overview', + text: "Overview", + link: "/protocol/tip20-rewards/overview", }, { - text: 'Specification', - link: '/protocol/tip20-rewards/spec', + text: "Specification", + link: "/protocol/tip20-rewards/spec", }, ], }, { - text: 'TIP-403 Policies', + text: "TIP-403 Policies", collapsed: true, items: [ { - text: 'Overview', - link: '/protocol/tip403/overview', + text: "Overview", + link: "/protocol/tip403/overview", }, { - text: 'Specification', - link: '/protocol/tip403/spec', + text: "Specification", + link: "/protocol/tip403/spec", }, { - text: 'Reference Implementation', - link: 'https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/TIP403Registry.sol', + text: "Reference Implementation", + link: "https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/TIP403Registry.sol", }, { - text: 'Rust Implementation', - link: 'https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip403_registry', + text: "Rust Implementation", + link: "https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip403_registry", }, ], }, { - text: 'Fees', + text: "Fees", collapsed: true, items: [ { - text: 'Overview', - link: '/protocol/fees', + text: "Overview", + link: "/protocol/fees", }, { - text: 'Specification', - link: '/protocol/fees/spec-fee', + text: "Specification", + link: "/protocol/fees/spec-fee", }, { - text: 'Fee AMM', + text: "Fee AMM", collapsed: true, items: [ { - text: 'Overview', - link: '/protocol/fees/fee-amm', + text: "Overview", + link: "/protocol/fees/fee-amm", }, { - text: 'Specification', - link: '/protocol/fees/spec-fee-amm', + text: "Specification", + link: "/protocol/fees/spec-fee-amm", }, { - text: 'Reference Implementation', - link: 'https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/FeeManager.sol', + text: "Reference Implementation", + link: "https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/FeeManager.sol", }, { - text: 'Rust Implementation', - link: 'https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip_fee_manager', + text: "Rust Implementation", + link: "https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip_fee_manager", }, ], }, ], }, { - text: 'Tempo Transactions', + text: "Tempo Transactions", collapsed: true, items: [ { - text: 'Overview', - link: '/protocol/transactions', + text: "Overview", + link: "/protocol/transactions", }, { - text: 'Specification', - link: '/protocol/transactions/spec-tempo-transaction', + text: "Specification", + link: "/protocol/transactions/spec-tempo-transaction", }, { - text: 'Account Keychain Precompile Specification', - link: '/protocol/transactions/AccountKeychain', + text: "Account Keychain Precompile Specification", + link: "/protocol/transactions/AccountKeychain", }, { - text: 'Rust Implementation', - link: 'https://github.com/tempoxyz/tempo/blob/main/crates/primitives/src/transaction/tempo_transaction.rs', + text: "Rust Implementation", + link: "https://github.com/tempoxyz/tempo/blob/main/crates/primitives/src/transaction/tempo_transaction.rs", }, ], }, { - text: 'Blockspace', + text: "Blockspace", collapsed: true, items: [ { - text: 'Overview', - link: '/protocol/blockspace/overview', + text: "Overview", + link: "/protocol/blockspace/overview", }, { - text: 'Payment Lane Specification', - link: '/protocol/blockspace/payment-lane-specification', + text: "Payment Lane Specification", + link: "/protocol/blockspace/payment-lane-specification", }, { - text: 'Sub-block Specification', - link: '/protocol/blockspace/sub-block-specification', + text: "Sub-block Specification", + link: "/protocol/blockspace/sub-block-specification", }, ], }, { - text: 'Stablecoin DEX', + text: "Stablecoin DEX", collapsed: true, items: [ { - text: 'Overview', - link: '/protocol/exchange', + text: "Overview", + link: "/protocol/exchange", }, { - text: 'Specification', - link: '/protocol/exchange/spec', + text: "Specification", + link: "/protocol/exchange/spec", }, { - text: 'pathUSD', - link: '/protocol/exchange/pathUSD', + text: "pathUSD", + link: "/protocol/exchange/pathUSD", }, { - text: 'Executing Swaps', - link: '/protocol/exchange/executing-swaps', + text: "Executing Swaps", + link: "/protocol/exchange/executing-swaps", }, { - text: 'Providing Liquidity', - link: '/protocol/exchange/providing-liquidity', + text: "Providing Liquidity", + link: "/protocol/exchange/providing-liquidity", }, { - text: 'DEX Balance', - link: '/protocol/exchange/exchange-balance', + text: "DEX Balance", + link: "/protocol/exchange/exchange-balance", }, { - text: 'Reference Implementation', - link: 'https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/stablecoinDex.sol', + text: "Reference Implementation", + link: "https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/stablecoinDex.sol", }, { - text: 'Rust Implementation', - link: 'https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/stablecoin_exchange', + text: "Rust Implementation", + link: "https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/stablecoin_exchange", }, ], }, { - text: 'TIPs', - link: '/protocol/tips', + text: "TIPs", + link: "/protocol/tips", }, ], }, { - text: 'Tempo SDKs', + text: "Tempo SDKs", collapsed: true, items: [ { - text: 'Overview', - link: '/sdk', + text: "Overview", + link: "/sdk", }, { - text: 'TypeScript', + text: "TypeScript", collapsed: true, items: [ { - text: 'Overview', - link: '/sdk/typescript', + text: "Overview", + link: "/sdk/typescript", }, { - text: 'Viem Reference', - link: 'https://viem.sh/tempo', + text: "Viem Reference", + link: "https://viem.sh/tempo", }, { - text: 'Wagmi Reference', - link: 'https://wagmi.sh/tempo', + text: "Wagmi Reference", + link: "https://wagmi.sh/tempo", }, { - text: 'Server Reference', + text: "Server Reference", items: [ { - text: 'Handlers', + text: "Handlers", items: [ { - text: 'Overview', - link: '/sdk/typescript/server/handlers', + text: "Overview", + link: "/sdk/typescript/server/handlers", }, { - text: 'compose', - link: '/sdk/typescript/server/handler.compose', + text: "compose", + link: "/sdk/typescript/server/handler.compose", }, { - text: 'feePayer', - link: '/sdk/typescript/server/handler.feePayer', + text: "feePayer", + link: "/sdk/typescript/server/handler.feePayer", }, { - text: 'keyManager', - link: '/sdk/typescript/server/handler.keyManager', + text: "keyManager", + link: "/sdk/typescript/server/handler.keyManager", }, ], }, ], }, { - text: 'Prool Reference', + text: "Prool Reference", items: [ { - text: 'Setup', - link: '/sdk/typescript/prool/setup', + text: "Setup", + link: "/sdk/typescript/prool/setup", }, ], }, ], }, { - text: 'Go', - link: '/sdk/go', + text: "Go", + link: "/sdk/go", }, { - text: 'Foundry', - link: '/sdk/foundry', + text: "Foundry", + link: "/sdk/foundry", }, { - text: 'Rust', - link: '/sdk/rust', + text: "Rust", + link: "/sdk/rust", }, ], }, { - text: 'Run a Tempo Node', + text: "Run a Tempo Node", collapsed: true, items: [ { - text: 'Overview', - link: '/guide/node', + text: "Overview", + link: "/guide/node", }, { - text: 'System Requirements', - link: '/guide/node/system-requirements', + text: "System Requirements", + link: "/guide/node/system-requirements", }, { - text: 'Installation', - link: '/guide/node/installation', + text: "Installation", + link: "/guide/node/installation", }, { - text: 'Running an RPC Node', - link: '/guide/node/rpc', + text: "Running an RPC Node", + link: "/guide/node/rpc", }, { - text: 'Running a validator', - link: '/guide/node/validator', + text: "Running a validator", + link: "/guide/node/validator", + }, + { + text: "Operating your validator", + link: "/guide/node/operate-validator", }, ], }, @@ -530,147 +535,148 @@ export default defineConfig({ // ], // }, ], - '/learn': [ + "/learn": [ { - text: 'Home', - link: '/learn', + text: "Home", + link: "/learn", }, { - text: 'Partners', - link: '/learn/partners', + text: "Partners", + link: "/learn/partners", }, { - text: 'Blog', - link: 'https://tempo.xyz/blog', + text: "Blog", + link: "https://tempo.xyz/blog", }, { - text: 'Stablecoins', + text: "Stablecoins", items: [ { - text: 'Overview', - link: '/learn/stablecoins', + text: "Overview", + link: "/learn/stablecoins", }, { - text: 'Remittances', - link: '/learn/use-cases/remittances', + text: "Remittances", + link: "/learn/use-cases/remittances", }, { - text: 'Global Payouts', - link: '/learn/use-cases/global-payouts', + text: "Global Payouts", + link: "/learn/use-cases/global-payouts", }, { - text: 'Embedded Finance', - link: '/learn/use-cases/embedded-finance', + text: "Embedded Finance", + link: "/learn/use-cases/embedded-finance", }, { - text: 'Tokenized Deposits', - link: '/learn/use-cases/tokenized-deposits', + text: "Tokenized Deposits", + link: "/learn/use-cases/tokenized-deposits", }, { - text: 'Microtransactions', - link: '/learn/use-cases/microtransactions', + text: "Microtransactions", + link: "/learn/use-cases/microtransactions", }, { - text: 'Agentic Commerce', - link: '/learn/use-cases/agentic-commerce', + text: "Agentic Commerce", + link: "/learn/use-cases/agentic-commerce", }, ], }, { - text: 'Tempo', + text: "Tempo", items: [ { - text: 'Overview', - link: '/learn/tempo', + text: "Overview", + link: "/learn/tempo", }, { - text: 'Native Stablecoins', - link: '/learn/tempo/native-stablecoins', + text: "Native Stablecoins", + link: "/learn/tempo/native-stablecoins", }, { - text: 'Modern Transactions', - link: '/learn/tempo/modern-transactions', + text: "Modern Transactions", + link: "/learn/tempo/modern-transactions", }, { - text: 'Performance', - link: '/learn/tempo/performance', + text: "Performance", + link: "/learn/tempo/performance", }, { - text: 'Onchain FX', - link: '/learn/tempo/fx', + text: "Onchain FX", + link: "/learn/tempo/fx", }, { - text: 'Privacy', - link: '/learn/tempo/privacy', + text: "Privacy", + link: "/learn/tempo/privacy", }, ], }, ], }, topNav: [ - { text: 'Learn', link: '/learn' }, + { text: "Learn", link: "/learn" }, { - text: 'Docs', - link: '/', + text: "Docs", + link: "/", }, - { text: 'Ecosystem', link: 'https://tempo.xyz/ecosystem' }, - { text: 'Blog', link: 'https://tempo.xyz/blog' }, + { text: "Ecosystem", link: "https://tempo.xyz/ecosystem" }, + { text: "Blog", link: "https://tempo.xyz/blog" }, ], redirects: [ { - source: '/documentation/protocol/:path*', - destination: '/protocol/:path*', + source: "/documentation/protocol/:path*", + destination: "/protocol/:path*", }, { - source: '/errors/tx/SubblockNonceKey', - destination: '/protocol/blockspace/subblock-specification#4-block-validity-rules', + source: "/errors/tx/SubblockNonceKey", + destination: + "/protocol/blockspace/subblock-specification#4-block-validity-rules", }, { - source: '/protocol/blockspace/sub-block-specification', - destination: '/protocol/blockspace/subblock-specification', + source: "/protocol/blockspace/sub-block-specification", + destination: "/protocol/blockspace/subblock-specification", status: 301, }, { - source: '/stablecoin-exchange/:path*', - destination: '/stablecoin-dex/:path*', + source: "/stablecoin-exchange/:path*", + destination: "/stablecoin-dex/:path*", status: 301, }, { - source: '/guide', - destination: '/quickstart/integrate-tempo', + source: "/guide", + destination: "/quickstart/integrate-tempo", }, { - source: '/quickstart', - destination: '/quickstart/integrate-tempo', + source: "/quickstart", + destination: "/quickstart/integrate-tempo", }, { - source: '/protocol/blockspace', - destination: '/protocol/blockspace/overview', + source: "/protocol/blockspace", + destination: "/protocol/blockspace/overview", }, { - source: '/protocol/tip20', - destination: '/protocol/tip20/overview', + source: "/protocol/tip20", + destination: "/protocol/tip20/overview", }, { - source: '/protocol/tip20-rewards', - destination: '/protocol/tip20-rewards/overview', + source: "/protocol/tip20-rewards", + destination: "/protocol/tip20-rewards/overview", }, { - source: '/protocol/tip403', - destination: '/protocol/tip403/overview', + source: "/protocol/tip403", + destination: "/protocol/tip403/overview", }, { - source: '/learn/use-cases', - destination: '/learn/use-cases/remittances', + source: "/learn/use-cases", + destination: "/learn/use-cases/remittances", }, { - source: '/sdk/typescript/server', - destination: '/sdk/typescript/server/handlers', + source: "/sdk/typescript/server", + destination: "/sdk/typescript/server/handlers", }, { - source: '/sdk/typescript/prool', - destination: '/sdk/typescript/prool/setup', + source: "/sdk/typescript/prool", + destination: "/sdk/typescript/prool/setup", }, ], twoslash: { @@ -681,4 +687,4 @@ export default defineConfig({ }, }, }, -}) +}); From a18669de22e3343fae05f32b06cdeefba04edd2a Mon Sep 17 00:00:00 2001 From: Zygimantas <5236121+Zygimantass@users.noreply.github.com> Date: Wed, 21 Jan 2026 15:11:28 +0100 Subject: [PATCH 02/13] fix --- vocs.config.ts | 566 ++++++++++++++++++++++++------------------------- 1 file changed, 282 insertions(+), 284 deletions(-) diff --git a/vocs.config.ts b/vocs.config.ts index 24ea1ac4..77f3c5cb 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -1,157 +1,156 @@ -import { Changelog, defineConfig, McpSource } from "vocs/config"; +import { Changelog, defineConfig, McpSource } from 'vocs/config' const baseUrl = (() => { - if (process.env.VERCEL_ENV === "production") - return `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}`; - if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}`; - return ""; -})(); + if (process.env.VERCEL_ENV === 'production') + return `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}` + if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}` + return '' +})() export default defineConfig({ - changelog: Changelog.github({ prereleases: true, repo: "tempoxyz/tempo" }), + changelog: Changelog.github({ prereleases: true, repo: 'tempoxyz/tempo' }), checkDeadlinks: false, - title: "Tempo", - titleTemplate: "%s ⋅ Tempo", - description: - "Documentation for the Tempo network and protocol specifications", + title: 'Tempo', + titleTemplate: '%s ⋅ Tempo', + description: 'Documentation for the Tempo network and protocol specifications', mcp: { enabled: true, sources: [ - McpSource.github({ repo: "tempoxyz/tempo" }), - McpSource.github({ repo: "paradigmxyz/reth" }), - McpSource.github({ repo: "foundry-rs/foundry" }), - McpSource.github({ repo: "wevm/viem" }), - McpSource.github({ repo: "wevm/wagmi" }), - McpSource.github({ repo: "tempoxyz/tempo-ts" }), + McpSource.github({ repo: 'tempoxyz/tempo' }), + McpSource.github({ repo: 'paradigmxyz/reth' }), + McpSource.github({ repo: 'foundry-rs/foundry' }), + McpSource.github({ repo: 'wevm/viem' }), + McpSource.github({ repo: 'wevm/wagmi' }), + McpSource.github({ repo: 'tempoxyz/tempo-ts' }), ], }, baseUrl: baseUrl || undefined, - ogImageUrl: (path, { baseUrl } = { baseUrl: "" }) => - path === "/" + ogImageUrl: (path, { baseUrl } = { baseUrl: '' }) => + path === '/' ? `${baseUrl}/og-docs.png` : `${baseUrl}/api/og?title=%title&description=%description`, logoUrl: { - light: "/lockup-light.svg", - dark: "/lockup-dark.svg", + light: '/lockup-light.svg', + dark: '/lockup-dark.svg', }, iconUrl: { - light: "/icon-light.png", - dark: "/icon-dark.png", + light: '/icon-light.png', + dark: '/icon-dark.png', }, - rootDir: ".", + rootDir: '.', socials: [ { - icon: "github", - link: "https://github.com/tempoxyz", + icon: 'github', + link: 'https://github.com/tempoxyz', }, { - icon: "x", - link: "https://twitter.com/tempo", + icon: 'x', + link: 'https://twitter.com/tempo', }, ], sidebar: { - "/": [ + '/': [ { - text: "Home", - link: "/", + text: 'Home', + link: '/', }, { - text: "Changelog", - link: "/changelog", + text: 'Changelog', + link: '/changelog', }, { - text: "Integrate Tempo Testnet", + text: 'Integrate Tempo Testnet', items: [ { - text: "Overview", - link: "/quickstart/integrate-tempo", + text: 'Overview', + link: '/quickstart/integrate-tempo', }, { - text: "Connect to the Network", - link: "/quickstart/connection-details", + text: 'Connect to the Network', + link: '/quickstart/connection-details', }, { - text: "Get Faucet Funds", - link: "/quickstart/faucet", + text: 'Get Faucet Funds', + link: '/quickstart/faucet', }, { - text: "Developer Tools", - link: "/quickstart/developer-tools", + text: 'Developer Tools', + link: '/quickstart/developer-tools', }, { - text: "EVM Differences", - link: "/quickstart/evm-compatibility", + text: 'EVM Differences', + link: '/quickstart/evm-compatibility', }, { - text: "Predeployed Contracts", - link: "/quickstart/predeployed-contracts", + text: 'Predeployed Contracts', + link: '/quickstart/predeployed-contracts', }, { - text: "Wallet Developers", - link: "/quickstart/wallet-developers", + text: 'Wallet Developers', + link: '/quickstart/wallet-developers', }, ], }, { - text: "Start Building on Tempo", + text: 'Start Building on Tempo', items: [ { - text: "Use Tempo Transactions", - link: "/guide/tempo-transaction", + text: 'Use Tempo Transactions', + link: '/guide/tempo-transaction', }, { - text: "Create & Use Accounts", + text: 'Create & Use Accounts', collapsed: true, items: [ { - text: "Overview", - link: "/guide/use-accounts", + text: 'Overview', + link: '/guide/use-accounts', }, { - text: "Embed Passkey accounts", - link: "/guide/use-accounts/embed-passkeys", + text: 'Embed Passkey accounts', + link: '/guide/use-accounts/embed-passkeys', }, { - text: "Connect to wallets", - link: "/guide/use-accounts/connect-to-wallets", + text: 'Connect to wallets', + link: '/guide/use-accounts/connect-to-wallets', }, { - text: "Add funds to your balance", - link: "/guide/use-accounts/add-funds", + text: 'Add funds to your balance', + link: '/guide/use-accounts/add-funds', }, ], }, { - text: "Make Payments", + text: 'Make Payments', collapsed: true, items: [ { - text: "Overview", - link: "/guide/payments", + text: 'Overview', + link: '/guide/payments', }, { - text: "Send a payment", - link: "/guide/payments/send-a-payment", + text: 'Send a payment', + link: '/guide/payments/send-a-payment', }, { - text: "Accept a payment", - link: "/guide/payments/accept-a-payment", + text: 'Accept a payment', + link: '/guide/payments/accept-a-payment', }, { - text: "Attach a transfer memo", - link: "/guide/payments/transfer-memos", + text: 'Attach a transfer memo', + link: '/guide/payments/transfer-memos', }, { - text: "Pay fees in any stablecoin", - link: "/guide/payments/pay-fees-in-any-stablecoin", + text: 'Pay fees in any stablecoin', + link: '/guide/payments/pay-fees-in-any-stablecoin', }, { - text: "Sponsor user fees", - link: "/guide/payments/sponsor-user-fees", + text: 'Sponsor user fees', + link: '/guide/payments/sponsor-user-fees', }, { - text: "Send parallel transactions", - link: "/guide/payments/send-parallel-transactions", + text: 'Send parallel transactions', + link: '/guide/payments/send-parallel-transactions', }, // { // text: 'Start a subscription 🚧', @@ -166,350 +165,350 @@ export default defineConfig({ ], }, { - text: "Issue Stablecoins", + text: 'Issue Stablecoins', collapsed: true, items: [ { - text: "Overview", - link: "/guide/issuance", + text: 'Overview', + link: '/guide/issuance', }, { - text: "Create a stablecoin", - link: "/guide/issuance/create-a-stablecoin", + text: 'Create a stablecoin', + link: '/guide/issuance/create-a-stablecoin', }, { - text: "Mint stablecoins", - link: "/guide/issuance/mint-stablecoins", + text: 'Mint stablecoins', + link: '/guide/issuance/mint-stablecoins', }, { - text: "Use your stablecoin for fees", - link: "/guide/issuance/use-for-fees", + text: 'Use your stablecoin for fees', + link: '/guide/issuance/use-for-fees', }, { - text: "Distribute rewards", - link: "/guide/issuance/distribute-rewards", + text: 'Distribute rewards', + link: '/guide/issuance/distribute-rewards', }, { - text: "Manage your stablecoin", - link: "/guide/issuance/manage-stablecoin", + text: 'Manage your stablecoin', + link: '/guide/issuance/manage-stablecoin', }, ], }, { - text: "Exchange Stablecoins", + text: 'Exchange Stablecoins', collapsed: true, items: [ { - text: "Overview", - link: "/guide/stablecoin-dex", + text: 'Overview', + link: '/guide/stablecoin-dex', }, { - text: "Managing fee liquidity", - link: "/guide/stablecoin-dex/managing-fee-liquidity", + text: 'Managing fee liquidity', + link: '/guide/stablecoin-dex/managing-fee-liquidity', }, { - text: "Executing swaps", - link: "/guide/stablecoin-dex/executing-swaps", + text: 'Executing swaps', + link: '/guide/stablecoin-dex/executing-swaps', }, { - text: "View the orderbook", - link: "/guide/stablecoin-dex/view-the-orderbook", + text: 'View the orderbook', + link: '/guide/stablecoin-dex/view-the-orderbook', }, { - text: "Providing liquidity", - link: "/guide/stablecoin-dex/providing-liquidity", + text: 'Providing liquidity', + link: '/guide/stablecoin-dex/providing-liquidity', }, ], }, ], }, { - text: "Tempo Protocol Specs", + text: 'Tempo Protocol Specs', items: [ { - text: "Overview", - link: "/protocol", + text: 'Overview', + link: '/protocol', }, { - text: "TIP-20 Tokens", + text: 'TIP-20 Tokens', collapsed: true, items: [ { - text: "Overview", - link: "/protocol/tip20/overview", + text: 'Overview', + link: '/protocol/tip20/overview', }, { - text: "Specification", - link: "/protocol/tip20/spec", + text: 'Specification', + link: '/protocol/tip20/spec', }, { - text: "Reference Implementation", - link: "https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/TIP20.sol", + text: 'Reference Implementation', + link: 'https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/TIP20.sol', }, { - text: "Rust Implementation", - link: "https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip20", + text: 'Rust Implementation', + link: 'https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip20', }, ], }, { - text: "TIP-20 Rewards", + text: 'TIP-20 Rewards', collapsed: true, items: [ { - text: "Overview", - link: "/protocol/tip20-rewards/overview", + text: 'Overview', + link: '/protocol/tip20-rewards/overview', }, { - text: "Specification", - link: "/protocol/tip20-rewards/spec", + text: 'Specification', + link: '/protocol/tip20-rewards/spec', }, ], }, { - text: "TIP-403 Policies", + text: 'TIP-403 Policies', collapsed: true, items: [ { - text: "Overview", - link: "/protocol/tip403/overview", + text: 'Overview', + link: '/protocol/tip403/overview', }, { - text: "Specification", - link: "/protocol/tip403/spec", + text: 'Specification', + link: '/protocol/tip403/spec', }, { - text: "Reference Implementation", - link: "https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/TIP403Registry.sol", + text: 'Reference Implementation', + link: 'https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/TIP403Registry.sol', }, { - text: "Rust Implementation", - link: "https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip403_registry", + text: 'Rust Implementation', + link: 'https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip403_registry', }, ], }, { - text: "Fees", + text: 'Fees', collapsed: true, items: [ { - text: "Overview", - link: "/protocol/fees", + text: 'Overview', + link: '/protocol/fees', }, { - text: "Specification", - link: "/protocol/fees/spec-fee", + text: 'Specification', + link: '/protocol/fees/spec-fee', }, { - text: "Fee AMM", + text: 'Fee AMM', collapsed: true, items: [ { - text: "Overview", - link: "/protocol/fees/fee-amm", + text: 'Overview', + link: '/protocol/fees/fee-amm', }, { - text: "Specification", - link: "/protocol/fees/spec-fee-amm", + text: 'Specification', + link: '/protocol/fees/spec-fee-amm', }, { - text: "Reference Implementation", - link: "https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/FeeManager.sol", + text: 'Reference Implementation', + link: 'https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/FeeManager.sol', }, { - text: "Rust Implementation", - link: "https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip_fee_manager", + text: 'Rust Implementation', + link: 'https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip_fee_manager', }, ], }, ], }, { - text: "Tempo Transactions", + text: 'Tempo Transactions', collapsed: true, items: [ { - text: "Overview", - link: "/protocol/transactions", + text: 'Overview', + link: '/protocol/transactions', }, { - text: "Specification", - link: "/protocol/transactions/spec-tempo-transaction", + text: 'Specification', + link: '/protocol/transactions/spec-tempo-transaction', }, { - text: "Account Keychain Precompile Specification", - link: "/protocol/transactions/AccountKeychain", + text: 'Account Keychain Precompile Specification', + link: '/protocol/transactions/AccountKeychain', }, { - text: "Rust Implementation", - link: "https://github.com/tempoxyz/tempo/blob/main/crates/primitives/src/transaction/tempo_transaction.rs", + text: 'Rust Implementation', + link: 'https://github.com/tempoxyz/tempo/blob/main/crates/primitives/src/transaction/tempo_transaction.rs', }, ], }, { - text: "Blockspace", + text: 'Blockspace', collapsed: true, items: [ { - text: "Overview", - link: "/protocol/blockspace/overview", + text: 'Overview', + link: '/protocol/blockspace/overview', }, { - text: "Payment Lane Specification", - link: "/protocol/blockspace/payment-lane-specification", + text: 'Payment Lane Specification', + link: '/protocol/blockspace/payment-lane-specification', }, { - text: "Sub-block Specification", - link: "/protocol/blockspace/sub-block-specification", + text: 'Sub-block Specification', + link: '/protocol/blockspace/sub-block-specification', }, ], }, { - text: "Stablecoin DEX", + text: 'Stablecoin DEX', collapsed: true, items: [ { - text: "Overview", - link: "/protocol/exchange", + text: 'Overview', + link: '/protocol/exchange', }, { - text: "Specification", - link: "/protocol/exchange/spec", + text: 'Specification', + link: '/protocol/exchange/spec', }, { - text: "pathUSD", - link: "/protocol/exchange/pathUSD", + text: 'pathUSD', + link: '/protocol/exchange/pathUSD', }, { - text: "Executing Swaps", - link: "/protocol/exchange/executing-swaps", + text: 'Executing Swaps', + link: '/protocol/exchange/executing-swaps', }, { - text: "Providing Liquidity", - link: "/protocol/exchange/providing-liquidity", + text: 'Providing Liquidity', + link: '/protocol/exchange/providing-liquidity', }, { - text: "DEX Balance", - link: "/protocol/exchange/exchange-balance", + text: 'DEX Balance', + link: '/protocol/exchange/exchange-balance', }, { - text: "Reference Implementation", - link: "https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/stablecoinDex.sol", + text: 'Reference Implementation', + link: 'https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/stablecoinDex.sol', }, { - text: "Rust Implementation", - link: "https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/stablecoin_exchange", + text: 'Rust Implementation', + link: 'https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/stablecoin_exchange', }, ], }, { - text: "TIPs", - link: "/protocol/tips", + text: 'TIPs', + link: '/protocol/tips', }, ], }, { - text: "Tempo SDKs", + text: 'Tempo SDKs', collapsed: true, items: [ { - text: "Overview", - link: "/sdk", + text: 'Overview', + link: '/sdk', }, { - text: "TypeScript", + text: 'TypeScript', collapsed: true, items: [ { - text: "Overview", - link: "/sdk/typescript", + text: 'Overview', + link: '/sdk/typescript', }, { - text: "Viem Reference", - link: "https://viem.sh/tempo", + text: 'Viem Reference', + link: 'https://viem.sh/tempo', }, { - text: "Wagmi Reference", - link: "https://wagmi.sh/tempo", + text: 'Wagmi Reference', + link: 'https://wagmi.sh/tempo', }, { - text: "Server Reference", + text: 'Server Reference', items: [ { - text: "Handlers", + text: 'Handlers', items: [ { - text: "Overview", - link: "/sdk/typescript/server/handlers", + text: 'Overview', + link: '/sdk/typescript/server/handlers', }, { - text: "compose", - link: "/sdk/typescript/server/handler.compose", + text: 'compose', + link: '/sdk/typescript/server/handler.compose', }, { - text: "feePayer", - link: "/sdk/typescript/server/handler.feePayer", + text: 'feePayer', + link: '/sdk/typescript/server/handler.feePayer', }, { - text: "keyManager", - link: "/sdk/typescript/server/handler.keyManager", + text: 'keyManager', + link: '/sdk/typescript/server/handler.keyManager', }, ], }, ], }, { - text: "Prool Reference", + text: 'Prool Reference', items: [ { - text: "Setup", - link: "/sdk/typescript/prool/setup", + text: 'Setup', + link: '/sdk/typescript/prool/setup', }, ], }, ], }, { - text: "Go", - link: "/sdk/go", + text: 'Go', + link: '/sdk/go', }, { - text: "Foundry", - link: "/sdk/foundry", + text: 'Foundry', + link: '/sdk/foundry', }, { - text: "Rust", - link: "/sdk/rust", + text: 'Rust', + link: '/sdk/rust', }, ], }, { - text: "Run a Tempo Node", + text: 'Run a Tempo Node', collapsed: true, items: [ { - text: "Overview", - link: "/guide/node", + text: 'Overview', + link: '/guide/node', }, { - text: "System Requirements", - link: "/guide/node/system-requirements", + text: 'System Requirements', + link: '/guide/node/system-requirements', }, { - text: "Installation", - link: "/guide/node/installation", + text: 'Installation', + link: '/guide/node/installation', }, { - text: "Running an RPC Node", - link: "/guide/node/rpc", + text: 'Running an RPC Node', + link: '/guide/node/rpc', }, { - text: "Running a validator", - link: "/guide/node/validator", + text: 'Running a validator', + link: '/guide/node/validator', }, { - text: "Operating your validator", - link: "/guide/node/operate-validator", + text: 'Operating your validator', + link: '/guide/node/operate-validator', }, ], }, @@ -535,148 +534,147 @@ export default defineConfig({ // ], // }, ], - "/learn": [ + '/learn': [ { - text: "Home", - link: "/learn", + text: 'Home', + link: '/learn', }, { - text: "Partners", - link: "/learn/partners", + text: 'Partners', + link: '/learn/partners', }, { - text: "Blog", - link: "https://tempo.xyz/blog", + text: 'Blog', + link: 'https://tempo.xyz/blog', }, { - text: "Stablecoins", + text: 'Stablecoins', items: [ { - text: "Overview", - link: "/learn/stablecoins", + text: 'Overview', + link: '/learn/stablecoins', }, { - text: "Remittances", - link: "/learn/use-cases/remittances", + text: 'Remittances', + link: '/learn/use-cases/remittances', }, { - text: "Global Payouts", - link: "/learn/use-cases/global-payouts", + text: 'Global Payouts', + link: '/learn/use-cases/global-payouts', }, { - text: "Embedded Finance", - link: "/learn/use-cases/embedded-finance", + text: 'Embedded Finance', + link: '/learn/use-cases/embedded-finance', }, { - text: "Tokenized Deposits", - link: "/learn/use-cases/tokenized-deposits", + text: 'Tokenized Deposits', + link: '/learn/use-cases/tokenized-deposits', }, { - text: "Microtransactions", - link: "/learn/use-cases/microtransactions", + text: 'Microtransactions', + link: '/learn/use-cases/microtransactions', }, { - text: "Agentic Commerce", - link: "/learn/use-cases/agentic-commerce", + text: 'Agentic Commerce', + link: '/learn/use-cases/agentic-commerce', }, ], }, { - text: "Tempo", + text: 'Tempo', items: [ { - text: "Overview", - link: "/learn/tempo", + text: 'Overview', + link: '/learn/tempo', }, { - text: "Native Stablecoins", - link: "/learn/tempo/native-stablecoins", + text: 'Native Stablecoins', + link: '/learn/tempo/native-stablecoins', }, { - text: "Modern Transactions", - link: "/learn/tempo/modern-transactions", + text: 'Modern Transactions', + link: '/learn/tempo/modern-transactions', }, { - text: "Performance", - link: "/learn/tempo/performance", + text: 'Performance', + link: '/learn/tempo/performance', }, { - text: "Onchain FX", - link: "/learn/tempo/fx", + text: 'Onchain FX', + link: '/learn/tempo/fx', }, { - text: "Privacy", - link: "/learn/tempo/privacy", + text: 'Privacy', + link: '/learn/tempo/privacy', }, ], }, ], }, topNav: [ - { text: "Learn", link: "/learn" }, + { text: 'Learn', link: '/learn' }, { - text: "Docs", - link: "/", + text: 'Docs', + link: '/', }, - { text: "Ecosystem", link: "https://tempo.xyz/ecosystem" }, - { text: "Blog", link: "https://tempo.xyz/blog" }, + { text: 'Ecosystem', link: 'https://tempo.xyz/ecosystem' }, + { text: 'Blog', link: 'https://tempo.xyz/blog' }, ], redirects: [ { - source: "/documentation/protocol/:path*", - destination: "/protocol/:path*", + source: '/documentation/protocol/:path*', + destination: '/protocol/:path*', }, { - source: "/errors/tx/SubblockNonceKey", - destination: - "/protocol/blockspace/subblock-specification#4-block-validity-rules", + source: '/errors/tx/SubblockNonceKey', + destination: '/protocol/blockspace/subblock-specification#4-block-validity-rules', }, { - source: "/protocol/blockspace/sub-block-specification", - destination: "/protocol/blockspace/subblock-specification", + source: '/protocol/blockspace/sub-block-specification', + destination: '/protocol/blockspace/subblock-specification', status: 301, }, { - source: "/stablecoin-exchange/:path*", - destination: "/stablecoin-dex/:path*", + source: '/stablecoin-exchange/:path*', + destination: '/stablecoin-dex/:path*', status: 301, }, { - source: "/guide", - destination: "/quickstart/integrate-tempo", + source: '/guide', + destination: '/quickstart/integrate-tempo', }, { - source: "/quickstart", - destination: "/quickstart/integrate-tempo", + source: '/quickstart', + destination: '/quickstart/integrate-tempo', }, { - source: "/protocol/blockspace", - destination: "/protocol/blockspace/overview", + source: '/protocol/blockspace', + destination: '/protocol/blockspace/overview', }, { - source: "/protocol/tip20", - destination: "/protocol/tip20/overview", + source: '/protocol/tip20', + destination: '/protocol/tip20/overview', }, { - source: "/protocol/tip20-rewards", - destination: "/protocol/tip20-rewards/overview", + source: '/protocol/tip20-rewards', + destination: '/protocol/tip20-rewards/overview', }, { - source: "/protocol/tip403", - destination: "/protocol/tip403/overview", + source: '/protocol/tip403', + destination: '/protocol/tip403/overview', }, { - source: "/learn/use-cases", - destination: "/learn/use-cases/remittances", + source: '/learn/use-cases', + destination: '/learn/use-cases/remittances', }, { - source: "/sdk/typescript/server", - destination: "/sdk/typescript/server/handlers", + source: '/sdk/typescript/server', + destination: '/sdk/typescript/server/handlers', }, { - source: "/sdk/typescript/prool", - destination: "/sdk/typescript/prool/setup", + source: '/sdk/typescript/prool', + destination: '/sdk/typescript/prool/setup', }, ], twoslash: { @@ -687,4 +685,4 @@ export default defineConfig({ }, }, }, -}); +}) From a495a10c220d1fd8612034232eb875245ce7f754 Mon Sep 17 00:00:00 2001 From: Zygimantas <5236121+Zygimantass@users.noreply.github.com> Date: Fri, 23 Jan 2026 16:40:35 +0100 Subject: [PATCH 03/13] feat: more docs --- src/pages/guide/node/operate-validator.mdx | 146 +++++++++++++------ src/pages/guide/node/system-requirements.mdx | 22 ++- src/pages/guide/node/validator.mdx | 43 +----- vocs.config.ts | 8 + 4 files changed, 129 insertions(+), 90 deletions(-) diff --git a/src/pages/guide/node/operate-validator.mdx b/src/pages/guide/node/operate-validator.mdx index 266f0905..ac6cf74b 100644 --- a/src/pages/guide/node/operate-validator.mdx +++ b/src/pages/guide/node/operate-validator.mdx @@ -7,51 +7,118 @@ description: Day-to-day operations for Tempo validators. Node lifecycle, upgrade This guide covers day-to-day operations for running a Tempo validator in production. -## Node Lifecycle +## Validator states -### Starting and Stopping +Your validator moves through different states during operation. Here's how to identify each. -Use `SIGINT` (Ctrl+C) or `SIGTERM` to gracefully stop the node: +### DKG ceremony + +DKG (Distributed Key Generation) ceremonies run approximately every 3 hours to generate threshold signing shares. + +#### Non-dealer / non-player + +Your validator is not participating in the current DKG ceremony. This is normal if: +- You're a new validator waiting to join the next ceremony +- The ceremony hasn't started yet + +#### Player + +Your validator is receiving shares from dealers during the ceremony. + +#### Dealer + +Your validator is distributing shares to other validators during the ceremony. + +#### Checking DKG state + +Monitor these metrics to track DKG participation: ```bash -# If running directly -kill -INT +# How many times YOUR node has been a dealer (distributing shares) - this metric should be >0 over 6 hours +curl -s localhost:8002/metrics | grep consensus_engine_dkg_manager_how_often_dealer -# If running via systemd -sudo systemctl stop tempo +# How many times YOUR node has been a player (receiving shares) - this metric should be >0 over 6 hours +curl -s localhost:8002/metrics | grep consensus_engine_dkg_manager_how_often_player + +# Successful ceremonies (should increase every ~3 hours) +curl -s localhost:8002/metrics | grep consensus_engine_dkg_manager_ceremony_successes_total + +# Failed ceremonies (should stay at 0 or increase rarely) +curl -s localhost:8002/metrics | grep consensus_engine_dkg_manager_ceremony_failures_total ``` -The node will finish processing the current block before shutting down. Avoid using `SIGKILL` as it may corrupt the database. +If `how_often_dealer` or `how_often_player` is increasing, your node is actively participating in DKG ceremonies. -### Resetting your validator's data +### Consensus -Validators can safely restart from a snapshot if needed: +#### Proposer +Your validator is currently the leader and proposing blocks. Check proposal activity: ```bash -# Stop the node -sudo systemctl stop tempo +# Number of blocks your node has built and resolved +curl -s localhost:8002/metrics | grep reth_payloads_resolved_block +``` -# Remove old data (keep your signing key!) -rm -rf /db +If this counter is increasing, your validator is actively proposing blocks. -# Download fresh snapshot -tempo download --datadir +#### Voter -# Start the node -sudo systemctl start tempo +Your validator is voting on blocks proposed by others (notarization and finalization). This is the most common state. + +```bash +# Inbound voting messages (should increase steadily) +curl -s localhost:8002/metrics | grep consensus_engine_consensus_voter_inbound_messages_total | grep data_0 ``` -After restarting, your validator will rejoin the active set once it syncs to the chain tip and participates in the next DKG ceremony (up to 3 hours). -Your node needs to wait for the next DKG ceremony to receive its' signing share. +This counter should increase steadily when your node is participating in consensus. -### Changing your validator's instance +### Execution -If needed, you can also migrate your validator to another instance (e.g. move to another bare-metal server). -This requires shutting down your old node, downloading a snapshot and starting with the consensus key. +#### Catching up -The new validator needs to have the same IP address and port as the old one, since the Tempo validator contract does not currently support updating the IP address. +Your node is syncing historical blocks. -Since your validator is starting from fresh state, you will need to wait for the next DKG ceremony for your validator to receive a signing share (up to 3 hours). +```bash +# Check sync stage +curl -s localhost:8002/metrics | grep reth_sync_checkpoint +``` + +If `reth_sync_checkpoint` shows stages other than `Finish`, you're still syncing. + +#### Up to sync + +Your node is fully synced and processing new blocks in real-time. + +```bash +# Processed height should match or be close to finalized height +curl -s localhost:8002/metrics | grep -E "marshal_finalized_height|marshal_processed_height" +``` + +Both values should be nearly equal and increasing together. + +## Node Lifecycle + +### Starting and Stopping + +Use `SIGINT` (Ctrl+C) or `SIGTERM` to gracefully stop the node: + +```bash +# If running directly +kill -INT + +# If running via systemd +sudo systemctl stop tempo +``` + +The node will finish processing the current block before shutting down. Avoid using `SIGKILL` as it may corrupt the database. + +### Resetting your validator's data + +:::danger +**You cannot reset a validator's data and continue with the same identity.** Doing so risks inconsistent voting, which can cause irrecoverable network safety failures. See [Recovery procedures](/guide/node/troubleshoot-validator#recovery-procedures) for the correct process. +::: + +If you need to reset your validator's data, you must rotate to a new validator identity. This requires coordinating with the Tempo team to deactivate your old identity and register a new one. ## Key Management @@ -76,7 +143,12 @@ The old validator identity must be deactivated before the new one is activated ### Signing Share Recovery -If you lose your signing share (stored on the database in `/consensus/`), your validator will automatically receive a new share at the next DKG ceremony. This takes up to 3 hours depending on the epoch stage. +:::danger +**You cannot reset a validator's data and continue with the same identity.** Doing so risks inconsistent voting, which can cause irrecoverable network safety failures. See [Recovery procedures](/guide/node/troubleshoot-validator#recovery-procedures) for the correct process. +::: + +If you lose your signing share (stored on the database in `/consensus/`), you will need to rotate to a new validator identity. This requires coordinating with the Tempo team to deactivate your old identity and register a new one. +We're planning to release a high-availability feature that allows storing consensus data in an external database, which will enable signing share recovery without the need for key rotation. ## Log Management @@ -121,25 +193,3 @@ This is a table of the most important metrics to watch on your validator node: | `consensus_engine_consensus_voter_inbound_messages_total` | Number of inbound messages related to voting on the consensus layer | Warning when it's not increasing and your node is synced | Your node is receiving voting messages from the consensus layer | | `reth_sync_checkpoint` | Current sync progress | Warning on when there are no changes in the `Finish` stage | Your node is syncing with the network | | `reth_payloads_resolved_block` | Number of built and resolved payloads | Warning when it hasn't increased in 12 hours | Your node has built and resolved blocks | - -## Troubleshooting - -### Node stalled at specific height - -If your node stops syncing at a specific block: - -1. Check if other validators are also stuck (e.g. on the [Tempo Explorer](https://explore.tempo.xyz)) -2. Check for errors in logs: - ```bash - sudo journalctl -u tempo -n 5000 | grep -i "error\|panic\|fatal" - ``` -3. Try restarting from snapshot if the issue persists - -### Not receiving signing share - -If `consensus_engine_dkg_manager_ceremony_successes_total` stays at 0 after 6-12 hours: - -1. Verify your IP is whitelisted correctly -2. Check firewall allows inbound/outbound on port 30303 -3. Confirm your node is synced and connected to consensus peers -4. Wait for the next DKG ceremony (runs every ~3 hours) diff --git a/src/pages/guide/node/system-requirements.mdx b/src/pages/guide/node/system-requirements.mdx index 2eb41d37..e04e7e29 100644 --- a/src/pages/guide/node/system-requirements.mdx +++ b/src/pages/guide/node/system-requirements.mdx @@ -12,10 +12,10 @@ but we still highly recommend to follow the recommended specifications. This wil | Component | Minimum | Recommended | |-----------|---------|-------------| -| **CPU** | 8 cores | 16+ cores | -| **RAM** | 16 GB | 32 GB | -| **Storage** | 250 GB SSD | 500 GB NVMe | -| **Network** | 500 Mbps | 1 Gbps | +| **CPU** | 16 cores | 32+ cores | +| **RAM** | 32 GB | 64 GB | +| **Storage** | 1000 GB NVMe | 2000 GB NVMe | +| **Network** | 1 Gbps | 10 Gbps | ## Validator Node @@ -26,6 +26,20 @@ but we still highly recommend to follow the recommended specifications. This wil | **Storage** | 100 GB NVMe | 1 TB NVMe | | **Network** | 1 Gbps | 1 Gbps | +## Cloud provider recommendations + +These dedicated servers meet or exceed the recommended specs for both RPC and validator nodes: + +| Provider | Server | CPU | RAM | Storage | +|----------|--------|-----|-----|---------| +| OVH | Advance-4 | Intel Xeon-E 2386G (6c/12t) | 32 GB | 2× 512 GB NVMe | +| Hetzner | AX42 | AMD Ryzen 5 3600 (6c/12t) | 64 GB | 2× 512 GB NVMe | +| AWS | `c6id.8xlarge` | 32 vCPUs | 64 GB | 1.9 TB NVMe | + +:::warning +Cloud instances with network-attached storage (e.g., AWS EBS) do not provide sufficient I/O performance. Use dedicated servers or instances with local NVMe storage. +::: + ## Ports | Port | Protocol | Purpose | Expose | diff --git a/src/pages/guide/node/validator.mdx b/src/pages/guide/node/validator.mdx index c7ab7026..89c198e8 100644 --- a/src/pages/guide/node/validator.mdx +++ b/src/pages/guide/node/validator.mdx @@ -53,24 +53,6 @@ The notable difference between RPC nodes and validator nodes is the omission of Once your node is up, it may not start syncing immediately. This is because your node might not be part of the active set. In most cases, your validator will enter the active set in 48-72 hours after the on-chain addition of the validator identity. -## FAQ - -### What happens if we lose our validator's signing share? - -Your validator won't be able to propose / sign blocks until it receives a new signing share (~48-72 hours, depending on the stage in the current epoch). - -### What happens if we lose our validator's signing key? - -Your validator will need to rotate its identity by deactivating the current validator identity on-chain and creating a new one. - -### What happens if we run a validator with the same identity on two different instances? - -Only the whitelisted IP address will be able to connect to other validators, meaning that the validator on the second instance will be ignored. - -### What happens if we lose our node's data, e.g. the consensus database? - -You will be able to resync from genesis to the latest block height. We're currently implementing the ability for validators to sync from an execution database snapshot (e.g. by downloading a snapshot by running `tempo download`). - ## Troubleshooting ### Checking if your node is proposing blocks @@ -81,26 +63,11 @@ Once your node is proposing blocks, it will start emitting logs like these: INFO handle_propose{epoch=18 view=387213 parent.view=387212 parent.digest=0x43885416b4a7ae7550c615ad4dc702045cd26540b78fa2bd75abdcbfbef02d9d}: tempo_commonware_node::consensus::application::actor: constructed proposal proposal.digest=0x6baa8fa813beea491cf598024d8b31cb2927e7ba1b92a29899a795dbafd682c6 proposal.height=5733680 ``` -If you do not see logs like these, please check that your node is synced up to the [latest block height](https://explorer.tempo.xyz/). Additionally, please check that your outgoing IP address matches the one whitelisted on the validator smart contract: +If you do not see logs like these: +- please check that your validator is part of the active set, and is both [a player and a dealer](https://docs.tempo.xyz/guide/node/operate-validator#validator-states) +- please check that your node is synced up to the [latest block height](https://explorer.tempo.xyz/). +- please check that your outgoing IP address matches the one whitelisted on the validator smart contract: ```bash -cast call 0xCccCcCCC00000000000000000000000000000000 "getValidators()((bytes32, bool, uint64, address, string, string)[])" --json +tempo consensus validators-info --rpc-url ``` - -### Checking that your node has successfully participated in a DKG ceremony - -A successful DKG ceremony is necessary for your validator to receive a signing share. You can check that you've participated in a successful DKG ceremony by looking at - -```bash -curl localhost:8002/metrics | grep consensus_engine_dkg_manager_ceremony_successes_total -consensus_engine_dkg_manager_ceremony_successes_total 1 -``` - -The `consensus_engine_dkg_manager_ceremony_successes_total` metric should be greater than 0. If the metric is 0, it doesn't necessarily means that your node has observed a failed DKG ceremony. You can get the total number of DKG ceremony failures by looking at this metric: - -```bash -curl localhost:8002/metrics | grep consensus_engine_dkg_manager_ceremony_failures_total -consensus_engine_dkg_manager_ceremony_failures_total 0 -``` - -If the number is greater than 0, it means that your node has observed a failed DKG ceremony. diff --git a/vocs.config.ts b/vocs.config.ts index 77f3c5cb..2e5e169c 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -510,6 +510,14 @@ export default defineConfig({ text: 'Operating your validator', link: '/guide/node/operate-validator', }, + { + text: 'Monitoring your validator', + link: '/guide/node/monitor-validator', + }, + { + text: 'Troubleshooting', + link: '/guide/node/troubleshoot-validator', + }, ], }, // { From e03b0c618d75957edddb661e57efa96a0b46069a Mon Sep 17 00:00:00 2001 From: Zygimantas <5236121+Zygimantass@users.noreply.github.com> Date: Fri, 23 Jan 2026 16:42:21 +0100 Subject: [PATCH 04/13] vocs --- vocs.config.ts | 574 ++++++++++++++++++++++++------------------------- 1 file changed, 284 insertions(+), 290 deletions(-) diff --git a/vocs.config.ts b/vocs.config.ts index 2e5e169c..24ea1ac4 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -1,156 +1,157 @@ -import { Changelog, defineConfig, McpSource } from 'vocs/config' +import { Changelog, defineConfig, McpSource } from "vocs/config"; const baseUrl = (() => { - if (process.env.VERCEL_ENV === 'production') - return `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}` - if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}` - return '' -})() + if (process.env.VERCEL_ENV === "production") + return `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}`; + if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}`; + return ""; +})(); export default defineConfig({ - changelog: Changelog.github({ prereleases: true, repo: 'tempoxyz/tempo' }), + changelog: Changelog.github({ prereleases: true, repo: "tempoxyz/tempo" }), checkDeadlinks: false, - title: 'Tempo', - titleTemplate: '%s ⋅ Tempo', - description: 'Documentation for the Tempo network and protocol specifications', + title: "Tempo", + titleTemplate: "%s ⋅ Tempo", + description: + "Documentation for the Tempo network and protocol specifications", mcp: { enabled: true, sources: [ - McpSource.github({ repo: 'tempoxyz/tempo' }), - McpSource.github({ repo: 'paradigmxyz/reth' }), - McpSource.github({ repo: 'foundry-rs/foundry' }), - McpSource.github({ repo: 'wevm/viem' }), - McpSource.github({ repo: 'wevm/wagmi' }), - McpSource.github({ repo: 'tempoxyz/tempo-ts' }), + McpSource.github({ repo: "tempoxyz/tempo" }), + McpSource.github({ repo: "paradigmxyz/reth" }), + McpSource.github({ repo: "foundry-rs/foundry" }), + McpSource.github({ repo: "wevm/viem" }), + McpSource.github({ repo: "wevm/wagmi" }), + McpSource.github({ repo: "tempoxyz/tempo-ts" }), ], }, baseUrl: baseUrl || undefined, - ogImageUrl: (path, { baseUrl } = { baseUrl: '' }) => - path === '/' + ogImageUrl: (path, { baseUrl } = { baseUrl: "" }) => + path === "/" ? `${baseUrl}/og-docs.png` : `${baseUrl}/api/og?title=%title&description=%description`, logoUrl: { - light: '/lockup-light.svg', - dark: '/lockup-dark.svg', + light: "/lockup-light.svg", + dark: "/lockup-dark.svg", }, iconUrl: { - light: '/icon-light.png', - dark: '/icon-dark.png', + light: "/icon-light.png", + dark: "/icon-dark.png", }, - rootDir: '.', + rootDir: ".", socials: [ { - icon: 'github', - link: 'https://github.com/tempoxyz', + icon: "github", + link: "https://github.com/tempoxyz", }, { - icon: 'x', - link: 'https://twitter.com/tempo', + icon: "x", + link: "https://twitter.com/tempo", }, ], sidebar: { - '/': [ + "/": [ { - text: 'Home', - link: '/', + text: "Home", + link: "/", }, { - text: 'Changelog', - link: '/changelog', + text: "Changelog", + link: "/changelog", }, { - text: 'Integrate Tempo Testnet', + text: "Integrate Tempo Testnet", items: [ { - text: 'Overview', - link: '/quickstart/integrate-tempo', + text: "Overview", + link: "/quickstart/integrate-tempo", }, { - text: 'Connect to the Network', - link: '/quickstart/connection-details', + text: "Connect to the Network", + link: "/quickstart/connection-details", }, { - text: 'Get Faucet Funds', - link: '/quickstart/faucet', + text: "Get Faucet Funds", + link: "/quickstart/faucet", }, { - text: 'Developer Tools', - link: '/quickstart/developer-tools', + text: "Developer Tools", + link: "/quickstart/developer-tools", }, { - text: 'EVM Differences', - link: '/quickstart/evm-compatibility', + text: "EVM Differences", + link: "/quickstart/evm-compatibility", }, { - text: 'Predeployed Contracts', - link: '/quickstart/predeployed-contracts', + text: "Predeployed Contracts", + link: "/quickstart/predeployed-contracts", }, { - text: 'Wallet Developers', - link: '/quickstart/wallet-developers', + text: "Wallet Developers", + link: "/quickstart/wallet-developers", }, ], }, { - text: 'Start Building on Tempo', + text: "Start Building on Tempo", items: [ { - text: 'Use Tempo Transactions', - link: '/guide/tempo-transaction', + text: "Use Tempo Transactions", + link: "/guide/tempo-transaction", }, { - text: 'Create & Use Accounts', + text: "Create & Use Accounts", collapsed: true, items: [ { - text: 'Overview', - link: '/guide/use-accounts', + text: "Overview", + link: "/guide/use-accounts", }, { - text: 'Embed Passkey accounts', - link: '/guide/use-accounts/embed-passkeys', + text: "Embed Passkey accounts", + link: "/guide/use-accounts/embed-passkeys", }, { - text: 'Connect to wallets', - link: '/guide/use-accounts/connect-to-wallets', + text: "Connect to wallets", + link: "/guide/use-accounts/connect-to-wallets", }, { - text: 'Add funds to your balance', - link: '/guide/use-accounts/add-funds', + text: "Add funds to your balance", + link: "/guide/use-accounts/add-funds", }, ], }, { - text: 'Make Payments', + text: "Make Payments", collapsed: true, items: [ { - text: 'Overview', - link: '/guide/payments', + text: "Overview", + link: "/guide/payments", }, { - text: 'Send a payment', - link: '/guide/payments/send-a-payment', + text: "Send a payment", + link: "/guide/payments/send-a-payment", }, { - text: 'Accept a payment', - link: '/guide/payments/accept-a-payment', + text: "Accept a payment", + link: "/guide/payments/accept-a-payment", }, { - text: 'Attach a transfer memo', - link: '/guide/payments/transfer-memos', + text: "Attach a transfer memo", + link: "/guide/payments/transfer-memos", }, { - text: 'Pay fees in any stablecoin', - link: '/guide/payments/pay-fees-in-any-stablecoin', + text: "Pay fees in any stablecoin", + link: "/guide/payments/pay-fees-in-any-stablecoin", }, { - text: 'Sponsor user fees', - link: '/guide/payments/sponsor-user-fees', + text: "Sponsor user fees", + link: "/guide/payments/sponsor-user-fees", }, { - text: 'Send parallel transactions', - link: '/guide/payments/send-parallel-transactions', + text: "Send parallel transactions", + link: "/guide/payments/send-parallel-transactions", }, // { // text: 'Start a subscription 🚧', @@ -165,358 +166,350 @@ export default defineConfig({ ], }, { - text: 'Issue Stablecoins', + text: "Issue Stablecoins", collapsed: true, items: [ { - text: 'Overview', - link: '/guide/issuance', + text: "Overview", + link: "/guide/issuance", }, { - text: 'Create a stablecoin', - link: '/guide/issuance/create-a-stablecoin', + text: "Create a stablecoin", + link: "/guide/issuance/create-a-stablecoin", }, { - text: 'Mint stablecoins', - link: '/guide/issuance/mint-stablecoins', + text: "Mint stablecoins", + link: "/guide/issuance/mint-stablecoins", }, { - text: 'Use your stablecoin for fees', - link: '/guide/issuance/use-for-fees', + text: "Use your stablecoin for fees", + link: "/guide/issuance/use-for-fees", }, { - text: 'Distribute rewards', - link: '/guide/issuance/distribute-rewards', + text: "Distribute rewards", + link: "/guide/issuance/distribute-rewards", }, { - text: 'Manage your stablecoin', - link: '/guide/issuance/manage-stablecoin', + text: "Manage your stablecoin", + link: "/guide/issuance/manage-stablecoin", }, ], }, { - text: 'Exchange Stablecoins', + text: "Exchange Stablecoins", collapsed: true, items: [ { - text: 'Overview', - link: '/guide/stablecoin-dex', + text: "Overview", + link: "/guide/stablecoin-dex", }, { - text: 'Managing fee liquidity', - link: '/guide/stablecoin-dex/managing-fee-liquidity', + text: "Managing fee liquidity", + link: "/guide/stablecoin-dex/managing-fee-liquidity", }, { - text: 'Executing swaps', - link: '/guide/stablecoin-dex/executing-swaps', + text: "Executing swaps", + link: "/guide/stablecoin-dex/executing-swaps", }, { - text: 'View the orderbook', - link: '/guide/stablecoin-dex/view-the-orderbook', + text: "View the orderbook", + link: "/guide/stablecoin-dex/view-the-orderbook", }, { - text: 'Providing liquidity', - link: '/guide/stablecoin-dex/providing-liquidity', + text: "Providing liquidity", + link: "/guide/stablecoin-dex/providing-liquidity", }, ], }, ], }, { - text: 'Tempo Protocol Specs', + text: "Tempo Protocol Specs", items: [ { - text: 'Overview', - link: '/protocol', + text: "Overview", + link: "/protocol", }, { - text: 'TIP-20 Tokens', + text: "TIP-20 Tokens", collapsed: true, items: [ { - text: 'Overview', - link: '/protocol/tip20/overview', + text: "Overview", + link: "/protocol/tip20/overview", }, { - text: 'Specification', - link: '/protocol/tip20/spec', + text: "Specification", + link: "/protocol/tip20/spec", }, { - text: 'Reference Implementation', - link: 'https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/TIP20.sol', + text: "Reference Implementation", + link: "https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/TIP20.sol", }, { - text: 'Rust Implementation', - link: 'https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip20', + text: "Rust Implementation", + link: "https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip20", }, ], }, { - text: 'TIP-20 Rewards', + text: "TIP-20 Rewards", collapsed: true, items: [ { - text: 'Overview', - link: '/protocol/tip20-rewards/overview', + text: "Overview", + link: "/protocol/tip20-rewards/overview", }, { - text: 'Specification', - link: '/protocol/tip20-rewards/spec', + text: "Specification", + link: "/protocol/tip20-rewards/spec", }, ], }, { - text: 'TIP-403 Policies', + text: "TIP-403 Policies", collapsed: true, items: [ { - text: 'Overview', - link: '/protocol/tip403/overview', + text: "Overview", + link: "/protocol/tip403/overview", }, { - text: 'Specification', - link: '/protocol/tip403/spec', + text: "Specification", + link: "/protocol/tip403/spec", }, { - text: 'Reference Implementation', - link: 'https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/TIP403Registry.sol', + text: "Reference Implementation", + link: "https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/TIP403Registry.sol", }, { - text: 'Rust Implementation', - link: 'https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip403_registry', + text: "Rust Implementation", + link: "https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip403_registry", }, ], }, { - text: 'Fees', + text: "Fees", collapsed: true, items: [ { - text: 'Overview', - link: '/protocol/fees', + text: "Overview", + link: "/protocol/fees", }, { - text: 'Specification', - link: '/protocol/fees/spec-fee', + text: "Specification", + link: "/protocol/fees/spec-fee", }, { - text: 'Fee AMM', + text: "Fee AMM", collapsed: true, items: [ { - text: 'Overview', - link: '/protocol/fees/fee-amm', + text: "Overview", + link: "/protocol/fees/fee-amm", }, { - text: 'Specification', - link: '/protocol/fees/spec-fee-amm', + text: "Specification", + link: "/protocol/fees/spec-fee-amm", }, { - text: 'Reference Implementation', - link: 'https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/FeeManager.sol', + text: "Reference Implementation", + link: "https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/FeeManager.sol", }, { - text: 'Rust Implementation', - link: 'https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip_fee_manager', + text: "Rust Implementation", + link: "https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip_fee_manager", }, ], }, ], }, { - text: 'Tempo Transactions', + text: "Tempo Transactions", collapsed: true, items: [ { - text: 'Overview', - link: '/protocol/transactions', + text: "Overview", + link: "/protocol/transactions", }, { - text: 'Specification', - link: '/protocol/transactions/spec-tempo-transaction', + text: "Specification", + link: "/protocol/transactions/spec-tempo-transaction", }, { - text: 'Account Keychain Precompile Specification', - link: '/protocol/transactions/AccountKeychain', + text: "Account Keychain Precompile Specification", + link: "/protocol/transactions/AccountKeychain", }, { - text: 'Rust Implementation', - link: 'https://github.com/tempoxyz/tempo/blob/main/crates/primitives/src/transaction/tempo_transaction.rs', + text: "Rust Implementation", + link: "https://github.com/tempoxyz/tempo/blob/main/crates/primitives/src/transaction/tempo_transaction.rs", }, ], }, { - text: 'Blockspace', + text: "Blockspace", collapsed: true, items: [ { - text: 'Overview', - link: '/protocol/blockspace/overview', + text: "Overview", + link: "/protocol/blockspace/overview", }, { - text: 'Payment Lane Specification', - link: '/protocol/blockspace/payment-lane-specification', + text: "Payment Lane Specification", + link: "/protocol/blockspace/payment-lane-specification", }, { - text: 'Sub-block Specification', - link: '/protocol/blockspace/sub-block-specification', + text: "Sub-block Specification", + link: "/protocol/blockspace/sub-block-specification", }, ], }, { - text: 'Stablecoin DEX', + text: "Stablecoin DEX", collapsed: true, items: [ { - text: 'Overview', - link: '/protocol/exchange', + text: "Overview", + link: "/protocol/exchange", }, { - text: 'Specification', - link: '/protocol/exchange/spec', + text: "Specification", + link: "/protocol/exchange/spec", }, { - text: 'pathUSD', - link: '/protocol/exchange/pathUSD', + text: "pathUSD", + link: "/protocol/exchange/pathUSD", }, { - text: 'Executing Swaps', - link: '/protocol/exchange/executing-swaps', + text: "Executing Swaps", + link: "/protocol/exchange/executing-swaps", }, { - text: 'Providing Liquidity', - link: '/protocol/exchange/providing-liquidity', + text: "Providing Liquidity", + link: "/protocol/exchange/providing-liquidity", }, { - text: 'DEX Balance', - link: '/protocol/exchange/exchange-balance', + text: "DEX Balance", + link: "/protocol/exchange/exchange-balance", }, { - text: 'Reference Implementation', - link: 'https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/stablecoinDex.sol', + text: "Reference Implementation", + link: "https://github.com/tempoxyz/tempo/blob/main/docs/specs/src/stablecoinDex.sol", }, { - text: 'Rust Implementation', - link: 'https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/stablecoin_exchange', + text: "Rust Implementation", + link: "https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/stablecoin_exchange", }, ], }, { - text: 'TIPs', - link: '/protocol/tips', + text: "TIPs", + link: "/protocol/tips", }, ], }, { - text: 'Tempo SDKs', + text: "Tempo SDKs", collapsed: true, items: [ { - text: 'Overview', - link: '/sdk', + text: "Overview", + link: "/sdk", }, { - text: 'TypeScript', + text: "TypeScript", collapsed: true, items: [ { - text: 'Overview', - link: '/sdk/typescript', + text: "Overview", + link: "/sdk/typescript", }, { - text: 'Viem Reference', - link: 'https://viem.sh/tempo', + text: "Viem Reference", + link: "https://viem.sh/tempo", }, { - text: 'Wagmi Reference', - link: 'https://wagmi.sh/tempo', + text: "Wagmi Reference", + link: "https://wagmi.sh/tempo", }, { - text: 'Server Reference', + text: "Server Reference", items: [ { - text: 'Handlers', + text: "Handlers", items: [ { - text: 'Overview', - link: '/sdk/typescript/server/handlers', + text: "Overview", + link: "/sdk/typescript/server/handlers", }, { - text: 'compose', - link: '/sdk/typescript/server/handler.compose', + text: "compose", + link: "/sdk/typescript/server/handler.compose", }, { - text: 'feePayer', - link: '/sdk/typescript/server/handler.feePayer', + text: "feePayer", + link: "/sdk/typescript/server/handler.feePayer", }, { - text: 'keyManager', - link: '/sdk/typescript/server/handler.keyManager', + text: "keyManager", + link: "/sdk/typescript/server/handler.keyManager", }, ], }, ], }, { - text: 'Prool Reference', + text: "Prool Reference", items: [ { - text: 'Setup', - link: '/sdk/typescript/prool/setup', + text: "Setup", + link: "/sdk/typescript/prool/setup", }, ], }, ], }, { - text: 'Go', - link: '/sdk/go', + text: "Go", + link: "/sdk/go", }, { - text: 'Foundry', - link: '/sdk/foundry', + text: "Foundry", + link: "/sdk/foundry", }, { - text: 'Rust', - link: '/sdk/rust', + text: "Rust", + link: "/sdk/rust", }, ], }, { - text: 'Run a Tempo Node', + text: "Run a Tempo Node", collapsed: true, items: [ { - text: 'Overview', - link: '/guide/node', + text: "Overview", + link: "/guide/node", }, { - text: 'System Requirements', - link: '/guide/node/system-requirements', + text: "System Requirements", + link: "/guide/node/system-requirements", }, { - text: 'Installation', - link: '/guide/node/installation', + text: "Installation", + link: "/guide/node/installation", }, { - text: 'Running an RPC Node', - link: '/guide/node/rpc', + text: "Running an RPC Node", + link: "/guide/node/rpc", }, { - text: 'Running a validator', - link: '/guide/node/validator', + text: "Running a validator", + link: "/guide/node/validator", }, { - text: 'Operating your validator', - link: '/guide/node/operate-validator', - }, - { - text: 'Monitoring your validator', - link: '/guide/node/monitor-validator', - }, - { - text: 'Troubleshooting', - link: '/guide/node/troubleshoot-validator', + text: "Operating your validator", + link: "/guide/node/operate-validator", }, ], }, @@ -542,147 +535,148 @@ export default defineConfig({ // ], // }, ], - '/learn': [ + "/learn": [ { - text: 'Home', - link: '/learn', + text: "Home", + link: "/learn", }, { - text: 'Partners', - link: '/learn/partners', + text: "Partners", + link: "/learn/partners", }, { - text: 'Blog', - link: 'https://tempo.xyz/blog', + text: "Blog", + link: "https://tempo.xyz/blog", }, { - text: 'Stablecoins', + text: "Stablecoins", items: [ { - text: 'Overview', - link: '/learn/stablecoins', + text: "Overview", + link: "/learn/stablecoins", }, { - text: 'Remittances', - link: '/learn/use-cases/remittances', + text: "Remittances", + link: "/learn/use-cases/remittances", }, { - text: 'Global Payouts', - link: '/learn/use-cases/global-payouts', + text: "Global Payouts", + link: "/learn/use-cases/global-payouts", }, { - text: 'Embedded Finance', - link: '/learn/use-cases/embedded-finance', + text: "Embedded Finance", + link: "/learn/use-cases/embedded-finance", }, { - text: 'Tokenized Deposits', - link: '/learn/use-cases/tokenized-deposits', + text: "Tokenized Deposits", + link: "/learn/use-cases/tokenized-deposits", }, { - text: 'Microtransactions', - link: '/learn/use-cases/microtransactions', + text: "Microtransactions", + link: "/learn/use-cases/microtransactions", }, { - text: 'Agentic Commerce', - link: '/learn/use-cases/agentic-commerce', + text: "Agentic Commerce", + link: "/learn/use-cases/agentic-commerce", }, ], }, { - text: 'Tempo', + text: "Tempo", items: [ { - text: 'Overview', - link: '/learn/tempo', + text: "Overview", + link: "/learn/tempo", }, { - text: 'Native Stablecoins', - link: '/learn/tempo/native-stablecoins', + text: "Native Stablecoins", + link: "/learn/tempo/native-stablecoins", }, { - text: 'Modern Transactions', - link: '/learn/tempo/modern-transactions', + text: "Modern Transactions", + link: "/learn/tempo/modern-transactions", }, { - text: 'Performance', - link: '/learn/tempo/performance', + text: "Performance", + link: "/learn/tempo/performance", }, { - text: 'Onchain FX', - link: '/learn/tempo/fx', + text: "Onchain FX", + link: "/learn/tempo/fx", }, { - text: 'Privacy', - link: '/learn/tempo/privacy', + text: "Privacy", + link: "/learn/tempo/privacy", }, ], }, ], }, topNav: [ - { text: 'Learn', link: '/learn' }, + { text: "Learn", link: "/learn" }, { - text: 'Docs', - link: '/', + text: "Docs", + link: "/", }, - { text: 'Ecosystem', link: 'https://tempo.xyz/ecosystem' }, - { text: 'Blog', link: 'https://tempo.xyz/blog' }, + { text: "Ecosystem", link: "https://tempo.xyz/ecosystem" }, + { text: "Blog", link: "https://tempo.xyz/blog" }, ], redirects: [ { - source: '/documentation/protocol/:path*', - destination: '/protocol/:path*', + source: "/documentation/protocol/:path*", + destination: "/protocol/:path*", }, { - source: '/errors/tx/SubblockNonceKey', - destination: '/protocol/blockspace/subblock-specification#4-block-validity-rules', + source: "/errors/tx/SubblockNonceKey", + destination: + "/protocol/blockspace/subblock-specification#4-block-validity-rules", }, { - source: '/protocol/blockspace/sub-block-specification', - destination: '/protocol/blockspace/subblock-specification', + source: "/protocol/blockspace/sub-block-specification", + destination: "/protocol/blockspace/subblock-specification", status: 301, }, { - source: '/stablecoin-exchange/:path*', - destination: '/stablecoin-dex/:path*', + source: "/stablecoin-exchange/:path*", + destination: "/stablecoin-dex/:path*", status: 301, }, { - source: '/guide', - destination: '/quickstart/integrate-tempo', + source: "/guide", + destination: "/quickstart/integrate-tempo", }, { - source: '/quickstart', - destination: '/quickstart/integrate-tempo', + source: "/quickstart", + destination: "/quickstart/integrate-tempo", }, { - source: '/protocol/blockspace', - destination: '/protocol/blockspace/overview', + source: "/protocol/blockspace", + destination: "/protocol/blockspace/overview", }, { - source: '/protocol/tip20', - destination: '/protocol/tip20/overview', + source: "/protocol/tip20", + destination: "/protocol/tip20/overview", }, { - source: '/protocol/tip20-rewards', - destination: '/protocol/tip20-rewards/overview', + source: "/protocol/tip20-rewards", + destination: "/protocol/tip20-rewards/overview", }, { - source: '/protocol/tip403', - destination: '/protocol/tip403/overview', + source: "/protocol/tip403", + destination: "/protocol/tip403/overview", }, { - source: '/learn/use-cases', - destination: '/learn/use-cases/remittances', + source: "/learn/use-cases", + destination: "/learn/use-cases/remittances", }, { - source: '/sdk/typescript/server', - destination: '/sdk/typescript/server/handlers', + source: "/sdk/typescript/server", + destination: "/sdk/typescript/server/handlers", }, { - source: '/sdk/typescript/prool', - destination: '/sdk/typescript/prool/setup', + source: "/sdk/typescript/prool", + destination: "/sdk/typescript/prool/setup", }, ], twoslash: { @@ -693,4 +687,4 @@ export default defineConfig({ }, }, }, -}) +}); From 8a5b6bd24173c654ebf3714e8ce672eba21a5e16 Mon Sep 17 00:00:00 2001 From: Zygimantas <5236121+Zygimantass@users.noreply.github.com> Date: Mon, 26 Jan 2026 17:23:59 +0100 Subject: [PATCH 05/13] merge --- src/pages/guide/node/operate-validator.mdx | 4 +- vocs.config.ts | 520 ++++++++++----------- 2 files changed, 262 insertions(+), 262 deletions(-) diff --git a/src/pages/guide/node/operate-validator.mdx b/src/pages/guide/node/operate-validator.mdx index ac6cf74b..dbad94f9 100644 --- a/src/pages/guide/node/operate-validator.mdx +++ b/src/pages/guide/node/operate-validator.mdx @@ -23,11 +23,11 @@ Your validator is not participating in the current DKG ceremony. This is normal #### Player -Your validator is receiving shares from dealers during the ceremony. +Your validator is receiving consensus signing shares from dealers during the ceremony. #### Dealer -Your validator is distributing shares to other validators during the ceremony. +Your validator is distributing consensus signing shares to other validators during the ceremony. #### Checking DKG state diff --git a/vocs.config.ts b/vocs.config.ts index 772b4810..6ba20d90 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -1,14 +1,14 @@ import { Changelog, defineConfig, Feedback, McpSource } from 'vocs/config' const baseUrl = (() => { - if (process.env.VERCEL_ENV === "production") - return `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}`; - if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}`; - return ""; -})(); + if (process.env.VERCEL_ENV === 'production') + return `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}` + if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}` + return '' +})() export default defineConfig({ - changelog: Changelog.github({ prereleases: true, repo: "tempoxyz/tempo" }), + changelog: Changelog.github({ prereleases: true, repo: 'tempoxyz/tempo' }), checkDeadlinks: false, title: 'Tempo', titleTemplate: '%s ⋅ Tempo', @@ -17,74 +17,74 @@ export default defineConfig({ mcp: { enabled: true, sources: [ - McpSource.github({ repo: "tempoxyz/tempo" }), - McpSource.github({ repo: "paradigmxyz/reth" }), - McpSource.github({ repo: "foundry-rs/foundry" }), - McpSource.github({ repo: "wevm/viem" }), - McpSource.github({ repo: "wevm/wagmi" }), - McpSource.github({ repo: "tempoxyz/tempo-ts" }), + McpSource.github({ repo: 'tempoxyz/tempo' }), + McpSource.github({ repo: 'paradigmxyz/reth' }), + McpSource.github({ repo: 'foundry-rs/foundry' }), + McpSource.github({ repo: 'wevm/viem' }), + McpSource.github({ repo: 'wevm/wagmi' }), + McpSource.github({ repo: 'tempoxyz/tempo-ts' }), ], }, baseUrl: baseUrl || undefined, - ogImageUrl: (path, { baseUrl } = { baseUrl: "" }) => - path === "/" + ogImageUrl: (path, { baseUrl } = { baseUrl: '' }) => + path === '/' ? `${baseUrl}/og-docs.png` : `${baseUrl}/api/og?title=%title&description=%description`, logoUrl: { - light: "/lockup-light.svg", - dark: "/lockup-dark.svg", + light: '/lockup-light.svg', + dark: '/lockup-dark.svg', }, iconUrl: { - light: "/icon-light.png", - dark: "/icon-dark.png", + light: '/icon-light.png', + dark: '/icon-dark.png', }, - rootDir: ".", + rootDir: '.', socials: [ { - icon: "github", - link: "https://github.com/tempoxyz", + icon: 'github', + link: 'https://github.com/tempoxyz', }, { - icon: "x", - link: "https://twitter.com/tempo", + icon: 'x', + link: 'https://twitter.com/tempo', }, ], sidebar: { - "/": [ + '/': [ { - text: "Home", - link: "/", + text: 'Home', + link: '/', }, { - text: "Changelog", - link: "/changelog", + text: 'Changelog', + link: '/changelog', }, { - text: "Integrate Tempo Testnet", + text: 'Integrate Tempo Testnet', items: [ { - text: "Overview", - link: "/quickstart/integrate-tempo", + text: 'Overview', + link: '/quickstart/integrate-tempo', }, { - text: "Connect to the Network", - link: "/quickstart/connection-details", + text: 'Connect to the Network', + link: '/quickstart/connection-details', }, { - text: "Get Faucet Funds", - link: "/quickstart/faucet", + text: 'Get Faucet Funds', + link: '/quickstart/faucet', }, { - text: "Developer Tools", - link: "/quickstart/developer-tools", + text: 'Developer Tools', + link: '/quickstart/developer-tools', }, { - text: "EVM Differences", - link: "/quickstart/evm-compatibility", + text: 'EVM Differences', + link: '/quickstart/evm-compatibility', }, { - text: "Predeployed Contracts", - link: "/quickstart/predeployed-contracts", + text: 'Predeployed Contracts', + link: '/quickstart/predeployed-contracts', }, { text: 'Token List Registry', @@ -101,65 +101,65 @@ export default defineConfig({ ], }, { - text: "Start Building on Tempo", + text: 'Start Building on Tempo', items: [ { - text: "Use Tempo Transactions", - link: "/guide/tempo-transaction", + text: 'Use Tempo Transactions', + link: '/guide/tempo-transaction', }, { - text: "Create & Use Accounts", + text: 'Create & Use Accounts', collapsed: true, items: [ { - text: "Overview", - link: "/guide/use-accounts", + text: 'Overview', + link: '/guide/use-accounts', }, { - text: "Embed Passkey accounts", - link: "/guide/use-accounts/embed-passkeys", + text: 'Embed Passkey accounts', + link: '/guide/use-accounts/embed-passkeys', }, { - text: "Connect to wallets", - link: "/guide/use-accounts/connect-to-wallets", + text: 'Connect to wallets', + link: '/guide/use-accounts/connect-to-wallets', }, { - text: "Add funds to your balance", - link: "/guide/use-accounts/add-funds", + text: 'Add funds to your balance', + link: '/guide/use-accounts/add-funds', }, ], }, { - text: "Make Payments", + text: 'Make Payments', collapsed: true, items: [ { - text: "Overview", - link: "/guide/payments", + text: 'Overview', + link: '/guide/payments', }, { - text: "Send a payment", - link: "/guide/payments/send-a-payment", + text: 'Send a payment', + link: '/guide/payments/send-a-payment', }, { - text: "Accept a payment", - link: "/guide/payments/accept-a-payment", + text: 'Accept a payment', + link: '/guide/payments/accept-a-payment', }, { - text: "Attach a transfer memo", - link: "/guide/payments/transfer-memos", + text: 'Attach a transfer memo', + link: '/guide/payments/transfer-memos', }, { - text: "Pay fees in any stablecoin", - link: "/guide/payments/pay-fees-in-any-stablecoin", + text: 'Pay fees in any stablecoin', + link: '/guide/payments/pay-fees-in-any-stablecoin', }, { - text: "Sponsor user fees", - link: "/guide/payments/sponsor-user-fees", + text: 'Sponsor user fees', + link: '/guide/payments/sponsor-user-fees', }, { - text: "Send parallel transactions", - link: "/guide/payments/send-parallel-transactions", + text: 'Send parallel transactions', + link: '/guide/payments/send-parallel-transactions', }, // { // text: 'Start a subscription 🚧', @@ -174,175 +174,175 @@ export default defineConfig({ ], }, { - text: "Issue Stablecoins", + text: 'Issue Stablecoins', collapsed: true, items: [ { - text: "Overview", - link: "/guide/issuance", + text: 'Overview', + link: '/guide/issuance', }, { - text: "Create a stablecoin", - link: "/guide/issuance/create-a-stablecoin", + text: 'Create a stablecoin', + link: '/guide/issuance/create-a-stablecoin', }, { - text: "Mint stablecoins", - link: "/guide/issuance/mint-stablecoins", + text: 'Mint stablecoins', + link: '/guide/issuance/mint-stablecoins', }, { - text: "Use your stablecoin for fees", - link: "/guide/issuance/use-for-fees", + text: 'Use your stablecoin for fees', + link: '/guide/issuance/use-for-fees', }, { - text: "Distribute rewards", - link: "/guide/issuance/distribute-rewards", + text: 'Distribute rewards', + link: '/guide/issuance/distribute-rewards', }, { - text: "Manage your stablecoin", - link: "/guide/issuance/manage-stablecoin", + text: 'Manage your stablecoin', + link: '/guide/issuance/manage-stablecoin', }, ], }, { - text: "Exchange Stablecoins", + text: 'Exchange Stablecoins', collapsed: true, items: [ { - text: "Overview", - link: "/guide/stablecoin-dex", + text: 'Overview', + link: '/guide/stablecoin-dex', }, { - text: "Managing fee liquidity", - link: "/guide/stablecoin-dex/managing-fee-liquidity", + text: 'Managing fee liquidity', + link: '/guide/stablecoin-dex/managing-fee-liquidity', }, { - text: "Executing swaps", - link: "/guide/stablecoin-dex/executing-swaps", + text: 'Executing swaps', + link: '/guide/stablecoin-dex/executing-swaps', }, { - text: "View the orderbook", - link: "/guide/stablecoin-dex/view-the-orderbook", + text: 'View the orderbook', + link: '/guide/stablecoin-dex/view-the-orderbook', }, { - text: "Providing liquidity", - link: "/guide/stablecoin-dex/providing-liquidity", + text: 'Providing liquidity', + link: '/guide/stablecoin-dex/providing-liquidity', }, ], }, ], }, { - text: "Tempo Protocol Specs", + text: 'Tempo Protocol Specs', items: [ { - text: "Overview", - link: "/protocol", + text: 'Overview', + link: '/protocol', }, { - text: "TIP-20 Tokens", + text: 'TIP-20 Tokens', collapsed: true, items: [ { - text: "Overview", - link: "/protocol/tip20/overview", + text: 'Overview', + link: '/protocol/tip20/overview', }, { - text: "Specification", - link: "/protocol/tip20/spec", + text: 'Specification', + link: '/protocol/tip20/spec', }, { text: 'Reference Implementation', link: 'https://github.com/tempoxyz/tempo/blob/main/tips/ref-impls/src/TIP20.sol', }, { - text: "Rust Implementation", - link: "https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip20", + text: 'Rust Implementation', + link: 'https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip20', }, ], }, { - text: "TIP-20 Rewards", + text: 'TIP-20 Rewards', collapsed: true, items: [ { - text: "Overview", - link: "/protocol/tip20-rewards/overview", + text: 'Overview', + link: '/protocol/tip20-rewards/overview', }, { - text: "Specification", - link: "/protocol/tip20-rewards/spec", + text: 'Specification', + link: '/protocol/tip20-rewards/spec', }, ], }, { - text: "TIP-403 Policies", + text: 'TIP-403 Policies', collapsed: true, items: [ { - text: "Overview", - link: "/protocol/tip403/overview", + text: 'Overview', + link: '/protocol/tip403/overview', }, { - text: "Specification", - link: "/protocol/tip403/spec", + text: 'Specification', + link: '/protocol/tip403/spec', }, { text: 'Reference Implementation', link: 'https://github.com/tempoxyz/tempo/blob/main/tips/ref-impls/src/TIP403Registry.sol', }, { - text: "Rust Implementation", - link: "https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip403_registry", + text: 'Rust Implementation', + link: 'https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip403_registry', }, ], }, { - text: "Fees", + text: 'Fees', collapsed: true, items: [ { - text: "Overview", - link: "/protocol/fees", + text: 'Overview', + link: '/protocol/fees', }, { - text: "Specification", - link: "/protocol/fees/spec-fee", + text: 'Specification', + link: '/protocol/fees/spec-fee', }, { - text: "Fee AMM", + text: 'Fee AMM', collapsed: true, items: [ { - text: "Overview", - link: "/protocol/fees/fee-amm", + text: 'Overview', + link: '/protocol/fees/fee-amm', }, { - text: "Specification", - link: "/protocol/fees/spec-fee-amm", + text: 'Specification', + link: '/protocol/fees/spec-fee-amm', }, { text: 'Reference Implementation', link: 'https://github.com/tempoxyz/tempo/blob/main/tips/ref-impls/src/FeeManager.sol', }, { - text: "Rust Implementation", - link: "https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip_fee_manager", + text: 'Rust Implementation', + link: 'https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/tip_fee_manager', }, ], }, ], }, { - text: "Tempo Transactions", + text: 'Tempo Transactions', collapsed: true, items: [ { - text: "Overview", - link: "/protocol/transactions", + text: 'Overview', + link: '/protocol/transactions', }, { - text: "Specification", - link: "/protocol/transactions/spec-tempo-transaction", + text: 'Specification', + link: '/protocol/transactions/spec-tempo-transaction', }, { text: 'EIP-4337 Comparison', @@ -357,26 +357,26 @@ export default defineConfig({ link: '/protocol/transactions/AccountKeychain', }, { - text: "Rust Implementation", - link: "https://github.com/tempoxyz/tempo/blob/main/crates/primitives/src/transaction/tempo_transaction.rs", + text: 'Rust Implementation', + link: 'https://github.com/tempoxyz/tempo/blob/main/crates/primitives/src/transaction/tempo_transaction.rs', }, ], }, { - text: "Blockspace", + text: 'Blockspace', collapsed: true, items: [ { - text: "Overview", - link: "/protocol/blockspace/overview", + text: 'Overview', + link: '/protocol/blockspace/overview', }, { - text: "Payment Lane Specification", - link: "/protocol/blockspace/payment-lane-specification", + text: 'Payment Lane Specification', + link: '/protocol/blockspace/payment-lane-specification', }, { - text: "Sub-block Specification", - link: "/protocol/blockspace/sub-block-specification", + text: 'Sub-block Specification', + link: '/protocol/blockspace/sub-block-specification', }, { text: 'Consensus and Finality', @@ -385,151 +385,151 @@ export default defineConfig({ ], }, { - text: "Stablecoin DEX", + text: 'Stablecoin DEX', collapsed: true, items: [ { - text: "Overview", - link: "/protocol/exchange", + text: 'Overview', + link: '/protocol/exchange', }, { - text: "Specification", - link: "/protocol/exchange/spec", + text: 'Specification', + link: '/protocol/exchange/spec', }, { - text: "pathUSD", - link: "/protocol/exchange/pathUSD", + text: 'pathUSD', + link: '/protocol/exchange/pathUSD', }, { - text: "Executing Swaps", - link: "/protocol/exchange/executing-swaps", + text: 'Executing Swaps', + link: '/protocol/exchange/executing-swaps', }, { - text: "Providing Liquidity", - link: "/protocol/exchange/providing-liquidity", + text: 'Providing Liquidity', + link: '/protocol/exchange/providing-liquidity', }, { - text: "DEX Balance", - link: "/protocol/exchange/exchange-balance", + text: 'DEX Balance', + link: '/protocol/exchange/exchange-balance', }, { text: 'Reference Implementation', link: 'https://github.com/tempoxyz/tempo/blob/main/tips/ref-impls/src/stablecoinDex.sol', }, { - text: "Rust Implementation", - link: "https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/stablecoin_exchange", + text: 'Rust Implementation', + link: 'https://github.com/tempoxyz/tempo/tree/main/crates/precompiles/src/stablecoin_exchange', }, ], }, { - text: "TIPs", - link: "/protocol/tips", + text: 'TIPs', + link: '/protocol/tips', }, ], }, { - text: "Tempo SDKs", + text: 'Tempo SDKs', collapsed: true, items: [ { - text: "Overview", - link: "/sdk", + text: 'Overview', + link: '/sdk', }, { - text: "TypeScript", + text: 'TypeScript', collapsed: true, items: [ { - text: "Overview", - link: "/sdk/typescript", + text: 'Overview', + link: '/sdk/typescript', }, { - text: "Viem Reference", - link: "https://viem.sh/tempo", + text: 'Viem Reference', + link: 'https://viem.sh/tempo', }, { - text: "Wagmi Reference", - link: "https://wagmi.sh/tempo", + text: 'Wagmi Reference', + link: 'https://wagmi.sh/tempo', }, { - text: "Server Reference", + text: 'Server Reference', items: [ { - text: "Handlers", + text: 'Handlers', items: [ { - text: "Overview", - link: "/sdk/typescript/server/handlers", + text: 'Overview', + link: '/sdk/typescript/server/handlers', }, { - text: "compose", - link: "/sdk/typescript/server/handler.compose", + text: 'compose', + link: '/sdk/typescript/server/handler.compose', }, { - text: "feePayer", - link: "/sdk/typescript/server/handler.feePayer", + text: 'feePayer', + link: '/sdk/typescript/server/handler.feePayer', }, { - text: "keyManager", - link: "/sdk/typescript/server/handler.keyManager", + text: 'keyManager', + link: '/sdk/typescript/server/handler.keyManager', }, ], }, ], }, { - text: "Prool Reference", + text: 'Prool Reference', items: [ { - text: "Setup", - link: "/sdk/typescript/prool/setup", + text: 'Setup', + link: '/sdk/typescript/prool/setup', }, ], }, ], }, { - text: "Go", - link: "/sdk/go", + text: 'Go', + link: '/sdk/go', }, { - text: "Foundry", - link: "/sdk/foundry", + text: 'Foundry', + link: '/sdk/foundry', }, { - text: "Rust", - link: "/sdk/rust", + text: 'Rust', + link: '/sdk/rust', }, ], }, { - text: "Run a Tempo Node", + text: 'Run a Tempo Node', collapsed: true, items: [ { - text: "Overview", - link: "/guide/node", + text: 'Overview', + link: '/guide/node', }, { - text: "System Requirements", - link: "/guide/node/system-requirements", + text: 'System Requirements', + link: '/guide/node/system-requirements', }, { - text: "Installation", - link: "/guide/node/installation", + text: 'Installation', + link: '/guide/node/installation', }, { - text: "Running an RPC Node", - link: "/guide/node/rpc", + text: 'Running an RPC Node', + link: '/guide/node/rpc', }, { - text: "Running a validator", - link: "/guide/node/validator", + text: 'Running a validator', + link: '/guide/node/validator', }, { - text: "Operating your validator", - link: "/guide/node/operate-validator", + text: 'Operating your validator', + link: '/guide/node/operate-validator', }, ], }, @@ -555,105 +555,105 @@ export default defineConfig({ // ], // }, ], - "/learn": [ + '/learn': [ { - text: "Home", - link: "/learn", + text: 'Home', + link: '/learn', }, { - text: "Partners", - link: "/learn/partners", + text: 'Partners', + link: '/learn/partners', }, { - text: "Blog", - link: "https://tempo.xyz/blog", + text: 'Blog', + link: 'https://tempo.xyz/blog', }, { - text: "Stablecoins", + text: 'Stablecoins', items: [ { - text: "Overview", - link: "/learn/stablecoins", + text: 'Overview', + link: '/learn/stablecoins', }, { - text: "Remittances", - link: "/learn/use-cases/remittances", + text: 'Remittances', + link: '/learn/use-cases/remittances', }, { - text: "Global Payouts", - link: "/learn/use-cases/global-payouts", + text: 'Global Payouts', + link: '/learn/use-cases/global-payouts', }, { - text: "Embedded Finance", - link: "/learn/use-cases/embedded-finance", + text: 'Embedded Finance', + link: '/learn/use-cases/embedded-finance', }, { - text: "Tokenized Deposits", - link: "/learn/use-cases/tokenized-deposits", + text: 'Tokenized Deposits', + link: '/learn/use-cases/tokenized-deposits', }, { - text: "Microtransactions", - link: "/learn/use-cases/microtransactions", + text: 'Microtransactions', + link: '/learn/use-cases/microtransactions', }, { - text: "Agentic Commerce", - link: "/learn/use-cases/agentic-commerce", + text: 'Agentic Commerce', + link: '/learn/use-cases/agentic-commerce', }, ], }, { - text: "Tempo", + text: 'Tempo', items: [ { - text: "Overview", - link: "/learn/tempo", + text: 'Overview', + link: '/learn/tempo', }, { - text: "Native Stablecoins", - link: "/learn/tempo/native-stablecoins", + text: 'Native Stablecoins', + link: '/learn/tempo/native-stablecoins', }, { - text: "Modern Transactions", - link: "/learn/tempo/modern-transactions", + text: 'Modern Transactions', + link: '/learn/tempo/modern-transactions', }, { - text: "Performance", - link: "/learn/tempo/performance", + text: 'Performance', + link: '/learn/tempo/performance', }, { - text: "Onchain FX", - link: "/learn/tempo/fx", + text: 'Onchain FX', + link: '/learn/tempo/fx', }, { - text: "Privacy", - link: "/learn/tempo/privacy", + text: 'Privacy', + link: '/learn/tempo/privacy', }, ], }, ], }, topNav: [ - { text: "Learn", link: "/learn" }, + { text: 'Learn', link: '/learn' }, { - text: "Docs", - link: "/", + text: 'Docs', + link: '/', }, - { text: "Ecosystem", link: "https://tempo.xyz/ecosystem" }, - { text: "Blog", link: "https://tempo.xyz/blog" }, + { text: 'Ecosystem', link: 'https://tempo.xyz/ecosystem' }, + { text: 'Blog', link: 'https://tempo.xyz/blog' }, ], redirects: [ { - source: "/documentation/protocol/:path*", - destination: "/protocol/:path*", + source: '/documentation/protocol/:path*', + destination: '/protocol/:path*', }, { source: '/errors/tx/SubblockNonceKey', destination: '/protocol/blockspace/sub-block-specification#4-block-validity-rules', }, { - source: "/stablecoin-exchange/:path*", - destination: "/stablecoin-dex/:path*", + source: '/stablecoin-exchange/:path*', + destination: '/stablecoin-dex/:path*', status: 301, }, { @@ -665,36 +665,36 @@ export default defineConfig({ destination: '/quickstart/integrate-tempo', }, { - source: "/quickstart", - destination: "/quickstart/integrate-tempo", + source: '/quickstart', + destination: '/quickstart/integrate-tempo', }, { - source: "/protocol/blockspace", - destination: "/protocol/blockspace/overview", + source: '/protocol/blockspace', + destination: '/protocol/blockspace/overview', }, { - source: "/protocol/tip20", - destination: "/protocol/tip20/overview", + source: '/protocol/tip20', + destination: '/protocol/tip20/overview', }, { - source: "/protocol/tip20-rewards", - destination: "/protocol/tip20-rewards/overview", + source: '/protocol/tip20-rewards', + destination: '/protocol/tip20-rewards/overview', }, { - source: "/protocol/tip403", - destination: "/protocol/tip403/overview", + source: '/protocol/tip403', + destination: '/protocol/tip403/overview', }, { - source: "/learn/use-cases", - destination: "/learn/use-cases/remittances", + source: '/learn/use-cases', + destination: '/learn/use-cases/remittances', }, { - source: "/sdk/typescript/server", - destination: "/sdk/typescript/server/handlers", + source: '/sdk/typescript/server', + destination: '/sdk/typescript/server/handlers', }, { - source: "/sdk/typescript/prool", - destination: "/sdk/typescript/prool/setup", + source: '/sdk/typescript/prool', + destination: '/sdk/typescript/prool/setup', }, { source: '/guide/use-accounts/fee-sponsorship', @@ -715,4 +715,4 @@ export default defineConfig({ }, }, }, -}); +}) From 172f060ccf31da5ef72de432c029eb13107947e2 Mon Sep 17 00:00:00 2001 From: Zygimantas <5236121+Zygimantass@users.noreply.github.com> Date: Tue, 27 Jan 2026 02:06:58 +0100 Subject: [PATCH 06/13] fix --- src/pages/guide/node/operate-validator.mdx | 32 ++++++++++++++++------ vite.config.ts | 13 +++++++++ 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/pages/guide/node/operate-validator.mdx b/src/pages/guide/node/operate-validator.mdx index dbad94f9..baf9b1fc 100644 --- a/src/pages/guide/node/operate-validator.mdx +++ b/src/pages/guide/node/operate-validator.mdx @@ -11,29 +11,43 @@ This guide covers day-to-day operations for running a Tempo validator in product Your validator moves through different states during operation. Here's how to identify each. +```mermaid +flowchart TD + A[Inactive] -->|epoch ends| B["Syncer
The validator starts syncing"] + B -->|+1 epoch| C["Syncer and Player"] + C -->|"+1 epoch, receives share"| D["Syncer
Player
Dealer"] + D -->|"once fully synced"| E["Voter ↔ Proposer"] +``` + ### DKG ceremony DKG (Distributed Key Generation) ceremonies run approximately every 3 hours to generate threshold signing shares. -#### Non-dealer / non-player +#### Not a participant (E) + +Your validator isn't considered a peer by validators yet. This is because the validator hasn't been refreshed in the current epoch yet. -Your validator is not participating in the current DKG ceremony. This is normal if: -- You're a new validator waiting to join the next ceremony -- The ceremony hasn't started yet +#### Syncer (epoch E+1) -#### Player +Your validator is now considered a peer by validators. It's syncing with the network and will be considered a player in the next + +#### Player (epoch E+2) Your validator is receiving consensus signing shares from dealers during the ceremony. -#### Dealer +#### Dealer (epoch E+3) -Your validator is distributing consensus signing shares to other validators during the ceremony. +Your validator is distributing consensus signing shares to other validators during the ceremony. Once your node is fully synced up, it will also +be able to propose blocks and vote for other validators' proposed blocks. -#### Checking DKG state +#### Checking your validator's state -Monitor these metrics to track DKG participation: +Monitor these metrics to track your validator's state: ```bash +# Is your validator connected to other peers (i.e. is it considered a syncer)? This should be >0 in at most 3 hours after your validator's addition +curl -s localhost:8002/metrics | grep consensus_network_spawner_connections + # How many times YOUR node has been a dealer (distributing shares) - this metric should be >0 over 6 hours curl -s localhost:8002/metrics | grep consensus_engine_dkg_manager_how_often_dealer diff --git a/vite.config.ts b/vite.config.ts index 96bbb99e..7073bf8e 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -7,6 +7,19 @@ import { vocs } from 'vocs/vite' // https://vite.dev/config/ export default defineConfig({ + resolve: { + alias: [ + { find: 'dayjs', replacement: 'dayjs/esm' }, + { find: 'dayjs/dayjs.min.js', replacement: 'dayjs/esm' }, + { + find: /^@braintree\/sanitize-url$/, + replacement: path.resolve(process.cwd(), 'src/shims/sanitize-url.ts'), + }, + ], + }, + optimizeDeps: { + include: ['@braintree/sanitize-url'], + }, plugins: [syncTips(), vocs(), react(), tempoNode()], }) From b2553e0998e49ca301bad5346eb40c0782552940 Mon Sep 17 00:00:00 2001 From: Zygimantas <5236121+Zygimantass@users.noreply.github.com> Date: Tue, 27 Jan 2026 02:09:41 +0100 Subject: [PATCH 07/13] fix --- src/pages/guide/node/operate-validator.mdx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/pages/guide/node/operate-validator.mdx b/src/pages/guide/node/operate-validator.mdx index baf9b1fc..de45a8fd 100644 --- a/src/pages/guide/node/operate-validator.mdx +++ b/src/pages/guide/node/operate-validator.mdx @@ -9,7 +9,7 @@ This guide covers day-to-day operations for running a Tempo validator in product ## Validator states -Your validator moves through different states during operation. Here's how to identify each. +Your validator moves through different states during operation. The transitions will happen only once on your validator's creation. Every state transition will happen on epoch boundaries in the happy case. ```mermaid flowchart TD @@ -19,10 +19,6 @@ flowchart TD D -->|"once fully synced"| E["Voter ↔ Proposer"] ``` -### DKG ceremony - -DKG (Distributed Key Generation) ceremonies run approximately every 3 hours to generate threshold signing shares. - #### Not a participant (E) Your validator isn't considered a peer by validators yet. This is because the validator hasn't been refreshed in the current epoch yet. From 5c9012289afe88768445de6940fee2c6fb75ec99 Mon Sep 17 00:00:00 2001 From: kuyziss <20692751+kuyziss@users.noreply.github.com> Date: Tue, 27 Jan 2026 16:52:30 +0200 Subject: [PATCH 08/13] docs: add Grafana dashboard import instructions Amp-Thread-ID: https://ampcode.com/threads/T-019bffd6-9bb6-71af-853a-34889f0aa742 Co-authored-by: Amp --- src/pages/guide/node/operate-validator.mdx | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/pages/guide/node/operate-validator.mdx b/src/pages/guide/node/operate-validator.mdx index de45a8fd..9dedf2d7 100644 --- a/src/pages/guide/node/operate-validator.mdx +++ b/src/pages/guide/node/operate-validator.mdx @@ -203,3 +203,31 @@ This is a table of the most important metrics to watch on your validator node: | `consensus_engine_consensus_voter_inbound_messages_total` | Number of inbound messages related to voting on the consensus layer | Warning when it's not increasing and your node is synced | Your node is receiving voting messages from the consensus layer | | `reth_sync_checkpoint` | Current sync progress | Warning on when there are no changes in the `Finish` stage | Your node is syncing with the network | | `reth_payloads_resolved_block` | Number of built and resolved payloads | Warning when it hasn't increased in 12 hours | Your node has built and resolved blocks | + +## Grafana Dashboard + +We provide a pre-built Grafana dashboard for monitoring your validator. It visualizes key metrics including node status, sync progress, voting activity, consensus latency, and execution performance. + +### Importing the dashboard + +1. Download the dashboard JSON from the [Tempo repository](https://github.com/tempoxyz/tempo/blob/main/contrib/grafana/dashboards/validator-health.json) + +2. In Grafana, go to **Dashboards → Import** + +3. Either paste the JSON content or upload the file + +4. Select your Prometheus and Loki datasources when prompted + +5. Click **Import** + +### Dashboard variables + +The dashboard uses these template variables: + +| Variable | Description | +| --- | --- | +| `datasource` | Prometheus datasource | +| `loki_ds` | Loki datasource (for log-based panels) | +| `network_name` | Filter by network/validator job name | + +Make sure your Prometheus is scraping metrics from your validator's metrics endpoint (default: `localhost:8002/metrics`). From 4d64e8125eefdbb4fe435f17a7240d23eabc1691 Mon Sep 17 00:00:00 2001 From: zhygis <5236121+Zygimantass@users.noreply.github.com> Date: Tue, 27 Jan 2026 16:10:48 +0100 Subject: [PATCH 09/13] Update src/pages/guide/node/operate-validator.mdx Co-authored-by: kuyziss <20692751+kuyziss@users.noreply.github.com> --- src/pages/guide/node/operate-validator.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/guide/node/operate-validator.mdx b/src/pages/guide/node/operate-validator.mdx index 9dedf2d7..bf1d084f 100644 --- a/src/pages/guide/node/operate-validator.mdx +++ b/src/pages/guide/node/operate-validator.mdx @@ -25,7 +25,7 @@ Your validator isn't considered a peer by validators yet. This is because the va #### Syncer (epoch E+1) -Your validator is now considered a peer by validators. It's syncing with the network and will be considered a player in the next +Your validator is now considered a peer by validators. It's syncing with the network and will be considered a player in the next epoch. #### Player (epoch E+2) From f19e4d2ad94890419cf2e010c781a22be6fe9a14 Mon Sep 17 00:00:00 2001 From: zhygis <5236121+Zygimantass@users.noreply.github.com> Date: Tue, 27 Jan 2026 16:11:01 +0100 Subject: [PATCH 10/13] Update src/pages/guide/node/operate-validator.mdx Co-authored-by: kuyziss <20692751+kuyziss@users.noreply.github.com> --- src/pages/guide/node/operate-validator.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/guide/node/operate-validator.mdx b/src/pages/guide/node/operate-validator.mdx index bf1d084f..2717e797 100644 --- a/src/pages/guide/node/operate-validator.mdx +++ b/src/pages/guide/node/operate-validator.mdx @@ -200,7 +200,7 @@ This is a table of the most important metrics to watch on your validator node: | `consensus_engine_marshal_finalized_height` | Latest finalized height your node is aware of | Warning when it hasn't increased in 1 hour, critical when it hasn't increased in 3 hours | Your node is aware of the latest finalized height | | `consensus_engine_marshal_processed_height` | Latest height your node has processed | Critical when it hasn't increased in an hour, warning when it's behind finalized height | Your node is processing blocks | | `consensus_network_spawner_connections` | Number of active peers on the consensus layer | Warning when it's below the expected validator count, critical when it's 0 | Your node is connected to the consensus layer | -| `consensus_engine_consensus_voter_inbound_messages_total` | Number of inbound messages related to voting on the consensus layer | Warning when it's not increasing and your node is synced | Your node is receiving voting messages from the consensus layer | +| `consensus_engine_epoch_manager_simplex_batcher_inbound_messages_total` | Number of inbound messages related to voting on the consensus layer | Warning when it's not increasing and your node is synced | Your node is receiving voting messages from the consensus layer | | `reth_sync_checkpoint` | Current sync progress | Warning on when there are no changes in the `Finish` stage | Your node is syncing with the network | | `reth_payloads_resolved_block` | Number of built and resolved payloads | Warning when it hasn't increased in 12 hours | Your node has built and resolved blocks | From 68756e4011e159535e5495a2a82b1505ffecde93 Mon Sep 17 00:00:00 2001 From: Zygimantas <5236121+Zygimantass@users.noreply.github.com> Date: Tue, 27 Jan 2026 16:16:22 +0100 Subject: [PATCH 11/13] fix --- src/pages/guide/node/operate-validator.mdx | 19 +++++++--- src/shims/sanitize-url.ts | 40 ++++++++++++++++++++++ 2 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 src/shims/sanitize-url.ts diff --git a/src/pages/guide/node/operate-validator.mdx b/src/pages/guide/node/operate-validator.mdx index 2717e797..1492c6a2 100644 --- a/src/pages/guide/node/operate-validator.mdx +++ b/src/pages/guide/node/operate-validator.mdx @@ -19,9 +19,12 @@ flowchart TD D -->|"once fully synced"| E["Voter ↔ Proposer"] ``` +Currently, on mainnet and testnet, the epoch length is around 3 hours, which means that your validator will transition through these states approximately every 3 hours. If the epoch length ever changes, the transition times will also change. + #### Not a participant (E) -Your validator isn't considered a peer by validators yet. This is because the validator hasn't been refreshed in the current epoch yet. +Epoch E marks the addition of your validator to the on-chain validator configuration smart contract. Your validator isn't considered a peer by validators yet. This is because the validator hasn't been refreshed in the current epoch yet. It is normal that no height metrics progress during this period, your node has to be considered +a syncer to receive blocks. #### Syncer (epoch E+1) @@ -57,7 +60,7 @@ curl -s localhost:8002/metrics | grep consensus_engine_dkg_manager_ceremony_succ curl -s localhost:8002/metrics | grep consensus_engine_dkg_manager_ceremony_failures_total ``` -If `how_often_dealer` or `how_often_player` is increasing, your node is actively participating in DKG ceremonies. +If `how_often_dealer` or `how_often_player` is increasing, your node is actively participating in DKG ceremonies. After your validator has been added to the network, you should alert on these metrics, as they indicate that your validator is actively participating in the network. ### Consensus @@ -125,7 +128,7 @@ The node will finish processing the current block before shutting down. Avoid us ### Resetting your validator's data :::danger -**You cannot reset a validator's data and continue with the same identity.** Doing so risks inconsistent voting, which can cause irrecoverable network safety failures. See [Recovery procedures](/guide/node/troubleshoot-validator#recovery-procedures) for the correct process. +**You cannot reset a validator's data and continue with the same identity.** Doing so risks inconsistent voting, which can cause irrecoverable network safety failures. ::: If you need to reset your validator's data, you must rotate to a new validator identity. This requires coordinating with the Tempo team to deactivate your old identity and register a new one. @@ -145,7 +148,7 @@ tempo consensus calculate-public-key --private-key 2. Contact the Tempo team to update your validator's public key on-chain -3. Once confirmed, update your node configuration to use the new key and restart +3. Once confirmed, update your node configuration to use the new key and restart. Once the node is running, your validator will go through the [validator lifecycle](/guide/node/operate-validator#validator-states). :::warning The old validator identity must be deactivated before the new one is activated @@ -154,7 +157,7 @@ The old validator identity must be deactivated before the new one is activated ### Signing Share Recovery :::danger -**You cannot reset a validator's data and continue with the same identity.** Doing so risks inconsistent voting, which can cause irrecoverable network safety failures. See [Recovery procedures](/guide/node/troubleshoot-validator#recovery-procedures) for the correct process. +**You cannot reset a validator's data and continue with the same identity.** Doing so risks inconsistent voting, which can cause irrecoverable network safety failures. ::: If you lose your signing share (stored on the database in `/consensus/`), you will need to rotate to a new validator identity. This requires coordinating with the Tempo team to deactivate your old identity and register a new one. @@ -174,6 +177,12 @@ sudo journalctl -u tempo | sed 's/\x1b\[[0-9;]*m//g' | grep "error" RUST_LOG_STYLE=never tempo node ... ``` +If you're using Loki, you can also use the `decolorize` filter to strip colors: + +```logql +{job="tempo-node"} | decolorize +``` + ### Log Levels Control verbosity with `RUST_LOG`: diff --git a/src/shims/sanitize-url.ts b/src/shims/sanitize-url.ts new file mode 100644 index 00000000..46ddc77c --- /dev/null +++ b/src/shims/sanitize-url.ts @@ -0,0 +1,40 @@ +const blankUrl = 'about:blank' +const invalidProtocolRegex = /^(?:javascript|data|vbscript):/i +const urlSchemeRegex = /^[a-zA-Z][a-zA-Z\d+.-]*:/ +const relativeFirstCharacters = ['.', '/', '#', '?'] + +const sanitizeUrl = (url?: string): string => { + if (!url) { + return blankUrl + } + + const trimmed = url.trim() + if (!trimmed) { + return blankUrl + } + + if (relativeFirstCharacters.includes(trimmed[0] ?? '')) { + return trimmed + } + + const schemeMatch = trimmed.match(urlSchemeRegex) + if (!schemeMatch) { + return trimmed + } + + const scheme = schemeMatch[0].toLowerCase().trim() + if (invalidProtocolRegex.test(scheme)) { + return blankUrl + } + + if (scheme === 'http:' || scheme === 'https:' || scheme === 'mailto:') { + if (scheme !== 'mailto:' && typeof URL?.canParse === 'function' && !URL.canParse(trimmed)) { + return blankUrl + } + return trimmed + } + + return trimmed +} + +export { sanitizeUrl } From ce2346d70c068986c7a93d6bd942fca8f7f67737 Mon Sep 17 00:00:00 2001 From: tmm Date: Tue, 27 Jan 2026 10:39:20 -0500 Subject: [PATCH 12/13] fix: mermaid deps --- package.json | 1 + patches/@braintree__sanitize-url@7.1.1.patch | 127 +++ patches/dayjs@1.11.19.patch | 21 + pnpm-lock.yaml | 869 ++++++++++++++++++- pnpm-workspace.yaml | 3 + src/pages/_root.css | 4 + src/pages/protocol/tips/tip-1010.mdx | 34 +- src/shims/sanitize-url.ts | 40 - vite.config.ts | 13 - 9 files changed, 1041 insertions(+), 71 deletions(-) create mode 100644 patches/@braintree__sanitize-url@7.1.1.patch create mode 100644 patches/dayjs@1.11.19.patch create mode 100644 pnpm-workspace.yaml delete mode 100644 src/shims/sanitize-url.ts diff --git a/package.json b/package.json index 4ca23949..24b26b5d 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "@vercel/speed-insights": "^1.3.1", "abitype": "^1.2.3", "cva": "1.0.0-beta.4", + "mermaid": "^11.12.2", "monaco-editor": "^0.55.1", "ox": "^0.11.3", "posthog-js": "^1.333.0", diff --git a/patches/@braintree__sanitize-url@7.1.1.patch b/patches/@braintree__sanitize-url@7.1.1.patch new file mode 100644 index 00000000..7ae426b0 --- /dev/null +++ b/patches/@braintree__sanitize-url@7.1.1.patch @@ -0,0 +1,127 @@ +diff --git a/dist/constants.mjs b/dist/constants.mjs +new file mode 100644 +index 0000000000000000000000000000000000000000..3f84d3e87ee0e17a8d0c655dca7c8c9bea747855 +--- /dev/null ++++ b/dist/constants.mjs +@@ -0,0 +1,8 @@ ++export const invalidProtocolRegex = /^([^\w]*)(javascript|data|vbscript)/im; ++export const htmlEntitiesRegex = /&#(\w+)(^\w|;)?/g; ++export const htmlCtrlEntityRegex = /&(newline|tab);/gi; ++export const ctrlCharactersRegex = /[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim; ++export const urlSchemeRegex = /^.+(:|:)/gim; ++export const whitespaceEscapeCharsRegex = /(\\|%5[cC])((%(6[eE]|72|74))|[nrt])/g; ++export const relativeFirstCharacters = [".", "/"]; ++export const BLANK_URL = "about:blank"; +diff --git a/dist/index.mjs b/dist/index.mjs +new file mode 100644 +index 0000000000000000000000000000000000000000..bfe926a4db36ae8fc0925ab41e185e2332190f65 +--- /dev/null ++++ b/dist/index.mjs +@@ -0,0 +1,86 @@ ++import { ++ relativeFirstCharacters, ++ ctrlCharactersRegex, ++ htmlEntitiesRegex, ++ htmlCtrlEntityRegex, ++ whitespaceEscapeCharsRegex, ++ urlSchemeRegex, ++ invalidProtocolRegex, ++ BLANK_URL ++} from './constants.mjs'; ++ ++function isRelativeUrlWithoutProtocol(url) { ++ return relativeFirstCharacters.indexOf(url[0]) > -1; ++} ++ ++function decodeHtmlCharacters(str) { ++ var removedNullByte = str.replace(ctrlCharactersRegex, ""); ++ return removedNullByte.replace(htmlEntitiesRegex, function (match, dec) { ++ return String.fromCharCode(dec); ++ }); ++} ++ ++function isValidUrl(url) { ++ return URL.canParse(url); ++} ++ ++function decodeURI(uri) { ++ try { ++ return decodeURIComponent(uri); ++ } catch (e) { ++ return uri; ++ } ++} ++ ++export function sanitizeUrl(url) { ++ if (!url) { ++ return BLANK_URL; ++ } ++ var charsToDecode; ++ var decodedUrl = decodeURI(url.trim()); ++ do { ++ decodedUrl = decodeHtmlCharacters(decodedUrl) ++ .replace(htmlCtrlEntityRegex, "") ++ .replace(ctrlCharactersRegex, "") ++ .replace(whitespaceEscapeCharsRegex, "") ++ .trim(); ++ decodedUrl = decodeURI(decodedUrl); ++ charsToDecode = ++ decodedUrl.match(ctrlCharactersRegex) || ++ decodedUrl.match(htmlEntitiesRegex) || ++ decodedUrl.match(htmlCtrlEntityRegex) || ++ decodedUrl.match(whitespaceEscapeCharsRegex); ++ } while (charsToDecode && charsToDecode.length > 0); ++ var sanitizedUrl = decodedUrl; ++ if (!sanitizedUrl) { ++ return BLANK_URL; ++ } ++ if (isRelativeUrlWithoutProtocol(sanitizedUrl)) { ++ return sanitizedUrl; ++ } ++ var trimmedUrl = sanitizedUrl.trimStart(); ++ var urlSchemeParseResults = trimmedUrl.match(urlSchemeRegex); ++ if (!urlSchemeParseResults) { ++ return sanitizedUrl; ++ } ++ var urlScheme = urlSchemeParseResults[0].toLowerCase().trim(); ++ if (invalidProtocolRegex.test(urlScheme)) { ++ return BLANK_URL; ++ } ++ var backSanitized = trimmedUrl.replace(/\\/g, "/"); ++ if (urlScheme === "mailto:" || urlScheme.includes("://")) { ++ return backSanitized; ++ } ++ if (urlScheme === "http:" || urlScheme === "https:") { ++ if (!isValidUrl(backSanitized)) { ++ return BLANK_URL; ++ } ++ var url_1 = new URL(backSanitized); ++ url_1.protocol = url_1.protocol.toLowerCase(); ++ url_1.hostname = url_1.hostname.toLowerCase(); ++ return url_1.toString(); ++ } ++ return backSanitized; ++} ++ ++export default { sanitizeUrl }; +diff --git a/package.json b/package.json +index 39aca294ea8eacfb2db580b99bd12d21c79e8c15..b41790cd8f42b78c17df66f145146cd6f02f9b35 100644 +--- a/package.json ++++ b/package.json +@@ -3,7 +3,16 @@ + "version": "7.1.1", + "description": "A url sanitizer", + "main": "dist/index.js", ++ "module": "dist/index.mjs", + "types": "dist/index.d.ts", ++ "exports": { ++ ".": { ++ "import": "./dist/index.mjs", ++ "require": "./dist/index.js", ++ "types": "./dist/index.d.ts" ++ }, ++ "./dist/constants.mjs": "./dist/constants.mjs" ++ }, + "author": "", + "scripts": { + "prepublishOnly": "npm run build", diff --git a/patches/dayjs@1.11.19.patch b/patches/dayjs@1.11.19.patch new file mode 100644 index 00000000..7934e627 --- /dev/null +++ b/patches/dayjs@1.11.19.patch @@ -0,0 +1,21 @@ +diff --git a/package.json b/package.json +index fb0b8b2a3d27b0f97b0230845efbfb4a31553e65..722701819d3ee81a4e4966e57d47a26bb5eb5d95 100644 +--- a/package.json ++++ b/package.json +@@ -3,7 +3,16 @@ + "version": "1.11.19", + "description": "2KB immutable date time library alternative to Moment.js with the same modern API ", + "main": "dayjs.min.js", ++ "module": "esm/index.js", + "types": "index.d.ts", ++ "exports": { ++ ".": { ++ "import": "./esm/index.js", ++ "require": "./dayjs.min.js", ++ "types": "./index.d.ts" ++ }, ++ "./*": "./*" ++ }, + "scripts": { + "test": "TZ=Pacific/Auckland npm run test-tz && TZ=Europe/London npm run test-tz && TZ=America/Whitehorse npm run test-tz && npm run test-tz && jest --coverage --coverageThreshold='{ \"global\": { \"lines\": 100} }'", + "test-tz": "date && jest test/timezone.test --coverage=false", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e292176c..212d33a9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,14 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +patchedDependencies: + '@braintree/sanitize-url@7.1.1': + hash: 4b5a3f788745121e865755a339649fcbb8a61e07b3b14e46e21157d8a8cd6be2 + path: patches/@braintree__sanitize-url@7.1.1.patch + dayjs@1.11.19: + hash: a7ae60f3216bc5e2c1ef103e76c328ca2c3e7f9860180811b9008c17e9153d5d + path: patches/dayjs@1.11.19.patch + importers: .: @@ -32,6 +40,9 @@ importers: cva: specifier: 1.0.0-beta.4 version: 1.0.0-beta.4(typescript@5.9.3) + mermaid: + specifier: ^11.12.2 + version: 11.12.2 monaco-editor: specifier: ^0.55.1 version: 0.55.1 @@ -76,7 +87,7 @@ importers: version: 2.44.4(typescript@5.9.3)(zod@4.3.5) vocs: specifier: https://pkg.pr.new/wevm/vocs@082ea99 - version: https://pkg.pr.new/wevm/vocs@082ea99(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react-server-dom-webpack@19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.104.1))(react@19.2.3)(rollup@4.56.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(waku@1.0.0-alpha.2(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.3(react@19.2.3))(react-server-dom-webpack@19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.104.1))(react@19.2.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: https://pkg.pr.new/wevm/vocs@082ea99(@types/react@19.2.9)(mermaid@11.12.2)(react-dom@19.2.3(react@19.2.3))(react-server-dom-webpack@19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.104.1))(react@19.2.3)(rollup@4.56.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(waku@1.0.0-alpha.2(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.3(react@19.2.3))(react-server-dom-webpack@19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.104.1))(react@19.2.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) wagmi: specifier: 3.4.1 version: 3.4.1(@tanstack/query-core@5.90.19)(@tanstack/react-query@5.90.19(react@19.2.3))(@types/react@19.2.9)(ox@0.11.3(typescript@5.9.3)(zod@4.3.5))(react@19.2.3)(typescript@5.9.3)(viem@2.44.4(typescript@5.9.3)(zod@4.3.5)) @@ -293,6 +304,24 @@ packages: cpu: [x64] os: [win32] + '@braintree/sanitize-url@7.1.1': + resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} + + '@chevrotain/cst-dts-gen@11.0.3': + resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} + + '@chevrotain/gast@11.0.3': + resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==} + + '@chevrotain/regexp-to-ast@11.0.3': + resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==} + + '@chevrotain/types@11.0.3': + resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==} + + '@chevrotain/utils@11.0.3': + resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + '@codemirror/autocomplete@6.20.0': resolution: {integrity: sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==} @@ -582,6 +611,9 @@ packages: peerDependencies: rollup: '>=2' + '@mermaid-js/parser@0.6.3': + resolution: {integrity: sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==} + '@modelcontextprotocol/sdk@1.25.3': resolution: {integrity: sha512-vsAMBMERybvYgKbg/l4L1rhS7VXV1c0CtyJg72vwxONVX0l4ZfKVAnZEWTQixJGTzKnELjQ59e4NbdFDALRiAQ==} engines: {node: '>=18'} @@ -1184,6 +1216,99 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@types/d3-array@3.2.2': + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.7': + resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.3': + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-selection@3.0.11': + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + + '@types/d3-shape@3.1.8': + resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -1199,6 +1324,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -1589,6 +1717,14 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chevrotain-allstar@0.3.1: + resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} + peerDependencies: + chevrotain: ^11.0.0 + + chevrotain@11.0.3: + resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} @@ -1620,6 +1756,14 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} @@ -1652,6 +1796,12 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + cosmiconfig@8.3.6: resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} @@ -1679,10 +1829,169 @@ packages: typescript: optional: true + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.33.1: + resolution: {integrity: sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.2: + resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + d@1.0.2: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} + dagre-d3-es@7.0.13: + resolution: {integrity: sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==} + + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -1695,6 +2004,9 @@ packages: decode-named-character-reference@1.3.0: resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -1998,6 +2310,9 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -2050,6 +2365,10 @@ packages: resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} engines: {node: '>=18.18.0'} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + iconv-lite@0.7.2: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} @@ -2072,6 +2391,13 @@ packages: inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + intersection-observer@0.10.0: resolution: {integrity: sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ==} deprecated: The Intersection Observer polyfill is no longer needed and can safely be removed. Intersection Observer has been Baseline since 2019. @@ -2161,6 +2487,23 @@ packages: engines: {node: '>=6'} hasBin: true + katex@0.16.28: + resolution: {integrity: sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg==} + hasBin: true + + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + + langium@3.3.1: + resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} + engines: {node: '>=16.0.0'} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + lightningcss-android-arm64@1.30.2: resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} engines: {node: '>= 12.0.0'} @@ -2242,6 +2585,12 @@ packages: resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} engines: {node: '>=14'} + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash-es@4.17.23: + resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==} + long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} @@ -2273,6 +2622,11 @@ packages: engines: {node: '>= 18'} hasBin: true + marked@16.4.2: + resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} + engines: {node: '>= 20'} + hasBin: true + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -2342,6 +2696,9 @@ packages: merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + mermaid@11.12.2: + resolution: {integrity: sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w==} + micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -2705,6 +3062,9 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -2747,6 +3107,12 @@ packages: pkg-types@2.3.0: resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + + points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -2924,11 +3290,17 @@ packages: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + rollup@4.56.0: resolution: {integrity: sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -2936,6 +3308,9 @@ packages: rsc-html-stream@0.0.7: resolution: {integrity: sha512-v9+fuY7usTgvXdNl8JmfXCvSsQbq2YMd60kOeeMIqCJFZ69fViuIxztHei7v5mlMMa2h3SqS+v44Gu9i9xANZA==} + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -3069,6 +3444,9 @@ packages: style-to-object@1.0.14: resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + sucrase@3.35.1: resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} engines: {node: '>=16 || 14 >=14.17'} @@ -3161,6 +3539,10 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -3316,6 +3698,10 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -3411,6 +3797,26 @@ packages: waku: optional: true + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + w3c-keyname@2.2.8: resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} @@ -3709,6 +4115,25 @@ snapshots: '@biomejs/cli-win32-x64@2.3.11': optional: true + '@braintree/sanitize-url@7.1.1(patch_hash=4b5a3f788745121e865755a339649fcbb8a61e07b3b14e46e21157d8a8cd6be2)': {} + + '@chevrotain/cst-dts-gen@11.0.3': + dependencies: + '@chevrotain/gast': 11.0.3 + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/gast@11.0.3': + dependencies: + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/regexp-to-ast@11.0.3': {} + + '@chevrotain/types@11.0.3': {} + + '@chevrotain/utils@11.0.3': {} + '@codemirror/autocomplete@6.20.0': dependencies: '@codemirror/language': 6.12.1 @@ -4040,6 +4465,10 @@ snapshots: transitivePeerDependencies: - supports-color + '@mermaid-js/parser@0.6.3': + dependencies: + langium: 3.3.1 + '@modelcontextprotocol/sdk@1.25.3(hono@4.11.5)(zod@4.3.5)': dependencies: '@hono/node-server': 1.19.9(hono@4.11.5) @@ -4585,6 +5014,123 @@ snapshots: dependencies: '@babel/types': 7.28.6 + '@types/d3-array@3.2.2': {} + + '@types/d3-axis@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-brush@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-chord@3.0.6': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-contour@3.0.6': + dependencies: + '@types/d3-array': 3.2.2 + '@types/geojson': 7946.0.16 + + '@types/d3-delaunay@6.0.4': {} + + '@types/d3-dispatch@3.0.7': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-dsv@3.0.7': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-fetch@3.0.7': + dependencies: + '@types/d3-dsv': 3.0.7 + + '@types/d3-force@3.0.10': {} + + '@types/d3-format@3.0.4': {} + + '@types/d3-geo@3.1.0': + dependencies: + '@types/geojson': 7946.0.16 + + '@types/d3-hierarchy@3.1.7': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-polygon@3.0.2': {} + + '@types/d3-quadtree@3.0.6': {} + + '@types/d3-random@3.0.3': {} + + '@types/d3-scale-chromatic@3.1.0': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-selection@3.0.11': {} + + '@types/d3-shape@3.1.8': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time-format@4.0.3': {} + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + + '@types/d3@7.4.3': + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.7 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.3 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-selection': 3.0.11 + '@types/d3-shape': 3.1.8 + '@types/d3-time': 3.0.4 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 @@ -4605,6 +5151,8 @@ snapshots: '@types/estree@1.0.8': {} + '@types/geojson@7946.0.16': {} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -4936,6 +5484,20 @@ snapshots: character-reference-invalid@2.0.1: {} + chevrotain-allstar@0.3.1(chevrotain@11.0.3): + dependencies: + chevrotain: 11.0.3 + lodash-es: 4.17.23 + + chevrotain@11.0.3: + dependencies: + '@chevrotain/cst-dts-gen': 11.0.3 + '@chevrotain/gast': 11.0.3 + '@chevrotain/regexp-to-ast': 11.0.3 + '@chevrotain/types': 11.0.3 + '@chevrotain/utils': 11.0.3 + lodash-es: 4.17.21 + chownr@3.0.0: {} chrome-trace-event@1.0.4: {} @@ -4956,6 +5518,10 @@ snapshots: commander@4.1.1: {} + commander@7.2.0: {} + + commander@8.3.0: {} + confbox@0.1.8: {} confbox@0.2.2: {} @@ -4977,6 +5543,14 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + cosmiconfig@8.3.6(typescript@5.9.3): dependencies: import-fresh: 3.3.1 @@ -5002,11 +5576,197 @@ snapshots: optionalDependencies: typescript: 5.9.3 + cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.33.1 + + cytoscape-fcose@2.2.0(cytoscape@3.33.1): + dependencies: + cose-base: 2.2.0 + cytoscape: 3.33.1 + + cytoscape@3.33.1: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.2: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.2 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.2 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + d@1.0.2: dependencies: es5-ext: 0.10.64 type: 2.7.3 + dagre-d3-es@7.0.13: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.23 + + dayjs@1.11.19(patch_hash=a7ae60f3216bc5e2c1ef103e76c328ca2c3e7f9860180811b9008c17e9153d5d): {} + debug@4.4.3: dependencies: ms: 2.1.3 @@ -5015,6 +5775,10 @@ snapshots: dependencies: character-entities: 2.0.2 + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + depd@2.0.0: {} dequal@2.0.3: {} @@ -5367,6 +6131,8 @@ snapshots: graceful-fs@4.2.11: {} + hachure-fill@0.5.2: {} + has-flag@4.0.0: {} has-symbols@1.1.0: {} @@ -5468,6 +6234,10 @@ snapshots: human-signals@8.0.1: {} + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 @@ -5485,6 +6255,10 @@ snapshots: inline-style-parser@0.2.7: {} + internmap@1.0.1: {} + + internmap@2.0.3: {} + intersection-observer@0.10.0: {} ipaddr.js@1.9.1: {} @@ -5548,6 +6322,24 @@ snapshots: json5@2.2.3: {} + katex@0.16.28: + dependencies: + commander: 8.3.0 + + khroma@2.1.0: {} + + langium@3.3.1: + dependencies: + chevrotain: 11.0.3 + chevrotain-allstar: 0.3.1(chevrotain@11.0.3) + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + + layout-base@1.0.2: {} + + layout-base@2.0.1: {} + lightningcss-android-arm64@1.30.2: optional: true @@ -5607,6 +6399,10 @@ snapshots: pkg-types: 2.3.0 quansync: 0.2.11 + lodash-es@4.17.21: {} + + lodash-es@4.17.23: {} + long@5.3.2: {} longest-streak@3.1.0: {} @@ -5631,6 +6427,8 @@ snapshots: marked@14.0.0: {} + marked@16.4.2: {} + math-intrinsics@1.1.0: {} mdast-util-directive@3.1.0: @@ -5827,6 +6625,29 @@ snapshots: merge-stream@2.0.0: {} + mermaid@11.12.2: + dependencies: + '@braintree/sanitize-url': 7.1.1(patch_hash=4b5a3f788745121e865755a339649fcbb8a61e07b3b14e46e21157d8a8cd6be2) + '@iconify/utils': 3.1.0 + '@mermaid-js/parser': 0.6.3 + '@types/d3': 7.4.3 + cytoscape: 3.33.1 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1) + cytoscape-fcose: 2.2.0(cytoscape@3.33.1) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.13 + dayjs: 1.11.19(patch_hash=a7ae60f3216bc5e2c1ef103e76c328ca2c3e7f9860180811b9008c17e9153d5d) + dompurify: 3.3.1 + katex: 0.16.28 + khroma: 2.1.0 + lodash-es: 4.17.23 + marked: 16.4.2 + roughjs: 4.6.6 + stylis: 4.3.6 + ts-dedent: 2.2.0 + uuid: 11.1.0 + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.3.0 @@ -6256,6 +7077,8 @@ snapshots: parseurl@1.3.3: {} + path-data-parser@0.1.0: {} + path-key@3.1.1: {} path-key@4.0.0: {} @@ -6292,6 +7115,13 @@ snapshots: exsolve: 1.0.8 pathe: 2.0.3 + points-on-curve@0.2.0: {} + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -6559,6 +7389,8 @@ snapshots: ret@0.1.15: {} + robust-predicates@3.0.2: {} + rollup@4.56.0: dependencies: '@types/estree': 1.0.8 @@ -6590,6 +7422,13 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.56.0 fsevents: 2.3.3 + roughjs@4.6.6: + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + router@2.2.0: dependencies: debug: 4.4.3 @@ -6602,6 +7441,8 @@ snapshots: rsc-html-stream@0.0.7: {} + rw@1.3.3: {} + safe-buffer@5.2.1: {} safer-buffer@2.1.2: {} @@ -6761,6 +7602,8 @@ snapshots: dependencies: inline-style-parser: 0.2.7 + stylis@4.3.6: {} + sucrase@3.35.1: dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -6850,6 +7693,8 @@ snapshots: trough@2.2.0: {} + ts-dedent@2.2.0: {} + ts-interface-checker@0.1.13: {} tslib@2.8.1: {} @@ -7014,6 +7859,8 @@ snapshots: dependencies: react: 19.2.3 + uuid@11.1.0: {} + vary@1.1.2: {} vfile-message@4.0.3: @@ -7070,7 +7917,7 @@ snapshots: optionalDependencies: vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - vocs@https://pkg.pr.new/wevm/vocs@082ea99(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react-server-dom-webpack@19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.104.1))(react@19.2.3)(rollup@4.56.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(waku@1.0.0-alpha.2(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.3(react@19.2.3))(react-server-dom-webpack@19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.104.1))(react@19.2.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): + vocs@https://pkg.pr.new/wevm/vocs@082ea99(@types/react@19.2.9)(mermaid@11.12.2)(react-dom@19.2.3(react@19.2.3))(react-server-dom-webpack@19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.104.1))(react@19.2.3)(rollup@4.56.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(waku@1.0.0-alpha.2(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.3(react@19.2.3))(react-server-dom-webpack@19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.104.1))(react@19.2.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@base-ui/react': 1.1.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@codesandbox/sandpack-react': 2.20.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -7142,6 +7989,7 @@ snapshots: yaml: 2.8.2 zod: 4.3.5 optionalDependencies: + mermaid: 11.12.2 vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) waku: 1.0.0-alpha.2(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.3(react@19.2.3))(react-server-dom-webpack@19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.104.1))(react@19.2.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: @@ -7162,6 +8010,23 @@ snapshots: - vue-template-compiler - vue-template-es2015-compiler + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-uri@3.0.8: {} + w3c-keyname@2.2.8: {} wagmi@3.4.1(@tanstack/query-core@5.90.19)(@tanstack/react-query@5.90.19(react@19.2.3))(@types/react@19.2.9)(ox@0.11.3(typescript@5.9.3)(zod@4.3.5))(react@19.2.3)(typescript@5.9.3)(viem@2.44.4(typescript@5.9.3)(zod@4.3.5)): diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 00000000..520d166e --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +patchedDependencies: + '@braintree/sanitize-url@7.1.1': patches/@braintree__sanitize-url@7.1.1.patch + dayjs@1.11.19: patches/dayjs@1.11.19.patch diff --git a/src/pages/_root.css b/src/pages/_root.css index 624b4ab9..0d130ff5 100644 --- a/src/pages/_root.css +++ b/src/pages/_root.css @@ -234,3 +234,7 @@ height: 28px; margin-top: 2px; } + +.data-v-mermaid-container { + min-height: 200px; +} diff --git a/src/pages/protocol/tips/tip-1010.mdx b/src/pages/protocol/tips/tip-1010.mdx index 86c12b1f..92a00837 100644 --- a/src/pages/protocol/tips/tip-1010.mdx +++ b/src/pages/protocol/tips/tip-1010.mdx @@ -4,7 +4,7 @@ title: Mainnet Gas Parameters description: Initial gas parameters for Tempo mainnet launch including base fee pricing, payment lane capacity, and transaction gas limits. authors: Dankrad Feist @dankrad status: Approved -related: TIP-1000, Payment Lane Specification +related: TIP-1000, Payment Lane Specification, Sub block Specification protocolVersion: T1 --- @@ -31,14 +31,14 @@ The parameters defined in this TIP represent the initial mainnet configuration a ## Base Fee -**Value**: `2 × 10^10` +**Value**: `2 × 10^10` wei (20 gwei) **Rationale**: - A standard TIP-20 transfer costs approximately 50,000 gas -- Fee calculation: `gas_used × base_fee / 10^12` (the 10^12 denominator is an adjustment Tempo uses when setting gas fees; see [fee units](/protocol/fees/spec-fee#fee-units)) -- At this base fee: `50,000 × 2 × 10^10 / 10^12 = 1000` microdollars, or `1000 / 10^6 = $0.001` (0.1 cent per transfer) +- At 20 gwei base fee: `50,000 × 20 × 10^9 = 10^15 wei = 0.001 USD` (assuming 1 ETH = $1000 for unit conversion reference) +- This targets approximately **0.1 cent per TIP-20 transfer** -**Note**: This is a fixed base fee; Tempo does not use EIP-1559 to adjust the base fee. However, if blocks are full, transactions may need to include a priority fee to be included, which could result in transfers costing more than $0.001. +**Note**: The base fee may fluctuate based on network demand through the existing EIP-1559-style mechanism. This value represents the target equilibrium base fee. ## Payment Lane Gas Limit @@ -54,7 +54,7 @@ The parameters defined in this TIP represent the initial mainnet configuration a - Complex contract interactions use the general gas limit instead :::info -**Shared capacity model**: The payment lane is non-dedicated. General transactions consume from the same 500M total block gas limit, reducing the remaining capacity available for payment transactions. However, general transactions are capped at `general_gas_limit` (30M), guaranteeing that at least 470M gas remains available for payments even under maximum general transaction load. +**Shared capacity model**: The payment lane is non-dedicated. General and payment transactions selected by the proposer share the non-shared gas budget (`block_gas_limit - shared_gas_limit` = 450M). General transactions are capped at `general_gas_limit` (30M), guaranteeing that at least 420M gas remains available for proposer payment transactions. The remaining 50M (`shared_gas_limit`) is reserved for validator subblocks as defined in the Sub-block Specification. ::: ## Main Transaction Gas Limit @@ -93,19 +93,21 @@ The parameters defined in this TIP represent the initial mainnet configuration a | Parameter | Value | Purpose | |-----------|-------|---------| -| Base fee | `2 × 10^10` | Target 0.1 cent per TIP-20 transfer | -| Total block gas limit | 500,000,000 gas/block | Shared capacity; supports ~20,000 TPS for payments | -| General gas limit | 30,000,000 gas/block | General contract interactions | +| Base fee | `2 × 10^10` wei (20 gwei) | Target 0.1 cent per TIP-20 transfer | +| Total block gas limit | 500,000,000 gas/block | Total block capacity | +| Non-shared gas limit | 450,000,000 gas/block | Proposer pool transactions | +| Shared gas limit | 50,000,000 gas/block | Validator subblocks (see Sub-block Specification) | +| General gas limit | 30,000,000 gas/block | Cap for non-payment transactions | | Transaction gas cap | 30,000,000 gas | Allow max-size contract deployment | ## Economic Analysis -### Cost of Attack +### Fee Revenue Projections -To fill up the payment lane at the base fee, an attacker would need to spend: -- 10,000 transfers per block × $0.001 per transfer = $10 per block -- At 2 blocks/second: $20/second -- Daily: ~$1,728,000 +At full payment lane utilization: +- 10,000 transfers per block × 50,000 gas × 20 gwei = 10^16 wei per block +- At 2 blocks/second: 2 × 10^16 wei/second = ~$0.02/second (at reference pricing) +- Daily: ~$1,728 in base fees from payment lane alone ### Cost Per Operation @@ -125,7 +127,7 @@ To fill up the payment lane at the base fee, an attacker would need to spend: 2. **Payment Lane Priority**: Transactions qualifying for the payment lane MUST be able to consume up to the remaining block gas capacity (total gas limit minus gas already consumed by general transactions). -3. **Shared Gas Pool**: The payment lane and general transactions share a common block gas limit (500M). General transactions are additionally constrained by `general_gas_limit` (30M), ensuring payment transactions always have access to at least 470M gas. +3. **Shared Gas Pool**: Proposer pool transactions (payment and general) share the non-shared gas budget (450M). General transactions are additionally constrained by `general_gas_limit` (30M). The remaining 50M is reserved for validator subblocks. 4. **Transaction Gas Cap**: No single transaction MUST be allowed to consume more than the transaction gas cap (30,000,000 gas). @@ -145,7 +147,7 @@ These parameters are configured at the chainspec level and applied during block 1. **Base fee targeting**: Verify that at equilibrium, TIP-20 transfers cost approximately 0.1 cent 2. **Payment lane capacity**: Verify that 10,000 TIP-20 transfers can be included in a single block -3. **General gas limit**: Verify that general transactions are correctly bounded by the 30M gas limit +3. **General gas limit**: Verify that general transactions are correctly bounded by the 25M gas limit 4. **Transaction gas cap**: Verify that transactions exceeding 30M gas are rejected 5. **Contract deployment**: Verify that a 24KB contract can be deployed within the transaction gas cap 6. **Lane separation**: Verify that payment lane and general transactions are independently tracked diff --git a/src/shims/sanitize-url.ts b/src/shims/sanitize-url.ts deleted file mode 100644 index 46ddc77c..00000000 --- a/src/shims/sanitize-url.ts +++ /dev/null @@ -1,40 +0,0 @@ -const blankUrl = 'about:blank' -const invalidProtocolRegex = /^(?:javascript|data|vbscript):/i -const urlSchemeRegex = /^[a-zA-Z][a-zA-Z\d+.-]*:/ -const relativeFirstCharacters = ['.', '/', '#', '?'] - -const sanitizeUrl = (url?: string): string => { - if (!url) { - return blankUrl - } - - const trimmed = url.trim() - if (!trimmed) { - return blankUrl - } - - if (relativeFirstCharacters.includes(trimmed[0] ?? '')) { - return trimmed - } - - const schemeMatch = trimmed.match(urlSchemeRegex) - if (!schemeMatch) { - return trimmed - } - - const scheme = schemeMatch[0].toLowerCase().trim() - if (invalidProtocolRegex.test(scheme)) { - return blankUrl - } - - if (scheme === 'http:' || scheme === 'https:' || scheme === 'mailto:') { - if (scheme !== 'mailto:' && typeof URL?.canParse === 'function' && !URL.canParse(trimmed)) { - return blankUrl - } - return trimmed - } - - return trimmed -} - -export { sanitizeUrl } diff --git a/vite.config.ts b/vite.config.ts index 7073bf8e..96bbb99e 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -7,19 +7,6 @@ import { vocs } from 'vocs/vite' // https://vite.dev/config/ export default defineConfig({ - resolve: { - alias: [ - { find: 'dayjs', replacement: 'dayjs/esm' }, - { find: 'dayjs/dayjs.min.js', replacement: 'dayjs/esm' }, - { - find: /^@braintree\/sanitize-url$/, - replacement: path.resolve(process.cwd(), 'src/shims/sanitize-url.ts'), - }, - ], - }, - optimizeDeps: { - include: ['@braintree/sanitize-url'], - }, plugins: [syncTips(), vocs(), react(), tempoNode()], }) From c87d9b275a7657976a759c4ef9189a8fadece1bb Mon Sep 17 00:00:00 2001 From: tmm Date: Tue, 27 Jan 2026 10:42:18 -0500 Subject: [PATCH 13/13] docs: link up diagram to heading anchors --- src/pages/guide/node/operate-validator.mdx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/pages/guide/node/operate-validator.mdx b/src/pages/guide/node/operate-validator.mdx index 1492c6a2..1efbab8d 100644 --- a/src/pages/guide/node/operate-validator.mdx +++ b/src/pages/guide/node/operate-validator.mdx @@ -17,6 +17,12 @@ flowchart TD B -->|+1 epoch| C["Syncer and Player"] C -->|"+1 epoch, receives share"| D["Syncer
Player
Dealer"] D -->|"once fully synced"| E["Voter ↔ Proposer"] + + click A "#not-a-participant-e" + click B "#syncer-epoch-e1" + click C "#player-epoch-e2" + click D "#dealer-epoch-e3" + click E "#dealer-epoch-e3" ``` Currently, on mainnet and testnet, the epoch length is around 3 hours, which means that your validator will transition through these states approximately every 3 hours. If the epoch length ever changes, the transition times will also change.