From f7c9c29cd34dea03f3016b7e3f060c7a30e2c5bb Mon Sep 17 00:00:00 2001 From: miguel502 Date: Wed, 10 Jun 2026 13:53:06 -0400 Subject: [PATCH 1/2] feat: harden ExecuteTransaction verification (#304) (#306) * feat: harden ExecuteTransaction verification * fix: fail ExecutePendingTransactions when all child workflows fail --------- Co-authored-by: Jorge Cuesta --- .../workflows/ExecutePendingTransactions.ts | 63 ++++++++--- .../src/workflows/ExecuteTransaction.ts | 16 ++- packages/pocket/src/getTransaction.test.ts | 61 ++++++++++ packages/pocket/src/index.ts | 107 +++++++++++++----- 4 files changed, 203 insertions(+), 44 deletions(-) diff --git a/apps/middleman-workflows/src/workflows/ExecutePendingTransactions.ts b/apps/middleman-workflows/src/workflows/ExecutePendingTransactions.ts index 45f4aa31..81bcbfce 100644 --- a/apps/middleman-workflows/src/workflows/ExecutePendingTransactions.ts +++ b/apps/middleman-workflows/src/workflows/ExecutePendingTransactions.ts @@ -1,9 +1,15 @@ import {proxyActivities, WorkflowIdReusePolicy} from "@temporalio/workflow"; import { delegatorActivities } from '@/activities'; -import {executeChild} from "@temporalio/workflow"; +import {executeChild, log, WorkflowError} from "@temporalio/workflow"; + +// @ts-expect-error p-limit is ESM-only; its default export has no CJS types under this build's module resolution +import pLimit from 'p-limit' export interface ExecutePendingTransactionsArgs {} + +const MAX_CONCURRENT_TRANSACTIONS = 10 + export async function ExecutePendingTransactions(args: ExecutePendingTransactionsArgs) { const { listTransactions } = proxyActivities>({ @@ -15,21 +21,44 @@ export async function ExecutePendingTransactions(args: ExecutePendingTransaction const txs = await listTransactions(); - for (const {id, createdAt} of txs) { - const workflowId = `ExecuteTransaction-${id}-${createdAt}`; - await executeChild("ExecuteTransaction", { - workflowId, - args: [{ transactionId: id }], - workflowIdReusePolicy: WorkflowIdReusePolicy.ALLOW_DUPLICATE_FAILED_ONLY, - retry: { - maximumAttempts: 5, - }, - }).catch((err) => { - if (err.name === "WorkflowExecutionAlreadyStartedError") { - console.log(`Workflow with ID=${workflowId} is already running, skipping.`); - } else { - throw err; - } - }); + const limit = pLimit(MAX_CONCURRENT_TRANSACTIONS); + + const childPromises = txs.map(({ id, createdAt }) => + limit(() => { + const workflowId = `ExecuteTransaction-${id}-${createdAt}`; + return executeChild("ExecuteTransaction", { + workflowId, + args: [{ transactionId: id }], + workflowIdReusePolicy: WorkflowIdReusePolicy.ALLOW_DUPLICATE_FAILED_ONLY, + retry: { + maximumAttempts: 5, + }, + }).catch((err) => { + if (err.name === "WorkflowExecutionAlreadyStartedError") { + log.info(`Workflow with ID=${workflowId} is already running, skipping.`); + } else { + throw err; + } + }); + }) + ); + + const results = await Promise.allSettled(childPromises); + + for (const r of results) { + if (r.status === "rejected") { + log.warn("ExecutePendingTransactions: child workflow failed", { reason: String(r.reason) }); + } + } + + // Match the SupplierStatus pattern: a partial failure is tolerated (one bad tx + // shouldn't block the rest), but if every scheduled child failed the run is a + // systemic problem (e.g. RPC/DB down) and must surface as a workflow failure + // rather than completing green. Guard against the empty-batch case where + // `every` would vacuously return true. + const allFailed = + results.length > 0 && results.every((r) => r.status === "rejected"); + if (allFailed) { + throw new WorkflowError("ExecutePendingTransactions: all child workflows failed"); } } diff --git a/apps/middleman-workflows/src/workflows/ExecuteTransaction.ts b/apps/middleman-workflows/src/workflows/ExecuteTransaction.ts index 950fba29..f18a52d2 100644 --- a/apps/middleman-workflows/src/workflows/ExecuteTransaction.ts +++ b/apps/middleman-workflows/src/workflows/ExecuteTransaction.ts @@ -2,6 +2,7 @@ import { ActivityFailure, ApplicationFailure, proxyActivities, + TimeoutFailure, WorkflowError, } from '@temporalio/workflow' import { delegatorActivities } from "@/activities"; @@ -29,6 +30,13 @@ function isTxNotFoundFailure(err: unknown): boolean { return false } +function isStartToCloseTimeout(err: unknown): boolean { + if (err instanceof ActivityFailure && err.cause instanceof TimeoutFailure) { + return err.cause.timeoutType === 'START_TO_CLOSE' + } + return false +} + /** * Extracts the owner + operator addresses from a Stake transaction's unsigned payload. * Used for the Tier 4 fallback (supplier state check) when TX lookup fails — both are @@ -182,6 +190,7 @@ export async function ExecuteTransaction(args: TransactionArgs) { let txFoundOnChain = false; let supplierFallbackHit = false; let verifyErroredUnexpectedly = false; + let verifyTimedOut = false; try { // Retries are driven by Temporal's activity retry policy — one attempt per block @@ -198,7 +207,10 @@ export async function ExecuteTransaction(args: TransactionArgs) { // we never rethrow into an indefinite Pending loop) but record *why* so a real // verification error stays triageable instead of being mislabeled a clean // "not found". - verifyErroredUnexpectedly = !isTxNotFoundFailure(err); + // A clean not-found and a start-to-close timeout are both inconclusive (no + // proof the tx failed); only anything else counts as an unexpected error. + verifyTimedOut = isStartToCloseTimeout(err); + verifyErroredUnexpectedly = !isTxNotFoundFailure(err) && !verifyTimedOut; // Need both addresses to validate ownership — without the expected owner the // supplier fallback can't prove the on-chain supplier is ours, so we skip it @@ -231,6 +243,8 @@ export async function ExecuteTransaction(args: TransactionArgs) { verificationLog = 'verified via supplier state fallback (tx hash not found)'; } else if (verifyErroredUnexpectedly) { verificationLog = `verification errored (not a clean not-found) after ${TX_EXPIRATION_BLOCKS} retries; marked failure for triage (baseHeight=${baseHeight})`; + } else if (verifyTimedOut) { + verificationLog = `verify timed out (inconclusive, treated as not-found) after ${TX_EXPIRATION_BLOCKS} retries (baseHeight=${baseHeight})`; } else { verificationLog = `tx not found on-chain after ${TX_EXPIRATION_BLOCKS} retries (baseHeight=${baseHeight})`; } diff --git a/packages/pocket/src/getTransaction.test.ts b/packages/pocket/src/getTransaction.test.ts index a54e3ef6..d73c628b 100644 --- a/packages/pocket/src/getTransaction.test.ts +++ b/packages/pocket/src/getTransaction.test.ts @@ -6,6 +6,7 @@ import { toHex } from '@cosmjs/encoding' // --------------------------------------------------------------------------- const mockGetTx = jest.fn() +const mockGetHeight = jest.fn() const mockBlock = jest.fn() const mockBlockResults = jest.fn() const mockDisconnect = jest.fn() @@ -18,6 +19,7 @@ jest.mock('@cosmjs/stargate', () => { StargateClient: { create: jest.fn().mockResolvedValue({ getTx: mockGetTx, + getHeight: mockGetHeight, disconnect: mockDisconnect, }), }, @@ -71,6 +73,9 @@ const txHash = toHex(txHashBytes).toUpperCase() describe('PocketBlockchain.getTransaction', () => { beforeEach(() => { jest.clearAllMocks() + // Default: chain head far ahead so the Tier-3 block scan walks its full + // window unless a test overrides it to exercise the head-cap. + mockGetHeight.mockResolvedValue(10_000_000) }) // 1. Tier 1 success @@ -269,4 +274,60 @@ describe('PocketBlockchain.getTransaction', () => { code: 0, }) }) + + // 8. Block scan caps at chain head: never fetch future heights + it('does not scan past the current chain head during block scan', async () => { + mockGetTx.mockResolvedValue(null) + mockFetch.mockResolvedValue({ ok: false }) + mockBlock.mockResolvedValue({ block: { txs: [] } }) // tx never present + + const startHeight = 1000 + // Head is only 2 blocks past the start: window must be 1000..1002 inclusive. + mockGetHeight.mockResolvedValue(startHeight + 2) + + const bc = await createInstance('http://api.example.com') + const result = await bc.getTransaction(txHash, startHeight) + + expect(result).toBeNull() + expect(mockBlock).toHaveBeenCalledWith(startHeight) + expect(mockBlock).toHaveBeenCalledWith(startHeight + 1) + expect(mockBlock).toHaveBeenCalledWith(startHeight + 2) + // The default maxBlocks is 30, but the head cap must stop the scan at +2. + expect(mockBlock).not.toHaveBeenCalledWith(startHeight + 3) + expect(mockBlock).toHaveBeenCalledTimes(3) + }) + + // 9. Tx height ahead of chain head: scan is skipped entirely + it('skips the block scan when the tx height is ahead of the chain head', async () => { + mockGetTx.mockResolvedValue(null) + mockFetch.mockResolvedValue({ ok: false }) + + const startHeight = 5000 + mockGetHeight.mockResolvedValue(startHeight - 1) // head below tx height + + const bc = await createInstance('http://api.example.com') + const result = await bc.getTransaction(txHash, startHeight) + + expect(result).toBeNull() + expect(mockBlock).not.toHaveBeenCalled() + }) + + // 10. getHeight failure: fall back to scanning the full maxBlocks window + it('scans the full window when reading the chain head fails', async () => { + mockGetTx.mockResolvedValue(null) + mockFetch.mockResolvedValue({ ok: false }) + mockBlock.mockResolvedValue({ block: { txs: [] } }) // tx never present + mockGetHeight.mockRejectedValue(new Error('rpc unreachable')) // head unknown + + const startHeight = 2000 + const bc = await createInstance('http://api.example.com') + const result = await bc.getTransaction(txHash, startHeight) + + expect(result).toBeNull() + // Fallback window is the full default maxBlocks (30): startHeight .. startHeight+29. + expect(mockBlock).toHaveBeenCalledWith(startHeight) + expect(mockBlock).toHaveBeenCalledWith(startHeight + 29) + expect(mockBlock).not.toHaveBeenCalledWith(startHeight + 30) + expect(mockBlock).toHaveBeenCalledTimes(30) + }) }) diff --git a/packages/pocket/src/index.ts b/packages/pocket/src/index.ts index 890176f5..21bae41d 100644 --- a/packages/pocket/src/index.ts +++ b/packages/pocket/src/index.ts @@ -59,6 +59,36 @@ export function isSequenceMismatchError(errorMessage: string): boolean { return errorMessage.includes('account sequence mismatch') } +/** + * Maps `items` through `fn` with at most `limit` calls in flight at once, preserving + * input order in the returned array. Used to bound the Tier-3 block scan's parallel + * `comet.block()` fan-out: firing all ~30 heights at once (and up to MAX_CONCURRENT + * ExecuteTransactions doing the same) could burst hundreds of concurrent RPCs at a + * single node and trip its rate limits. A small pool keeps most of the latency win + * of parallelism without the unbounded burst (issue #304). + */ +async function mapWithConcurrency( + items: T[], + limit: number, + fn: (item: T) => Promise, +): Promise { + const results = new Array(items.length) + let next = 0 + async function worker(): Promise { + while (true) { + const i = next++ + if (i >= items.length) return + results[i] = await fn(items[i]!) + } + } + const workerCount = Math.min(limit, items.length) + await Promise.all(Array.from({ length: workerCount }, () => worker())) + return results +} + +/** Max concurrent `comet.block()` fetches per Tier-3 block scan (issue #304). */ +const BLOCK_SCAN_CONCURRENCY = 8 + /** * Creates a Protobuf-based RPC client for querying a blockchain using a QueryClient. * @@ -356,35 +386,60 @@ export class PocketBlockchain { const comet = await this.getCometClient() const normalizedHash = txHash.toUpperCase() - for (let h = startHeight; h < startHeight + maxBlocks; h++) { + + let latestHeight: number + try { + latestHeight = await this.getHeight() + } catch (error) { + this.logger.warn({ txHash, startHeight, error }, 'Block scan: failed to read chain head, scanning full window') + latestHeight = startHeight + maxBlocks - 1 + } + + const endHeight = Math.min(startHeight + maxBlocks - 1, latestHeight) + if (endHeight < startHeight) { + // The tx height is ahead of the current head; nothing to scan yet. + return null + } + + const heights: number[] = [] + for (let h = startHeight; h <= endHeight; h++) heights.push(h) + + // Fetch candidate blocks in parallel, but bounded + const blocks = await mapWithConcurrency(heights, BLOCK_SCAN_CONCURRENCY, async (h) => { try { - const block = await comet.block(h) - const txs = block.block.txs - for (let i = 0; i < txs.length; i++) { - const txBytes = txs[i] - if (!txBytes) continue - const hash = toHex(sha256(txBytes)).toUpperCase() - if (hash === normalizedHash) { - const results = await comet.blockResults(h) - const txData = results.results[i] - if (!txData) { - this.logger.warn({ txHash, height: h, index: i }, 'Block results missing entry for matched TX') - return null - } - return { - hash: txHash, - height: h, - index: i, - gasUsed: txData.gasUsed, - gasWanted: txData.gasWanted, - success: txData.code === 0, - code: txData.code, - } - } - } + return { h, block: await comet.block(h) } } catch (error) { this.logger.warn({ txHash, height: h, error }, 'Block scan error at height') - continue + return { h, block: null } + } + }) + + // Iterate in ascending height order so we deterministically return the first + // (lowest-height) match, preserving the previous sequential behavior. + for (const { h, block } of blocks) { + if (!block) continue + const txs = block.block.txs + for (let i = 0; i < txs.length; i++) { + const txBytes = txs[i] + if (!txBytes) continue + const hash = toHex(sha256(txBytes)).toUpperCase() + if (hash === normalizedHash) { + const results = await comet.blockResults(h) + const txData = results.results[i] + if (!txData) { + this.logger.warn({ txHash, height: h, index: i }, 'Block results missing entry for matched TX') + return null + } + return { + hash: txHash, + height: h, + index: i, + gasUsed: txData.gasUsed, + gasWanted: txData.gasWanted, + success: txData.code === 0, + code: txData.code, + } + } } } return null From 877e3898a4a0dcf8a69c6923d18f32f5b4fe4902 Mon Sep 17 00:00:00 2001 From: "Jorge S. Cuesta" Date: Mon, 15 Jun 2026 07:56:58 -0400 Subject: [PATCH 2/2] feat: durable RPC-fault-tolerant tx verification (middleman + provider) (#308) Split tx broadcast from verification on middleman and provider so a degraded RPC can never report a false failure. A new sweeper confirms via tx-hash scan + supplier-state on a tri-state contract (unavailable != not-found); RPC-down stays pending with backoff instead of mutating status. Terminal transitions are CAS-guarded. Provider gains a canonical INTENT -> dispatcher -> sign/persist/broadcast lifecycle (cosmos unordered txs); middleman stays ordered. Dedup + unique(nodes.address) close the zombie/duplicate-node root cause (#296/#297). Adds shared pure core @igniter/tx-verify; unstake UI no longer blocked when display-only queries fail. Validated e2e on localnet (7/7), including RPC outage staying pending with no false-fail. Follow-up to #304. Closes #296, closes #297. --- .gitignore | 3 + apps/middleman-workflows/jest.config.ts | 28 + apps/middleman-workflows/package.json | 7 +- .../src/activities/index.ts | 200 +- .../src/activities/parseSignerAndSequence.ts | 25 + .../activities/verifyStakeGoalState.test.ts | 112 + .../activities/verifyStakeGoalStateHelper.ts | 72 + apps/middleman-workflows/src/bootstrap.ts | 10 +- .../src/lib/dal/importSupplierAttempts.ts | 16 +- apps/middleman-workflows/src/lib/dal/nodes.ts | 30 +- .../src/lib/dal/transaction.ts | 69 +- .../workflows/ExecutePendingTransactions.ts | 3 +- .../src/workflows/ExecuteTransaction.ts | 302 +- .../workflows/VerifyPendingTransactions.ts | 70 + .../src/workflows/index.ts | 1 + .../src/workflows/utils/transactions.ts | 4 +- apps/middleman/drizzle/0012_amused_korg.sql | 5 + .../drizzle/0013_broken_outlaw_kid.sql | 46 + .../drizzle/0014_backfill_lastcovered.sql | 9 + .../drizzle/0015_fluffy_wonder_man.sql | 4 + .../middleman/drizzle/meta/0012_snapshot.json | 1211 +++++++ .../middleman/drizzle/meta/0013_snapshot.json | 1219 +++++++ .../middleman/drizzle/meta/0014_snapshot.json | 1219 +++++++ .../middleman/drizzle/meta/0015_snapshot.json | 1234 +++++++ apps/middleman/drizzle/meta/_journal.json | 28 + apps/middleman/src/actions/ImportSuppliers.ts | 14 +- apps/middleman/src/actions/Unstake.ts | 6 +- .../unstake/components/ReviewStep/index.tsx | 4 +- apps/provider-workflows/jest.config.ts | 8 + apps/provider-workflows/package.json | 7 +- .../src/activities/index.ts | 443 ++- .../src/activities/supplierEffect.test.ts | 255 ++ apps/provider-workflows/src/bootstrap.ts | 18 +- apps/provider-workflows/src/lib/dal/keys.ts | 33 + .../src/lib/dal/transactions.ts | 145 +- .../workflows/ExecutePendingTransactions.ts | 60 + .../src/workflows/ExecuteTransaction.ts | 37 + .../workflows/VerifyPendingTransactions.ts | 83 + .../provider-workflows/src/workflows/index.ts | 3 + .../provider/drizzle/0018_white_proudstar.sql | 5 + .../drizzle/0019_stormy_black_queen.sql | 9 + .../provider/drizzle/0020_nostalgic_thing.sql | 4 + apps/provider/drizzle/meta/0016_snapshot.json | 2822 ++++++++-------- apps/provider/drizzle/meta/0017_snapshot.json | 2834 +++++++++-------- apps/provider/drizzle/meta/0018_snapshot.json | 1525 +++++++++ apps/provider/drizzle/meta/0019_snapshot.json | 1556 +++++++++ apps/provider/drizzle/meta/0020_snapshot.json | 1580 +++++++++ apps/provider/drizzle/meta/_journal.json | 21 + docs/runbooks/2026-06-canonical-tx-deploy.md | 33 + docs/runbooks/2026-06-pr308-deploy.md | 27 + k8s/tools/localnet/debug-tx.sh | 46 + packages/db/src/middleman/schema/node.ts | 2 +- .../db/src/middleman/schema/transaction.ts | 12 +- .../db/src/provider/schema/transaction.ts | 19 +- .../BuildSupplierServiceConfigHandler.test.ts | 25 + .../src/provider/utils/services.test.ts | 17 + packages/pocket/package.json | 1 + packages/pocket/src/index.ts | 481 ++- .../pocket/src/isSequenceConsumed.test.ts | 105 + packages/pocket/src/signSupplierTx.test.ts | 265 ++ packages/pocket/src/types.ts | 14 + .../pocket/src/verifySupplierEffect.test.ts | 143 + packages/pocket/src/verifyTransaction.test.ts | 183 ++ packages/tx-verify/eslint.config.mjs | 4 + packages/tx-verify/jest.config.ts | 22 + packages/tx-verify/package.json | 36 + packages/tx-verify/src/decide.test.ts | 135 + packages/tx-verify/src/decide.ts | 139 + packages/tx-verify/src/index.ts | 3 + packages/tx-verify/src/supplierEffect.ts | 5 + packages/tx-verify/src/verifyOutcome.ts | 11 + packages/tx-verify/tsconfig.build.cjs.json | 17 + packages/tx-verify/tsconfig.json | 17 + packages/ui/package.json | 1 + .../WalletConnection/KeplrWalletConnection.ts | 25 +- packages/ui/tsconfig.tsbuildinfo | 1 + pnpm-lock.yaml | 166 +- 77 files changed, 16200 insertions(+), 3154 deletions(-) create mode 100644 apps/middleman-workflows/jest.config.ts create mode 100644 apps/middleman-workflows/src/activities/parseSignerAndSequence.ts create mode 100644 apps/middleman-workflows/src/activities/verifyStakeGoalState.test.ts create mode 100644 apps/middleman-workflows/src/activities/verifyStakeGoalStateHelper.ts create mode 100644 apps/middleman-workflows/src/workflows/VerifyPendingTransactions.ts create mode 100644 apps/middleman/drizzle/0012_amused_korg.sql create mode 100644 apps/middleman/drizzle/0013_broken_outlaw_kid.sql create mode 100644 apps/middleman/drizzle/0014_backfill_lastcovered.sql create mode 100644 apps/middleman/drizzle/0015_fluffy_wonder_man.sql create mode 100644 apps/middleman/drizzle/meta/0012_snapshot.json create mode 100644 apps/middleman/drizzle/meta/0013_snapshot.json create mode 100644 apps/middleman/drizzle/meta/0014_snapshot.json create mode 100644 apps/middleman/drizzle/meta/0015_snapshot.json create mode 100644 apps/provider-workflows/jest.config.ts create mode 100644 apps/provider-workflows/src/activities/supplierEffect.test.ts create mode 100644 apps/provider-workflows/src/workflows/ExecutePendingTransactions.ts create mode 100644 apps/provider-workflows/src/workflows/ExecuteTransaction.ts create mode 100644 apps/provider-workflows/src/workflows/VerifyPendingTransactions.ts create mode 100644 apps/provider/drizzle/0018_white_proudstar.sql create mode 100644 apps/provider/drizzle/0019_stormy_black_queen.sql create mode 100644 apps/provider/drizzle/0020_nostalgic_thing.sql create mode 100644 apps/provider/drizzle/meta/0018_snapshot.json create mode 100644 apps/provider/drizzle/meta/0019_snapshot.json create mode 100644 apps/provider/drizzle/meta/0020_snapshot.json create mode 100644 docs/runbooks/2026-06-canonical-tx-deploy.md create mode 100644 docs/runbooks/2026-06-pr308-deploy.md create mode 100644 k8s/tools/localnet/debug-tx.sh create mode 100644 packages/pocket/src/isSequenceConsumed.test.ts create mode 100644 packages/pocket/src/signSupplierTx.test.ts create mode 100644 packages/pocket/src/verifySupplierEffect.test.ts create mode 100644 packages/pocket/src/verifyTransaction.test.ts create mode 100644 packages/tx-verify/eslint.config.mjs create mode 100644 packages/tx-verify/jest.config.ts create mode 100644 packages/tx-verify/package.json create mode 100644 packages/tx-verify/src/decide.test.ts create mode 100644 packages/tx-verify/src/decide.ts create mode 100644 packages/tx-verify/src/index.ts create mode 100644 packages/tx-verify/src/supplierEffect.ts create mode 100644 packages/tx-verify/src/verifyOutcome.ts create mode 100644 packages/tx-verify/tsconfig.build.cjs.json create mode 100644 packages/tx-verify/tsconfig.json create mode 100644 packages/ui/tsconfig.tsbuildinfo diff --git a/.gitignore b/.gitignore index dc269e2c..d1075247 100644 --- a/.gitignore +++ b/.gitignore @@ -80,3 +80,6 @@ igniter-landing.html .claude/worktrees/ SESSION-SUMMARY.md *.png + +# local files/research/issues/logs +.local \ No newline at end of file diff --git a/apps/middleman-workflows/jest.config.ts b/apps/middleman-workflows/jest.config.ts new file mode 100644 index 00000000..047c3517 --- /dev/null +++ b/apps/middleman-workflows/jest.config.ts @@ -0,0 +1,28 @@ +import type { Config } from 'jest' +const config: Config = { + preset: 'ts-jest', + testEnvironment: 'node', + testMatch: ['/src/**/*.test.ts'], + moduleNameMapper: { + '^@/(.*)$': '/src/$1', + '^@igniter/pocket/proto/generated/(.*)$': '/../../packages/pocket/src/proto/generated/$1', + '^@igniter/pocket/proto/(.*)$': '/../../packages/pocket/src/proto/generated/$1', + '^@igniter/pocket/(.*)$': '/../../packages/pocket/src/$1', + '^@igniter/pocket$': '/../../packages/pocket/src/index.ts', + '^@igniter/tx-verify$': '/../../packages/tx-verify/src/index.ts', + '^@igniter/domain/(.*)$': '/../../packages/domain/src/$1', + '^@igniter/db/(.*)$': '/../../packages/db/src/$1', + '^@igniter/logger$': '/../../packages/logger/src/index.ts', + '^@pocket/(.*)$': '/../../packages/pocket/src/$1', + }, + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + tsconfig: '/tsconfig.json', + diagnostics: false, + }, + ], + }, +} +export default config diff --git a/apps/middleman-workflows/package.json b/apps/middleman-workflows/package.json index 945b3bbc..425f2135 100644 --- a/apps/middleman-workflows/package.json +++ b/apps/middleman-workflows/package.json @@ -8,7 +8,8 @@ "dev": "nodemon --signal SIGHUP", "build": "tsc --project ./tsconfig.json && tsc-alias -p ./tsconfig.json", "start": "node ./dist/src/worker.js", - "check-types": "tsc --noEmit" + "check-types": "tsc --noEmit", + "test": "jest" }, "dependencies": { "@igniter/commons": "workspace:*", @@ -26,6 +27,7 @@ "@temporalio/worker": "1.11.7", "@temporalio/workflow": "1.11.7", "@igniter/pocket": "workspace:*", + "@igniter/tx-verify": "workspace:*", "@igniter/logger": "workspace:*", "@igniter/db": "workspace:*", "@igniter/domain": "workspace:*", @@ -42,10 +44,13 @@ "devDependencies": { "@igniter/eslint-config": "workspace:*", "@igniter/typescript-config": "workspace:*", + "@types/jest": "^30.0.0", "@types/pg": "^8.11.11", "@types/url-join": "^4.0.1", + "jest": "^30.1.3", "nodemon": "^3.1.9", "npm-run-all": "4.1.5", + "ts-jest": "^29.4.4", "tsc-alias": "^1.8.15" }, "exports": { diff --git a/apps/middleman-workflows/src/activities/index.ts b/apps/middleman-workflows/src/activities/index.ts index 78b467fd..5c7af7c6 100644 --- a/apps/middleman-workflows/src/activities/index.ts +++ b/apps/middleman-workflows/src/activities/index.ts @@ -15,6 +15,7 @@ import { import { NodeStatus, TransactionStatus, + TransactionType, SupplierChangeType, } from '@igniter/db/middleman/enums' import { createHash } from 'node:crypto' @@ -22,9 +23,14 @@ import { detectSupplierChanges, DetectedSupplierChange } from '@igniter/domain/m import { extractTransactionStakingSuppliers, extractTransactionUnstakingSuppliers } from '@/workflows/utils' import { ProviderService } from '@/lib/provider' import DAL from '@/lib/dal/DAL' -import type { PocketBlockchain, SupplierServiceConfig, SupplierEndpoint, ServiceRevenueShare } from '@igniter/pocket' +import type { PocketBlockchain, SupplierServiceConfig, SupplierEndpoint, ServiceRevenueShare, VerifyOutcome, SupplierEffect } from '@igniter/pocket' +import type { VerificationDecision, SupplierPathOutcome } from '@igniter/tx-verify' +import { TX_EXPIRATION_BLOCKS } from '@igniter/tx-verify' +import { STAKE_TYPE_URL, UNSTAKE_TYPE_URL } from '@/lib/constants' import { ServiceConfigUpdate } from '@igniter/pocket/proto/pocket/shared/supplier' import { NodesMinMax } from '@/lib/dal/nodes' +import { verifyStakeGoalState } from './verifyStakeGoalStateHelper' +import { parseSignerAndSequence } from './parseSignerAndSequence' export type Height = number @@ -147,7 +153,20 @@ export const governanceActivities = (dal: DAL) => ({ }, }) -export const delegatorActivities = (dal: DAL, pocketRpcClient: PocketBlockchain, providerService: ProviderService) => ({ +/** Number of consecutive unavailable checks between critical alerts for a chronically-unverifiable tx. */ +const VERIFY_UNAVAILABLE_ALERT_THRESHOLD = Number(process.env.VERIFY_UNAVAILABLE_ALERT_THRESHOLD ?? 50) + +/** Per-sweep hash-scan window, matching the on-chain mempool expiration window. */ +// TX_EXPIRATION_BLOCKS imported from @igniter/tx-verify above + +/** + * Parses a transaction's unsigned payload into the expected on-chain supplier effect. + * Returns null when the tx has no supplier-state path (send / OperationalFunds), so the + * verifier knows to skip the supplier verification path for it. + */ + +export const delegatorActivities = (dal: DAL, pocketRpcClient: PocketBlockchain, providerService: ProviderService) => { + const activities = { /** * Returns the latest block height from the blockchain. * @returns GetLatestBlockResult @@ -393,6 +412,18 @@ export const delegatorActivities = (dal: DAL, pocketRpcClient: PocketBlockchain, async updateProviders(providers: Provider[]) { await dal.provider.updateProviders(providers) }, + /** + * Reads the timeoutHeight embedded in the signed payload for a transaction. + * Reuses parseSignerAndSequence's TxBody decode path. Returns null when the + * payload is absent, unparseable, or has no embedded timeout (external-wallet txs). + */ + async getTxTimeoutHeight(transactionId: number): Promise { + const txn = await dal.transaction.getTransaction(transactionId) + if (!txn?.signedPayload) return null + const { timeoutHeight } = parseSignerAndSequence(txn.signedPayload) + return timeoutHeight + }, + /** * Updates a transaction with the given payload. * @@ -1107,7 +1138,7 @@ export const delegatorActivities = (dal: DAL, pocketRpcClient: PocketBlockchain, return { statusResult } }, - async notifyProviderOfFailedStakes(transactionId: number) { + async notifyProviderOfFailedStakes(transactionId: number, onlyAddresses?: string[]) { try { const transaction = await dal.transaction.getTransaction(transactionId) @@ -1129,7 +1160,9 @@ export const delegatorActivities = (dal: DAL, pocketRpcClient: PocketBlockchain, const suppliers = extractTransactionStakingSuppliers(transaction) - const addresses = suppliers.map(({ address }) => address) + const addresses = suppliers + .map(({ address }) => address) + .filter((addr) => !onlyAddresses || onlyAddresses.includes(addr)) if (addresses.length === 0) { return { @@ -1154,4 +1187,161 @@ export const delegatorActivities = (dal: DAL, pocketRpcClient: PocketBlockchain, } } }, -}) + + /** + * The verifier's queue: pending transactions that have been broadcast (have a hash). + */ + async listPendingWithHash() { + const txs = await dal.transaction.listPendingWithHash() + // @ts-ignore (todo: align serialized shape with the workflow) + return txs.map(({ id, executionHeight }) => ({ id, executionHeight })) + }, + + /** + * Verifies a broadcast tx by hash, scanning from one block past its last covered + * height (or its execution height on the first sweep). Maps the pocket tri-state + * result down to the minimal shape the pure decision logic consumes. + */ + async verifyTxHash(transactionId: number): Promise> { + const txn = await dal.transaction.getTransaction(transactionId) + if (!txn?.hash) { + throw new Error('verifyTxHash: tx missing hash') + } + const startHeight = txn.lastCoveredHeight != null ? txn.lastCoveredHeight + 1 : (txn.executionHeight ?? 0) + const out = await pocketRpcClient.verifyTransaction(txn.hash, startHeight, TX_EXPIRATION_BLOCKS) + if (out.status !== 'confirmed') return out + // gasUsed is serialized as a string: a bigint cannot cross the Temporal + // activity boundary (the default payload converter cannot encode BigInt). + return { + status: 'confirmed', + data: { success: out.data.success, code: out.data.code, gasUsed: out.data.gasUsed.toString() }, + } + }, + + /** + * Verifies a broadcast tx by its expected on-chain supplier goal-state. Returns null for + * tx types with no supplier-state path (send / OperationalFunds) so the decision logic + * treats the supplier path as inapplicable. Uses goal-state semantics: the tx is + * confirmed if every operator's on-chain state matches intent, regardless of which tx + * produced it. + */ + async verifySupplierEffect(transactionId: number): Promise { + const txn = await dal.transaction.getTransaction(transactionId) + if (!txn) throw new Error('verifySupplierEffect: tx not found') + + if (txn.type === TransactionType.Stake || txn.type === TransactionType.Upstake) { + return verifyStakeGoalState(txn, (addr) => pocketRpcClient.getSupplier(addr)) + } + + if (txn.type === TransactionType.Unstake) { + const [unstake] = extractTransactionUnstakingSuppliers(txn) + if (!unstake) return null + const effect = { kind: 'unstake' as const, minSessionEndHeight: txn.executionHeight ?? 0 } + const out = await pocketRpcClient.verifySupplierEffect(unstake.operatorAddress, effect) + if (out.status === 'confirmed') return { status: 'confirmed' } + if (out.status === 'absent') return { status: 'absent', absentOperators: [unstake.operatorAddress] } + return { status: 'unavailable' } + } + + return null + }, + + /** + * Extracts tx validity evidence (timeoutHeight, sequence) from the signed payload. + * Used to drive the hash-absent path in decideVerification toward expired/sequence-consumed + * verdicts without waiting for the full expiration window. + */ + async checkTxValidityEvidence(transactionId: number): Promise<{ + txTimeoutHeight: number | null + sequence: { consumed: boolean; observedAtHeight: number } | null + }> { + const txn = await dal.transaction.getTransaction(transactionId) + if (!txn) return { txTimeoutHeight: null, sequence: null } + + if (!txn.signedPayload) return { txTimeoutHeight: null, sequence: null } + + const parsed = parseSignerAndSequence(txn.signedPayload) + + if (parsed.timeoutHeight) return { txTimeoutHeight: parsed.timeoutHeight, sequence: null } + + if (parsed.sequence == null) return { txTimeoutHeight: null, sequence: null } + + let signer: string | null = null + try { + const { body } = JSON.parse(txn.unsignedPayload) + signer = body.messages[0]?.value?.signer ?? null + } catch { /* ignore */ } + + if (!signer) return { txTimeoutHeight: null, sequence: null } + + try { + const sequenceEvidence = await pocketRpcClient.isSequenceConsumed(signer, parsed.sequence) + return { txTimeoutHeight: null, sequence: sequenceEvidence } + } catch { + return { txTimeoutHeight: null, sequence: null } + } + }, + + /** + * Applies a verification decision computed by the pure `decideVerification` (v2 shape). + * Pending → record progress (coverage/unavailable) + maybe alert on chronic unavailability. + * Terminal → run downstream effects BEFORE the CAS so idempotent re-runs on retry are safe; + * only the caller that wins the CAS runs effects (zero-rows → already terminal, skip). + */ + async applyVerificationDecision(transactionId: number, decision: VerificationDecision): Promise { + if (decision.tx === 'pending') { + await dal.transaction.recordVerificationProgress(transactionId, { + lastCoveredHeight: decision.newLastCoveredHeight, + incUnavailable: decision.incUnavailable, + }) + if (decision.incUnavailable) await maybeAlertUnavailable(transactionId) + return + } + + const txn = await dal.transaction.getTransaction(transactionId) + if (!txn) return + + // Effects keyed off GOAL-STATE, not tx outcome: a tx that failed on-chain while a + // sibling achieved the goal must NOT release staked suppliers. Effects run before + // the CAS (idempotent; a partial run is re-swept). + if (decision.effects === 'apply-success' && txn.type === TransactionType.Stake) { + await activities.createNewNodesFromTransaction(txn.id) + await activities.notifyProviderOfStakedAddresses(txn.id) + } else if (decision.effects === 'apply-failure' && txn.type === TransactionType.Stake) { + await activities.notifyProviderOfFailedStakes(txn.id, decision.failedOperators) + // Upstake has no creation site today; apply-failure for it is intentionally effects-free. + } else if (decision.effects === 'apply-success' && txn.type === TransactionType.Unstake) { + await activities.updateUnstakingNodesFromTransaction(txn.id) + await activities.notifyProviderOfUntakingAddresses(txn.id) + } + + const status = decision.tx === 'success' ? TransactionStatus.Success : TransactionStatus.Failure + const verificationHeight = await pocketRpcClient.getHeight().catch(() => undefined) + const fields: { code?: number; consumedFee?: number; verificationHeight?: number; log?: string } = { + verificationHeight, + log: decision.tx === 'success' ? 'verified' + : decision.effects === 'apply-success' ? 'tx failed on-chain; goal met by sibling tx' + : 'verification negative (validity bound covered, no effect)', + } + if (decision.code !== undefined) fields.code = decision.code + if (decision.gasUsed !== undefined) fields.consumedFee = Number(decision.gasUsed) + await dal.transaction.claimTerminalTransition(transactionId, status, fields) + }, + } + + /** + * Reads the tx and emits a critical log when its unavailable-check counter crosses a + * multiple of the alert threshold. No status change — this is operator-attention only. + */ + async function maybeAlertUnavailable(transactionId: number): Promise { + const txn = await dal.transaction.getTransaction(transactionId) + if (txn && txn.unavailableChecks > 0 && txn.unavailableChecks % VERIFY_UNAVAILABLE_ALERT_THRESHOLD === 0) { + log.error( + 'TX unverifiable: RPC repeatedly unavailable — operator attention needed', + { transactionId, unavailableChecks: txn.unavailableChecks }, + ) + } + } + + return activities +} diff --git a/apps/middleman-workflows/src/activities/parseSignerAndSequence.ts b/apps/middleman-workflows/src/activities/parseSignerAndSequence.ts new file mode 100644 index 00000000..51b52b16 --- /dev/null +++ b/apps/middleman-workflows/src/activities/parseSignerAndSequence.ts @@ -0,0 +1,25 @@ +import { TxRaw, AuthInfo, TxBody } from '@igniter/pocket/proto/cosmos/tx/v1beta1/tx' + +/** + * Parses signer sequence and timeoutHeight from a base64-encoded signed TxRaw payload. + * Returns null values on parse failure (activity caller treats as no evidence → pending). + */ +export function parseSignerAndSequence(signedPayload: string): { + sequence: number | null + timeoutHeight: number | null +} { + try { + const txBytes = Buffer.from(signedPayload, 'base64') + const txRaw = TxRaw.decode(txBytes) + const authInfo = AuthInfo.decode(txRaw.authInfoBytes) + const sequence = authInfo.signerInfos[0]?.sequence ?? null + const body = TxBody.decode(txRaw.bodyBytes) + const timeoutHeight = body.timeoutHeight || null + return { + sequence: sequence !== null ? Number(sequence) : null, + timeoutHeight: timeoutHeight ? Number(timeoutHeight) : null, + } + } catch { + return { sequence: null, timeoutHeight: null } + } +} diff --git a/apps/middleman-workflows/src/activities/verifyStakeGoalState.test.ts b/apps/middleman-workflows/src/activities/verifyStakeGoalState.test.ts new file mode 100644 index 00000000..c542704e --- /dev/null +++ b/apps/middleman-workflows/src/activities/verifyStakeGoalState.test.ts @@ -0,0 +1,112 @@ +import { verifyStakeGoalState } from './verifyStakeGoalStateHelper' +import { RPCType } from '@igniter/pocket' + +// minimal supplier fixture +const baseSupplier = { + ownerAddress: 'pokt1owner', + stake: { amount: '1000000', denom: 'upokt' }, + services: [ + { + serviceId: 'svc1', + endpoints: [{ url: 'https://node.example.com', rpcType: RPCType.JSON_RPC, configs: [] }], + revShare: [{ address: 'pokt1owner', revSharePercentage: 5 }], + }, + ], + serviceConfigHistory: [], +} + +// minimal tx fixture +const makeTx = (overrides = {}) => ({ + unsignedPayload: JSON.stringify({ + body: { + messages: [{ + typeUrl: '/pocket.supplier.MsgStakeSupplier', + value: { + signer: 'pokt1owner', + ownerAddress: 'pokt1owner', + operatorAddress: 'pokt1operator', + stake: { denom: 'upokt', amount: 1000000 }, + services: [{ + serviceId: 'svc1', + endpoints: [{ url: 'https://node.example.com', rpcType: 'JSON_RPC', configs: [] }], + revShare: [{ address: 'pokt1owner', revSharePercentage: '5' }], + }], + }, + }], + }, + }), + ...overrides, +}) + +describe('verifyStakeGoalState', () => { + it('all operators on-chain with matching config → confirmed', async () => { + const getSupplier = jest.fn().mockResolvedValue(baseSupplier) + const result = await verifyStakeGoalState(makeTx() as any, getSupplier) + expect(result).toEqual({ status: 'confirmed' }) + }) + + it('operator absent (getSupplier returns null) → absent with operatorAddress', async () => { + const getSupplier = jest.fn().mockResolvedValue(null) + const result = await verifyStakeGoalState(makeTx() as any, getSupplier) + expect(result).toEqual({ status: 'absent', absentOperators: ['pokt1operator'] }) + }) + + it('operator owner mismatch → absent', async () => { + const getSupplier = jest.fn().mockResolvedValue({ ...baseSupplier, ownerAddress: 'pokt1other' }) + const result = await verifyStakeGoalState(makeTx() as any, getSupplier) + expect(result.status).toBe('absent') + }) + + it('stake amount below intended → absent', async () => { + const getSupplier = jest.fn().mockResolvedValue({ ...baseSupplier, stake: { amount: '500000', denom: 'upokt' } }) + const result = await verifyStakeGoalState(makeTx() as any, getSupplier) + expect(result.status).toBe('absent') + }) + + it('services differ → absent lists that operator', async () => { + const getSupplier = jest.fn().mockResolvedValue({ + ...baseSupplier, + services: [{ serviceId: 'svc2', endpoints: [], revShare: [] }], + }) + const result = await verifyStakeGoalState(makeTx() as any, getSupplier) + expect(result).toMatchObject({ status: 'absent', absentOperators: ['pokt1operator'] }) + }) + + it('services empty but serviceConfigHistory matches → confirmed (pending activation)', async () => { + const getSupplier = jest.fn().mockResolvedValue({ + ...baseSupplier, + services: [], + serviceConfigHistory: [{ + service: { + serviceId: 'svc1', + endpoints: [{ url: 'https://node.example.com', rpcType: RPCType.JSON_RPC, configs: [] }], + revShare: [{ address: 'pokt1owner', revSharePercentage: 5 }], + }, + }], + }) + const result = await verifyStakeGoalState(makeTx() as any, getSupplier) + expect(result).toEqual({ status: 'confirmed' }) + }) + + it('getSupplier throws → unavailable', async () => { + const getSupplier = jest.fn().mockRejectedValue(new Error('RPC down')) + const result = await verifyStakeGoalState(makeTx() as any, getSupplier) + expect(result).toEqual({ status: 'unavailable' }) + }) + + it('rpcType string "JSON_RPC" in tx normalizes to numeric enum correctly', async () => { + // The tx message has rpcType: 'JSON_RPC' (string); on-chain has rpcType: 3 (RPCType.JSON_RPC) + // They must compare as equal — this is the rpcType normalization regression guard + const getSupplier = jest.fn().mockResolvedValue(baseSupplier) // rpcType: RPCType.JSON_RPC (3) + const result = await verifyStakeGoalState(makeTx() as any, getSupplier) + expect(result).toEqual({ status: 'confirmed' }) + }) + + it('revShare as string "5" normalizes to number 5', async () => { + // tx has revSharePercentage: '5' (string); on-chain has revSharePercentage: 5 (number) + // They must compare as equal + const getSupplier = jest.fn().mockResolvedValue(baseSupplier) + const result = await verifyStakeGoalState(makeTx() as any, getSupplier) + expect(result).toEqual({ status: 'confirmed' }) + }) +}) diff --git a/apps/middleman-workflows/src/activities/verifyStakeGoalStateHelper.ts b/apps/middleman-workflows/src/activities/verifyStakeGoalStateHelper.ts new file mode 100644 index 00000000..cac4ae9f --- /dev/null +++ b/apps/middleman-workflows/src/activities/verifyStakeGoalStateHelper.ts @@ -0,0 +1,72 @@ +import { CompareSupplierServiceConfigHandler } from '@igniter/domain/provider/operations' +import { rPCTypeFromJSON } from '@igniter/pocket' +import type { SupplierServiceConfig } from '@igniter/pocket' +import type { SupplierPathOutcome } from '@igniter/tx-verify' +import { extractTransactionStakingSuppliers } from '@/workflows/utils' +import type { Transaction } from '@igniter/db/middleman/schema' + +type StakeMsgService = { + serviceId: string + endpoints: Array<{ url: string; rpcType: string | number; configs?: Array<{ key: string | number; value: string }> }> + revShare: Array<{ address: string; revSharePercentage: string | number }> +} + +/** Normalizes a tx-message service config (JSON shapes: rpcType string, revShare string) to the proto shape the comparator expects. */ +function normalizeMsgServiceConfig(svc: StakeMsgService): SupplierServiceConfig { + return { + serviceId: svc.serviceId, + endpoints: svc.endpoints.map((e) => ({ + url: e.url, + rpcType: rPCTypeFromJSON(e.rpcType), + configs: (e.configs ?? []).map((c) => ({ key: Number(c.key), value: c.value })), + })), + revShare: svc.revShare.map((r) => ({ address: r.address, revSharePercentage: Number(r.revSharePercentage) })), + } +} + +type SupplierOnChain = { + ownerAddress: string + stake?: { amount: string } | null + services: SupplierServiceConfig[] + serviceConfigHistory?: Array<{ service?: SupplierServiceConfig | null }> +} | null + +/** + * Goal-state verification for a (possibly multi-supplier) stake tx: EVERY operator + * must exist on-chain, owner-match, have stake >= the message amount, and its + * on-chain services (or pending serviceConfigHistory entry) must canonically equal + * the message's service configs. On-chain state literally equal to intended state + * = goal met regardless of WHICH tx achieved it (goal-state semantics). + */ +export async function verifyStakeGoalState( + txn: Pick, + getSupplier: (address: string) => Promise, +): Promise { + const intents = extractTransactionStakingSuppliers(txn as Transaction) + if (intents.length === 0) return { status: 'absent' } + const compare = new CompareSupplierServiceConfigHandler() + const absentOperators: string[] = [] + for (const intent of intents) { + let supplier: SupplierOnChain + try { + supplier = await getSupplier(intent.address) + } catch { + return { status: 'unavailable' } + } + if (!supplier || supplier.ownerAddress !== intent.ownerAddress + || BigInt(supplier.stake?.amount ?? '0') < BigInt(intent.stakeAmount)) { + absentOperators.push(intent.address) + continue + } + const intended = (intent.services as StakeMsgService[]).map(normalizeMsgServiceConfig) + const active = compare.execute({ serviceConfigSetA: intended, serviceConfigSetB: supplier.services }).isEqual + const pendingActivation = (supplier.serviceConfigHistory ?? []).some((h) => { + const historyServices = h.service ? [h.service] : [] + return historyServices.length > 0 && compare.execute({ serviceConfigSetA: intended, serviceConfigSetB: historyServices }).isEqual + }) + if (!active && !pendingActivation) absentOperators.push(intent.address) + } + return absentOperators.length === 0 + ? { status: 'confirmed' } + : { status: 'absent', absentOperators } +} diff --git a/apps/middleman-workflows/src/bootstrap.ts b/apps/middleman-workflows/src/bootstrap.ts index 07d1a2dc..63a11bb7 100644 --- a/apps/middleman-workflows/src/bootstrap.ts +++ b/apps/middleman-workflows/src/bootstrap.ts @@ -1,6 +1,6 @@ import { Duration } from "@temporalio/common"; import Long from "long"; -import { Client } from '@temporalio/client' +import { Client, ScheduleOverlapPolicy } from '@temporalio/client' import { getClient, getConfig, @@ -14,6 +14,7 @@ enum ScheduledWorkflowType { ExecutePendingTransaction = "ExecutePendingTransactions", SupplierStatus = 'SupplierStatus', ImportSupplierRecovery = 'ImportSupplierRecovery', + VerifyPendingTransactions = 'VerifyPendingTransactions', } const ScheduledWorkflowConfig: Record< @@ -45,6 +46,11 @@ const ScheduledWorkflowConfig: Record< args: [], envVar: 'SCHEDULE_IMPORT_SUPPLIER_RECOVERY_INTERVAL', }, + [ScheduledWorkflowType.VerifyPendingTransactions]: { + interval: '30s', + args: [], + envVar: 'SCHEDULE_VERIFY_PENDING_TX_INTERVAL', + }, }; function parseDurationToMs(duration: string): number { @@ -122,6 +128,7 @@ async function bootstrapScheduledWorkflows(client: Client, config: TemporalConfi spec: { intervals: [{ every: interval as Duration }], }, + policies: { overlap: ScheduleOverlapPolicy.SKIP }, })); logger.info({ workflowType }, 'Scheduled workflow updated successfully'); } else { @@ -142,6 +149,7 @@ async function bootstrapScheduledWorkflows(client: Client, config: TemporalConfi spec: { intervals: [{ every: interval as Duration }], }, + policies: { overlap: ScheduleOverlapPolicy.SKIP }, }); logger.info({ workflowType, interval }, 'Scheduled workflow created successfully'); } catch (createError: any) { diff --git a/apps/middleman-workflows/src/lib/dal/importSupplierAttempts.ts b/apps/middleman-workflows/src/lib/dal/importSupplierAttempts.ts index 57003f0a..fec89bd5 100644 --- a/apps/middleman-workflows/src/lib/dal/importSupplierAttempts.ts +++ b/apps/middleman-workflows/src/lib/dal/importSupplierAttempts.ts @@ -12,6 +12,7 @@ import type { Logger } from '@igniter/logger' import type { DBClient } from '@igniter/db/connection' import * as schema from '@igniter/db/middleman/schema' import { eq } from 'drizzle-orm/sql/expressions/conditions' +import { sql } from 'drizzle-orm' export default class ImportSupplierAttempts { logger: Logger @@ -107,10 +108,21 @@ export default class ImportSupplierAttempts { createdBy: attempt.userIdentity, })) - // Use upsert to handle potential duplicates + // Use upsert to handle potential duplicates. The nodes.address unique + // constraint means a bare onConflictDoNothing() would silently drop + // same-address re-imports, so update the mutable fields instead. await this.dbClient.db .insert(nodesTable) .values(nodesToInsert) - .onConflictDoNothing() + .onConflictDoUpdate({ + target: nodesTable.address, + set: { + // Only the field the import actually KNOWS. status/stakeAmount are + // chain-sync-owned placeholders in this payload — clobbering them resets + // a synced row to Staked/'0' (permanent for suppliers gone from chain). + ownerAddress: sql`excluded."ownerAddress"`, + updatedAt: new Date(), + }, + }) } } diff --git a/apps/middleman-workflows/src/lib/dal/nodes.ts b/apps/middleman-workflows/src/lib/dal/nodes.ts index 4670e59f..158006bc 100644 --- a/apps/middleman-workflows/src/lib/dal/nodes.ts +++ b/apps/middleman-workflows/src/lib/dal/nodes.ts @@ -159,9 +159,33 @@ export default class Node { */ async insert(nodes: InsertNode[], transactionId?: number) { return this.dbClient.db.transaction(async (tx) => { + // Idempotency guard: if this tx already linked nodes, do nothing and return them. + if (transactionId) { + const existing = await tx + .select({ nodeId: transactionsToNodesTable.nodeId }) + .from(transactionsToNodesTable) + .where(eq(transactionsToNodesTable.transactionId, transactionId)); + + if (existing.length > 0) { + return tx + .select({ id: nodesTable.id, address: nodesTable.address }) + .from(nodesTable) + .where(inArray(nodesTable.id, existing.map(e => e.nodeId))); + } + } + const insertedNodes = await tx .insert(nodesTable) .values(nodes) + .onConflictDoUpdate({ + target: nodesTable.address, + set: { + status: sql`excluded.status`, + stakeAmount: sql`excluded."stakeAmount"`, + ownerAddress: sql`excluded."ownerAddress"`, + updatedAt: new Date(), + }, + }) .returning({ id: nodesTable.id, address: nodesTable.address }); if (transactionId && insertedNodes.length > 0) { @@ -172,7 +196,8 @@ export default class Node { await tx .insert(transactionsToNodesTable) - .values(relations); + .values(relations) + .onConflictDoNothing(); } return insertedNodes; @@ -216,7 +241,8 @@ export default class Node { await tx .insert(transactionsToNodesTable) - .values(relations); + .values(relations) + .onConflictDoNothing(); } return addresses; diff --git a/apps/middleman-workflows/src/lib/dal/transaction.ts b/apps/middleman-workflows/src/lib/dal/transaction.ts index 84daa4c9..12415319 100644 --- a/apps/middleman-workflows/src/lib/dal/transaction.ts +++ b/apps/middleman-workflows/src/lib/dal/transaction.ts @@ -1,4 +1,4 @@ -import { eq } from "drizzle-orm"; +import { and, eq, isNotNull, sql } from "drizzle-orm"; import type { Logger } from '@igniter/logger' import type { DBClient } from '@igniter/db/connection' import * as schema from '@igniter/db/middleman/schema' @@ -33,6 +33,73 @@ export default class Transaction { }); } + /** + * The verifier's queue: every transaction that has been broadcast (has a hash + + * execution height) and is still pending verification, EXCLUDING those checked + * too recently. The backoff grows with `unavailableChecks` (base 30s × the + * capped count) so a chronically-unverifiable tx is re-checked ever less often + * instead of being hammered every sweep — bounding RPC load during an outage. + * `executionHeight` is required so the verifier never scans from a null/zero + * height (which would mis-compute the expiration window). + */ + async listPendingWithHash(): Promise { + return this.dbClient.db + .select() + .from(transactionsTable) + .where(and( + eq(transactionsTable.status, TransactionStatus.Pending), + isNotNull(transactionsTable.hash), + isNotNull(transactionsTable.executionHeight), + sql`(${transactionsTable.lastVerificationAt} IS NULL OR ${transactionsTable.lastVerificationAt} < now() - (LEAST(${transactionsTable.unavailableChecks}, 20) * interval '30 seconds'))`, + )); + } + + /** + * Atomically move a still-pending, broadcast tx to a terminal status. + * Returns the updated row iff THIS call performed the transition (affected 1 row), + * undefined otherwise. The WHERE clause is the concurrency guard: a second caller + * (overlapping sweep / both paths) sees 0 rows and must NOT run effects. + * IMPORTANT: callers MUST run downstream effects (node creation, provider notify) + * BEFORE this CAS — effects are idempotent, but a status flip before effects risks + * skipping them on retry when the CAS is no longer winnable. + */ + async claimTerminalTransition( + transactionId: number, + status: TransactionStatus.Success | TransactionStatus.Failure, + fields: { code?: number; consumedFee?: number; verificationHeight?: number; log?: string }, + ): Promise { + const [row] = await this.dbClient.db + .update(transactionsTable) + .set({ status, ...fields }) + .where(and( + eq(transactionsTable.id, transactionId), + eq(transactionsTable.status, TransactionStatus.Pending), + isNotNull(transactionsTable.hash), + )) + .returning(); + return row; + } + + /** + * Pending-path counter/coverage update (no status change). Drizzle skips + * `undefined` set fields, so passing `undefined` leaves a column untouched. + */ + async recordVerificationProgress( + transactionId: number, + p: { lastCoveredHeight?: number; incUnavailable?: boolean }, + ): Promise { + await this.dbClient.db + .update(transactionsTable) + .set({ + lastCoveredHeight: p.lastCoveredHeight, + unavailableChecks: p.incUnavailable + ? sql`${transactionsTable.unavailableChecks} + 1` + : sql`GREATEST(${transactionsTable.unavailableChecks} - 1, 0)`, + lastVerificationAt: new Date(), + }) + .where(eq(transactionsTable.id, transactionId)); + } + async updateTransaction( transactionId: number, payload: Partial diff --git a/apps/middleman-workflows/src/workflows/ExecutePendingTransactions.ts b/apps/middleman-workflows/src/workflows/ExecutePendingTransactions.ts index 81bcbfce..86309798 100644 --- a/apps/middleman-workflows/src/workflows/ExecutePendingTransactions.ts +++ b/apps/middleman-workflows/src/workflows/ExecutePendingTransactions.ts @@ -1,4 +1,4 @@ -import {proxyActivities, WorkflowIdReusePolicy} from "@temporalio/workflow"; +import {proxyActivities, WorkflowIdReusePolicy, ParentClosePolicy} from "@temporalio/workflow"; import { delegatorActivities } from '@/activities'; import {executeChild, log, WorkflowError} from "@temporalio/workflow"; @@ -30,6 +30,7 @@ export async function ExecutePendingTransactions(args: ExecutePendingTransaction workflowId, args: [{ transactionId: id }], workflowIdReusePolicy: WorkflowIdReusePolicy.ALLOW_DUPLICATE_FAILED_ONLY, + parentClosePolicy: ParentClosePolicy.ABANDON, retry: { maximumAttempts: 5, }, diff --git a/apps/middleman-workflows/src/workflows/ExecuteTransaction.ts b/apps/middleman-workflows/src/workflows/ExecuteTransaction.ts index f18a52d2..21fdd961 100644 --- a/apps/middleman-workflows/src/workflows/ExecuteTransaction.ts +++ b/apps/middleman-workflows/src/workflows/ExecuteTransaction.ts @@ -1,74 +1,22 @@ import { - ActivityFailure, - ApplicationFailure, proxyActivities, - TimeoutFailure, WorkflowError, } from '@temporalio/workflow' import { delegatorActivities } from "@/activities"; import { TransactionStatus, TransactionType } from '@igniter/db/middleman/enums' -import {SendTransactionResult} from "@/lib/blockchain"; - -const TX_EXPIRATION_BLOCKS = 30 -const TX_NOT_FOUND_ERROR_TYPE = 'TX_NOT_FOUND' +import { TX_EXPIRATION_BLOCKS } from '@igniter/tx-verify' interface TransactionArgs { transactionId: number; } /** - * Returns true when `err` is the retries-exhausted wrapper around the retriable - * `TX_NOT_FOUND` ApplicationFailure thrown by the `verifyTransaction` activity. - * Any other failure (RPC unreachable, deserialization, bugs) returns false and - * should be rethrown so the workflow fails loudly rather than silently marking - * the tx as failure on insufficient evidence. + * Broadcaster. Signs + broadcasts a pending transaction, persists its hash and + * execution height, then leaves it `pending` (now with a hash) for the + * VerifyPendingTransactions sweeper to verify. No verification happens here — + * that responsibility moved to the verifier so a slow/down RPC can never turn a + * broadcast into a false failure on this path. */ -function isTxNotFoundFailure(err: unknown): boolean { - if (err instanceof ActivityFailure && err.cause instanceof ApplicationFailure) { - return err.cause.type === TX_NOT_FOUND_ERROR_TYPE - } - return false -} - -function isStartToCloseTimeout(err: unknown): boolean { - if (err instanceof ActivityFailure && err.cause instanceof TimeoutFailure) { - return err.cause.timeoutType === 'START_TO_CLOSE' - } - return false -} - -/** - * Extracts the owner + operator addresses from a Stake transaction's unsigned payload. - * Used for the Tier 4 fallback (supplier state check) when TX lookup fails — both are - * needed so the fallback can confirm the on-chain supplier is actually owned by us - * rather than someone who staked the same operator address during the verify window. - */ -function extractStakeAddresses( - transaction: { unsignedPayload?: string | null }, -): { operatorAddress?: string; ownerAddress?: string } { - try { - if (!transaction.unsignedPayload) return {} - const payload = JSON.parse(transaction.unsignedPayload) - const messages = payload?.body?.messages - if (!Array.isArray(messages)) return {} - for (const msg of messages) { - if ( - msg.typeUrl === '/pocket.supplier.MsgStakeSupplier' && - typeof msg.value?.operatorAddress === 'string' - ) { - return { - operatorAddress: msg.value.operatorAddress, - ownerAddress: - typeof msg.value?.ownerAddress === 'string' ? msg.value.ownerAddress : undefined, - } - } - } - return {} - } catch { - return {} - } -} - export async function ExecuteTransaction(args: TransactionArgs) { const { transactionId } = args; @@ -77,12 +25,8 @@ export async function ExecuteTransaction(args: TransactionArgs) { updateTransaction, executeTransaction, getBlockHeight, - checkSupplierOnChain, - createNewNodesFromTransaction, - notifyProviderOfStakedAddresses, + getTxTimeoutHeight, notifyProviderOfFailedStakes, - updateUnstakingNodesFromTransaction, - notifyProviderOfUntakingAddresses, } = proxyActivities>({ startToCloseTimeout: "30s", retry: { @@ -90,223 +34,57 @@ export async function ExecuteTransaction(args: TransactionArgs) { }, }); - // verifyTransaction polls the chain on its own retry schedule: one attempt per block - // (pocket block time ≈ 1 min) up to TX_EXPIRATION_BLOCKS, matching the on-chain - // mempool expiration window. Throws retriable `TX_NOT_FOUND` until the tx lands. - const { verifyTransaction } = proxyActivities>({ - startToCloseTimeout: "30s", - retry: { - initialInterval: "60s", - backoffCoefficient: 1, - maximumAttempts: TX_EXPIRATION_BLOCKS, - }, - }); - const transaction = await getTransaction(transactionId); if (transaction.status !== TransactionStatus.Pending) { throw new Error("Transaction is not pending"); } - const txHeight = await getBlockHeight(); - - let result: SendTransactionResult | null = null; - let skipWait = false; - - // If TX has NO hash and is expired, mark as failed immediately - if (!transaction.hash) { - if (transaction.executionHeight && txHeight - transaction.executionHeight > TX_EXPIRATION_BLOCKS) { - await updateTransaction(transactionId, { - status: TransactionStatus.Failure, - log: 'TX expired before broadcast', - }); - if (transaction.type === TransactionType.Stake) { - await notifyProviderOfFailedStakes(transaction.id); - } - return { ...transaction, status: TransactionStatus.Failure, newNodes: [], unstakingNodes: [] }; - } - - result = await executeTransaction( - transaction.id, - ); - - if(!result) { - throw new WorkflowError("Transaction execution failed"); - } - - if (!result.transactionHash) { - await updateTransaction(transactionId, { - status: TransactionStatus.Failure, - code: result.code, - log: result.message || 'unknown error', - }); + // Already broadcast (has a hash) → the verifier owns it; nothing to do here. + if (transaction.hash) { + return { ...transaction }; + } - return { - ...transaction, - status: TransactionStatus.Failure, - code: result.code, - log: result.message || 'unknown error', - } - } + const txHeight = await getBlockHeight(); + // No hash and the broadcast window already expired → mark failed immediately. + if (transaction.executionHeight && txHeight - transaction.executionHeight > TX_EXPIRATION_BLOCKS) { await updateTransaction(transactionId, { - executionHeight: txHeight, - hash: result.transactionHash, + status: TransactionStatus.Failure, + log: 'TX expired before broadcast', }); - } else if (transaction.executionHeight && txHeight - transaction.executionHeight > TX_EXPIRATION_BLOCKS) { - // TX has a hash but is expired — skip wait, go straight to verification (will use Tier 4 supplier check) - skipWait = true; + if (transaction.type === TransactionType.Stake) { + await notifyProviderOfFailedStakes(transaction.id); + } + return { ...transaction, status: TransactionStatus.Failure }; } - const { waitForNextBlock } = proxyActivities< - ReturnType - >({ - startToCloseTimeout: "45m", - heartbeatTimeout: "6m", - retry: { - maximumAttempts: 200, - }, - }); - - if (!skipWait) { - // Re-sample the height AFTER broadcast: txHeight was captured before - // executeTransaction, so if the chain advanced during broadcast a wait based on the - // stale txHeight can no-op and trigger verifyTransaction before the tx is indexed. - // waitForNextBlock blocks until currentHeight >= arg + 1, so passing the fresh - // post-broadcast height guarantees we wait for at least one block past it — the - // indexing margin — regardless of how many blocks broadcast spanned. The verify - // retry loop covers any remaining lag. - const heightAfterBroadcast = await getBlockHeight(); - await waitForNextBlock(heightAfterBroadcast); + const result = await executeTransaction(transaction.id); + if (!result) { + throw new WorkflowError("Transaction execution failed"); } - const txHash = result?.transactionHash || transaction.hash!; - const baseHeight = transaction.executionHeight || txHeight; - const { operatorAddress, ownerAddress } = extractStakeAddresses(transaction); - - let success = false; - let code = -1; - let gasUsed = '0'; - let txFoundOnChain = false; - let supplierFallbackHit = false; - let verifyErroredUnexpectedly = false; - let verifyTimedOut = false; - - try { - // Retries are driven by Temporal's activity retry policy — one attempt per block - // up to TX_EXPIRATION_BLOCKS. A found tx returns the tuple; a missing tx throws - // retriable TX_NOT_FOUND until the policy is exhausted. - [success, code, gasUsed] = await verifyTransaction(txHash, baseHeight); - txFoundOnChain = true; - } catch (err) { - // We only reach here after verifyTransaction exhausted its full retry budget - // (TX_EXPIRATION_BLOCKS ≈ 30 min), so a transient RPC blip would already have - // recovered. Whatever the failure reason, attempt the positive-only supplier - // fallback — a supplier on-chain conclusively confirms the stake regardless of - // why verify failed. If the fallback is inconclusive we mark Failure (bounded: - // we never rethrow into an indefinite Pending loop) but record *why* so a real - // verification error stays triageable instead of being mislabeled a clean - // "not found". - // A clean not-found and a start-to-close timeout are both inconclusive (no - // proof the tx failed); only anything else counts as an unexpected error. - verifyTimedOut = isStartToCloseTimeout(err); - verifyErroredUnexpectedly = !isTxNotFoundFailure(err) && !verifyTimedOut; - - // Need both addresses to validate ownership — without the expected owner the - // supplier fallback can't prove the on-chain supplier is ours, so we skip it - // and let the tx stay marked Failure rather than risk a false positive. - if (operatorAddress && ownerAddress) { - try { - const supplierExists = await checkSupplierOnChain(operatorAddress, ownerAddress); - if (supplierExists) { - success = true; - code = 0; - gasUsed = '0'; - supplierFallbackHit = true; - } - } catch { - // supplier check also failed (e.g. RPC still down) — no positive evidence, - // tx stays marked as Failure (success stays false) - } - } + if (!result.transactionHash) { + await updateTransaction(transactionId, { + status: TransactionStatus.Failure, + code: result.code, + log: result.message || 'unknown error', + }); + return { ...transaction, status: TransactionStatus.Failure, code: result.code }; } - const txStatus = success ? TransactionStatus.Success : TransactionStatus.Failure; - const verificationHeight = await getBlockHeight(); - - let verificationLog: string | undefined; - if (txFoundOnChain) { - if (code !== 0) { - verificationLog = `verification failed with code ${code}`; - } - } else if (supplierFallbackHit) { - verificationLog = 'verified via supplier state fallback (tx hash not found)'; - } else if (verifyErroredUnexpectedly) { - verificationLog = `verification errored (not a clean not-found) after ${TX_EXPIRATION_BLOCKS} retries; marked failure for triage (baseHeight=${baseHeight})`; - } else if (verifyTimedOut) { - verificationLog = `verify timed out (inconclusive, treated as not-found) after ${TX_EXPIRATION_BLOCKS} retries (baseHeight=${baseHeight})`; - } else { - verificationLog = `tx not found on-chain after ${TX_EXPIRATION_BLOCKS} retries (baseHeight=${baseHeight})`; - } + // Broadcast succeeded: parse timeoutHeight from the signed payload (embedded at signing + // by KeplrWalletConnection; null for external-wallet txs that omit it). + const timeoutHeight = await getTxTimeoutHeight(transactionId); + // Persist hash + height + timeoutHeight and hand off to the verifier. + // executionHeight was sampled BEFORE broadcast (line ~47) — this must not move after + // broadcast or the anchor would be ≥ the first possible inclusion height. await updateTransaction(transactionId, { - status: txStatus, - verificationHeight, - consumedFee: Number(gasUsed || 0), - code, - log: verificationLog, + executionHeight: txHeight, + hash: result.transactionHash, + timeoutHeight, }); - if (transaction.type === TransactionType.Stake) { - if (success) { - const newNodes = await createNewNodesFromTransaction(transaction.id); - await notifyProviderOfStakedAddresses(transaction.id); - - return { - ...transaction, - status: txStatus, - hash: result?.transactionHash || transaction.hash, - txHeight, - newNodes: newNodes || [], - unstakingNodes: [], - code, - }; - } else { - await notifyProviderOfFailedStakes(transaction.id); - - return { - ...transaction, - status: txStatus, - hash: result?.transactionHash || transaction.hash, - txHeight, - newNodes: [], - unstakingNodes: [], - code, - }; - } - } else if (transaction.type === TransactionType.Unstake && success) { - const unstakingNodes = await updateUnstakingNodesFromTransaction(transaction.id) - - await notifyProviderOfUntakingAddresses(transaction.id) - - return { - ...transaction, - status: txStatus, - hash: result?.transactionHash || transaction.hash, - txHeight, - newNodes: [], - unstakingNodes, - code, - }; - } - - return { - ...transaction, - status: txStatus, - hash: result?.transactionHash || transaction.hash, - txHeight, - newNodes: [], - unstakingNodes: [], - code, - }; + return { ...transaction, hash: result.transactionHash, executionHeight: txHeight }; } diff --git a/apps/middleman-workflows/src/workflows/VerifyPendingTransactions.ts b/apps/middleman-workflows/src/workflows/VerifyPendingTransactions.ts new file mode 100644 index 00000000..d7fb13bf --- /dev/null +++ b/apps/middleman-workflows/src/workflows/VerifyPendingTransactions.ts @@ -0,0 +1,70 @@ +import { proxyActivities, log, WorkflowError } from '@temporalio/workflow' +import { delegatorActivities } from '@/activities' +import { decideVerification, TX_EXPIRATION_BLOCKS } from '@igniter/tx-verify' + +// we built to commonjs and p-limit for esm support +// @ts-ignore +import pLimit from 'p-limit' + +const MAX_CONCURRENT = 10 + +/** + * Sweeps broadcast-but-unverified transactions (status pending ∧ hash != null) and + * drives each toward a terminal verdict via the two verification paths + the pure + * `decideVerification`. RPC-unavailable never mutates state (the tx stays pending), + * so a degraded RPC produces retries + alerts, never a false failure. + */ +export async function VerifyPendingTransactions() { + const { + listPendingWithHash, + verifyTxHash, + verifySupplierEffect, + checkTxValidityEvidence, + applyVerificationDecision, + } = proxyActivities>({ + startToCloseTimeout: '120s', + retry: { maximumAttempts: 3 }, + }) + + const txs = await listPendingWithHash() + if (txs.length === 0) return + + const limit = pLimit(MAX_CONCURRENT) + const results = await Promise.allSettled( + txs.map((t) => + limit(async () => { + const hash = await verifyTxHash(t.id) + // Run supplier path unless the hash confirmed success (goal already proven). + const supplier = (hash.status === 'confirmed' && hash.data?.success) ? null : await verifySupplierEffect(t.id) + // Gather validity evidence when the hash is absent (to detect expired/sequence-consumed txs faster). + const needEvidence = hash.status === 'absent' || (hash.status === 'confirmed' && !hash.data?.success) + const evidence = needEvidence + ? await checkTxValidityEvidence(t.id) + : { txTimeoutHeight: null, sequence: null } + const decision = decideVerification({ + hash, + supplier, + executionHeight: t.executionHeight!, + expirationWindow: TX_EXPIRATION_BLOCKS, + txTimeoutHeight: evidence.txTimeoutHeight, + sequence: evidence.sequence, + txTimeoutTimestamp: null, + chainTimeAtCoverage: null, + }) + await applyVerificationDecision(t.id, decision) + }), + ), + ) + + for (const r of results) { + if (r.status === 'rejected') { + log.warn('VerifyPendingTransactions: tx verification failed', { reason: String(r.reason) }) + } + } + + // Match the SupplierStatus pattern: tolerate partial failure, but surface a + // systemic one (all failed → RPC/DB down) instead of completing green. + if (results.length > 0 && results.every((r) => r.status === 'rejected')) { + throw new WorkflowError('VerifyPendingTransactions: all transactions failed') + } +} diff --git a/apps/middleman-workflows/src/workflows/index.ts b/apps/middleman-workflows/src/workflows/index.ts index 6fa0ff77..ebfbcc25 100644 --- a/apps/middleman-workflows/src/workflows/index.ts +++ b/apps/middleman-workflows/src/workflows/index.ts @@ -5,3 +5,4 @@ export * from './ExecutePendingTransactions'; export * from './SupplierStatus' export * from './SupplierStatusRange' export * from './ImportSupplierRecovery' +export * from './VerifyPendingTransactions' diff --git a/apps/middleman-workflows/src/workflows/utils/transactions.ts b/apps/middleman-workflows/src/workflows/utils/transactions.ts index 54fca354..e333f492 100644 --- a/apps/middleman-workflows/src/workflows/utils/transactions.ts +++ b/apps/middleman-workflows/src/workflows/utils/transactions.ts @@ -6,6 +6,7 @@ export interface NewStake { ownerAddress: string; stakeAmount: string; balance: number; + services: StakeOperation['value']['services']; } export interface NewUnstake { @@ -67,12 +68,13 @@ export function extractTransactionStakingSuppliers(tx: Transaction) { const {body} = JSON.parse(tx.unsignedPayload); const nodes: Record = body.messages.reduce((nodes: Record, message: StakeOperation) => { if (message.typeUrl === STAKE_TYPE_URL) { - const {stake, operatorAddress, ownerAddress} = message.value; + const {stake, operatorAddress, ownerAddress, services} = message.value; nodes[operatorAddress] = { address: operatorAddress, ownerAddress, stakeAmount: stake.amount.toString(), balance: nodes[operatorAddress]?.balance || 0, + services, }; } diff --git a/apps/middleman/drizzle/0012_amused_korg.sql b/apps/middleman/drizzle/0012_amused_korg.sql new file mode 100644 index 00000000..ab62d8d2 --- /dev/null +++ b/apps/middleman/drizzle/0012_amused_korg.sql @@ -0,0 +1,5 @@ +ALTER TABLE "transactions" ADD COLUMN "lastCoveredHeight" integer;--> statement-breakpoint +ALTER TABLE "transactions" ADD COLUMN "txVerificationAttempts" integer DEFAULT 0 NOT NULL;--> statement-breakpoint +ALTER TABLE "transactions" ADD COLUMN "supplierVerificationAttempts" integer DEFAULT 0 NOT NULL;--> statement-breakpoint +ALTER TABLE "transactions" ADD COLUMN "unavailableChecks" integer DEFAULT 0 NOT NULL;--> statement-breakpoint +ALTER TABLE "transactions" ADD COLUMN "lastVerificationAt" timestamp; \ No newline at end of file diff --git a/apps/middleman/drizzle/0013_broken_outlaw_kid.sql b/apps/middleman/drizzle/0013_broken_outlaw_kid.sql new file mode 100644 index 00000000..5a00a6e6 --- /dev/null +++ b/apps/middleman/drizzle/0013_broken_outlaw_kid.sql @@ -0,0 +1,46 @@ +-- Dedup nodes by address before adding the unique constraint (#296/#297 root fix). +-- Canonical node per address = freshest data: highest "lastUpdatedHeight" +-- (NULLS LAST), tie-break highest "id". 1) insert canonical links (DISTINCT + +-- ON CONFLICT, collision-safe even when one tx links two dups of the same +-- address); 2) drop all duplicate links; 3) re-point supplier_changes; 4) delete +-- duplicate nodes; 5) add the unique constraint. +WITH canonical AS ( + SELECT DISTINCT ON ("address") "address", "id" AS keep_id + FROM "nodes" ORDER BY "address", "lastUpdatedHeight" DESC NULLS LAST, "id" DESC +), dupes AS ( + SELECT n."id" AS dup_id, c.keep_id + FROM "nodes" n JOIN canonical c ON c."address" = n."address" + WHERE n."id" <> c.keep_id +) +INSERT INTO "transactions_to_nodes" ("transactionId", "nodeId") +SELECT DISTINCT t."transactionId", d.keep_id +FROM "transactions_to_nodes" t JOIN dupes d ON t."nodeId" = d.dup_id +ON CONFLICT DO NOTHING;--> statement-breakpoint +WITH canonical AS ( + SELECT DISTINCT ON ("address") "address", "id" AS keep_id + FROM "nodes" ORDER BY "address", "lastUpdatedHeight" DESC NULLS LAST, "id" DESC +), dupes AS ( + SELECT n."id" AS dup_id + FROM "nodes" n JOIN canonical c ON c."address" = n."address" + WHERE n."id" <> c.keep_id +) +DELETE FROM "transactions_to_nodes" t USING dupes d WHERE t."nodeId" = d.dup_id;--> statement-breakpoint +WITH canonical AS ( + SELECT DISTINCT ON ("address") "address", "id" AS keep_id + FROM "nodes" ORDER BY "address", "lastUpdatedHeight" DESC NULLS LAST, "id" DESC +), dupes AS ( + SELECT n."id" AS dup_id, c.keep_id + FROM "nodes" n JOIN canonical c ON c."address" = n."address" + WHERE n."id" <> c.keep_id +) +UPDATE "supplier_changes" s SET "nodeId" = d.keep_id FROM dupes d WHERE s."nodeId" = d.dup_id;--> statement-breakpoint +WITH canonical AS ( + SELECT DISTINCT ON ("address") "address", "id" AS keep_id + FROM "nodes" ORDER BY "address", "lastUpdatedHeight" DESC NULLS LAST, "id" DESC +), dupes AS ( + SELECT n."id" AS dup_id + FROM "nodes" n JOIN canonical c ON c."address" = n."address" + WHERE n."id" <> c.keep_id +) +DELETE FROM "nodes" n USING dupes d WHERE n."id" = d.dup_id;--> statement-breakpoint +ALTER TABLE "nodes" ADD CONSTRAINT "nodes_address_unique" UNIQUE("address"); diff --git a/apps/middleman/drizzle/0014_backfill_lastcovered.sql b/apps/middleman/drizzle/0014_backfill_lastcovered.sql new file mode 100644 index 00000000..fa04019a --- /dev/null +++ b/apps/middleman/drizzle/0014_backfill_lastcovered.sql @@ -0,0 +1,9 @@ +-- Adopt in-flight broadcast txs into the verifier: start the incremental hash +-- scan from the broadcast height instead of 0. Existing `failure` rows are left +-- untouched (already remediated by the #296/#297 live patch). +UPDATE "transactions" +SET "lastCoveredHeight" = "executionHeight" +WHERE "status" = 'pending' + AND "hash" IS NOT NULL + AND "lastCoveredHeight" IS NULL + AND "executionHeight" IS NOT NULL; diff --git a/apps/middleman/drizzle/0015_fluffy_wonder_man.sql b/apps/middleman/drizzle/0015_fluffy_wonder_man.sql new file mode 100644 index 00000000..834c2c32 --- /dev/null +++ b/apps/middleman/drizzle/0015_fluffy_wonder_man.sql @@ -0,0 +1,4 @@ +ALTER TABLE "transactions" ADD COLUMN "timeoutHeight" integer;--> statement-breakpoint +CREATE INDEX "mw_transactions_verifier_sweep_idx" ON "transactions" USING btree ("status","lastVerificationAt") WHERE "hash" IS NOT NULL;--> statement-breakpoint +ALTER TABLE "transactions" DROP COLUMN "txVerificationAttempts";--> statement-breakpoint +ALTER TABLE "transactions" DROP COLUMN "supplierVerificationAttempts"; \ No newline at end of file diff --git a/apps/middleman/drizzle/meta/0012_snapshot.json b/apps/middleman/drizzle/meta/0012_snapshot.json new file mode 100644 index 00000000..d0aa6f5b --- /dev/null +++ b/apps/middleman/drizzle/meta/0012_snapshot.json @@ -0,0 +1,1211 @@ +{ + "id": "4ee77f62-a8c9-4afc-9c50-2ad9ecc1186f", + "prevId": "be4fa18b-e65d-4b18-90a8-b686f59f39f0", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.application_settings": { + "name": "application_settings", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "application_settings_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "appIdentity": { + "name": "appIdentity", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "supportEmail": { + "name": "supportEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ownerEmail": { + "name": "ownerEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ownerIdentity": { + "name": "ownerIdentity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "fee": { + "name": "fee", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "minimumStake": { + "name": "minimumStake", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "isBootstrapped": { + "name": "isBootstrapped", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "chainId": { + "name": "chainId", + "type": "chain_ids", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "delegatorRewardsAddress": { + "name": "delegatorRewardsAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "pocketApiUrl": { + "name": "pocketApiUrl", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "pocketRpcUrl": { + "name": "pocketRpcUrl", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "indexerApiUrl": { + "name": "indexerApiUrl", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "updatedAtHeight": { + "name": "updatedAtHeight", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "privacyPolicy": { + "name": "privacyPolicy", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "application_settings_createdBy_users_identity_fk": { + "name": "application_settings_createdBy_users_identity_fk", + "tableFrom": "application_settings", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "application_settings_updatedBy_users_identity_fk": { + "name": "application_settings_updatedBy_users_identity_fk", + "tableFrom": "application_settings", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.import_supplier_attempts": { + "name": "import_supplier_attempts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "import_supplier_attempts_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "userIdentity": { + "name": "userIdentity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "providerIdentity": { + "name": "providerIdentity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "providerId": { + "name": "providerId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "nonce": { + "name": "nonce", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "import_attempt_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'initiated'" + }, + "importedSupplierAddresses": { + "name": "importedSupplierAddresses", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'::json" + }, + "errorMessage": { + "name": "errorMessage", + "type": "varchar(1024)", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "signedAt": { + "name": "signedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "submittedAt": { + "name": "submittedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "completedAt": { + "name": "completedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "import_supplier_attempts_userIdentity_users_identity_fk": { + "name": "import_supplier_attempts_userIdentity_users_identity_fk", + "tableFrom": "import_supplier_attempts", + "tableTo": "users", + "columnsFrom": [ + "userIdentity" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "import_supplier_attempts_providerId_providers_id_fk": { + "name": "import_supplier_attempts_providerId_providers_id_fk", + "tableFrom": "import_supplier_attempts", + "tableTo": "providers", + "columnsFrom": [ + "providerId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.nodes": { + "name": "nodes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "nodes_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "address": { + "name": "address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "node_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "stakeAmount": { + "name": "stakeAmount", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "balance": { + "name": "balance", + "type": "bigint", + "primaryKey": false, + "notNull": true + }, + "providerId": { + "name": "providerId", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "lastUpdatedHeight": { + "name": "lastUpdatedHeight", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "services": { + "name": "services", + "type": "jsonb", + "primaryKey": false, + "notNull": false, + "default": "'[]'::jsonb" + } + }, + "indexes": {}, + "foreignKeys": { + "nodes_providerId_providers_identity_fk": { + "name": "nodes_providerId_providers_identity_fk", + "tableFrom": "nodes", + "tableTo": "providers", + "columnsFrom": [ + "providerId" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "nodes_createdBy_users_identity_fk": { + "name": "nodes_createdBy_users_identity_fk", + "tableFrom": "nodes", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.transactions_to_nodes": { + "name": "transactions_to_nodes", + "schema": "", + "columns": { + "transactionId": { + "name": "transactionId", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "nodeId": { + "name": "nodeId", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "transactions_to_nodes_transactionId_transactions_id_fk": { + "name": "transactions_to_nodes_transactionId_transactions_id_fk", + "tableFrom": "transactions_to_nodes", + "tableTo": "transactions", + "columnsFrom": [ + "transactionId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "transactions_to_nodes_nodeId_nodes_id_fk": { + "name": "transactions_to_nodes_nodeId_nodes_id_fk", + "tableFrom": "transactions_to_nodes", + "tableTo": "nodes", + "columnsFrom": [ + "nodeId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "transactions_to_nodes_transactionId_nodeId_pk": { + "name": "transactions_to_nodes_transactionId_nodeId_pk", + "columns": [ + "transactionId", + "nodeId" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.providers": { + "name": "providers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "providers_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "identity": { + "name": "identity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "visible": { + "name": "visible", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "fee": { + "name": "fee", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "feeType": { + "name": "feeType", + "type": "provider_fee", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "domains": { + "name": "domains", + "type": "text[]", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "regions": { + "name": "regions", + "type": "text[]", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "allowPublicStaking": { + "name": "allowPublicStaking", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "allowedStakers": { + "name": "allowedStakers", + "type": "varchar[]", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "status": { + "name": "status", + "type": "provider_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'unknown'" + }, + "minimumStake": { + "name": "minimumStake", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "operationalFunds": { + "name": "operationalFunds", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 5 + }, + "address_groups": { + "name": "address_groups", + "type": "jsonb", + "primaryKey": false, + "notNull": false, + "default": "'[]'::jsonb" + }, + "supplier_stats": { + "name": "supplier_stats", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "rewardAddresses": { + "name": "rewardAddresses", + "type": "varchar[]", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "providers_createdBy_users_identity_fk": { + "name": "providers_createdBy_users_identity_fk", + "tableFrom": "providers", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "providers_updatedBy_users_identity_fk": { + "name": "providers_updatedBy_users_identity_fk", + "tableFrom": "providers", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "providers_identity_unique": { + "name": "providers_identity_unique", + "nullsNotDistinct": false, + "columns": [ + "identity" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.transactions": { + "name": "transactions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "transactions_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "hash": { + "name": "hash", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "tx_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "tx_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "code": { + "name": "code", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "log": { + "name": "log", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "executionHeight": { + "name": "executionHeight", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "executionTimestamp": { + "name": "executionTimestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "verificationHeight": { + "name": "verificationHeight", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "verificationTimestamp": { + "name": "verificationTimestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "lastCoveredHeight": { + "name": "lastCoveredHeight", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "txVerificationAttempts": { + "name": "txVerificationAttempts", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "supplierVerificationAttempts": { + "name": "supplierVerificationAttempts", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "unavailableChecks": { + "name": "unavailableChecks", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "lastVerificationAt": { + "name": "lastVerificationAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "dependsOn": { + "name": "dependsOn", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "signedPayload": { + "name": "signedPayload", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "fromAddress": { + "name": "fromAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "unsignedPayload": { + "name": "unsignedPayload", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "estimatedFee": { + "name": "estimatedFee", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "consumedFee": { + "name": "consumedFee", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "providerFee": { + "name": "providerFee", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "typeProviderFee": { + "name": "typeProviderFee", + "type": "provider_fee", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "providerId": { + "name": "providerId", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "transactions_dependsOn_transactions_id_fk": { + "name": "transactions_dependsOn_transactions_id_fk", + "tableFrom": "transactions", + "tableTo": "transactions", + "columnsFrom": [ + "dependsOn" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "transactions_providerId_providers_identity_fk": { + "name": "transactions_providerId_providers_identity_fk", + "tableFrom": "transactions", + "tableTo": "providers", + "columnsFrom": [ + "providerId" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "transactions_createdBy_users_identity_fk": { + "name": "transactions_createdBy_users_identity_fk", + "tableFrom": "transactions", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "users_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "identity": { + "name": "identity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_identity_unique": { + "name": "users_identity_unique", + "nullsNotDistinct": false, + "columns": [ + "identity" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.supplier_changes": { + "name": "supplier_changes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "supplier_changes_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "nodeId": { + "name": "nodeId", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "changeType": { + "name": "changeType", + "type": "supplier_change_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "serviceId": { + "name": "serviceId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "previous_value": { + "name": "previous_value", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "new_value": { + "name": "new_value", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "batchId": { + "name": "batchId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "acknowledgedAt": { + "name": "acknowledgedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "supplier_changes_nodeId_nodes_id_fk": { + "name": "supplier_changes_nodeId_nodes_id_fk", + "tableFrom": "supplier_changes", + "tableTo": "nodes", + "columnsFrom": [ + "nodeId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.chain_ids": { + "name": "chain_ids", + "schema": "public", + "values": [ + "pocket", + "pocket-beta", + "pocket-alpha", + "pocket-lego-testnet" + ] + }, + "public.import_attempt_status": { + "name": "import_attempt_status", + "schema": "public", + "values": [ + "initiated", + "signed", + "submitted", + "completed", + "failed", + "cancelled" + ] + }, + "public.node_status": { + "name": "node_status", + "schema": "public", + "values": [ + "staked", + "unstaked", + "unstaking" + ] + }, + "public.provider_fee": { + "name": "provider_fee", + "schema": "public", + "values": [ + "up_to", + "fixed" + ] + }, + "public.provider_status": { + "name": "provider_status", + "schema": "public", + "values": [ + "healthy", + "unhealthy", + "unknown", + "unreachable" + ] + }, + "public.role": { + "name": "role", + "schema": "public", + "values": [ + "admin", + "user", + "owner" + ] + }, + "public.supplier_change_type": { + "name": "supplier_change_type", + "schema": "public", + "values": [ + "service_added", + "service_removed", + "rev_share_changed" + ] + }, + "public.tx_status": { + "name": "tx_status", + "schema": "public", + "values": [ + "pending", + "success", + "failure", + "not_executed" + ] + }, + "public.tx_type": { + "name": "tx_type", + "schema": "public", + "values": [ + "Stake", + "Unstake", + "Upstake", + "Operational Funds" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/middleman/drizzle/meta/0013_snapshot.json b/apps/middleman/drizzle/meta/0013_snapshot.json new file mode 100644 index 00000000..57d50b89 --- /dev/null +++ b/apps/middleman/drizzle/meta/0013_snapshot.json @@ -0,0 +1,1219 @@ +{ + "id": "b5e69e85-119b-4d7d-b913-de131e4b3ede", + "prevId": "4ee77f62-a8c9-4afc-9c50-2ad9ecc1186f", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.application_settings": { + "name": "application_settings", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "application_settings_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "appIdentity": { + "name": "appIdentity", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "supportEmail": { + "name": "supportEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ownerEmail": { + "name": "ownerEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ownerIdentity": { + "name": "ownerIdentity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "fee": { + "name": "fee", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "minimumStake": { + "name": "minimumStake", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "isBootstrapped": { + "name": "isBootstrapped", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "chainId": { + "name": "chainId", + "type": "chain_ids", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "delegatorRewardsAddress": { + "name": "delegatorRewardsAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "pocketApiUrl": { + "name": "pocketApiUrl", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "pocketRpcUrl": { + "name": "pocketRpcUrl", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "indexerApiUrl": { + "name": "indexerApiUrl", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "updatedAtHeight": { + "name": "updatedAtHeight", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "privacyPolicy": { + "name": "privacyPolicy", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "application_settings_createdBy_users_identity_fk": { + "name": "application_settings_createdBy_users_identity_fk", + "tableFrom": "application_settings", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "application_settings_updatedBy_users_identity_fk": { + "name": "application_settings_updatedBy_users_identity_fk", + "tableFrom": "application_settings", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.import_supplier_attempts": { + "name": "import_supplier_attempts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "import_supplier_attempts_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "userIdentity": { + "name": "userIdentity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "providerIdentity": { + "name": "providerIdentity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "providerId": { + "name": "providerId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "nonce": { + "name": "nonce", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "import_attempt_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'initiated'" + }, + "importedSupplierAddresses": { + "name": "importedSupplierAddresses", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'::json" + }, + "errorMessage": { + "name": "errorMessage", + "type": "varchar(1024)", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "signedAt": { + "name": "signedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "submittedAt": { + "name": "submittedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "completedAt": { + "name": "completedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "import_supplier_attempts_userIdentity_users_identity_fk": { + "name": "import_supplier_attempts_userIdentity_users_identity_fk", + "tableFrom": "import_supplier_attempts", + "tableTo": "users", + "columnsFrom": [ + "userIdentity" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "import_supplier_attempts_providerId_providers_id_fk": { + "name": "import_supplier_attempts_providerId_providers_id_fk", + "tableFrom": "import_supplier_attempts", + "tableTo": "providers", + "columnsFrom": [ + "providerId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.nodes": { + "name": "nodes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "nodes_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "address": { + "name": "address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "node_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "stakeAmount": { + "name": "stakeAmount", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "balance": { + "name": "balance", + "type": "bigint", + "primaryKey": false, + "notNull": true + }, + "providerId": { + "name": "providerId", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "lastUpdatedHeight": { + "name": "lastUpdatedHeight", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "services": { + "name": "services", + "type": "jsonb", + "primaryKey": false, + "notNull": false, + "default": "'[]'::jsonb" + } + }, + "indexes": {}, + "foreignKeys": { + "nodes_providerId_providers_identity_fk": { + "name": "nodes_providerId_providers_identity_fk", + "tableFrom": "nodes", + "tableTo": "providers", + "columnsFrom": [ + "providerId" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "nodes_createdBy_users_identity_fk": { + "name": "nodes_createdBy_users_identity_fk", + "tableFrom": "nodes", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "nodes_address_unique": { + "name": "nodes_address_unique", + "nullsNotDistinct": false, + "columns": [ + "address" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.transactions_to_nodes": { + "name": "transactions_to_nodes", + "schema": "", + "columns": { + "transactionId": { + "name": "transactionId", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "nodeId": { + "name": "nodeId", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "transactions_to_nodes_transactionId_transactions_id_fk": { + "name": "transactions_to_nodes_transactionId_transactions_id_fk", + "tableFrom": "transactions_to_nodes", + "tableTo": "transactions", + "columnsFrom": [ + "transactionId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "transactions_to_nodes_nodeId_nodes_id_fk": { + "name": "transactions_to_nodes_nodeId_nodes_id_fk", + "tableFrom": "transactions_to_nodes", + "tableTo": "nodes", + "columnsFrom": [ + "nodeId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "transactions_to_nodes_transactionId_nodeId_pk": { + "name": "transactions_to_nodes_transactionId_nodeId_pk", + "columns": [ + "transactionId", + "nodeId" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.providers": { + "name": "providers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "providers_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "identity": { + "name": "identity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "visible": { + "name": "visible", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "fee": { + "name": "fee", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "feeType": { + "name": "feeType", + "type": "provider_fee", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "domains": { + "name": "domains", + "type": "text[]", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "regions": { + "name": "regions", + "type": "text[]", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "allowPublicStaking": { + "name": "allowPublicStaking", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "allowedStakers": { + "name": "allowedStakers", + "type": "varchar[]", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "status": { + "name": "status", + "type": "provider_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'unknown'" + }, + "minimumStake": { + "name": "minimumStake", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "operationalFunds": { + "name": "operationalFunds", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 5 + }, + "address_groups": { + "name": "address_groups", + "type": "jsonb", + "primaryKey": false, + "notNull": false, + "default": "'[]'::jsonb" + }, + "supplier_stats": { + "name": "supplier_stats", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "rewardAddresses": { + "name": "rewardAddresses", + "type": "varchar[]", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "providers_createdBy_users_identity_fk": { + "name": "providers_createdBy_users_identity_fk", + "tableFrom": "providers", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "providers_updatedBy_users_identity_fk": { + "name": "providers_updatedBy_users_identity_fk", + "tableFrom": "providers", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "providers_identity_unique": { + "name": "providers_identity_unique", + "nullsNotDistinct": false, + "columns": [ + "identity" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.transactions": { + "name": "transactions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "transactions_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "hash": { + "name": "hash", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "tx_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "tx_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "code": { + "name": "code", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "log": { + "name": "log", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "executionHeight": { + "name": "executionHeight", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "executionTimestamp": { + "name": "executionTimestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "verificationHeight": { + "name": "verificationHeight", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "verificationTimestamp": { + "name": "verificationTimestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "lastCoveredHeight": { + "name": "lastCoveredHeight", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "txVerificationAttempts": { + "name": "txVerificationAttempts", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "supplierVerificationAttempts": { + "name": "supplierVerificationAttempts", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "unavailableChecks": { + "name": "unavailableChecks", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "lastVerificationAt": { + "name": "lastVerificationAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "dependsOn": { + "name": "dependsOn", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "signedPayload": { + "name": "signedPayload", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "fromAddress": { + "name": "fromAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "unsignedPayload": { + "name": "unsignedPayload", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "estimatedFee": { + "name": "estimatedFee", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "consumedFee": { + "name": "consumedFee", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "providerFee": { + "name": "providerFee", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "typeProviderFee": { + "name": "typeProviderFee", + "type": "provider_fee", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "providerId": { + "name": "providerId", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "transactions_dependsOn_transactions_id_fk": { + "name": "transactions_dependsOn_transactions_id_fk", + "tableFrom": "transactions", + "tableTo": "transactions", + "columnsFrom": [ + "dependsOn" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "transactions_providerId_providers_identity_fk": { + "name": "transactions_providerId_providers_identity_fk", + "tableFrom": "transactions", + "tableTo": "providers", + "columnsFrom": [ + "providerId" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "transactions_createdBy_users_identity_fk": { + "name": "transactions_createdBy_users_identity_fk", + "tableFrom": "transactions", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "users_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "identity": { + "name": "identity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_identity_unique": { + "name": "users_identity_unique", + "nullsNotDistinct": false, + "columns": [ + "identity" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.supplier_changes": { + "name": "supplier_changes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "supplier_changes_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "nodeId": { + "name": "nodeId", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "changeType": { + "name": "changeType", + "type": "supplier_change_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "serviceId": { + "name": "serviceId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "previous_value": { + "name": "previous_value", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "new_value": { + "name": "new_value", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "batchId": { + "name": "batchId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "acknowledgedAt": { + "name": "acknowledgedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "supplier_changes_nodeId_nodes_id_fk": { + "name": "supplier_changes_nodeId_nodes_id_fk", + "tableFrom": "supplier_changes", + "tableTo": "nodes", + "columnsFrom": [ + "nodeId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.chain_ids": { + "name": "chain_ids", + "schema": "public", + "values": [ + "pocket", + "pocket-beta", + "pocket-alpha", + "pocket-lego-testnet" + ] + }, + "public.import_attempt_status": { + "name": "import_attempt_status", + "schema": "public", + "values": [ + "initiated", + "signed", + "submitted", + "completed", + "failed", + "cancelled" + ] + }, + "public.node_status": { + "name": "node_status", + "schema": "public", + "values": [ + "staked", + "unstaked", + "unstaking" + ] + }, + "public.provider_fee": { + "name": "provider_fee", + "schema": "public", + "values": [ + "up_to", + "fixed" + ] + }, + "public.provider_status": { + "name": "provider_status", + "schema": "public", + "values": [ + "healthy", + "unhealthy", + "unknown", + "unreachable" + ] + }, + "public.role": { + "name": "role", + "schema": "public", + "values": [ + "admin", + "user", + "owner" + ] + }, + "public.supplier_change_type": { + "name": "supplier_change_type", + "schema": "public", + "values": [ + "service_added", + "service_removed", + "rev_share_changed" + ] + }, + "public.tx_status": { + "name": "tx_status", + "schema": "public", + "values": [ + "pending", + "success", + "failure", + "not_executed" + ] + }, + "public.tx_type": { + "name": "tx_type", + "schema": "public", + "values": [ + "Stake", + "Unstake", + "Upstake", + "Operational Funds" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/middleman/drizzle/meta/0014_snapshot.json b/apps/middleman/drizzle/meta/0014_snapshot.json new file mode 100644 index 00000000..05596ea7 --- /dev/null +++ b/apps/middleman/drizzle/meta/0014_snapshot.json @@ -0,0 +1,1219 @@ +{ + "id": "eb4e1903-7151-4836-9a1a-141132d56cd6", + "prevId": "b5e69e85-119b-4d7d-b913-de131e4b3ede", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.application_settings": { + "name": "application_settings", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "name": "application_settings_id_seq", + "increment": "1", + "minValue": "1", + "maxValue": "2147483647", + "startWith": "1", + "cache": "1", + "cycle": false, + "schema": "public", + "type": "always" + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "appIdentity": { + "name": "appIdentity", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "supportEmail": { + "name": "supportEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ownerEmail": { + "name": "ownerEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ownerIdentity": { + "name": "ownerIdentity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "fee": { + "name": "fee", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "minimumStake": { + "name": "minimumStake", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "isBootstrapped": { + "name": "isBootstrapped", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "chainId": { + "name": "chainId", + "type": "chain_ids", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "delegatorRewardsAddress": { + "name": "delegatorRewardsAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "pocketApiUrl": { + "name": "pocketApiUrl", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "pocketRpcUrl": { + "name": "pocketRpcUrl", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "indexerApiUrl": { + "name": "indexerApiUrl", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "updatedAtHeight": { + "name": "updatedAtHeight", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "privacyPolicy": { + "name": "privacyPolicy", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "application_settings_createdBy_users_identity_fk": { + "name": "application_settings_createdBy_users_identity_fk", + "tableFrom": "application_settings", + "columnsFrom": [ + "createdBy" + ], + "tableTo": "users", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + }, + "application_settings_updatedBy_users_identity_fk": { + "name": "application_settings_updatedBy_users_identity_fk", + "tableFrom": "application_settings", + "columnsFrom": [ + "updatedBy" + ], + "tableTo": "users", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.import_supplier_attempts": { + "name": "import_supplier_attempts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "name": "import_supplier_attempts_id_seq", + "increment": "1", + "minValue": "1", + "maxValue": "2147483647", + "startWith": "1", + "cache": "1", + "cycle": false, + "schema": "public", + "type": "always" + } + }, + "userIdentity": { + "name": "userIdentity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "providerIdentity": { + "name": "providerIdentity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "providerId": { + "name": "providerId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "nonce": { + "name": "nonce", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "import_attempt_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'initiated'" + }, + "importedSupplierAddresses": { + "name": "importedSupplierAddresses", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'::json" + }, + "errorMessage": { + "name": "errorMessage", + "type": "varchar(1024)", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "signedAt": { + "name": "signedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "submittedAt": { + "name": "submittedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "completedAt": { + "name": "completedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "import_supplier_attempts_userIdentity_users_identity_fk": { + "name": "import_supplier_attempts_userIdentity_users_identity_fk", + "tableFrom": "import_supplier_attempts", + "columnsFrom": [ + "userIdentity" + ], + "tableTo": "users", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + }, + "import_supplier_attempts_providerId_providers_id_fk": { + "name": "import_supplier_attempts_providerId_providers_id_fk", + "tableFrom": "import_supplier_attempts", + "columnsFrom": [ + "providerId" + ], + "tableTo": "providers", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.nodes": { + "name": "nodes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "name": "nodes_id_seq", + "increment": "1", + "minValue": "1", + "maxValue": "2147483647", + "startWith": "1", + "cache": "1", + "cycle": false, + "schema": "public", + "type": "always" + } + }, + "address": { + "name": "address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "node_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "stakeAmount": { + "name": "stakeAmount", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "balance": { + "name": "balance", + "type": "bigint", + "primaryKey": false, + "notNull": true + }, + "providerId": { + "name": "providerId", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "lastUpdatedHeight": { + "name": "lastUpdatedHeight", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "services": { + "name": "services", + "type": "jsonb", + "primaryKey": false, + "notNull": false, + "default": "'[]'::jsonb" + } + }, + "indexes": {}, + "foreignKeys": { + "nodes_providerId_providers_identity_fk": { + "name": "nodes_providerId_providers_identity_fk", + "tableFrom": "nodes", + "columnsFrom": [ + "providerId" + ], + "tableTo": "providers", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + }, + "nodes_createdBy_users_identity_fk": { + "name": "nodes_createdBy_users_identity_fk", + "tableFrom": "nodes", + "columnsFrom": [ + "createdBy" + ], + "tableTo": "users", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "nodes_address_unique": { + "name": "nodes_address_unique", + "columns": [ + "address" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.transactions_to_nodes": { + "name": "transactions_to_nodes", + "schema": "", + "columns": { + "transactionId": { + "name": "transactionId", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "nodeId": { + "name": "nodeId", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "transactions_to_nodes_transactionId_transactions_id_fk": { + "name": "transactions_to_nodes_transactionId_transactions_id_fk", + "tableFrom": "transactions_to_nodes", + "columnsFrom": [ + "transactionId" + ], + "tableTo": "transactions", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "no action" + }, + "transactions_to_nodes_nodeId_nodes_id_fk": { + "name": "transactions_to_nodes_nodeId_nodes_id_fk", + "tableFrom": "transactions_to_nodes", + "columnsFrom": [ + "nodeId" + ], + "tableTo": "nodes", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "no action" + } + }, + "compositePrimaryKeys": { + "transactions_to_nodes_transactionId_nodeId_pk": { + "name": "transactions_to_nodes_transactionId_nodeId_pk", + "columns": [ + "transactionId", + "nodeId" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.providers": { + "name": "providers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "name": "providers_id_seq", + "increment": "1", + "minValue": "1", + "maxValue": "2147483647", + "startWith": "1", + "cache": "1", + "cycle": false, + "schema": "public", + "type": "always" + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "identity": { + "name": "identity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "visible": { + "name": "visible", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "fee": { + "name": "fee", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "feeType": { + "name": "feeType", + "type": "provider_fee", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "domains": { + "name": "domains", + "type": "text[]", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "regions": { + "name": "regions", + "type": "text[]", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "allowPublicStaking": { + "name": "allowPublicStaking", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "allowedStakers": { + "name": "allowedStakers", + "type": "varchar[]", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "status": { + "name": "status", + "type": "provider_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'unknown'" + }, + "minimumStake": { + "name": "minimumStake", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "operationalFunds": { + "name": "operationalFunds", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 5 + }, + "address_groups": { + "name": "address_groups", + "type": "jsonb", + "primaryKey": false, + "notNull": false, + "default": "'[]'::jsonb" + }, + "supplier_stats": { + "name": "supplier_stats", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "rewardAddresses": { + "name": "rewardAddresses", + "type": "varchar[]", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "providers_createdBy_users_identity_fk": { + "name": "providers_createdBy_users_identity_fk", + "tableFrom": "providers", + "columnsFrom": [ + "createdBy" + ], + "tableTo": "users", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + }, + "providers_updatedBy_users_identity_fk": { + "name": "providers_updatedBy_users_identity_fk", + "tableFrom": "providers", + "columnsFrom": [ + "updatedBy" + ], + "tableTo": "users", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "providers_identity_unique": { + "name": "providers_identity_unique", + "columns": [ + "identity" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.transactions": { + "name": "transactions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "name": "transactions_id_seq", + "increment": "1", + "minValue": "1", + "maxValue": "2147483647", + "startWith": "1", + "cache": "1", + "cycle": false, + "schema": "public", + "type": "always" + } + }, + "hash": { + "name": "hash", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "tx_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "tx_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "code": { + "name": "code", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "log": { + "name": "log", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "executionHeight": { + "name": "executionHeight", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "executionTimestamp": { + "name": "executionTimestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "verificationHeight": { + "name": "verificationHeight", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "verificationTimestamp": { + "name": "verificationTimestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "lastCoveredHeight": { + "name": "lastCoveredHeight", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "txVerificationAttempts": { + "name": "txVerificationAttempts", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "supplierVerificationAttempts": { + "name": "supplierVerificationAttempts", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "unavailableChecks": { + "name": "unavailableChecks", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "lastVerificationAt": { + "name": "lastVerificationAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "dependsOn": { + "name": "dependsOn", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "signedPayload": { + "name": "signedPayload", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "fromAddress": { + "name": "fromAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "unsignedPayload": { + "name": "unsignedPayload", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "estimatedFee": { + "name": "estimatedFee", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "consumedFee": { + "name": "consumedFee", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "providerFee": { + "name": "providerFee", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "typeProviderFee": { + "name": "typeProviderFee", + "type": "provider_fee", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "providerId": { + "name": "providerId", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "transactions_dependsOn_transactions_id_fk": { + "name": "transactions_dependsOn_transactions_id_fk", + "tableFrom": "transactions", + "columnsFrom": [ + "dependsOn" + ], + "tableTo": "transactions", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "no action" + }, + "transactions_providerId_providers_identity_fk": { + "name": "transactions_providerId_providers_identity_fk", + "tableFrom": "transactions", + "columnsFrom": [ + "providerId" + ], + "tableTo": "providers", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + }, + "transactions_createdBy_users_identity_fk": { + "name": "transactions_createdBy_users_identity_fk", + "tableFrom": "transactions", + "columnsFrom": [ + "createdBy" + ], + "tableTo": "users", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "name": "users_id_seq", + "increment": "1", + "minValue": "1", + "maxValue": "2147483647", + "startWith": "1", + "cache": "1", + "cycle": false, + "schema": "public", + "type": "always" + } + }, + "identity": { + "name": "identity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_identity_unique": { + "name": "users_identity_unique", + "columns": [ + "identity" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.supplier_changes": { + "name": "supplier_changes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "name": "supplier_changes_id_seq", + "increment": "1", + "minValue": "1", + "maxValue": "2147483647", + "startWith": "1", + "cache": "1", + "cycle": false, + "schema": "public", + "type": "always" + } + }, + "nodeId": { + "name": "nodeId", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "changeType": { + "name": "changeType", + "type": "supplier_change_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "serviceId": { + "name": "serviceId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "previous_value": { + "name": "previous_value", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "new_value": { + "name": "new_value", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "batchId": { + "name": "batchId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "acknowledgedAt": { + "name": "acknowledgedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "supplier_changes_nodeId_nodes_id_fk": { + "name": "supplier_changes_nodeId_nodes_id_fk", + "tableFrom": "supplier_changes", + "columnsFrom": [ + "nodeId" + ], + "tableTo": "nodes", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.chain_ids": { + "name": "chain_ids", + "schema": "public", + "values": [ + "pocket", + "pocket-beta", + "pocket-alpha", + "pocket-lego-testnet" + ] + }, + "public.import_attempt_status": { + "name": "import_attempt_status", + "schema": "public", + "values": [ + "initiated", + "signed", + "submitted", + "completed", + "failed", + "cancelled" + ] + }, + "public.node_status": { + "name": "node_status", + "schema": "public", + "values": [ + "staked", + "unstaked", + "unstaking" + ] + }, + "public.provider_fee": { + "name": "provider_fee", + "schema": "public", + "values": [ + "up_to", + "fixed" + ] + }, + "public.provider_status": { + "name": "provider_status", + "schema": "public", + "values": [ + "healthy", + "unhealthy", + "unknown", + "unreachable" + ] + }, + "public.role": { + "name": "role", + "schema": "public", + "values": [ + "admin", + "user", + "owner" + ] + }, + "public.supplier_change_type": { + "name": "supplier_change_type", + "schema": "public", + "values": [ + "service_added", + "service_removed", + "rev_share_changed" + ] + }, + "public.tx_status": { + "name": "tx_status", + "schema": "public", + "values": [ + "pending", + "success", + "failure", + "not_executed" + ] + }, + "public.tx_type": { + "name": "tx_type", + "schema": "public", + "values": [ + "Stake", + "Unstake", + "Upstake", + "Operational Funds" + ] + } + }, + "schemas": {}, + "views": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/middleman/drizzle/meta/0015_snapshot.json b/apps/middleman/drizzle/meta/0015_snapshot.json new file mode 100644 index 00000000..cc6dbe09 --- /dev/null +++ b/apps/middleman/drizzle/meta/0015_snapshot.json @@ -0,0 +1,1234 @@ +{ + "id": "f93da44d-1618-496a-a5b6-1c073145ed15", + "prevId": "eb4e1903-7151-4836-9a1a-141132d56cd6", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.application_settings": { + "name": "application_settings", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "application_settings_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "appIdentity": { + "name": "appIdentity", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "supportEmail": { + "name": "supportEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ownerEmail": { + "name": "ownerEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ownerIdentity": { + "name": "ownerIdentity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "fee": { + "name": "fee", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "minimumStake": { + "name": "minimumStake", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "isBootstrapped": { + "name": "isBootstrapped", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "chainId": { + "name": "chainId", + "type": "chain_ids", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "delegatorRewardsAddress": { + "name": "delegatorRewardsAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "pocketApiUrl": { + "name": "pocketApiUrl", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "pocketRpcUrl": { + "name": "pocketRpcUrl", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "indexerApiUrl": { + "name": "indexerApiUrl", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "updatedAtHeight": { + "name": "updatedAtHeight", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "privacyPolicy": { + "name": "privacyPolicy", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "application_settings_createdBy_users_identity_fk": { + "name": "application_settings_createdBy_users_identity_fk", + "tableFrom": "application_settings", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "application_settings_updatedBy_users_identity_fk": { + "name": "application_settings_updatedBy_users_identity_fk", + "tableFrom": "application_settings", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.import_supplier_attempts": { + "name": "import_supplier_attempts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "import_supplier_attempts_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "userIdentity": { + "name": "userIdentity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "providerIdentity": { + "name": "providerIdentity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "providerId": { + "name": "providerId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "nonce": { + "name": "nonce", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "import_attempt_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'initiated'" + }, + "importedSupplierAddresses": { + "name": "importedSupplierAddresses", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'::json" + }, + "errorMessage": { + "name": "errorMessage", + "type": "varchar(1024)", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "signedAt": { + "name": "signedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "submittedAt": { + "name": "submittedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "completedAt": { + "name": "completedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "import_supplier_attempts_userIdentity_users_identity_fk": { + "name": "import_supplier_attempts_userIdentity_users_identity_fk", + "tableFrom": "import_supplier_attempts", + "tableTo": "users", + "columnsFrom": [ + "userIdentity" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "import_supplier_attempts_providerId_providers_id_fk": { + "name": "import_supplier_attempts_providerId_providers_id_fk", + "tableFrom": "import_supplier_attempts", + "tableTo": "providers", + "columnsFrom": [ + "providerId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.nodes": { + "name": "nodes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "nodes_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "address": { + "name": "address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "node_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "stakeAmount": { + "name": "stakeAmount", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "balance": { + "name": "balance", + "type": "bigint", + "primaryKey": false, + "notNull": true + }, + "providerId": { + "name": "providerId", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "lastUpdatedHeight": { + "name": "lastUpdatedHeight", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "services": { + "name": "services", + "type": "jsonb", + "primaryKey": false, + "notNull": false, + "default": "'[]'::jsonb" + } + }, + "indexes": {}, + "foreignKeys": { + "nodes_providerId_providers_identity_fk": { + "name": "nodes_providerId_providers_identity_fk", + "tableFrom": "nodes", + "tableTo": "providers", + "columnsFrom": [ + "providerId" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "nodes_createdBy_users_identity_fk": { + "name": "nodes_createdBy_users_identity_fk", + "tableFrom": "nodes", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "nodes_address_unique": { + "name": "nodes_address_unique", + "nullsNotDistinct": false, + "columns": [ + "address" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.transactions_to_nodes": { + "name": "transactions_to_nodes", + "schema": "", + "columns": { + "transactionId": { + "name": "transactionId", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "nodeId": { + "name": "nodeId", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "transactions_to_nodes_transactionId_transactions_id_fk": { + "name": "transactions_to_nodes_transactionId_transactions_id_fk", + "tableFrom": "transactions_to_nodes", + "tableTo": "transactions", + "columnsFrom": [ + "transactionId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "transactions_to_nodes_nodeId_nodes_id_fk": { + "name": "transactions_to_nodes_nodeId_nodes_id_fk", + "tableFrom": "transactions_to_nodes", + "tableTo": "nodes", + "columnsFrom": [ + "nodeId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "transactions_to_nodes_transactionId_nodeId_pk": { + "name": "transactions_to_nodes_transactionId_nodeId_pk", + "columns": [ + "transactionId", + "nodeId" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.providers": { + "name": "providers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "providers_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "identity": { + "name": "identity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "visible": { + "name": "visible", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "fee": { + "name": "fee", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "feeType": { + "name": "feeType", + "type": "provider_fee", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "domains": { + "name": "domains", + "type": "text[]", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "regions": { + "name": "regions", + "type": "text[]", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "allowPublicStaking": { + "name": "allowPublicStaking", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "allowedStakers": { + "name": "allowedStakers", + "type": "varchar[]", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "status": { + "name": "status", + "type": "provider_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'unknown'" + }, + "minimumStake": { + "name": "minimumStake", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "operationalFunds": { + "name": "operationalFunds", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 5 + }, + "address_groups": { + "name": "address_groups", + "type": "jsonb", + "primaryKey": false, + "notNull": false, + "default": "'[]'::jsonb" + }, + "supplier_stats": { + "name": "supplier_stats", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "rewardAddresses": { + "name": "rewardAddresses", + "type": "varchar[]", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "providers_createdBy_users_identity_fk": { + "name": "providers_createdBy_users_identity_fk", + "tableFrom": "providers", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "providers_updatedBy_users_identity_fk": { + "name": "providers_updatedBy_users_identity_fk", + "tableFrom": "providers", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "providers_identity_unique": { + "name": "providers_identity_unique", + "nullsNotDistinct": false, + "columns": [ + "identity" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.transactions": { + "name": "transactions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "transactions_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "hash": { + "name": "hash", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "tx_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "tx_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "code": { + "name": "code", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "log": { + "name": "log", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "executionHeight": { + "name": "executionHeight", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "executionTimestamp": { + "name": "executionTimestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "verificationHeight": { + "name": "verificationHeight", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "verificationTimestamp": { + "name": "verificationTimestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "lastCoveredHeight": { + "name": "lastCoveredHeight", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "timeoutHeight": { + "name": "timeoutHeight", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "unavailableChecks": { + "name": "unavailableChecks", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "lastVerificationAt": { + "name": "lastVerificationAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "dependsOn": { + "name": "dependsOn", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "signedPayload": { + "name": "signedPayload", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "fromAddress": { + "name": "fromAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "unsignedPayload": { + "name": "unsignedPayload", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "estimatedFee": { + "name": "estimatedFee", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "consumedFee": { + "name": "consumedFee", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "providerFee": { + "name": "providerFee", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "typeProviderFee": { + "name": "typeProviderFee", + "type": "provider_fee", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "providerId": { + "name": "providerId", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "mw_transactions_verifier_sweep_idx": { + "name": "mw_transactions_verifier_sweep_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "lastVerificationAt", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "where": "\"hash\" IS NOT NULL", + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "transactions_dependsOn_transactions_id_fk": { + "name": "transactions_dependsOn_transactions_id_fk", + "tableFrom": "transactions", + "tableTo": "transactions", + "columnsFrom": [ + "dependsOn" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "transactions_providerId_providers_identity_fk": { + "name": "transactions_providerId_providers_identity_fk", + "tableFrom": "transactions", + "tableTo": "providers", + "columnsFrom": [ + "providerId" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "transactions_createdBy_users_identity_fk": { + "name": "transactions_createdBy_users_identity_fk", + "tableFrom": "transactions", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "users_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "identity": { + "name": "identity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_identity_unique": { + "name": "users_identity_unique", + "nullsNotDistinct": false, + "columns": [ + "identity" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.supplier_changes": { + "name": "supplier_changes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "supplier_changes_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "nodeId": { + "name": "nodeId", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "changeType": { + "name": "changeType", + "type": "supplier_change_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "serviceId": { + "name": "serviceId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "previous_value": { + "name": "previous_value", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "new_value": { + "name": "new_value", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "batchId": { + "name": "batchId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "acknowledgedAt": { + "name": "acknowledgedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "supplier_changes_nodeId_nodes_id_fk": { + "name": "supplier_changes_nodeId_nodes_id_fk", + "tableFrom": "supplier_changes", + "tableTo": "nodes", + "columnsFrom": [ + "nodeId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.chain_ids": { + "name": "chain_ids", + "schema": "public", + "values": [ + "pocket", + "pocket-beta", + "pocket-alpha", + "pocket-lego-testnet" + ] + }, + "public.import_attempt_status": { + "name": "import_attempt_status", + "schema": "public", + "values": [ + "initiated", + "signed", + "submitted", + "completed", + "failed", + "cancelled" + ] + }, + "public.node_status": { + "name": "node_status", + "schema": "public", + "values": [ + "staked", + "unstaked", + "unstaking" + ] + }, + "public.provider_fee": { + "name": "provider_fee", + "schema": "public", + "values": [ + "up_to", + "fixed" + ] + }, + "public.provider_status": { + "name": "provider_status", + "schema": "public", + "values": [ + "healthy", + "unhealthy", + "unknown", + "unreachable" + ] + }, + "public.role": { + "name": "role", + "schema": "public", + "values": [ + "admin", + "user", + "owner" + ] + }, + "public.supplier_change_type": { + "name": "supplier_change_type", + "schema": "public", + "values": [ + "service_added", + "service_removed", + "rev_share_changed" + ] + }, + "public.tx_status": { + "name": "tx_status", + "schema": "public", + "values": [ + "pending", + "success", + "failure", + "not_executed" + ] + }, + "public.tx_type": { + "name": "tx_type", + "schema": "public", + "values": [ + "Stake", + "Unstake", + "Upstake", + "Operational Funds" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/middleman/drizzle/meta/_journal.json b/apps/middleman/drizzle/meta/_journal.json index 8ff4c7c7..25575352 100644 --- a/apps/middleman/drizzle/meta/_journal.json +++ b/apps/middleman/drizzle/meta/_journal.json @@ -85,6 +85,34 @@ "when": 1775148048586, "tag": "0011_amazing_princess_powerful", "breakpoints": true + }, + { + "idx": 12, + "version": "7", + "when": 1781135826566, + "tag": "0012_amused_korg", + "breakpoints": true + }, + { + "idx": 13, + "version": "7", + "when": 1781142868201, + "tag": "0013_broken_outlaw_kid", + "breakpoints": true + }, + { + "idx": 14, + "version": "7", + "when": 1781142917523, + "tag": "0014_backfill_lastcovered", + "breakpoints": true + }, + { + "idx": 15, + "version": "7", + "when": 1781295983776, + "tag": "0015_fluffy_wonder_man", + "breakpoints": true } ] } \ No newline at end of file diff --git a/apps/middleman/src/actions/ImportSuppliers.ts b/apps/middleman/src/actions/ImportSuppliers.ts index 2de0ae13..d6fb2cd4 100644 --- a/apps/middleman/src/actions/ImportSuppliers.ts +++ b/apps/middleman/src/actions/ImportSuppliers.ts @@ -120,14 +120,22 @@ export async function CompleteImportAttempt( }) } + let importedAddresses: string[] = [] if (nodesToInsert.length > 0) { - await db + // The nodes.address unique constraint silently drops rows whose address already + // exists under ANOTHER user (getExistingNodes only sees this user's rows). + // Derive the completed set from what actually landed. + const inserted = await db .insert(nodesTable) .values(nodesToInsert) .onConflictDoNothing() + .returning({ address: nodesTable.address }) + importedAddresses = inserted.map((r) => r.address) + const dropped = nodesToInsert.filter((n) => !importedAddresses.includes(n.address)) + if (dropped.length > 0) { + console.warn('CompleteImportAttempt: addresses skipped (already owned by another account)', dropped.map((n) => n.address)) + } } - - const importedAddresses = nodesToInsert.map((s) => s.address) await importAttemptsDal.markCompleted(attemptId, importedAddresses) } diff --git a/apps/middleman/src/actions/Unstake.ts b/apps/middleman/src/actions/Unstake.ts index 388c3ce7..08f9c029 100644 --- a/apps/middleman/src/actions/Unstake.ts +++ b/apps/middleman/src/actions/Unstake.ts @@ -22,11 +22,13 @@ export interface UnstakeDurationData { * Calculates the estimated unstake duration in seconds * Formula: num_blocks_per_session * supplier_unbonding_period_sessions * (timeToBlock / 1000) */ -export async function GetUnstakeDuration(): Promise { +export async function GetUnstakeDuration(): Promise { const applicationSettings = await getApplicationSettings() if (!applicationSettings?.indexerApiUrl) { - throw new Error('GraphQL API URL not configured') + // Duration is display-only (estimated unbonding time). Without the indexer + // configured, return null instead of throwing so the unstake flow still works. + return null } const latestBlock = await getLatestBlock(applicationSettings.indexerApiUrl) diff --git a/apps/middleman/src/app/app/unstake/components/ReviewStep/index.tsx b/apps/middleman/src/app/app/unstake/components/ReviewStep/index.tsx index b1835843..9da35261 100644 --- a/apps/middleman/src/app/app/unstake/components/ReviewStep/index.tsx +++ b/apps/middleman/src/app/app/unstake/components/ReviewStep/index.tsx @@ -317,8 +317,10 @@ export function ReviewStep({ + {/* Gate only on the submit requirement (selected nodes). The nodes/duration + queries are display-only and must not block unstaking when they fail. */} /src/**/*.test.ts'], + moduleNameMapper: { '^@/(.*)$': '/src/$1' }, +} +export default config diff --git a/apps/provider-workflows/package.json b/apps/provider-workflows/package.json index ad0be4a1..e3ddf14d 100644 --- a/apps/provider-workflows/package.json +++ b/apps/provider-workflows/package.json @@ -8,7 +8,8 @@ "dev": "nodemon --signal SIGHUP", "build": "tsc --project ./tsconfig.json && tsc-alias -p ./tsconfig.json", "start": "node ./dist/src/worker.js", - "check-types": "tsc --noEmit" + "check-types": "tsc --noEmit", + "test": "jest" }, "dependencies": { "@igniter/logger": "workspace:*", @@ -16,6 +17,7 @@ "@igniter/temporal": "workspace:*", "@igniter/commons": "workspace:*", "@igniter/pocket": "workspace:*", + "@igniter/tx-verify": "workspace:*", "@igniter/domain": "workspace:*", "@pokt-foundation/pocketjs-provider": "2.2.1", "@pokt-foundation/pocketjs-signer": "2.2.1", @@ -35,9 +37,12 @@ "devDependencies": { "@igniter/eslint-config": "workspace:*", "@igniter/typescript-config": "workspace:*", + "@types/jest": "^30.0.0", "drizzle-kit": "0.31.4", + "jest": "^30.1.3", "nodemon": "^3.1.9", "npm-run-all": "4.1.5", + "ts-jest": "^29.4.4", "tsc-alias": "^1.8.15" }, "exports": { diff --git a/apps/provider-workflows/src/activities/index.ts b/apps/provider-workflows/src/activities/index.ts index 01f193be..9c596cc8 100644 --- a/apps/provider-workflows/src/activities/index.ts +++ b/apps/provider-workflows/src/activities/index.ts @@ -1,6 +1,7 @@ -import type {PocketBlockchain, StakeSupplierParams, Supplier} from '@igniter/pocket' -import {isSequenceMismatchError, parseExpectedSequence} from '@igniter/pocket' -import type {ApplicationSettings, InsertKey, KeyWithGroup, Service} from '@igniter/db/provider/schema' +import type {PocketBlockchain, StakeSupplierParams, Supplier, VerifyOutcome, SupplierEffect} from '@igniter/pocket' +import type {ApplicationSettings, InsertKey, Key, KeyWithGroup, Service, Transaction} from '@igniter/db/provider/schema' +import type {VerificationDecision} from '@igniter/tx-verify' +import {TX_EXPIRATION_BLOCKS} from '@igniter/tx-verify' import {ApplicationFailure, log} from '@temporalio/activity' import DAL from '@/lib/dal/DAL' import {KeysMinMax} from '@/lib/dal/keys' @@ -11,6 +12,8 @@ import {redactStakeSupplierParams} from "@/lib/redactors"; import {getExpectedServicesFromKey} from '@igniter/domain/provider/utils' import { ServiceConfigUpdate } from '@igniter/pocket/proto/pocket/shared/supplier' +const errInfo = (e: unknown) => e instanceof Error ? { message: e.message, stack: e.stack } : e + export type Height = number export type LoadKeysInRangeParams = { @@ -46,7 +49,49 @@ export type GovernanceSyncResult = { disabled: number; } -export const providerActivities = (dal: DAL, pocketRpcClient: PocketBlockchain) => ({ +/** Number of consecutive unavailable checks between critical alerts for a chronically-unverifiable tx. */ +const VERIFY_UNAVAILABLE_ALERT_THRESHOLD = Number(process.env.VERIFY_UNAVAILABLE_ALERT_THRESHOLD ?? 50) + +/** Per-sweep hash-scan window, matching the on-chain mempool expiration window. */ +// TX_EXPIRATION_BLOCKS imported from @igniter/tx-verify above + +/** + * Maps a provider transaction + its key into the expected on-chain supplier effect. + * Returns null when the tx has no supplier-state path so the verifier skips the + * supplier verification path for it. + */ +export function supplierEffectFromKey( + tx: Transaction, + key: Pick, +): { operatorAddress: string; effect: SupplierEffect } | null { + if (tx.type === TransactionType.Stake) { + // Goal-state per remediation reason: + // - OwnerInitialStake: trigger condition is supplier-present-with-ZERO-services + // (upsertSupplierStatus), so the goal is services present — NOT mere existence. + // - ServiceMismatch / AddressGroupMigration: a config-update over an existing + // supplier; existence proves nothing about THIS tx → hash-only (null). + if (tx.reason === RemediationHistoryEntryReason.OwnerInitialStake) { + return { + operatorAddress: key.address, + effect: { kind: 'stake-services-present', ownerAddress: key.stakeOwner ?? '' }, + } + } + return null + } + + if (tx.type === TransactionType.Unstake) { + return { + operatorAddress: key.address, + effect: { kind: 'unstake', minSessionEndHeight: tx.executionHeight ?? 0 }, + } + } + + return null +} + + +export const providerActivities = (dal: DAL, pocketRpcClient: PocketBlockchain) => { + const activities = { async syncDelegatorsFromGovernance(): Promise { const settings = await dal.settings.loadSettings() if (!settings) { @@ -102,6 +147,113 @@ export const providerActivities = (dal: DAL, pocketRpcClient: PocketBlockchain) async getLatestBlock(): Promise { return pocketRpcClient.getHeight() }, + + // --------------------------------------------------------------------------- + // Canonical lifecycle activities (Task 4) + // --------------------------------------------------------------------------- + + /** Read a single transaction row by id — used by child workflow to inspect state. */ + async getTransaction(transactionId: number) { + return dal.transactions.getTransaction(transactionId) + }, + + /** Dispatcher queue: all pending rows (with or without hash). */ + async listPending() { + return dal.transactions.listPending() + }, + + /** + * Parent activity: build frozen params + create the INTENT row. + * Returns the new tx id, or null if a pending row already exists for this key + * (the (key_id) WHERE pending unique index enforces mutual exclusion). + */ + async createIntentTx(p: { keyAddress: string; reasons: RemediationHistoryEntryReason[]; params: StakeSupplierParams }): Promise { + const key = await dal.keys.loadKey(p.keyAddress) + if (!key) throw ApplicationFailure.nonRetryable(`createIntentTx: key not found for ${p.keyAddress}`, 'not_found') + return dal.transactions.createIntent({ + keyId: key.id, + keyAddress: key.address, + type: TransactionType.Stake, + reason: p.reasons[0] ?? null, + trigger: TransactionTrigger.Automatic, + executionHeight: null, + params: JSON.stringify(p.params), + reasons: JSON.stringify(p.reasons), + }) + }, + + /** + * Child activity: sign (unordered) the row's frozen params; persist bytes + hash + timeout + * BEFORE broadcast so re-broadcast is idempotent. + */ + async signSupplierTx(transactionId: number): Promise { + const txn = await dal.transactions.getTransaction(transactionId) + if (!txn?.params) throw new Error(`signSupplierTx: tx ${transactionId} missing params`) + const params: StakeSupplierParams = JSON.parse(txn.params) + const head = await pocketRpcClient.getHeight() + let signed: Awaited> + try { + signed = await pocketRpcClient.signSupplierTx(params) + } catch (err: any) { + const msg: string = err?.message ?? String(err) + if (msg.includes("does not exist on chain")) { + // Signer account never funded — will never be signable. Abandon the intent + // so the key's pending-unique index is freed for the next remediation cycle. + await dal.transactions.abandonIntent(transactionId, { + message: 'sign failed: signer account not found on chain', + }) + return + } + throw err + } + await dal.transactions.recordSigned(transactionId, { + signedPayload: signed.signedPayload, + hash: signed.transactionHash, + executionHeight: head, + timeoutTimestamp: signed.timeoutTimestamp, + }) + }, + + /** + * Child activity: broadcast the persisted signed bytes (idempotent re-broadcast). + * A hard CheckTx rejection (res.rejected===true) → terminal failure immediately. + * A RPC timeout or other transient failure (res.rejected===false/undefined) → do nothing; + * the tx may still land on-chain and the verifier resolves it via chain-time bound. + */ + async broadcastSupplierTx(transactionId: number): Promise { + const txn = await dal.transactions.getTransaction(transactionId) + if (!txn?.signedPayload) throw new Error(`broadcastSupplierTx: tx ${transactionId} missing signedPayload`) + const res = await pocketRpcClient.broadcastSupplierTx(txn.signedPayload) + if (res.rejected) { + // Hard CheckTx reject (BroadcastTxError / non-zero code) — tx will never land. + // Terminal failure; remediation re-detects on next sweep. + await dal.transactions.claimTerminalTransition(transactionId, TransactionStatus.Failure, { + code: res.code ?? undefined, + message: res.message ?? 'broadcast rejected', + }) + } + // On timeout or other non-rejected failure: do nothing — verifier owns resolution. + }, + + /** + * Returns true when the signed tx has expired per CHAIN block time (not wall-clock). + * Uses getLatestBlockTime() so the comparison is chain-sourced, eliminating + * clock-skew split-brain. + */ + async isSignedTxExpired(transactionId: number): Promise { + const txn = await dal.transactions.getTransaction(transactionId) + if (!txn?.timeoutTimestamp) return false + const chainTime = await pocketRpcClient.getLatestBlockTime() + if (!chainTime) return false // RPC down → never declare expiry + return chainTime.getTime() > txn.timeoutTimestamp.getTime() + }, + + /** + * Clear the stale signed tx so the ExecuteTransaction child re-signs fresh (A3 re-sign branch). + */ + async clearSignedTx(transactionId: number): Promise { + await dal.transactions.clearSigned(transactionId) + }, /** * Counts the number of keys in the database and return the min and max id. * @returns KeysMinMax @@ -509,7 +661,7 @@ export const providerActivities = (dal: DAL, pocketRpcClient: PocketBlockchain) } catch (e) { log.warn('remediateSupplier: Update Supplier failed while clearing OwnerInitialStake!', { params, - error: e, + error: errInfo(e), }) throw ApplicationFailure.retryable( `Failed while updating the supplier status for ${params.address}.`, @@ -556,116 +708,211 @@ export const providerActivities = (dal: DAL, pocketRpcClient: PocketBlockchain) ) } - log.debug('remediateSupplier: Executing stake transaction', { + log.debug('remediateSupplier: Building stake intent', { stakeParams: redactStakeSupplierParams(stakeParams), servicesToStakeCount: stakeParams.services.length, }) - let txResult = await pocketRpcClient.stakeSupplier(stakeParams) - - // Retry once with the expected sequence if we hit a sequence mismatch error - if (!txResult.success && txResult.message && isSequenceMismatchError(txResult.message)) { - const expectedSequence = parseExpectedSequence(txResult.message) - log.warn('remediateSupplier: Sequence mismatch detected', { - address: params.address, - originalError: txResult.message, - parsedExpectedSequence: expectedSequence, - }) - if (expectedSequence != null) { - log.info('remediateSupplier: Retrying stake transaction with expected sequence', { - address: params.address, - expectedSequence, - }) - txResult = await pocketRpcClient.stakeSupplier(stakeParams, expectedSequence) - log.info('remediateSupplier: Retry stake transaction result', { - address: params.address, - success: txResult.success, - code: txResult.code, - message: txResult.message, - }) - // If the retry also fails with a sequence mismatch, throw so Temporal can re-attempt - // with a fresh sequence fetch. This handles cases where the sequence advances by 2+ - // between attempts (e.g., concurrent remediation activities for the same owner). - if (!txResult.success && txResult.message && isSequenceMismatchError(txResult.message)) { - throw ApplicationFailure.retryable( - `remediateSupplier: Sequence mismatch persisted after retry for ${params.address}: ${txResult.message}`, - ) - } - } else { - log.error('remediateSupplier: Could not parse expected sequence from error message, skipping retry', { - address: params.address, - originalError: txResult.message, - }) - } + const reasons = [ownerInitialStakeEntry, serviceMismatchEntry, addressGroupMigrationEntry] + .filter(Boolean).map((e) => e!.reason) + const created = await activities.createIntentTx({ keyAddress: key.address, reasons, params: stakeParams }) + if (created === null) { + log.info('remediateSupplier: pending tx already exists for key, skipping', { address: params.address }) + return } + log.info('remediateSupplier: INTENT created; dispatcher will broadcast+verify', { address: params.address, txId: created }) + return { success: true, message: 'Stake intent recorded; pending broadcast.' } + }, - log.debug('remediateSupplier: Stake transaction result', {txResult}) + /** + * The verifier's queue: pending transactions that have been broadcast (have a hash). + */ + async listPendingWithHash() { + const txs = await dal.transactions.listPendingWithHash() + return txs.map(({ id, executionHeight }) => ({ id, executionHeight })) + }, - // Record the transaction - try { - const activeEntry = ownerInitialStakeEntry || serviceMismatchEntry || addressGroupMigrationEntry - const isManual = activeEntry?.message?.includes('requested by operator') ?? false - - await dal.transactions.insert({ - keyId: key.id, - keyAddress: key.address, - type: TransactionType.Stake, - status: txResult.success ? TransactionStatus.Success : TransactionStatus.Failure, - reason: activeEntry?.reason ?? null, - trigger: isManual ? TransactionTrigger.Manual : TransactionTrigger.Automatic, - hash: txResult.transactionHash ?? null, - code: txResult.code ?? null, - message: txResult.message ?? null, - executionHeight: params.height, - }) - } catch (e) { - // Transaction recording is best-effort — don't fail remediation if it errors - log.warn('remediateSupplier: Failed to record transaction', { address: params.address, error: e }) + /** + * Verifies a broadcast tx by hash, scanning from one block past its last covered + * height (or its execution height on the first sweep). Maps the pocket tri-state + * result down to the minimal shape the pure decision logic consumes. + * + * Provider txs are unordered: maxBlocks=12 (spec decision-6). The absent result + * now carries coveredBlockTime (chain block time at coveredUpToHeight) so callers + * can supply chainTimeAtCoverage to decideVerification without a wall-clock. + */ + async verifyTxHash(transactionId: number): Promise & { chainTimeAtCoverage?: Date | null }> { + const txn = await dal.transactions.getTransaction(transactionId) + if (!txn?.hash) { + throw new Error('verifyTxHash: tx missing hash') } - - const update: Partial = { - lastUpdatedHeight: params.height, - balanceUpokt: BigInt(balance), + const startHeight = txn.lastCoveredHeight != null ? txn.lastCoveredHeight + 1 : (txn.executionHeight ?? 0) + const out = await pocketRpcClient.verifyTransaction(txn.hash, startHeight, 12) + if (out.status === 'absent') { + return { ...out, chainTimeAtCoverage: out.coveredBlockTime ?? null } } + if (out.status !== 'confirmed') return out + // gasUsed serialized as a string: a bigint cannot cross the Temporal activity + // boundary (default payload converter cannot encode BigInt). + return { + status: 'confirmed', + data: { success: out.data.success, code: out.data.code, gasUsed: out.data.gasUsed.toString() }, + } + }, - if (!txResult.success) { - log.debug(`remediateSupplier: Stake transaction failed for: ${key.address} ${JSON.stringify(txResult)}`) - update.state = KeyState.RemediationFailed - // Keep the remediation entry so the next cycle can retry - } else { - update.state = KeyState.Staked - // Tx succeeded — clear the remediation entry that triggered this - const reasonToClear = ownerInitialStakeEntry?.reason || serviceMismatchEntry?.reason || addressGroupMigrationEntry?.reason - if (reasonToClear) { - update.remediationHistory = remediationHistory.filter((rh) => rh.reason !== reasonToClear) + /** + * Verifies a broadcast tx by its expected on-chain supplier goal-state. Returns null for + * tx types with no supplier-state path (e.g. ServiceMismatch/AddressGroupMigration stake txs, + * or non-supplier tx types) so the decision logic treats the supplier path as inapplicable. + * Maps pocket's tri-state result into SupplierPathOutcome for decide v2. + */ + async verifySupplierEffect(transactionId: number): Promise { + const txn = await dal.transactions.getTransaction(transactionId) + if (!txn) { + throw new Error('verifySupplierEffect: tx not found') + } + const key = await dal.keys.loadKey(txn.keyAddress) + if (!key) { + // Key removed mid-flight (deterministic — never recovers). Do NOT throw: a throw here + // rejects this tx in the sweep, and a sweep where every tx rejects makes + // VerifyPendingTransactions fail, which under ScheduleOverlapPolicy.SKIP would stall + // all future sweeps. Returning null routes the decision to the hash + timeout bound + // (→ success if the hash landed, else a clean failure once the timeout passes). + log.warn(`verifySupplierEffect: key not found for tx ${transactionId} (${txn.keyAddress}); falling back to hash-only verification`) + return null + } + const parsed = supplierEffectFromKey(txn, key) + if (!parsed) return null + + // OwnerInitialStake: deep-compare intended vs on-chain service config rather than + // checking mere presence (services.length > 0). A supplier with stale services from + // a prior stake would satisfy the weak check; this ensures the INTENDED config applied. + if (parsed.effect.kind === 'stake-services-present') { + let supplier: import('@igniter/pocket').Supplier | null + try { + supplier = await pocketRpcClient.getSupplier(parsed.operatorAddress) + } catch { + return { status: 'unavailable' } + } + if (!supplier || supplier.ownerAddress !== parsed.effect.ownerAddress) { + return { status: 'absent', absentOperators: [parsed.operatorAddress] } } + const intended = getExpectedServicesFromKey(key) + const compare = new CompareSupplierServiceConfigHandler() + // Check active services + const activeMatch = compare.execute({ + serviceConfigSetA: intended, + serviceConfigSetB: supplier.services ?? [], + }).isEqual + if (activeMatch) return { status: 'confirmed' } + // Check pending activation entries in serviceConfigHistory + const pendingMatch = (supplier.serviceConfigHistory ?? []).some((entry: ServiceConfigUpdate) => { + if (!entry.service) return false + return compare.execute({ + serviceConfigSetA: intended, + serviceConfigSetB: [entry.service], + }).isEqual + }) + if (pendingMatch) return { status: 'confirmed' } + return { status: 'absent', absentOperators: [parsed.operatorAddress] } } - log.debug('remediateSupplier: Updating supplier', { params, update }) // NOTE: adding the update could result in an error due to BIGINT - try { - await dal.keys.updateKey(params.address, update, params.height) - log.debug('remediateSupplier: Update Supplier done!', { params }) - } catch (e) { - log.warn('remediateSupplier: Update Supplier failed!', { params, error: e }) - throw ApplicationFailure.retryable( - `Failed while updating the supplier status for ${params.address}. Key state: ${update.state}. Stake tx success: ${txResult.success}, message: ${txResult.message}`, - 'db_update_failed', - ) + const out = await pocketRpcClient.verifySupplierEffect(parsed.operatorAddress, parsed.effect) + if (out.status === 'confirmed') return { status: 'confirmed' } + if (out.status === 'absent') return { status: 'absent', absentOperators: [parsed.operatorAddress] } + return { status: 'unavailable' } + }, + + /** + * Failure-bound evidence for a provider tx. Provider txs are now UNORDERED: + * the failure bound is chain-block-time vs txTimeoutTimestamp (not height). + * chainTimeAtCoverage is passed in from the verifyTxHash result to avoid a + * separate RPC call and to keep the comparison to chain time (not wall-clock). + */ + async checkTxValidityEvidence(transactionId: number, chainTimeAtCoverage?: Date | null): Promise<{ + txTimeoutHeight: number | null + txTimeoutTimestamp: Date | null + sequence: { consumed: boolean; observedAtHeight: number } | null + chainTimeAtCoverage: Date | null + }> { + const txn = await dal.transactions.getTransaction(transactionId) + return { + txTimeoutHeight: null, + txTimeoutTimestamp: txn?.timeoutTimestamp ?? null, + sequence: null, + chainTimeAtCoverage: chainTimeAtCoverage ?? null, } + }, - if (!txResult.success) { - log.warn('remediateSupplier: Stake transaction failed', { params, txResult }) - throw ApplicationFailure.nonRetryable( - `Remediation transaction failed for ${params.address}. Key state: ${update.state}. Tx code: ${txResult.code}, message: ${txResult.message}`, - 'stake_tx_failed', - ) + /** + * Applies a verification decision computed by the pure `decideVerification` (v2 shape). + * Pending → record progress (coverage/unavailable decay) + maybe alert on chronic unavailability. + * Terminal → run the provider key-state effect FIRST (keyed off goal-state effects, not tx outcome), + * then atomically CAS the tx to its terminal status. Effects-before-CAS so a failure mid-effect + * re-sweeps and re-runs the idempotent effect instead of losing it to a lost CAS. + */ + async applyVerificationDecision(transactionId: number, decision: VerificationDecision): Promise { + if (decision.tx === 'pending') { + await dal.transactions.recordVerificationProgress(transactionId, { + lastCoveredHeight: decision.newLastCoveredHeight, + incUnavailable: decision.incUnavailable, + }) + if (decision.incUnavailable) await maybeAlertUnavailable(transactionId) + return } - log.info('remediateSupplier: Execution finished', { params }) + const txn = await dal.transactions.getTransaction(transactionId) + if (!txn) return - return { - success: true, - message: 'Remediation completed successfully.', + // Effects keyed off GOAL-STATE, not tx outcome: a tx that failed on-chain while a + // sibling achieved the goal must NOT drag the key to RemediationFailed. + if (decision.effects !== 'none') { + await flipKeyForTx(txn, decision.effects) } + + const status = decision.tx === 'success' ? TransactionStatus.Success : TransactionStatus.Failure + await dal.transactions.claimTerminalTransition(transactionId, status, { + code: decision.code, + message: decision.tx === 'success' ? 'verified' + : decision.effects === 'apply-success' ? 'tx failed on-chain; goal met by sibling tx' + : 'verification negative (validity bound covered, no effect)', + }) + }, } -}) + + /** + * Provider terminal effect: flips the key state for a verified stake tx. + * Keyed off goal-state effects (not raw tx outcome) so a tx that failed on-chain + * while a sibling achieved the goal still flips to Staked (not RemediationFailed). + * State-CAS: keys that moved to Unstaking/Unstaked/AttentionNeeded since broadcast + * must NOT be overwritten — those transitions take priority. + */ + async function flipKeyForTx( + txn: Transaction, + effects: 'apply-success' | 'apply-failure', + ): Promise { + const blockedStates = [KeyState.Unstaking, KeyState.Unstaked, KeyState.AttentionNeeded] + const flipped = effects === 'apply-success' + ? await dal.keys.flipState(txn.keyAddress, KeyState.Staked, { notFromStates: blockedStates, removeEntryReason: txn.reason ?? undefined }) + : await dal.keys.flipState(txn.keyAddress, KeyState.RemediationFailed, { notFromStates: blockedStates }) + if (!flipped) { + log.info('flipKeyForTx: key state moved on since broadcast; flip skipped', { keyAddress: txn.keyAddress, effects }) + } + } + + /** + * Reads the tx and emits a critical log when its unavailable-check counter crosses a + * multiple of the alert threshold. No status change — operator-attention only. + */ + async function maybeAlertUnavailable(transactionId: number): Promise { + const txn = await dal.transactions.getTransaction(transactionId) + if (txn && txn.unavailableChecks > 0 && txn.unavailableChecks % VERIFY_UNAVAILABLE_ALERT_THRESHOLD === 0) { + log.error( + 'TX unverifiable: RPC repeatedly unavailable — operator attention needed', + { transactionId, unavailableChecks: txn.unavailableChecks }, + ) + } + } + + return activities +} diff --git a/apps/provider-workflows/src/activities/supplierEffect.test.ts b/apps/provider-workflows/src/activities/supplierEffect.test.ts new file mode 100644 index 00000000..454ffcae --- /dev/null +++ b/apps/provider-workflows/src/activities/supplierEffect.test.ts @@ -0,0 +1,255 @@ +/** + * Unit tests for supplierEffectFromKey v2 and Keys.flipState. + * Task 7 / PR #308 verification hardening. + */ + +// Mock heavy external dependencies that aren't relevant to these unit tests +jest.mock('@igniter/pocket', () => ({})) +jest.mock('@temporalio/activity', () => ({ + ApplicationFailure: { nonRetryable: jest.fn(), retryable: jest.fn() }, + log: { info: jest.fn(), warn: jest.fn(), error: jest.fn(), debug: jest.fn() }, +})) +jest.mock('@igniter/domain/provider/operations', () => ({ + BuildSupplierServiceConfigHandler: jest.fn(), + CompareSupplierServiceConfigHandler: jest.fn(), +})) +jest.mock('@igniter/domain/provider/utils', () => ({ + getExpectedServicesFromKey: jest.fn(), +})) +jest.mock('@/lib/utils', () => ({ + addOrUpdateRemediationHistory: jest.fn(), +})) +jest.mock('@/lib/redactors', () => ({ + redactStakeSupplierParams: jest.fn(), +})) +jest.mock('@igniter/pocket/proto/pocket/shared/supplier', () => ({ + ServiceConfigUpdate: {}, +})) + +import { supplierEffectFromKey } from './index' +import { KeyState, RemediationHistoryEntryReason, TransactionType, TransactionStatus, TransactionTrigger } from '@igniter/db/provider/enums' +import type { Transaction } from '@igniter/db/provider/schema' + +// Minimal transaction fixture +function makeTx(overrides: Partial> = {}): Transaction { + return { + id: 1, + keyId: 10, + keyAddress: 'pokt1addr', + type: TransactionType.Stake, + status: TransactionStatus.Pending, + trigger: TransactionTrigger.Automatic, + reason: null, + hash: null, + code: null, + message: null, + executionHeight: 1000, + lastCoveredHeight: null, + unavailableChecks: 0, + lastVerificationAt: null, + createdAt: new Date(), + updatedAt: new Date(), + ...overrides, + } as unknown as Transaction +} + +const key = { address: 'pokt1addr', stakeOwner: 'pokt1owner' } + +describe('supplierEffectFromKey v2', () => { + it('OwnerInitialStake → stake-services-present effect', () => { + const tx = makeTx({ type: TransactionType.Stake, reason: RemediationHistoryEntryReason.OwnerInitialStake }) + const result = supplierEffectFromKey(tx, key) + expect(result).not.toBeNull() + expect(result!.operatorAddress).toBe('pokt1addr') + expect(result!.effect.kind).toBe('stake-services-present') + expect((result!.effect as unknown as { kind: 'stake-services-present'; ownerAddress: string }).ownerAddress).toBe('pokt1owner') + }) + + it('ServiceMismatch stake tx → null (hash-only; existence proves nothing for config update)', () => { + const tx = makeTx({ type: TransactionType.Stake, reason: RemediationHistoryEntryReason.ServiceMismatch }) + expect(supplierEffectFromKey(tx, key)).toBeNull() + }) + + it('AddressGroupMigration stake tx → null (hash-only)', () => { + const tx = makeTx({ type: TransactionType.Stake, reason: RemediationHistoryEntryReason.AddressGroupMigration }) + expect(supplierEffectFromKey(tx, key)).toBeNull() + }) + + it('Stake tx with no reason → null (conservative: unknown reason cannot assert goal-state)', () => { + const tx = makeTx({ type: TransactionType.Stake, reason: null }) + expect(supplierEffectFromKey(tx, key)).toBeNull() + }) + + it('Unstake tx → unstake effect with minSessionEndHeight from executionHeight', () => { + const tx = makeTx({ type: TransactionType.Unstake, executionHeight: 5000 }) + const result = supplierEffectFromKey(tx, key) + expect(result).not.toBeNull() + expect(result!.effect.kind).toBe('unstake') + expect((result!.effect as { kind: 'unstake'; minSessionEndHeight: number }).minSessionEndHeight).toBe(5000) + }) + + it('Unstake tx with null executionHeight → minSessionEndHeight 0', () => { + const tx = makeTx({ type: TransactionType.Unstake, executionHeight: null }) + const result = supplierEffectFromKey(tx, key) + expect(result!.effect.kind).toBe('unstake') + expect((result!.effect as { kind: 'unstake'; minSessionEndHeight: number }).minSessionEndHeight).toBe(0) + }) +}) + +// ---- verifySupplierEffect deep-compare tests (Task 15) ---- + +import { providerActivities } from './index' +import { CompareSupplierServiceConfigHandler } from '@igniter/domain/provider/operations' +import { getExpectedServicesFromKey } from '@igniter/domain/provider/utils' +import type { KeyWithGroup } from '@igniter/db/provider/schema' + +const OPERATOR = 'pokt1operator' +const OWNER = 'pokt1owner' + +const intendedService = { serviceId: 'svc1', endpoints: [{ url: 'https://example.com', rpcType: 1, configs: [] }], revShare: [{ address: OWNER, revSharePercentage: 100 }] } +const staleService = { serviceId: 'stale', endpoints: [{ url: 'https://stale.com', rpcType: 1, configs: [] }], revShare: [{ address: OWNER, revSharePercentage: 100 }] } + +function makeActivities(getSupplierResult: 'throw' | null | object) { + const mockCompare = jest.fn().mockReturnValue({ isEqual: false }) + ;(CompareSupplierServiceConfigHandler as jest.Mock).mockImplementation(() => ({ execute: mockCompare })) + ;(getExpectedServicesFromKey as jest.Mock).mockReturnValue([intendedService]) + + const mockDal = { + transactions: { + getTransaction: jest.fn().mockResolvedValue({ + id: 1, keyAddress: OPERATOR, type: TransactionType.Stake, + reason: RemediationHistoryEntryReason.OwnerInitialStake, + hash: 'abc', executionHeight: 1000, status: 'pending', + }), + }, + keys: { + loadKey: jest.fn().mockResolvedValue({ + address: OPERATOR, + stakeOwner: OWNER, + group: { services: [] }, + } as unknown as KeyWithGroup), + }, + } as any + + const mockPocket = { + getSupplier: getSupplierResult === 'throw' + ? jest.fn().mockRejectedValue(new Error('rpc error')) + : jest.fn().mockResolvedValue(getSupplierResult), + verifySupplierEffect: jest.fn(), + } as any + + return { activities: providerActivities(mockDal, mockPocket), mockCompare } +} + +describe('verifySupplierEffect — OwnerInitialStake deep-compare (Task 15)', () => { + it('(a) intended config matches active services → confirmed', async () => { + const { activities, mockCompare } = makeActivities({ + ownerAddress: OWNER, + services: [intendedService], + serviceConfigHistory: [], + }) + // First compare (active services) returns isEqual: true + mockCompare.mockReturnValueOnce({ isEqual: true }) + const result = await activities.verifySupplierEffect(1) + expect(result).toEqual({ status: 'confirmed' }) + }) + + it('(b) supplier has stale/different services → absent', async () => { + const { activities, mockCompare } = makeActivities({ + ownerAddress: OWNER, + services: [staleService], + serviceConfigHistory: [], + }) + // All compares return isEqual: false (stale) + mockCompare.mockReturnValue({ isEqual: false }) + const result = await activities.verifySupplierEffect(1) + expect(result).toEqual({ status: 'absent', absentOperators: [OPERATOR] }) + }) + + it('(c) active services empty but pending serviceConfigHistory entry matches → confirmed', async () => { + const { activities, mockCompare } = makeActivities({ + ownerAddress: OWNER, + services: [], + serviceConfigHistory: [{ service: intendedService, activationHeight: 1010, deactivationHeight: 0 }], + }) + // First compare (active, empty array) → not equal; second compare (history entry) → equal + mockCompare + .mockReturnValueOnce({ isEqual: false }) // active services check + .mockReturnValueOnce({ isEqual: true }) // pending history check + const result = await activities.verifySupplierEffect(1) + expect(result).toEqual({ status: 'confirmed' }) + }) + + it('(d) owner mismatch → absent', async () => { + const { activities } = makeActivities({ + ownerAddress: 'pokt1differentowner', + services: [intendedService], + serviceConfigHistory: [], + }) + const result = await activities.verifySupplierEffect(1) + expect(result).toEqual({ status: 'absent', absentOperators: [OPERATOR] }) + }) + + it('getSupplier throws → unavailable', async () => { + const { activities } = makeActivities('throw') + const result = await activities.verifySupplierEffect(1) + expect(result).toEqual({ status: 'unavailable' }) + }) + + it('key not found (removed mid-flight) → null, not a throw (hash-only fallback; avoids wedging the sweep)', async () => { + const mockDal = { + transactions: { + getTransaction: jest.fn().mockResolvedValue({ + id: 1, keyAddress: OPERATOR, type: TransactionType.Stake, + reason: RemediationHistoryEntryReason.OwnerInitialStake, + hash: 'abc', executionHeight: 1000, status: 'pending', + }), + }, + keys: { loadKey: jest.fn().mockResolvedValue(null) }, + } as any + const mockPocket = { getSupplier: jest.fn(), verifySupplierEffect: jest.fn() } as any + const activities = providerActivities(mockDal, mockPocket) + await expect(activities.verifySupplierEffect(1)).resolves.toBeNull() + }) +}) + +// ---- Keys.flipState tests ---- + +import Keys from '@/lib/dal/keys' + +function makeDbClient(updatedRows: { id: number }[]) { + return { + db: { + update: () => ({ + set: () => ({ + where: () => ({ + returning: async () => updatedRows, + }), + }), + }), + }, + } as any +} + +const mockLogger = { + debug: jest.fn(), + info: jest.fn(), + warn: jest.fn(), + error: jest.fn(), +} as any + +describe('Keys.flipState', () => { + it('returns true when a row was updated', async () => { + const keys = new Keys(makeDbClient([{ id: 1 }]), mockLogger) + const result = await keys.flipState('pokt1addr', KeyState.Staked, { notFromStates: [KeyState.Unstaking] }) + expect(result).toBe(true) + }) + + it('returns false when 0 rows updated (state was in blocked set → no-op CAS)', async () => { + const keys = new Keys(makeDbClient([]), mockLogger) + const result = await keys.flipState('pokt1addr', KeyState.RemediationFailed, { + notFromStates: [KeyState.Unstaking, KeyState.Unstaked, KeyState.AttentionNeeded], + }) + expect(result).toBe(false) + }) +}) diff --git a/apps/provider-workflows/src/bootstrap.ts b/apps/provider-workflows/src/bootstrap.ts index 70ceda0b..4bbfe456 100644 --- a/apps/provider-workflows/src/bootstrap.ts +++ b/apps/provider-workflows/src/bootstrap.ts @@ -6,7 +6,7 @@ import { import { Duration } from '@temporalio/common' import { Logger } from '@igniter/logger' import Long from 'long' -import { Client } from '@temporalio/client' +import { Client, ScheduleOverlapPolicy } from '@temporalio/client' import { RemediationHistoryEntryReason } from "@igniter/db/provider/enums" enum ScheduledWorkflowType { @@ -15,6 +15,8 @@ enum ScheduledWorkflowType { SupplierRemediation = 'SupplierRemediation', SupplierInitialStake = 'SupplierInitialStake', SupplierAddressGroupMigration = 'SupplierAddressGroupMigration', + VerifyPendingTransactions = 'VerifyPendingTransactions', + ExecutePendingTransactions = 'ExecutePendingTransactions', } const ScheduledWorkflowConfig: Record< @@ -57,6 +59,18 @@ const ScheduledWorkflowConfig: Record< }], envVar: 'SCHEDULE_SUPPLIER_ADDRESS_GROUP_MIGRATION_INTERVAL', }, + [ScheduledWorkflowType.VerifyPendingTransactions]: { + workflowType: 'VerifyPendingTransactions', + interval: '30s', + args: [], + envVar: 'SCHEDULE_VERIFY_PENDING_TX_INTERVAL', + }, + [ScheduledWorkflowType.ExecutePendingTransactions]: { + workflowType: 'ExecutePendingTransactions', + interval: '10s', + args: [], + envVar: 'SCHEDULE_EXECUTE_PENDING_TX_INTERVAL', + }, } function parseDurationToMs(duration: string): number { @@ -134,6 +148,7 @@ async function bootstrapScheduledWorkflows(client: Client, config: TemporalConfi spec: { intervals: [{ every: interval as Duration }], }, + policies: { overlap: ScheduleOverlapPolicy.SKIP }, })) logger.info({ workflowType }, 'Scheduled workflow updated successfully') } else { @@ -154,6 +169,7 @@ async function bootstrapScheduledWorkflows(client: Client, config: TemporalConfi spec: { intervals: [{ every: interval as Duration }], }, + policies: { overlap: ScheduleOverlapPolicy.SKIP }, }) logger.info({ workflowType, interval }, 'Scheduled workflow created successfully') } catch (createError: any) { diff --git a/apps/provider-workflows/src/lib/dal/keys.ts b/apps/provider-workflows/src/lib/dal/keys.ts index 323b683d..b4773718 100644 --- a/apps/provider-workflows/src/lib/dal/keys.ts +++ b/apps/provider-workflows/src/lib/dal/keys.ts @@ -171,4 +171,37 @@ export default class Keys { this.logger.debug('updateKey: Execution Finished', {address, update, lastUpdatedHeight}) return result } + + /** + * Terminal verifier flip: a state-machine edge, NOT a chain-sync write — so no + * lastUpdatedHeight guard (it made the flip a guaranteed silent no-op once any + * status sweep advanced the key). Instead the precondition is the state set the + * verifier owns: a key that moved to Unstaking/Unstaked/AttentionNeeded since + * broadcast must NOT be dragged back. remediationHistory entry removal is done + * in SQL so a concurrently-added entry is never lost. + * Returns true iff the flip took effect (1 row updated). + */ + async flipState( + address: string, + toState: KeyState, + opts: { notFromStates: KeyState[]; removeEntryReason?: string }, + ): Promise { + const setFields: Record = { state: toState } + if (opts.removeEntryReason) { + // remediationHistory is a `json` column (not jsonb); cast to jsonb for the + // array ops, then back to json for assignment. + setFields['remediationHistory'] = sql`COALESCE(( + SELECT jsonb_agg(e) FROM jsonb_array_elements(${keysTable.remediationHistory}::jsonb) e + WHERE e->>'reason' <> ${opts.removeEntryReason} + ), '[]'::jsonb)::json` + } + const rows = await this.dbClient.db.update(keysTable) + .set(setFields as Partial) + .where(and( + eq(keysTable.address, address), + notInArray(keysTable.state, opts.notFromStates), + )) + .returning({ id: keysTable.id }) + return rows.length > 0 + } } diff --git a/apps/provider-workflows/src/lib/dal/transactions.ts b/apps/provider-workflows/src/lib/dal/transactions.ts index b288cab7..99112d29 100644 --- a/apps/provider-workflows/src/lib/dal/transactions.ts +++ b/apps/provider-workflows/src/lib/dal/transactions.ts @@ -1,6 +1,8 @@ +import { and, eq, isNotNull, sql } from 'drizzle-orm' import type { DBClient } from '@igniter/db/connection' import * as schema from '@igniter/db/provider/schema' -import { transactionsTable, InsertTransaction } from '@igniter/db/provider/schema' +import { transactionsTable, InsertTransaction, Transaction as TransactionModel } from '@igniter/db/provider/schema' +import { TransactionStatus } from '@igniter/db/provider/enums' import type { Logger } from '@igniter/logger' export default class Transactions { @@ -17,4 +19,145 @@ export default class Transactions { await this.dbClient.db.insert(transactionsTable).values(tx) this.logger.debug('insert: Execution Finished', { keyAddress: tx.keyAddress, type: tx.type }) } + + /** + * Parent: create the INTENT row (pending, no hash). onConflictDoNothing on the + * (key_id) WHERE pending partial index → returns id, or null if a pending row exists. + */ + async createIntent(values: Omit & { params: string; reasons: string }): Promise { + const [row] = await this.dbClient.db.insert(transactionsTable) + .values({ ...values, status: TransactionStatus.Pending, hash: null }) + .onConflictDoNothing() + .returning({ id: transactionsTable.id }) + return row?.id ?? null + } + + /** + * Dispatcher queue: ALL pending rows (with OR without hash) — the child's + * guard decides sign-vs-broadcast. + */ + async listPending(): Promise { + return this.dbClient.db.select().from(transactionsTable) + .where(eq(transactionsTable.status, TransactionStatus.Pending)) + } + + /** + * Child step 2: persist signed bytes + hash + timeout BEFORE broadcast. + * CAS WHERE status=pending to avoid clobbering a terminal row. + */ + async recordSigned(id: number, f: { signedPayload: string; hash: string; executionHeight: number; timeoutTimestamp: Date }): Promise { + await this.dbClient.db.update(transactionsTable) + .set({ signedPayload: f.signedPayload, hash: f.hash, executionHeight: f.executionHeight, timeoutTimestamp: f.timeoutTimestamp }) + .where(and(eq(transactionsTable.id, id), eq(transactionsTable.status, TransactionStatus.Pending))) + } + + /** + * Re-sign-on-expiry: clear the stale signed tx so the child re-signs fresh. + * CAS WHERE status=pending to be safe. + */ + async clearSigned(id: number): Promise { + await this.dbClient.db.update(transactionsTable) + .set({ signedPayload: null, hash: null, timeoutTimestamp: null }) + .where(and(eq(transactionsTable.id, id), eq(transactionsTable.status, TransactionStatus.Pending))) + } + + async getTransaction(transactionId: number) { + return this.dbClient.db.query.transactionsTable.findFirst({ + where: eq(transactionsTable.id, transactionId), + }) + } + + /** + * The verifier's queue: every transaction that has been broadcast (has a hash + + * execution height) and is still pending verification, EXCLUDING those checked + * too recently. The backoff grows with `unavailableChecks` (base 30s × the + * capped count) so a chronically-unverifiable tx is re-checked ever less often + * instead of being hammered every sweep — bounding RPC load during an outage. + * `executionHeight` is required so the verifier never scans from a null/zero + * height (which would mis-compute the expiration window). + */ + async listPendingWithHash(): Promise { + return this.dbClient.db + .select() + .from(transactionsTable) + .where(and( + eq(transactionsTable.status, TransactionStatus.Pending), + isNotNull(transactionsTable.hash), + isNotNull(transactionsTable.executionHeight), + sql`(${transactionsTable.lastVerificationAt} IS NULL OR ${transactionsTable.lastVerificationAt} < now() - (LEAST(${transactionsTable.unavailableChecks}, 20) * interval '30 seconds'))`, + )) + } + + /** + * Atomically move a still-pending, broadcast tx to a terminal status. + * Returns the updated row iff THIS call performed the transition (affected 1 row), + * undefined otherwise. The WHERE clause is the concurrency guard: a second caller + * (overlapping sweep / both paths) sees 0 rows and must NOT run effects. + */ + async claimTerminalTransition( + transactionId: number, + status: TransactionStatus.Success | TransactionStatus.Failure, + fields: { code?: number; message?: string }, + ): Promise { + const [row] = await this.dbClient.db + .update(transactionsTable) + .set({ status, ...fields }) + .where(and( + eq(transactionsTable.id, transactionId), + eq(transactionsTable.status, TransactionStatus.Pending), + isNotNull(transactionsTable.hash), + )) + .returning() + return row + } + + /** + * Terminalize a pre-broadcast INTENT row (no hash yet) — used when signing fails + * for a reason that makes retrying pointless (e.g. signer account not on-chain). + * Does NOT require a hash; CAS on status=pending ensures idempotency. + */ + async abandonIntent( + transactionId: number, + fields: { message: string }, + ): Promise { + await this.dbClient.db + .update(transactionsTable) + .set({ status: TransactionStatus.Failure, message: fields.message }) + .where(and( + eq(transactionsTable.id, transactionId), + eq(transactionsTable.status, TransactionStatus.Pending), + )) + } + + /** + * Pending-path counter/coverage update (no status change). Drizzle skips + * `undefined` set fields, so passing `undefined` leaves a column untouched. + */ + async recordVerificationProgress( + transactionId: number, + p: { lastCoveredHeight?: number; incUnavailable?: boolean }, + ): Promise { + await this.dbClient.db + .update(transactionsTable) + .set({ + lastCoveredHeight: p.lastCoveredHeight, + unavailableChecks: p.incUnavailable + ? sql`${transactionsTable.unavailableChecks} + 1` + : sql`GREATEST(${transactionsTable.unavailableChecks} - 1, 0)`, + lastVerificationAt: new Date(), + }) + .where(eq(transactionsTable.id, transactionId)) + } + + async hasPendingTx(keyId: number): Promise { + const [row] = await this.dbClient.db + .select({ id: transactionsTable.id }) + .from(transactionsTable) + .where(and( + eq(transactionsTable.keyId, keyId), + eq(transactionsTable.status, TransactionStatus.Pending), + )) + .limit(1) + return row !== undefined + } } diff --git a/apps/provider-workflows/src/workflows/ExecutePendingTransactions.ts b/apps/provider-workflows/src/workflows/ExecutePendingTransactions.ts new file mode 100644 index 00000000..9ec1967a --- /dev/null +++ b/apps/provider-workflows/src/workflows/ExecutePendingTransactions.ts @@ -0,0 +1,60 @@ +import { proxyActivities, executeChild, log, ApplicationFailure, WorkflowIdReusePolicy, ParentClosePolicy } from '@temporalio/workflow' +import { providerActivities } from '@/activities' + +// @ts-expect-error p-limit is ESM-only; its default export has no CJS types under this build's module resolution +import pLimit from 'p-limit' + +const MAX_CONCURRENT = 10 + +export async function ExecutePendingTransactions() { + const { listPending } = proxyActivities>({ + startToCloseTimeout: '30s', + retry: { maximumAttempts: 3 }, + }) + + const txs = await listPending() + if (txs.length === 0) return + + const limit = pLimit(MAX_CONCURRENT) + + const results = await Promise.allSettled( + txs.map((t) => + limit(() => { + const workflowId = `ExecuteTransaction-${t.id}` + return executeChild('ExecuteTransaction', { + workflowId, + args: [{ transactionId: t.id }], + workflowIdReusePolicy: WorkflowIdReusePolicy.ALLOW_DUPLICATE_FAILED_ONLY, + parentClosePolicy: ParentClosePolicy.ABANDON, + retry: { maximumAttempts: 5 }, + }).catch((err) => { + if (err.name === 'WorkflowExecutionAlreadyStartedError') { + log.info(`ExecuteTransaction ${workflowId} already running, skipping.`) + } else { + throw err + } + }) + }) + ) + ) + + const failedReasons = results + .filter((r): r is PromiseRejectedResult => r.status === 'rejected') + .map((r) => String(r.reason)) + for (const reason of failedReasons) { + log.warn('ExecutePendingTransactions: child workflow failed', { reason }) + } + + // Non-retryable ApplicationFailure (NOT WorkflowError — not exported by + // @temporalio/workflow; `new WorkflowError()` throws TypeError and wedges the + // workflow task forever under ScheduleOverlapPolicy.SKIP). A failed execution lets + // the next scheduled dispatch run fresh. + if (results.length > 0 && failedReasons.length === results.length) { + throw new ApplicationFailure( + 'ExecutePendingTransactions: all child workflows failed', + 'fatal_error', + true, + [failedReasons], + ) + } +} diff --git a/apps/provider-workflows/src/workflows/ExecuteTransaction.ts b/apps/provider-workflows/src/workflows/ExecuteTransaction.ts new file mode 100644 index 00000000..65d99a3a --- /dev/null +++ b/apps/provider-workflows/src/workflows/ExecuteTransaction.ts @@ -0,0 +1,37 @@ +import { proxyActivities } from '@temporalio/workflow' +import type { providerActivities } from '@/activities' +import { TransactionStatus } from '@igniter/db/provider/enums' + +interface Args { transactionId: number } + +export async function ExecuteTransaction({ transactionId }: Args) { + const { getTransaction, signSupplierTx, broadcastSupplierTx, isSignedTxExpired, clearSignedTx } = + proxyActivities>({ + startToCloseTimeout: '30s', + retry: { maximumAttempts: 3 }, + }) + + const txn = await getTransaction(transactionId) + if (!txn || txn.status !== TransactionStatus.Pending) return // terminal / dedup + + // B1: hash set means "already signed" — go straight to broadcast, UNLESS expired. + if (txn.hash) { + if (await isSignedTxExpired(transactionId)) { + await clearSignedTx(transactionId) // A3: re-sign branch + await signSupplierTx(transactionId) + const afterSign = await getTransaction(transactionId) + if (afterSign && afterSign.status === TransactionStatus.Pending && afterSign.hash) { + await broadcastSupplierTx(transactionId) + } + } else { + await broadcastSupplierTx(transactionId) + } + } else { + await signSupplierTx(transactionId) + const afterSign = await getTransaction(transactionId) + if (afterSign && afterSign.status === TransactionStatus.Pending && afterSign.hash) { + await broadcastSupplierTx(transactionId) + } + } + // does NOT wait for verification — the sweeper owns the terminal transition. +} diff --git a/apps/provider-workflows/src/workflows/VerifyPendingTransactions.ts b/apps/provider-workflows/src/workflows/VerifyPendingTransactions.ts new file mode 100644 index 00000000..a2f2b020 --- /dev/null +++ b/apps/provider-workflows/src/workflows/VerifyPendingTransactions.ts @@ -0,0 +1,83 @@ +import { proxyActivities, log, ApplicationFailure } from '@temporalio/workflow' +import { providerActivities } from '@/activities' +import { decideVerification, TX_EXPIRATION_BLOCKS } from '@igniter/tx-verify' + +// we built to commonjs and p-limit for esm support +// @ts-ignore +import pLimit from 'p-limit' +const MAX_CONCURRENT = 10 + +/** + * Sweeps broadcast-but-unverified transactions (status pending ∧ hash != null) and + * drives each toward a terminal verdict via the two verification paths + the pure + * `decideVerification`. RPC-unavailable never mutates state (the tx stays pending), + * so a degraded RPC produces retries + alerts, never a false failure. + */ +export async function VerifyPendingTransactions() { + const { + listPendingWithHash, + verifyTxHash, + verifySupplierEffect, + checkTxValidityEvidence, + applyVerificationDecision, + } = proxyActivities>({ + startToCloseTimeout: '120s', + retry: { maximumAttempts: 3 }, + }) + + const txs = await listPendingWithHash() + if (txs.length === 0) return + + const limit = pLimit(MAX_CONCURRENT) + const results = await Promise.allSettled( + txs.map((t) => + limit(async () => { + const hash = await verifyTxHash(t.id) + // Supplier path runs whenever we cannot confirm success from the hash alone: + // also when hash confirmed code!=0 (sibling may have achieved goal-state). + const supplier = hash.status === 'confirmed' && hash.data.success ? null : await verifySupplierEffect(t.id) + // Evidence only when failure is in reach (avoids an unnecessary account query on every sweep). + const needEvidence = hash.status === 'absent' || (hash.status === 'confirmed' && !hash.data.success) + // For absent: pass the chain block time at coverage so decideVerification uses chain time + // (not wall-clock) for the unordered timeout_timestamp bound. + const chainTimeAtCoverage = hash.status === 'absent' ? hash.chainTimeAtCoverage ?? null : null + const evidence = needEvidence + ? await checkTxValidityEvidence(t.id, chainTimeAtCoverage) + : { txTimeoutHeight: null, txTimeoutTimestamp: null, sequence: null, chainTimeAtCoverage: null } + const decision = decideVerification({ + hash, + supplier, + executionHeight: t.executionHeight!, + expirationWindow: TX_EXPIRATION_BLOCKS, + txTimeoutHeight: evidence.txTimeoutHeight, + txTimeoutTimestamp: evidence.txTimeoutTimestamp, + sequence: evidence.sequence, + chainTimeAtCoverage: evidence.chainTimeAtCoverage, + }) + await applyVerificationDecision(t.id, decision) + }), + ), + ) + + const failedReasons = results + .filter((r): r is PromiseRejectedResult => r.status === 'rejected') + .map((r) => String(r.reason)) + for (const reason of failedReasons) { + log.warn('VerifyPendingTransactions: tx verification failed', { reason }) + } + + // Match the SupplierStatus pattern: tolerate partial failure, but surface a + // systemic one (all failed → RPC/DB down) instead of completing green. Use a + // non-retryable ApplicationFailure (NOT WorkflowError — which is not exported by + // @temporalio/workflow; `new WorkflowError()` throws TypeError, wedging the + // workflow task forever under ScheduleOverlapPolicy.SKIP). A failed execution lets + // the next scheduled sweep run fresh. + if (results.length > 0 && failedReasons.length === results.length) { + throw new ApplicationFailure( + 'VerifyPendingTransactions: all transactions failed', + 'fatal_error', + true, + [failedReasons], + ) + } +} diff --git a/apps/provider-workflows/src/workflows/index.ts b/apps/provider-workflows/src/workflows/index.ts index c638f831..f9a0bba9 100644 --- a/apps/provider-workflows/src/workflows/index.ts +++ b/apps/provider-workflows/src/workflows/index.ts @@ -1,5 +1,8 @@ +export * from './ExecutePendingTransactions' +export * from './ExecuteTransaction' export * from './GovernanceSync' export * from './SupplierRemediation' export * from './SupplierRemediationRange' export * from './SupplierStatus' export * from './SupplierStatusRange' +export * from './VerifyPendingTransactions' diff --git a/apps/provider/drizzle/0018_white_proudstar.sql b/apps/provider/drizzle/0018_white_proudstar.sql new file mode 100644 index 00000000..03abe156 --- /dev/null +++ b/apps/provider/drizzle/0018_white_proudstar.sql @@ -0,0 +1,5 @@ +ALTER TABLE "transactions" ADD COLUMN "last_covered_height" integer;--> statement-breakpoint +ALTER TABLE "transactions" ADD COLUMN "tx_verification_attempts" integer DEFAULT 0 NOT NULL;--> statement-breakpoint +ALTER TABLE "transactions" ADD COLUMN "supplier_verification_attempts" integer DEFAULT 0 NOT NULL;--> statement-breakpoint +ALTER TABLE "transactions" ADD COLUMN "unavailable_checks" integer DEFAULT 0 NOT NULL;--> statement-breakpoint +ALTER TABLE "transactions" ADD COLUMN "last_verification_at" timestamp; \ No newline at end of file diff --git a/apps/provider/drizzle/0019_stormy_black_queen.sql b/apps/provider/drizzle/0019_stormy_black_queen.sql new file mode 100644 index 00000000..97d952be --- /dev/null +++ b/apps/provider/drizzle/0019_stormy_black_queen.sql @@ -0,0 +1,9 @@ +ALTER TABLE "transactions" ADD COLUMN "timeout_height" integer;--> statement-breakpoint +CREATE INDEX "transactions_verifier_sweep_idx" ON "transactions" USING btree ("status","last_verification_at") WHERE "hash" IS NOT NULL;--> statement-breakpoint +UPDATE "transactions" t SET "status" = 'failure', "message" = 'superseded duplicate pending (pre-unique-index cleanup)' +WHERE t."status" = 'pending' AND EXISTS ( + SELECT 1 FROM "transactions" n WHERE n."key_id" = t."key_id" AND n."status" = 'pending' AND n."id" > t."id" +);--> statement-breakpoint +CREATE UNIQUE INDEX "transactions_key_pending_uq" ON "transactions" USING btree ("key_id") WHERE status = 'pending';--> statement-breakpoint +ALTER TABLE "transactions" DROP COLUMN "tx_verification_attempts";--> statement-breakpoint +ALTER TABLE "transactions" DROP COLUMN "supplier_verification_attempts"; \ No newline at end of file diff --git a/apps/provider/drizzle/0020_nostalgic_thing.sql b/apps/provider/drizzle/0020_nostalgic_thing.sql new file mode 100644 index 00000000..a31e0eb9 --- /dev/null +++ b/apps/provider/drizzle/0020_nostalgic_thing.sql @@ -0,0 +1,4 @@ +ALTER TABLE "transactions" ADD COLUMN "signed_payload" text;--> statement-breakpoint +ALTER TABLE "transactions" ADD COLUMN "timeout_timestamp" timestamp with time zone;--> statement-breakpoint +ALTER TABLE "transactions" ADD COLUMN "params" text;--> statement-breakpoint +ALTER TABLE "transactions" ADD COLUMN "reasons" text; \ No newline at end of file diff --git a/apps/provider/drizzle/meta/0016_snapshot.json b/apps/provider/drizzle/meta/0016_snapshot.json index 3883cf5e..2b9faa75 100644 --- a/apps/provider/drizzle/meta/0016_snapshot.json +++ b/apps/provider/drizzle/meta/0016_snapshot.json @@ -1,1340 +1,1486 @@ { - "id": "8da36f45-7bbf-4ef1-ad04-ab117d0e11bf", - "prevId": "002b264c-ca17-4755-864b-171a5d09b314", - "version": "7", - "dialect": "postgresql", - "tables": { - "public.address_group_services": { - "name": "address_group_services", - "schema": "", - "columns": { - "address_group_id": { - "name": "address_group_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "service_id": { - "name": "service_id", - "type": "varchar", - "primaryKey": false, - "notNull": true - }, - "addSupplierShare": { - "name": "addSupplierShare", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "default": false - }, - "supplierShare": { - "name": "supplierShare", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 0 - }, - "revShare": { - "name": "revShare", - "type": "json", - "primaryKey": false, - "notNull": true, - "default": "'[]'::json" - } - }, - "indexes": {}, - "foreignKeys": { - "address_group_services_address_group_id_address_groups_id_fk": { - "name": "address_group_services_address_group_id_address_groups_id_fk", - "tableFrom": "address_group_services", - "tableTo": "address_groups", - "columnsFrom": [ - "address_group_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "address_group_services_service_id_services_serviceId_fk": { - "name": "address_group_services_service_id_services_serviceId_fk", - "tableFrom": "address_group_services", - "tableTo": "services", - "columnsFrom": [ - "service_id" - ], - "columnsTo": [ - "serviceId" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "address_group_services_address_group_id_service_id_pk": { - "name": "address_group_services_address_group_id_service_id_pk", - "columns": [ - "address_group_id", - "service_id" - ] - } - }, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.address_groups": { - "name": "address_groups", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "identity": { - "type": "always", - "name": "address_groups_id_seq", - "schema": "public", - "increment": "1", - "startWith": "1", - "minValue": "1", - "maxValue": "2147483647", - "cache": "1", - "cycle": false - } - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "linkedAddresses": { - "name": "linkedAddresses", - "type": "varchar[]", - "primaryKey": false, - "notNull": false, - "default": "'{}'" - }, - "private": { - "name": "private", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "default": false - }, - "relay_miner_id": { - "name": "relay_miner_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "createdBy": { - "name": "createdBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "updatedBy": { - "name": "updatedBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "address_groups_relay_miner_id_relay_miners_id_fk": { - "name": "address_groups_relay_miner_id_relay_miners_id_fk", - "tableFrom": "address_groups", - "tableTo": "relay_miners", - "columnsFrom": [ - "relay_miner_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "restrict", - "onUpdate": "no action" - }, - "address_groups_createdBy_users_identity_fk": { - "name": "address_groups_createdBy_users_identity_fk", - "tableFrom": "address_groups", - "tableTo": "users", - "columnsFrom": [ - "createdBy" - ], - "columnsTo": [ - "identity" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "address_groups_updatedBy_users_identity_fk": { - "name": "address_groups_updatedBy_users_identity_fk", - "tableFrom": "address_groups", - "tableTo": "users", - "columnsFrom": [ - "updatedBy" - ], - "columnsTo": [ - "identity" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.application_settings": { - "name": "application_settings", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "identity": { - "type": "always", - "name": "application_settings_id_seq", - "schema": "public", - "increment": "1", - "startWith": "1", - "minValue": "1", - "maxValue": "2147483647", - "cache": "1", - "cycle": false - } - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "appIdentity": { - "name": "appIdentity", - "type": "varchar(66)", - "primaryKey": false, - "notNull": true - }, - "supportEmail": { - "name": "supportEmail", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "ownerIdentity": { - "name": "ownerIdentity", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "ownerEmail": { - "name": "ownerEmail", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "chainId": { - "name": "chainId", - "type": "chain_ids", - "typeSchema": "public", - "primaryKey": false, - "notNull": true - }, - "minimumStake": { - "name": "minimumStake", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "initialOperationalFunds": { - "name": "initialOperationalFunds", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 5 - }, - "minimumOperationalFunds": { - "name": "minimumOperationalFunds", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 2 - }, - "isBootstrapped": { - "name": "isBootstrapped", - "type": "boolean", - "primaryKey": false, - "notNull": true - }, - "rpcUrl": { - "name": "rpcUrl", - "type": "varchar", - "primaryKey": false, - "notNull": true - }, - "indexerApiUrl": { - "name": "indexerApiUrl", - "type": "varchar", - "primaryKey": false, - "notNull": false - }, - "rewardAddresses": { - "name": "rewardAddresses", - "type": "varchar[]", - "primaryKey": false, - "notNull": false - }, - "updatedAtHeight": { - "name": "updatedAtHeight", - "type": "varchar", - "primaryKey": false, - "notNull": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "createdBy": { - "name": "createdBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "updatedBy": { - "name": "updatedBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "application_settings_createdBy_users_identity_fk": { - "name": "application_settings_createdBy_users_identity_fk", - "tableFrom": "application_settings", - "tableTo": "users", - "columnsFrom": [ - "createdBy" - ], - "columnsTo": [ - "identity" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "application_settings_updatedBy_users_identity_fk": { - "name": "application_settings_updatedBy_users_identity_fk", - "tableFrom": "application_settings", - "tableTo": "users", - "columnsFrom": [ - "updatedBy" - ], - "columnsTo": [ - "identity" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.delegators": { - "name": "delegators", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "identity": { - "type": "always", - "name": "delegators_id_seq", - "schema": "public", - "increment": "1", - "startWith": "1", - "minValue": "1", - "maxValue": "2147483647", - "cache": "1", - "cycle": false - } - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "identity": { - "name": "identity", - "type": "varchar(66)", - "primaryKey": false, - "notNull": true - }, - "enabled": { - "name": "enabled", - "type": "boolean", - "primaryKey": false, - "notNull": true - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "createdBy": { - "name": "createdBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "updatedBy": { - "name": "updatedBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "delegators_createdBy_users_identity_fk": { - "name": "delegators_createdBy_users_identity_fk", - "tableFrom": "delegators", - "tableTo": "users", - "columnsFrom": [ - "createdBy" - ], - "columnsTo": [ - "identity" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "delegators_updatedBy_users_identity_fk": { - "name": "delegators_updatedBy_users_identity_fk", - "tableFrom": "delegators", - "tableTo": "users", - "columnsFrom": [ - "updatedBy" - ], - "columnsTo": [ - "identity" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "delegators_identity_unique": { - "name": "delegators_identity_unique", - "nullsNotDistinct": false, - "columns": [ - "identity" - ] - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.import_supplier_requests": { - "name": "import_supplier_requests", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "identity": { - "type": "always", - "name": "import_supplier_requests_id_seq", - "schema": "public", - "increment": "1", - "startWith": "1", - "minValue": "1", - "maxValue": "2147483647", - "cache": "1", - "cycle": false - } - }, - "ownerAddress": { - "name": "ownerAddress", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "delegatorIdentity": { - "name": "delegatorIdentity", - "type": "varchar(66)", - "primaryKey": false, - "notNull": false - }, - "nonce": { - "name": "nonce", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "status": { - "name": "status", - "type": "import_request_status", - "typeSchema": "public", - "primaryKey": false, - "notNull": true, - "default": "'pending'" - }, - "matchingSupplierAddresses": { - "name": "matchingSupplierAddresses", - "type": "json", - "primaryKey": false, - "notNull": false, - "default": "'[]'::json" - }, - "delegatorRevSharePercentage": { - "name": "delegatorRevSharePercentage", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "delegatorRewardsAddress": { - "name": "delegatorRewardsAddress", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "errorMessage": { - "name": "errorMessage", - "type": "varchar(1024)", - "primaryKey": false, - "notNull": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "completedAt": { - "name": "completedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "expiresAt": { - "name": "expiresAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "import_supplier_requests_delegatorIdentity_delegators_identity_fk": { - "name": "import_supplier_requests_delegatorIdentity_delegators_identity_fk", - "tableFrom": "import_supplier_requests", - "tableTo": "delegators", - "columnsFrom": [ - "delegatorIdentity" - ], - "columnsTo": [ - "identity" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "import_supplier_requests_nonce_unique": { - "name": "import_supplier_requests_nonce_unique", - "nullsNotDistinct": false, - "columns": [ - "nonce" - ] - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.users": { - "name": "users", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "identity": { - "type": "always", - "name": "users_id_seq", - "schema": "public", - "increment": "1", - "startWith": "1", - "minValue": "1", - "maxValue": "2147483647", - "cache": "1", - "cycle": false - } - }, - "identity": { - "name": "identity", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "email": { - "name": "email", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "role": { - "name": "role", - "type": "role", - "typeSchema": "public", - "primaryKey": false, - "notNull": true - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "users_identity_unique": { - "name": "users_identity_unique", - "nullsNotDistinct": false, - "columns": [ - "identity" - ] - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.keys": { - "name": "keys", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "identity": { - "type": "always", - "name": "keys_id_seq", - "schema": "public", - "increment": "1", - "startWith": "1", - "minValue": "1", - "maxValue": "2147483647", - "cache": "1", - "cycle": false - } - }, - "address": { - "name": "address", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "publicKey": { - "name": "publicKey", - "type": "varchar(66)", - "primaryKey": false, - "notNull": true - }, - "privateKey": { - "name": "privateKey", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "ownerAddress": { - "name": "ownerAddress", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "default": "''" - }, - "state": { - "name": "state", - "type": "address_states", - "typeSchema": "public", - "primaryKey": false, - "notNull": true, - "default": "'available'" - }, - "remediationHistory": { - "name": "remediationHistory", - "type": "json", - "primaryKey": false, - "notNull": false, - "default": "'[]'::json" - }, - "deliveredAt": { - "name": "deliveredAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "delegator_identity": { - "name": "delegator_identity", - "type": "varchar", - "primaryKey": false, - "notNull": false - }, - "address_group_id": { - "name": "address_group_id", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "delegatorRevSharePercentage": { - "name": "delegatorRevSharePercentage", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 0 - }, - "delegatorRewardsAddress": { - "name": "delegatorRewardsAddress", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "default": "''" - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "lastUpdatedHeight": { - "name": "lastUpdatedHeight", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 0 - }, - "stakeOwner": { - "name": "stakeOwner", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "default": "''" - }, - "stakeAmountUpokt": { - "name": "stakeAmountUpokt", - "type": "bigint", - "primaryKey": false, - "notNull": false, - "default": 0 - }, - "balanceUpokt": { - "name": "balanceUpokt", - "type": "bigint", - "primaryKey": false, - "notNull": false, - "default": 0 - }, - "services": { - "name": "services", - "type": "json", - "primaryKey": false, - "notNull": false, - "default": "'[]'::json" - }, - "exportedAt": { - "name": "exportedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "exportCount": { - "name": "exportCount", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": { - "keys_delegator_identity_delegators_identity_fk": { - "name": "keys_delegator_identity_delegators_identity_fk", - "tableFrom": "keys", - "tableTo": "delegators", - "columnsFrom": [ - "delegator_identity" - ], - "columnsTo": [ - "identity" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "keys_address_group_id_address_groups_id_fk": { - "name": "keys_address_group_id_address_groups_id_fk", - "tableFrom": "keys", - "tableTo": "address_groups", - "columnsFrom": [ - "address_group_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "keys_address_unique": { - "name": "keys_address_unique", - "nullsNotDistinct": false, - "columns": [ - "address" - ] - }, - "keys_publicKey_unique": { - "name": "keys_publicKey_unique", - "nullsNotDistinct": false, - "columns": [ - "publicKey" - ] - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.regions": { - "name": "regions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "identity": { - "type": "always", - "name": "regions_id_seq", - "schema": "public", - "increment": "1", - "startWith": "1", - "minValue": "1", - "maxValue": "2147483647", - "cache": "1", - "cycle": false - } - }, - "displayName": { - "name": "displayName", - "type": "varchar(20)", - "primaryKey": false, - "notNull": true - }, - "urlValue": { - "name": "urlValue", - "type": "varchar(20)", - "primaryKey": false, - "notNull": true - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "createdBy": { - "name": "createdBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "updatedBy": { - "name": "updatedBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "regions_createdBy_users_identity_fk": { - "name": "regions_createdBy_users_identity_fk", - "tableFrom": "regions", - "tableTo": "users", - "columnsFrom": [ - "createdBy" - ], - "columnsTo": [ - "identity" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "regions_updatedBy_users_identity_fk": { - "name": "regions_updatedBy_users_identity_fk", - "tableFrom": "regions", - "tableTo": "users", - "columnsFrom": [ - "updatedBy" - ], - "columnsTo": [ - "identity" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "regions_displayName_unique": { - "name": "regions_displayName_unique", - "nullsNotDistinct": false, - "columns": [ - "displayName" - ] - }, - "regions_urlValue_unique": { - "name": "regions_urlValue_unique", - "nullsNotDistinct": false, - "columns": [ - "urlValue" - ] - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.relay_miners": { - "name": "relay_miners", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "identity": { - "type": "always", - "name": "relay_miners_id_seq", - "schema": "public", - "increment": "1", - "startWith": "1", - "minValue": "1", - "maxValue": "2147483647", - "cache": "1", - "cycle": false - } - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "identity": { - "name": "identity", - "type": "varchar(66)", - "primaryKey": false, - "notNull": true - }, - "region_id": { - "name": "region_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "domain": { - "name": "domain", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "createdBy": { - "name": "createdBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "updatedBy": { - "name": "updatedBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": { - "unique_identity_region_idx": { - "name": "unique_identity_region_idx", - "columns": [ - { - "expression": "identity", - "isExpression": false, - "asc": true, - "nulls": "last" - }, - { - "expression": "region_id", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "concurrently": false, - "method": "btree", - "with": {} - } - }, - "foreignKeys": { - "relay_miners_region_id_regions_id_fk": { - "name": "relay_miners_region_id_regions_id_fk", - "tableFrom": "relay_miners", - "tableTo": "regions", - "columnsFrom": [ - "region_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "relay_miners_createdBy_users_identity_fk": { - "name": "relay_miners_createdBy_users_identity_fk", - "tableFrom": "relay_miners", - "tableTo": "users", - "columnsFrom": [ - "createdBy" - ], - "columnsTo": [ - "identity" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "relay_miners_updatedBy_users_identity_fk": { - "name": "relay_miners_updatedBy_users_identity_fk", - "tableFrom": "relay_miners", - "tableTo": "users", - "columnsFrom": [ - "updatedBy" - ], - "columnsTo": [ - "identity" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.services": { - "name": "services", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "identity": { - "type": "always", - "name": "services_id_seq", - "schema": "public", - "increment": "1", - "startWith": "1", - "minValue": "1", - "maxValue": "2147483647", - "cache": "1", - "cycle": false - } - }, - "serviceId": { - "name": "serviceId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "ownerAddress": { - "name": "ownerAddress", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "computeUnits": { - "name": "computeUnits", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "revSharePercentage": { - "name": "revSharePercentage", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "endpoints": { - "name": "endpoints", - "type": "json", - "primaryKey": false, - "notNull": true - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "createdBy": { - "name": "createdBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "updatedBy": { - "name": "updatedBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "services_createdBy_users_identity_fk": { - "name": "services_createdBy_users_identity_fk", - "tableFrom": "services", - "tableTo": "users", - "columnsFrom": [ - "createdBy" - ], - "columnsTo": [ - "identity" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "services_updatedBy_users_identity_fk": { - "name": "services_updatedBy_users_identity_fk", - "tableFrom": "services", - "tableTo": "users", - "columnsFrom": [ - "updatedBy" - ], - "columnsTo": [ - "identity" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "services_serviceId_unique": { - "name": "services_serviceId_unique", - "nullsNotDistinct": false, - "columns": [ - "serviceId" - ] - } - }, - "policies": {}, - "checkConstraints": { - "check_endpoints_not_empty": { - "name": "check_endpoints_not_empty", - "value": "json_array_length(endpoints) > 0" - } - }, - "isRLSEnabled": false - } - }, - "enums": { - "public.address_states": { - "name": "address_states", - "schema": "public", - "values": [ - "imported", - "available", - "delivered", - "staking", - "remediation_failed", - "attention_needed", - "staked", - "stake_failed", - "unstaking", - "unstaked", - "missing_stake" - ] - }, - "public.chain_ids": { - "name": "chain_ids", - "schema": "public", - "values": [ - "pocket", - "pocket-beta", - "pocket-alpha", - "pocket-lego-testnet" - ] - }, - "public.import_request_status": { - "name": "import_request_status", - "schema": "public", - "values": [ - "pending", - "completed", - "expired", - "cancelled", - "failed" - ] - }, - "public.provider_fee": { - "name": "provider_fee", - "schema": "public", - "values": [ - "up_to", - "fixed" - ] - }, - "public.role": { - "name": "role", - "schema": "public", - "values": [ - "admin", - "user", - "owner" - ] - } - }, - "schemas": {}, - "sequences": {}, - "roles": {}, - "policies": {}, - "views": {}, - "_meta": { - "columns": {}, - "schemas": {}, - "tables": {} - } + "id": "8da36f45-7bbf-4ef1-ad04-ab117d0e11bf", + "prevId": "002b264c-ca17-4755-864b-171a5d09b314", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.address_group_services": { + "name": "address_group_services", + "schema": "", + "columns": { + "address_group_id": { + "name": "address_group_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "service_id": { + "name": "service_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "addSupplierShare": { + "name": "addSupplierShare", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "supplierShare": { + "name": "supplierShare", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "revShare": { + "name": "revShare", + "type": "json", + "primaryKey": false, + "notNull": true, + "default": "'[]'::json" + }, + "endpointOverrides": { + "name": "endpointOverrides", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'{}'::json" + } + }, + "indexes": {}, + "foreignKeys": { + "address_group_services_address_group_id_address_groups_id_fk": { + "name": "address_group_services_address_group_id_address_groups_id_fk", + "tableFrom": "address_group_services", + "tableTo": "address_groups", + "columnsFrom": [ + "address_group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "address_group_services_service_id_services_serviceId_fk": { + "name": "address_group_services_service_id_services_serviceId_fk", + "tableFrom": "address_group_services", + "tableTo": "services", + "columnsFrom": [ + "service_id" + ], + "columnsTo": [ + "serviceId" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "address_group_services_address_group_id_service_id_pk": { + "name": "address_group_services_address_group_id_service_id_pk", + "columns": [ + "address_group_id", + "service_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.address_groups": { + "name": "address_groups", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "address_groups_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "linkedAddresses": { + "name": "linkedAddresses", + "type": "varchar[]", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "private": { + "name": "private", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "relay_miner_id": { + "name": "relay_miner_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "address_groups_relay_miner_id_relay_miners_id_fk": { + "name": "address_groups_relay_miner_id_relay_miners_id_fk", + "tableFrom": "address_groups", + "tableTo": "relay_miners", + "columnsFrom": [ + "relay_miner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "no action" + }, + "address_groups_createdBy_users_identity_fk": { + "name": "address_groups_createdBy_users_identity_fk", + "tableFrom": "address_groups", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "address_groups_updatedBy_users_identity_fk": { + "name": "address_groups_updatedBy_users_identity_fk", + "tableFrom": "address_groups", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.application_settings": { + "name": "application_settings", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "application_settings_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "appIdentity": { + "name": "appIdentity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "supportEmail": { + "name": "supportEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ownerIdentity": { + "name": "ownerIdentity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "ownerEmail": { + "name": "ownerEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "chainId": { + "name": "chainId", + "type": "chain_ids", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "minimumStake": { + "name": "minimumStake", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "initialOperationalFunds": { + "name": "initialOperationalFunds", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 5 + }, + "minimumOperationalFunds": { + "name": "minimumOperationalFunds", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 2 + }, + "isBootstrapped": { + "name": "isBootstrapped", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "rpcUrl": { + "name": "rpcUrl", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "indexerApiUrl": { + "name": "indexerApiUrl", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "rewardAddresses": { + "name": "rewardAddresses", + "type": "varchar[]", + "primaryKey": false, + "notNull": false + }, + "updatedAtHeight": { + "name": "updatedAtHeight", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "application_settings_createdBy_users_identity_fk": { + "name": "application_settings_createdBy_users_identity_fk", + "tableFrom": "application_settings", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "application_settings_updatedBy_users_identity_fk": { + "name": "application_settings_updatedBy_users_identity_fk", + "tableFrom": "application_settings", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.delegators": { + "name": "delegators", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "delegators_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "identity": { + "name": "identity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "delegators_createdBy_users_identity_fk": { + "name": "delegators_createdBy_users_identity_fk", + "tableFrom": "delegators", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "delegators_updatedBy_users_identity_fk": { + "name": "delegators_updatedBy_users_identity_fk", + "tableFrom": "delegators", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "delegators_identity_unique": { + "name": "delegators_identity_unique", + "nullsNotDistinct": false, + "columns": [ + "identity" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.import_supplier_requests": { + "name": "import_supplier_requests", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "import_supplier_requests_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "delegatorIdentity": { + "name": "delegatorIdentity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": false + }, + "nonce": { + "name": "nonce", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "import_request_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "matchingSupplierAddresses": { + "name": "matchingSupplierAddresses", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'::json" + }, + "delegatorRevSharePercentage": { + "name": "delegatorRevSharePercentage", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "delegatorRewardsAddress": { + "name": "delegatorRewardsAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "errorMessage": { + "name": "errorMessage", + "type": "varchar(1024)", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "completedAt": { + "name": "completedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "import_supplier_requests_delegatorIdentity_delegators_identity_fk": { + "name": "import_supplier_requests_delegatorIdentity_delegators_identity_fk", + "tableFrom": "import_supplier_requests", + "tableTo": "delegators", + "columnsFrom": [ + "delegatorIdentity" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "import_supplier_requests_nonce_unique": { + "name": "import_supplier_requests_nonce_unique", + "nullsNotDistinct": false, + "columns": [ + "nonce" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "users_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "identity": { + "name": "identity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_identity_unique": { + "name": "users_identity_unique", + "nullsNotDistinct": false, + "columns": [ + "identity" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.keys": { + "name": "keys", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "keys_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "address": { + "name": "address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "publicKey": { + "name": "publicKey", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "state": { + "name": "state", + "type": "address_states", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'available'" + }, + "remediationHistory": { + "name": "remediationHistory", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'::json" + }, + "deliveredAt": { + "name": "deliveredAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "delegator_identity": { + "name": "delegator_identity", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "address_group_id": { + "name": "address_group_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "delegatorRevSharePercentage": { + "name": "delegatorRevSharePercentage", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "delegatorRewardsAddress": { + "name": "delegatorRewardsAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "lastUpdatedHeight": { + "name": "lastUpdatedHeight", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "stakeOwner": { + "name": "stakeOwner", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "stakeAmountUpokt": { + "name": "stakeAmountUpokt", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "balanceUpokt": { + "name": "balanceUpokt", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "services": { + "name": "services", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'::json" + }, + "exportedAt": { + "name": "exportedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "exportCount": { + "name": "exportCount", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + } + }, + "indexes": {}, + "foreignKeys": { + "keys_delegator_identity_delegators_identity_fk": { + "name": "keys_delegator_identity_delegators_identity_fk", + "tableFrom": "keys", + "tableTo": "delegators", + "columnsFrom": [ + "delegator_identity" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "keys_address_group_id_address_groups_id_fk": { + "name": "keys_address_group_id_address_groups_id_fk", + "tableFrom": "keys", + "tableTo": "address_groups", + "columnsFrom": [ + "address_group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "keys_address_unique": { + "name": "keys_address_unique", + "nullsNotDistinct": false, + "columns": [ + "address" + ] + }, + "keys_publicKey_unique": { + "name": "keys_publicKey_unique", + "nullsNotDistinct": false, + "columns": [ + "publicKey" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.regions": { + "name": "regions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "regions_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "displayName": { + "name": "displayName", + "type": "varchar(20)", + "primaryKey": false, + "notNull": true + }, + "urlValue": { + "name": "urlValue", + "type": "varchar(20)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "regions_createdBy_users_identity_fk": { + "name": "regions_createdBy_users_identity_fk", + "tableFrom": "regions", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "regions_updatedBy_users_identity_fk": { + "name": "regions_updatedBy_users_identity_fk", + "tableFrom": "regions", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "regions_displayName_unique": { + "name": "regions_displayName_unique", + "nullsNotDistinct": false, + "columns": [ + "displayName" + ] + }, + "regions_urlValue_unique": { + "name": "regions_urlValue_unique", + "nullsNotDistinct": false, + "columns": [ + "urlValue" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.relay_miners": { + "name": "relay_miners", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "relay_miners_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "identity": { + "name": "identity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "region_id": { + "name": "region_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "domain": { + "name": "domain", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "unique_identity_region_idx": { + "name": "unique_identity_region_idx", + "columns": [ + { + "expression": "identity", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "region_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "relay_miners_region_id_regions_id_fk": { + "name": "relay_miners_region_id_regions_id_fk", + "tableFrom": "relay_miners", + "tableTo": "regions", + "columnsFrom": [ + "region_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "relay_miners_createdBy_users_identity_fk": { + "name": "relay_miners_createdBy_users_identity_fk", + "tableFrom": "relay_miners", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "relay_miners_updatedBy_users_identity_fk": { + "name": "relay_miners_updatedBy_users_identity_fk", + "tableFrom": "relay_miners", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.services": { + "name": "services", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "services_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "serviceId": { + "name": "serviceId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "computeUnits": { + "name": "computeUnits", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "revSharePercentage": { + "name": "revSharePercentage", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "endpoints": { + "name": "endpoints", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "services_createdBy_users_identity_fk": { + "name": "services_createdBy_users_identity_fk", + "tableFrom": "services", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "services_updatedBy_users_identity_fk": { + "name": "services_updatedBy_users_identity_fk", + "tableFrom": "services", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "services_serviceId_unique": { + "name": "services_serviceId_unique", + "nullsNotDistinct": false, + "columns": [ + "serviceId" + ] + } + }, + "policies": {}, + "checkConstraints": { + "check_endpoints_not_empty": { + "name": "check_endpoints_not_empty", + "value": "json_array_length(endpoints) > 0" + } + }, + "isRLSEnabled": false + }, + "public.transactions": { + "name": "transactions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "transactions_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "key_id": { + "name": "key_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "key_address": { + "name": "key_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "tx_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "tx_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "reason": { + "name": "reason", + "type": "varchar(10)", + "primaryKey": false, + "notNull": false + }, + "trigger": { + "name": "trigger", + "type": "tx_trigger", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false + }, + "code": { + "name": "code", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "message": { + "name": "message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "execution_height": { + "name": "execution_height", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "transactions_key_id_keys_id_fk": { + "name": "transactions_key_id_keys_id_fk", + "tableFrom": "transactions", + "tableTo": "keys", + "columnsFrom": [ + "key_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.address_states": { + "name": "address_states", + "schema": "public", + "values": [ + "imported", + "available", + "delivered", + "staking", + "remediation_failed", + "attention_needed", + "staked", + "stake_failed", + "unstaking", + "unstaked", + "missing_stake" + ] + }, + "public.chain_ids": { + "name": "chain_ids", + "schema": "public", + "values": [ + "pocket", + "pocket-beta", + "pocket-alpha", + "pocket-lego-testnet" + ] + }, + "public.import_request_status": { + "name": "import_request_status", + "schema": "public", + "values": [ + "pending", + "completed", + "expired", + "cancelled", + "failed" + ] + }, + "public.provider_fee": { + "name": "provider_fee", + "schema": "public", + "values": [ + "up_to", + "fixed" + ] + }, + "public.role": { + "name": "role", + "schema": "public", + "values": [ + "admin", + "user", + "owner" + ] + }, + "public.tx_status": { + "name": "tx_status", + "schema": "public", + "values": [ + "pending", + "success", + "failure" + ] + }, + "public.tx_trigger": { + "name": "tx_trigger", + "schema": "public", + "values": [ + "manual", + "automatic" + ] + }, + "public.tx_type": { + "name": "tx_type", + "schema": "public", + "values": [ + "stake", + "unstake" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } } \ No newline at end of file diff --git a/apps/provider/drizzle/meta/0017_snapshot.json b/apps/provider/drizzle/meta/0017_snapshot.json index 12cd567f..9e4ca240 100644 --- a/apps/provider/drizzle/meta/0017_snapshot.json +++ b/apps/provider/drizzle/meta/0017_snapshot.json @@ -1,1346 +1,1492 @@ { - "id": "219c2209-3dc1-43c9-9563-e98c375ac6ab", - "prevId": "8da36f45-7bbf-4ef1-ad04-ab117d0e11bf", - "version": "7", - "dialect": "postgresql", - "tables": { - "public.address_group_services": { - "name": "address_group_services", - "schema": "", - "columns": { - "address_group_id": { - "name": "address_group_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "service_id": { - "name": "service_id", - "type": "varchar", - "primaryKey": false, - "notNull": true - }, - "addSupplierShare": { - "name": "addSupplierShare", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "default": false - }, - "supplierShare": { - "name": "supplierShare", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 0 - }, - "revShare": { - "name": "revShare", - "type": "json", - "primaryKey": false, - "notNull": true, - "default": "'[]'::json" - } - }, - "indexes": {}, - "foreignKeys": { - "address_group_services_address_group_id_address_groups_id_fk": { - "name": "address_group_services_address_group_id_address_groups_id_fk", - "tableFrom": "address_group_services", - "columnsFrom": [ - "address_group_id" - ], - "tableTo": "address_groups", - "columnsTo": [ - "id" - ], - "onUpdate": "no action", - "onDelete": "no action" - }, - "address_group_services_service_id_services_serviceId_fk": { - "name": "address_group_services_service_id_services_serviceId_fk", - "tableFrom": "address_group_services", - "columnsFrom": [ - "service_id" - ], - "tableTo": "services", - "columnsTo": [ - "serviceId" - ], - "onUpdate": "no action", - "onDelete": "no action" - } - }, - "compositePrimaryKeys": { - "address_group_services_address_group_id_service_id_pk": { - "name": "address_group_services_address_group_id_service_id_pk", - "columns": [ - "address_group_id", - "service_id" - ] - } - }, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.address_groups": { - "name": "address_groups", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "identity": { - "name": "address_groups_id_seq", - "increment": "1", - "minValue": "1", - "maxValue": "2147483647", - "startWith": "1", - "cache": "1", - "cycle": false, - "schema": "public", - "type": "always" - } - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "linkedAddresses": { - "name": "linkedAddresses", - "type": "varchar[]", - "primaryKey": false, - "notNull": false, - "default": "'{}'" - }, - "private": { - "name": "private", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "default": false - }, - "relay_miner_id": { - "name": "relay_miner_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "createdBy": { - "name": "createdBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "updatedBy": { - "name": "updatedBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "address_groups_relay_miner_id_relay_miners_id_fk": { - "name": "address_groups_relay_miner_id_relay_miners_id_fk", - "tableFrom": "address_groups", - "columnsFrom": [ - "relay_miner_id" - ], - "tableTo": "relay_miners", - "columnsTo": [ - "id" - ], - "onUpdate": "no action", - "onDelete": "restrict" - }, - "address_groups_createdBy_users_identity_fk": { - "name": "address_groups_createdBy_users_identity_fk", - "tableFrom": "address_groups", - "columnsFrom": [ - "createdBy" - ], - "tableTo": "users", - "columnsTo": [ - "identity" - ], - "onUpdate": "no action", - "onDelete": "no action" - }, - "address_groups_updatedBy_users_identity_fk": { - "name": "address_groups_updatedBy_users_identity_fk", - "tableFrom": "address_groups", - "columnsFrom": [ - "updatedBy" - ], - "tableTo": "users", - "columnsTo": [ - "identity" - ], - "onUpdate": "no action", - "onDelete": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.application_settings": { - "name": "application_settings", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "identity": { - "name": "application_settings_id_seq", - "increment": "1", - "minValue": "1", - "maxValue": "2147483647", - "startWith": "1", - "cache": "1", - "cycle": false, - "schema": "public", - "type": "always" - } - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "appIdentity": { - "name": "appIdentity", - "type": "varchar(66)", - "primaryKey": false, - "notNull": true - }, - "supportEmail": { - "name": "supportEmail", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "ownerIdentity": { - "name": "ownerIdentity", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "ownerEmail": { - "name": "ownerEmail", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "chainId": { - "name": "chainId", - "type": "chain_ids", - "typeSchema": "public", - "primaryKey": false, - "notNull": true - }, - "minimumStake": { - "name": "minimumStake", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "initialOperationalFunds": { - "name": "initialOperationalFunds", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 5 - }, - "minimumOperationalFunds": { - "name": "minimumOperationalFunds", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 2 - }, - "isBootstrapped": { - "name": "isBootstrapped", - "type": "boolean", - "primaryKey": false, - "notNull": true - }, - "indexerApiUrl": { - "name": "indexerApiUrl", - "type": "varchar", - "primaryKey": false, - "notNull": false - }, - "rewardAddresses": { - "name": "rewardAddresses", - "type": "varchar[]", - "primaryKey": false, - "notNull": false - }, - "updatedAtHeight": { - "name": "updatedAtHeight", - "type": "varchar", - "primaryKey": false, - "notNull": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "createdBy": { - "name": "createdBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "updatedBy": { - "name": "updatedBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "pocketApiUrl": { - "name": "pocketApiUrl", - "type": "varchar", - "primaryKey": false, - "notNull": true - }, - "pocketRpcUrl": { - "name": "pocketRpcUrl", - "type": "varchar", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "application_settings_createdBy_users_identity_fk": { - "name": "application_settings_createdBy_users_identity_fk", - "tableFrom": "application_settings", - "columnsFrom": [ - "createdBy" - ], - "tableTo": "users", - "columnsTo": [ - "identity" - ], - "onUpdate": "no action", - "onDelete": "no action" - }, - "application_settings_updatedBy_users_identity_fk": { - "name": "application_settings_updatedBy_users_identity_fk", - "tableFrom": "application_settings", - "columnsFrom": [ - "updatedBy" - ], - "tableTo": "users", - "columnsTo": [ - "identity" - ], - "onUpdate": "no action", - "onDelete": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.delegators": { - "name": "delegators", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "identity": { - "name": "delegators_id_seq", - "increment": "1", - "minValue": "1", - "maxValue": "2147483647", - "startWith": "1", - "cache": "1", - "cycle": false, - "schema": "public", - "type": "always" - } - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "identity": { - "name": "identity", - "type": "varchar(66)", - "primaryKey": false, - "notNull": true - }, - "enabled": { - "name": "enabled", - "type": "boolean", - "primaryKey": false, - "notNull": true - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "createdBy": { - "name": "createdBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "updatedBy": { - "name": "updatedBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "delegators_createdBy_users_identity_fk": { - "name": "delegators_createdBy_users_identity_fk", - "tableFrom": "delegators", - "columnsFrom": [ - "createdBy" - ], - "tableTo": "users", - "columnsTo": [ - "identity" - ], - "onUpdate": "no action", - "onDelete": "no action" - }, - "delegators_updatedBy_users_identity_fk": { - "name": "delegators_updatedBy_users_identity_fk", - "tableFrom": "delegators", - "columnsFrom": [ - "updatedBy" - ], - "tableTo": "users", - "columnsTo": [ - "identity" - ], - "onUpdate": "no action", - "onDelete": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "delegators_identity_unique": { - "name": "delegators_identity_unique", - "columns": [ - "identity" - ], - "nullsNotDistinct": false - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.import_supplier_requests": { - "name": "import_supplier_requests", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "identity": { - "name": "import_supplier_requests_id_seq", - "increment": "1", - "minValue": "1", - "maxValue": "2147483647", - "startWith": "1", - "cache": "1", - "cycle": false, - "schema": "public", - "type": "always" - } - }, - "ownerAddress": { - "name": "ownerAddress", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "delegatorIdentity": { - "name": "delegatorIdentity", - "type": "varchar(66)", - "primaryKey": false, - "notNull": false - }, - "nonce": { - "name": "nonce", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "status": { - "name": "status", - "type": "import_request_status", - "typeSchema": "public", - "primaryKey": false, - "notNull": true, - "default": "'pending'" - }, - "matchingSupplierAddresses": { - "name": "matchingSupplierAddresses", - "type": "json", - "primaryKey": false, - "notNull": false, - "default": "'[]'::json" - }, - "delegatorRevSharePercentage": { - "name": "delegatorRevSharePercentage", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "delegatorRewardsAddress": { - "name": "delegatorRewardsAddress", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "errorMessage": { - "name": "errorMessage", - "type": "varchar(1024)", - "primaryKey": false, - "notNull": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "completedAt": { - "name": "completedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "expiresAt": { - "name": "expiresAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "import_supplier_requests_delegatorIdentity_delegators_identity_fk": { - "name": "import_supplier_requests_delegatorIdentity_delegators_identity_fk", - "tableFrom": "import_supplier_requests", - "columnsFrom": [ - "delegatorIdentity" - ], - "tableTo": "delegators", - "columnsTo": [ - "identity" - ], - "onUpdate": "no action", - "onDelete": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "import_supplier_requests_nonce_unique": { - "name": "import_supplier_requests_nonce_unique", - "columns": [ - "nonce" - ], - "nullsNotDistinct": false - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.users": { - "name": "users", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "identity": { - "name": "users_id_seq", - "increment": "1", - "minValue": "1", - "maxValue": "2147483647", - "startWith": "1", - "cache": "1", - "cycle": false, - "schema": "public", - "type": "always" - } - }, - "identity": { - "name": "identity", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "email": { - "name": "email", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "role": { - "name": "role", - "type": "role", - "typeSchema": "public", - "primaryKey": false, - "notNull": true - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "users_identity_unique": { - "name": "users_identity_unique", - "columns": [ - "identity" - ], - "nullsNotDistinct": false - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.keys": { - "name": "keys", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "identity": { - "name": "keys_id_seq", - "increment": "1", - "minValue": "1", - "maxValue": "2147483647", - "startWith": "1", - "cache": "1", - "cycle": false, - "schema": "public", - "type": "always" - } - }, - "address": { - "name": "address", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "publicKey": { - "name": "publicKey", - "type": "varchar(66)", - "primaryKey": false, - "notNull": true - }, - "privateKey": { - "name": "privateKey", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "ownerAddress": { - "name": "ownerAddress", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "default": "''" - }, - "state": { - "name": "state", - "type": "address_states", - "typeSchema": "public", - "primaryKey": false, - "notNull": true, - "default": "'available'" - }, - "remediationHistory": { - "name": "remediationHistory", - "type": "json", - "primaryKey": false, - "notNull": false, - "default": "'[]'::json" - }, - "deliveredAt": { - "name": "deliveredAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "delegator_identity": { - "name": "delegator_identity", - "type": "varchar", - "primaryKey": false, - "notNull": false - }, - "address_group_id": { - "name": "address_group_id", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "delegatorRevSharePercentage": { - "name": "delegatorRevSharePercentage", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 0 - }, - "delegatorRewardsAddress": { - "name": "delegatorRewardsAddress", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "default": "''" - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "lastUpdatedHeight": { - "name": "lastUpdatedHeight", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 0 - }, - "stakeOwner": { - "name": "stakeOwner", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "default": "''" - }, - "stakeAmountUpokt": { - "name": "stakeAmountUpokt", - "type": "bigint", - "primaryKey": false, - "notNull": false, - "default": 0 - }, - "balanceUpokt": { - "name": "balanceUpokt", - "type": "bigint", - "primaryKey": false, - "notNull": false, - "default": 0 - }, - "services": { - "name": "services", - "type": "json", - "primaryKey": false, - "notNull": false, - "default": "'[]'::json" - }, - "exportedAt": { - "name": "exportedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "exportCount": { - "name": "exportCount", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": { - "keys_delegator_identity_delegators_identity_fk": { - "name": "keys_delegator_identity_delegators_identity_fk", - "tableFrom": "keys", - "columnsFrom": [ - "delegator_identity" - ], - "tableTo": "delegators", - "columnsTo": [ - "identity" - ], - "onUpdate": "no action", - "onDelete": "no action" - }, - "keys_address_group_id_address_groups_id_fk": { - "name": "keys_address_group_id_address_groups_id_fk", - "tableFrom": "keys", - "columnsFrom": [ - "address_group_id" - ], - "tableTo": "address_groups", - "columnsTo": [ - "id" - ], - "onUpdate": "no action", - "onDelete": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "keys_address_unique": { - "name": "keys_address_unique", - "columns": [ - "address" - ], - "nullsNotDistinct": false - }, - "keys_publicKey_unique": { - "name": "keys_publicKey_unique", - "columns": [ - "publicKey" - ], - "nullsNotDistinct": false - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.regions": { - "name": "regions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "identity": { - "name": "regions_id_seq", - "increment": "1", - "minValue": "1", - "maxValue": "2147483647", - "startWith": "1", - "cache": "1", - "cycle": false, - "schema": "public", - "type": "always" - } - }, - "displayName": { - "name": "displayName", - "type": "varchar(20)", - "primaryKey": false, - "notNull": true - }, - "urlValue": { - "name": "urlValue", - "type": "varchar(20)", - "primaryKey": false, - "notNull": true - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "createdBy": { - "name": "createdBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "updatedBy": { - "name": "updatedBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "regions_createdBy_users_identity_fk": { - "name": "regions_createdBy_users_identity_fk", - "tableFrom": "regions", - "columnsFrom": [ - "createdBy" - ], - "tableTo": "users", - "columnsTo": [ - "identity" - ], - "onUpdate": "no action", - "onDelete": "no action" - }, - "regions_updatedBy_users_identity_fk": { - "name": "regions_updatedBy_users_identity_fk", - "tableFrom": "regions", - "columnsFrom": [ - "updatedBy" - ], - "tableTo": "users", - "columnsTo": [ - "identity" - ], - "onUpdate": "no action", - "onDelete": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "regions_displayName_unique": { - "name": "regions_displayName_unique", - "columns": [ - "displayName" - ], - "nullsNotDistinct": false - }, - "regions_urlValue_unique": { - "name": "regions_urlValue_unique", - "columns": [ - "urlValue" - ], - "nullsNotDistinct": false - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.relay_miners": { - "name": "relay_miners", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "identity": { - "name": "relay_miners_id_seq", - "increment": "1", - "minValue": "1", - "maxValue": "2147483647", - "startWith": "1", - "cache": "1", - "cycle": false, - "schema": "public", - "type": "always" - } - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "identity": { - "name": "identity", - "type": "varchar(66)", - "primaryKey": false, - "notNull": true - }, - "region_id": { - "name": "region_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "domain": { - "name": "domain", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "createdBy": { - "name": "createdBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "updatedBy": { - "name": "updatedBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": { - "unique_identity_region_idx": { - "name": "unique_identity_region_idx", - "columns": [ - { - "expression": "identity", - "isExpression": false, - "asc": true, - "nulls": "last" - }, - { - "expression": "region_id", - "isExpression": false, - "asc": true, - "nulls": "last" - } - ], - "isUnique": true, - "with": {}, - "method": "btree", - "concurrently": false - } - }, - "foreignKeys": { - "relay_miners_region_id_regions_id_fk": { - "name": "relay_miners_region_id_regions_id_fk", - "tableFrom": "relay_miners", - "columnsFrom": [ - "region_id" - ], - "tableTo": "regions", - "columnsTo": [ - "id" - ], - "onUpdate": "no action", - "onDelete": "no action" - }, - "relay_miners_createdBy_users_identity_fk": { - "name": "relay_miners_createdBy_users_identity_fk", - "tableFrom": "relay_miners", - "columnsFrom": [ - "createdBy" - ], - "tableTo": "users", - "columnsTo": [ - "identity" - ], - "onUpdate": "no action", - "onDelete": "no action" - }, - "relay_miners_updatedBy_users_identity_fk": { - "name": "relay_miners_updatedBy_users_identity_fk", - "tableFrom": "relay_miners", - "columnsFrom": [ - "updatedBy" - ], - "tableTo": "users", - "columnsTo": [ - "identity" - ], - "onUpdate": "no action", - "onDelete": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false - }, - "public.services": { - "name": "services", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "identity": { - "name": "services_id_seq", - "increment": "1", - "minValue": "1", - "maxValue": "2147483647", - "startWith": "1", - "cache": "1", - "cycle": false, - "schema": "public", - "type": "always" - } - }, - "serviceId": { - "name": "serviceId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "ownerAddress": { - "name": "ownerAddress", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "computeUnits": { - "name": "computeUnits", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "revSharePercentage": { - "name": "revSharePercentage", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "endpoints": { - "name": "endpoints", - "type": "json", - "primaryKey": false, - "notNull": true - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "createdBy": { - "name": "createdBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "default": "now()" - }, - "updatedBy": { - "name": "updatedBy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "services_createdBy_users_identity_fk": { - "name": "services_createdBy_users_identity_fk", - "tableFrom": "services", - "columnsFrom": [ - "createdBy" - ], - "tableTo": "users", - "columnsTo": [ - "identity" - ], - "onUpdate": "no action", - "onDelete": "no action" - }, - "services_updatedBy_users_identity_fk": { - "name": "services_updatedBy_users_identity_fk", - "tableFrom": "services", - "columnsFrom": [ - "updatedBy" - ], - "tableTo": "users", - "columnsTo": [ - "identity" - ], - "onUpdate": "no action", - "onDelete": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "services_serviceId_unique": { - "name": "services_serviceId_unique", - "columns": [ - "serviceId" - ], - "nullsNotDistinct": false - } - }, - "policies": {}, - "checkConstraints": { - "check_endpoints_not_empty": { - "name": "check_endpoints_not_empty", - "value": "json_array_length(endpoints) > 0" - } - }, - "isRLSEnabled": false - } - }, - "enums": { - "public.address_states": { - "name": "address_states", - "schema": "public", - "values": [ - "imported", - "available", - "delivered", - "staking", - "remediation_failed", - "attention_needed", - "staked", - "stake_failed", - "unstaking", - "unstaked", - "missing_stake" - ] - }, - "public.chain_ids": { - "name": "chain_ids", - "schema": "public", - "values": [ - "pocket", - "pocket-beta", - "pocket-alpha", - "pocket-lego-testnet" - ] - }, - "public.import_request_status": { - "name": "import_request_status", - "schema": "public", - "values": [ - "pending", - "completed", - "expired", - "cancelled", - "failed" - ] - }, - "public.provider_fee": { - "name": "provider_fee", - "schema": "public", - "values": [ - "up_to", - "fixed" - ] - }, - "public.role": { - "name": "role", - "schema": "public", - "values": [ - "admin", - "user", - "owner" - ] - } - }, - "schemas": {}, - "views": {}, - "sequences": {}, - "roles": {}, - "policies": {}, - "_meta": { - "columns": {}, - "schemas": {}, - "tables": {} - } + "id": "219c2209-3dc1-43c9-9563-e98c375ac6ab", + "prevId": "8da36f45-7bbf-4ef1-ad04-ab117d0e11bf", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.address_group_services": { + "name": "address_group_services", + "schema": "", + "columns": { + "address_group_id": { + "name": "address_group_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "service_id": { + "name": "service_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "addSupplierShare": { + "name": "addSupplierShare", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "supplierShare": { + "name": "supplierShare", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "revShare": { + "name": "revShare", + "type": "json", + "primaryKey": false, + "notNull": true, + "default": "'[]'::json" + }, + "endpointOverrides": { + "name": "endpointOverrides", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'{}'::json" + } + }, + "indexes": {}, + "foreignKeys": { + "address_group_services_address_group_id_address_groups_id_fk": { + "name": "address_group_services_address_group_id_address_groups_id_fk", + "tableFrom": "address_group_services", + "columnsFrom": [ + "address_group_id" + ], + "tableTo": "address_groups", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "no action" + }, + "address_group_services_service_id_services_serviceId_fk": { + "name": "address_group_services_service_id_services_serviceId_fk", + "tableFrom": "address_group_services", + "columnsFrom": [ + "service_id" + ], + "tableTo": "services", + "columnsTo": [ + "serviceId" + ], + "onUpdate": "no action", + "onDelete": "no action" + } + }, + "compositePrimaryKeys": { + "address_group_services_address_group_id_service_id_pk": { + "name": "address_group_services_address_group_id_service_id_pk", + "columns": [ + "address_group_id", + "service_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.address_groups": { + "name": "address_groups", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "name": "address_groups_id_seq", + "increment": "1", + "minValue": "1", + "maxValue": "2147483647", + "startWith": "1", + "cache": "1", + "cycle": false, + "schema": "public", + "type": "always" + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "linkedAddresses": { + "name": "linkedAddresses", + "type": "varchar[]", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "private": { + "name": "private", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "relay_miner_id": { + "name": "relay_miner_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "address_groups_relay_miner_id_relay_miners_id_fk": { + "name": "address_groups_relay_miner_id_relay_miners_id_fk", + "tableFrom": "address_groups", + "columnsFrom": [ + "relay_miner_id" + ], + "tableTo": "relay_miners", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "restrict" + }, + "address_groups_createdBy_users_identity_fk": { + "name": "address_groups_createdBy_users_identity_fk", + "tableFrom": "address_groups", + "columnsFrom": [ + "createdBy" + ], + "tableTo": "users", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + }, + "address_groups_updatedBy_users_identity_fk": { + "name": "address_groups_updatedBy_users_identity_fk", + "tableFrom": "address_groups", + "columnsFrom": [ + "updatedBy" + ], + "tableTo": "users", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.application_settings": { + "name": "application_settings", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "name": "application_settings_id_seq", + "increment": "1", + "minValue": "1", + "maxValue": "2147483647", + "startWith": "1", + "cache": "1", + "cycle": false, + "schema": "public", + "type": "always" + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "appIdentity": { + "name": "appIdentity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "supportEmail": { + "name": "supportEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ownerIdentity": { + "name": "ownerIdentity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "ownerEmail": { + "name": "ownerEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "chainId": { + "name": "chainId", + "type": "chain_ids", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "minimumStake": { + "name": "minimumStake", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "initialOperationalFunds": { + "name": "initialOperationalFunds", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 5 + }, + "minimumOperationalFunds": { + "name": "minimumOperationalFunds", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 2 + }, + "isBootstrapped": { + "name": "isBootstrapped", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "indexerApiUrl": { + "name": "indexerApiUrl", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "rewardAddresses": { + "name": "rewardAddresses", + "type": "varchar[]", + "primaryKey": false, + "notNull": false + }, + "updatedAtHeight": { + "name": "updatedAtHeight", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "pocketApiUrl": { + "name": "pocketApiUrl", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "pocketRpcUrl": { + "name": "pocketRpcUrl", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "application_settings_createdBy_users_identity_fk": { + "name": "application_settings_createdBy_users_identity_fk", + "tableFrom": "application_settings", + "columnsFrom": [ + "createdBy" + ], + "tableTo": "users", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + }, + "application_settings_updatedBy_users_identity_fk": { + "name": "application_settings_updatedBy_users_identity_fk", + "tableFrom": "application_settings", + "columnsFrom": [ + "updatedBy" + ], + "tableTo": "users", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.delegators": { + "name": "delegators", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "name": "delegators_id_seq", + "increment": "1", + "minValue": "1", + "maxValue": "2147483647", + "startWith": "1", + "cache": "1", + "cycle": false, + "schema": "public", + "type": "always" + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "identity": { + "name": "identity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "delegators_createdBy_users_identity_fk": { + "name": "delegators_createdBy_users_identity_fk", + "tableFrom": "delegators", + "columnsFrom": [ + "createdBy" + ], + "tableTo": "users", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + }, + "delegators_updatedBy_users_identity_fk": { + "name": "delegators_updatedBy_users_identity_fk", + "tableFrom": "delegators", + "columnsFrom": [ + "updatedBy" + ], + "tableTo": "users", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "delegators_identity_unique": { + "name": "delegators_identity_unique", + "columns": [ + "identity" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.import_supplier_requests": { + "name": "import_supplier_requests", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "name": "import_supplier_requests_id_seq", + "increment": "1", + "minValue": "1", + "maxValue": "2147483647", + "startWith": "1", + "cache": "1", + "cycle": false, + "schema": "public", + "type": "always" + } + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "delegatorIdentity": { + "name": "delegatorIdentity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": false + }, + "nonce": { + "name": "nonce", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "import_request_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "matchingSupplierAddresses": { + "name": "matchingSupplierAddresses", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'::json" + }, + "delegatorRevSharePercentage": { + "name": "delegatorRevSharePercentage", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "delegatorRewardsAddress": { + "name": "delegatorRewardsAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "errorMessage": { + "name": "errorMessage", + "type": "varchar(1024)", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "completedAt": { + "name": "completedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "import_supplier_requests_delegatorIdentity_delegators_identity_fk": { + "name": "import_supplier_requests_delegatorIdentity_delegators_identity_fk", + "tableFrom": "import_supplier_requests", + "columnsFrom": [ + "delegatorIdentity" + ], + "tableTo": "delegators", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "import_supplier_requests_nonce_unique": { + "name": "import_supplier_requests_nonce_unique", + "columns": [ + "nonce" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "name": "users_id_seq", + "increment": "1", + "minValue": "1", + "maxValue": "2147483647", + "startWith": "1", + "cache": "1", + "cycle": false, + "schema": "public", + "type": "always" + } + }, + "identity": { + "name": "identity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_identity_unique": { + "name": "users_identity_unique", + "columns": [ + "identity" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.keys": { + "name": "keys", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "name": "keys_id_seq", + "increment": "1", + "minValue": "1", + "maxValue": "2147483647", + "startWith": "1", + "cache": "1", + "cycle": false, + "schema": "public", + "type": "always" + } + }, + "address": { + "name": "address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "publicKey": { + "name": "publicKey", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "state": { + "name": "state", + "type": "address_states", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'available'" + }, + "remediationHistory": { + "name": "remediationHistory", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'::json" + }, + "deliveredAt": { + "name": "deliveredAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "delegator_identity": { + "name": "delegator_identity", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "address_group_id": { + "name": "address_group_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "delegatorRevSharePercentage": { + "name": "delegatorRevSharePercentage", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "delegatorRewardsAddress": { + "name": "delegatorRewardsAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "lastUpdatedHeight": { + "name": "lastUpdatedHeight", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "stakeOwner": { + "name": "stakeOwner", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "stakeAmountUpokt": { + "name": "stakeAmountUpokt", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "balanceUpokt": { + "name": "balanceUpokt", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "services": { + "name": "services", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'::json" + }, + "exportedAt": { + "name": "exportedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "exportCount": { + "name": "exportCount", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + } + }, + "indexes": {}, + "foreignKeys": { + "keys_delegator_identity_delegators_identity_fk": { + "name": "keys_delegator_identity_delegators_identity_fk", + "tableFrom": "keys", + "columnsFrom": [ + "delegator_identity" + ], + "tableTo": "delegators", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + }, + "keys_address_group_id_address_groups_id_fk": { + "name": "keys_address_group_id_address_groups_id_fk", + "tableFrom": "keys", + "columnsFrom": [ + "address_group_id" + ], + "tableTo": "address_groups", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "keys_address_unique": { + "name": "keys_address_unique", + "columns": [ + "address" + ], + "nullsNotDistinct": false + }, + "keys_publicKey_unique": { + "name": "keys_publicKey_unique", + "columns": [ + "publicKey" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.regions": { + "name": "regions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "name": "regions_id_seq", + "increment": "1", + "minValue": "1", + "maxValue": "2147483647", + "startWith": "1", + "cache": "1", + "cycle": false, + "schema": "public", + "type": "always" + } + }, + "displayName": { + "name": "displayName", + "type": "varchar(20)", + "primaryKey": false, + "notNull": true + }, + "urlValue": { + "name": "urlValue", + "type": "varchar(20)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "regions_createdBy_users_identity_fk": { + "name": "regions_createdBy_users_identity_fk", + "tableFrom": "regions", + "columnsFrom": [ + "createdBy" + ], + "tableTo": "users", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + }, + "regions_updatedBy_users_identity_fk": { + "name": "regions_updatedBy_users_identity_fk", + "tableFrom": "regions", + "columnsFrom": [ + "updatedBy" + ], + "tableTo": "users", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "regions_displayName_unique": { + "name": "regions_displayName_unique", + "columns": [ + "displayName" + ], + "nullsNotDistinct": false + }, + "regions_urlValue_unique": { + "name": "regions_urlValue_unique", + "columns": [ + "urlValue" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.relay_miners": { + "name": "relay_miners", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "name": "relay_miners_id_seq", + "increment": "1", + "minValue": "1", + "maxValue": "2147483647", + "startWith": "1", + "cache": "1", + "cycle": false, + "schema": "public", + "type": "always" + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "identity": { + "name": "identity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "region_id": { + "name": "region_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "domain": { + "name": "domain", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "unique_identity_region_idx": { + "name": "unique_identity_region_idx", + "columns": [ + { + "expression": "identity", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "region_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "with": {}, + "method": "btree", + "concurrently": false + } + }, + "foreignKeys": { + "relay_miners_region_id_regions_id_fk": { + "name": "relay_miners_region_id_regions_id_fk", + "tableFrom": "relay_miners", + "columnsFrom": [ + "region_id" + ], + "tableTo": "regions", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "no action" + }, + "relay_miners_createdBy_users_identity_fk": { + "name": "relay_miners_createdBy_users_identity_fk", + "tableFrom": "relay_miners", + "columnsFrom": [ + "createdBy" + ], + "tableTo": "users", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + }, + "relay_miners_updatedBy_users_identity_fk": { + "name": "relay_miners_updatedBy_users_identity_fk", + "tableFrom": "relay_miners", + "columnsFrom": [ + "updatedBy" + ], + "tableTo": "users", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.services": { + "name": "services", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "name": "services_id_seq", + "increment": "1", + "minValue": "1", + "maxValue": "2147483647", + "startWith": "1", + "cache": "1", + "cycle": false, + "schema": "public", + "type": "always" + } + }, + "serviceId": { + "name": "serviceId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "computeUnits": { + "name": "computeUnits", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "revSharePercentage": { + "name": "revSharePercentage", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "endpoints": { + "name": "endpoints", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "services_createdBy_users_identity_fk": { + "name": "services_createdBy_users_identity_fk", + "tableFrom": "services", + "columnsFrom": [ + "createdBy" + ], + "tableTo": "users", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + }, + "services_updatedBy_users_identity_fk": { + "name": "services_updatedBy_users_identity_fk", + "tableFrom": "services", + "columnsFrom": [ + "updatedBy" + ], + "tableTo": "users", + "columnsTo": [ + "identity" + ], + "onUpdate": "no action", + "onDelete": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "services_serviceId_unique": { + "name": "services_serviceId_unique", + "columns": [ + "serviceId" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "checkConstraints": { + "check_endpoints_not_empty": { + "name": "check_endpoints_not_empty", + "value": "json_array_length(endpoints) > 0" + } + }, + "isRLSEnabled": false + }, + "public.transactions": { + "name": "transactions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "transactions_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "key_id": { + "name": "key_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "key_address": { + "name": "key_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "tx_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "tx_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "reason": { + "name": "reason", + "type": "varchar(10)", + "primaryKey": false, + "notNull": false + }, + "trigger": { + "name": "trigger", + "type": "tx_trigger", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false + }, + "code": { + "name": "code", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "message": { + "name": "message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "execution_height": { + "name": "execution_height", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "transactions_key_id_keys_id_fk": { + "name": "transactions_key_id_keys_id_fk", + "tableFrom": "transactions", + "tableTo": "keys", + "columnsFrom": [ + "key_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.address_states": { + "name": "address_states", + "schema": "public", + "values": [ + "imported", + "available", + "delivered", + "staking", + "remediation_failed", + "attention_needed", + "staked", + "stake_failed", + "unstaking", + "unstaked", + "missing_stake" + ] + }, + "public.chain_ids": { + "name": "chain_ids", + "schema": "public", + "values": [ + "pocket", + "pocket-beta", + "pocket-alpha", + "pocket-lego-testnet" + ] + }, + "public.import_request_status": { + "name": "import_request_status", + "schema": "public", + "values": [ + "pending", + "completed", + "expired", + "cancelled", + "failed" + ] + }, + "public.provider_fee": { + "name": "provider_fee", + "schema": "public", + "values": [ + "up_to", + "fixed" + ] + }, + "public.role": { + "name": "role", + "schema": "public", + "values": [ + "admin", + "user", + "owner" + ] + }, + "public.tx_status": { + "name": "tx_status", + "schema": "public", + "values": [ + "pending", + "success", + "failure" + ] + }, + "public.tx_trigger": { + "name": "tx_trigger", + "schema": "public", + "values": [ + "manual", + "automatic" + ] + }, + "public.tx_type": { + "name": "tx_type", + "schema": "public", + "values": [ + "stake", + "unstake" + ] + } + }, + "schemas": {}, + "views": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } } \ No newline at end of file diff --git a/apps/provider/drizzle/meta/0018_snapshot.json b/apps/provider/drizzle/meta/0018_snapshot.json new file mode 100644 index 00000000..7eb8d010 --- /dev/null +++ b/apps/provider/drizzle/meta/0018_snapshot.json @@ -0,0 +1,1525 @@ +{ + "id": "a0ef2293-a178-481f-ba84-d7025fc250a4", + "prevId": "219c2209-3dc1-43c9-9563-e98c375ac6ab", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.address_group_services": { + "name": "address_group_services", + "schema": "", + "columns": { + "address_group_id": { + "name": "address_group_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "service_id": { + "name": "service_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "addSupplierShare": { + "name": "addSupplierShare", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "supplierShare": { + "name": "supplierShare", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "revShare": { + "name": "revShare", + "type": "json", + "primaryKey": false, + "notNull": true, + "default": "'[]'::json" + }, + "endpointOverrides": { + "name": "endpointOverrides", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'{}'::json" + } + }, + "indexes": {}, + "foreignKeys": { + "address_group_services_address_group_id_address_groups_id_fk": { + "name": "address_group_services_address_group_id_address_groups_id_fk", + "tableFrom": "address_group_services", + "tableTo": "address_groups", + "columnsFrom": [ + "address_group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "address_group_services_service_id_services_serviceId_fk": { + "name": "address_group_services_service_id_services_serviceId_fk", + "tableFrom": "address_group_services", + "tableTo": "services", + "columnsFrom": [ + "service_id" + ], + "columnsTo": [ + "serviceId" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "address_group_services_address_group_id_service_id_pk": { + "name": "address_group_services_address_group_id_service_id_pk", + "columns": [ + "address_group_id", + "service_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.address_groups": { + "name": "address_groups", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "address_groups_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "linkedAddresses": { + "name": "linkedAddresses", + "type": "varchar[]", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "private": { + "name": "private", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "relay_miner_id": { + "name": "relay_miner_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "address_groups_relay_miner_id_relay_miners_id_fk": { + "name": "address_groups_relay_miner_id_relay_miners_id_fk", + "tableFrom": "address_groups", + "tableTo": "relay_miners", + "columnsFrom": [ + "relay_miner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "no action" + }, + "address_groups_createdBy_users_identity_fk": { + "name": "address_groups_createdBy_users_identity_fk", + "tableFrom": "address_groups", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "address_groups_updatedBy_users_identity_fk": { + "name": "address_groups_updatedBy_users_identity_fk", + "tableFrom": "address_groups", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.application_settings": { + "name": "application_settings", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "application_settings_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "appIdentity": { + "name": "appIdentity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "supportEmail": { + "name": "supportEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ownerIdentity": { + "name": "ownerIdentity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "ownerEmail": { + "name": "ownerEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "chainId": { + "name": "chainId", + "type": "chain_ids", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "minimumStake": { + "name": "minimumStake", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "initialOperationalFunds": { + "name": "initialOperationalFunds", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 5 + }, + "minimumOperationalFunds": { + "name": "minimumOperationalFunds", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 2 + }, + "isBootstrapped": { + "name": "isBootstrapped", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "pocketApiUrl": { + "name": "pocketApiUrl", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "pocketRpcUrl": { + "name": "pocketRpcUrl", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "indexerApiUrl": { + "name": "indexerApiUrl", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "rewardAddresses": { + "name": "rewardAddresses", + "type": "varchar[]", + "primaryKey": false, + "notNull": false + }, + "updatedAtHeight": { + "name": "updatedAtHeight", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "application_settings_createdBy_users_identity_fk": { + "name": "application_settings_createdBy_users_identity_fk", + "tableFrom": "application_settings", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "application_settings_updatedBy_users_identity_fk": { + "name": "application_settings_updatedBy_users_identity_fk", + "tableFrom": "application_settings", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.delegators": { + "name": "delegators", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "delegators_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "identity": { + "name": "identity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "delegators_createdBy_users_identity_fk": { + "name": "delegators_createdBy_users_identity_fk", + "tableFrom": "delegators", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "delegators_updatedBy_users_identity_fk": { + "name": "delegators_updatedBy_users_identity_fk", + "tableFrom": "delegators", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "delegators_identity_unique": { + "name": "delegators_identity_unique", + "nullsNotDistinct": false, + "columns": [ + "identity" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.import_supplier_requests": { + "name": "import_supplier_requests", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "import_supplier_requests_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "delegatorIdentity": { + "name": "delegatorIdentity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": false + }, + "nonce": { + "name": "nonce", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "import_request_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "matchingSupplierAddresses": { + "name": "matchingSupplierAddresses", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'::json" + }, + "delegatorRevSharePercentage": { + "name": "delegatorRevSharePercentage", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "delegatorRewardsAddress": { + "name": "delegatorRewardsAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "errorMessage": { + "name": "errorMessage", + "type": "varchar(1024)", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "completedAt": { + "name": "completedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "import_supplier_requests_delegatorIdentity_delegators_identity_fk": { + "name": "import_supplier_requests_delegatorIdentity_delegators_identity_fk", + "tableFrom": "import_supplier_requests", + "tableTo": "delegators", + "columnsFrom": [ + "delegatorIdentity" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "import_supplier_requests_nonce_unique": { + "name": "import_supplier_requests_nonce_unique", + "nullsNotDistinct": false, + "columns": [ + "nonce" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "users_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "identity": { + "name": "identity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_identity_unique": { + "name": "users_identity_unique", + "nullsNotDistinct": false, + "columns": [ + "identity" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.keys": { + "name": "keys", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "keys_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "address": { + "name": "address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "publicKey": { + "name": "publicKey", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "state": { + "name": "state", + "type": "address_states", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'available'" + }, + "remediationHistory": { + "name": "remediationHistory", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'::json" + }, + "deliveredAt": { + "name": "deliveredAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "delegator_identity": { + "name": "delegator_identity", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "address_group_id": { + "name": "address_group_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "delegatorRevSharePercentage": { + "name": "delegatorRevSharePercentage", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "delegatorRewardsAddress": { + "name": "delegatorRewardsAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "lastUpdatedHeight": { + "name": "lastUpdatedHeight", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "stakeOwner": { + "name": "stakeOwner", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "stakeAmountUpokt": { + "name": "stakeAmountUpokt", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "balanceUpokt": { + "name": "balanceUpokt", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "services": { + "name": "services", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'::json" + }, + "exportedAt": { + "name": "exportedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "exportCount": { + "name": "exportCount", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + } + }, + "indexes": {}, + "foreignKeys": { + "keys_delegator_identity_delegators_identity_fk": { + "name": "keys_delegator_identity_delegators_identity_fk", + "tableFrom": "keys", + "tableTo": "delegators", + "columnsFrom": [ + "delegator_identity" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "keys_address_group_id_address_groups_id_fk": { + "name": "keys_address_group_id_address_groups_id_fk", + "tableFrom": "keys", + "tableTo": "address_groups", + "columnsFrom": [ + "address_group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "keys_address_unique": { + "name": "keys_address_unique", + "nullsNotDistinct": false, + "columns": [ + "address" + ] + }, + "keys_publicKey_unique": { + "name": "keys_publicKey_unique", + "nullsNotDistinct": false, + "columns": [ + "publicKey" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.regions": { + "name": "regions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "regions_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "displayName": { + "name": "displayName", + "type": "varchar(20)", + "primaryKey": false, + "notNull": true + }, + "urlValue": { + "name": "urlValue", + "type": "varchar(20)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "regions_createdBy_users_identity_fk": { + "name": "regions_createdBy_users_identity_fk", + "tableFrom": "regions", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "regions_updatedBy_users_identity_fk": { + "name": "regions_updatedBy_users_identity_fk", + "tableFrom": "regions", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "regions_displayName_unique": { + "name": "regions_displayName_unique", + "nullsNotDistinct": false, + "columns": [ + "displayName" + ] + }, + "regions_urlValue_unique": { + "name": "regions_urlValue_unique", + "nullsNotDistinct": false, + "columns": [ + "urlValue" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.relay_miners": { + "name": "relay_miners", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "relay_miners_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "identity": { + "name": "identity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "region_id": { + "name": "region_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "domain": { + "name": "domain", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "unique_identity_region_idx": { + "name": "unique_identity_region_idx", + "columns": [ + { + "expression": "identity", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "region_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "relay_miners_region_id_regions_id_fk": { + "name": "relay_miners_region_id_regions_id_fk", + "tableFrom": "relay_miners", + "tableTo": "regions", + "columnsFrom": [ + "region_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "relay_miners_createdBy_users_identity_fk": { + "name": "relay_miners_createdBy_users_identity_fk", + "tableFrom": "relay_miners", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "relay_miners_updatedBy_users_identity_fk": { + "name": "relay_miners_updatedBy_users_identity_fk", + "tableFrom": "relay_miners", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.services": { + "name": "services", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "services_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "serviceId": { + "name": "serviceId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "computeUnits": { + "name": "computeUnits", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "revSharePercentage": { + "name": "revSharePercentage", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "endpoints": { + "name": "endpoints", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "services_createdBy_users_identity_fk": { + "name": "services_createdBy_users_identity_fk", + "tableFrom": "services", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "services_updatedBy_users_identity_fk": { + "name": "services_updatedBy_users_identity_fk", + "tableFrom": "services", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "services_serviceId_unique": { + "name": "services_serviceId_unique", + "nullsNotDistinct": false, + "columns": [ + "serviceId" + ] + } + }, + "policies": {}, + "checkConstraints": { + "check_endpoints_not_empty": { + "name": "check_endpoints_not_empty", + "value": "json_array_length(endpoints) > 0" + } + }, + "isRLSEnabled": false + }, + "public.transactions": { + "name": "transactions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "transactions_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "key_id": { + "name": "key_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "key_address": { + "name": "key_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "tx_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "tx_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "reason": { + "name": "reason", + "type": "varchar(10)", + "primaryKey": false, + "notNull": false + }, + "trigger": { + "name": "trigger", + "type": "tx_trigger", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false + }, + "code": { + "name": "code", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "message": { + "name": "message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "execution_height": { + "name": "execution_height", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "last_covered_height": { + "name": "last_covered_height", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "tx_verification_attempts": { + "name": "tx_verification_attempts", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "supplier_verification_attempts": { + "name": "supplier_verification_attempts", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "unavailable_checks": { + "name": "unavailable_checks", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "last_verification_at": { + "name": "last_verification_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "transactions_key_id_keys_id_fk": { + "name": "transactions_key_id_keys_id_fk", + "tableFrom": "transactions", + "tableTo": "keys", + "columnsFrom": [ + "key_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.address_states": { + "name": "address_states", + "schema": "public", + "values": [ + "imported", + "available", + "delivered", + "staking", + "remediation_failed", + "attention_needed", + "staked", + "stake_failed", + "unstaking", + "unstaked", + "missing_stake" + ] + }, + "public.chain_ids": { + "name": "chain_ids", + "schema": "public", + "values": [ + "pocket", + "pocket-beta", + "pocket-alpha", + "pocket-lego-testnet" + ] + }, + "public.import_request_status": { + "name": "import_request_status", + "schema": "public", + "values": [ + "pending", + "completed", + "expired", + "cancelled", + "failed" + ] + }, + "public.provider_fee": { + "name": "provider_fee", + "schema": "public", + "values": [ + "up_to", + "fixed" + ] + }, + "public.role": { + "name": "role", + "schema": "public", + "values": [ + "admin", + "user", + "owner" + ] + }, + "public.tx_status": { + "name": "tx_status", + "schema": "public", + "values": [ + "pending", + "success", + "failure" + ] + }, + "public.tx_trigger": { + "name": "tx_trigger", + "schema": "public", + "values": [ + "manual", + "automatic" + ] + }, + "public.tx_type": { + "name": "tx_type", + "schema": "public", + "values": [ + "stake", + "unstake" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/provider/drizzle/meta/0019_snapshot.json b/apps/provider/drizzle/meta/0019_snapshot.json new file mode 100644 index 00000000..b5b141ee --- /dev/null +++ b/apps/provider/drizzle/meta/0019_snapshot.json @@ -0,0 +1,1556 @@ +{ + "id": "b56e1338-f719-4fe1-a32c-f2145431ae5f", + "prevId": "a0ef2293-a178-481f-ba84-d7025fc250a4", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.address_group_services": { + "name": "address_group_services", + "schema": "", + "columns": { + "address_group_id": { + "name": "address_group_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "service_id": { + "name": "service_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "addSupplierShare": { + "name": "addSupplierShare", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "supplierShare": { + "name": "supplierShare", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "revShare": { + "name": "revShare", + "type": "json", + "primaryKey": false, + "notNull": true, + "default": "'[]'::json" + }, + "endpointOverrides": { + "name": "endpointOverrides", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'{}'::json" + } + }, + "indexes": {}, + "foreignKeys": { + "address_group_services_address_group_id_address_groups_id_fk": { + "name": "address_group_services_address_group_id_address_groups_id_fk", + "tableFrom": "address_group_services", + "tableTo": "address_groups", + "columnsFrom": [ + "address_group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "address_group_services_service_id_services_serviceId_fk": { + "name": "address_group_services_service_id_services_serviceId_fk", + "tableFrom": "address_group_services", + "tableTo": "services", + "columnsFrom": [ + "service_id" + ], + "columnsTo": [ + "serviceId" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "address_group_services_address_group_id_service_id_pk": { + "name": "address_group_services_address_group_id_service_id_pk", + "columns": [ + "address_group_id", + "service_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.address_groups": { + "name": "address_groups", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "address_groups_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "linkedAddresses": { + "name": "linkedAddresses", + "type": "varchar[]", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "private": { + "name": "private", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "relay_miner_id": { + "name": "relay_miner_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "address_groups_relay_miner_id_relay_miners_id_fk": { + "name": "address_groups_relay_miner_id_relay_miners_id_fk", + "tableFrom": "address_groups", + "tableTo": "relay_miners", + "columnsFrom": [ + "relay_miner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "no action" + }, + "address_groups_createdBy_users_identity_fk": { + "name": "address_groups_createdBy_users_identity_fk", + "tableFrom": "address_groups", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "address_groups_updatedBy_users_identity_fk": { + "name": "address_groups_updatedBy_users_identity_fk", + "tableFrom": "address_groups", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.application_settings": { + "name": "application_settings", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "application_settings_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "appIdentity": { + "name": "appIdentity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "supportEmail": { + "name": "supportEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ownerIdentity": { + "name": "ownerIdentity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "ownerEmail": { + "name": "ownerEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "chainId": { + "name": "chainId", + "type": "chain_ids", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "minimumStake": { + "name": "minimumStake", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "initialOperationalFunds": { + "name": "initialOperationalFunds", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 5 + }, + "minimumOperationalFunds": { + "name": "minimumOperationalFunds", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 2 + }, + "isBootstrapped": { + "name": "isBootstrapped", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "pocketApiUrl": { + "name": "pocketApiUrl", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "pocketRpcUrl": { + "name": "pocketRpcUrl", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "indexerApiUrl": { + "name": "indexerApiUrl", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "rewardAddresses": { + "name": "rewardAddresses", + "type": "varchar[]", + "primaryKey": false, + "notNull": false + }, + "updatedAtHeight": { + "name": "updatedAtHeight", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "application_settings_createdBy_users_identity_fk": { + "name": "application_settings_createdBy_users_identity_fk", + "tableFrom": "application_settings", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "application_settings_updatedBy_users_identity_fk": { + "name": "application_settings_updatedBy_users_identity_fk", + "tableFrom": "application_settings", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.delegators": { + "name": "delegators", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "delegators_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "identity": { + "name": "identity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "delegators_createdBy_users_identity_fk": { + "name": "delegators_createdBy_users_identity_fk", + "tableFrom": "delegators", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "delegators_updatedBy_users_identity_fk": { + "name": "delegators_updatedBy_users_identity_fk", + "tableFrom": "delegators", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "delegators_identity_unique": { + "name": "delegators_identity_unique", + "nullsNotDistinct": false, + "columns": [ + "identity" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.import_supplier_requests": { + "name": "import_supplier_requests", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "import_supplier_requests_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "delegatorIdentity": { + "name": "delegatorIdentity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": false + }, + "nonce": { + "name": "nonce", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "import_request_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "matchingSupplierAddresses": { + "name": "matchingSupplierAddresses", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'::json" + }, + "delegatorRevSharePercentage": { + "name": "delegatorRevSharePercentage", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "delegatorRewardsAddress": { + "name": "delegatorRewardsAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "errorMessage": { + "name": "errorMessage", + "type": "varchar(1024)", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "completedAt": { + "name": "completedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "import_supplier_requests_delegatorIdentity_delegators_identity_fk": { + "name": "import_supplier_requests_delegatorIdentity_delegators_identity_fk", + "tableFrom": "import_supplier_requests", + "tableTo": "delegators", + "columnsFrom": [ + "delegatorIdentity" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "import_supplier_requests_nonce_unique": { + "name": "import_supplier_requests_nonce_unique", + "nullsNotDistinct": false, + "columns": [ + "nonce" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "users_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "identity": { + "name": "identity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_identity_unique": { + "name": "users_identity_unique", + "nullsNotDistinct": false, + "columns": [ + "identity" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.keys": { + "name": "keys", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "keys_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "address": { + "name": "address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "publicKey": { + "name": "publicKey", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "state": { + "name": "state", + "type": "address_states", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'available'" + }, + "remediationHistory": { + "name": "remediationHistory", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'::json" + }, + "deliveredAt": { + "name": "deliveredAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "delegator_identity": { + "name": "delegator_identity", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "address_group_id": { + "name": "address_group_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "delegatorRevSharePercentage": { + "name": "delegatorRevSharePercentage", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "delegatorRewardsAddress": { + "name": "delegatorRewardsAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "lastUpdatedHeight": { + "name": "lastUpdatedHeight", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "stakeOwner": { + "name": "stakeOwner", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "stakeAmountUpokt": { + "name": "stakeAmountUpokt", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "balanceUpokt": { + "name": "balanceUpokt", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "services": { + "name": "services", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'::json" + }, + "exportedAt": { + "name": "exportedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "exportCount": { + "name": "exportCount", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + } + }, + "indexes": {}, + "foreignKeys": { + "keys_delegator_identity_delegators_identity_fk": { + "name": "keys_delegator_identity_delegators_identity_fk", + "tableFrom": "keys", + "tableTo": "delegators", + "columnsFrom": [ + "delegator_identity" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "keys_address_group_id_address_groups_id_fk": { + "name": "keys_address_group_id_address_groups_id_fk", + "tableFrom": "keys", + "tableTo": "address_groups", + "columnsFrom": [ + "address_group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "keys_address_unique": { + "name": "keys_address_unique", + "nullsNotDistinct": false, + "columns": [ + "address" + ] + }, + "keys_publicKey_unique": { + "name": "keys_publicKey_unique", + "nullsNotDistinct": false, + "columns": [ + "publicKey" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.regions": { + "name": "regions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "regions_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "displayName": { + "name": "displayName", + "type": "varchar(20)", + "primaryKey": false, + "notNull": true + }, + "urlValue": { + "name": "urlValue", + "type": "varchar(20)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "regions_createdBy_users_identity_fk": { + "name": "regions_createdBy_users_identity_fk", + "tableFrom": "regions", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "regions_updatedBy_users_identity_fk": { + "name": "regions_updatedBy_users_identity_fk", + "tableFrom": "regions", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "regions_displayName_unique": { + "name": "regions_displayName_unique", + "nullsNotDistinct": false, + "columns": [ + "displayName" + ] + }, + "regions_urlValue_unique": { + "name": "regions_urlValue_unique", + "nullsNotDistinct": false, + "columns": [ + "urlValue" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.relay_miners": { + "name": "relay_miners", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "relay_miners_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "identity": { + "name": "identity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "region_id": { + "name": "region_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "domain": { + "name": "domain", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "unique_identity_region_idx": { + "name": "unique_identity_region_idx", + "columns": [ + { + "expression": "identity", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "region_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "relay_miners_region_id_regions_id_fk": { + "name": "relay_miners_region_id_regions_id_fk", + "tableFrom": "relay_miners", + "tableTo": "regions", + "columnsFrom": [ + "region_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "relay_miners_createdBy_users_identity_fk": { + "name": "relay_miners_createdBy_users_identity_fk", + "tableFrom": "relay_miners", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "relay_miners_updatedBy_users_identity_fk": { + "name": "relay_miners_updatedBy_users_identity_fk", + "tableFrom": "relay_miners", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.services": { + "name": "services", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "services_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "serviceId": { + "name": "serviceId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "computeUnits": { + "name": "computeUnits", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "revSharePercentage": { + "name": "revSharePercentage", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "endpoints": { + "name": "endpoints", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "services_createdBy_users_identity_fk": { + "name": "services_createdBy_users_identity_fk", + "tableFrom": "services", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "services_updatedBy_users_identity_fk": { + "name": "services_updatedBy_users_identity_fk", + "tableFrom": "services", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "services_serviceId_unique": { + "name": "services_serviceId_unique", + "nullsNotDistinct": false, + "columns": [ + "serviceId" + ] + } + }, + "policies": {}, + "checkConstraints": { + "check_endpoints_not_empty": { + "name": "check_endpoints_not_empty", + "value": "json_array_length(endpoints) > 0" + } + }, + "isRLSEnabled": false + }, + "public.transactions": { + "name": "transactions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "transactions_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "key_id": { + "name": "key_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "key_address": { + "name": "key_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "tx_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "tx_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "reason": { + "name": "reason", + "type": "varchar(10)", + "primaryKey": false, + "notNull": false + }, + "trigger": { + "name": "trigger", + "type": "tx_trigger", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false + }, + "code": { + "name": "code", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "message": { + "name": "message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "execution_height": { + "name": "execution_height", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "last_covered_height": { + "name": "last_covered_height", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "timeout_height": { + "name": "timeout_height", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "unavailable_checks": { + "name": "unavailable_checks", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "last_verification_at": { + "name": "last_verification_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "transactions_verifier_sweep_idx": { + "name": "transactions_verifier_sweep_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "last_verification_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "where": "\"hash\" IS NOT NULL", + "concurrently": false, + "method": "btree", + "with": {} + }, + "transactions_key_pending_uq": { + "name": "transactions_key_pending_uq", + "columns": [ + { + "expression": "key_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "status = 'pending'", + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "transactions_key_id_keys_id_fk": { + "name": "transactions_key_id_keys_id_fk", + "tableFrom": "transactions", + "tableTo": "keys", + "columnsFrom": [ + "key_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.address_states": { + "name": "address_states", + "schema": "public", + "values": [ + "imported", + "available", + "delivered", + "staking", + "remediation_failed", + "attention_needed", + "staked", + "stake_failed", + "unstaking", + "unstaked", + "missing_stake" + ] + }, + "public.chain_ids": { + "name": "chain_ids", + "schema": "public", + "values": [ + "pocket", + "pocket-beta", + "pocket-alpha", + "pocket-lego-testnet" + ] + }, + "public.import_request_status": { + "name": "import_request_status", + "schema": "public", + "values": [ + "pending", + "completed", + "expired", + "cancelled", + "failed" + ] + }, + "public.provider_fee": { + "name": "provider_fee", + "schema": "public", + "values": [ + "up_to", + "fixed" + ] + }, + "public.role": { + "name": "role", + "schema": "public", + "values": [ + "admin", + "user", + "owner" + ] + }, + "public.tx_status": { + "name": "tx_status", + "schema": "public", + "values": [ + "pending", + "success", + "failure" + ] + }, + "public.tx_trigger": { + "name": "tx_trigger", + "schema": "public", + "values": [ + "manual", + "automatic" + ] + }, + "public.tx_type": { + "name": "tx_type", + "schema": "public", + "values": [ + "stake", + "unstake" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/provider/drizzle/meta/0020_snapshot.json b/apps/provider/drizzle/meta/0020_snapshot.json new file mode 100644 index 00000000..eff9bbd9 --- /dev/null +++ b/apps/provider/drizzle/meta/0020_snapshot.json @@ -0,0 +1,1580 @@ +{ + "id": "65f8612b-1406-4b91-a344-c561719c3dfe", + "prevId": "b56e1338-f719-4fe1-a32c-f2145431ae5f", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.address_group_services": { + "name": "address_group_services", + "schema": "", + "columns": { + "address_group_id": { + "name": "address_group_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "service_id": { + "name": "service_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "addSupplierShare": { + "name": "addSupplierShare", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "supplierShare": { + "name": "supplierShare", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "revShare": { + "name": "revShare", + "type": "json", + "primaryKey": false, + "notNull": true, + "default": "'[]'::json" + }, + "endpointOverrides": { + "name": "endpointOverrides", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'{}'::json" + } + }, + "indexes": {}, + "foreignKeys": { + "address_group_services_address_group_id_address_groups_id_fk": { + "name": "address_group_services_address_group_id_address_groups_id_fk", + "tableFrom": "address_group_services", + "tableTo": "address_groups", + "columnsFrom": [ + "address_group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "address_group_services_service_id_services_serviceId_fk": { + "name": "address_group_services_service_id_services_serviceId_fk", + "tableFrom": "address_group_services", + "tableTo": "services", + "columnsFrom": [ + "service_id" + ], + "columnsTo": [ + "serviceId" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "address_group_services_address_group_id_service_id_pk": { + "name": "address_group_services_address_group_id_service_id_pk", + "columns": [ + "address_group_id", + "service_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.address_groups": { + "name": "address_groups", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "address_groups_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "linkedAddresses": { + "name": "linkedAddresses", + "type": "varchar[]", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "private": { + "name": "private", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "relay_miner_id": { + "name": "relay_miner_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "address_groups_relay_miner_id_relay_miners_id_fk": { + "name": "address_groups_relay_miner_id_relay_miners_id_fk", + "tableFrom": "address_groups", + "tableTo": "relay_miners", + "columnsFrom": [ + "relay_miner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "no action" + }, + "address_groups_createdBy_users_identity_fk": { + "name": "address_groups_createdBy_users_identity_fk", + "tableFrom": "address_groups", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "address_groups_updatedBy_users_identity_fk": { + "name": "address_groups_updatedBy_users_identity_fk", + "tableFrom": "address_groups", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.application_settings": { + "name": "application_settings", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "application_settings_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "appIdentity": { + "name": "appIdentity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "supportEmail": { + "name": "supportEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ownerIdentity": { + "name": "ownerIdentity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "ownerEmail": { + "name": "ownerEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "chainId": { + "name": "chainId", + "type": "chain_ids", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "minimumStake": { + "name": "minimumStake", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "initialOperationalFunds": { + "name": "initialOperationalFunds", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 5 + }, + "minimumOperationalFunds": { + "name": "minimumOperationalFunds", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 2 + }, + "isBootstrapped": { + "name": "isBootstrapped", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "pocketApiUrl": { + "name": "pocketApiUrl", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "pocketRpcUrl": { + "name": "pocketRpcUrl", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "indexerApiUrl": { + "name": "indexerApiUrl", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "rewardAddresses": { + "name": "rewardAddresses", + "type": "varchar[]", + "primaryKey": false, + "notNull": false + }, + "updatedAtHeight": { + "name": "updatedAtHeight", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "application_settings_createdBy_users_identity_fk": { + "name": "application_settings_createdBy_users_identity_fk", + "tableFrom": "application_settings", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "application_settings_updatedBy_users_identity_fk": { + "name": "application_settings_updatedBy_users_identity_fk", + "tableFrom": "application_settings", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.delegators": { + "name": "delegators", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "delegators_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "identity": { + "name": "identity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "delegators_createdBy_users_identity_fk": { + "name": "delegators_createdBy_users_identity_fk", + "tableFrom": "delegators", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "delegators_updatedBy_users_identity_fk": { + "name": "delegators_updatedBy_users_identity_fk", + "tableFrom": "delegators", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "delegators_identity_unique": { + "name": "delegators_identity_unique", + "nullsNotDistinct": false, + "columns": [ + "identity" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.import_supplier_requests": { + "name": "import_supplier_requests", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "import_supplier_requests_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "delegatorIdentity": { + "name": "delegatorIdentity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": false + }, + "nonce": { + "name": "nonce", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "import_request_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "matchingSupplierAddresses": { + "name": "matchingSupplierAddresses", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'::json" + }, + "delegatorRevSharePercentage": { + "name": "delegatorRevSharePercentage", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "delegatorRewardsAddress": { + "name": "delegatorRewardsAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "errorMessage": { + "name": "errorMessage", + "type": "varchar(1024)", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "completedAt": { + "name": "completedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "import_supplier_requests_delegatorIdentity_delegators_identity_fk": { + "name": "import_supplier_requests_delegatorIdentity_delegators_identity_fk", + "tableFrom": "import_supplier_requests", + "tableTo": "delegators", + "columnsFrom": [ + "delegatorIdentity" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "import_supplier_requests_nonce_unique": { + "name": "import_supplier_requests_nonce_unique", + "nullsNotDistinct": false, + "columns": [ + "nonce" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "users_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "identity": { + "name": "identity", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_identity_unique": { + "name": "users_identity_unique", + "nullsNotDistinct": false, + "columns": [ + "identity" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.keys": { + "name": "keys", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "keys_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "address": { + "name": "address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "publicKey": { + "name": "publicKey", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "state": { + "name": "state", + "type": "address_states", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'available'" + }, + "remediationHistory": { + "name": "remediationHistory", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'::json" + }, + "deliveredAt": { + "name": "deliveredAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "delegator_identity": { + "name": "delegator_identity", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "address_group_id": { + "name": "address_group_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "delegatorRevSharePercentage": { + "name": "delegatorRevSharePercentage", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "delegatorRewardsAddress": { + "name": "delegatorRewardsAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "lastUpdatedHeight": { + "name": "lastUpdatedHeight", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "stakeOwner": { + "name": "stakeOwner", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "stakeAmountUpokt": { + "name": "stakeAmountUpokt", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "balanceUpokt": { + "name": "balanceUpokt", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "services": { + "name": "services", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'::json" + }, + "exportedAt": { + "name": "exportedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "exportCount": { + "name": "exportCount", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + } + }, + "indexes": {}, + "foreignKeys": { + "keys_delegator_identity_delegators_identity_fk": { + "name": "keys_delegator_identity_delegators_identity_fk", + "tableFrom": "keys", + "tableTo": "delegators", + "columnsFrom": [ + "delegator_identity" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "keys_address_group_id_address_groups_id_fk": { + "name": "keys_address_group_id_address_groups_id_fk", + "tableFrom": "keys", + "tableTo": "address_groups", + "columnsFrom": [ + "address_group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "keys_address_unique": { + "name": "keys_address_unique", + "nullsNotDistinct": false, + "columns": [ + "address" + ] + }, + "keys_publicKey_unique": { + "name": "keys_publicKey_unique", + "nullsNotDistinct": false, + "columns": [ + "publicKey" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.regions": { + "name": "regions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "regions_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "displayName": { + "name": "displayName", + "type": "varchar(20)", + "primaryKey": false, + "notNull": true + }, + "urlValue": { + "name": "urlValue", + "type": "varchar(20)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "regions_createdBy_users_identity_fk": { + "name": "regions_createdBy_users_identity_fk", + "tableFrom": "regions", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "regions_updatedBy_users_identity_fk": { + "name": "regions_updatedBy_users_identity_fk", + "tableFrom": "regions", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "regions_displayName_unique": { + "name": "regions_displayName_unique", + "nullsNotDistinct": false, + "columns": [ + "displayName" + ] + }, + "regions_urlValue_unique": { + "name": "regions_urlValue_unique", + "nullsNotDistinct": false, + "columns": [ + "urlValue" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.relay_miners": { + "name": "relay_miners", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "relay_miners_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "identity": { + "name": "identity", + "type": "varchar(66)", + "primaryKey": false, + "notNull": true + }, + "region_id": { + "name": "region_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "domain": { + "name": "domain", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "unique_identity_region_idx": { + "name": "unique_identity_region_idx", + "columns": [ + { + "expression": "identity", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "region_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "relay_miners_region_id_regions_id_fk": { + "name": "relay_miners_region_id_regions_id_fk", + "tableFrom": "relay_miners", + "tableTo": "regions", + "columnsFrom": [ + "region_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "relay_miners_createdBy_users_identity_fk": { + "name": "relay_miners_createdBy_users_identity_fk", + "tableFrom": "relay_miners", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "relay_miners_updatedBy_users_identity_fk": { + "name": "relay_miners_updatedBy_users_identity_fk", + "tableFrom": "relay_miners", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.services": { + "name": "services", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "services_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "serviceId": { + "name": "serviceId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "ownerAddress": { + "name": "ownerAddress", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "computeUnits": { + "name": "computeUnits", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "revSharePercentage": { + "name": "revSharePercentage", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "endpoints": { + "name": "endpoints", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "createdBy": { + "name": "createdBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedBy": { + "name": "updatedBy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "services_createdBy_users_identity_fk": { + "name": "services_createdBy_users_identity_fk", + "tableFrom": "services", + "tableTo": "users", + "columnsFrom": [ + "createdBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "services_updatedBy_users_identity_fk": { + "name": "services_updatedBy_users_identity_fk", + "tableFrom": "services", + "tableTo": "users", + "columnsFrom": [ + "updatedBy" + ], + "columnsTo": [ + "identity" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "services_serviceId_unique": { + "name": "services_serviceId_unique", + "nullsNotDistinct": false, + "columns": [ + "serviceId" + ] + } + }, + "policies": {}, + "checkConstraints": { + "check_endpoints_not_empty": { + "name": "check_endpoints_not_empty", + "value": "json_array_length(endpoints) > 0" + } + }, + "isRLSEnabled": false + }, + "public.transactions": { + "name": "transactions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "transactions_id_seq", + "schema": "public", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "key_id": { + "name": "key_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "key_address": { + "name": "key_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "tx_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "tx_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "reason": { + "name": "reason", + "type": "varchar(10)", + "primaryKey": false, + "notNull": false + }, + "trigger": { + "name": "trigger", + "type": "tx_trigger", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false + }, + "code": { + "name": "code", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "message": { + "name": "message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "execution_height": { + "name": "execution_height", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "last_covered_height": { + "name": "last_covered_height", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "timeout_height": { + "name": "timeout_height", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "unavailable_checks": { + "name": "unavailable_checks", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "last_verification_at": { + "name": "last_verification_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "signed_payload": { + "name": "signed_payload", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "timeout_timestamp": { + "name": "timeout_timestamp", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "params": { + "name": "params", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "reasons": { + "name": "reasons", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "transactions_verifier_sweep_idx": { + "name": "transactions_verifier_sweep_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "last_verification_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "where": "\"hash\" IS NOT NULL", + "concurrently": false, + "method": "btree", + "with": {} + }, + "transactions_key_pending_uq": { + "name": "transactions_key_pending_uq", + "columns": [ + { + "expression": "key_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "status = 'pending'", + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "transactions_key_id_keys_id_fk": { + "name": "transactions_key_id_keys_id_fk", + "tableFrom": "transactions", + "tableTo": "keys", + "columnsFrom": [ + "key_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.address_states": { + "name": "address_states", + "schema": "public", + "values": [ + "imported", + "available", + "delivered", + "staking", + "remediation_failed", + "attention_needed", + "staked", + "stake_failed", + "unstaking", + "unstaked", + "missing_stake" + ] + }, + "public.chain_ids": { + "name": "chain_ids", + "schema": "public", + "values": [ + "pocket", + "pocket-beta", + "pocket-alpha", + "pocket-lego-testnet" + ] + }, + "public.import_request_status": { + "name": "import_request_status", + "schema": "public", + "values": [ + "pending", + "completed", + "expired", + "cancelled", + "failed" + ] + }, + "public.provider_fee": { + "name": "provider_fee", + "schema": "public", + "values": [ + "up_to", + "fixed" + ] + }, + "public.role": { + "name": "role", + "schema": "public", + "values": [ + "admin", + "user", + "owner" + ] + }, + "public.tx_status": { + "name": "tx_status", + "schema": "public", + "values": [ + "pending", + "success", + "failure" + ] + }, + "public.tx_trigger": { + "name": "tx_trigger", + "schema": "public", + "values": [ + "manual", + "automatic" + ] + }, + "public.tx_type": { + "name": "tx_type", + "schema": "public", + "values": [ + "stake", + "unstake" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/provider/drizzle/meta/_journal.json b/apps/provider/drizzle/meta/_journal.json index 8bad0bd4..49174238 100644 --- a/apps/provider/drizzle/meta/_journal.json +++ b/apps/provider/drizzle/meta/_journal.json @@ -127,6 +127,27 @@ "when": 1774900301191, "tag": "0017_narrow_doctor_doom", "breakpoints": true + }, + { + "idx": 18, + "version": "7", + "when": 1781146262961, + "tag": "0018_white_proudstar", + "breakpoints": true + }, + { + "idx": 19, + "version": "7", + "when": 1781295991057, + "tag": "0019_stormy_black_queen", + "breakpoints": true + }, + { + "idx": 20, + "version": "7", + "when": 1781371491164, + "tag": "0020_nostalgic_thing", + "breakpoints": true } ] } \ No newline at end of file diff --git a/docs/runbooks/2026-06-canonical-tx-deploy.md b/docs/runbooks/2026-06-canonical-tx-deploy.md new file mode 100644 index 00000000..e9b46e5c --- /dev/null +++ b/docs/runbooks/2026-06-canonical-tx-deploy.md @@ -0,0 +1,33 @@ +# Canonical TX Broadcast — provider deploy (one-time) + +Provider switches to the canonical lifecycle (parent INTENT → dispatcher sweep → per-tx +`ExecuteTransaction` child → verify sweep) + cosmos **unordered** txs. The #308 WAL is removed. + +## Steps + +1. **Pause** provider remediation schedules: `SupplierRemediation`, `SupplierInitialStake`, + `SupplierAddressGroupMigration` (Temporal UI or `temporal schedule toggle --schedule-id --pause`). +2. **Drain** in-flight `remediateSupplier` activities — short; wait ~2 min or until none Running. +3. **Pre-mark stale WAL rows BEFORE new workers start** (replaces the deleted `expireStaleBroadcasts`): + ```sql + UPDATE transactions + SET status = 'failure', message = 'superseded by canonical-lifecycle migration' + WHERE status = 'pending' AND hash IS NULL AND created_at < now() - interval '5 minutes'; + ``` + Hash-bearing pending rows are KEPT — the new `VerifyPendingTransactions` sweeper finishes them. +4. **Run migration 0020** (adds `signed_payload`, `timeout_timestamp`, `params`, `reasons`) before workers start. +5. **Deploy workers** — provider gains `ExecuteTransaction` + `ExecutePendingTransactions` (10s, `SCHEDULE_EXECUTE_PENDING_TX_INTERVAL`, `ScheduleOverlapPolicy.SKIP`). +6. **Unpause** the remediation schedules. + +## Why this is safe + +- No Temporal `patch()` needed — provider `ExecuteTransaction` is brand new (no in-flight history to replay against changed code). Middleman is untouched in mechanism. +- Recovery is total: remediation re-detects any still-needed stake and creates a fresh INTENT row. +- Double-broadcast is impossible: `UNIQUE(key_id) WHERE pending` (one pending tx per key) + Temporal `workflowId=ExecuteTransaction-${txId}` dedup + sign&persist-before-broadcast (re-broadcast replays identical bytes → cosmos unordered `(timeoutTimestamp.UnixNano(), sender)` dedup). +- Unordered failure verdict uses **chain block time** vs `timeout_timestamp` (9-min window), never verifier wall-clock — no clock-skew split-brain. + +## Rollback + +Revert the provider-workflows + db commits and redeploy. Pending INTENT rows (hash=null) are +harmless to the old code only if the old WAL columns still exist — prefer rolling forward; if +rollback is required, also `UPDATE transactions SET status='failure' WHERE status='pending' AND hash IS NULL`. diff --git a/docs/runbooks/2026-06-pr308-deploy.md b/docs/runbooks/2026-06-pr308-deploy.md new file mode 100644 index 00000000..05550ade --- /dev/null +++ b/docs/runbooks/2026-06-pr308-deploy.md @@ -0,0 +1,27 @@ +# PR #308 deploy: ExecuteTransaction drain (one-time) + +Old ExecuteTransaction had an in-workflow verify loop (~30 min). The new definition +removed it without a Temporal patch marker — old histories CANNOT replay on new +workers. Drain before deploying middleman-workflows: + +1. Pause the ExecutePendingTransactions schedule (Temporal UI or + `temporal schedule toggle --schedule-id --pause`). +2. Terminate the PARENT first — it keeps spawning children while running: + `temporal workflow terminate --query 'WorkflowType="ExecutePendingTransactions" AND ExecutionStatus="Running"'` +3. Wait until broadcast-phase children are past hash-persist, then terminate: + poll `temporal workflow list --query 'WorkflowType="ExecuteTransaction" AND ExecutionStatus="Running"'` + — wait 10 minutes from step 2 (pre-hash phase worst case: 4 sequential + activities × 30s × 3 attempts + backoff), then + `temporal workflow terminate --query 'WorkflowType="ExecuteTransaction" AND ExecutionStatus="Running"'` +4. Deploy workers (includes the new VerifyPendingTransactions schedule). Run DB + migrations BEFORE workers start (timeoutHeight column). +5. Unpause the schedule. + +Why recovery is total: +- txs WITH hash → picked up by the VerifyPendingTransactions sweeper. +- txs WITHOUT hash → re-broadcast by ExecutePendingTransactions; the executeTransaction + activity re-broadcasts the stored signedPayload BYTE-FOR-BYTE, so a tx whose + broadcast raced the terminate yields the same hash and the chain dedupes — + termination cannot double-spend. +Provider-workflows needs no drain (PR adds a new workflow; existing workflow code +unchanged). diff --git a/k8s/tools/localnet/debug-tx.sh b/k8s/tools/localnet/debug-tx.sh new file mode 100644 index 00000000..e0548546 --- /dev/null +++ b/k8s/tools/localnet/debug-tx.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +# One-shot e2e debug snapshot for the canonical tx broadcast lifecycle (localnet). +# Usage: bash k8s/tools/localnet/debug-tx.sh [provider|middleman] [worker-log-seconds] +# Prints: tx-by-status, tx detail, keys-by-state, recent worker errors, and the +# REAL cause of the latest failed activity (from Temporal history, not the opaque +# workflow warn). Designed to be read by a verifier agent so the main thread stays lean. +set -uo pipefail +DB="${1:-provider}" +SECS="${2:-120}" +NS="$DB" + +PGPOD=$(kubectl get pods 2>/dev/null | grep '^postgresql-0' | awk '{print $1}') +PW=$(kubectl get secret postgresql -o jsonpath='{.data.postgres-password}' 2>/dev/null | base64 -d 2>/dev/null) +Q(){ kubectl exec "$PGPOD" -- bash -c "PGPASSWORD='$PW' psql -U postgres -d $DB -tAc \"$1\"" 2>/dev/null; } +WPOD=$(kubectl get pods 2>/dev/null | grep "^${DB}-workflows" | awk '{print $1}' | head -1) +ADM=$(kubectl get pods 2>/dev/null | grep temporal-admintools | awk '{print $1}') + +echo "### TX BY STATUS ($DB)" +Q "select status, type, count(*) from transactions group by 1,2 order by 1,2" +echo "### TX DETAIL (last 10)" +Q "select id, status, (hash is not null) hh, (signed_payload is not null) sp, code, left(coalesce(message,''),50) msg from transactions order by id desc limit 10" +echo "### KEYS BY STATE" +Q "select state, count(*) from keys group by 1 order by 2 desc" +echo "### WORKER ERRORS (last ${SECS}s, deduped)" +kubectl logs "$WPOD" --since="${SECS}s" 2>/dev/null \ + | grep -iE "verification failed|Activity task failed|error|reject|throw" \ + | grep -ivE "No keys found" | sed -E 's/[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]+//' \ + | sort | uniq -c | sort -rn | head -8 +echo "### LATEST FAILED ACTIVITY CAUSE (Temporal history)" +RID=$(kubectl logs "$WPOD" --since="${SECS}s" 2>/dev/null | grep -oE 'runId: "[0-9a-f-]+"' | tail -1 | sed -E 's/.*"([0-9a-f-]+)".*/\1/') +WID=$(kubectl logs "$WPOD" --since="${SECS}s" 2>/dev/null | grep -oE 'workflowId: "[^"]+"' | grep -iE "Verify|Execute" | tail -1 | sed -E 's/.*"([^"]+)".*/\1/') +if [ -n "${WID:-}" ] && [ -n "${RID:-}" ]; then + kubectl exec "$ADM" -- temporal workflow show --workflow-id "$WID" --run-id "$RID" \ + --namespace "$NS" --address temporal-frontend:7233 --output json 2>/dev/null \ + | python3 -c " +import sys,json +try: + d=json.load(sys.stdin); + for e in d.get('events',[]): + if e.get('eventType')=='EVENT_TYPE_ACTIVITY_TASK_FAILED': + f=e.get('activityTaskFailedEventAttributes',{}).get('failure',{}) + print(' msg:', f.get('message','')[:300]); break + else: print(' (no failed activity in', WID,')') +except Exception as ex: print(' parse-err', ex) +" 2>/dev/null +else echo " (no recent Verify/Execute workflow runId found)"; fi diff --git a/packages/db/src/middleman/schema/node.ts b/packages/db/src/middleman/schema/node.ts index e6484fb4..f94d0bd7 100644 --- a/packages/db/src/middleman/schema/node.ts +++ b/packages/db/src/middleman/schema/node.ts @@ -32,7 +32,7 @@ export type NodeService = { export const nodesTable = pgTable('nodes', { id: integer().primaryKey().generatedAlwaysAsIdentity(), - address: varchar({ length: 255 }).notNull(), + address: varchar({ length: 255 }).notNull().unique(), ownerAddress: varchar({ length: 255 }).notNull(), status: nodeStatusEnum().notNull(), stakeAmount: varchar().notNull(), diff --git a/packages/db/src/middleman/schema/transaction.ts b/packages/db/src/middleman/schema/transaction.ts index 2f8489c5..29c9b56a 100644 --- a/packages/db/src/middleman/schema/transaction.ts +++ b/packages/db/src/middleman/schema/transaction.ts @@ -1,12 +1,13 @@ import { AnyPgColumn, + index, integer, pgTable, text, timestamp, varchar, } from 'drizzle-orm/pg-core' -import { relations } from 'drizzle-orm' +import { relations, sql } from 'drizzle-orm' import { providerFeeEnum, transactionStatusEnum, @@ -28,6 +29,11 @@ export const transactionsTable = pgTable("transactions", { executionTimestamp: timestamp(), verificationHeight: integer(), verificationTimestamp: timestamp(), + lastCoveredHeight: integer(), + // inclusion in any block > timeoutHeight is impossible (Cosmos ante); null = no embedded bound (failure needs sequence evidence) + timeoutHeight: integer(), + unavailableChecks: integer().notNull().default(0), + lastVerificationAt: timestamp(), //Self-referencing foreign key workaround: https://orm.drizzle.team/docs/indexes-constraints#foreign-key dependsOn: integer().references((): AnyPgColumn => transactionsTable.id), @@ -43,7 +49,9 @@ export const transactionsTable = pgTable("transactions", { createdAt: timestamp().defaultNow(), updatedAt: timestamp().defaultNow().$onUpdateFn(() => new Date()), createdBy: varchar().references(() => usersTable.identity).notNull(), -}); +}, (table) => ({ + verifierSweepIdx: index('mw_transactions_verifier_sweep_idx').on(table.status, table.lastVerificationAt).where(sql`"hash" IS NOT NULL`), +})); export const transactionsRelations = relations( transactionsTable, diff --git a/packages/db/src/provider/schema/transaction.ts b/packages/db/src/provider/schema/transaction.ts index 7761604a..ee69dfe3 100644 --- a/packages/db/src/provider/schema/transaction.ts +++ b/packages/db/src/provider/schema/transaction.ts @@ -1,11 +1,13 @@ import { + index, integer, pgTable, text, timestamp, + uniqueIndex, varchar, } from 'drizzle-orm/pg-core' -import { relations } from 'drizzle-orm' +import { relations, sql } from 'drizzle-orm' import { transactionStatusEnum, transactionTypeEnum, @@ -25,8 +27,21 @@ export const transactionsTable = pgTable('transactions', { code: integer(), message: text(), executionHeight: integer('execution_height'), + lastCoveredHeight: integer('last_covered_height'), + // inclusion in any block > timeoutHeight is impossible (Cosmos ante); null = no embedded bound (failure needs sequence evidence) + timeoutHeight: integer('timeout_height'), + unavailableChecks: integer('unavailable_checks').notNull().default(0), + lastVerificationAt: timestamp('last_verification_at'), createdAt: timestamp('created_at').defaultNow(), -}) + // Canonical-lifecycle columns (sign happens in the ExecuteTransaction child): + signedPayload: text('signed_payload'), // base64 TxRaw bytes; reused on re-broadcast (idempotency) + timeoutTimestamp: timestamp('timeout_timestamp', { withTimezone: true }), // unordered failure bound (chain-time) + params: text('params'), // JSON of frozen sign inputs (services/owner/operator/addressGroup) captured at INTENT creation + reasons: text('reasons'), // JSON string[] of all remediation reasons collapsed into this tx +}, (table) => ({ + verifierSweepIdx: index('transactions_verifier_sweep_idx').on(table.status, table.lastVerificationAt).where(sql`"hash" IS NOT NULL`), + pendingPerKeyUq: uniqueIndex('transactions_key_pending_uq').on(table.keyId).where(sql`status = 'pending'`), +})) export const transactionsRelations = relations(transactionsTable, ({ one }) => ({ key: one(keysTable, { diff --git a/packages/domain/src/provider/operations/suppliers/BuildSupplierServiceConfig/BuildSupplierServiceConfigHandler.test.ts b/packages/domain/src/provider/operations/suppliers/BuildSupplierServiceConfig/BuildSupplierServiceConfigHandler.test.ts index 90f83aff..5270faed 100644 --- a/packages/domain/src/provider/operations/suppliers/BuildSupplierServiceConfig/BuildSupplierServiceConfigHandler.test.ts +++ b/packages/domain/src/provider/operations/suppliers/BuildSupplierServiceConfig/BuildSupplierServiceConfigHandler.test.ts @@ -113,6 +113,31 @@ describe('BuildSupplierServiceConfigHandler', () => { ); }); + it('leaves the client (owner) with 0% when supplier share + rev shares total 100% (kleomedes/Marco case)', () => { + // Marco configured Supplier Share 50% + a 50% rev share to his own (provider) address. + // getRevShare turns supplierShare into an operator entry and keeps the configured share, + // so the two provider-side entries already sum to 100% and the owner remainder is 0. + mockedGetRevShare.mockReturnValue([ + { address: 'pokt1kleomedes', revSharePercentage: 50 }, + { address: operatorAddress, revSharePercentage: 50 }, + ]); + + const result = handler.execute({ ...input, requestRevShare: [] }); + const cfg = result[0]!; + + // Owner (client) gets the remainder = 0, so no owner entry is added. + expect(cfg.revShare.find((r: ServiceRevenueShare) => r.address === ownerAddress)).toBeUndefined(); + // Provider side consumes the full 100%. + const total = cfg.revShare.reduce((s: number, r: ServiceRevenueShare) => s + r.revSharePercentage, 0); + expect(total).toBe(100); + expect(cfg.revShare).toEqual( + expect.arrayContaining([ + { address: 'pokt1kleomedes', revSharePercentage: 50 }, + { address: operatorAddress, revSharePercentage: 50 }, + ]), + ); + }); + it('filters out zero-percentage entries returned by helpers', () => { mockedGetRevShare.mockReturnValue([ { address: operatorAddress, revSharePercentage: 0 }, diff --git a/packages/domain/src/provider/utils/services.test.ts b/packages/domain/src/provider/utils/services.test.ts index 1f883e15..b7d0b277 100644 --- a/packages/domain/src/provider/utils/services.test.ts +++ b/packages/domain/src/provider/utils/services.test.ts @@ -54,6 +54,23 @@ describe('getRevShare', () => { const result = getRevShare(ags, 'pokt1operator'); expect(result).toEqual([{ address: 'pokt1operator', revSharePercentage: 10 }]); }); + + it('kleomedes/Marco config: supplier share + configured rev share both land on the provider side', () => { + // Supplier Share 50% (addSupplierShare) + a 50% rev share to the provider's own address. + const ags = { + revShare: [{ address: 'pokt1kleomedes', share: 50 }], + addSupplierShare: true, + supplierShare: 50, + } as unknown as AddressGroupService; + + const result = getRevShare(ags, 'pokt1operator'); + // supplierShare -> operator (the node, provider-run); configured share -> kleomedes. + // Both are provider-side and already sum to 100, leaving the client (owner remainder) 0%. + expect(result).toEqual([ + { address: 'pokt1kleomedes', revSharePercentage: 50 }, + { address: 'pokt1operator', revSharePercentage: 50 }, + ]); + }); }); describe('deduplicateRevShare', () => { diff --git a/packages/pocket/package.json b/packages/pocket/package.json index 0ea1e1ac..bf78bb64 100644 --- a/packages/pocket/package.json +++ b/packages/pocket/package.json @@ -50,6 +50,7 @@ "@cosmjs/stargate": "^0.33.1", "@cosmjs/tendermint-rpc": "^0.33.1", "@igniter/logger": "workspace:*", + "@igniter/tx-verify": "workspace:*", "cosmjs-types": "0.10.1" }, "devDependencies": { diff --git a/packages/pocket/src/index.ts b/packages/pocket/src/index.ts index 21bae41d..5af09d8c 100644 --- a/packages/pocket/src/index.ts +++ b/packages/pocket/src/index.ts @@ -7,8 +7,9 @@ import { SigningStargateClient, StargateClient, TimeoutError, } from '@cosmjs/stargate' -import {DirectSecp256k1Wallet, GeneratedType, Registry} from '@cosmjs/proto-signing' -import {TxRaw} from 'cosmjs-types/cosmos/tx/v1beta1/tx' +import {DirectSecp256k1Wallet, encodePubkey, GeneratedType, makeAuthInfoBytes, makeSignDoc, Registry} from '@cosmjs/proto-signing' +import { fromBase64 } from '@cosmjs/encoding' +import { TxBody, TxRaw } from '@pocket/proto/generated/cosmos/tx/v1beta1/tx' import { Comet38Client, connectComet, @@ -37,9 +38,13 @@ import {StakeSupplierParams} from "@pocket/types"; import {MsgStakeSupplier} from "@pocket/proto/generated/pocket/supplier/tx"; import {isValidPrivateKey} from "@pocket/utils"; import {getLogger, Logger} from '@igniter/logger' +import type { VerifyOutcome, SupplierEffect } from '@igniter/tx-verify' +import { TX_EXPIRATION_BLOCKS } from '@igniter/tx-verify' export * from './types' export * from './constants'; +export * from '@igniter/tx-verify'; +export { rPCTypeFromJSON } from './proto/generated/pocket/shared/service'; /** * Parses the expected sequence number from a Cosmos SDK account sequence mismatch error. @@ -89,6 +94,40 @@ async function mapWithConcurrency( /** Max concurrent `comet.block()` fetches per Tier-3 block scan (issue #304). */ const BLOCK_SCAN_CONCURRENCY = 8 +/** + * Encodes a raw secp256k1 public key as an amino pubkey object. + * Inlined to avoid a direct dependency on @cosmjs/amino (available only transitively). + */ +function encodeSecp256k1Pubkey(pubkey: Uint8Array): { type: string; value: string } { + return { type: 'tendermint/PubKeySecp256k1', value: Buffer.from(pubkey).toString('base64') } +} + +/** Unordered-tx validity window. 9 min < cosmos-sdk DefaultMaxTimeoutDuration (10 min). */ +const UNORDERED_TIMEOUT_MS = 9 * 60 * 1000 + +/** + * Returns true if the error is a cosmos-sdk unordered-tx duplicate rejection. + * + * FLAGGED ASSUMPTION: The exact error shape for a cosmos-sdk v0.53+ unordered + * duplicate (same (timeoutTimestamp.UnixNano(), sender)) is not verifiable from + * the JS surface alone. Based on cosmos-sdk x/auth/ante/unordered.go the error is + * registered as ErrUnorderedTxExist and is returned as a BroadcastTxError with + * code 19 (codespace "sdk") and log containing "tx already exists in cache" (the + * errorsmod.Wrapf message from the unordered handler). This is a best-effort match; + * if pocket-network's fork uses a different code, update the code number here. + */ +function isUnorderedDedupRejection(e: unknown): boolean { + if (!(e instanceof Error)) return false + const err = e as Error & { code?: number; codespace?: string; rawLog?: string } + // code 19 = cometbft ErrTxInCache (same bytes in mempool) + // code 18 = cosmos-sdk ErrInvalidRequest from verifyUnorderedNonce ("failed to add unordered nonce") + if (err.codespace === 'sdk' && (err.code === 19 || err.code === 18)) return true + const msg = String(err?.message ?? err?.rawLog ?? '').toLowerCase() + if (msg.includes('failed to add unordered nonce')) return true + if (msg.includes('tx already in mempool') || msg.includes('already exists in cache')) return true + return false +} + /** * Creates a Protobuf-based RPC client for querying a blockchain using a QueryClient. * @@ -322,30 +361,18 @@ export class PocketBlockchain { * @returns Transaction details or null if not found */ async getTransaction(txHash: string, height?: number): Promise { - const client = await this.getStargateClient() - - // Tier 1: RPC tx_index + // Tier 1 + Tier 2: keep the back-compat behavior of swallowing an RPC error + // (Tier 1) and continuing to the lower tiers instead of failing the lookup. + let direct: TransactionResult | null = null try { - const tx = await client.getTx(txHash) - if (tx) { - return { - hash: txHash, - height: tx.height, - index: tx.txIndex, - gasUsed: tx.gasUsed, - gasWanted: tx.gasWanted, - success: tx.code === 0, - code: tx.code, - } - } + direct = await this.getTransactionDirect(txHash) } catch (error) { this.logger.warn({ txHash, error }, 'Tier 1 (RPC getTx) failed') + // Tier 1 errored; still attempt Tier 2 (REST API). + const apiResult = await this.getTransactionViaApi(txHash) + if (apiResult) return apiResult } - - // Tier 2: REST API - this.logger.info({ txHash }, 'Tier 1 did not find TX, trying REST API fallback') - const apiResult = await this.getTransactionViaApi(txHash) - if (apiResult) return apiResult + if (direct) return direct // Tier 3: Block scan if (height) { @@ -358,6 +385,145 @@ export class PocketBlockchain { return null } + /** + * Tier 1 (RPC tx_index) + Tier 2 (REST API) lookup. Unlike {@link getTransaction}, + * this THROWS if the Tier 1 RPC call errors (so callers can distinguish an + * unreachable RPC from an answered "not found"). Returns null only when both + * tiers answered and the tx was not present. + */ + private async getTransactionDirect(txHash: string): Promise { + const client = await this.getStargateClient() + + // Tier 1: RPC tx_index (throws on RPC error). + const tx = await client.getTx(txHash) + if (tx) { + return { + hash: txHash, + height: tx.height, + index: tx.txIndex, + gasUsed: tx.gasUsed, + gasWanted: tx.gasWanted, + success: tx.code === 0, + code: tx.code, + } + } + + // Tier 2: REST API + this.logger.info({ txHash }, 'Tier 1 did not find TX, trying REST API fallback') + const apiResult = await this.getTransactionViaApi(txHash) + if (apiResult) return apiResult + + return null + } + + /** + * Tri-state hash verification over [startHeight, min(chainHead, startHeight+maxBlocks-1)]. + * confirmed → tx found (Tier 1 RPC, Tier 2 API, or Tier 3 block scan) + * absent → every height in the (head-capped) window was scanned, tx not present + * unavailable→ the chain head or any block in the window could not be read + */ + async verifyTransaction( + txHash: string, + startHeight: number, + maxBlocks = 30, + ): Promise> { + // Tier 1 + Tier 2: a direct hit short-circuits. A Tier-1 RPC error does NOT + // abort verification: the Tier-3 block scan below is the authoritative coverage + // mechanism (works even when tx indexing is disabled on the RPC node). + try { + const direct = await this.getTransactionDirect(txHash) + if (direct) return { status: 'confirmed', data: direct } + } catch (error) { + this.logger.warn({ txHash, error }, 'verifyTransaction: Tier 1/2 lookup failed; falling through to block scan') + } + + let head: number + try { + head = await this.getHeight() + } catch { + return { status: 'unavailable' } + } + + const endHeight = Math.min(startHeight + maxBlocks - 1, head) + if (endHeight < startHeight) { + // Caught up to the chain head: no new blocks to scan. This is a HEALTHY + // answer ("absent so far"), not an RPC outage — do not inflate backoff. + return { status: 'absent', coveredUpToHeight: startHeight - 1 } + } + + const comet = await this.getCometClient() + const normalizedHash = txHash.toUpperCase() + let lastBlockTime: Date | undefined + for (let h = startHeight; h <= endHeight; h++) { + let block + try { + block = await comet.block(h) + } catch (error) { + this.logger.warn({ txHash, height: h, error }, 'verifyTransaction: block fetch failed') + return { status: 'unavailable' } // could not cover the window + } + // Track the time of the last successfully fetched block so callers can use + // chain block time (not wall-clock) for unordered tx expiry decisions. + if (block.block?.header?.time) { + lastBlockTime = new Date(block.block.header.time.getTime()) + } + const match = await this.matchTxInBlock(comet, block, h, normalizedHash, txHash) + if (match === 'no-match') continue + // Hash matched in this block but its result row is missing — the tx IS + // on-chain, we just can't read its outcome. That is NOT negative evidence; + // treat as unavailable so the verifier keeps retrying instead of failing. + if (match === 'result-missing') { + this.logger.warn({ txHash, height: h }, 'verifyTransaction: matched tx has no block result entry') + return { status: 'unavailable' } + } + return { status: 'confirmed', data: match } + } + return { status: 'absent', coveredUpToHeight: endHeight, coveredBlockTime: lastBlockTime } + } + + /** + * Returns the chain block time of the latest block (NOT wall-clock). + * Used by isSignedTxExpired to determine if an unordered tx's timeout_timestamp + * has passed per chain time, avoiding clock-skew split-brain. + */ + async getLatestBlockTime(): Promise { + try { + const comet = await this.getCometClient() + const status = await comet.status() + const t = status.syncInfo?.latestBlockTime + return t ? new Date(t.getTime()) : null + } catch { + return null + } + } + + /** + * Scans the already-fetched `block` at `height` for the tx whose SHA256 equals + * `normalizedHash`. Returns the built TransactionResult on a hit, 'no-match' if + * the hash is not in this block, or 'result-missing' if the hash matched but + * blockResults had no entry at the matched index. + */ + private async matchTxInBlock( + comet: Awaited>, + block: Awaited>['block']>>, + height: number, + normalizedHash: string, + txHash: string, + ): Promise { + const txs = block.block.txs + for (let i = 0; i < txs.length; i++) { + const bytes = txs[i] + if (!bytes) continue + if (toHex(sha256(bytes)).toUpperCase() === normalizedHash) { + const results = await comet.blockResults(height) + const txData = results.results[i] + if (!txData) return 'result-missing' + return { hash: txHash, height, index: i, gasUsed: txData.gasUsed, gasWanted: txData.gasWanted, success: txData.code === 0, code: txData.code } + } + } + return 'no-match' + } + private async getTransactionViaApi(txHash: string): Promise { if (!this.apiUrl) return null const url = `${this.apiUrl.replace(/\/$/, '')}/cosmos/tx/v1beta1/txs/${txHash}` @@ -418,29 +584,13 @@ export class PocketBlockchain { // (lowest-height) match, preserving the previous sequential behavior. for (const { h, block } of blocks) { if (!block) continue - const txs = block.block.txs - for (let i = 0; i < txs.length; i++) { - const txBytes = txs[i] - if (!txBytes) continue - const hash = toHex(sha256(txBytes)).toUpperCase() - if (hash === normalizedHash) { - const results = await comet.blockResults(h) - const txData = results.results[i] - if (!txData) { - this.logger.warn({ txHash, height: h, index: i }, 'Block results missing entry for matched TX') - return null - } - return { - hash: txHash, - height: h, - index: i, - gasUsed: txData.gasUsed, - gasWanted: txData.gasWanted, - success: txData.code === 0, - code: txData.code, - } - } + const match = await this.matchTxInBlock(comet, block, h, normalizedHash, txHash) + if (match === 'no-match') continue + if (match === 'result-missing') { + this.logger.warn({ txHash, height: h }, 'Block results missing entry for matched TX') + return null } + return match } return null } @@ -465,6 +615,215 @@ export class PocketBlockchain { } } + /** + * Tri-state state-based verification of a supplier-mutating tx's expected effect. + * confirmed → the supplier state reflects the expected effect + * absent → the RPC answered (supplier found or NotFound) but the effect is not present + * unavailable→ the supplier query could not be read (non-NotFound error) + * + * Note: {@link getSupplier} returns `null` on `code = NotFound` (answered-absent) and + * rethrows otherwise (unavailable). + */ + async verifySupplierEffect( + operatorAddress: string, + effect: SupplierEffect, + height?: number, + ): Promise> { + let supplier: Supplier | null + try { + supplier = await this.getSupplier(operatorAddress, height) + } catch { + return { status: 'unavailable' } + } + // Not load-bearing: decideVerification ignores the supplier path's coveredUpToHeight + // (only the hash path's window-coverage drives the failure verdict). 0 = "queried latest". + const coveredUpToHeight = height ?? 0 + if (!supplier) return { status: 'absent', coveredUpToHeight } + + switch (effect.kind) { + case 'stake-services-present': + // Goal: supplier exists, owner matches, AND has services on-chain (or pending + // in serviceConfigHistory). Existence alone would false-confirm an OwnerInitialStake + // because the supplier pre-exists with zero services — that is the trigger condition. + return supplier.ownerAddress === effect.ownerAddress && + ((supplier.services?.length ?? 0) > 0 || (supplier.serviceConfigHistory?.length ?? 0) > 0) + ? { status: 'confirmed', data: supplier } + : { status: 'absent', coveredUpToHeight } + case 'upstake': { + const staked = BigInt(supplier.stake?.amount ?? '0') + return supplier.ownerAddress === effect.ownerAddress && staked >= effect.minStakeUpokt + ? { status: 'confirmed', data: supplier } + : { status: 'absent', coveredUpToHeight } + } + case 'unstake': + // Guard against a pre-existing unstake: a node already unbonding from an + // earlier session would show unstakeSessionEndHeight > 0 even if THIS + // unstake never landed. Our unstake sets a session end at/after the + // broadcast height, so require it to clear that floor before confirming. + return supplier.unstakeSessionEndHeight >= effect.minSessionEndHeight + ? { status: 'confirmed', data: supplier } + : { status: 'absent', coveredUpToHeight } + } + } + + /** Injectable clock — default Date.now(). Override in tests for determinism. */ + protected nowMs(): number { + return Date.now() + } + + /** + * Signs a supplier stake tx with unordered=true (no sequence needed). + * Returns signed bytes + hash WITHOUT broadcasting. + * The caller must persist these before calling broadcastSupplierTx. + */ + async signSupplierTx(params: StakeSupplierParams): Promise<{ signedPayload: string; transactionHash: string; timeoutTimestamp: Date }> { + const { signerPrivateKey, signer, ...value } = params + + if (!isValidPrivateKey(signerPrivateKey)) throw new Error('Invalid secp256k1 private key') + if (!signer) throw new Error('`signer` (bech32) is required') + + const pkBytes = Uint8Array.from(Buffer.from(signerPrivateKey, 'hex')) + const wallet = await DirectSecp256k1Wallet.fromKey(pkBytes, 'pokt') + const typeUrl = '/pocket.supplier.MsgStakeSupplier' + + const registry = new Registry([ + [typeUrl, MsgStakeSupplier as unknown as GeneratedType], + ]) + + const signingClient = await this.getSigningClient(wallet, registry) + + const msg = { typeUrl, value: { signer, ...value } as MsgStakeSupplier } + + const timeoutTimestamp = new Date(this.nowMs() + UNORDERED_TIMEOUT_MS) + + // Estimate gas; fallback 350_000 matches old stakeSupplier behavior + let gasEstimation: number + try { + gasEstimation = await signingClient.simulate(signer, [msg], '') + } catch (simErr: any) { + this.logger.warn({ signer, error: simErr?.message ?? simErr }, 'signSupplierTx: simulate failed, using fallback gas') + gasEstimation = 350_000 + } + const fee = calculateFee(Math.round(gasEstimation * 1.3), this.gasPrice!) + + // Build TxBody with LOCAL proto (has unordered + timeoutTimestamp fields) + const msgAny = registry.encodeAsAny(msg) + const bodyBytes = TxBody.encode(TxBody.fromPartial({ + messages: [msgAny as any], + memo: '', + unordered: true, + timeoutTimestamp, + })).finish() + + // Get accountNumber (sequence is not used for unordered; passes 0 in authInfo) + const { accountNumber } = await signingClient.getSequence(signer) + const chainId = await signingClient.getChainId() + + const [account] = await wallet.getAccounts() + if (!account) throw new Error('signSupplierTx: wallet has no accounts') + + const pubkey = encodePubkey(encodeSecp256k1Pubkey(account.pubkey)) + const authInfoBytes = makeAuthInfoBytes( + [{ pubkey, sequence: 0 }], + fee.amount, + Number(fee.gas), + fee.granter, + fee.payer, + ) + const signDoc = makeSignDoc(bodyBytes, authInfoBytes, chainId, accountNumber) + const { signature, signed } = await wallet.signDirect(signer, signDoc) + + const txBytes = TxRaw.encode(TxRaw.fromPartial({ + bodyBytes: signed.bodyBytes, + authInfoBytes: signed.authInfoBytes, + signatures: [fromBase64(signature.signature)], + })).finish() + + const transactionHash = toHex(sha256(txBytes)).toUpperCase() + const signedPayload = Buffer.from(txBytes).toString('base64') + + this.logger.info({ signer, transactionHash, timeoutTimestamp }, 'signSupplierTx: signed unordered tx') + + return { signedPayload, transactionHash, timeoutTimestamp } + } + + /** + * Broadcasts a pre-signed tx (from signSupplierTx). Idempotent: a cosmos-sdk + * unordered-dedup rejection (same timeoutTimestamp+sender seen twice) is treated + * as success so re-broadcast of identical bytes is safe. + */ + async broadcastSupplierTx(signedPayloadBase64: string): Promise { + const txBytes = Uint8Array.from(Buffer.from(signedPayloadBase64, 'base64')) + const transactionHash = toHex(sha256(txBytes)).toUpperCase() + + const client = await this.getStargateClient() + + try { + const result = await (client as any).broadcastTx(txBytes) + return { + transactionHash: result.transactionHash ?? transactionHash, + code: result.code, + message: result.rawLog, + success: result.code === 0, + // A non-zero code from broadcastTx is a definitive CheckTx/DeliverTx rejection. + rejected: result.code !== 0, + } + } catch (e: any) { + // Cosmos SDK unordered dedup: broadcast of identical (timeoutTimestamp, sender) bytes + // is rejected because the tx is already tracked in the unordered nonce cache. + // Treat as idempotent success — the tx is (or will be) included on-chain. + if (isUnorderedDedupRejection(e)) { + this.logger.info({ transactionHash }, 'broadcastSupplierTx: unordered dedup (already broadcast), treating as success') + return { + transactionHash, + code: 0, + message: 'already broadcast (unordered dedup)', + success: true, + rejected: false, + } + } + + // A BroadcastTxError is a hard CheckTx rejection — the tx will never land on-chain. + if (e instanceof BroadcastTxError) { + this.logger.error({ code: e.code, codespace: e.codespace, message: e.message }, 'broadcastSupplierTx: hard CheckTx rejection') + return { + transactionHash, + success: false, + rejected: true, + code: e.code, + message: e.message ?? 'broadcast rejected', + } + } + + // A TimeoutError means the RPC timed out waiting for commit confirmation, but the tx + // may already have been accepted into the mempool and can still land on-chain. + // Do NOT mark as rejected — the verifier will resolve it via chain-time bound. + if (e instanceof TimeoutError) { + this.logger.warn({ transactionHash, message: e.message }, 'broadcastSupplierTx: RPC timeout (tx may still land, not rejected)') + return { + transactionHash, + success: false, + rejected: false, + code: undefined, + message: `RPC timeout waiting for commit confirmation — tx may still land: ${e.message}`, + } + } + + this.logger.error({ code: e.code, codespace: e.codespace, message: e.message }, 'broadcastSupplierTx: broadcast failed') + return { + transactionHash, + success: false, + rejected: false, + code: e.code, + message: e.message ?? 'broadcast failed', + } + } + } + + /** + * @deprecated Use signSupplierTx + broadcastSupplierTx (Task 3 canonical lifecycle). + * remediateSupplier (the only caller) will switch in Task 7. + */ async stakeSupplier(params: StakeSupplierParams, explicitSequence?: number): Promise { const { signerPrivateKey, signer, ...value } = params @@ -479,6 +838,7 @@ export class PocketBlockchain { const wallet = await DirectSecp256k1Wallet.fromKey(pkBytes, 'pokt') const typeUrl = '/pocket.supplier.MsgStakeSupplier' + let currentHeight = 0 try { const [account] = await wallet.getAccounts() @@ -501,7 +861,7 @@ export class PocketBlockchain { const msg = { typeUrl, value: { signer, ...value } as MsgStakeSupplier } // TODO: Create signed memo - const currentHeight = await this.getHeight(); + currentHeight = await this.getHeight(); this.logger.debug({ currentHeight, @@ -530,12 +890,12 @@ export class PocketBlockchain { accountNumber, sequence: explicitSequence, chainId, - }, BigInt(currentHeight + 5)) - const txBytes = TxRaw.encode(txRaw).finish() + }, BigInt(currentHeight + TX_EXPIRATION_BLOCKS)) + const txBytes = TxRaw.encode(TxRaw.fromPartial(txRaw as any)).finish() this.logger.debug({ signer }, 'stakeSupplier: Broadcasting transaction with explicit sequence') result = await signingClient.broadcastTx(txBytes) } else { - result = await signingClient.signAndBroadcast(signer, [msg], 'auto', '', BigInt(currentHeight + 5)) + result = await signingClient.signAndBroadcast(signer, [msg], 'auto', '', BigInt(currentHeight + TX_EXPIRATION_BLOCKS)) } this.logger.info({ result },'stakeSupplier: Execution ended. Transaction sent.') @@ -545,6 +905,8 @@ export class PocketBlockchain { code: result.code, message: result.rawLog, success: true, + signedAtHeight: currentHeight, + timeoutHeight: currentHeight + TX_EXPIRATION_BLOCKS, } } catch (e: any) { const errorMessage = e.log && e.message ? `${e.log} - ${e.message}` : e.message ?? 'Unknown error' @@ -555,6 +917,8 @@ export class PocketBlockchain { success: false, code: e.code, message: errorMessage, + signedAtHeight: currentHeight, + timeoutHeight: currentHeight + TX_EXPIRATION_BLOCKS, } } @@ -564,6 +928,8 @@ export class PocketBlockchain { success: false, message: `Transaction timed out. This does not indicate a failure. Details: ${errorMessage}`, code: 42, // Timeout Transaction error code. See: https://github.com/cosmos/cosmos-sdk/blob/main/types/errors/errors.go + signedAtHeight: currentHeight, + timeoutHeight: currentHeight + TX_EXPIRATION_BLOCKS, } } @@ -573,10 +939,29 @@ export class PocketBlockchain { transactionHash: '', success: false, message: `An unknown error occurred: ${errorMessage}`, + signedAtHeight: currentHeight, + timeoutHeight: currentHeight + TX_EXPIRATION_BLOCKS, } } } + /** + * Sequence-consumed evidence for a broadcast tx. If account.sequence > txSequence, + * the tx can NEVER land in a block after `observedAtHeight` (its sequence was + * consumed — by itself or a replacement). Soundness contract for the caller: + * a failure verdict additionally requires hash-absence covered up to + * `observedAtHeight`, because the consumer might have been this very tx in a + * block the scan has not covered yet. `observedAtHeight` is sampled AT/AFTER the + * account read so coverage up to it includes every block the tx could occupy. + */ + async isSequenceConsumed(signer: string, txSequence: number): Promise<{ consumed: boolean; observedAtHeight: number }> { + const client = await this.getStargateClient() + const account = await client.getAccount(signer) // throws on RPC error → caller treats as unavailable + const observedAtHeight = await this.getHeight() + if (!account) return { consumed: false, observedAtHeight } + return { consumed: account.sequence > txSequence, observedAtHeight } + } + private async getSigningClient( wallet: DirectSecp256k1Wallet, registry: Registry, diff --git a/packages/pocket/src/isSequenceConsumed.test.ts b/packages/pocket/src/isSequenceConsumed.test.ts new file mode 100644 index 00000000..09cc628e --- /dev/null +++ b/packages/pocket/src/isSequenceConsumed.test.ts @@ -0,0 +1,105 @@ +// --------------------------------------------------------------------------- +// Mocks – must be declared before importing the module under test +// --------------------------------------------------------------------------- + +const mockGetAccount = jest.fn() +const mockGetHeight = jest.fn() +const mockDisconnect = jest.fn() + +// Mock @cosmjs/stargate +jest.mock('@cosmjs/stargate', () => { + const actual = jest.requireActual('@cosmjs/stargate') + return { + ...actual, + StargateClient: { + create: jest.fn().mockResolvedValue({ + getAccount: mockGetAccount, + getHeight: mockGetHeight, + disconnect: mockDisconnect, + }), + }, + } +}) + +// Mock @cosmjs/tendermint-rpc +jest.mock('@cosmjs/tendermint-rpc', () => ({ + connectComet: jest.fn().mockResolvedValue({ + disconnect: mockDisconnect, + }), +})) + +// Mock @igniter/logger +jest.mock('@igniter/logger', () => ({ + getLogger: () => ({ + child: () => ({ + info: jest.fn(), + warn: jest.fn(), + error: jest.fn(), + debug: jest.fn(), + }), + }), +})) + +import { PocketBlockchain } from './index' + +async function createInstance() { + return PocketBlockchain.setup('http://localhost:26657', 'upokt', 0.001) +} + +describe('PocketBlockchain.isSequenceConsumed', () => { + beforeEach(() => { + jest.clearAllMocks() + }) + + it('consumed when account.sequence > txSequence; observedAtHeight sampled AT/AFTER the account read', async () => { + mockGetAccount.mockResolvedValue({ sequence: 7, accountNumber: 1, address: 'pokt1signer', pubkey: null }) + mockGetHeight.mockResolvedValue(1234) + + const bc = await createInstance() + const result = await bc.isSequenceConsumed('pokt1signer', 5) + + expect(result).toEqual({ consumed: true, observedAtHeight: 1234 }) + // getAccount must be called before getHeight to ensure observedAtHeight covers the account read + const getAccountOrder = mockGetAccount.mock.invocationCallOrder[0] + const getHeightOrder = mockGetHeight.mock.invocationCallOrder[0] + expect(getAccountOrder).toBeLessThan(getHeightOrder) + }) + + it('not consumed when account.sequence equals txSequence', async () => { + mockGetAccount.mockResolvedValue({ sequence: 5, accountNumber: 1, address: 'pokt1signer', pubkey: null }) + mockGetHeight.mockResolvedValue(2000) + + const bc = await createInstance() + const result = await bc.isSequenceConsumed('pokt1signer', 5) + + expect(result).toEqual({ consumed: false, observedAtHeight: 2000 }) + }) + + it('not consumed when account.sequence < txSequence', async () => { + mockGetAccount.mockResolvedValue({ sequence: 3, accountNumber: 1, address: 'pokt1signer', pubkey: null }) + mockGetHeight.mockResolvedValue(3000) + + const bc = await createInstance() + const result = await bc.isSequenceConsumed('pokt1signer', 5) + + expect(result).toEqual({ consumed: false, observedAtHeight: 3000 }) + }) + + it('account not found → not consumed (safe default: tx could still land)', async () => { + mockGetAccount.mockResolvedValue(null) + mockGetHeight.mockResolvedValue(999) + + const bc = await createInstance() + const result = await bc.isSequenceConsumed('pokt1unknown', 5) + + expect(result).toEqual({ consumed: false, observedAtHeight: 999 }) + }) + + it('RPC error on getAccount → throws (caller maps to unavailable/pending)', async () => { + mockGetAccount.mockRejectedValue(new Error('rpc unreachable')) + + const bc = await createInstance() + + await expect(bc.isSequenceConsumed('pokt1signer', 5)).rejects.toThrow('rpc unreachable') + }) +}) diff --git a/packages/pocket/src/signSupplierTx.test.ts b/packages/pocket/src/signSupplierTx.test.ts new file mode 100644 index 00000000..1d1e5c1b --- /dev/null +++ b/packages/pocket/src/signSupplierTx.test.ts @@ -0,0 +1,265 @@ +// --------------------------------------------------------------------------- +// Mocks – must be declared before importing the module under test +// --------------------------------------------------------------------------- + +const mockGetAccount = jest.fn() +const mockGetHeight = jest.fn() +const mockDisconnect = jest.fn() +const mockSimulate = jest.fn() +const mockGetSequence = jest.fn() +const mockGetChainId = jest.fn() +const mockBroadcastTx = jest.fn() + +// Mock @cosmjs/stargate +jest.mock('@cosmjs/stargate', () => { + const actual = jest.requireActual('@cosmjs/stargate') + return { + ...actual, + StargateClient: { + create: jest.fn().mockResolvedValue({ + getAccount: mockGetAccount, + getHeight: mockGetHeight, + broadcastTx: mockBroadcastTx, + disconnect: mockDisconnect, + }), + }, + SigningStargateClient: { + createWithSigner: jest.fn().mockResolvedValue({ + simulate: mockSimulate, + getSequence: mockGetSequence, + getChainId: mockGetChainId, + broadcastTx: mockBroadcastTx, + disconnect: mockDisconnect, + }), + }, + } +}) + +// Mock @cosmjs/tendermint-rpc +jest.mock('@cosmjs/tendermint-rpc', () => ({ + connectComet: jest.fn().mockResolvedValue({ + disconnect: mockDisconnect, + }), +})) + +// Mock @igniter/logger +jest.mock('@igniter/logger', () => ({ + getLogger: () => ({ + child: () => ({ + info: jest.fn(), + warn: jest.fn(), + error: jest.fn(), + debug: jest.fn(), + }), + }), +})) + +import { PocketBlockchain } from './index' +import { TxBody, TxRaw } from './proto/generated/cosmos/tx/v1beta1/tx' +import { DirectSecp256k1Wallet } from '@cosmjs/proto-signing' +import { BroadcastTxError, TimeoutError } from '@cosmjs/stargate' + +// Deterministic test private key (valid secp256k1 key) +const TEST_PRIVATE_KEY = 'a'.repeat(64) + +async function createInstance() { + return PocketBlockchain.setup('http://localhost:26657', 'upokt', 0.001) +} + +async function getTestSignerAddress(): Promise { + const pkBytes = Uint8Array.from(Buffer.from(TEST_PRIVATE_KEY, 'hex')) + const wallet = await DirectSecp256k1Wallet.fromKey(pkBytes, 'pokt') + const [account] = await wallet.getAccounts() + return account!.address +} + +const STAKE_PARAMS_BASE = { + signerPrivateKey: TEST_PRIVATE_KEY, + stake: { denom: 'upokt', amount: '1000000' }, + services: [], + ownerAddress: '', +} + +describe('PocketBlockchain.signSupplierTx', () => { + beforeEach(() => { + jest.clearAllMocks() + mockGetAccount.mockResolvedValue({ sequence: 5, accountNumber: 1, address: 'pokt1signer', pubkey: null }) + mockGetHeight.mockResolvedValue(100) + mockGetChainId.mockResolvedValue('pocket-localnet') + mockSimulate.mockResolvedValue(200000) + mockGetSequence.mockResolvedValue({ accountNumber: 1, sequence: 5 }) + mockBroadcastTx.mockResolvedValue({ transactionHash: 'ABCD1234'.repeat(8), code: 0, rawLog: '' }) + }) + + it('returns a non-empty base64 signedPayload', async () => { + const signer = await getTestSignerAddress() + const bc = await createInstance() + const result = await bc.signSupplierTx({ ...STAKE_PARAMS_BASE, signer }) + + expect(result.signedPayload).toBeTruthy() + // valid base64: Buffer.from(base64, 'base64') must round-trip + const decoded = Buffer.from(result.signedPayload, 'base64') + expect(decoded.length).toBeGreaterThan(0) + }) + + it('returns transactionHash as 64-char uppercase hex', async () => { + const signer = await getTestSignerAddress() + const bc = await createInstance() + const result = await bc.signSupplierTx({ ...STAKE_PARAMS_BASE, signer }) + + expect(result.transactionHash).toMatch(/^[0-9A-F]{64}$/) + }) + + it('signedPayload decodes to TxBody with unordered=true', async () => { + const signer = await getTestSignerAddress() + const bc = await createInstance() + const result = await bc.signSupplierTx({ ...STAKE_PARAMS_BASE, signer }) + + const txBytes = Uint8Array.from(Buffer.from(result.signedPayload, 'base64')) + const txRaw = TxRaw.decode(txBytes) + const txBody = TxBody.decode(txRaw.bodyBytes) + + expect(txBody.unordered).toBe(true) + }) + + it('timeoutTimestamp is approximately now + 9 minutes', async () => { + const signer = await getTestSignerAddress() + const bc = await createInstance() + const before = Date.now() + const result = await bc.signSupplierTx({ ...STAKE_PARAMS_BASE, signer }) + const after = Date.now() + + const expectedMs = 9 * 60 * 1000 + const ts = result.timeoutTimestamp.getTime() + expect(ts).toBeGreaterThanOrEqual(before + expectedMs - 5000) + expect(ts).toBeLessThanOrEqual(after + expectedMs + 5000) + }) + + it('throws when signerPrivateKey is invalid (wrong length)', async () => { + const bc = await createInstance() + // A valid hex string but wrong length (not 32 bytes = 64 hex chars) + await expect( + bc.signSupplierTx({ ...STAKE_PARAMS_BASE, signer: 'pokt1abc', signerPrivateKey: 'deadbeef' }) + ).rejects.toThrow('Invalid secp256k1 private key') + }) + + it('throws when signer is missing', async () => { + const bc = await createInstance() + await expect( + bc.signSupplierTx({ ...STAKE_PARAMS_BASE, signer: '' }) + ).rejects.toThrow('`signer` (bech32) is required') + }) +}) + +describe('PocketBlockchain.broadcastSupplierTx', () => { + beforeEach(() => { + jest.clearAllMocks() + mockGetAccount.mockResolvedValue({ sequence: 5, accountNumber: 1, address: 'pokt1signer', pubkey: null }) + mockGetHeight.mockResolvedValue(100) + mockGetChainId.mockResolvedValue('pocket-localnet') + mockSimulate.mockResolvedValue(200000) + mockGetSequence.mockResolvedValue({ accountNumber: 1, sequence: 5 }) + mockBroadcastTx.mockResolvedValue({ transactionHash: 'ABCD1234'.repeat(8), code: 0, rawLog: '' }) + }) + + async function getSignedPayload(): Promise { + const signer = await getTestSignerAddress() + const bc = await createInstance() + const result = await bc.signSupplierTx({ ...STAKE_PARAMS_BASE, signer }) + return result.signedPayload + } + + it('broadcasts successfully and returns success=true', async () => { + const signedPayload = await getSignedPayload() + jest.clearAllMocks() + mockBroadcastTx.mockResolvedValue({ transactionHash: 'ABCD1234'.repeat(8), code: 0, rawLog: '' }) + + const bc = await createInstance() + const result = await bc.broadcastSupplierTx(signedPayload) + + expect(result.success).toBe(true) + expect(result.transactionHash).toBeTruthy() + }) + + it('dedup detection: "tx already exists in cache" error is treated as success', async () => { + const signedPayload = await getSignedPayload() + jest.clearAllMocks() + mockBroadcastTx.mockRejectedValue( + Object.assign(new Error('tx already exists in cache'), { code: 19, codespace: 'sdk' }) + ) + + const bc = await createInstance() + const result = await bc.broadcastSupplierTx(signedPayload) + + expect(result.success).toBe(true) + expect(result.transactionHash).toMatch(/^[0-9A-F]{64}$/) + expect(result.message).toBe('already broadcast (unordered dedup)') + }) + + it('dedup detection: code=18 "failed to add unordered nonce" is treated as success', async () => { + const signedPayload = await getSignedPayload() + jest.clearAllMocks() + mockBroadcastTx.mockRejectedValue( + Object.assign(new Error('failed to add unordered nonce: nonce already used'), { code: 18, codespace: 'sdk' }) + ) + + const bc = await createInstance() + const result = await bc.broadcastSupplierTx(signedPayload) + + expect(result.success).toBe(true) + }) + + it('dedup detection: code=19 codespace=sdk is treated as success', async () => { + const signedPayload = await getSignedPayload() + jest.clearAllMocks() + mockBroadcastTx.mockRejectedValue( + Object.assign(new Error('broadcast tx error'), { code: 19, codespace: 'sdk' }) + ) + + const bc = await createInstance() + const result = await bc.broadcastSupplierTx(signedPayload) + + expect(result.success).toBe(true) + }) + + it('hard reject: returns success=false for non-dedup errors', async () => { + const signedPayload = await getSignedPayload() + jest.clearAllMocks() + mockBroadcastTx.mockRejectedValue( + Object.assign(new Error('out of gas'), { code: 11, codespace: 'sdk' }) + ) + + const bc = await createInstance() + const result = await bc.broadcastSupplierTx(signedPayload) + + expect(result.success).toBe(false) + expect(result.transactionHash).toMatch(/^[0-9A-F]{64}$/) + }) + + it('BroadcastTxError: sets rejected=true (hard CheckTx rejection — tx will never land)', async () => { + const signedPayload = await getSignedPayload() + jest.clearAllMocks() + mockBroadcastTx.mockRejectedValue(new BroadcastTxError(11, 'sdk', 'out of gas in ante handler')) + + const bc = await createInstance() + const result = await bc.broadcastSupplierTx(signedPayload) + + expect(result.success).toBe(false) + expect(result.rejected).toBe(true) + expect(result.transactionHash).toMatch(/^[0-9A-F]{64}$/) + }) + + it('TimeoutError: sets rejected=false (RPC timeout — tx may still land on-chain)', async () => { + const signedPayload = await getSignedPayload() + jest.clearAllMocks() + // TimeoutError constructor: (message, txId) + mockBroadcastTx.mockRejectedValue(new TimeoutError('timeout waiting for commit', 'DEADBEEF'.repeat(8))) + + const bc = await createInstance() + const result = await bc.broadcastSupplierTx(signedPayload) + + expect(result.success).toBe(false) + expect(result.rejected).toBe(false) + expect(result.transactionHash).toMatch(/^[0-9A-F]{64}$/) + }) +}) diff --git a/packages/pocket/src/types.ts b/packages/pocket/src/types.ts index a2204537..40da4576 100644 --- a/packages/pocket/src/types.ts +++ b/packages/pocket/src/types.ts @@ -55,6 +55,20 @@ export interface SendTransactionResult { message?: string; codespace?: string; isTimeout?: boolean; + /** + * True when the tx was definitively rejected by CheckTx / BroadcastTxError and can NEVER land + * on-chain (hard reject). False/undefined for dedup-success, TimeoutError, or any other case + * where the tx may still land. Callers must treat undefined as non-rejected. + */ + rejected?: boolean; + /** Chain head sampled immediately before signing — the lowest possible inclusion height anchor. */ + signedAtHeight?: number; + /** timeoutHeight embedded in the signed tx; inclusion in any block > this height is impossible. */ + timeoutHeight?: number; + /** base64-encoded signed TxRaw bytes — persisted so re-broadcast replays identical bytes. */ + signedPayload?: string; + /** unordered tx timeout_timestamp (chain-time validity bound). */ + timeoutTimestamp?: Date; } export interface TransactionResult { diff --git a/packages/pocket/src/verifySupplierEffect.test.ts b/packages/pocket/src/verifySupplierEffect.test.ts new file mode 100644 index 00000000..fded4e4e --- /dev/null +++ b/packages/pocket/src/verifySupplierEffect.test.ts @@ -0,0 +1,143 @@ +// --------------------------------------------------------------------------- +// Mocks – must be declared before importing the module under test +// --------------------------------------------------------------------------- + +const mockDisconnect = jest.fn() + +jest.mock('@cosmjs/stargate', () => { + const actual = jest.requireActual('@cosmjs/stargate') + return { + ...actual, + StargateClient: { + create: jest.fn().mockResolvedValue({ disconnect: mockDisconnect }), + }, + } +}) + +jest.mock('@cosmjs/tendermint-rpc', () => ({ + connectComet: jest.fn().mockResolvedValue({ disconnect: mockDisconnect }), +})) + +jest.mock('@igniter/logger', () => ({ + getLogger: () => ({ + child: () => ({ + info: jest.fn(), + warn: jest.fn(), + error: jest.fn(), + debug: jest.fn(), + }), + }), +})) + +import { PocketBlockchain } from './index' +import type { Supplier } from '@pocket/proto/generated/pocket/shared/supplier' +import type { SupplierEffect } from './index' + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +const OPERATOR = 'pokt1operator' +const OWNER = 'pokt1owner' + +async function createInstance() { + return PocketBlockchain.setup('http://localhost:26657', 'upokt', 0.001) +} + +function makeSupplier(overrides: Partial = {}): Supplier { + return { + ownerAddress: OWNER, + operatorAddress: OPERATOR, + stake: { denom: 'upokt', amount: '1000000' }, + services: [], + unstakeSessionEndHeight: 0, + serviceConfigHistory: [], + ...overrides, + } +} + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- + +describe('PocketBlockchain.verifySupplierEffect', () => { + let bc: PocketBlockchain + let getSupplierSpy: jest.SpyInstance + + beforeEach(async () => { + jest.clearAllMocks() + bc = await createInstance() + getSupplierSpy = jest.spyOn(bc, 'getSupplier') + }) + + it('stake-services-present: owner matches and services present → confirmed', async () => { + getSupplierSpy.mockResolvedValue(makeSupplier({ services: [{ serviceId: 'svc1', endpoints: [], revShare: [] }] })) + const effect: SupplierEffect = { kind: 'stake-services-present', ownerAddress: OWNER } + const r = await bc.verifySupplierEffect(OPERATOR, effect) + expect(r.status).toBe('confirmed') + }) + + it('stake-services-present: owner matches but services empty → absent', async () => { + getSupplierSpy.mockResolvedValue(makeSupplier({ services: [], serviceConfigHistory: [] })) + const effect: SupplierEffect = { kind: 'stake-services-present', ownerAddress: OWNER } + const r = await bc.verifySupplierEffect(OPERATOR, effect, 999) + expect(r).toEqual({ status: 'absent', coveredUpToHeight: 999 }) + }) + + it('stake-services-present: owner mismatch → absent', async () => { + getSupplierSpy.mockResolvedValue(makeSupplier({ ownerAddress: 'pokt1other' })) + const effect: SupplierEffect = { kind: 'stake-services-present', ownerAddress: OWNER } + const r = await bc.verifySupplierEffect(OPERATOR, effect, 999) + expect(r).toEqual({ status: 'absent', coveredUpToHeight: 999 }) + }) + + it('upstake: staked >= min → confirmed', async () => { + getSupplierSpy.mockResolvedValue(makeSupplier({ stake: { denom: 'upokt', amount: '5000000' } })) + const effect: SupplierEffect = { kind: 'upstake', ownerAddress: OWNER, minStakeUpokt: 5000000n } + const r = await bc.verifySupplierEffect(OPERATOR, effect) + expect(r.status).toBe('confirmed') + }) + + it('upstake: staked below min → absent', async () => { + getSupplierSpy.mockResolvedValue(makeSupplier({ stake: { denom: 'upokt', amount: '4000000' } })) + const effect: SupplierEffect = { kind: 'upstake', ownerAddress: OWNER, minStakeUpokt: 5000000n } + const r = await bc.verifySupplierEffect(OPERATOR, effect, 1234) + expect(r).toEqual({ status: 'absent', coveredUpToHeight: 1234 }) + }) + + it('unstake: session end >= broadcast height → confirmed', async () => { + getSupplierSpy.mockResolvedValue(makeSupplier({ unstakeSessionEndHeight: 42 })) + const effect: SupplierEffect = { kind: 'unstake', minSessionEndHeight: 10 } + const r = await bc.verifySupplierEffect(OPERATOR, effect) + expect(r.status).toBe('confirmed') + }) + + it('unstake: not unbonding (session end 0) → absent', async () => { + getSupplierSpy.mockResolvedValue(makeSupplier({ unstakeSessionEndHeight: 0 })) + const effect: SupplierEffect = { kind: 'unstake', minSessionEndHeight: 10 } + const r = await bc.verifySupplierEffect(OPERATOR, effect) + expect(r.status).toBe('absent') + }) + + it('unstake: pre-existing unbonding below broadcast height → absent (no false positive)', async () => { + // Node already unbonding from an earlier session (endHeight 5) when we broadcast at 10. + getSupplierSpy.mockResolvedValue(makeSupplier({ unstakeSessionEndHeight: 5 })) + const effect: SupplierEffect = { kind: 'unstake', minSessionEndHeight: 10 } + const r = await bc.verifySupplierEffect(OPERATOR, effect) + expect(r.status).toBe('absent') + }) + + it('getSupplier throws → unavailable', async () => { + getSupplierSpy.mockRejectedValue(new Error('rpc unreachable')) + const effect: SupplierEffect = { kind: 'stake', ownerAddress: OWNER } + const r = await bc.verifySupplierEffect(OPERATOR, effect) + expect(r.status).toBe('unavailable') + }) + + it('getSupplier returns null (NotFound) → absent', async () => { + getSupplierSpy.mockResolvedValue(null) + const effect: SupplierEffect = { kind: 'stake', ownerAddress: OWNER } + const r = await bc.verifySupplierEffect(OPERATOR, effect, 99) + expect(r).toEqual({ status: 'absent', coveredUpToHeight: 99 }) + }) +}) diff --git a/packages/pocket/src/verifyTransaction.test.ts b/packages/pocket/src/verifyTransaction.test.ts new file mode 100644 index 00000000..bb71c870 --- /dev/null +++ b/packages/pocket/src/verifyTransaction.test.ts @@ -0,0 +1,183 @@ +import { sha256 } from '@cosmjs/crypto' +import { toHex } from '@cosmjs/encoding' + +// --------------------------------------------------------------------------- +// Mocks – must be declared before importing the module under test +// --------------------------------------------------------------------------- + +const mockGetTx = jest.fn() +const mockGetHeight = jest.fn() +const mockBlock = jest.fn() +const mockBlockResults = jest.fn() +const mockDisconnect = jest.fn() + +// Mock @cosmjs/stargate +jest.mock('@cosmjs/stargate', () => { + const actual = jest.requireActual('@cosmjs/stargate') + return { + ...actual, + StargateClient: { + create: jest.fn().mockResolvedValue({ + getTx: mockGetTx, + getHeight: mockGetHeight, + disconnect: mockDisconnect, + }), + }, + } +}) + +// Mock @cosmjs/tendermint-rpc +jest.mock('@cosmjs/tendermint-rpc', () => ({ + connectComet: jest.fn().mockResolvedValue({ + block: mockBlock, + blockResults: mockBlockResults, + disconnect: mockDisconnect, + }), +})) + +// Mock @igniter/logger +jest.mock('@igniter/logger', () => ({ + getLogger: () => ({ + child: () => ({ + info: jest.fn(), + warn: jest.fn(), + error: jest.fn(), + debug: jest.fn(), + }), + }), +})) + +// Mock global fetch +const mockFetch = jest.fn() +global.fetch = mockFetch as any + +import { PocketBlockchain } from './index' + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +async function createInstance(apiUrl?: string) { + return PocketBlockchain.setup('http://localhost:26657', 'upokt', 0.001, apiUrl) +} + +const txContent = Buffer.from('some-tx-content') +const txHashBytes = sha256(txContent) +const txHash = toHex(txHashBytes).toUpperCase() + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- + +describe('PocketBlockchain.verifyTransaction', () => { + beforeEach(() => { + jest.clearAllMocks() + mockGetHeight.mockResolvedValue(10_000_000) + }) + + // confirmed: Tier 1 hit short-circuits. + it('confirmed when the hash is found in the window (Tier 1 hit)', async () => { + mockGetTx.mockResolvedValue({ + hash: txHash, + height: 1000, + txIndex: 0, + gasUsed: BigInt(50000), + gasWanted: BigInt(100000), + code: 0, + }) + + const bc = await createInstance('http://api.example.com') + const r = await bc.verifyTransaction(txHash, 1000, 30) + + expect(r.status).toBe('confirmed') + if (r.status === 'confirmed') { + expect(r.data).toEqual({ + hash: txHash, + height: 1000, + index: 0, + gasUsed: BigInt(50000), + gasWanted: BigInt(100000), + success: true, + code: 0, + }) + } + // Tier 3 should be skipped on a direct hit. + expect(mockBlock).not.toHaveBeenCalled() + }) + + // absent: full (head-capped) window scanned, tx not present. + it('absent with coveredUpToHeight when window fully scanned, not found', async () => { + mockGetTx.mockResolvedValue(null) + mockFetch.mockResolvedValue({ ok: false }) + mockBlock.mockResolvedValue({ block: { txs: [] } }) // tx never present + mockGetHeight.mockResolvedValue(1005) // head caps the window at 1005 + + const bc = await createInstance('http://api.example.com') + const r = await bc.verifyTransaction(txHash, 1000, 30) + + expect(r).toEqual({ status: 'absent', coveredUpToHeight: 1005 }) + }) + + // unavailable: getHeight throws → cannot determine the window. + it('unavailable when getHeight throws (cannot determine the window)', async () => { + mockGetTx.mockResolvedValue(null) + mockFetch.mockResolvedValue({ ok: false }) + mockGetHeight.mockRejectedValue(new Error('rpc unreachable')) + + const bc = await createInstance('http://api.example.com') + const r = await bc.verifyTransaction(txHash, 1000, 30) + + expect(r.status).toBe('unavailable') + }) + + // unavailable: a block fetch errors → could not cover the window. + it('unavailable when a block fetch errors (could not cover the window)', async () => { + mockGetTx.mockResolvedValue(null) + mockFetch.mockResolvedValue({ ok: false }) + mockGetHeight.mockResolvedValue(1005) + mockBlock.mockRejectedValue(new Error('block fetch failed')) + + const bc = await createInstance('http://api.example.com') + const r = await bc.verifyTransaction(txHash, 1000, 30) + + expect(r.status).toBe('unavailable') + }) + + it('falls through to the block scan when Tier-1 getTx throws (tx indexing disabled)', async () => { + // Tier 1 rejects with "transaction indexing is disabled" + mockGetTx.mockRejectedValue(new Error('transaction indexing is disabled')) + // REST is disabled too + mockFetch.mockResolvedValue({ ok: false }) + // head is beyond the window + mockGetHeight.mockResolvedValue(1005) + // The tx IS in block 1000 + mockBlock.mockImplementation((h: number) => { + if (h === 1000) { + return Promise.resolve({ block: { txs: [txContent] } }) + } + return Promise.resolve({ block: { txs: [] } }) + }) + mockBlockResults.mockResolvedValue({ + results: [{ code: 0, gasUsed: BigInt(50000), gasWanted: BigInt(100000) }], + }) + + const bc = await createInstance('http://api.example.com') + const r = await bc.verifyTransaction(txHash, 1000, 30) + + expect(r.status).toBe('confirmed') + }) + + it('returns absent with coveredUpToHeight = startHeight - 1 when caught up to head', async () => { + // getTx returns null (no direct hit) + mockGetTx.mockResolvedValue(null) + // REST disabled + mockFetch.mockResolvedValue({ ok: false }) + // head is startHeight - 1 (node has not produced any new blocks yet) + mockGetHeight.mockResolvedValue(999) // startHeight=1000, so head < startHeight + + const bc = await createInstance('http://api.example.com') + const r = await bc.verifyTransaction(txHash, 1000, 30) + + expect(r).toEqual({ status: 'absent', coveredUpToHeight: 999 }) + }) +}) diff --git a/packages/tx-verify/eslint.config.mjs b/packages/tx-verify/eslint.config.mjs new file mode 100644 index 00000000..c2dbe212 --- /dev/null +++ b/packages/tx-verify/eslint.config.mjs @@ -0,0 +1,4 @@ +import { config } from "@igniter/eslint-config/base"; + +/** @type {import("eslint").Linter.Config} */ +export default config; diff --git a/packages/tx-verify/jest.config.ts b/packages/tx-verify/jest.config.ts new file mode 100644 index 00000000..68e64753 --- /dev/null +++ b/packages/tx-verify/jest.config.ts @@ -0,0 +1,22 @@ +import type { Config } from 'jest'; + +const config: Config = { + rootDir: '.', + preset: 'ts-jest', + testEnvironment: 'node', + testMatch: ['/src/**/*.test.ts'], + moduleNameMapper: { + '^@tx-verify/(.*)$': '/src/$1', + }, + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + tsconfig: '/tsconfig.json', + diagnostics: false, + }, + ], + }, +}; + +export default config; diff --git a/packages/tx-verify/package.json b/packages/tx-verify/package.json new file mode 100644 index 00000000..78a817a1 --- /dev/null +++ b/packages/tx-verify/package.json @@ -0,0 +1,36 @@ +{ + "name": "@igniter/tx-verify", + "version": "0.0.0", + "private": true, + "type": "commonjs", + "main": "./dist/cjs/index.js", + "exports": { + ".": { + "types": "./dist/types/src/index.d.ts", + "require": "./dist/cjs/src/index.js", + "default": "./dist/cjs/src/index.js", + "import": "./dist/cjs/src/index.js" + } + }, + "types": "./dist/types/src/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "clean": "rm -rf ./dist", + "build": "tsc -p tsconfig.build.cjs.json && tsc-alias -p tsconfig.build.cjs.json --outDir ./dist/cjs --verbose", + "typecheck": "tsc -p tsconfig.json --noEmit", + "lint": "eslint .", + "check-types": "tsc --noEmit", + "test": "jest --runInBand" + }, + "devDependencies": { + "@igniter/eslint-config": "workspace:*", + "@igniter/typescript-config": "workspace:*", + "@types/jest": "^30.0.0", + "@types/node": "22.14.1", + "jest": "^30.1.3", + "ts-jest": "^29.4.4", + "tsc-alias": "^1.8.15" + } +} diff --git a/packages/tx-verify/src/decide.test.ts b/packages/tx-verify/src/decide.test.ts new file mode 100644 index 00000000..5b86a67d --- /dev/null +++ b/packages/tx-verify/src/decide.test.ts @@ -0,0 +1,135 @@ +import { decideVerification, TX_EXPIRATION_BLOCKS } from './decide' + +const confirmedOk = { status: 'confirmed' as const, data: { success: true, code: 0, gasUsed: '100' } } +const confirmedFailed = { status: 'confirmed' as const, data: { success: false, code: 5, gasUsed: '100' } } +const absentAt = (h: number) => ({ status: 'absent' as const, coveredUpToHeight: h }) +const unavailable = { status: 'unavailable' as const } +const base = { executionHeight: 1000, expirationWindow: TX_EXPIRATION_BLOCKS, txTimeoutHeight: 1005 as number | null, sequence: null, txTimeoutTimestamp: null, chainTimeAtCoverage: null } + +describe('decideVerification v2', () => { + // D1: on-chain failed tx is a tx-failure, but effects depend on goal-state + it('hash confirmed success → tx success + apply-success', () => { + const d = decideVerification({ ...base, hash: confirmedOk, supplier: { status: 'confirmed' } }) + expect(d).toMatchObject({ tx: 'success', effects: 'apply-success', code: 0, gasUsed: '100' }) + }) + it('hash confirmed code!=0, supplier confirmed → tx failure + apply-success (goal met by sibling)', () => { + const d = decideVerification({ ...base, hash: confirmedFailed, supplier: { status: 'confirmed' } }) + expect(d).toMatchObject({ tx: 'failure', effects: 'apply-success', code: 5 }) + }) + it('hash confirmed code!=0, supplier absent → tx failure + apply-failure', () => { + const d = decideVerification({ ...base, hash: confirmedFailed, supplier: { status: 'absent', absentOperators: ['pokt1a'] } }) + expect(d).toMatchObject({ tx: 'failure', effects: 'apply-failure', failedOperators: ['pokt1a'] }) + }) + it('hash confirmed code!=0, supplier unavailable → pending (never destructive effects on unknown goal)', () => { + const d = decideVerification({ ...base, hash: confirmedFailed, supplier: unavailable }) + expect(d).toMatchObject({ tx: 'pending', incUnavailable: true }) + }) + it('hash confirmed code!=0, no supplier path → tx failure + none', () => { + const d = decideVerification({ ...base, hash: confirmedFailed, supplier: null }) + expect(d).toMatchObject({ tx: 'failure', effects: 'none', code: 5 }) + }) + + // goal-state success without hash evidence + it('supplier confirmed, hash absent → tx success + apply-success, no code/gasUsed', () => { + const d = decideVerification({ ...base, hash: absentAt(1004), supplier: { status: 'confirmed' } }) + expect(d).toMatchObject({ tx: 'success', effects: 'apply-success' }) + expect(d.code).toBeUndefined() + expect(d.gasUsed).toBeUndefined() + }) + + // D4: failure soundness — timeoutHeight bound + it('absent, covered >= timeoutHeight, supplier absent → failure', () => { + const d = decideVerification({ ...base, hash: absentAt(1005), supplier: { status: 'absent' } }) + expect(d).toMatchObject({ tx: 'failure', effects: 'apply-failure' }) + }) + it('absent, covered < timeoutHeight → pending even if window-end covered', () => { + const d = decideVerification({ ...base, txTimeoutHeight: 1050, hash: absentAt(1029), supplier: { status: 'absent' } }) + expect(d.tx).toBe('pending') + }) + + // D4: failure soundness — sequence rule (no timeoutHeight) + it('no timeout, sequence consumed, covered >= observedAtHeight → failure', () => { + const d = decideVerification({ ...base, txTimeoutHeight: null, sequence: { consumed: true, observedAtHeight: 1040 }, hash: absentAt(1040), supplier: { status: 'absent' } }) + expect(d.tx).toBe('failure') + }) + it('no timeout, sequence consumed, covered < observedAtHeight → pending (tx may have landed in the gap)', () => { + const d = decideVerification({ ...base, txTimeoutHeight: null, sequence: { consumed: true, observedAtHeight: 1040 }, hash: absentAt(1029), supplier: { status: 'absent' } }) + expect(d.tx).toBe('pending') + }) + it('no timeout, sequence not consumed → pending forever (tx can still land)', () => { + const d = decideVerification({ ...base, txTimeoutHeight: null, sequence: { consumed: false, observedAtHeight: 2000 }, hash: absentAt(1999), supplier: { status: 'absent' } }) + expect(d.tx).toBe('pending') + }) + it('no timeout, no sequence evidence → pending', () => { + const d = decideVerification({ ...base, txTimeoutHeight: null, sequence: null, hash: absentAt(5000), supplier: { status: 'absent' } }) + expect(d.tx).toBe('pending') + }) + + // unavailable paths never terminalize + it('hash unavailable → pending + incUnavailable', () => { + const d = decideVerification({ ...base, hash: unavailable, supplier: { status: 'absent' } }) + expect(d).toMatchObject({ tx: 'pending', incUnavailable: true }) + }) + it('supplier unavailable blocks failure', () => { + const d = decideVerification({ ...base, hash: absentAt(1005), supplier: unavailable }) + expect(d).toMatchObject({ tx: 'pending', incUnavailable: true }) + }) + + // coverage bookkeeping + it('pending absent advances newLastCoveredHeight', () => { + const d = decideVerification({ ...base, txTimeoutHeight: 1050, hash: absentAt(1010), supplier: null }) + expect(d.newLastCoveredHeight).toBe(1010) + }) +}) + +describe('decideVerification — unordered (timeoutTimestamp) bound', () => { + const T = new Date('2026-06-13T00:09:00Z') // timeout_timestamp + const baseU = { executionHeight: 1000, expirationWindow: 12, txTimeoutHeight: null, sequence: null, txTimeoutTimestamp: T } + + it('absent, chain time past timeout, supplier absent → failure', () => { + const d = decideVerification({ ...baseU, hash: absentAt(1010), chainTimeAtCoverage: new Date('2026-06-13T00:09:01Z'), supplier: { status: 'absent' } }) + expect(d).toMatchObject({ tx: 'failure', effects: 'apply-failure' }) + }) + it('absent, chain time BEFORE timeout → pending (tx can still land)', () => { + const d = decideVerification({ ...baseU, hash: absentAt(1010), chainTimeAtCoverage: new Date('2026-06-13T00:08:59Z'), supplier: { status: 'absent' } }) + expect(d.tx).toBe('pending') + }) + it('absent, chainTimeAtCoverage null (RPC could not read block time) → pending, never false-fail', () => { + const d = decideVerification({ ...baseU, hash: absentAt(1010), chainTimeAtCoverage: null, supplier: { status: 'absent' } }) + expect(d.tx).toBe('pending') + }) + it('unordered confirmed success unchanged', () => { + const d = decideVerification({ ...baseU, hash: confirmedOk, chainTimeAtCoverage: T, supplier: { status: 'confirmed' } }) + expect(d).toMatchObject({ tx: 'success', effects: 'apply-success' }) + }) +}) + +describe('decideVerification — Temporal serialization boundary (ISO string inputs)', () => { + const T_ISO = '2026-06-13T00:09:00.000Z' + const CHAIN_ISO = '2026-06-13T00:09:01.000Z' + const baseU = { executionHeight: 1000, expirationWindow: 12, txTimeoutHeight: null, sequence: null } + const absentAt = (h: number) => ({ status: 'absent' as const, coveredUpToHeight: h }) + + it('ISO string dates: unordered failure still works after Temporal round-trip', () => { + const d = decideVerification({ + ...baseU, + hash: absentAt(1010), + // simulate Temporal serializing Date → ISO string and back + txTimeoutTimestamp: T_ISO as any, + chainTimeAtCoverage: CHAIN_ISO as any, + supplier: { status: 'absent', absentOperators: ['pokt1a'] }, + }) + expect(d).toMatchObject({ tx: 'failure', effects: 'apply-failure' }) + }) + + it('ISO string dates: chain time before timeout stays pending', () => { + const d = decideVerification({ + ...baseU, + hash: absentAt(1010), + txTimeoutTimestamp: T_ISO as any, + chainTimeAtCoverage: '2026-06-13T00:08:59.000Z' as any, + supplier: { status: 'absent', absentOperators: ['pokt1a'] }, + }) + expect(d.tx).toBe('pending') + }) +}) diff --git a/packages/tx-verify/src/decide.ts b/packages/tx-verify/src/decide.ts new file mode 100644 index 00000000..beffa1e5 --- /dev/null +++ b/packages/tx-verify/src/decide.ts @@ -0,0 +1,139 @@ +import type { VerifyOutcome, SupplierPathOutcome } from './verifyOutcome' + +/** + * On-chain mempool/tx validity window in blocks. Used both as the broadcaster's + * pre-broadcast expiry check and as the per-sweep hash-scan window. Single source — + * the scan window and the verdict window MUST agree. + */ +export const TX_EXPIRATION_BLOCKS = 30 + +export interface DecideInput { + hash: VerifyOutcome<{ success: boolean; code: number; gasUsed: string }> + /** null when the tx type has no supplier path (e.g. send / OperationalFunds) */ + supplier: SupplierPathOutcome | null + /** advisory only, not read — kept so existing callers compile without changes */ + executionHeight: number + /** advisory only, not read — kept so existing callers compile without changes */ + expirationWindow: number + /** + * timeoutHeight embedded in the signed tx (Cosmos ante rejects inclusion in any + * block with height > timeoutHeight). null when the tx has no embedded timeout + * (external-wallet signed / legacy rows) — failure then requires sequence evidence. + */ + txTimeoutHeight: number | null + /** + * Sequence-consumed evidence: account.sequence > tx.sequence observed at chain + * head `observedAtHeight`. Once consumed, the tx can never land in a FUTURE block; + * failure additionally requires hash-absence covered up to observedAtHeight + * (the tx could have been the consumer in the uncovered gap). + */ + sequence: { consumed: boolean; observedAtHeight: number } | null + /** + * timeout_timestamp embedded in an UNORDERED tx. Cosmos ante rejects inclusion + * once chain block time passes it. null for ordered txs (use txTimeoutHeight/sequence). + */ + txTimeoutTimestamp: Date | null + /** + * Chain block time at the hash path's coveredUpToHeight (NOT verifier wall-clock). + * null when the RPC could not read it → unordered failure can never be declared + * (stays pending), eliminating clock-skew split-brain. + */ + chainTimeAtCoverage: Date | null +} + +export interface VerificationDecision { + /** Truth about THIS tx: executed ok / provably can never apply / unknown. */ + tx: 'success' | 'failure' | 'pending' + /** Goal-state reconciliation to run. Destructive failure effects ONLY on verified-absent goal. */ + effects: 'apply-success' | 'apply-failure' | 'none' + /** Operators with negative supplier evidence; failure effects act only on these when present. */ + failedOperators?: string[] + code?: number + gasUsed?: string + newLastCoveredHeight?: number + /** any applicable path was unavailable */ + incUnavailable: boolean +} + +/** + * Pure transition logic. `tx` is per-tx truth; `effects` is goal-state truth — + * they diverge when a sibling tx achieved the goal after this tx failed. + * Failure requires COMPLETE negative evidence under a healthy RPC AND a proof + * that the tx cannot land later via one of three bounds: + * (1) height bound — txTimeoutHeight covered (ordered txs with embedded timeout); + * (2) sequence bound — account sequence consumed and coverage reaches the observation; + * (3) timestamp bound — chain block time at coverage exceeds txTimeoutTimestamp + * (unordered txs; uses chain time, NEVER wall-clock, to avoid clock-skew split-brain). + * Any unavailable path keeps the tx pending (indefinitely). + */ +export function decideVerification(input: DecideInput): VerificationDecision { + if (input.txTimeoutTimestamp != null && input.txTimeoutHeight != null) throw new Error('decideVerification: txTimeoutTimestamp and txTimeoutHeight are mutually exclusive') + const chainTime = input.chainTimeAtCoverage != null ? new Date(input.chainTimeAtCoverage as any) : null + const txTimeoutTs = input.txTimeoutTimestamp != null ? new Date(input.txTimeoutTimestamp as any) : null + const { hash, supplier, txTimeoutHeight, sequence } = input + + const supplierApplicable = supplier !== null + const anyUnavailable = + hash.status === 'unavailable' || (supplierApplicable && supplier!.status === 'unavailable') + + // 1. This tx executed successfully. + if (hash.status === 'confirmed' && hash.data.success) { + return { tx: 'success', effects: 'apply-success', code: hash.data.code, gasUsed: hash.data.gasUsed, incUnavailable: false } + } + + // 2. This tx executed and failed (DeliverTx code != 0): per-tx failure is definitive, + // but destructive effects require knowing the goal-state. + if (hash.status === 'confirmed' && !hash.data.success) { + if (!supplierApplicable) { + return { tx: 'failure', effects: 'none', code: hash.data.code, gasUsed: hash.data.gasUsed, incUnavailable: false } + } + if (supplier!.status === 'confirmed') { + // Goal met by a sibling tx — do NOT release/penalize staked state. + return { tx: 'failure', effects: 'apply-success', code: hash.data.code, gasUsed: hash.data.gasUsed, incUnavailable: false } + } + if (supplier!.status === 'absent') { + return { tx: 'failure', effects: 'apply-failure', failedOperators: supplier!.absentOperators, code: hash.data.code, gasUsed: hash.data.gasUsed, incUnavailable: false } + } + // supplier unavailable: wait — never run destructive effects on an unknown goal-state. + return { tx: 'pending', effects: 'none', incUnavailable: true } + } + + // 3. Goal-state verified on-chain without hash evidence (degraded-RPC fallback). + // No code/gasUsed — leave persisted values untouched downstream. + if (supplierApplicable && supplier!.status === 'confirmed') { + return { tx: 'success', effects: 'apply-success', incUnavailable: false } + } + + // 4. Failure: hash absent over a window the tx provably cannot land outside of, + // AND the goal-state answered absent (or no goal-state exists). + if (hash.status === 'absent') { + const supplierNegativeOrNA = !supplierApplicable || supplier!.status === 'absent' + // Unordered: bound is chain-block-time vs timeout_timestamp (never wall-clock). + const unorderedExpired = + txTimeoutTs != null && + chainTime != null && + chainTime.getTime() > txTimeoutTs.getTime() + // Ordered: bound is height coverage vs timeoutHeight, or sequence-consumed. + const orderedRequiredCoverage = + txTimeoutHeight != null ? txTimeoutHeight + : sequence?.consumed ? sequence.observedAtHeight + : Number.POSITIVE_INFINITY + const orderedExpired = txTimeoutTs == null && hash.coveredUpToHeight >= orderedRequiredCoverage + if ((unorderedExpired || orderedExpired) && supplierNegativeOrNA) { + return { + tx: 'failure', + effects: supplierApplicable ? 'apply-failure' : 'none', + failedOperators: supplierApplicable ? supplier!.absentOperators : undefined, + incUnavailable: false, + } + } + } + + // 5. Pending. Advance coverage only when the hash path answered. + return { + tx: 'pending', + effects: 'none', + newLastCoveredHeight: hash.status === 'absent' ? hash.coveredUpToHeight : undefined, + incUnavailable: anyUnavailable, + } +} diff --git a/packages/tx-verify/src/index.ts b/packages/tx-verify/src/index.ts new file mode 100644 index 00000000..29f61255 --- /dev/null +++ b/packages/tx-verify/src/index.ts @@ -0,0 +1,3 @@ +export * from './verifyOutcome' +export * from './supplierEffect' +export * from './decide' diff --git a/packages/tx-verify/src/supplierEffect.ts b/packages/tx-verify/src/supplierEffect.ts new file mode 100644 index 00000000..c5bad7f1 --- /dev/null +++ b/packages/tx-verify/src/supplierEffect.ts @@ -0,0 +1,5 @@ +/** The expected on-chain effect of a supplier-mutating transaction, used for state-based verification. */ +export type SupplierEffect = + | { kind: 'stake-services-present'; ownerAddress: string } + | { kind: 'upstake'; ownerAddress: string; minStakeUpokt: bigint } + | { kind: 'unstake'; minSessionEndHeight: number } diff --git a/packages/tx-verify/src/verifyOutcome.ts b/packages/tx-verify/src/verifyOutcome.ts new file mode 100644 index 00000000..f1983066 --- /dev/null +++ b/packages/tx-verify/src/verifyOutcome.ts @@ -0,0 +1,11 @@ +/** Result of a verification query that distinguishes a negative answer from an unreachable RPC. */ +export type VerifyOutcome = + | { status: 'confirmed'; data: T } + | { status: 'absent'; coveredUpToHeight: number; coveredBlockTime?: Date } + | { status: 'unavailable' } + +/** Aggregated supplier-path outcome. `absentOperators` lets failure effects act only on operators with negative evidence. */ +export type SupplierPathOutcome = + | { status: 'confirmed' } + | { status: 'absent'; absentOperators?: string[] } + | { status: 'unavailable' } diff --git a/packages/tx-verify/tsconfig.build.cjs.json b/packages/tx-verify/tsconfig.build.cjs.json new file mode 100644 index 00000000..516b5fe8 --- /dev/null +++ b/packages/tx-verify/tsconfig.build.cjs.json @@ -0,0 +1,17 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./dist/cjs", + "module": "CommonJS", + "moduleResolution": "node", + "paths": { + "@tx-verify/*": ["src/*"] + }, + "sourceMap": true, + "declaration": true, + "declarationDir": "./dist/types", + "noEmit": false + }, + "include": ["src"], + "exclude": ["src/**/*.test.ts"] +} diff --git a/packages/tx-verify/tsconfig.json b/packages/tx-verify/tsconfig.json new file mode 100644 index 00000000..e0f09db0 --- /dev/null +++ b/packages/tx-verify/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "@igniter/typescript-config/base.json", + "compilerOptions": { + "composite": true, + "declaration": true, + "outDir": "./dist", + "baseUrl": ".", + "paths": { + "@tx-verify/*": ["src/*"] + }, + "module": "preserve", + "moduleResolution": "bundler", + "types": ["node"] + }, + "include": ["src"], + "exclude": ["node_modules", "dist", "src/**/*.test.ts"] +} diff --git a/packages/ui/package.json b/packages/ui/package.json index ba90695c..011ebb2b 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -34,6 +34,7 @@ "@cosmjs/stargate": "^0.33.1", "@hookform/resolvers": "^4.1.3", "@igniter/graphql": "workspace:*", + "@igniter/tx-verify": "workspace:*", "@mui/system": "^5.14.11", "@poktscan/vault-siwp": "github:trustsoothe/vault-siwp#shannon-adr36", "@radix-ui/react-avatar": "1.1.3", diff --git a/packages/ui/src/context/WalletConnection/KeplrWalletConnection.ts b/packages/ui/src/context/WalletConnection/KeplrWalletConnection.ts index be8b797a..e9baaa61 100644 --- a/packages/ui/src/context/WalletConnection/KeplrWalletConnection.ts +++ b/packages/ui/src/context/WalletConnection/KeplrWalletConnection.ts @@ -15,6 +15,7 @@ import {PubKey} from "@igniter/pocket/proto/cosmos/crypto/secp256k1/keys"; import {MsgSend} from "@igniter/pocket/proto/cosmos/bank/v1beta1/tx"; import {Coin} from "@igniter/pocket/proto/cosmos/base/v1beta1/coin"; import { WalletConnection, WalletSettings } from './WalletConnection' +import { TX_EXPIRATION_BLOCKS } from '@igniter/tx-verify' export type AccountSequenceRawBody = { account: { @@ -218,7 +219,12 @@ export class KeplrWalletConnection extends WalletConnection { const { accountNumber, sequence } = await this._getSequence(address); const memo = memoObj ? JSON.stringify(memoObj) : ""; - const bodyBytes = this._registry!.encodeTxBody({ messages: msgs, memo }); + // Embed timeoutHeight so the verifier can anchor failure verdicts without waiting + // for the full sequence-consumed check. PocketWalletConnection hands signing to + // the external wallet and cannot control this field — those txs rely on the + // sequence rule in checkTxValidityEvidence (see: parseSignerAndSequence activity). + const currentHeight = await this._getBlockHeight(); + const bodyBytes = this._registry!.encodeTxBody({ messages: msgs, memo, timeoutHeight: BigInt(currentHeight + TX_EXPIRATION_BLOCKS) }); const anyPubkey = { typeUrl: "/cosmos.crypto.secp256k1.PubKey", @@ -310,6 +316,23 @@ export class KeplrWalletConnection extends WalletConnection { return gas; }; + /** + * Fetches the current chain head height via the Cosmos REST API. + * Used to embed timeoutHeight at signing time so the verifier can anchor failure verdicts. + */ + private async _getBlockHeight(): Promise { + if (!this._apiUrl) { + throw new Error('API URL not configured.'); + } + const res = await fetch(`${this._apiUrl}/cosmos/base/tendermint/v1beta1/blocks/latest`); + if (!res.ok) { + const text = await res.text().catch(() => ''); + throw new Error(`Fetch block height failed (${res.status}): ${text || 'no body'}`); + } + const data = await res.json(); + return Number(data.block.header.height); + }; + private async _getSequence(address: string): Promise<{ accountNumber: number, sequence: number, diff --git a/packages/ui/tsconfig.tsbuildinfo b/packages/ui/tsconfig.tsbuildinfo new file mode 100644 index 00000000..3b228ccd --- /dev/null +++ b/packages/ui/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/@types+react@19.0.8/node_modules/@types/react/global.d.ts","../../node_modules/.pnpm/csstype@3.1.3/node_modules/csstype/index.d.ts","../../node_modules/.pnpm/@types+react@19.0.8/node_modules/@types/react/index.d.ts","../../node_modules/.pnpm/@types+react@19.0.8/node_modules/@types/react/jsx-runtime.d.ts","./src/card.tsx","./src/code.tsx","./src/lib/models/Transactions.ts","./src/lib/models/index.ts","./src/context/WalletConnection/WalletConnection.ts","./src/context/WalletConnection/constants.tsx","../../node_modules/.pnpm/cosmjs-types@0.9.0/node_modules/cosmjs-types/binary.d.ts","../../node_modules/.pnpm/cosmjs-types@0.9.0/node_modules/cosmjs-types/google/protobuf/any.d.ts","../../node_modules/.pnpm/cosmjs-types@0.9.0/node_modules/cosmjs-types/cosmos/crypto/multisig/v1beta1/multisig.d.ts","../../node_modules/.pnpm/cosmjs-types@0.9.0/node_modules/cosmjs-types/cosmos/tx/signing/v1beta1/signing.d.ts","../../node_modules/.pnpm/cosmjs-types@0.9.0/node_modules/cosmjs-types/cosmos/base/v1beta1/coin.d.ts","../../node_modules/.pnpm/cosmjs-types@0.9.0/node_modules/cosmjs-types/cosmos/tx/v1beta1/tx.d.ts","../../node_modules/.pnpm/@cosmjs+proto-signing@0.33.1/node_modules/@cosmjs/proto-signing/build/decode.d.ts","../../node_modules/.pnpm/@cosmjs+crypto@0.33.1/node_modules/@cosmjs/crypto/build/bip39.d.ts","../../node_modules/.pnpm/@cosmjs+crypto@0.33.1/node_modules/@cosmjs/crypto/build/hash.d.ts","../../node_modules/.pnpm/@cosmjs+crypto@0.33.1/node_modules/@cosmjs/crypto/build/hmac.d.ts","../../node_modules/.pnpm/@cosmjs+crypto@0.33.1/node_modules/@cosmjs/crypto/build/keccak.d.ts","../../node_modules/.pnpm/@cosmjs+crypto@0.33.1/node_modules/@cosmjs/crypto/build/libsodium.d.ts","../../node_modules/.pnpm/@cosmjs+crypto@0.33.1/node_modules/@cosmjs/crypto/build/random.d.ts","../../node_modules/.pnpm/@cosmjs+crypto@0.33.1/node_modules/@cosmjs/crypto/build/ripemd.d.ts","../../node_modules/.pnpm/@cosmjs+crypto@0.33.1/node_modules/@cosmjs/crypto/build/secp256k1signature.d.ts","../../node_modules/.pnpm/@cosmjs+crypto@0.33.1/node_modules/@cosmjs/crypto/build/secp256k1.d.ts","../../node_modules/.pnpm/@cosmjs+crypto@0.33.1/node_modules/@cosmjs/crypto/build/sha.d.ts","../../node_modules/.pnpm/@cosmjs+math@0.33.1/node_modules/@cosmjs/math/build/integers.d.ts","../../node_modules/.pnpm/@cosmjs+math@0.33.1/node_modules/@cosmjs/math/build/decimal.d.ts","../../node_modules/.pnpm/@cosmjs+math@0.33.1/node_modules/@cosmjs/math/build/index.d.ts","../../node_modules/.pnpm/@cosmjs+crypto@0.33.1/node_modules/@cosmjs/crypto/build/slip10.d.ts","../../node_modules/.pnpm/@cosmjs+crypto@0.33.1/node_modules/@cosmjs/crypto/build/index.d.ts","../../node_modules/.pnpm/@cosmjs+amino@0.33.1/node_modules/@cosmjs/amino/build/pubkeys.d.ts","../../node_modules/.pnpm/@cosmjs+amino@0.33.1/node_modules/@cosmjs/amino/build/addresses.d.ts","../../node_modules/.pnpm/@cosmjs+amino@0.33.1/node_modules/@cosmjs/amino/build/coins.d.ts","../../node_modules/.pnpm/@cosmjs+amino@0.33.1/node_modules/@cosmjs/amino/build/encoding.d.ts","../../node_modules/.pnpm/@cosmjs+amino@0.33.1/node_modules/@cosmjs/amino/build/multisig.d.ts","../../node_modules/.pnpm/@cosmjs+amino@0.33.1/node_modules/@cosmjs/amino/build/omitdefault.d.ts","../../node_modules/.pnpm/@cosmjs+amino@0.33.1/node_modules/@cosmjs/amino/build/paths.d.ts","../../node_modules/.pnpm/@cosmjs+amino@0.33.1/node_modules/@cosmjs/amino/build/signdoc.d.ts","../../node_modules/.pnpm/@cosmjs+amino@0.33.1/node_modules/@cosmjs/amino/build/signature.d.ts","../../node_modules/.pnpm/@cosmjs+amino@0.33.1/node_modules/@cosmjs/amino/build/signer.d.ts","../../node_modules/.pnpm/@cosmjs+amino@0.33.1/node_modules/@cosmjs/amino/build/wallet.d.ts","../../node_modules/.pnpm/@cosmjs+amino@0.33.1/node_modules/@cosmjs/amino/build/secp256k1hdwallet.d.ts","../../node_modules/.pnpm/@cosmjs+amino@0.33.1/node_modules/@cosmjs/amino/build/secp256k1wallet.d.ts","../../node_modules/.pnpm/@cosmjs+amino@0.33.1/node_modules/@cosmjs/amino/build/stdtx.d.ts","../../node_modules/.pnpm/@cosmjs+amino@0.33.1/node_modules/@cosmjs/amino/build/index.d.ts","../../node_modules/.pnpm/@cosmjs+proto-signing@0.33.1/node_modules/@cosmjs/proto-signing/build/signer.d.ts","../../node_modules/.pnpm/@cosmjs+proto-signing@0.33.1/node_modules/@cosmjs/proto-signing/build/wallet.d.ts","../../node_modules/.pnpm/@cosmjs+proto-signing@0.33.1/node_modules/@cosmjs/proto-signing/build/directsecp256k1hdwallet.d.ts","../../node_modules/.pnpm/@cosmjs+proto-signing@0.33.1/node_modules/@cosmjs/proto-signing/build/directsecp256k1wallet.d.ts","../../node_modules/.pnpm/@cosmjs+proto-signing@0.33.1/node_modules/@cosmjs/proto-signing/build/paths.d.ts","../../node_modules/.pnpm/@cosmjs+proto-signing@0.33.1/node_modules/@cosmjs/proto-signing/build/pubkey.d.ts","../../node_modules/.pnpm/protobufjs@6.11.4/node_modules/protobufjs/index.d.ts","../../node_modules/.pnpm/@cosmjs+proto-signing@0.33.1/node_modules/@cosmjs/proto-signing/build/registry.d.ts","../../node_modules/.pnpm/@cosmjs+proto-signing@0.33.1/node_modules/@cosmjs/proto-signing/build/signing.d.ts","../../node_modules/.pnpm/@cosmjs+proto-signing@0.33.1/node_modules/@cosmjs/proto-signing/build/index.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/wire/binary-encoding.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/wire/base64-encoding.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/wire/text-encoding.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/json-value.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/codegenv1/types.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/reflect/scalar.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/reflect/unsafe.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/reflect/reflect-types.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/reflect/guard.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/types.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/types.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/descriptor_pb.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/descriptors.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/wire/text-format.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/reflect/error.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/reflect/names.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/reflect/nested-types.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/reflect/reflect.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/registry.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/reflect/path.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/reflect/index.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/to-binary.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/from-binary.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/wire/size-delimited.d.ts","../../node_modules/.pnpm/@bufbuild+protobuf@2.7.0/node_modules/@bufbuild/protobuf/dist/esm/wire/index.d.ts","../pocket/dist/types/src/proto/generated/cosmos/base/v1beta1/coin.d.ts","../pocket/dist/types/src/proto/generated/pocket/shared/service.d.ts","../pocket/dist/types/src/proto/generated/pocket/supplier/params.d.ts","../pocket/dist/types/src/proto/generated/pocket/supplier/tx.d.ts","../pocket/dist/types/src/proto/generated/google/protobuf/any.d.ts","../pocket/dist/types/src/proto/generated/cosmos/crypto/multisig/v1beta1/multisig.d.ts","../pocket/dist/types/src/proto/generated/cosmos/tx/signing/v1beta1/signing.d.ts","../pocket/dist/types/src/proto/generated/cosmos/tx/v1beta1/tx.d.ts","../pocket/dist/types/src/proto/generated/cosmos/crypto/secp256k1/keys.d.ts","../pocket/dist/types/src/proto/generated/cosmos/bank/v1beta1/bank.d.ts","../pocket/dist/types/src/proto/generated/cosmos/bank/v1beta1/tx.d.ts","../tx-verify/dist/types/src/verifyOutcome.d.ts","../tx-verify/dist/types/src/supplierEffect.d.ts","../tx-verify/dist/types/src/decide.d.ts","../tx-verify/dist/types/src/index.d.ts","./src/context/WalletConnection/KeplrWalletConnection.ts","./src/context/WalletConnection/PocketWalletConnection.ts","./src/lib/cookies.ts","./src/context/WalletConnection/index.tsx","./src/providers.d.ts","./src/svg.d.ts","../../node_modules/.pnpm/next-themes@0.4.3_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next-themes/dist/index.d.mts","./src/theme-toggle.tsx","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/version.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/jsutils/Maybe.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/language/source.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/jsutils/ObjMap.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/jsutils/Path.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/jsutils/PromiseOrValue.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/language/kinds.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/language/tokenKind.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/language/ast.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/language/location.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/error/GraphQLError.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/language/directiveLocation.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/type/directives.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/type/schema.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/type/definition.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/execution/execute.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/graphql.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/type/scalars.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/type/introspection.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/type/validate.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/type/assertName.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/type/index.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/language/printLocation.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/language/lexer.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/language/parser.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/language/printer.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/language/visitor.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/language/predicates.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/language/index.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/execution/subscribe.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/execution/values.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/execution/index.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/subscription/index.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/TypeInfo.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/ValidationContext.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/validate.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/MaxIntrospectionDepthRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/specifiedRules.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/ExecutableDefinitionsRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/KnownArgumentNamesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/KnownDirectivesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/KnownFragmentNamesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/KnownTypeNamesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/LoneAnonymousOperationRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/NoFragmentCyclesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/NoUndefinedVariablesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/NoUnusedFragmentsRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/NoUnusedVariablesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/OverlappingFieldsCanBeMergedRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/PossibleFragmentSpreadsRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/ScalarLeafsRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/UniqueArgumentNamesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/UniqueFragmentNamesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/UniqueInputFieldNamesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/UniqueOperationNamesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/UniqueVariableNamesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/VariablesAreInputTypesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/UniqueOperationTypesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/UniqueTypeNamesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/UniqueArgumentDefinitionNamesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/PossibleTypeExtensionsRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/custom/NoDeprecatedCustomRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/rules/custom/NoSchemaIntrospectionCustomRule.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/validation/index.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/error/syntaxError.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/error/locatedError.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/error/index.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/getIntrospectionQuery.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/getOperationAST.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/getOperationRootType.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/introspectionFromSchema.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/buildClientSchema.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/buildASTSchema.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/extendSchema.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/lexicographicSortSchema.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/printSchema.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/typeFromAST.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/valueFromAST.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/valueFromASTUntyped.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/astFromValue.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/coerceInputValue.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/concatAST.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/separateOperations.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/stripIgnoredCharacters.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/typeComparators.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/assertValidName.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/findBreakingChanges.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/typedQueryDocumentNode.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/utilities/index.d.ts","../../node_modules/.pnpm/graphql@16.11.0/node_modules/graphql/index.d.ts","../../node_modules/.pnpm/@graphql-typed-document-node+core@3.2.0_graphql@16.11.0/node_modules/@graphql-typed-document-node/core/typings/index.d.ts","../graphql/src/gql/graphql.ts","../graphql/src/gql/fragment-masking.ts","../graphql/src/gql/gql.ts","../graphql/src/gql/index.ts","../graphql/src/block.ts","../../node_modules/.pnpm/ts-invariant@0.10.3/node_modules/ts-invariant/lib/invariant.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/invariantErrorCodes.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/globals/invariantWrappers.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/globals/maybe.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/globals/global.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/globals/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/graphql/directives.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/graphql/DocumentTransform.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/graphql/fragments.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/graphql/getFromAST.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/graphql/print.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/graphql/storeUtils.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/graphql/transform.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/graphql/operations.d.ts","../../node_modules/.pnpm/@wry+trie@0.5.0/node_modules/@wry/trie/lib/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/masking/internal/types.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/masking/types.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/masking/utils.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/masking/maskFragment.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/masking/maskOperation.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/masking/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/cache/core/types/Cache.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/cache/inmemory/entityStore.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/cache/inmemory/fragmentRegistry.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/cache/inmemory/types.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/cache/inmemory/fixPolyfills.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/cache/inmemory/reactiveVars.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/caching/getMemoryInternals.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/cache/inmemory/inMemoryCache.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/cache/inmemory/object-canon.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/cache/inmemory/readFromStore.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/cache/inmemory/writeToStore.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/cache/inmemory/policies.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/cache/core/types/common.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/cache/core/types/DataProxy.d.ts","../../node_modules/.pnpm/zen-observable-ts@1.2.5/node_modules/zen-observable-ts/module.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/http/parseAndCheckHttpResponse.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/http/serializeFetchParameter.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/http/selectHttpOptionsAndBody.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/http/checkFetcher.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/http/createSignalIfSupported.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/http/selectURI.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/http/createHttpLink.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/http/HttpLink.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/http/rewriteURIForGET.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/http/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/utils/fromError.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/utils/toPromise.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/utils/fromPromise.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/utils/throwServerError.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/utils/validateOperation.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/utils/createOperation.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/utils/transformOperation.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/utils/filterOperationVariables.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/utils/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/errors/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/core/networkStatus.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/core/LocalState.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/core/watchQueryOptions.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/core/QueryInfo.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/core/QueryManager.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/core/ObservableQuery.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/core/types.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/cache/core/cache.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/cache/inmemory/helpers.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/cache/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/policies/pagination.d.ts","../../node_modules/.pnpm/symbol-observable@4.0.0/node_modules/symbol-observable/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/observables/Observable.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/promises/decoration.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/promises/preventUnhandledRejection.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/common/objects.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/common/mergeDeep.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/common/cloneDeep.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/common/maybeDeepFreeze.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/observables/iteration.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/observables/asyncMap.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/observables/Concast.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/observables/subclassing.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/common/arrays.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/common/errorHandling.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/common/canUse.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/common/compact.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/common/makeUniqueId.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/common/stringifyForDisplay.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/common/mergeOptions.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/common/incrementalResult.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/common/canonicalStringify.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/types/Primitive.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/types/DeepOmit.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/common/omitDeep.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/common/stripTypename.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/types/IsStrictlyAny.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/types/DeepPartial.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/types/OnlyRequiredProperties.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/types/Prettify.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/types/UnionToIntersection.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/types/NoInfer.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/types/RemoveIndexSignature.d.ts","../../node_modules/.pnpm/@wry+caches@1.0.1/node_modules/@wry/caches/lib/common.d.ts","../../node_modules/.pnpm/@wry+caches@1.0.1/node_modules/@wry/caches/lib/strong.d.ts","../../node_modules/.pnpm/@wry+caches@1.0.1/node_modules/@wry/caches/lib/weak.d.ts","../../node_modules/.pnpm/@wry+caches@1.0.1/node_modules/@wry/caches/lib/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/caching/caches.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/caching/sizes.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/caching/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/utilities/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/core/types.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/core/ApolloLink.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/core/empty.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/core/from.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/core/split.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/core/concat.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/core/execute.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/core/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/core/ApolloClient.d.ts","../../node_modules/.pnpm/graphql-tag@2.12.6_graphql@16.11.0/node_modules/graphql-tag/lib/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/core/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/context/ApolloConsumer.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/ssr/getDataFromTree.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/ssr/renderToStringWithData.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/internal/cache/types.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/internal/cache/QueryReference.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/internal/cache/FragmentReference.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/internal/cache/SuspenseCache.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/internal/cache/getSuspenseCache.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/hooks/useApolloClient.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/hooks/useLazyQuery.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/hooks/useMutation.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/hooks/useQuery.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/hooks/useSubscription.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/hooks/useReactiveVar.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/hooks/useFragment.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/hooks/constants.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/hooks/useSuspenseQuery.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/hooks/useBackgroundQuery.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/hooks/useSuspenseFragment.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/hooks/useLoadableQuery.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/hooks/useQueryRefHandlers.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/hooks/useReadQuery.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/hooks/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/query-preloader/createQueryPreloader.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/hooks/internal/wrapHook.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/internal/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/types/types.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/ssr/RenderPromises.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/ssr/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/context/ApolloContext.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/context/ApolloProvider.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/context/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/parser/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/react/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/index.d.ts","../../node_modules/.pnpm/@apollo+client-react-streaming@0.12.2_@apollo+client@3.13.8_@types+react@19.0.8_graphql_e15fe26a16ef613109fdc0aff126a3da/node_modules/@apollo/client-react-streaming/dist/combined.d.ts","../../node_modules/.pnpm/@apollo+client-react-streaming@0.12.2_@apollo+client@3.13.8_@types+react@19.0.8_graphql_e15fe26a16ef613109fdc0aff126a3da/node_modules/@apollo/client-react-streaming/dist/manual-transport.ssr.d.ts","../../node_modules/.pnpm/@apollo+client-integration-nextjs@0.12.2_@apollo+client@3.13.8_@types+react@19.0.8_grap_bc37e09f05521cb2c3af94b1319501f0/node_modules/@apollo/client-integration-nextjs/dist/combined.d.ts","./src/lib/graphql/server.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/revalidate.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/use-cache/cache-tag.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/cache.d.ts","./src/api/blocks.ts","./src/assets/index.ts","../../node_modules/.pnpm/@radix-ui+react-slot@1.1.1_@types+react@19.0.8_react@19.0.1/node_modules/@radix-ui/react-slot/dist/index.d.mts","../../node_modules/.pnpm/clsx@2.0.0/node_modules/clsx/clsx.d.mts","../../node_modules/.pnpm/class-variance-authority@0.7.0/node_modules/class-variance-authority/dist/types.d.ts","../../node_modules/.pnpm/class-variance-authority@0.7.0/node_modules/class-variance-authority/dist/index.d.ts","../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/clsx.d.mts","../../node_modules/.pnpm/tailwind-merge@3.0.1/node_modules/tailwind-merge/dist/types.d.ts","./src/lib/utils.ts","./src/components/button.tsx","../../node_modules/.pnpm/@radix-ui+react-context@1.1.1_@types+react@19.0.8_react@19.0.1/node_modules/@radix-ui/react-context/dist/index.d.mts","../../node_modules/.pnpm/@radix-ui+react-primitive@2.0.2_@types+react-dom@19.0.3_@types+react@19.0.8__@types+rea_654d868b777e2f0ddd9ee2778aecf32c/node_modules/@radix-ui/react-primitive/dist/index.d.mts","../../node_modules/.pnpm/@radix-ui+react-dismissable-layer@1.1.5_@types+react-dom@19.0.3_@types+react@19.0.8__@t_15a18f25a7ff4e8f449950865c4a0368/node_modules/@radix-ui/react-dismissable-layer/dist/index.d.mts","../../node_modules/.pnpm/@radix-ui+react-focus-scope@1.1.2_@types+react-dom@19.0.3_@types+react@19.0.8__@types+r_fd3fa5dd6844580e487c3c8a2c49056b/node_modules/@radix-ui/react-focus-scope/dist/index.d.mts","../../node_modules/.pnpm/@radix-ui+react-portal@1.1.4_@types+react-dom@19.0.3_@types+react@19.0.8__@types+react@_68740379d37fcccaf51623428d9556d4/node_modules/@radix-ui/react-portal/dist/index.d.mts","../../node_modules/.pnpm/@radix-ui+react-dialog@1.1.6_@types+react-dom@19.0.3_@types+react@19.0.8__@types+react@_55687eba0e2a9f59414a457d110f8bf1/node_modules/@radix-ui/react-dialog/dist/index.d.mts","../../node_modules/.pnpm/lucide-react@0.456.0_react@19.0.1/node_modules/lucide-react/dist/lucide-react.d.ts","./src/components/dialog.tsx","./src/components/AbortConfirmationDialog.tsx","./src/components/ActivityHeader.tsx","../../node_modules/.pnpm/@mui+types@7.2.24_@types+react@19.0.8/node_modules/@mui/types/index.d.ts","../../node_modules/.pnpm/@emotion+sheet@1.4.0/node_modules/@emotion/sheet/dist/declarations/src/index.d.ts","../../node_modules/.pnpm/@emotion+sheet@1.4.0/node_modules/@emotion/sheet/dist/emotion-sheet.cjs.d.mts","../../node_modules/.pnpm/@emotion+utils@1.4.2/node_modules/@emotion/utils/dist/declarations/src/types.d.ts","../../node_modules/.pnpm/@emotion+utils@1.4.2/node_modules/@emotion/utils/dist/declarations/src/index.d.ts","../../node_modules/.pnpm/@emotion+utils@1.4.2/node_modules/@emotion/utils/dist/emotion-utils.cjs.d.mts","../../node_modules/.pnpm/@emotion+cache@11.14.0/node_modules/@emotion/cache/dist/declarations/src/types.d.ts","../../node_modules/.pnpm/@emotion+cache@11.14.0/node_modules/@emotion/cache/dist/declarations/src/index.d.ts","../../node_modules/.pnpm/@emotion+cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.cjs.default.d.ts","../../node_modules/.pnpm/@emotion+cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.cjs.d.mts","../../node_modules/.pnpm/@emotion+serialize@1.3.3/node_modules/@emotion/serialize/dist/declarations/src/index.d.ts","../../node_modules/.pnpm/@emotion+serialize@1.3.3/node_modules/@emotion/serialize/dist/emotion-serialize.cjs.d.mts","../../node_modules/.pnpm/@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1/node_modules/@emotion/react/dist/declarations/src/context.d.ts","../../node_modules/.pnpm/@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1/node_modules/@emotion/react/dist/declarations/src/types.d.ts","../../node_modules/.pnpm/@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1/node_modules/@emotion/react/dist/declarations/src/theming.d.ts","../../node_modules/.pnpm/@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1/node_modules/@emotion/react/dist/declarations/src/jsx-namespace.d.ts","../../node_modules/.pnpm/@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1/node_modules/@emotion/react/dist/declarations/src/jsx.d.ts","../../node_modules/.pnpm/@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1/node_modules/@emotion/react/dist/declarations/src/global.d.ts","../../node_modules/.pnpm/@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1/node_modules/@emotion/react/dist/declarations/src/keyframes.d.ts","../../node_modules/.pnpm/@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1/node_modules/@emotion/react/dist/declarations/src/class-names.d.ts","../../node_modules/.pnpm/@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1/node_modules/@emotion/react/dist/declarations/src/css.d.ts","../../node_modules/.pnpm/@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1/node_modules/@emotion/react/dist/declarations/src/index.d.ts","../../node_modules/.pnpm/@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1/node_modules/@emotion/react/dist/emotion-react.cjs.d.mts","../../node_modules/.pnpm/@emotion+styled@11.14.0_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@types+react@19.0.8_react@19.0.1/node_modules/@emotion/styled/dist/declarations/src/jsx-namespace.d.ts","../../node_modules/.pnpm/@emotion+styled@11.14.0_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@types+react@19.0.8_react@19.0.1/node_modules/@emotion/styled/dist/declarations/src/types.d.ts","../../node_modules/.pnpm/@emotion+styled@11.14.0_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@types+react@19.0.8_react@19.0.1/node_modules/@emotion/styled/dist/declarations/src/index.d.ts","../../node_modules/.pnpm/@emotion+styled@11.14.0_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@types+react@19.0.8_react@19.0.1/node_modules/@emotion/styled/dist/emotion-styled.cjs.default.d.ts","../../node_modules/.pnpm/@emotion+styled@11.14.0_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@types+react@19.0.8_react@19.0.1/node_modules/@emotion/styled/dist/emotion-styled.cjs.d.mts","../../node_modules/.pnpm/@mui+styled-engine@5.16.14_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@em_f645ce8909ee9471021d466c42c25648/node_modules/@mui/styled-engine/StyledEngineProvider/StyledEngineProvider.d.ts","../../node_modules/.pnpm/@mui+styled-engine@5.16.14_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@em_f645ce8909ee9471021d466c42c25648/node_modules/@mui/styled-engine/StyledEngineProvider/index.d.ts","../../node_modules/.pnpm/@mui+styled-engine@5.16.14_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@em_f645ce8909ee9471021d466c42c25648/node_modules/@mui/styled-engine/GlobalStyles/GlobalStyles.d.ts","../../node_modules/.pnpm/@mui+styled-engine@5.16.14_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@em_f645ce8909ee9471021d466c42c25648/node_modules/@mui/styled-engine/GlobalStyles/index.d.ts","../../node_modules/.pnpm/@mui+styled-engine@5.16.14_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@em_f645ce8909ee9471021d466c42c25648/node_modules/@mui/styled-engine/index.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/createTheme/createBreakpoints.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/createTheme/shape.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/createTheme/createSpacing.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/styleFunctionSx/StandardCssProperties.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/styleFunctionSx/AliasesCSSProperties.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/styleFunctionSx/OverwriteCSSProperties.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/styleFunctionSx/styleFunctionSx.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/styleFunctionSx/extendSxProp.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/style.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/styleFunctionSx/defaultSxConfig.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/styleFunctionSx/index.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/createTheme/applyStyles.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/createTheme/createTheme.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/createTheme/index.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/Box/Box.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/Box/boxClasses.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/Box/index.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/breakpoints.d.ts","../../node_modules/.pnpm/@mui+private-theming@5.17.1_@types+react@19.0.8_react@19.0.1/node_modules/@mui/private-theming/defaultTheme/index.d.ts","../../node_modules/.pnpm/@mui+private-theming@5.17.1_@types+react@19.0.8_react@19.0.1/node_modules/@mui/private-theming/ThemeProvider/ThemeProvider.d.ts","../../node_modules/.pnpm/@mui+private-theming@5.17.1_@types+react@19.0.8_react@19.0.1/node_modules/@mui/private-theming/ThemeProvider/index.d.ts","../../node_modules/.pnpm/@mui+private-theming@5.17.1_@types+react@19.0.8_react@19.0.1/node_modules/@mui/private-theming/useTheme/useTheme.d.ts","../../node_modules/.pnpm/@mui+private-theming@5.17.1_@types+react@19.0.8_react@19.0.1/node_modules/@mui/private-theming/useTheme/index.d.ts","../../node_modules/.pnpm/@mui+private-theming@5.17.1_@types+react@19.0.8_react@19.0.1/node_modules/@mui/private-theming/index.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/GlobalStyles/GlobalStyles.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/GlobalStyles/index.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/spacing.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/createBox.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/createStyled.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/styled.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/useThemeProps/useThemeProps.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/useThemeProps/getThemeProps.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/useThemeProps/index.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/useTheme.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/useThemeWithoutDefault.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/useMediaQuery/useMediaQuery.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/useMediaQuery/index.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/colorManipulator.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/ThemeProvider/ThemeProvider.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/ThemeProvider/index.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/InitColorSchemeScript/InitColorSchemeScript.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/InitColorSchemeScript/index.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/cssVars/useCurrentColorScheme.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/cssVars/createCssVarsProvider.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/cssVars/getInitColorSchemeScript.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/cssVars/prepareCssVars.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/cssVars/createCssVarsTheme.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/cssVars/index.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/cssVars/createGetCssVar.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/cssVars/cssVarsParser.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/responsivePropType.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/Container/containerClasses.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/Container/ContainerProps.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/Container/createContainer.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/Container/Container.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/Container/index.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/Unstable_Grid/GridProps.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/Unstable_Grid/Grid.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/Unstable_Grid/createGrid.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/Unstable_Grid/gridClasses.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/Unstable_Grid/traverseBreakpoints.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/Unstable_Grid/index.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/Stack/StackProps.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/Stack/Stack.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/Stack/createStack.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/Stack/stackClasses.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/Stack/index.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/version/index.d.ts","../../node_modules/.pnpm/@mui+system@5.17.1_@emotion+react@11.14.0_@types+react@19.0.8_react@19.0.1__@emotion+st_4959f01a3841908a854f004886d945d7/node_modules/@mui/system/index.d.ts","./src/components/AvatarByString.tsx","./src/components/Address.tsx","./src/components/Amount.tsx","./src/hooks/use-mobile.ts","./src/components/input.tsx","../../node_modules/.pnpm/@radix-ui+react-separator@1.1.2_@types+react-dom@19.0.3_@types+react@19.0.8__@types+rea_725ae01a9cc7413044d4483b0de957a0/node_modules/@radix-ui/react-separator/dist/index.d.mts","./src/components/separator.tsx","./src/components/sheet.tsx","./src/components/skeleton.tsx","../../node_modules/.pnpm/@radix-ui+react-arrow@1.1.2_@types+react-dom@19.0.3_@types+react@19.0.8__@types+react@1_2b74fab2d0fac9431c5985d5e60861b3/node_modules/@radix-ui/react-arrow/dist/index.d.mts","../../node_modules/.pnpm/@radix-ui+rect@1.1.0/node_modules/@radix-ui/rect/dist/index.d.mts","../../node_modules/.pnpm/@radix-ui+react-popper@1.2.2_@types+react-dom@19.0.3_@types+react@19.0.8__@types+react@_fcaf060fb77db54c2ef484945c424cf2/node_modules/@radix-ui/react-popper/dist/index.d.mts","../../node_modules/.pnpm/@radix-ui+react-tooltip@1.1.8_@types+react-dom@19.0.3_@types+react@19.0.8__@types+react_e731ef89bd202a08a5c68cccb8a5ebfc/node_modules/@radix-ui/react-tooltip/dist/index.d.mts","./src/components/tooltip.tsx","./src/components/sidebar.tsx","./src/components/AppSidebar.tsx","../../node_modules/.pnpm/@radix-ui+react-popover@1.1.6_@types+react-dom@19.0.3_@types+react@19.0.8__@types+react_2ae0a54e3e5b2a2174ac76b757dd9914/node_modules/@radix-ui/react-popover/dist/index.d.mts","./src/components/popover.tsx","./src/components/BaseQuickInfoTooltip.tsx","./src/components/ChangeIndicator.tsx","./src/components/Currency.tsx","./src/components/DialogContentSectionHeader.tsx","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/link.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/link.d.ts","../../node_modules/.pnpm/@types+trusted-types@2.0.7/node_modules/@types/trusted-types/lib/index.d.ts","../../node_modules/.pnpm/@types+trusted-types@2.0.7/node_modules/@types/trusted-types/index.d.ts","../../node_modules/.pnpm/dompurify@3.2.4/node_modules/dompurify/dist/purify.es.d.mts","../../node_modules/.pnpm/isomorphic-dompurify@2.22.0_bufferutil@4.0.9/node_modules/isomorphic-dompurify/index.d.ts","./src/components/EngagementLinks.tsx","./src/components/ErrorRetry.tsx","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/compatibility/index.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/file.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/retry-handler.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/retry-agent.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/util.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/eventsource.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/filereader.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/dom-events.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/sqlite.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@22.12.0/node_modules/@types/node/index.d.ts","../../node_modules/.pnpm/csv-string@4.1.1/node_modules/csv-string/dist/types.d.ts","../../node_modules/.pnpm/csv-string@4.1.1/node_modules/csv-string/dist/Streamer.d.ts","../../node_modules/.pnpm/csv-string@4.1.1/node_modules/csv-string/dist/CSV.d.ts","../../node_modules/.pnpm/csv-string@4.1.1/node_modules/csv-string/dist/index.d.ts","./src/lib/csv.ts","./src/components/ExportButton.tsx","./src/components/NoData.tsx","./src/components/OverrideSidebar.tsx","./src/components/PageContent.tsx","./src/components/PageHeader.tsx","./src/components/Price.tsx","./src/components/QuickInfoPopOverIcon.tsx","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/core/core.config.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/types/utils.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/types/basic.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/core/core.adapters.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/types/geometric.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/types/animation.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/core/core.element.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/elements/element.point.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/helpers/helpers.easing.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/types/color.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/types/layout.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/plugins/plugin.colors.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/elements/element.arc.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/types/index.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/core/core.plugins.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/core/core.defaults.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/core/core.typedRegistry.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/core/core.scale.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/core/core.registry.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/core/core.controller.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/core/core.datasetController.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/controllers/controller.bar.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/controllers/controller.bubble.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/controllers/controller.doughnut.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/controllers/controller.line.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/controllers/controller.polarArea.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/controllers/controller.pie.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/controllers/controller.radar.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/controllers/controller.scatter.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/controllers/index.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/core/core.animation.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/core/core.animations.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/core/core.animator.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/core/core.interaction.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/core/core.layouts.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/core/core.ticks.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/core/index.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/helpers/helpers.segment.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/elements/element.line.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/elements/element.bar.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/elements/index.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/platform/platform.base.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/platform/platform.basic.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/platform/platform.dom.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/platform/index.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/plugins/plugin.decimation.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/plugins/plugin.filler/index.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/plugins/plugin.legend.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/plugins/plugin.subtitle.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/plugins/plugin.title.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/helpers/helpers.core.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/plugins/plugin.tooltip.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/plugins/index.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/scales/scale.category.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/scales/scale.linearbase.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/scales/scale.linear.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/scales/scale.logarithmic.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/scales/scale.radialLinear.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/scales/scale.time.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/scales/scale.timeseries.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/scales/index.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/index.d.ts","../../node_modules/.pnpm/chart.js@4.5.0/node_modules/chart.js/dist/types.d.ts","./src/components/RegisterChartjsPlugins.tsx","./src/components/Summary.tsx","./src/components/TransactionHash.tsx","../../node_modules/.pnpm/@radix-ui+react-avatar@1.1.3_@types+react-dom@19.0.3_@types+react@19.0.8__@types+react@_eb45d5baaa128d48d9159be77fe27440/node_modules/@radix-ui/react-avatar/dist/index.d.mts","./src/components/avatar.tsx","./src/components/UserAvatar.tsx","../../node_modules/.pnpm/@radix-ui+react-roving-focus@1.1.2_@types+react-dom@19.0.3_@types+react@19.0.8__@types+_b0811fbbcee8c7620e83b003e9a6b2eb/node_modules/@radix-ui/react-roving-focus/dist/index.d.mts","../../node_modules/.pnpm/@radix-ui+react-menu@2.1.6_@types+react-dom@19.0.3_@types+react@19.0.8__@types+react@19_46a6d97eee19a15837b47271f7838d13/node_modules/@radix-ui/react-menu/dist/index.d.mts","../../node_modules/.pnpm/@radix-ui+react-dropdown-menu@2.1.6_@types+react-dom@19.0.3_@types+react@19.0.8__@types_a1baf8d23e3ee216232d222029c77b8a/node_modules/@radix-ui/react-dropdown-menu/dist/index.d.mts","./src/components/dropdown-menu.tsx","./src/components/UserMenu.tsx","./src/components/badge.tsx","../../node_modules/.pnpm/@radix-ui+react-checkbox@1.1.4_@types+react-dom@19.0.3_@types+react@19.0.8__@types+reac_6aceccd51cb245219316c82a806df02f/node_modules/@radix-ui/react-checkbox/dist/index.d.mts","./src/components/checkbox.tsx","../../node_modules/.pnpm/cmdk@1.1.1_@types+react-dom@19.0.3_@types+react@19.0.8__@types+react@19.0.8_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/cmdk/dist/index.d.ts","./src/components/command.tsx","../../node_modules/.pnpm/vaul@1.1.2_@types+react-dom@19.0.3_@types+react@19.0.8__@types+react@19.0.8_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/vaul/dist/index.d.mts","./src/components/drawer.tsx","../../node_modules/.pnpm/file-selector@2.1.2/node_modules/file-selector/dist/file.d.ts","../../node_modules/.pnpm/file-selector@2.1.2/node_modules/file-selector/dist/file-selector.d.ts","../../node_modules/.pnpm/file-selector@2.1.2/node_modules/file-selector/dist/index.d.ts","../../node_modules/.pnpm/react-dropzone@14.3.8_react@19.0.1/node_modules/react-dropzone/typings/react-dropzone.d.ts","./src/components/dropzone.tsx","../../node_modules/.pnpm/@radix-ui+react-label@2.1.2_@types+react-dom@19.0.3_@types+react@19.0.8__@types+react@1_5e3cdc8f7a34582b4667651c926a4f13/node_modules/@radix-ui/react-label/dist/index.d.mts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/constants.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/utils/createSubject.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/types/events.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/types/path/common.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/types/path/eager.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/types/path/index.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/types/fieldArray.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/types/resolvers.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/types/form.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/types/utils.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/types/fields.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/types/errors.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/types/validator.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/types/controller.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/types/index.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/controller.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/form.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/logic/appendErrors.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/logic/index.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/useController.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/useFieldArray.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/useForm.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/useFormContext.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/useFormState.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/useWatch.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/utils/get.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/utils/set.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/utils/index.d.ts","../../node_modules/.pnpm/react-hook-form@7.54.2_react@19.0.1/node_modules/react-hook-form/dist/index.d.ts","./src/components/label.tsx","./src/components/form.tsx","./src/components/multi-select.tsx","../../node_modules/.pnpm/@radix-ui+react-context@1.1.2_@types+react@19.0.8_react@19.0.1/node_modules/@radix-ui/react-context/dist/index.d.mts","../../node_modules/.pnpm/@radix-ui+react-primitive@2.1.2_@types+react-dom@19.0.3_@types+react@19.0.8__@types+rea_84ad878854bfdbb70e3e60c902a75a52/node_modules/@radix-ui/react-primitive/dist/index.d.mts","../../node_modules/.pnpm/@radix-ui+react-progress@1.1.6_@types+react-dom@19.0.3_@types+react@19.0.8__@types+reac_78c43a741d4c8c232ac21faa3c933dc2/node_modules/@radix-ui/react-progress/dist/index.d.mts","./src/components/progress.tsx","../../node_modules/.pnpm/@radix-ui+react-radio-group@1.2.3_@types+react-dom@19.0.3_@types+react@19.0.8__@types+r_3105d815f7369a05e74b9638b62e7736/node_modules/@radix-ui/react-radio-group/dist/index.d.mts","./src/components/radio.tsx","../../node_modules/.pnpm/@radix-ui+react-select@2.1.6_@types+react-dom@19.0.3_@types+react@19.0.8__@types+react@_34bdadcd77a9ea0ee068488088ca7e73/node_modules/@radix-ui/react-select/dist/index.d.mts","./src/components/select.tsx","../../node_modules/.pnpm/@radix-ui+react-slider@1.2.3_@types+react-dom@19.0.3_@types+react@19.0.8__@types+react@_38808088e496dc383c4c34cde883ab76/node_modules/@radix-ui/react-slider/dist/index.d.mts","./src/components/slider.tsx","../../node_modules/.pnpm/sonner@2.0.3_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/sonner/dist/index.d.mts","./src/components/sonner.tsx","../../node_modules/.pnpm/@radix-ui+react-primitive@2.1.3_@types+react-dom@19.0.3_@types+react@19.0.8__@types+rea_a1282f23fdfa3852b3e8a9677ca5a67b/node_modules/@radix-ui/react-primitive/dist/index.d.mts","../../node_modules/.pnpm/@radix-ui+react-switch@1.2.5_@types+react-dom@19.0.3_@types+react@19.0.8__@types+react@_aaea18644ddd83e99f6a413506fc9f20/node_modules/@radix-ui/react-switch/dist/index.d.mts","./src/components/switch.tsx","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/utils.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/core/table.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/features/ColumnVisibility.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/features/ColumnOrdering.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/features/ColumnPinning.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/features/RowPinning.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/core/headers.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/features/ColumnFaceting.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/features/GlobalFaceting.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/filterFns.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/features/ColumnFiltering.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/features/GlobalFiltering.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/sortingFns.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/features/RowSorting.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/aggregationFns.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/features/ColumnGrouping.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/features/RowExpanding.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/features/ColumnSizing.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/features/RowPagination.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/features/RowSelection.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/core/row.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/core/cell.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/core/column.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/types.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/columnHelper.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/utils/getCoreRowModel.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/utils/getExpandedRowModel.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/utils/getFacetedMinMaxValues.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/utils/getFacetedRowModel.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/utils/getFacetedUniqueValues.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/utils/getFilteredRowModel.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/utils/getGroupedRowModel.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/utils/getPaginationRowModel.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/utils/getSortedRowModel.d.ts","../../node_modules/.pnpm/@tanstack+table-core@8.21.2/node_modules/@tanstack/table-core/build/lib/index.d.ts","../../node_modules/.pnpm/@tanstack+react-table@8.21.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@tanstack/react-table/build/lib/index.d.ts","./src/components/table.tsx","./src/components/textarea.tsx","./src/context/currency.tsx","./src/components/AppTopBar/CurrencySelector.tsx","./src/components/PocketBrandLogo/index.tsx","./src/components/AppTopBar/index.tsx","../../node_modules/.pnpm/react-chartjs-2@5.3.0_chart.js@4.5.0_react@19.0.1/node_modules/react-chartjs-2/dist/types.d.ts","../../node_modules/.pnpm/react-chartjs-2@5.3.0_chart.js@4.5.0_react@19.0.1/node_modules/react-chartjs-2/dist/chart.d.ts","../../node_modules/.pnpm/react-chartjs-2@5.3.0_chart.js@4.5.0_react@19.0.1/node_modules/react-chartjs-2/dist/typedCharts.d.ts","../../node_modules/.pnpm/react-chartjs-2@5.3.0_chart.js@4.5.0_react@19.0.1/node_modules/react-chartjs-2/dist/utils.d.ts","../../node_modules/.pnpm/react-chartjs-2@5.3.0_chart.js@4.5.0_react@19.0.1/node_modules/react-chartjs-2/dist/index.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/constants.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/types.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/fp/types.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/types.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/add.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addBusinessDays.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addDays.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addHours.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addISOWeekYears.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addMilliseconds.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addMinutes.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addMonths.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addQuarters.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addSeconds.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addWeeks.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addYears.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/areIntervalsOverlapping.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/clamp.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/closestIndexTo.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/closestTo.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/compareAsc.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/compareDesc.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/constructFrom.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/constructNow.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/daysToWeeks.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInBusinessDays.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInCalendarDays.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInCalendarISOWeekYears.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInCalendarISOWeeks.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInCalendarMonths.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInCalendarQuarters.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInCalendarWeeks.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInCalendarYears.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInDays.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInHours.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInISOWeekYears.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInMilliseconds.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInMinutes.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInMonths.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInQuarters.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInSeconds.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInWeeks.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInYears.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachDayOfInterval.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachHourOfInterval.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachMinuteOfInterval.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachMonthOfInterval.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachQuarterOfInterval.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachWeekOfInterval.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachWeekendOfInterval.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachWeekendOfMonth.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachWeekendOfYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachYearOfInterval.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfDay.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfDecade.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfHour.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfISOWeek.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfISOWeekYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfMinute.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfMonth.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfQuarter.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfSecond.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfToday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfTomorrow.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfWeek.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfYesterday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/format/formatters.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/format/longFormatters.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/format.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatDistance.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatDistanceStrict.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatDistanceToNow.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatDistanceToNowStrict.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatDuration.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatISO.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatISO9075.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatISODuration.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatRFC3339.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatRFC7231.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatRelative.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/fromUnixTime.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getDate.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getDay.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getDayOfYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getDaysInMonth.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getDaysInYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getDecade.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/defaultOptions.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getDefaultOptions.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getHours.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getISODay.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getISOWeek.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getISOWeekYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getISOWeeksInYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getMilliseconds.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getMinutes.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getMonth.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getOverlappingDaysInIntervals.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getQuarter.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getSeconds.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getTime.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getUnixTime.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getWeek.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getWeekOfMonth.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getWeekYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getWeeksInMonth.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/hoursToMilliseconds.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/hoursToMinutes.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/hoursToSeconds.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/interval.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/intervalToDuration.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/intlFormat.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/intlFormatDistance.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isAfter.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isBefore.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isDate.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isEqual.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isExists.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isFirstDayOfMonth.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isFriday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isFuture.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isLastDayOfMonth.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isLeapYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isMatch.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isMonday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isPast.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isSameDay.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isSameHour.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isSameISOWeek.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isSameISOWeekYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isSameMinute.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isSameMonth.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isSameQuarter.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isSameSecond.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isSameWeek.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isSameYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isSaturday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isSunday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isThisHour.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isThisISOWeek.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isThisMinute.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isThisMonth.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isThisQuarter.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isThisSecond.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isThisWeek.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isThisYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isThursday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isToday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isTomorrow.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isTuesday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isValid.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isWednesday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isWeekend.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isWithinInterval.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isYesterday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastDayOfDecade.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastDayOfISOWeek.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastDayOfISOWeekYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastDayOfMonth.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastDayOfQuarter.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastDayOfWeek.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastDayOfYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/format/lightFormatters.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lightFormat.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/max.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/milliseconds.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/millisecondsToHours.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/millisecondsToMinutes.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/millisecondsToSeconds.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/min.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/minutesToHours.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/minutesToMilliseconds.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/minutesToSeconds.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/monthsToQuarters.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/monthsToYears.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextDay.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextFriday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextMonday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextSaturday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextSunday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextThursday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextTuesday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextWednesday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/types.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/Setter.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/Parser.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parseISO.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parseJSON.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previousDay.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previousFriday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previousMonday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previousSaturday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previousSunday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previousThursday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previousTuesday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previousWednesday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/quartersToMonths.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/quartersToYears.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/roundToNearestHours.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/roundToNearestMinutes.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/secondsToHours.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/secondsToMilliseconds.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/secondsToMinutes.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/set.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setDate.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setDay.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setDayOfYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setDefaultOptions.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setHours.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setISODay.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setISOWeek.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setISOWeekYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setMilliseconds.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setMinutes.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setMonth.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setQuarter.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setSeconds.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setWeek.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setWeekYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfDay.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfDecade.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfHour.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfISOWeek.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfISOWeekYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfMinute.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfMonth.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfQuarter.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfSecond.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfToday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfTomorrow.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfWeek.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfWeekYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfYear.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfYesterday.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/sub.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subBusinessDays.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subDays.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subHours.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subISOWeekYears.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subMilliseconds.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subMinutes.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subMonths.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subQuarters.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subSeconds.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subWeeks.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subYears.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/toDate.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/transpose.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/weeksToDays.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/yearsToDays.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/yearsToMonths.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/yearsToQuarters.d.ts","../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/index.d.ts","./src/components/BaseLineBarChart/utils.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/common.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/array.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/collection.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/date.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/function.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/lang.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/math.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/number.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/object.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/seq.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/string.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/util.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/index.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/merge.d.ts","./src/components/BaseLineBarChart/BaseLineBarChart.tsx","./src/components/BaseLineBarChart/ChartType.tsx","./src/components/DataTable/FilterDropdown.tsx","./src/components/DataTable/LoadNewButton.tsx","./src/components/DataTable/Pagination.tsx","./src/components/DataTable/RowsPerPage.tsx","./src/components/DataTable/SortDropdown.tsx","./src/components/DataTable/index.tsx","./src/components/FourCards/FourCard.tsx","./src/components/FourCards/utils.ts","./src/components/FourCards/Loader.tsx","./src/components/PieChart/constants.ts","./src/components/PieChart/PieChart.tsx","./src/components/PieChart/index.ts","./src/components/QuickDetails/Header.tsx","./src/components/QuickDetails/types.ts","./src/components/QuickDetails/DetailResolver.tsx","./src/components/QuickDetails/Provider.tsx","./src/components/RewardsByAddresses/constants.ts","./src/components/RewardsByAddresses/GroupAllSwitch.tsx","./src/lib/dates.ts","./src/components/RewardsByAddresses/TimeSelector.tsx","./src/components/RewardsByAddresses/Card.tsx","./src/components/RewardsByAddresses/CardActions.tsx","./src/components/RewardsByAddresses/ItemsSelector.tsx","../graphql/src/rewards.ts","../graphql/src/indexer.ts","../graphql/src/unstake.ts","../graphql/src/index.ts","./src/context/Height/height.tsx","./src/hooks/useFetchOnNewBlock.ts","./src/components/RewardsByAddresses/operations.ts","./src/context/data.tsx","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/isEqual.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/orderBy.d.ts","./src/hooks/useDidMountEffect.ts","./src/lib/batch.ts","./src/components/RewardsByAddresses/RewardsByAddressChart.tsx","./src/components/RewardsByAddresses/Loader.tsx","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/cookies.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/compiled/webpack/webpack.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/config.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/load-custom-routes.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/image-config.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/get-page-files.d.ts","../../node_modules/.pnpm/@types+react@19.0.8/node_modules/@types/react/canary.d.ts","../../node_modules/.pnpm/@types+react@19.0.8/node_modules/@types/react/experimental.d.ts","../../node_modules/.pnpm/@types+react-dom@19.0.3_@types+react@19.0.8/node_modules/@types/react-dom/index.d.ts","../../node_modules/.pnpm/@types+react-dom@19.0.3_@types+react@19.0.8/node_modules/@types/react-dom/canary.d.ts","../../node_modules/.pnpm/@types+react-dom@19.0.3_@types+react@19.0.8/node_modules/@types/react-dom/experimental.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/fallback.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/api-utils/index.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-environment-baseline.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-environment-extensions/error-inspect.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-environment-extensions/random.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-environment-extensions/date.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-environment-extensions/web-crypto.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-environment-extensions/node-crypto.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-environment.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/require-hook.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-polyfill-crypto.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/page-types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/segment-config/app/app-segment-config.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/segment-config/pages/pages-segment-config.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/analysis/get-page-static-info.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/cache-control.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/cache-handlers/types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-kind.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/response-cache/types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/resume-data-cache/cache-store.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/resume-data-cache/resume-data-cache.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/constants.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/app-router-headers.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/render-result.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/body-streams.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/setup-exception-listeners.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/worker.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/rendering-mode.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/router-utils/build-prefetch-segment-data-route.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/experimental/ppr.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/plugins/app-build-manifest-plugin.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/page-extensions-type.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/instrumentation/types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/coalesced-function.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/router-utils/types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/constants.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/trace/types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/trace/trace.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/trace/shared.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/trace/index.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/load-jsconfig.d.ts","../../node_modules/.pnpm/@next+env@15.5.16/node_modules/@next/env/dist/index.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/plugins/telemetry-plugin/use-cache-tracker-utils.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/plugins/telemetry-plugin/telemetry-plugin.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/telemetry/storage.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/build-context.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/bloom-filter.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack-config.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-definitions/route-definition.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/swc/generated-native.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/swc/types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/dev/parse-version-info.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/next-devtools/shared/types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/dev/dev-indicator-server-state.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/parse-stack.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/next-devtools/server/shared.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/next-devtools/shared/stack-frame.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/next-devtools/dev-overlay/utils/get-error-by-type.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/next-devtools/dev-overlay/container/runtime-error/render-error.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/next-devtools/dev-overlay/shared.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/dev/hot-reloader-types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/lru-cache.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/dev-bundler-service.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-matchers/route-matcher.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-matcher-providers/route-matcher-provider.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-matcher-managers/route-matcher-manager.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/base-http/node.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-definitions/locale-route-definition.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-definitions/pages-route-definition.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/mitt.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/with-router.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/router.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/route-loader.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/page-loader.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/router/router.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-definitions/app-page-route-definition.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/loaders/next-app-loader/index.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/app-dir-module.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/deep-readonly.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/request/fallback-params.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/lazy-result.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/implicit-tags.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/router/utils/parse-relative-url.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/response-cache/index.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/app-render.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/amp-context.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/entrypoints.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/app-page/module.compiled.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/error-boundary.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/layout-router.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/render-from-template-context.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/action-async-storage-instance.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/action-async-storage.external.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/client-page.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/client-segment.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/request/search-params.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/hooks-server-context.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/http-access-fallback/error-boundary.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/types/extra-types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/types/resolvers.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/types/icons.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/resolve-metadata.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/metadata.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/framework/boundary-components.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/rsc/preloads.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/dynamic-rendering.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/rsc/postpone.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/rsc/taint.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/segment-cache/segment-value-encoding.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/collect-segment-data.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/next-devtools/userspace/app/segment-explorer-node.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/entry-base.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/templates/app-page.d.ts","../../node_modules/.pnpm/@types+react@19.0.8/node_modules/@types/react/jsx-dev-runtime.d.ts","../../node_modules/.pnpm/@types+react@19.0.8/node_modules/@types/react/compiler-runtime.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/entrypoints.d.ts","../../node_modules/.pnpm/@types+react-dom@19.0.3_@types+react@19.0.8/node_modules/@types/react-dom/client.d.ts","../../node_modules/.pnpm/@types+react-dom@19.0.3_@types+react@19.0.8/node_modules/@types/react-dom/server.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/entrypoints.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/app-page/module.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/after/builtin-request-context.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/adapter.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/use-cache/cache-life.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/flight-data-helpers.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/pages/vendored/contexts/entrypoints.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/pages/module.compiled.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/templates/pages.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/pages/module.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/next-devtools/userspace/pages/pages-dev-overlay-setup.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/render.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-definitions/pages-api-route-definition.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-matches/pages-api-route-match.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/normalizers/normalizer.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/normalizers/locale-route-normalizer.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/normalizers/request/pathname-normalizer.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/normalizers/request/suffix.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/normalizers/request/rsc.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/normalizers/request/prefetch-rsc.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/normalizers/request/next-data.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/static-paths/types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/base-server.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/render-server.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/router-server.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/router-utils/router-server-context.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/route-module.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/load-components.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-definitions/app-route-route-definition.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/async-storage/work-store.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/http.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/app-route/shared-modules.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/redirect-status-code.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/redirect-error.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/templates/app-route.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/app-route/module.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/app-route/module.compiled.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/segment-config/app/app-segments.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/utils.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/turborepo-access-trace/types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/turborepo-access-trace/result.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/turborepo-access-trace/helpers.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/turborepo-access-trace/index.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/export/routes/types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/export/types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/export/worker.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/worker.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/index.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/incremental-cache/index.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/after/after.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/after/after-context.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/work-async-storage-instance.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/work-async-storage.external.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/request/params.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-matches/route-match.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/request-meta.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/i18n-provider.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/next-url.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/request.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/response.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/segment-config/middleware/middleware-config.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/async-callback-set.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","../../node_modules/.pnpm/sharp@0.34.5/node_modules/sharp/lib/index.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/image-optimizer.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/next-server.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/dev/static-paths-worker.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/dev/next-dev-server.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/next.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/types.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/utils.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/cli/next-test.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/config-shared.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/base-http/index.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/cache-signal.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/work-unit-async-storage-instance.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/work-unit-async-storage.external.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/request/cookies.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/request/headers.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/request/draft-mode.d.ts","../../node_modules/.pnpm/next@15.5.16_@babel+core@7.29.0_babel-plugin-macros@3.1.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/headers.d.ts","./src/components/RewardsByAddresses/ServerRewardsByAddresses.tsx","./src/components/RewardsSummary/constants.ts","./src/components/RewardsSummary/Loader.tsx","./src/components/RewardsSummary/operations.ts","./src/components/RewardsSummary/Summary.tsx","./src/components/RewardsSummary/ServerSummary.tsx","../../node_modules/.pnpm/@poktscan+vault-siwp@https+++codeload.github.com+trustsoothe+vault-siwp+tar.gz+ae28086ebbf05441e7bd684431f7c71c193b554c/node_modules/@poktscan/vault-siwp/dist/src/lib/siwp/types.d.ts","../../node_modules/.pnpm/@poktscan+vault-siwp@https+++codeload.github.com+trustsoothe+vault-siwp+tar.gz+ae28086ebbf05441e7bd684431f7c71c193b554c/node_modules/@poktscan/vault-siwp/dist/src/lib/siwp/SiwpMessage.d.ts","../../node_modules/.pnpm/@poktscan+vault-siwp@https+++codeload.github.com+trustsoothe+vault-siwp+tar.gz+ae28086ebbf05441e7bd684431f7c71c193b554c/node_modules/@poktscan/vault-siwp/dist/src/lib/siwp/index.d.ts","../../node_modules/.pnpm/@poktscan+vault-siwp@https+++codeload.github.com+trustsoothe+vault-siwp+tar.gz+ae28086ebbf05441e7bd684431f7c71c193b554c/node_modules/@poktscan/vault-siwp/dist/src/index.d.ts","./src/components/WalletPicker/components/WalletPickerItem.tsx","./src/components/WalletPicker/index.tsx","../../node_modules/.pnpm/@tanstack+query-core@5.76.0/node_modules/@tanstack/query-core/build/modern/removable.d.ts","../../node_modules/.pnpm/@tanstack+query-core@5.76.0/node_modules/@tanstack/query-core/build/modern/subscribable.d.ts","../../node_modules/.pnpm/@tanstack+query-core@5.76.0/node_modules/@tanstack/query-core/build/modern/hydration-BaHDIfRR.d.ts","../../node_modules/.pnpm/@tanstack+query-core@5.76.0/node_modules/@tanstack/query-core/build/modern/queriesObserver.d.ts","../../node_modules/.pnpm/@tanstack+query-core@5.76.0/node_modules/@tanstack/query-core/build/modern/infiniteQueryObserver.d.ts","../../node_modules/.pnpm/@tanstack+query-core@5.76.0/node_modules/@tanstack/query-core/build/modern/notifyManager.d.ts","../../node_modules/.pnpm/@tanstack+query-core@5.76.0/node_modules/@tanstack/query-core/build/modern/focusManager.d.ts","../../node_modules/.pnpm/@tanstack+query-core@5.76.0/node_modules/@tanstack/query-core/build/modern/onlineManager.d.ts","../../node_modules/.pnpm/@tanstack+query-core@5.76.0/node_modules/@tanstack/query-core/build/modern/streamedQuery.d.ts","../../node_modules/.pnpm/@tanstack+query-core@5.76.0/node_modules/@tanstack/query-core/build/modern/index.d.ts","../../node_modules/.pnpm/@tanstack+react-query@5.76.1_react@19.0.1/node_modules/@tanstack/react-query/build/modern/types.d.ts","../../node_modules/.pnpm/@tanstack+react-query@5.76.1_react@19.0.1/node_modules/@tanstack/react-query/build/modern/useQueries.d.ts","../../node_modules/.pnpm/@tanstack+react-query@5.76.1_react@19.0.1/node_modules/@tanstack/react-query/build/modern/queryOptions.d.ts","../../node_modules/.pnpm/@tanstack+react-query@5.76.1_react@19.0.1/node_modules/@tanstack/react-query/build/modern/useQuery.d.ts","../../node_modules/.pnpm/@tanstack+react-query@5.76.1_react@19.0.1/node_modules/@tanstack/react-query/build/modern/useSuspenseQuery.d.ts","../../node_modules/.pnpm/@tanstack+react-query@5.76.1_react@19.0.1/node_modules/@tanstack/react-query/build/modern/useSuspenseInfiniteQuery.d.ts","../../node_modules/.pnpm/@tanstack+react-query@5.76.1_react@19.0.1/node_modules/@tanstack/react-query/build/modern/useSuspenseQueries.d.ts","../../node_modules/.pnpm/@tanstack+react-query@5.76.1_react@19.0.1/node_modules/@tanstack/react-query/build/modern/usePrefetchQuery.d.ts","../../node_modules/.pnpm/@tanstack+react-query@5.76.1_react@19.0.1/node_modules/@tanstack/react-query/build/modern/usePrefetchInfiniteQuery.d.ts","../../node_modules/.pnpm/@tanstack+react-query@5.76.1_react@19.0.1/node_modules/@tanstack/react-query/build/modern/infiniteQueryOptions.d.ts","../../node_modules/.pnpm/@tanstack+react-query@5.76.1_react@19.0.1/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.d.ts","../../node_modules/.pnpm/@tanstack+react-query@5.76.1_react@19.0.1/node_modules/@tanstack/react-query/build/modern/QueryErrorResetBoundary.d.ts","../../node_modules/.pnpm/@tanstack+react-query@5.76.1_react@19.0.1/node_modules/@tanstack/react-query/build/modern/HydrationBoundary.d.ts","../../node_modules/.pnpm/@tanstack+react-query@5.76.1_react@19.0.1/node_modules/@tanstack/react-query/build/modern/useIsFetching.d.ts","../../node_modules/.pnpm/@tanstack+react-query@5.76.1_react@19.0.1/node_modules/@tanstack/react-query/build/modern/useMutationState.d.ts","../../node_modules/.pnpm/@tanstack+react-query@5.76.1_react@19.0.1/node_modules/@tanstack/react-query/build/modern/useMutation.d.ts","../../node_modules/.pnpm/@tanstack+react-query@5.76.1_react@19.0.1/node_modules/@tanstack/react-query/build/modern/useInfiniteQuery.d.ts","../../node_modules/.pnpm/@tanstack+react-query@5.76.1_react@19.0.1/node_modules/@tanstack/react-query/build/modern/IsRestoringProvider.d.ts","../../node_modules/.pnpm/@tanstack+react-query@5.76.1_react@19.0.1/node_modules/@tanstack/react-query/build/modern/index.d.ts","./src/context/QueryClientProvider.tsx","./src/context/Height/InitializeContext.tsx","./src/context/Notifications/index.tsx","./src/context/WalletConnection/PocketMorseWalletConnection.ts","../../node_modules/.pnpm/graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bufferutil@4.0.9_/node_modules/graphql-ws/dist/common-DY-PBNYy.d.ts","../../node_modules/.pnpm/graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bufferutil@4.0.9_/node_modules/graphql-ws/dist/client.d.ts","../../node_modules/.pnpm/graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bufferutil@4.0.9_/node_modules/graphql-ws/dist/server-CvxoLxzz.d.ts","../../node_modules/.pnpm/graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bufferutil@4.0.9_/node_modules/graphql-ws/dist/index.d.ts","../../node_modules/.pnpm/@apollo+client@3.13.8_@types+react@19.0.8_graphql-ws@6.0.6_graphql@16.11.0_ws@8.20.1_bu_f4ae2879b9a3665101281c5b6dddeb33/node_modules/@apollo/client/link/subscriptions/index.d.ts","./src/lib/graphql/client.tsx","../../node_modules/.pnpm/@types+json-bigint@1.0.4/node_modules/@types/json-bigint/index.d.ts"],"fileIdsList":[[425,426,591,634],[62,378,415,423,424,591,634],[62,425,591,634],[265,292,293,299,305,306,334,378,591,634],[292,305,306,335,591,634],[265,266,292,305,378,591,634],[265,304,378,591,634],[277,293,294,295,296,298,300,304,305,306,335,336,378,591,634],[265,286,293,296,304,305,378,591,634],[591,634],[265,591,634],[265,295,296,304,378,591,634],[265,293,296,298,299,304,335,378,389,591,634],[265,296,300,303,305,378,591,634],[389,591,634],[265,293,296,300,301,305,378,591,634],[265,294,295,304,305,335,378,591,634],[265,296,300,302,378,389,591,634],[265,292,299,317,329,330,333,334,335,337,378,386,591,634],[265,334,337,378,386,387,397,591,634],[292,305,327,328,330,331,332,334,337,378,591,634],[265,327,328,330,332,333,337,386,591,634],[265,286,292,328,329,330,331,333,334,337,378,386,387,397,591,634],[272,292,296,317,326,327,328,329,330,333,334,337,378,386,387,388,397,591,634],[265,266,292,327,328,329,330,333,337,378,386,591,634],[265,266,292,305,333,334,337,378,386,591,634],[265,277,317,326,386,591,634],[389,423,591,634],[378,379,591,634],[380,591,634],[277,379,380,381,382,383,384,385,591,634],[265,378,389,591,634],[310,386,591,634],[277,308,309,310,311,312,313,314,315,316,591,634],[307,386,591,634],[310,591,634],[265,378,386,591,634],[386,591,634],[277,591,634],[378,386,591,634,1488],[378,591,634],[277,318,319,320,321,322,323,324,325,591,634],[288,289,290,291,591,634],[266,287,378,591,634],[62,389,591,634],[62,389,418,591,634],[277,390,419,420,591,634],[277,398,399,400,401,402,403,404,405,406,407,408,409,410,411,591,634],[333,387,397,412,413,591,634],[330,378,389,405,406,415,416,591,634],[292,337,378,389,416,591,634],[265,266,389,416,591,634],[330,378,389,406,415,416,591,634],[292,327,389,398,416,591,634],[330,334,406,415,591,634],[292,327,389,415,591,634],[292,389,416,591,634],[292,330,378,389,405,416,591,634],[277,412,413,416,421,422,591,634],[292,337,378,387,393,397,591,634],[292,378,389,393,591,634],[389,393,394,395,591,634],[387,396,397,415,591,634],[393,394,396,397,414,591,634],[378,389,415,423,591,634],[62,389,416,591,634],[62,591,634],[391,392,417,591,634],[62,265,266,292,327,330,378,386,389,415,591,634],[374,591,634],[375,376,591,634],[344,591,634],[265,386,591,634],[343,591,634],[361,591,634],[274,275,276,591,634],[272,273,591,634],[265,280,591,634],[277,278,279,280,281,282,283,284,285,338,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,377,591,634],[340,591,634],[307,339,591,634],[337,591,634],[360,591,634],[120,126,129,591,634],[122,128,591,634],[117,126,129,137,591,634],[129,591,634],[122,124,126,129,591,634],[122,124,125,131,132,133,134,136,591,634],[129,135,591,634],[122,123,126,129,591,634],[124,126,129,591,634],[128,129,591,634],[120,121,125,127,129,141,591,634],[117,118,119,130,140,591,634],[126,129,138,139,591,634],[126,127,591,634],[92,591,634],[92,93,94,95,96,97,98,99,100,101,102,103,104,105,591,634],[91,591,634],[91,99,101,102,591,634],[99,101,591,634],[94,591,634],[99,100,591,634],[78,591,634],[77,78,79,80,81,82,83,84,85,86,90,591,634],[84,591,634],[89,591,634],[87,591,634],[87,88,591,634],[75,591,634],[75,91,107,108,591,634],[75,107,591,634],[76,106,107,108,109,110,111,112,114,115,591,634],[71,106,591,634],[70,71,75,113,591,634],[75,106,591,634],[71,73,74,75,591,634],[459,460,591,634],[461,462,591,634],[461,591,634],[62,465,468,591,634],[62,463,591,634],[459,465,591,634],[463,465,466,467,468,470,471,472,473,474,591,634],[62,469,591,634],[465,591,634],[62,467,591,634],[469,591,634],[475,591,634],[61,459,591,634],[464,591,634],[455,591,634],[465,476,477,478,591,634],[465,476,477,591,634],[479,480,591,634],[479,591,634],[457,591,634],[456,591,634],[458,591,634],[505,591,634],[506,591,634],[505,507,509,591,634],[508,591,634],[62,476,591,634],[484,591,634],[482,591,634],[61,476,481,483,485,591,634],[62,454,497,500,591,634],[501,502,591,634],[454,539,591,634],[62,454,497,500,538,591,634],[62,454,486,500,539,591,634],[538,539,541,591,634],[62,486,500,591,634],[511,591,634],[527,591,634],[454,549,591,634],[62,454,497,500,503,591,634],[62,454,486,487,489,515,549,591,634],[549,550,551,552,591,634],[510,591,634],[525,591,634],[454,543,591,634],[62,454,486,515,543,591,634],[543,544,545,546,547,591,634],[487,591,634],[486,487,497,500,591,634],[454,500,503,591,634],[62,486,497,500,591,634],[486,591,634],[454,591,634],[486,487,488,489,497,498,591,634],[498,499,591,634],[62,528,529,591,634],[532,591,634],[62,528,591,634],[530,531,532,533,591,634],[486,487,488,489,495,497,500,503,504,510,512,513,514,515,516,519,520,521,523,524,526,532,533,534,535,536,537,540,542,548,553,554,591,634],[503,591,634],[486,503,591,634],[490,591,634],[61,591,634],[495,503,591,634],[493,591,634],[490,491,492,493,494,496,591,634],[61,486,490,491,492,591,634],[515,591,634],[522,591,634],[500,591,634],[517,518,591,634],[591,634,1448],[591,634,1446],[591,634,1447],[62,445,591,634],[62,444,445,591,634],[62,444,445,446,447,448,591,634],[62,444,445,591,634,767],[62,444,445,446,447,448,567,591,634,766],[62,444,445,446,447,448,567,591,634],[62,444,445,565,566,591,634],[62,591,634,816,817],[62,444,445,591,634,766],[62,63,591,634],[62,591,634,816,828],[62,444,445,446,448,567,591,634],[591,634,1453],[591,634,1452,1453],[591,634,1452,1453,1454,1455,1456,1457,1458,1459,1460],[591,634,1452,1453,1454],[62,591,634,1461],[62,63,591,634,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479],[591,634,1461,1462],[591,634,1461],[591,634,1461,1462,1471],[591,634,1461,1462,1464],[62,591,634,865],[591,634,846],[591,634,831,854],[591,634,854],[591,634,854,865],[591,634,840,854,865],[591,634,845,854,865],[591,634,835,854],[591,634,843,854,865],[591,634,841],[591,634,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864],[591,634,844],[591,634,831,832,833,834,835,836,837,838,839,841,842,844,846,847,848,849,850,851,852,853],[591,634,1137,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149],[591,634,1137,1138,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149],[591,634,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149],[591,634,1137,1138,1139,1141,1142,1143,1144,1145,1146,1147,1148,1149],[591,634,1137,1138,1139,1140,1142,1143,1144,1145,1146,1147,1148,1149],[591,634,1137,1138,1139,1140,1141,1143,1144,1145,1146,1147,1148,1149],[591,634,1137,1138,1139,1140,1141,1142,1144,1145,1146,1147,1148,1149],[591,634,1137,1138,1139,1140,1141,1142,1143,1145,1146,1147,1148,1149],[591,634,1137,1138,1139,1140,1141,1142,1143,1144,1146,1147,1148,1149],[591,634,1137,1138,1139,1140,1141,1142,1143,1144,1145,1147,1148,1149],[591,634,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1148,1149],[591,634,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1149],[591,634,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148],[591,634,1149],[591,631,634],[591,633,634],[634],[591,634,639,669],[591,634,635,640,646,647,654,666,677],[591,634,635,636,646,654],[586,587,588,591,634],[591,634,637,678],[591,634,638,639,647,655],[591,634,639,666,674],[591,634,640,642,646,654],[591,633,634,641],[591,634,642,643],[591,634,646],[591,634,644,646],[591,633,634,646],[591,634,646,647,648,666,677],[591,634,646,647,648,661,666,669],[591,629,634,682],[591,629,634,642,646,649,654,666,677],[591,634,646,647,649,650,654,666,674,677],[591,634,649,651,666,674,677],[589,590,591,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683],[591,634,646,652],[591,634,653,677],[591,634,642,646,654,666],[591,634,655],[591,634,656],[591,633,634,657],[591,631,632,633,634,635,636,637,638,639,640,641,642,643,644,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683],[591,634,659],[591,634,660],[591,634,646,661,662],[591,634,661,663,678,680],[591,634,646,666,667,668,669],[591,634,666,668],[591,634,666,667],[591,634,669],[591,634,670],[591,631,634,666],[591,634,646,672,673],[591,634,672,673],[591,634,639,654,666,674],[591,634,675],[591,634,654,676],[591,634,649,660,677],[591,634,639,678],[591,634,666,679],[591,634,653,680],[591,634,681],[591,634,639,646,648,657,666,677,680,682],[591,634,666,683],[62,591,634,1200,1202],[62,591,634,1198,1199,1200,1201,1424],[62,591,634,1340],[62,591,634,1199,1202,1424],[62,591,634,1198,1202,1424],[60,61,591,634],[580,591,634],[371,372,373,591,634],[371,591,634],[591,634,717],[591,634,716,717],[591,634,720],[591,634,718,719,720,721,722,723,724,725],[591,634,699,710],[591,634,716,727],[591,634,697,710,711,712,715],[591,634,714,716],[591,634,699,701,702],[591,634,703,710,716],[591,634,716],[591,634,710,716],[591,634,703,713,714,717],[591,634,699,703,710,759],[591,634,712],[591,634,700,703,711,712,714,715,716,717,727,728,729,730,731,732],[591,634,703,710],[591,634,699,703],[591,634,699,703,704,734],[591,634,704,709,735,736],[591,634,704,735],[591,634,726,733,737,741,749,757],[591,634,738,739,740],[591,634,697,716],[591,634,738],[591,634,716,738],[591,634,708,742,743,744,745,746,748],[591,634,759],[591,634,699,703,710],[591,634,699,703,759],[591,634,699,703,710,716,728,730,738,747],[591,634,750,752,753,754,755,756],[591,634,714],[591,634,751],[591,634,751,759],[591,634,700,714],[591,634,755],[591,634,710,758],[591,634,698,699,700,701,702,703,704,705,706,707,708,709],[591,634,701],[437,438,591,634],[437,591,634],[62,449,591,634],[70,591,634],[70,71,72,591,634],[70,71,72,73,74,591,634],[591,634,685,686],[591,634,666,684,685],[591,634,687],[591,634,881],[591,634,879,881],[591,634,879],[591,634,881,945,946],[591,634,881,948],[591,634,881,949],[591,634,966],[591,634,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134],[591,634,881,1042],[591,634,881,946,1066],[591,634,879,1063,1064],[591,634,881,1063],[591,634,1065],[591,634,878,879,880],[581,591,634],[591,634,778],[591,634,778,779],[173,388,591,634],[265,591,634,1485],[265,591,634,1485,1486,1487],[166,167,173,174,591,634],[175,240,241,591,634],[166,173,175,591,634],[167,175,591,634],[166,168,169,170,173,175,178,179,591,634],[169,180,194,195,591,634],[166,173,178,179,180,591,634],[166,168,173,175,177,178,179,591,634],[166,167,178,179,180,591,634],[165,181,186,193,196,197,239,242,264,591,634],[166,591,634],[167,171,172,591,634],[167,171,172,173,174,176,187,188,189,190,191,192,591,634],[167,172,173,591,634],[167,591,634],[166,167,172,173,175,188,591,634],[173,591,634],[167,173,174,591,634],[171,173,591,634],[180,194,591,634],[166,168,169,170,173,178,591,634],[166,173,176,179,591,634],[169,177,178,179,182,183,184,185,591,634],[179,591,634],[166,168,173,175,177,179,591,634],[175,178,591,634],[166,173,177,178,179,191,591,634],[175,591,634],[166,173,179,591,634],[167,173,178,189,591,634],[178,243,591,634],[175,179,591,634],[173,178,591,634],[178,591,634],[166,176,591,634],[166,173,591,634],[173,178,179,591,634],[198,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,591,634],[178,179,591,634],[168,173,591,634],[166,168,173,179,591,634],[166,168,173,591,634],[166,173,175,177,178,179,191,198,591,634],[199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,591,634],[191,199,591,634],[199,201,591,634],[166,173,175,178,198,199,591,634],[582,591,634],[429,430,431,432,591,634],[591,634,1194,1214,1215,1216,1218,1428],[591,634,1194,1204,1247,1249,1251,1252,1255,1428],[591,634,1194,1204,1220,1226,1227,1231,1232,1233,1398,1428],[591,634,1428],[591,634,1215,1305,1379,1388,1405],[591,634,1194],[591,634,1203,1405],[591,634,1258],[591,634,1204,1257,1428],[591,634,649,1294,1305,1335],[591,634,649,1314,1388,1404,1434],[591,634,649,1354],[591,634,1392],[591,634,1391,1392,1393],[591,634,1391],[591,634,649,1194,1197,1203,1211,1212,1215,1219,1220,1226,1234,1235,1236,1347,1370,1389,1424,1428],[591,634,1192,1194,1217,1243,1247,1248,1253,1254,1428],[591,634,1192,1217],[591,634,1192,1236,1243,1292,1428],[591,634,1192],[591,634,1192,1194,1217,1218],[591,634,1192,1250],[591,634,1212,1390,1397],[63,591,634,660,1405],[63,591,634,1405],[62,591,634,1306],[591,634,1384],[591,634,1227,1348,1349,1350],[591,634,1348,1351,1352],[591,634,1348,1352],[62,591,634,677],[62,591,634,1217,1282],[62,591,634,1217],[591,634,1280,1284],[62,591,634,1281,1426],[591,634,649],[591,634,649,1220,1225,1348,1358,1371,1379,1394,1395,1428,1429],[591,634,1211,1396],[591,634,1424],[591,634,1193],[62,591,634,1294,1301,1313,1323,1325,1404],[591,634,660,1294,1301,1322,1323,1324,1404],[591,634,1316,1317,1318,1319,1320,1321],[591,634,1318],[591,634,1322],[63,591,634,1264,1265,1267],[62,591,634,1259,1260,1261,1266],[591,634,1264,1266],[591,634,1262],[591,634,1263],[591,634,1371,1401],[591,634,649,1426,1429],[591,634,1310],[591,633,634,1309],[591,634,1228,1237,1295,1296,1298,1299,1300,1343,1348,1404,1407,1429,1434],[591,634,1237,1332,1348,1352],[591,634,1404,1434],[62,591,634,1307,1308,1310,1311,1312,1313,1314,1315,1326,1327,1328,1330,1331,1333,1334,1404,1405,1434],[591,634,1329],[591,634,649,660,1204,1225,1237,1238,1276,1295,1343,1346,1347,1352,1371,1379,1400,1424,1428,1429],[591,634,1404],[591,633,634,1215,1295,1297,1347,1400,1402,1403,1429],[591,634,1434],[591,633,634,1191,1225,1296,1298,1300,1329,1404,1405,1430,1431,1432,1433,1435],[591,634,649,1191,1204,1410,1429,1435],[591,634,1215,1347,1348,1371,1400,1404,1429],[591,634,649,1204,1428],[591,634,649,666,1204,1407,1429],[591,634,649,660,677,1203,1204,1217,1220,1228,1237,1238,1240,1274,1276,1295,1300,1344,1348,1358,1359,1361,1363,1366,1367,1368,1369,1370,1379,1399,1400,1405,1407,1408,1428,1429],[591,634,649,666],[591,634,1192,1194,1195,1196,1217,1220,1232,1234,1243,1399,1407,1424,1426,1427],[591,634,649,666,677,1192,1255,1256,1258,1259,1260,1261,1267],[591,634,660,677,1203,1247,1256,1271,1274,1275,1300,1348,1359,1370,1371,1379,1400,1405,1407,1413,1414,1420,1421],[591,634,1211,1212,1234,1347,1370,1400,1428],[591,634,649,677,1195,1220,1300,1407,1418,1428],[591,634,1293],[591,634,649,1269,1270,1376],[591,634,1407,1428],[591,634,1296,1297],[591,634,1295,1300,1399,1426],[591,634,649,660,1241,1247,1271,1274,1275,1371,1407,1420,1423],[591,634,649,1211,1212,1247,1372],[591,634,1194,1240,1374,1399,1428],[591,634,649,677,1428],[591,634,649,1217,1239,1240,1241,1252,1268,1373,1375,1399,1428],[591,634,1197,1237,1295,1378,1424,1426],[591,634,649,660,677,1211,1212,1219,1220,1228,1238,1275,1276,1300,1344,1348,1359,1361,1371,1379,1399,1400,1405,1406,1407,1413,1414,1415,1417,1419,1426],[591,634,649,666,1212,1376,1407,1420,1422],[591,634,1206,1207,1208,1209,1210],[591,634,1362,1408],[591,634,1364],[591,634,1362],[591,634,1364,1365],[591,634,649,1220,1225,1226,1227,1429],[591,634,649,660,1193,1195,1204,1228,1237,1276,1295,1356,1357,1379,1407,1424,1426],[591,634,649,660,677,1227,1229,1300,1357,1406,1429],[591,634,1435],[591,634,1430],[591,634,1431],[591,634,1222,1223],[591,634,649,1220,1222,1228],[591,634,1221,1223],[591,634,1224],[591,634,1222,1256],[591,634,1222,1277],[591,634,1222],[591,634,1273,1406,1408],[591,634,1272],[591,634,1256,1405,1406],[591,634,1360,1406],[591,634,1256,1405],[591,634,1343],[591,634,1220,1228,1232,1291,1294,1295,1296,1300,1301,1304,1336,1339,1342,1348,1378,1399,1407,1429],[591,634,1285,1288,1289,1290,1302,1303,1352],[62,63,591,634,1200,1202,1337,1338],[62,63,591,634,1200,1202,1337,1338,1341],[591,634,1387],[591,634,1215,1295,1310,1314,1348,1378,1380,1381,1382,1383,1385,1386,1389,1399,1404,1410,1428,1434],[591,634,1352],[591,634,1356],[591,634,649,1228,1278,1353,1355,1358,1378,1407,1424,1426],[591,634,1285,1286,1287,1288,1289,1290,1302,1303,1352,1425],[591,634,649,660,677,1197,1222,1238,1256,1276,1295,1300,1376,1377,1379,1399,1400,1424,1428,1429],[591,634,1345,1400,1410,1413],[591,634,649,1408,1428],[591,634,1191,1434],[591,634,1190],[591,634,1344,1410],[591,634,1191,1409,1428],[591,634,649,1229,1345,1410,1411,1412,1428,1429],[62,591,634,1348,1349,1351],[591,634,1242],[62,591,634,1405],[62,591,634,1197,1276,1295,1424,1426],[62,591,634,1195],[62,591,634,1284],[62,591,634,660,677,1193,1254,1279,1281,1283,1426],[591,634,1217,1405,1429],[591,634,1405,1416],[591,634,1348],[62,591,634,647,649,660,1193,1243,1249,1284,1424,1425],[591,634,639],[591,634,1244,1245,1246],[591,634,1244],[62,591,634,649,651,660,684,1193,1198,1199,1200,1202,1203,1204,1238,1322,1423,1426,1428],[591,634,1436,1437,1438],[578,591,634],[591,634,873],[591,634,873,874,875,876],[62,591,634,759],[62,591,634,759,873],[62,591,634,780],[62,591,634,798],[591,634,798,799,800,802,803,804,805,806,807,808,811],[591,634,798],[591,634,801],[62,591,634,796,798],[591,634,793,794,796],[591,634,789,792,794,796],[591,634,793,796],[62,591,634,784,785,786,789,790,791,793,794,795,796],[591,634,786,789,790,791,792,793,794,795,796,797],[591,634,793],[591,634,787,793,794],[591,634,787,788],[591,634,792,794,795],[591,634,792],[591,634,784,789,794,795],[591,634,809,810],[591,634,666,684],[591,601,605,634,677],[591,601,634,666,677],[591,596,634],[591,598,601,634,674,677],[591,634,654,674],[591,634,684],[591,596,634,684],[591,598,601,634,654,677],[591,593,594,597,600,634,646,666,677],[591,601,608,634],[591,593,599,634],[591,601,622,623,634],[591,597,601,634,669,677,684],[591,622,634,684],[591,595,596,634,684],[591,601,634],[591,595,596,597,598,599,600,601,602,603,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,623,624,625,626,627,628,634],[591,601,616,634],[591,601,608,609,634],[591,599,601,609,610,634],[591,600,634],[591,593,596,601,634],[591,601,605,609,610,634],[591,605,634],[591,599,601,604,634,677],[591,593,598,601,608,634],[591,634,666],[591,596,601,622,634,682,684],[270,591,634],[265,266,267,591,634],[266,267,591,634],[266,591,634],[268,269,591,634],[267,271,591,634,1176,1177,1178],[141,142,591,634],[141,142,151,591,634],[141,591,634],[141,146,147,591,634],[141,142,146,147,148,591,634],[141,142,143,144,591,634],[153,591,634],[153,154,155,591,634],[62,63,271,428,433,591,634],[63,162,591,634],[63,435,443,451,591,634],[63,435,591,634],[62,63,162,440,442,443,556,591,634],[63,442,591,634],[62,63,570,591,634],[62,63,443,591,634,869],[62,63,435,591,634,871],[62,63,555,591,634],[63,163,442,591,634,759,877,1136,1150],[62,63,159,591,634,823],[63,591,634,759,1135],[62,63,443,573,591,634],[63,435,442,591,634],[63,439,442,591,634],[62,63,435,591,634,769,866],[63,591,634],[62,63,435,450,591,634,769],[62,63,435,591,634,769],[62,63,440,443,564,591,634,689,690,866,867,1153,1155,1156,1157],[62,63,579,583,591,634],[63,443,450,591,634],[63,443,450,591,634,689],[62,63,440,591,634],[62,63,564,591,634,1159,1160],[62,63,450,591,634],[62,63,591,634,759,877,1162],[63,591,634,1162,1163],[62,63,163,435,579,591,634],[63,163,442,575,591,634],[62,63,435,440,443,591,634,777,1165,1166],[62,63,591,634,777],[62,63,591,634,1166,1167],[62,63,435,443,574,591,634],[62,63,591,634,759],[62,63,591,634,1169,1170,1172],[62,63,591,634,1152,1169],[62,63,591,634,813,830],[62,63,440,442,443,450,560,591,634,1136],[62,63,440,450,564,591,634,1151,1173,1188],[62,63,424,440,442,585,591,634,691,1136,1151,1152,1170,1172,1175,1176,1180,1181,1182,1183,1184,1185,1186,1187,1189],[63,428,434,591,634,1152,1169,1170,1171,1172,1173,1174,1176,1182,1183,1187,1188,1439],[62,63,159,591,634,823,1171],[63,591,634,1171,1179,1181],[62,63,591,634,1161,1441],[63,428,434,591,634,1176,1187,1443,1444],[62,63,424,442,585,591,634,691,1159,1160,1176,1180,1181,1187,1441,1442,1443],[63,591,634,1160],[63,591,634,1136,1179,1181],[62,63,591,634,696],[62,63,162,442,443,591,634],[63,435,442,591,634,764],[62,63,442,556,591,634,769],[63,160,435,591,634],[62,63,160,435,442,443,450,451,556,577,591,634,773,1449,1450],[62,63,442,591,634,763],[62,63,439,442,591,634],[62,63,436,439,442,591,634],[62,63,442,450,591,634,772],[62,63,442,450,451,591,634,774],[62,63,442,449,450,591,634],[62,63,442,591,634,776],[62,63,435,442,450,591,634,768],[62,63,442,443,591,634,781],[62,63,436,442,591,634,783,812,813],[62,63,442,591,634],[62,63,439,442,591,634,783],[62,63,442,450,560,573,591,634,771],[62,63,442,572,591,634],[62,63,442,591,634,818],[62,63,442,450,591,634,820],[62,63,442,450,591,634,822],[62,63,442,561,591,634],[62,63,436,439,442,443,450,559,560,562,563,564,569,591,634],[63,591,634,824],[63,163,591,634,826],[62,63,442,591,634,829],[62,63,442,591,634,866],[62,63,442,568,591,634],[62,63,434,591,634,1180],[62,63,424,591,634,1179],[62,63,162,435,440,443,591,634],[62,63,591,634,1480],[63,67,68,116,142,145,149,150,152,156,160,591,634],[63,160,591,634],[63,67,68,160,591,634],[63,67,160,591,634],[62,63,66,68,69,157,158,159,591,634],[62,63,266,424,591,634,1180],[63,591,634,688],[63,591,634,1136],[62,63,378,424,427,591,634,1488,1489],[63,424,427,591,634],[63,66,591,634],[63,440,441,591,634],[160,591,634],[62,63,163,591,634]],"fileInfos":[{"version":"e41c290ef7dd7dab3493e6cbe5909e0148edf4a8dad0271be08edec368a0f7b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"4fd3f3422b2d2a3dfd5cdd0f387b3a8ec45f006c6ea896a4cb41264c2100bb2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"69e65d976bf166ce4a9e6f6c18f94d2424bf116e90837ace179610dbccad9b42","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"62bb211266ee48b2d0edf0d8d1b191f0c24fc379a82bd4c1692a082c540bc6b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f1e2a172204962276504466a6393426d2ca9c54894b1ad0a6c9dad867a65f876","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"36a2e4c9a67439aca5f91bb304611d5ae6e20d420503e96c230cf8fcdc948d94","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"51409be337d5cdf32915ace99a4c49bf62dbc124a49135120dfdff73236b0bad","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},"5b677df3b216d4b1cbe508bcd6d84d642ea8a6a1db94e61f59029a03953dcecd","5ee995c6205e3308986844acc99c413b78e545a4bd4bd829ecc44aaa68c4ac43","5ce719588d133217770480181167d925bb03ffc0e856fce536087280678dd435","428e2cfb41a2dc89a70414c2f069a49c3152b211169c55c2758ec9b46ab17341","f3aad9f5307dd080897b0a5cfe996c0b3cd564555ad76a71b8b05d1c61150101","22527c6fb3cb589429f150b66d8b5d7b89102b3dcd4f73dffab894efd6ad4b36",{"version":"9efc525cef2b9f35187095ce035d23ef8ab0090b672cd4a71cbffcef6884e80f","impliedFormat":1},{"version":"8dba17cdfdec5ae0a5db9b9038721f4655b6ddf2fdc589e5a90a16555a54d772","impliedFormat":1},{"version":"c599f3670220bf7913f9f140ca85e66b50e0124050b3e4c629957ef0d9f59d23","impliedFormat":1},{"version":"0e4b7f73c3d89bb89e9732346b1d9c42bd9439fc1756ccbf6263e66dd492c066","impliedFormat":1},{"version":"ca91758a5f0e49810ebf641cfa9cadae8b42ee326d9b0e663c2eea9ca51749d7","impliedFormat":1},{"version":"1527eb02a15b0988c239df0a8d21e3960375fc431740add3402551b8913ff3c2","impliedFormat":1},{"version":"d99a8619851f168989eb222276717a22608fc98734da3fc2de57b74f695136d6","impliedFormat":1},{"version":"2321e25e34075320eeedbc5cd56051c9ce0341cb6a51e4faafb8f827d8045ceb","impliedFormat":1},{"version":"1cc2355816ba43eb2d6eb2670ac83d29a3ef02a01c09a4e2d5c0cc21e35249f7","impliedFormat":1},{"version":"ce47207ec1bd458b7966f0bbb5d9d15be0b00116fec4efda52ec8fcae8321586","impliedFormat":1},{"version":"a1f914818a2cc3bf3a693b99902d9cb0c1a6613df3cdd2bd8134cc63e695565c","impliedFormat":1},{"version":"3bd1d708281a33e7736f9c75c74221c077827d21c941f72ed3a8533b55fa5c7c","impliedFormat":1},{"version":"838c4154f06e964281fbfa88cf8cf8d76f194cbdd4d3f13e0a9e9a52e5faac6b","impliedFormat":1},{"version":"e32f79a7f77271780ecfcff5205300791429c2526b0b72307bb300ded25420c4","impliedFormat":1},{"version":"6ea46b5278f87aaf63479e72bb2d44474e458b4e603fa7ef46b3730c8a320073","impliedFormat":1},{"version":"22176ca5c9549edad90a532d5623a9b6ec552505178a7aeec3591f0b8f485d87","impliedFormat":1},{"version":"ba01df9e06cc51729deef602895fe3ceafd9ce2f17f2119db81eb67ff6ef7998","impliedFormat":1},{"version":"1dbb63933fe1404f9947c55f7f53308eb6fafd3b8646c4afc5f8a0376b1886ac","impliedFormat":1},{"version":"2dee5f01ddfa5375af2104e3d58e98afb881b63294187bab0a3df873a7bb2ad1","impliedFormat":1},{"version":"3dbe631d8fddc408346806ef5cf4195ba34a8ba1eb3cfde3aeffb813a38bffd2","impliedFormat":1},{"version":"8a0a3cdb27704e89ff1dbf93e43bb40bb2a96199a4483edc22fcf640a590a99d","impliedFormat":1},{"version":"3d444fa6e8057de7ea8ff4a9b737adc9538b2fcf7767969bdedc58bfc892582c","impliedFormat":1},{"version":"1b07773ee3ca8a62873be6a6b8b3aa29455c7b53db2cd4399ec4c6e362cef92b","impliedFormat":1},{"version":"bb82c2f6ce46746ddff974720459546747854d8e83a5ab2bf1ea5e11dbc535fe","impliedFormat":1},{"version":"3ef6c822342f271295a588afa47c00dc9c221a07e535342cfeaff6ff76fd384f","impliedFormat":1},{"version":"66f6d5d5d383ef51a7205d10543944c0be74b98190c16ec077ad40640f369147","impliedFormat":1},{"version":"684b95e60a1346cb54c7a45cb424091d97c9d573cecdaf2b5954a4d63d4bb5a9","impliedFormat":1},{"version":"4d708c75dad09198ae2b98abe2bfb355d7eb517c29e3f1ddd101fe2ca4884159","impliedFormat":1},{"version":"1906f0be92468440d7ab4b26dcced83ce978a939c64806cc75e4f484e9b649c0","impliedFormat":1},{"version":"070cec1d2c7f9ed3c8f02e2d471ed036f66d58e4fbea47b2bce35dddd9e921ef","impliedFormat":1},{"version":"3d135e55be21b9f506a4d7f441abf7fc159a54ad2b64556b0ba0f819695c3c47","impliedFormat":1},{"version":"85245e7f103feba8b3b9d2203ea9dd687545172564bdb275c5a70c0dea0abbfb","impliedFormat":1},{"version":"d72588d7853732dcbf1c5186389458d6a123dbe8f19cede386f424ba32afef8f","impliedFormat":1},{"version":"3babffecf1c0fb251b65b6167fa5909c87bd3e4c1a976d26a156a0cddb84f852","impliedFormat":1},{"version":"406a17e0a2cc399c644b5bc1fb807c9dc71f3247dac25a232864b13370d6f5e9","impliedFormat":1},{"version":"21f75cbb084ee0b35a8792e94e83d937532154a99c343a5bd3d86c26b5d7e0bb","impliedFormat":1},{"version":"d60853beea7347ada1f4774f9b727be6600a2dbbc510cbebfbd2276b8b47224a","impliedFormat":1},{"version":"ad6c897c80570cd3544c378de9aec077651da02edb320966a1e92a24b34526f5","impliedFormat":1},{"version":"d72588d7853732dcbf1c5186389458d6a123dbe8f19cede386f424ba32afef8f","impliedFormat":1},{"version":"de0541b716cd138c87a796f259883a1c9794fc68ec3f5f7778ff9e0613859c05","impliedFormat":1},{"version":"47595460b73d788d6294b215d376fded84583696dcadd522d26fcffb5147b0bd","impliedFormat":1},{"version":"1906f0be92468440d7ab4b26dcced83ce978a939c64806cc75e4f484e9b649c0","impliedFormat":1},{"version":"d137f974150c32ccdad190f331cdd0b8acf68a18d8f473b86e90b092eac8ec06","impliedFormat":1},{"version":"1558c642e03689d42843e7b047b9c20e77ee09ab388ff854484db5dcfbed11da","impliedFormat":1},{"version":"2d3dc11421426b03636da8afc8ef715caa0a8e9b7b4623b314f4a1936c44f14f","impliedFormat":1},{"version":"7b9806ac7cd54f9ee5170b1da84dfedc752541a073ecca325fb99123d0182576","impliedFormat":1},{"version":"bc75f464330a330e214bd37afa050cff44f4a74565c9d2bf7c5afbb73ecc6ddc","impliedFormat":1},{"version":"048b77edb9e3666715c1090b8ff6dec77f3e7926c902f465d4e4ca06545eec04","impliedFormat":99},{"version":"213018b77ede3d85fb08e7c3f16eb74fdd63fe0f8c426cf9bd073f56ae4f74a5","impliedFormat":99},{"version":"fa81227fb960a450922663ca27355bcafcefcb674988cf8a3eaf217791854fcc","impliedFormat":99},{"version":"42324ae49b347a0c3786cbbc137112fdaffa46e2c62fb5f4ea316e23a8041da8","impliedFormat":99},{"version":"b54a261562f958270814adacc6f0dd96d20267dd16b9b6fd5cfff159c77c63b3","impliedFormat":99},{"version":"f7c1b2c8138d0bfcfa8dd75a4ec6468e8eb07ed226a05de057dcf4a9b6988c24","impliedFormat":99},{"version":"9e4a31ab17c275f49625e9cc5d5c1130c67ba86af532294c357534594631f40e","impliedFormat":99},{"version":"64eeef76c7037e61d4bb05f70076978105105f7e13b3191b8d1e17a3ac238069","impliedFormat":99},{"version":"5593440344062522e165ac4e22fb2c5b5b5e37c36f1c4eec28c4a45ab9cd69b4","impliedFormat":99},{"version":"d190b7c4774689e7e9243259729be7c25ad458860789941041aaf3d732b0e4fc","impliedFormat":99},{"version":"2d9a497ae13c00c02748bdf455efea16f9ee8a2779c7a0dccc29030b24db21d9","impliedFormat":99},{"version":"3684db5968946b0b84c55d8cd3fa2dfc776bf989e37a4ffb42db1428f951b153","impliedFormat":99},{"version":"e952316a52a63a0d31a8251a90b61b73653c150bb4a74729cc1d1853fcc51290","impliedFormat":99},{"version":"e2edffb28e4b058115ff37c9eae06b5e9e346a04c4a69e134a6aa889d0461741","impliedFormat":99},{"version":"9e7a73194e54c8997d305f1fd55084b6c00345432549d5e4911a8d209dacaab6","impliedFormat":99},{"version":"69089509fa5501f4b4563d5089fdeab2c13c942cbee5df7977d690dd280e54cb","impliedFormat":99},{"version":"6d537343a60b60a5074a059971cd019139ce16bc07c8dace952c2d1e6b061bc4","impliedFormat":99},{"version":"6e5f487a0ea2e10829d45b7a3888ade2e901ec4423a48c0ff5aee355bc70d5aa","impliedFormat":99},{"version":"213376670843aa2398aaaf57967b47ac967d9869e161df41a0dd6e4e21489119","impliedFormat":99},{"version":"932c9ddc182802d234e82b09c832d40e9df50dd15e3d0d578155c1b376ecda9a","impliedFormat":99},{"version":"83b3f4318d585a7353766468259f26b3dbe00c1e2584f269c03088749416c889","impliedFormat":99},{"version":"8d9e472be581576e30f30783d8c30b46e45acfdf0cbcd6dc7f37bb34672412cd","impliedFormat":99},{"version":"3fd3eaed39db12e95a43cdae262d304ea9e50aeb1423453350fd5511a33cc7d3","impliedFormat":99},{"version":"cbf797eac91e76a70272787efc3eb972278d3a91580d03c6bd22dea1245a55a0","impliedFormat":99},{"version":"a7114eb40f84278eacbd3b67a10f28bde8f139e4b5c9e7be634f32d6be79a0f7","impliedFormat":99},"0affd00249031015b678fc75dd3c98688cf7472849ebe7f57e6dea5cc9b37350","5b2666c28fb2c3cbefb16b024e97f1d539768bc2de6519af90524e3ee05bf797","27d8be656b508305f2c388a371bc96d99f431670516388d17b7e143b9b6a9eb8","d8f0be36d8b015736da5dbf0b827a6a57728b8eb0c6cb40755ba2f7c00bdca90","dff6a9d788062a8d8e82eb4f2aba911789babce9539d9016d583bf98b0a81142","d5fc8b760c97107ae4945f010a56b5b42af7bfe504309291b1350e50b403cba8","cb494be174030fe03f5df0badc28814956a6b78cd0d5ef70af98baee71acba36","1f834998b1bdfa96b6f7b36b04a3712e1b90d0d56c53db7fa143e5b8f1c21657","021e42091bd2bc8be4074ca011042bad4c5076d160480715ee17ce3b282226e3","a0c9065019d0d3fbfec2f81c89317e0c0151f77b797bbacef22a0c2d90fa2037","3a09ebb6f092166e5953ceb0ad9c860bfdf0d60a46f4f8cc66a185185016e444","7363f4bc3d43b7ae0ef34055ccd0e3032158490711271d54d105cf41bc9cf969","e54e09b6add277612059d63c5dd0e8e735fad8fe78856d4f8e5fbf6d378352a3","386e138ed0d8ba298efdc634cf2432aaf4c4ca324f1a0d2a95eaa334734d455e","74a0e09127fb5eab6ba6e7851e18ad637b0f265b580076548f651b93c94a8ad9",{"version":"9ae4936c5cd72c9944dde9d4424d81285e966162b76ad5ef607c640d7411ada4","signature":"ad74f9932e8a70075f3b037d23ded4784fe558011157cd6dde8d63c3a229fc0a"},"2f35a8e25f6743d5e7140784e8c76d44b1847b66abf71a53a0761fb7da9e02e8","35038015b8ae5175fa280919f2dc5977d3c54d8dd6dc17741734d1069c331e38","9c17def860edf76d43b0ab5ac3d9493e73c73d4de340dc28fe92fc39f350607b",{"version":"1fb05119b117978c9ed928380399e5f20a24f8eda1a8fe3578b0251366143906","affectsGlobalScope":true},"2aaca840f043ae74e2e1f95a3e0858180da52a1e1878d79c1c32ed7d19ceb2e2",{"version":"6c05d0fcee91437571513c404e62396ee798ff37a2d8bef2104accdc79deb9c0","impliedFormat":99},"13441362680a71a54bff06c2704c39c0459dd03a26000c3bdb5ef2042ab03fe1",{"version":"78647004e18e4c16b8a2e8345fca9267573d1c5a29e11ddfee71858fd077ef6e","impliedFormat":1},{"version":"0804044cd0488cb7212ddbc1d0f8e1a5bd32970335dbfc613052304a1b0318f9","impliedFormat":1},{"version":"b725acb041d2a18fde8f46c48a1408418489c4aa222f559b1ef47bf267cb4be0","impliedFormat":1},{"version":"85084ae98c1d319e38ef99b1216d3372a9afd7a368022c01c3351b339d52cb58","impliedFormat":1},{"version":"898ec2410fae172e0a9416448b0838bed286322a5c0c8959e8e39400cd4c5697","impliedFormat":1},{"version":"692345a43bac37c507fa7065c554258435ab821bbe4fb44b513a70063e932b45","impliedFormat":1},{"version":"cddd50d7bd9d7fddda91a576db9f61655d1a55e2d870f154485812f6e39d4c15","impliedFormat":1},{"version":"0539583b089247b73a21eb4a5f7e43208a129df6300d6b829dc1039b79b6c8c4","impliedFormat":1},{"version":"3f0be705feb148ae75766143c5c849ec4cc77d79386dcfa08f18d4c9063601cc","impliedFormat":1},{"version":"522edc786ed48304671b935cf7d3ed63acc6636ab9888c6e130b97a6aea92b46","impliedFormat":1},{"version":"a9607a8f1ce7582dbeebc0816897925bf9b307cc05235e582b272a48364f8aa0","impliedFormat":1},{"version":"de21641eb8edcbc08dd0db4ee70eea907cd07fe72267340b5571c92647f10a77","impliedFormat":1},{"version":"48af3609dc95fa62c22c8ec047530daf1776504524d284d2c3f9c163725bdbd4","impliedFormat":1},{"version":"6758f7b72fa4d38f4f4b865516d3d031795c947a45cc24f2cfba43c91446d678","impliedFormat":1},{"version":"1fefab6dc739d33b7cb3fd08cd9d35dd279fcd7746965e200500b1a44d32db9e","impliedFormat":1},{"version":"cb719e699d1643112cc137652ed66341602a7d3cc5ec7062f10987ffe81744f6","impliedFormat":1},{"version":"bdf7abbd7df4f29b3e0728684c790e80590b69d92ed8d3bf8e66d4bd713941fe","impliedFormat":1},{"version":"8decb32fc5d44b403b46c3bb4741188df4fbc3c66d6c65669000c5c9cd506523","impliedFormat":1},{"version":"4beaf337ee755b8c6115ff8a17e22ceab986b588722a52c776b8834af64e0f38","impliedFormat":1},{"version":"c26dd198f2793bbdcc55103823a2767d6223a7fdb92486c18b86deaf63208354","impliedFormat":1},{"version":"93551b302a808f226f0846ad8012354f2d53d6dedc33b540d6ca69836781a574","impliedFormat":1},{"version":"040cb635dff5fc934413fa211d3a982122bf0e46acae9f7a369c61811f277047","impliedFormat":1},{"version":"778b684ebc6b006fcffeab77d25b34bf6e400100e0ec0c76056e165c6399ab05","impliedFormat":1},{"version":"463851fa993af55fb0296e0d6afa27407ef91bf6917098dd665aba1200d250c7","impliedFormat":1},{"version":"f0d8459d18cebd8a9699de96bfe1d4fe8bcf772abfa95bbfd74a2ce92d8bc55b","impliedFormat":1},{"version":"be8f369f8d7e887eab87a3e4e41f1afcf61bf06056801383152aa83bda1f6a72","impliedFormat":1},{"version":"352bfb5f3a9d8a9c2464ad2dc0b2dc56a8212650a541fb550739c286dd341de1","impliedFormat":1},{"version":"a5aae636d9afdacb22d98e4242487436d8296e5a345348325ccc68481fe1b690","impliedFormat":1},{"version":"d007c769e33e72e51286b816d82cd7c3a280cba714e7f958691155068bd7150a","impliedFormat":1},{"version":"764150c107451d2fd5b6de305cff0a9dcecf799e08e6f14b5a6748724db46d8a","impliedFormat":1},{"version":"b04cf223c338c09285010f5308b980ee6d8bfa203824ed2537516f15e92e8c43","impliedFormat":1},{"version":"4b387f208d1e468193a45a51005b1ed5b666010fc22a15dc1baf4234078b636e","impliedFormat":1},{"version":"70441eda704feffd132be0c1541f2c7f6bbaafce25cb9b54b181e26af3068e79","impliedFormat":1},{"version":"d1addb12403afea87a1603121396261a45190886c486c88e1a5d456be17c2049","impliedFormat":1},{"version":"1e50bda67542964dbb2cfb21809f9976be97b2f79a4b6f8124463d42c95a704c","impliedFormat":1},{"version":"ea4b5d319625203a5a96897b057fddf6017d0f9a902c16060466fe69cc007243","impliedFormat":1},{"version":"a186fde3b1dde9642dda936e23a21cb73428340eb817e62f4442bb0fca6fa351","impliedFormat":1},{"version":"985ac70f005fb77a2bc0ed4f2c80d55919ded6a9b03d00d94aab75205b0778ec","impliedFormat":1},{"version":"ab01d8fcb89fae8eda22075153053fefac69f7d9571a389632099e7a53f1922d","impliedFormat":1},{"version":"bac0ec1f4c61abc7c54ccebb0f739acb0cdbc22b1b19c91854dc142019492961","impliedFormat":1},{"version":"566b0806f9016fa067b7fecf3951fcc295c30127e5141223393bde16ad04aa4a","impliedFormat":1},{"version":"8e801abfeda45b1b93e599750a0a8d25074d30d4cc01e3563e56c0ff70edeb68","impliedFormat":1},{"version":"902997f91b09620835afd88e292eb217fbd55d01706b82b9a014ff408f357559","impliedFormat":1},{"version":"a3727a926e697919fb59407938bd8573964b3bf543413b685996a47df5645863","impliedFormat":1},{"version":"83f36c0792d352f641a213ee547d21ea02084a148355aa26b6ef82c4f61c1280","impliedFormat":1},{"version":"dce7d69c17a438554c11bbf930dec2bee5b62184c0494d74da336daee088ab69","impliedFormat":1},{"version":"1e8f2cda9735002728017933c54ccea7ebee94b9c68a59a4aac1c9a58aa7da7d","impliedFormat":1},{"version":"e327a2b222cf9e5c93d7c1ed6468ece2e7b9d738e5da04897f1a99f49d42cca1","impliedFormat":1},{"version":"65165246b59654ec4e1501dd87927a0ef95d57359709e00e95d1154ad8443bc7","impliedFormat":1},{"version":"f1bacba19e2fa2eb26c499e36b5ab93d6764f2dba44be3816f12d2bc9ac9a35b","impliedFormat":1},{"version":"bce38da5fd851520d0cb4d1e6c3c04968cec2faa674ed321c118e97e59872edc","impliedFormat":1},{"version":"3398f46037f21fb6c33560ceca257259bd6d2ea03737179b61ea9e17cbe07455","impliedFormat":1},{"version":"6e14fc6c27cb2cb203fe1727bb3a923588f0be8c2604673ad9f879182548daca","impliedFormat":1},{"version":"12b9bcf8395d33837f301a8e6d545a24dfff80db9e32f8e8e6cf4b11671bb442","impliedFormat":1},{"version":"04295cc38689e32a4ea194c954ea6604e6afb6f1c102104f74737cb8cf744422","impliedFormat":1},{"version":"7418f434c136734b23f634e711cf44613ca4c74e63a5ae7429acaee46c7024c8","impliedFormat":1},{"version":"27d40290b7caba1c04468f2b53cf7112f247f8acdd7c20589cd7decf9f762ad0","impliedFormat":1},{"version":"2608b8b83639baf3f07316df29202eead703102f1a7e32f74a1b18cf1eee54b5","impliedFormat":1},{"version":"c93657567a39bd589effe89e863aaadbc339675fca6805ae4d97eafbcce0a05d","impliedFormat":1},{"version":"909d5db5b3b19f03dfb4a8f1d00cf41d2f679857c28775faf1f10794cbbe9db9","impliedFormat":1},{"version":"e4504bffce13574bab83ab900b843590d85a0fd38faab7eff83d84ec55de4aff","impliedFormat":1},{"version":"8ab707f3c833fc1e8a51106b8746c8bc0ce125083ea6200ad881625ae35ce11e","impliedFormat":1},{"version":"730ddc2386276ac66312edbcc60853fedbb1608a99cb0b1ff82ebf26911dba1f","impliedFormat":1},{"version":"c1b3fa201aa037110c43c05ea97800eb66fea3f2ecc5f07c6fd47f2b6b5b21d2","impliedFormat":1},{"version":"636b44188dc6eb326fd566085e6c1c6035b71f839d62c343c299a35888c6f0a9","impliedFormat":1},{"version":"3b2105bf9823b53c269cabb38011c5a71360c8daabc618fec03102c9514d230c","impliedFormat":1},{"version":"f96e63eb56e736304c3aef6c745b9fe93db235ddd1fec10b45319c479de1a432","impliedFormat":1},{"version":"acb4f3cee79f38ceba975e7ee3114eb5cd96ccc02742b0a4c7478b4619f87cd6","impliedFormat":1},{"version":"cfc85d17c1493b6217bad9052a8edc332d1fde81a919228edab33c14aa762939","impliedFormat":1},{"version":"eebda441c4486c26de7a8a7343ebbc361d2b0109abff34c2471e45e34a93020a","impliedFormat":1},{"version":"727b4b8eb62dd98fa4e3a0937172c1a0041eb715b9071c3de96dad597deddcab","impliedFormat":1},{"version":"708e2a347a1b9868ccdb48f3e43647c6eccec47b8591b220afcafc9e7eeb3784","impliedFormat":1},{"version":"6bb598e2d45a170f302f113a5b68e518c8d7661ae3b59baf076be9120afa4813","impliedFormat":1},{"version":"c28e058db8fed2c81d324546f53d2a7aaefff380cbe70f924276dbad89acd7d1","impliedFormat":1},{"version":"89d029475445d677c18cf9a8c75751325616d353925681385da49aeef9260ab7","impliedFormat":1},{"version":"826a98cb79deab45ccc4e5a8b90fa64510b2169781a7cbb83c4a0a8867f4cc58","impliedFormat":1},{"version":"618189f94a473b7fdc5cb5ba8b94d146a0d58834cd77cd24d56995f41643ccd5","impliedFormat":1},{"version":"1645dc6f3dd9a3af97eb5a6a4c794f5b1404cab015832eba67e3882a8198ec27","impliedFormat":1},{"version":"b5267af8d0a1e00092cceed845f69f5c44264cb770befc57d48dcf6a098cb731","impliedFormat":1},{"version":"91b0965538a5eaafa8c09cf9f62b46d6125aa1b3c0e0629dce871f5f41413f90","impliedFormat":1},{"version":"2978e33a00b4b5fb98337c5e473ab7337030b2f69d1480eccef0290814af0d51","impliedFormat":1},{"version":"ba71e9777cb5460e3278f0934fd6354041cb25853feca542312807ce1f18e611","impliedFormat":1},{"version":"608dbaf8c8bb64f4024013e73d7107c16dba4664999a8c6e58f3e71545e48f66","impliedFormat":1},{"version":"61937cefd7f4d6fa76013d33d5a3c5f9b0fc382e90da34790764a0d17d6277fb","impliedFormat":1},{"version":"af7db74826f455bfef6a55a188eb6659fd85fdc16f720a89a515c48724ee4c42","impliedFormat":1},{"version":"d6ce98a960f1b99a72de771fb0ba773cb202c656b8483f22d47d01d68f59ea86","impliedFormat":1},{"version":"2a47dc4a362214f31689870f809c7d62024afb4297a37b22cb86f679c4d04088","impliedFormat":1},{"version":"42d907ac511459d7c4828ee4f3f81cc331a08dc98d7b3cb98e3ff5797c095d2e","impliedFormat":1},{"version":"63d010bff70619e0cdf7900e954a7e188d3175461182f887b869c312a77ecfbd","impliedFormat":1},{"version":"1452816d619e636de512ca98546aafb9a48382d570af1473f0432a9178c4b1ff","impliedFormat":1},{"version":"9e3e3932fe16b9288ec8c948048aef4edf1295b09a5412630d63f4a42265370e","impliedFormat":1},{"version":"8bdba132259883bac06056f7bacd29a4dcf07e3f14ce89edb022fe9b78dcf9b3","impliedFormat":1},{"version":"5a5406107d9949d83e1225273bcee1f559bb5588942907d923165d83251a0e37","impliedFormat":1},{"version":"ca0ca4ca5ad4772161ee2a99741d616fea780d777549ba9f05f4a24493ab44e1","impliedFormat":1},{"version":"e7ee7be996db0d7cce41a85e4cae3a5fc86cf26501ad94e0a20f8b6c1c55b2d4","impliedFormat":1},{"version":"72263ae386d6a49392a03bde2f88660625da1eca5df8d95120d8ccf507483d20","impliedFormat":1},{"version":"b498375d015f01585269588b6221008aae6f0c0dc53ead8796ace64bdfcf62ea","impliedFormat":1},{"version":"c37aa3657fa4d1e7d22565ae609b1370c6b92bafb8c92b914403d45f0e610ddc","impliedFormat":1},{"version":"34534c0ead52cc753bdfdd486430ef67f615ace54a4c0e5a3652b4116af84d6d","impliedFormat":1},{"version":"a1079b54643537f75fa4f4bb963d787a302bddbe3a6001c4b0a524b746e6a9de","impliedFormat":1},{"version":"cea05cc31d2ad2d61a95650a3cff8cf502b779c014585aa6e2f300e0c8b76101","impliedFormat":1},{"version":"83b5f5f5bdbf7f37b8ffc003abf6afee35a318871c990ad4d69d822f38d77840","impliedFormat":1},"1b9c81d458a77cca244c6d1e1ee658695ed74619a48a0933651d25db335312ca","c7b1c4db0e20af09e58572f1b899be6d380080361b3de4368f9f381b4936038c","36b90219d7cf6c3a6f8c8fbbed514adcd7d8b4ef38f4de748460f372ea7a8dd6","1e0b9c32a4262c7ede46814abbfebdaf2bd3ac47059f37abfd4bb7022d8b12aa","f51e06e507e637bed0b9b28a94933454b0409d70fc144d79d6a28ac757f46faa",{"version":"200a7b7eb3163da4327412c650e43fbe66c73604a23a694f95ede53c250bfc3b","impliedFormat":99},{"version":"b843e64cc56422a003f151f950c0b11dfc93e48d836c23d1de3ff9760ba66128","impliedFormat":99},{"version":"1e7781c5426903d3ee3081a279bf7b9c0cb5970df0c03aa02b510703ebf14fb1","affectsGlobalScope":true,"impliedFormat":99},{"version":"0d728b43672268b6358c183f58babb14b4d9133368d3a3d970a638e745a07946","impliedFormat":99},{"version":"68b24afcc8f547f6f4e01a6438f693acf091679d1290f16ac3ff4281604d09c3","affectsGlobalScope":true,"impliedFormat":99},{"version":"be65d9c4b878135fd01ec9d627649b8f0ea042405d4238555bb1ed32ba4bc0d4","impliedFormat":99},{"version":"42c931da087fee2e4da9ee682c2b39dbb63ccc94d2f200c303e70d524a80631c","impliedFormat":99},{"version":"6366130e8579ed3a871038161c56305fb50dc86515dfe7df2086dff1064e7335","impliedFormat":99},{"version":"31c87da3eabb1a06993eeed78aecf465f2253ac1ffa379a1dc08a86adb2ca21d","impliedFormat":99},{"version":"178f27d07eb47715315586e6b93499134f9645a781dcee121809772319da2310","impliedFormat":99},{"version":"075f39e49fec4edbf341af1236a12efdf4ceef20a1d463d3aafe1e528260ad01","impliedFormat":99},{"version":"0e637de8a04bb36479e999759625ac74ba8ec316f38699c1a2bbc2287cba3a02","impliedFormat":99},{"version":"53c8fd3918adc931f81fe6e4947f6a140d3658fc747e42c64c6cb2cc209c3bcc","impliedFormat":99},{"version":"8c328b52f3f1a382fa838326757402ba3f89dc956a154a8d39b383ff9d561778","impliedFormat":99},{"version":"656e8a14a0af2822043ecc64532a6d82715811a9c13aececf0538d9851a257a2","impliedFormat":99},{"version":"679e1372cd48ecfcf9b66e3fc1934f3924d52944f81f4209a915082a243a4708","impliedFormat":99},{"version":"e437c7ea3b45e3bf827da33851600e47a45e4a96bf0a2b89d96861fccb30ff0d","impliedFormat":99},{"version":"42bcddab5e58fcf79f9888b025ed9892517098de1978c61975c8188d856abf35","impliedFormat":99},{"version":"2e38486ad6c59dba446a4316bb4fad4fbb76897912fa5a635b083fb7e98b40fd","impliedFormat":99},{"version":"22822fc6a0b0da0cfaa63687d7f8e7a450fb60bcc0b16a31a7ced6bfdadf3398","impliedFormat":99},{"version":"7a04ea931b84ab343fe2b98ea6de636e3f1f229591e14312a75094f135de8b4c","impliedFormat":99},{"version":"2caadc09b0a2529dc02a33679465d052f069f8f852cf64e5e284dbf42ad713ec","impliedFormat":99},{"version":"b6f357cb6e31ed152370ecda2fcdd5a8d6f7220a49a7c138345e47ff37be120b","impliedFormat":99},{"version":"114e3c99f9dc8434ce9a75b63b7a0da5ab0a0293fc6c75dc91a38d0c2c4831fb","impliedFormat":99},{"version":"2d504f8e4d31b03bc70915d6c19d1eb1467748d525bf88fa809e988ec1ba6a0f","impliedFormat":99},{"version":"b3dec0879e876086c6bd5d93b671bf3a034da7712ea60b6e815f1de987df060a","impliedFormat":99},{"version":"4c2dc62cf8ddea2c86bdb2cdcc152482639b455a9d073b8a637ca0871691e808","impliedFormat":99},{"version":"170b97ee9ca13eadc645d2264b1041b6a927cd12069cb7b7722dc9b3af1ccd53","impliedFormat":99},{"version":"51ef0aa2142e2a4abb3e342f4ef068e91eb494757fe01bd603b4935d99a87470","impliedFormat":99},{"version":"c677bd7039edf9c7f90a61a59a8e85ce450eee24ec511278893c551e3e32ba42","impliedFormat":99},{"version":"a023eb8a768d010cc6ca7bbd3d721f2131652ceaa58151021570f0c7275cbfa6","impliedFormat":99},{"version":"c366787623b1e8eb54146d71961daa3be167107cd1a34939db06b414d2c65793","impliedFormat":99},{"version":"e81622c94502d2b4f7787d7e2695c6e5376126f54f6b15a933aa118da1c639a5","impliedFormat":99},{"version":"e6571e6f7ded9c84a7d9749eabfc596dc2fac3e687878a02d470f5d636b70823","impliedFormat":99},{"version":"61055b2f77770fb363b06b9ce4df421b7f46a5437d0f92d65996870120567106","impliedFormat":99},{"version":"9b51dd74a388c13e157c457cc39d59dc2aae2134f6a21cc6b695219932cb8817","impliedFormat":99},{"version":"38e1f988ca8a3fd0ee2fad611f7f982e9530ae6973151bcacde7c6e7fb04bea5","impliedFormat":99},{"version":"383f07a2a1fb51cb6fc8265a63eaade643135379374afa7166e3b84b063cd2fb","impliedFormat":99},{"version":"5754840b8991b703e3b0ae0fefc4a1be80d9ff61afdbf101dacfa6566255e0df","impliedFormat":99},{"version":"bf0594b413405ede52217e9a3996cae8771920659d46c2a4a411e98a6405851f","impliedFormat":99},{"version":"29ab9f8d2f84b5f84584ca6ec50535d5ebc34245d45cef32931ee8b4cced4ea3","impliedFormat":99},{"version":"4d08fd919ce1e289936b0a43da96573090e4db4bd0de2e2a7282ddb8a130c6f8","impliedFormat":99},{"version":"d4b61bbee55cc1f91616b64937233522f29b6034304440a97344766e58d81224","impliedFormat":99},{"version":"484c61ffe28d13086dcbadc5371355a457e75a375a1f21649d87209c7da3f5ad","impliedFormat":99},{"version":"d6a5c17ef46bb6832efa4c7ed3fabf666bed91f7b1f913ef9f9437de72f9f45f","impliedFormat":99},{"version":"df51929c4b53d6f8740927d77f7bf415d026812a80ff4b03cfa24e9962aab30e","impliedFormat":99},{"version":"08a1d8e1474dd44bf89e4fd47ca3fd1c0f6e95d9e74413d95e360ac331915601","impliedFormat":99},{"version":"71257f1fd9c2606a8db9e614394e154d1b7175b1aab178ff7850cce0f383b0b7","impliedFormat":99},{"version":"dbf6e52d440f8495adf5f9d46f603ecf7e007b7032542e93a578748948d339cd","impliedFormat":99},{"version":"f5146fc906ed4a1ff094cf779c438cdb62699836ed52d35d68cdf8ffa33d4f17","impliedFormat":99},{"version":"c488375c6eddabce83a48132ae081c13ce049163694aee72205716070cdaf2d4","impliedFormat":99},{"version":"99471216f9a6bbdbd922ce5c3abab16a01f525c04b8565802ba7e2f741ed66ba","impliedFormat":99},{"version":"699f82d62f80defba3f24f8035fdd7848ce59819b7e92be1c21203784f989880","impliedFormat":99},{"version":"d6b416da43b620809c3802863ff9fc327fd93a27596b8297e3c11b5babee7c2d","impliedFormat":99},{"version":"54f654d70f99e22ab62bc368214dbffab229aaa05c0854844e092fc0249b941e","impliedFormat":99},{"version":"7e4cf3f9fd109be605223bfa5d2d495b3c284a1815d587b8bcbed66263f680cd","impliedFormat":99},{"version":"79d3f73e515450fb3e71721e13859666a2fd1dee8d2a4dbd51668eeceb0b5e1e","impliedFormat":99},{"version":"60427cfa4f690de417382f75e3726d6afa5c539bff1a20f02f02d71a039c4583","impliedFormat":99},{"version":"5a8601874a115e7a5b49c0e069d8ce0666b08544369009c7bb65c8333dedec11","impliedFormat":99},{"version":"2467096c0c7f275aea8d40421323140ad4b92d9dc4d9fe3213159eb873599942","impliedFormat":99},{"version":"c919611ffec640e7dce4666c23bd0fe4f05b61ae5eb9914f2617495045d53f7d","impliedFormat":99},{"version":"35aebc68c891175d10cd58e6ba74664735c8fb01c4c85d34eb552c38c61e0e7c","impliedFormat":99},{"version":"caf6739324e9de30ff3ffafdd30f626502d244d6f098a00b9bf4e8cff87e2639","impliedFormat":99},{"version":"24ebb5942d1ead3800588c34de5042e09aae1953ea49a30679c6156744d3f525","impliedFormat":99},{"version":"1cc001b662ff2ac4881f501a88c5dbb6c02a7f87d6cbee79934fff95c1bbea30","impliedFormat":99},{"version":"5921aafe6c827e0d995db919acb4edd0ee4d25baf2c84072b302858be3a5acd1","impliedFormat":99},{"version":"5b857d41d08971f63d54a050c5ba29504887f72e21e548e12e36428726941b11","impliedFormat":99},{"version":"db06f4cdf70e3689f0cd5a96a6836f34024ad61e8dd01473560ebbcae09c532b","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ff05fb50d37beb9bc6a5f93a3f09db2f959b0327f4f3b4221b2180e5b661322","impliedFormat":99},{"version":"3a4e80746c4007af4abc9b1263c4088b859cf4c1f7e2f03a074750bd03679e17","impliedFormat":99},{"version":"a01c7a292e08df7d14ed6520aa3ff7d1c1adce042651d4b2deaa791b15b9c9f5","impliedFormat":99},{"version":"8772ee20ba975dd2411063d0d0c762588de75d65be11bfc96d17ff8375e7153a","impliedFormat":99},{"version":"bd08ee515c95bb5e3387f1c6e06b9b90a7023841c5c50cf8a3be0ccb98b423b6","impliedFormat":99},{"version":"7e45d0be6c684f8bd44a7c9e9b85866eadeefa8eafb4391a9a301275c35b4fcd","impliedFormat":99},{"version":"90b6d1d43663c526517bd46562eff3e46f485167ca2497a94efe52797440c4ba","impliedFormat":99},{"version":"fa67c77380575031c13b4428fb04e817fe50540329c981c1a2b147ecb9327ef0","impliedFormat":99},{"version":"a60cb94351eec664cd5fd6c680ed608258d5ebc0e0a4b469c66ed5a3cef5efd8","impliedFormat":99},{"version":"9f9159a0e2266b44e522ca1c861e65644a330549201b75ddb4ab79dd85f10c8a","impliedFormat":99},{"version":"8d00ce6d5f41f222246ca4413da284f9b64c452ede594aaf0a368c804e8c58c1","impliedFormat":99},{"version":"da9a27a114bc110dfc2aa82ae2c2bca6c263e54e2fb715c88e871cd03b86165c","impliedFormat":99},{"version":"ca0ce992dce169c531edf2330e535d8068b8045c58481fc183284ef7ee2aaefb","impliedFormat":99},{"version":"79ad4eca59cf44701cd2b138b633efa003573521634b60eabf89f9228cd55809","impliedFormat":99},{"version":"638678c386beeb3793cc51759d9accb2a502c71eb08f453d6536636ef4593186","impliedFormat":99},{"version":"cc64f85b35f8d01b0355456652a3494c7533269fa47a68272d28fc042e30dfba","impliedFormat":99},{"version":"9b051f36a67f0e5813b355868f3d869c146b8045b3e143e821eb4d58a39f64be","impliedFormat":99},{"version":"435124778d845003fbc7f7d0a756cf5b8929365b22dfa9c6afb7b23178c6dc6c","impliedFormat":99},{"version":"948f93cf2016b2d75c53605a44397983dfb7ba736d5a75e9866413d6af4f5e59","impliedFormat":99},{"version":"e20a07f3bc177e8757f07bebd3bbe674f1832da963480c644f7aa40722645231","impliedFormat":99},{"version":"584bb7dd00ffcc99918e3aca639ea6eed99256bef0b9c70f36de255212e086b0","impliedFormat":99},{"version":"16885f190bbbe17b479f32e2c03296d5ab462409fb22de6ea356a23a748c0de0","impliedFormat":99},{"version":"d35be9e4af129629c0ba2fc57fe80e94b8e464de3d3b0e8ed621873b9c28c2c4","impliedFormat":99},{"version":"667d1590f5ed02745949cf1b4532bbf80597c7cd15ef8be42b06f035487cee66","impliedFormat":99},{"version":"6336e7ae85e7bd0116777d6de86f34c881b89d81083547a8e7a3e9c9ce686b89","impliedFormat":99},{"version":"33fd57356804dd8d377aa08d6552b66068530b8875fbc8df6ea469953365ab5a","impliedFormat":99},{"version":"b4d4a27d2d42e2088ded7a7062d6fb2c89c588dae93fc81cbca5109b9f08324d","impliedFormat":99},{"version":"6160ae0bbe477143d1305f9dc83625cd982fb58cf7dfe4adaf8b9d1481a82435","impliedFormat":99},{"version":"c05c729637447066ec3130eee63df8cd36d3d3fe7aa78a9515110707ecfefa1f","impliedFormat":99},{"version":"75853f0c1842cd7baf7c052a4746e534aa6cd251353d12b498309a72b437b9ea","impliedFormat":99},{"version":"1aa9ff5a2277dabbb6067e32c3e096049163c9de59e4c9068a5ef201bf45addd","impliedFormat":99},{"version":"6882eb3444234bb5fd0f88771b3dac44f96549a16c88fd834c29486e86baf86f","impliedFormat":99},{"version":"7b18a8a68a7d84946f836e672e1bbb37e349be74124912dd2886da4fb5dad505","impliedFormat":99},{"version":"c57dcbf8db47e0f0fd15686fc4b52442a8af3d13139a6e5dbd776761ebe0647c","impliedFormat":99},{"version":"42791bbdba1514368154fc3836f8104c757c7b3a8c397f240581f10c139e8c2a","impliedFormat":99},{"version":"75883e245469a3f34d38461da691df45b75b87a43a99ef441ecf1cb2f66baa3c","impliedFormat":99},{"version":"be37dfd9758f5e73ed8d4c547adddf4059186fe65fce5aba9c00922bd4e8a27e","affectsGlobalScope":true,"impliedFormat":99},{"version":"2229ac54fce24aa66dd8473e29f31f95574c9ed9fa71c0950d5e9ebc19fbd34e","impliedFormat":99},{"version":"dc90542980fe164f1eec8307550fc7e980a0698c01c4f97f53cf86a0c7758013","impliedFormat":99},{"version":"dc303a12933206954f8053a0ab0a9e60b5dc6e564ca113bac2f1308a76958d13","impliedFormat":99},{"version":"64c7a2052eb5f8aacad9782fe254e7c225d3cdebcdbd3f2f339b2574b80f61d7","impliedFormat":99},{"version":"29d46805aba9bd70c3b64aea22a15589fcaa12b2bed2ac9310a7f02b02363bac","impliedFormat":99},{"version":"0358f51804975d70e83daa425709e472bfadb8ff6627402723881d3299599732","impliedFormat":99},{"version":"38106630e61f7dff328af03a2f1ac3b46cf57d611e8ea7ec9ec26dccb582bbf7","impliedFormat":99},{"version":"bf9085ad9469ad87d48e6b294c26e8ebc358a653e25b7c6976065df658ab3a47","impliedFormat":99},{"version":"cad94e8c96269a3f9c80f09a284e6839c5d01eddd85c90f9efa8e9556f1834e1","impliedFormat":99},{"version":"f930521893f41284b83399ba694982db43e010d548a9e04729003c554037be44","impliedFormat":99},{"version":"2cd5f920e7a3281c0f281a873753434eab1e5bc33198bbd937ed5ab534ceb7d6","impliedFormat":99},{"version":"07ca7906cd7ebb46a93f2216b2bf1ac94d43a35be2935804b5e346536c4f4cbe","impliedFormat":1},{"version":"ab80e0a65e900b3ca72f3aabfd0c7441ed09dac5c29511ae2ceaa608cb6eec2e","impliedFormat":99},{"version":"c1b4728633b6c75b207045e9c4ac7712fc2369d39b28e67fc675670e1c05317e","impliedFormat":99},{"version":"fcbcbe404dcc98cde7601e1c159bc8c536c3bd3d43aee947b03c7287520ffc52","impliedFormat":99},{"version":"1eef448f6cb5945a9de6348cfe13740b38d38b685aea3b81351d0ad244851f71","impliedFormat":99},{"version":"f325d3185db421e05e2d8387a436add933efe1748033f270b9743ae5dae80e01","impliedFormat":99},{"version":"b5eff363aac6bbb1464a8bed2e2fa89295f32d5dbe189bbad8fd260d67bc72cc","impliedFormat":99},{"version":"c337835f9a8e821a248f6f073c675b6ecd49e4b6b6ed2f85db835f73de486a27","impliedFormat":99},{"version":"32fdee617a2adda531247e778a4d8c99e6c60b7134278e8159b39dc342534bd7","impliedFormat":99},{"version":"9a217e4a3d951505ebc38cdbe7febb56dc9fd702944e533653c4cb9706611142","impliedFormat":99},{"version":"b8a6971a56c7b545ea3a004263b71ef33b48a18acb5a0fd56a122aa558778f97","impliedFormat":99},{"version":"80203578f605d0b468a89dda907dd6c6bc4ecd178aa874ab8cbcc9258c688285","impliedFormat":99},{"version":"75e8d1d176e23f99a7d97e603d02b8140b046fdffe6f6c87da26c85884d9d36a","impliedFormat":99},{"version":"546117b654701ee5a2dd24e0e7b1f07ddf4a3ca2fe59ed192e39f1aed60108e9","impliedFormat":99},{"version":"6520a3ba3ffc63c63bb6781983168225711de7e82752b2531afa4d52f2e2b466","impliedFormat":99},{"version":"5d41cfd06dd9e1214a7764f8eaebb766b83f66c8f11e62a6097f04fff87a4a6b","impliedFormat":99},{"version":"b5a56c6af4989a86f4a14c2e4a00f117d0d11386a86ec36bbdbe58573bcf5398","impliedFormat":99},{"version":"bece81f29165e57bc9ba79014013576f595aed38bf5eef970116a1662cac104f","impliedFormat":99},{"version":"886a85ee5fc515eeac1ca2a622683043299955fe63362fa39868d0fd6a52be7b","impliedFormat":99},{"version":"c2e95a725af0992f53156ec30f81e52afffad3ebde834300f74d71adcb71bef1","impliedFormat":99},{"version":"d33557dee4bfbbf7eb55980cf190fc6cee55522699ecd358bd233c6b3918d8d8","impliedFormat":99},{"version":"4f7b9c105c1490daae5ce858fc62fa16af232d1e2b63c89d8c41f828b7fff708","impliedFormat":99},{"version":"00557764e6e9fc728e29d6bcae39a6d9495f7eadedd7da1aa0b0fe614e4ccca3","impliedFormat":99},{"version":"071eb5fc43de21a0d6e072297f299a37cb865fc64c97d753939376cb6eea900b","impliedFormat":99},{"version":"1ccb3329ee3cb57887105caac4a3acfcdd198c40fa0ea9f17447b59ddde0f4fc","impliedFormat":99},{"version":"1364a1376ab6dbedbff5d57321c347bb51c1d6f706043e95e8f5a890e5e11fbb","impliedFormat":99},{"version":"64d1c31ce065d601fb3ec7455371a766b689959b3a5b2881c47afd5b34f4f399","impliedFormat":99},{"version":"2768920ab8f8b27d3601d50fcf73e0817ae4993afb3ef915df237016e5bae1f2","impliedFormat":99},{"version":"047ad410cac07496fee6fab9f028d8570f3144ac47b0a6f5e227469bd77ece5c","impliedFormat":99},{"version":"9826d401f45424796d81f687fb9a1d9c705a346009066bdce268634423d44f22","impliedFormat":99},{"version":"6a16e0ebe7addbbb94c67380f5dc1f380bbb159ba2eee4c8e240f30b3c9f1366","impliedFormat":99},{"version":"9491a0de9edc2d904c9b24890dac0b0574271afd1c614ac3c556b5abcb762355","impliedFormat":99},{"version":"00516acecd831b6cfbc848577ea9870f356147ea8f3b05b255a4de10e83c39d5","impliedFormat":99},{"version":"0bd3ec2181109bd837a003eabdbc7fd6428e7bd73f87c3fe1205c22b30fd13fb","impliedFormat":99},{"version":"5032f38ad0572018d385b1167cb1e2c622e969e61b52456ee551297f6d7dd0ca","impliedFormat":99},{"version":"49ec604e458e8ec0fd65dfc22ec22e969a68a887ce53b381233d349b88b84287","impliedFormat":99},{"version":"896bb58cbf91c0ecc5f2cd853311265085de6d893b4662969a0af2794258ef05","impliedFormat":99},{"version":"bd650df66f16e2bf8efb2f6c890cff00d8b6bb3fda21d2c9c0fcfa72b3b968b2","affectsGlobalScope":true,"impliedFormat":99},{"version":"c37fc05d73c59480748a5234293bd4dec1b3ded10751297362d13f4f4b44c9a7","impliedFormat":99},{"version":"d04e0887b1195d85dfd88674828405811c7f7d502e94df61107e6357e2946eab","impliedFormat":99},"bfd892879cbedec7169cadcf41f251f6a69af97a73fe4b89543c257b9fc14b2d",{"version":"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49","impliedFormat":1},{"version":"407a06ba04eede4074eec470ecba2784cbb3bf4e7de56833b097dd90a2aa0651","impliedFormat":1},{"version":"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c","impliedFormat":1},{"version":"98a787be42bd92f8c2a37d7df5f13e5992da0d967fab794adbb7ee18370f9849","impliedFormat":1},{"version":"5c96bad5f78466785cdad664c056e9e2802d5482ca5f862ed19ba34ffbb7b3a4","impliedFormat":1},"948e6bea4297f5c9dd68a446fb2b4bcfed7b074ed4501310353ee5ad1fe479b0","a187f0416e40acfc4117ba083871acbfc1b746ee60343d554cf82d2ceccbb0b6",{"version":"a80b7bc4eda856374c26a56f6f25297f4c393309d4c4548002a5238cd57b2b66","impliedFormat":99},{"version":"e5885f7b9247fb96fb143a533f3a37fd511f8b96b42d56f76ed0fc7dc36e6dc8","impliedFormat":99},{"version":"571b2640f0cf541dfed72c433706ad1c70fb55ed60763343aa617e150fbb036e","impliedFormat":1},{"version":"6a2372186491f911527a890d92ac12b88dec29f1c0cec7fce93745aba3253fde","impliedFormat":1},{"version":"c57b441e0c0a9cbdfa7d850dae1f8a387d6f81cbffbc3cd0465d530084c2417d","impliedFormat":99},{"version":"fd5deb01de1bee803d0a5cd50fec744676c4095e41e6bb0e2f43cfed726a64cb","impliedFormat":1},"b8cdc6f2237696cd1a9f85fd0886cdfe526f6e29872b17e928ec0120f0fb9ef2","1db644719e7fed28ca35747c4c77b2c5edb735d3507f72b9fb25f88764070d29",{"version":"a26d74bc8768e134734fa049d5a89fb674a560292f4bf1b39392416dc04cf49e","impliedFormat":99},{"version":"ea7f3d87bb25b8cf26c1b440de31b628c53b5e72e8f1ab1726356bf58acf5946","impliedFormat":99},{"version":"7ec047b73f621c526468517fea779fec2007dd05baa880989def59126c98ef79","impliedFormat":99},{"version":"8dd450de6d756cee0761f277c6dc58b0b5a66b8c274b980949318b8cad26d712","impliedFormat":99},{"version":"904d6ad970b6bd825449480488a73d9b98432357ab38cf8d31ffd651ae376ff5","impliedFormat":99},{"version":"dfcf16e716338e9fe8cf790ac7756f61c85b83b699861df970661e97bf482692","impliedFormat":99},{"version":"a3ba63a37d4291eba327b1b4c20cd2950cd6ce3f0cb35bae51de9b2e402c5e53","impliedFormat":1},"691b50d4f214bf6e340827f79ea63ff090296d89bba37c6f7608f10fd0fea6a5","af0b36d6420dc11499c7e669b695ef782270703ee035c17d23ecfb2b40093c4f","964b998a564f7afc4d6524a5f8c78f5c80a916f35295737bb4c98c1ad04e2eab",{"version":"f7a0527d438d747f9ccbe5cc4a33ce7da90eb7a4060b4d42dcaa92587c9719d7","impliedFormat":1},{"version":"4dcdbdbc992d114e52247e2f960b05cf9d65d3142114bf08552b18938cb3d56b","impliedFormat":1},{"version":"b75d56703daaffcb31a7cdebf190856e07739a9481f01c2919f95bde99be9424","impliedFormat":99},{"version":"ddb5454371b8da3a72ec536ad319f9f4e0a9851ffa961ae174484296a88a70db","impliedFormat":1},{"version":"fb7c8a2d7e2b50ada1e15b223d3bb83690bd34fd764aa0e009918549e440db1d","impliedFormat":1},{"version":"b75d56703daaffcb31a7cdebf190856e07739a9481f01c2919f95bde99be9424","impliedFormat":99},{"version":"9c909c17f69f125976e5c320eded3e693890d21b18cbc4caa246ec4fda260dcd","impliedFormat":1},{"version":"7915d50018073244a9bcb3621e79b8e0ad4eedfb6b053fc945cad60c983bb11b","impliedFormat":1},{"version":"ea7b47bc357858506e6161065b1a8997cfbc5d1dcdf233966da9d01d74721ef8","impliedFormat":1},{"version":"50444daaee4bf4ad85ad8eb52e3ad5c6bba420aad9e2a800043a78f4d8bc436c","impliedFormat":99},{"version":"1fa33d8db2a9d2a7dbfb7a24718cccbcde8364d10cce29b1a7eea4cf3a530cbb","impliedFormat":1},{"version":"b75d56703daaffcb31a7cdebf190856e07739a9481f01c2919f95bde99be9424","impliedFormat":99},{"version":"90300bef1c0e2523c97fdd178b9d50e3f39646ade67faab69be4e445937c862a","impliedFormat":1},{"version":"381437930df37907c030519b23ffea4d8113f46e4431a70bfe008a0c43c63648","impliedFormat":1},{"version":"695cbb89013bc9e87fb24b0df020fe605c54f0ab5c267b5bf0490ed097044197","impliedFormat":1},{"version":"f43780383543bfcdc0a2ee850375e1f03d94bdb1b85091d5b11bb8b2023c8b49","impliedFormat":1},{"version":"303638e9e9378e3cce14c10a276251b2b6baea811f882b0adb6d8b7e44a8245e","impliedFormat":1},{"version":"93fc1a008c4786aa9970b7a4c56295bef4d39c243af63cbfcbd5548ca4fdd535","impliedFormat":1},{"version":"6b91aca1948fd92e4fb32e91e94955e7b7c12fb8cbc0a40eb55f1808886e53e8","impliedFormat":1},{"version":"1e197b6e669b8ece0a68c684af9a4394d8c47e58eaa040391cbdadcc1b5020a0","impliedFormat":1},{"version":"fccfc90c19498513d5c4b9c705706660eba9eb493bc38cdc16a11e9d384cd086","impliedFormat":1},{"version":"b288bbe96ea05e353f008a4d445fb8589a82f2a1c4d4d0bdfc283a19020dc96f","impliedFormat":1},{"version":"b75d56703daaffcb31a7cdebf190856e07739a9481f01c2919f95bde99be9424","impliedFormat":99},{"version":"cf32b34fb9148d541c100a83fd3d204ced00c76871b4811d53b710ff15a948a1","impliedFormat":1},{"version":"6940a178bd12acca76e270f0b0c4d907b9cc469d28833bd59a3276f11668591e","impliedFormat":1},{"version":"b189e328b0f8cfffbaa9b705d5b1d7ff21a58d2910614d449ae052bd6f6977f1","impliedFormat":1},{"version":"ea7b47bc357858506e6161065b1a8997cfbc5d1dcdf233966da9d01d74721ef8","impliedFormat":1},{"version":"9dc9c7a268e5b2caa79a5a5040a86ba5ddf1cba20d8715ceaf2b76f79ee444fc","impliedFormat":99},{"version":"9f6eb0d33983f2199c791a2b35f3eb02529704e5cbab2657dc2cf8dda38d7226","impliedFormat":1},{"version":"40a5bb1733bb8fb3ffa425b92db062334f9b998ba8ad4390cc8008cc2ce701ed","impliedFormat":1},{"version":"25cdca7151f3e654f6786da7fadba42eb784d44382d70eb66d9590c2c194a40d","impliedFormat":1},{"version":"9e7c4846057815d55e1eaf27214286ec0768a1b463a4669e1ce37849b6cc1016","impliedFormat":1},{"version":"8ece278189f0d81351b3a3bf0026af4dbe345401a3bbacdc699e791a9c4c5ba2","impliedFormat":1},{"version":"1f4ae6e7f749aa9a53317baa0e26dc98317f87c54a323250f0aa6d8689fcb5ac","impliedFormat":1},{"version":"1bfd2c00081dd582489d1d0dd64d270b9c8bc5a62cc9882865b405bf8c2d9b03","impliedFormat":1},{"version":"2a6341e88b00c3df410f0e1ac0c45b14285b9b3e8613bdfa6893ee748f00a07c","impliedFormat":1},{"version":"8ea05ab5a1250aa9d98070151c3981a85f5fd05185454f6c871ca2a988feb725","impliedFormat":1},{"version":"0e1f5fa05f1097f2cc3a1581afc7270af08d31be123f3a8e92a5b4080858861e","impliedFormat":1},{"version":"655638506266d44bc4815f7fda912d712114e200aa11ce4dee055d357dba96c5","impliedFormat":1},{"version":"d5a8b1a4ddd0dedc0b2f94627f26a02c25fa68314f575d58668844dae0269ac9","impliedFormat":1},{"version":"03fd06fcc894c94effaef2fc57d92c9e2871c6a5adb2db7136859a6ceff3f91a","impliedFormat":1},{"version":"f9a7c89ccff78b8a80e7caa18cda3ddf3718a26a3640dd50b299d90ac405f9be","impliedFormat":1},{"version":"9c78ad8f4f43db74529e2f40798ca4a8f9a2b09cad5363c400aa7ce691691ad8","impliedFormat":1},{"version":"4680182e054eef3b7eca5d9168a70191033b4da65cf8d013a6ced7ff6948bc80","impliedFormat":1},{"version":"f13f8b484a2ffc7b99779eb915ab7c0de7a5923b09d97bd7bd20b578e1d59a85","impliedFormat":1},{"version":"f0e1813ebf1c3ac7e6e3179cb26d13e9044d69eaf3f389e91c8afd9aa958a0c2","impliedFormat":1},{"version":"4fca0017adb6ab36b6516953511488e00113532d5db31a7d4f902ae9ccf06208","impliedFormat":1},{"version":"37882fca5c7c251e1bfe99c5766e708abb179cc45d22b6bc87c01d25423bbc66","impliedFormat":1},{"version":"53fd33fd439c753899684518742fef08106dc63afcc1c9f62353eff3601e7fdb","impliedFormat":1},{"version":"9a2e75d1d72d7463cb3a0d4a01c5648bdb4f54866acaffb0360da91234c0df8c","impliedFormat":1},{"version":"2d157fcd4056b3190ae9427cc822f395d30076594ee803fb7623b17570c8f4a5","impliedFormat":1},{"version":"47dada41ced5a0e23c415fb8599b1b8c848fdd1df1b2f02b2e756558be9b3153","impliedFormat":1},{"version":"b0a59b88d6d32ed5734ac9413f8a9e34773d4b7b0eddaeccdecee24ab8a4457d","impliedFormat":1},{"version":"492dae861616e49ded6e82df7110868489b8f80cebb5f56bbe05bbf829f8a6fc","impliedFormat":1},{"version":"dd4e64e454be95294aceb5286575faa08af11ebacc2c524310be108c1abd2a84","impliedFormat":1},{"version":"3711c896e72680d79cfc4df36cae172b7dbb72e11936e5e9545f5351e6ed0962","impliedFormat":1},{"version":"fdb706b594619f05e73b97213d760f59ed1514b302f58b4b46d86fe77757c031","impliedFormat":1},{"version":"f0623fef3752e3b67ed969c7e1c311528b5b54e3b43d8bbc26073ae34387d9a6","impliedFormat":1},{"version":"9e7c4846057815d55e1eaf27214286ec0768a1b463a4669e1ce37849b6cc1016","impliedFormat":1},{"version":"c477249bf0288b0fa76004f0d34567ad73fd007471c7fc9f9abfaafd0baf9f9c","impliedFormat":1},{"version":"91df8ed021ba6bde734d38d901a2d3664d2c804000299fd9df66290cc300b21c","impliedFormat":1},{"version":"b7071465f540ceb78d697e547f495d7ba4fddb94f9443bb73c9ba3ef495aaae7","impliedFormat":1},{"version":"54b0087a8523d0a289460fb3ac4b9ed55633977f2eb7e7f4bba5ff2c1ba972e0","impliedFormat":1},{"version":"62a0503a7f38a521fac641f3b258516ce3229852cd297920af25f798e319bbe9","impliedFormat":1},{"version":"7b7840c394a0c5bf219576439776edb4447e9228f0fbbb2a29caa8f4cf6a95fd","impliedFormat":1},{"version":"794d96375f04d39dc8513db4479a0023d3b8074b9738e38f7c0ac62d9696431d","impliedFormat":1},{"version":"656b3a9ee8a2eb73218ccddedbaf412751787b303bf5b0e293f2c60443aeeb08","impliedFormat":1},{"version":"e78dd7346725ac2d936a296d601e01f55eefabd010bee84cd03e20f55bd61a8c","impliedFormat":1},{"version":"e8447d11f3a33668faee3a0175b0c0e7f653b46896d127b8b42402eb8e811ead","impliedFormat":1},{"version":"d3afb6e0fbb2ff982a1aa1f8192754d1fc26f5b80c9e1b79fd29f60a4c8ee4b9","impliedFormat":1},{"version":"1b21d11a8a2339710d628f30d4e392959d1e78870e15217cee44defecc945d25","impliedFormat":1},{"version":"6c4925eb55a080d0335bbf728fd0824d0e4848d554aa8dd260b83ea8ac7866cd","impliedFormat":1},{"version":"492dae861616e49ded6e82df7110868489b8f80cebb5f56bbe05bbf829f8a6fc","impliedFormat":1},{"version":"ee151584009c44c5d85647b8f2a009d41c871b11eef306b82fd8726e61000dda","impliedFormat":1},{"version":"30482110c7b78ed09ba0f6a6059839661a663caf573f377892ccfb8665f2c904","impliedFormat":1},{"version":"5e19a4ddd649b5274e911ed719ef20e76b2b50b195cff0a6128974fa7136a5ed","impliedFormat":1},{"version":"7f55be2dac50778c467e6bf5f43813c95aede7c91f33799992ec528bc8e2ac29","impliedFormat":1},{"version":"2e945eb6f8c4bb2c3eca0ab41fa0ba6d534448b245fd85ce54a9622a3b5e5902","impliedFormat":1},{"version":"247c7ef77d31b7344ff1d4bbc979193dfdb4f0620aaa8994271c1a19ba7b7fd5","impliedFormat":1},{"version":"fd67efb3106829ec829f635cd011fe2449b689ab1627e3125ceedccb4be70160","impliedFormat":1},{"version":"9e6c51f61f922f70bf41473a10ca72f8fb6218587a5d305544bc64ca9ebe6768","impliedFormat":1},{"version":"0f6b337b59b211dd99e8758c9a1906f9dd7027b74bb6e9cb11a14ed1264a54b2","impliedFormat":1},{"version":"3f982f5196f9e80ccbc869dfabe2db727e9c181b8afcf985c1eca480385c5aa4","impliedFormat":1},{"version":"4b247257463a862b001ae097a3b5b1b90dc536f26b5c10860f46a086d404dbde","impliedFormat":1},{"version":"d0f2ddd588d6e73c08eb89d8e1bd6913b4e76a556497b81384321f4b308a08f7","impliedFormat":1},{"version":"d302d9806295f7018e115f0841222106ea13ff08a84b6a65c2a6840161fe06ef","impliedFormat":1},{"version":"6fb8d589421e9fcb4d885775748fa5a2607d30f7d323b99f39178b0134b24908","impliedFormat":1},{"version":"ca8d83f4683985cea219b3171d4e2255e270c31fd1c9fa9fee870147928a1a28","impliedFormat":1},{"version":"01bb683a8d7029615a664f16371d85d6c423f939e642127f267c699b8fdaee67","impliedFormat":1},{"version":"6f9ccfe772d526c448050c16f5c5e803be9e4250886a5f1bd9710178877d5749","impliedFormat":1},{"version":"bf11293cd047c76a515ba6e51fe3d9b7c643d1291795183c03ade5caed92cbc3","impliedFormat":1},{"version":"3d0c9ab7db5824803fa4db427c32b32634ee88e0f8cc07ceecfe783fedd74883","impliedFormat":1},{"version":"d2b80289f4d6e739fa686931a59934d53da37f295f3ad2de994c06c56f9f115f","impliedFormat":1},{"version":"5f1af7275f2a9163641832733040dea1f37549e8c3b3500fce70c7ece43ed4f1","impliedFormat":1},{"version":"b9eb41c2fe73fd3a4fa20abdb6c8ec11ad75c5047c4a0acea1f54aa412e27087","impliedFormat":1},{"version":"851df6f9fda2d1de63c60947414b16d0bbace00ba63870268cf9b9ef42411d1a","impliedFormat":1},{"version":"e0a885c5ea202b9fc29b95447841cc9bfaaecdcbea8930d3b86437e21f24bb8f","impliedFormat":1},{"version":"55b02ad0e9dc318aa3246016bef92ad29ce6fac78d701a8872c91acb29919d00","impliedFormat":1},{"version":"08f4c7fe2450260b0765a77c33fb31ec2f74135a3a73b8a66ae23b42477d5b44","impliedFormat":1},{"version":"603938fc65aab423081f090ca51bccadbbc7b82448b4318ed081df2b1cb915e8","impliedFormat":1},{"version":"19087a05c31ff776b0fc4b16617c7898f7bed243d2f4fc38d33896c8c1c6e2fd","impliedFormat":1},{"version":"2648aa102209f157247999308e4cd10af4c6fb2c162b611d8341d3b5bfe550c8","impliedFormat":1},"14ca014b7556acdec8b4408133854fbd393907ef037edfba209c862bbde6a4ac","d9dd58c244009971777782756346b432fcbff89e70bc105fbfe77f68e453cd7f","12070efd02cd32c7139045e130d0d65dcdb44e47809b4601e15a9b09af01dbfa","ad0936f84f1df79d3697bfbff9c18f8ad58431c1cbaf2359c6a853b0fcc9f28b","57f3df9acde01b94704b8569eb5052b5aebc3820278f8fbe2b59a2c8558c7bf9",{"version":"9c580c6eae94f8c9a38373566e59d5c3282dc194aa266b23a50686fe10560159","impliedFormat":99},"d512e59f49b1427c36f9bdbb82acc3cf2372db0554166ce846eda5ab35445bc0","15c77d7f21652af156aa815a33aaeb9e93f28ec4e990d093136b9a9a800ff17f","61368d7e10a0c5fa402c564058b2c5418c6351fc8cad748a02a256976a8ff87b",{"version":"6b5f886fe41e2e767168e491fe6048398ed6439d44e006d9f51cc31265f08978","impliedFormat":99},{"version":"f4a1eba860f7493d19df42373ddde4f3c6f31aa574b608e55e5b2bd459bba587","impliedFormat":99},{"version":"6b863463764ae572b9ada405bf77aac37b5e5089a3ab420d0862e4471051393b","impliedFormat":99},{"version":"233267a4a036c64aee95f66a0d31e3e0ef048cccc57dd66f9cf87582b38691e4","impliedFormat":99},"c84a32d47a5c50f53055e8549049a2f6f78e61cb125744000fe433f3c1afe2d5","16cd13121707d20475b88ba92c52c3fe62f0a7367da9795348f16d46c693c852","7be7a88e16d623e587b1bf700725855e7854fcba1944d2eee2cd88885e8d4be2",{"version":"2535fc1a5fe64892783ff8f61321b181c24f824e688a4a05ae738da33466605b","impliedFormat":99},"6b606747bda57b153ff6bf6bca41a629203a0d89ce396034ae8ac676c04b19dc","f3261799710655d5a4261536319e75f48ffbb6b8f2f3fad1388256f55779d22c","41a92b5d521d44f17011c9d5f1c2b1e24c46a73478fb01fa2a083cea8e98ae12","7f11cb3e8a54216798fecf263be78a616d0ebcdc18af84f69edd4bd92eccc79f","6ba21c8d08f976b7f611110cda13265ca0833171bdb7f6873104d5c099488c5f",{"version":"3eecb25bb467a948c04874d70452b14ae7edb707660aac17dc053e42f2088b00","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"15fe687c59d62741b4494d5e623d497d55eb38966ecf5bea7f36e48fc3fbe15e","impliedFormat":1},{"version":"2c3b8be03577c98530ef9cb1a76e2c812636a871f367e9edf4c5f3ce702b77f8","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e20fc6cca2cf901917bc09c88bf9ee380383717ed990900aa99962ff9e3f786","impliedFormat":99},{"version":"26d51d186bf97cd7a0aa6ad19e87195fd08ed72bb8df46e07cc2257b4d338eb5","impliedFormat":1},"a39403e80a18356665411f1efd3ffebff7f2090bcc88b22a97b1e75bf711fe19","f71f3707bcdc62558e88de06ec4e47e6813ec98e7b334fcbe9df17641aecdad6",{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fd06258805d26c72f5997e07a23155d322d5f05387adb3744a791fe6a0b042d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"24bd580b5743dc56402c440dc7f9a4f5d592ad7a419f25414d37a7bfe11e342b","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"6bdc71028db658243775263e93a7db2fd2abfce3ca569c3cca5aee6ed5eb186d","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"d2bc987ae352271d0d615a420dcf98cc886aa16b87fb2b569358c1fe0ca0773d","affectsGlobalScope":true,"impliedFormat":1},{"version":"f52e8dacc97d71dcc96af29e49584353f9c54cb916d132e3e768d8b8129c928d","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"76103716ba397bbb61f9fa9c9090dca59f39f9047cb1352b2179c5d8e7f4e8d0","impliedFormat":1},{"version":"53eac70430b30089a3a1959d8306b0f9cfaf0de75224b68ef25243e0b5ad1ca3","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"115971d64632ea4742b5b115fb64ed04bcaae2c3c342f13d9ba7e3f9ee39c4e7","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"86956cc2eb9dd371d6fab493d326a574afedebf76eef3fa7833b8e0d9b52d6f1","affectsGlobalScope":true,"impliedFormat":1},{"version":"91c1a729db5b28b2fc32bafa7a53611d417bc3f03f649278d4fd948aa4dec898","impliedFormat":1},{"version":"e6f5a38687bebe43a4cef426b69d34373ef68be9a6b1538ec0a371e69f309354","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ff5a53a58e756d2661b73ba60ffe274231a4432d21f7a2d0d9e4f6aa99f4283","impliedFormat":1},{"version":"eaf9ee1d90a35d56264f0bf39842282c58b9219e112ac7d0c1bce98c6c5da672","impliedFormat":1},{"version":"c15c4427ae7fd1dcd7f312a8a447ac93581b0d4664ddf151ecd07de4bf2bb9d7","impliedFormat":1},{"version":"5135bdd72cc05a8192bd2e92f0914d7fc43ee077d1293dc622a049b7035a0afb","impliedFormat":1},{"version":"4f80de3a11c0d2f1329a72e92c7416b2f7eab14f67e92cac63bb4e8d01c6edc8","impliedFormat":1},{"version":"6d386bc0d7f3afa1d401afc3e00ed6b09205a354a9795196caed937494a713e6","impliedFormat":1},{"version":"c72ccc191348ac1933226cab7a814cfda8b29a827d1df5dbebfe516a6fd734a8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8bea55446a296d289fbc762f61954a0e3e38ffbcacc06e47e0cba491030e3235","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"3eb62baae4df08c9173e6903d3ca45942ccec8c3659b0565684a75f3292cffbb","affectsGlobalScope":true,"impliedFormat":1},{"version":"42aaa94addeed66a04b61e433c14e829c43d1efd653cf2fda480c5fb3d722ed8","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"c6b4e0a02545304935ecbf7de7a8e056a31bb50939b5b321c9d50a405b5a0bba","impliedFormat":1},{"version":"fab29e6d649aa074a6b91e3bdf2bff484934a46067f6ee97a30fcd9762ae2213","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"15c5e91b5f08be34a78e3d976179bf5b7a9cc28dc0ef1ffebffeb3c7812a2dca","impliedFormat":1},{"version":"d63ff33a2fa221b36a4da0dd5a3dad3156f3dd0fe1baf43a186e607d4ba5af99","impliedFormat":1},{"version":"553870e516f8c772b89f3820576152ebc70181d7994d96917bb943e37da7f8a7","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"745c4240220559bd340c8aeb6e3c5270a709d3565e934dc22a69c304703956bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"9212c6e9d80cb45441a3614e95afd7235a55a18584c2ed32d6c1aca5a0c53d93","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef91efa0baea5d0e0f0f27b574a8bc100ce62a6d7e70220a0d58af6acab5e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"282fd2a1268a25345b830497b4b7bf5037a5e04f6a9c44c840cb605e19fea841","impliedFormat":1},{"version":"5360a27d3ebca11b224d7d3e38e3e2c63f8290cb1fcf6c3610401898f8e68bc3","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"1f58ebc40c84046ba4c25cf7e86e1ae92c3f064fb641af6c46a5acebf0b8b20b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f689c4237b70ae6be5f0e4180e8833f34ace40529d1acc0676ab8fb8f70457d7","impliedFormat":1},{"version":"ae25afbbf1ed5df63a177d67b9048bf7481067f1b8dc9c39212e59db94fc9fc6","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"52a8e7e8a1454b6d1b5ad428efae3870ffc56f2c02d923467f2940c454aa9aec","affectsGlobalScope":true,"impliedFormat":1},{"version":"78dc0513cc4f1642906b74dda42146bcbd9df7401717d6e89ea6d72d12ecb539","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"4bdb755899855d4469c43c834cb84319fa1b77c8e06d307cac81ad0ba2aeee55","impliedFormat":1},{"version":"cfc0be9b36a8d8b5e2451dd036491667a80a41d23665e0c4ad632c10c0acf198","impliedFormat":1},{"version":"7b7d90da73dc51e024e96fae960c1d033413a0f3630f1c18dde04bf36779fe19","impliedFormat":1},{"version":"e1e1ecda008619b3880b93609c010f2813bafd5d74d2637f28295b18322aa24b","impliedFormat":1},"a0d332159ee671ba1418f4ef18c9471709a7bdd9861697ba814beeed0d9c76ce","f9f3b2863bc92317b7bb8de1c103d2bf6d3351c6086fff6b6283504d72398d25","c1d4c1d42c0de48cb319c83899ab163fbd7c829fb3b5407aaad4b78a108b4c3b","f8753792b12a647d1faaf0cb82503939e507707bf202e6b322d3b7c1101f20d1","52a9f542a5b00948dca6562a0f05b1f013e51656846eb2691057d47a1a9e6a8d","93c591a9c14053f69267de6bd854d3c86ca34b302fdc261174c1171bfeb1eadf","901832900eda9401c92804d12bbcbe8b5e1e1d4343c45b76daae7c452817b63d","c38f09665b53dec2fb6f22232796547a185b6c35b3a3bb8f5f3ba4dd7ebd5a3d",{"version":"63f6312a4be1ec344baa7c5cdb831587ed5f737f35df2baa2d3db1d180b983ec","impliedFormat":99},{"version":"74c3a57d874889e2f042b89b9688716af704cb2366d757ead586988f6cc9a625","impliedFormat":99},{"version":"5ebf4476be92f000f00cb9fb79d69babe6f6ac2a39efdb04a8f370e110003e19","impliedFormat":99},{"version":"39bc8c363900ffa799f98eb2e4c7ddd52e09cfb9392082128ebe49379f999aa5","impliedFormat":99},{"version":"1a4cfb737223d523387f7afee7219fd2016f1d73ef885e9cb42183c911d07b4d","impliedFormat":99},{"version":"392b17a6ba3f687f19ba207f17841c99306701cc2882f3615a3b426686d854e6","impliedFormat":99},{"version":"2a9f82af6c7cf1e002d17153e10d758f685d085864f6c5f7d2b775ebcd6b2fc9","impliedFormat":99},{"version":"f65b6f12e264b6e22dcf888bc0c239aab27c1d1fa6560af64bcd450f864abab7","impliedFormat":99},{"version":"ecbac26c0c765e1da3e748a35ededfa4c7ed87f48399919cd952ae8bc32a1339","impliedFormat":99},{"version":"9c88eebb75b82b4ccb9412c7e3035e40e188ea3d7dcb010ff87986b7ff629555","impliedFormat":99},{"version":"154f87edab104ff00f36e95b36d01e014a4d74ac4fc219e124e2bf2627099267","impliedFormat":99},{"version":"30844ce073bb46b6908f55273063915629cd795bf7d83638bcb71e1507a494bb","impliedFormat":99},{"version":"0b616ee0814b25c7b231a73b57ad93a558a6b8cb5d3642776b92dca8e361dd9d","impliedFormat":99},{"version":"165c74085a9beb3c2bf69716e5e090449d7e9d4dc53084da6228206213d94939","impliedFormat":99},{"version":"b02604b3eb025af58b4c07c7ffce6d28a03948286cb5c4d5cdc46ffe21549524","impliedFormat":99},{"version":"ebd09f4071c53a42a09a20feb0b144b1f485f10a7d6190aba91c1714977d689f","impliedFormat":99},{"version":"345bf134b7c00954c1db3e011f029c066877a32256569c9d91b6ceb5bcca054c","impliedFormat":99},{"version":"2a1f7be668e3a95cdb683c6f755631bf19de9705c6d6c1c9e4ebc67e9db916d7","impliedFormat":99},{"version":"357acfb6822f15161214eb9e1848c767182750b67f9c2c6ac0fab52ce300ddbb","impliedFormat":99},{"version":"895ed044afb790fa06b64467688cb28436d87f46dcdc526a163915a962d55dca","impliedFormat":99},{"version":"646d66c423da6f036ecfda81da6f7d60a4748ddb0c58c85d261bb5c8e541cef2","impliedFormat":99},{"version":"93acb73e975b4fd741faf2e8fb2a5705aadcf8ca2df8fe354c9edb0b07622252","impliedFormat":99},{"version":"24bf4c3ab312b32e6f114adc2f4ce858a8a28af76abcbdc46a4a40655933f152","impliedFormat":99},{"version":"3b355d5bc20b716079980a0ed2d400180a15368db05888b3b858f90ae3ceac14","impliedFormat":99},{"version":"ff2c4a40bbde08390837443555b9ae201af54b527baf151555310782bd7bb8ef","impliedFormat":99},{"version":"0e9998684ca02c028170441f4c006e1caf425f9a9c3814cf8765a0002773fe30","impliedFormat":99},{"version":"1e647f80259d61974c8d0a89d9e3fd22416975c257d76f4f32d6ff38b9157f21","impliedFormat":99},{"version":"31e9f9b81179cdce4ee1cd1d6a427dc0c5fd15064307df8cad58237b0d96385b","impliedFormat":99},{"version":"7ba73e6476144ac4587b18bcc70349d2a8e7cede4e780815b53a057ca71f764d","impliedFormat":99},{"version":"fba690fc44b5c1db29fb472830df4cea1374642935a02c6302730bff37752498","impliedFormat":99},{"version":"2515daf0e2b05ec5a90349ea839cc1fad8e67135665747cd5f72b7b3d2ad49c3","impliedFormat":99},{"version":"7b4a756bb59248aeb831709239014a9850837727c2d6ec053f54eeaee95dda39","impliedFormat":99},{"version":"cde91ca23d14021aca53adba5977bebf7f72e4f18bbdcd2c6a689482c77dba07","impliedFormat":99},{"version":"191878041be6dae0b75974d1d28d55ae82a2896d5eb5004eb039e964e8140c00","impliedFormat":99},{"version":"7f4272fd567d065c1f5614ae3bed61b3dee47845267be0e41dd24f901985bf0f","impliedFormat":99},{"version":"0fe6cb0ec82fea8bb694d8335f8d470c8843600a277cf02d7dbfb84002666e8a","impliedFormat":99},{"version":"e43159089587768cc9e4b325488c546cec950602173b04a4f6cb9a615c4fc3b9","impliedFormat":99},{"version":"f3ebf0a71fb9e0d708c607d6448edae7a7893162532b560b3f361f48bacdbfca","impliedFormat":99},{"version":"053ed027d6ab656c53ee8dfc3fe842beff2a831831591f7f446c0ea1632f606e","impliedFormat":99},{"version":"79c5c3441a6786ce4804528aa560836e45cf855af4f25d6ca40f598cd6f1979a","impliedFormat":99},{"version":"bf235a40a595fe4c1c72ff72b50a9881a7279c4063029fc88e49237542797935","impliedFormat":99},{"version":"25627620692594a49b01a7192416e59a0fd94717c4f5c2800a3cdde58e28b39f","impliedFormat":99},{"version":"00f9b95c0741094ef69f8befa268077fb5dae5192149d99af5c7abf4cd20d5e5","impliedFormat":99},{"version":"89536ffee2ff5d49cd4c898a854a92a3d0812394f4ab6e1d48f9fb658f4abe48","impliedFormat":99},{"version":"0085bc39713819715d49b27bb64767dff1829179b0914ef0d4e1a852770f0136","impliedFormat":99},{"version":"9c6c451215eae6ae4ee0ebf8433f9d90494df7dba87718478c050bf5551da18f","impliedFormat":99},{"version":"a12d1a8f1b6e34597b9aef2757fdf4505362189c75b7f15266604a80bcffb42e","impliedFormat":99},{"version":"193f77fd99a5798127915516363958d227df9cb82e23f5890aa668409c1e6360","impliedFormat":99},{"version":"d8dc0c576c79c5069f4e87b0a15088e952043cb3df0ec487f81e6b98b174e503","impliedFormat":99},{"version":"84b69e8d4be7b1736536d1ab8c72c48318bbe6c677dab53a2d51058f9e68df71","impliedFormat":99},{"version":"97d3c4bd2a49a56f2cb63bb76c5880afe5c76098dcbb5598cd14e96bf572cb86","impliedFormat":99},{"version":"a493cd942f29c45c9befb1cf2f3e9a757300e1fa6b5a20cf939bf563c31f46a1","impliedFormat":99},{"version":"5300527e32de6eab286e5b70c3cca475380320a142ad54f234a34daadfc7bb1c","impliedFormat":99},{"version":"7476dbc814b46489fff760fd1f3d64248aedbf17e86fda8883c9bd0482d8bf73","impliedFormat":99},{"version":"8520b3f4c2c698bcef9c71d418a11c7cbe90d7b6d7deaed251a97ee5ef6b2068","impliedFormat":99},{"version":"8afc3d51f8ace0b6b9e89a2f7d8a6dffaca41d91733d235dea7c28364a3081a1","impliedFormat":99},{"version":"01cd58f2842ffec94a7cd86881fb5595df4b08399b99e817d2c25c2fb973fe09","impliedFormat":99},{"version":"d49f5458be59a10cc60ad003bebafa22eb37e15492020b2be9ca07055b6c8b10","impliedFormat":99},{"version":"0aa491d56a8011fcf95247f81cc4e09b40cfd5a96e80221038347da3931e8ba6","impliedFormat":99},{"version":"814971944c21b19105949c552a7dd5b35235a17a2eb8092b809e2fcaa54ea4e4","impliedFormat":99},{"version":"70f1528dd7d2131386fdcf6223ac1c56f2d7726c7977bd5eddcdfd22cd24f7f6","impliedFormat":99},{"version":"87f41340a0cac5b54e499b3ea6e6d0cb2e7abb9abf5feaedc6c4cc608cdfdc54","impliedFormat":99},{"version":"d0a8b3701edaddb7db2935bb134439272b46201384579eb0b53d66e4ac83bbfc","impliedFormat":99},"b62f0ea87cf15f49b4b273f7d0d44a9eb49a4afd491d030dc27f9450b4c8a2cf","0c502885400f09c6b0d519e47c70d5338c5d60c5dcf36224beabb0f56147926f","30b8605316bbeb04bfb8c8e0b6387b748314c872b878a110ef24fb8b793f9ddd",{"version":"8085954ba165e611c6230596078063627f3656fed3fb68ad1e36a414c4d7599a","impliedFormat":99},"6be4384dd9f9f9e6b57e63d995da496156ac85469f49b40b273f2a9d0f2d0ac8","b3da31592c41e21951c26e0e633c737608577101c739d900705382cd45f436ef",{"version":"ec69ebd1c4850514ebb6724911ad56e71caa0d076891ed6b67cb10d3ebbf2586","impliedFormat":99},{"version":"89783bd45ab35df55203b522f8271500189c3526976af533a599a86caaf31362","impliedFormat":99},{"version":"26e6c521a290630ea31f0205a46a87cab35faac96e2b30606f37bae7bcda4f9d","impliedFormat":99},"b47c32ab9b7aa7a698fe941374f0643ae2f80d652f7b4d107465569a47315732","71ce3f2afb743ee35279aa1968c72508392280a0d819a52d33a76b0d96fb56ae","18cdbaea035339880e6c1789db18a4e052adcaef697ff714f4464dcb6b495277",{"version":"ecd224c9132c9f44b2a93b9c4b6b29d839bef41df565fe2bc6f46a6f4f20d109","impliedFormat":99},"c5715fc1045a127a5270779f3d44744a110cfa4d4459b8be8515ac8db8a0c05f",{"version":"bb703864a1bc9ca5ac3589ffd83785f6dc86f7f6c485c97d7ffd53438777cb9e","impliedFormat":1},"7398eff1a4d6c9bbd038be34cb201e478c95ec935f3f8a77d1cd98d7e4ae280a",{"version":"e7441be68f390975c6155c805cea8f54cc1b7f3656b6b9440ecbbbd7753499e6","impliedFormat":99},"569c22f372d0fd5765ec2c88dadc252000b5ad578ace25b922b0a38f11d6407d",{"version":"882b28abe64dae4932c83ebb71e4155da340929fe08a2055f3e573ef17f70fc3","impliedFormat":1},{"version":"4a3e425808751200a7709671667ad3d7e7cbfd0a06d469cab42adf06c2601f4a","impliedFormat":1},{"version":"401da46338f5b4f97c2a5f8a0faaace045c51aabd751d2dc704159f64feafe89","impliedFormat":1},{"version":"4e6da006f3a74377f1801ef8cbd771f82ead12d4326d4429661524aca2e21493","impliedFormat":1},"f22f1e3abefaa89e51454591a85410e32f41f9b1d14666e27139417410f10ba6",{"version":"71acd198e19fa38447a3cbc5c33f2f5a719d933fccf314aaff0e8b0593271324","impliedFormat":99},{"version":"91b4ce96f6ad631a0a6920eb0ab928159ff01a439ae0e266ecdc9ea83126a195","impliedFormat":1},{"version":"e3448881d526bfca052d5f9224cc772f61d9fc84d0c52eb7154b13bd4db9d8b2","impliedFormat":1},{"version":"e348f128032c4807ad9359a1fff29fcbc5f551c81be807bfa86db5a45649b7ba","impliedFormat":1},{"version":"42f4d7040a48e5b9c9b20b5f17a04c381676211bdb0b5a580a183cf5908664be","impliedFormat":1},{"version":"ad4d2c881a46db2a93346d760aa4e5e9f7d79a87e4b443055f5416b10dbe748c","impliedFormat":1},{"version":"c2fc483dea0580d1266c1500f17e49a739ca6cfe408691da638ddc211dfffad0","impliedFormat":1},{"version":"7c31a2b77ae042fb1f057c21367e730f364849ae8fa1d72f5a9936cef963a8b2","impliedFormat":1},{"version":"650d4007870fee41b86182e7965c6fb80283388d0ba8882ce664cc311a2840b5","impliedFormat":1},{"version":"6cfa0cdc8ff57cef4d6452ac55f5db4bc1a8967f4c005785e7b679da560d2d9c","impliedFormat":1},{"version":"c16c3b97930e8fbf05022024f049d51c998dd5eb6509047e1f841777968e85c1","impliedFormat":1},{"version":"cce15e7530c8062dea0666a174f31c1fe445a97357885480748b072778fc6f36","impliedFormat":1},{"version":"535b2fc8c89091c20124fe144699bb4a96d5db4418a1594a9a0a6a863b2195ae","impliedFormat":1},{"version":"dd5165bf834f6e784b4aad9fae6d84307c19f140829e4c6c4123b2d1a707d8bd","impliedFormat":1},{"version":"7ee6cd3fbeb95b580c5447f49129a4dc1604bfc96defe387a76f96884d59f844","impliedFormat":1},{"version":"21575cdeaca6a2c2a0beb8c2ecbc981d9deb95f879f82dc7d6e325fe8737b5ba","impliedFormat":1},{"version":"d668cc634f10837bf57e2a9bf13ccc4952cbf997015f2b8095d935f50bf625d0","impliedFormat":1},{"version":"faba53dda443d501f30e2d92ed33a8d11f88b420b0e2f03c5d7d62ebe9e7c389","impliedFormat":1},{"version":"3eb7d541136cd8b66020417086e4f481fb1ae0e2b916846d43cbf0b540371954","impliedFormat":1},{"version":"9ff4b9f562c6b70f750ca1c7a88d460442f55007843531f233ab827c102ac855","impliedFormat":1},{"version":"4f4cbbada4295ab9497999bec19bd2eea1ede9212eb5b4d0d6e529df533c5a4b","impliedFormat":1},{"version":"cf81fae6e5447acb74958bc8353b0d50b6700d4b3a220c9e483f42ca7a7041aa","impliedFormat":1},{"version":"92f6f02b25b107a282f27fde90a78cbd46e21f38c0d7fc1b67aea3fff35f083e","impliedFormat":1},{"version":"479eec32bca85c1ff313f799b894c6bb304fdab394b50296e6efe4304d9f00aa","impliedFormat":1},{"version":"27c37f4535447fb3191a4c1bd9a5fcab1922bec4e730f13bace2cfa25f8d7367","impliedFormat":1},{"version":"3e9b3266a6b9e5b3e9a293c27fd670871753ab46314ce3eca898d2bcf58eb604","impliedFormat":1},{"version":"369b7270eeeb37982203b2cb18c7302947b89bf5818c1d3d2e95a0418f02b74e","impliedFormat":1},{"version":"3d724c9a01d0171d38a7492263ae15069e276791c9403c9dd24ee6189fbd2bf5","impliedFormat":1},{"version":"039bd8d1e0d151570b66e75ee152877fb0e2f42eca43718632ac195e6884be34","impliedFormat":1},{"version":"89fb1e22c3c98cbb86dc3e5949012bdae217f2b5d768a2cc74e1c4b413c25ad2","impliedFormat":1},"e3efc3a438f0239206592ff248360a1b8cb729571e4d799abc730186740702f9","c8e586fc872c58e6442b4263fae38566045ed2afe164381b3c2ed419ba145ccd","090208b4a51c94a442521d2efdcd8840b7f0e0053b7dc37152614f9d64e12e47",{"version":"a9373d52584b48809ffd61d74f5b3dfd127da846e3c4ee3c415560386df3994b","impliedFormat":99},{"version":"caf4af98bf464ad3e10c46cf7d340556f89197aab0f87f032c7b84eb8ddb24d9","impliedFormat":99},{"version":"cbfd5ef0c8fdb4983202252b5f5758a579f4500edc3b9ad413da60cffb5c3564","impliedFormat":99},"8b82e3b99961ab13e5b545e44b13757833bb31c29fb512355ae31a805f4b01e9",{"version":"76595c0e5a532556431fbda63e041df8a34902f4ed3404064d0f846bc19fa98d","impliedFormat":99},"c08c8201c9af9ad53f0862ba660faa1983396fc5535e7552df9a168a570d2603",{"version":"f014493efd0ebbeb7208c9c1287a888d1af91e3cfec0cb923bd6fa9edd03fd2b","impliedFormat":99},"96983a3e1ff56803da9560829089702d520b3166759f763c8a72c57f9211dc6a",{"version":"cc3738ba01d9af5ba1206a313896837ff8779791afcd9869e582783550f17f38","impliedFormat":99},"67aacdcdde8c5624b60a171c03e96ed1bd4fe01abe49e302de9a31d8b61c1a68",{"version":"0bf39ac9eae0cd32a07f6dcb872955c4249f887f806dd7b325641ce87a176e42","impliedFormat":99},"05be7c9e31a08216652e9a1aa3071cc5defd848d67ebb0c697c89020493127be",{"version":"caf4af98bf464ad3e10c46cf7d340556f89197aab0f87f032c7b84eb8ddb24d9","impliedFormat":99},{"version":"4a5aa16151dbec524bb043a5cbce2c3fec75957d175475c115a953aca53999a9","impliedFormat":99},"97bc0870eb9f5bf447aa4e9976428696c65aeb14d12b2f3e5d01156857ccfa9a",{"version":"e7c2f40dc99121500ad108a4f86541d29cac105ed018f994c7c5a2836e77b257","impliedFormat":1},{"version":"90e930283286ab117ab89f00589cf89ab5e9992bc57e79f303b36ee14649bdd9","impliedFormat":1},{"version":"6d48a6c907c668a6d6eda66acec4242e367c983e073100e35c1e234c424ad1a4","impliedFormat":1},{"version":"68a0e898d6c39160f1326ef922508914498c7a2d0b5a0d9222b7928d343214eb","impliedFormat":1},{"version":"69d96a8522b301a9e923ac4e42dd37fc942763740b183dffa3d51aca87f978d5","impliedFormat":1},{"version":"ff2fadad64868f1542a69edeadf5c5519e9c89e33bec267605298f8d172417c7","impliedFormat":1},{"version":"2866ae69517d6605a28d0c8d5dff4f15a0b876eeb8e5a1cbc51631d9c6793d3f","impliedFormat":1},{"version":"f8c4434aa8cbd4ede2a75cbc5532b6a12c9cac67c3095ed907e54f3f89d2e628","impliedFormat":1},{"version":"0b8adc0ae60a47acf65575952eee568b3d497f9975e3162f408052a99e65f488","impliedFormat":1},{"version":"ede9879d22f7ce68a8c99e455acab32fc45091c6eed9625549742b03e1f1ac1a","impliedFormat":1},{"version":"0e8c007c6e404da951c3d98a489ac0a3e9b6567648b997c03445ac69d7938c1c","impliedFormat":1},{"version":"f2a4866bed198a7c804b58ee39efe74c66ecdcf2dfebef0b9895d534a50790c4","impliedFormat":1},{"version":"ad72538d0c5e417ee6621e1b54691c274bcacaa1807c9895c5fa6d40b45fb631","impliedFormat":1},{"version":"4f851c59f3112702f6178e76204f839e3156daa98b5b7d7e3fc407a6c5764118","impliedFormat":1},{"version":"57511f723968d2f41dd2d55b9fbc5d0f3107af4e4227db0fb357c904bd34e690","impliedFormat":1},{"version":"9585df69c074d82dda33eadd6e5dccd164659f59b09bd5a0d25874770cf6042d","impliedFormat":1},{"version":"f6f6ce3e3718c2e7592e09d91c43b44318d47bca8ee353426252c694127f2dcb","impliedFormat":1},{"version":"4f70076586b8e194ef3d1b9679d626a9a61d449ba7e91dfc73cbe3904b538aa0","impliedFormat":1},{"version":"6d5838c172ff503ef37765b86019b80e3abe370105b2e1c4510d6098b0e84414","impliedFormat":1},{"version":"1876dac2baa902e2b7ebed5e03b95f338192dc03a6e4b0731733d675ba4048f3","impliedFormat":1},{"version":"8086407dd2a53ce700125037abf419bddcce43c14b3cf5ea3ac1ebded5cad011","impliedFormat":1},{"version":"c2501eb4c4e05c2d4de551a4bace9c28d06a0d89b228443f69eb3d7f9049fbd6","impliedFormat":1},{"version":"1829f790849d54ea3d736c61fdefd3237bede9c5784f4c15dfdafb7e0a9b8f63","impliedFormat":1},{"version":"5392feeda1bf0a1cc755f7339ea486b7a4d0d019774da8057ddc85347359ed63","impliedFormat":1},{"version":"c998117afca3af8432598c7e8d530d8376d0ca4871a34137db8caa1e94d94818","impliedFormat":1},{"version":"4e465f7e9a161a5a5248a18af79dbfbf06e8e1255bfdc8f63ab15475a2ba48bd","impliedFormat":1},{"version":"e0353c5070349846fe9835d782a8ce338d6d4172c603d14a6b364d6354957a4e","impliedFormat":1},{"version":"323133630008263f857a6d8350e36fb7f6e8d221ec0a425b075c20290570c020","impliedFormat":1},{"version":"c04e691d64b97e264ca4d000c287a53f2a75527556962cdbe3e8e2b301dac906","impliedFormat":1},{"version":"3733dba5107de9152f98da9bcb21bf6c91ac385f3b22f30ed08d0dc5e74c966f","impliedFormat":1},{"version":"d3ec922ddd9677696ee0552f10e95c4e59f85bb8c93fd76cd41b2dd93988ff39","impliedFormat":1},{"version":"0492c0d35e05c0fdd638980e02f3a7cdec18b311959fc730d85ed7e1d4ff38a7","impliedFormat":1},{"version":"c7122ba860d3497fa04a112d424ee88b50c482360042972bcf0917c5b82f4484","impliedFormat":1},{"version":"838f52090a0d39dce3c42e0ccb0db8db250c712c1fa2cd36799910c8f8a7f7bf","impliedFormat":1},{"version":"116ec624095373939de9edb03619916226f5e5b6e93cd761c4bda4efecb104fc","impliedFormat":1},{"version":"8e6b8259bfd8c8c3d6ed79349b7f2f69476d255aede2cd6c0acb0869ad8c6fdd","impliedFormat":1},"a5ce04be8f70d36437ffe0ebac76da00bc7bbe179312d6929b39caedad97b0f3","e4ed0d8ee6d0e099a35691eb183c843454bac72b272a838d2659b1b1ceb1712f","c9f87ebc2c074b0cacfab9c137c118502a255c3fc3b1415ba3d328f211718b3d","c12b3024d936143c04e1a30c162ac270dfc9d693a0cc16284f1c854c934f7988","4853961181d31279c0d6c7ad71ab900dee75906fd27c8b9a590e75524c22f21c","9162509c0d3551e6af08c5c77f0480621775b55cdddd18bf642265ddde9e9a99",{"version":"06d3bd1652d7a961bee709bce34b2cbcd6725ab7de8e0cbbb3353927a347a2b0","impliedFormat":99},{"version":"4166eb28a4170609b107205a614bfc6936bb18348e3d37408835cb9d49c4634d","impliedFormat":99},{"version":"e21552b6c0c6c1aa2edfb55d949511fa055b2d94ee60731cbc8e6a5d3edc63e9","impliedFormat":99},{"version":"61547fc99d5410765d51588931a1e910aaa76a452480795268345d461dec9b01","impliedFormat":99},{"version":"e71c443455caa4f5e047db65adf9e3a9d5d5c075ec348f52dcf749bf594aaab2","impliedFormat":99},{"version":"2cef84bf00cbdb452fdc5d8ecfe7b8c0aa3fa788bdc4ad8961e2e636530dbb60","impliedFormat":99},{"version":"24104650185414f379d5cc35c0e2c19f06684a73de5b472bae79e0d855771ecf","impliedFormat":99},{"version":"799003c0ab928582fca04977f47b8d85b43a8de610f4eef0ad2d069fbb9f9399","impliedFormat":99},{"version":"b13dd41c344a23e085f81b2f5cd96792e6b35ae814f32b25e39d9841844ad240","impliedFormat":99},{"version":"17d8b4e6416e48b6e23b73d05fd2fde407e2af8fddbe9da2a98ede14949c3489","impliedFormat":99},{"version":"6d17b2b41f874ab4369b8e04bdbe660163ea5c8239785c850f767370604959e3","impliedFormat":99},{"version":"04b4c044c8fe6af77b6c196a16c41e0f7d76b285d036d79dcaa6d92e24b4982b","impliedFormat":99},{"version":"30bdeead5293c1ddfaea4097d3e9dd5a6b0bc59a1e07ff4714ea1bbe7c5b2318","impliedFormat":99},{"version":"e7df226dcc1b0ce76b32f160556f3d1550124c894aae2d5f73cefaaf28df7779","impliedFormat":99},{"version":"f2b7eef5c46c61e6e72fba9afd7cc612a08c0c48ed44c3c5518559d8508146a2","impliedFormat":99},{"version":"00f0ba57e829398d10168b7db1e16217f87933e61bd8612b53a894bd7d6371da","impliedFormat":99},{"version":"126b20947d9fa74a88bb4e9281462bda05e529f90e22d08ee9f116a224291e84","impliedFormat":99},{"version":"40d9e43acee39702745eb5c641993978ac40f227475eacc99a83ba893ad995db","impliedFormat":99},{"version":"8a66b69b21c8de9cb88b4b6d12f655d5b7636e692a014c5aa1bd81745c8c51d5","impliedFormat":99},{"version":"ebbb846bdd5a78fdacff59ae04cea7a097912aeb1a2b34f8d88f4ebb84643069","impliedFormat":99},{"version":"7321adb29ffd637acb33ee67ea035f1a97d0aa0b14173291cc2fd58e93296e04","impliedFormat":99},{"version":"320816f1a4211188f07a782bdb6c1a44555b3e716ce13018f528ad7387108d5f","impliedFormat":99},{"version":"b2cc8a474b7657f4a03c67baf6bff75e26635fd4b5850675e8cad524a09ddd0c","impliedFormat":99},{"version":"0d081e9dc251063cc69611041c17d25847e8bdbe18164baaa89b7f1f1633c0ab","impliedFormat":99},{"version":"a64c25d8f4ec16339db49867ea2324e77060782993432a875d6e5e8608b0de1e","impliedFormat":99},{"version":"0739310b6b777f3e2baaf908c0fbc622c71160e6310eb93e0d820d86a52e2e23","impliedFormat":99},{"version":"37b32e4eadd8cd3c263e7ac1681c58b2ac54f3f77bb34c5e4326cc78516d55a9","impliedFormat":99},{"version":"9b7a8974e028c4ed6f7f9abb969e3eb224c069fd7f226e26fcc3a5b0e2a1eba8","impliedFormat":99},{"version":"e8100b569926a5592146ed68a0418109d625a045a94ed878a8c5152b1379237c","impliedFormat":99},{"version":"594201c616c318b7f3149a912abd8d6bdf338d765b7bcbde86bca2e66b144606","impliedFormat":99},{"version":"03e380975e047c5c6ded532cf8589e6cc85abb7be3629e1e4b0c9e703f2fd36f","impliedFormat":99},{"version":"fae14b53b7f52a8eb3274c67c11f261a58530969885599efe3df0277b48909e1","impliedFormat":99},{"version":"c41206757c428186f2e0d1fd373915c823504c249336bdc9a9c9bbdf9da95fef","impliedFormat":99},{"version":"e961f853b7b0111c42b763a6aa46fc70d06a697db3d8ed69b38f7ba0ae42a62b","impliedFormat":99},{"version":"3db90f79e36bcb60b3f8de1bc60321026800979c150e5615047d598c787a64b7","impliedFormat":99},{"version":"639b6fb3afbb8f6067c1564af2bd284c3e883f0f1556d59bd5eb87cdbbdd8486","impliedFormat":99},{"version":"49795f5478cb607fd5965aa337135a8e7fd1c58bc40c0b6db726adf186dd403f","impliedFormat":99},{"version":"7d8890e6e2e4e215959e71d5b5bd49482cf7a23be68d48ea446601a4c99bd511","impliedFormat":99},{"version":"d56f72c4bb518de5702b8b6ae3d3c3045c99e0fd48b3d3b54c653693a8378017","impliedFormat":99},{"version":"4c9ac40163e4265b5750510d6d2933fb7b39023eed69f7b7c68b540ad960826e","impliedFormat":99},{"version":"8dfab17cf48e7be6e023c438a9cdf6d15a9b4d2fa976c26e223ba40c53eb8da8","impliedFormat":99},{"version":"38bdf7ccacfd8e418de3a7b1e3cecc29b5625f90abc2fa4ac7843a290f3bf555","impliedFormat":99},{"version":"9819e46a914735211fbc04b8dc6ba65152c62e3a329ca0601a46ba6e05b2c897","impliedFormat":99},{"version":"50f0dc9a42931fb5d65cdd64ba0f7b378aedd36e0cfca988aa4109aad5e714cb","impliedFormat":99},{"version":"894f23066f9fafccc6e2dd006ed5bd85f3b913de90f17cf1fe15a2eb677fd603","impliedFormat":99},{"version":"abdf39173867e6c2d6045f120a316de451bbb6351a6929546b8470ddf2e4b3b9","impliedFormat":99},{"version":"aa2cb4053f948fbd606228195bbe44d78733861b6f7204558bbee603202ee440","impliedFormat":99},{"version":"6911b41bfe9942ac59c2da1bbcbe5c3c1f4e510bf65cae89ed00f434cc588860","impliedFormat":99},{"version":"7b81bc4d4e2c764e85d869a8dd9fe3652b34b45c065482ac94ffaacc642b2507","impliedFormat":99},{"version":"895df4edb46ccdcbce2ec982f5eed292cf7ea3f7168f1efea738ee346feab273","impliedFormat":99},{"version":"8692bb1a4799eda7b2e3288a6646519d4cebb9a0bddf800085fc1bd8076997a0","impliedFormat":99},{"version":"239c9e98547fe99711b01a0293f8a1a776fc10330094aa261f3970aaba957c82","impliedFormat":99},{"version":"34833ec50360a32efdc12780ae624e9a710dd1fd7013b58c540abf856b54285a","impliedFormat":99},{"version":"647538e4007dcc351a8882067310a0835b5bb8559d1cfa5f378e929bceb2e64d","impliedFormat":99},{"version":"992d6b1abcc9b6092e5a574d51d441238566b6461ade5de53cb9718e4f27da46","impliedFormat":99},{"version":"938702305649bf1050bd79f3803cf5cc2904596fc1edd4e3b91033184eae5c54","impliedFormat":99},{"version":"1e931d3c367d4b96fe043e792196d9c2cf74f672ff9c0b894be54e000280a79d","impliedFormat":99},{"version":"05bec322ea9f6eb9efcd6458bb47087e55bd688afdd232b78379eb5d526816ed","impliedFormat":99},{"version":"4c449a874c2d2e5e5bc508e6aa98f3140218e78c585597a21a508a647acd780a","impliedFormat":99},{"version":"dae15e326140a633d7693e92b1af63274f7295ea94fb7c322d5cbe3f5e48be88","impliedFormat":99},{"version":"c2b0a869713bca307e58d81d1d1f4b99ebfc7ec8b8f17e80dde40739aa8a2bc6","impliedFormat":99},{"version":"6e4b4ff6c7c54fa9c6022e88f2f3e675eac3c6923143eb8b9139150f09074049","impliedFormat":99},{"version":"69559172a9a97bbe34a32bff8c24ef1d8c8063feb5f16a6d3407833b7ee504cf","impliedFormat":99},{"version":"86b94a2a3edcb78d9bfcdb3b382547d47cb017e71abe770c9ee8721e9c84857f","impliedFormat":99},{"version":"e3fafafda82853c45c0afc075fea1eaf0df373a06daf6e6c7f382f9f61b2deb3","impliedFormat":99},{"version":"a4ba4b31de9e9140bc49c0addddbfaf96b943a7956a46d45f894822e12bf5560","impliedFormat":99},{"version":"d8a7926fc75f2ed887f17bae732ee31a4064b8a95a406c87e430c58578ee1f67","impliedFormat":99},{"version":"9886ffbb134b0a0059fd82219eba2a75f8af341d98bc6331b6ef8a921e10ec68","impliedFormat":99},{"version":"c2ead057b70d0ae7b87a771461a6222ebdb187ba6f300c974768b0ae5966d10e","impliedFormat":99},{"version":"46687d985aed8485ab2c71085f82fafb11e69e82e8552cf5d3849c00e64a00a5","impliedFormat":99},{"version":"999ca66d4b5e2790b656e0a7ce42267737577fc7a52b891e97644ec418eff7ec","impliedFormat":99},{"version":"ec948ee7e92d0888f92d4a490fdd0afb27fbf6d7aabebe2347a3e8ac82c36db9","impliedFormat":99},{"version":"03ef2386c683707ce741a1c30cb126e8c51a908aa0acc01c3471fafb9baaacd5","impliedFormat":99},{"version":"66a372e03c41d2d5e920df5282dadcec2acae4c629cb51cab850825d2a144cea","impliedFormat":99},{"version":"ddf9b157bd4c06c2e4646c9f034f36267a0fbd028bd4738214709de7ea7c548b","impliedFormat":99},{"version":"3e795aac9be23d4ad9781c00b153e7603be580602e40e5228e2dafe8a8e3aba1","impliedFormat":99},{"version":"98c461ec5953dfb1b5d5bca5fee0833c8a932383b9e651ca6548e55f1e2c71c3","impliedFormat":99},{"version":"5c42107b46cb1d36b6f1dee268df125e930b81f9b47b5fa0b7a5f2a42d556c10","impliedFormat":99},{"version":"7e32f1251d1e986e9dd98b6ff25f62c06445301b94aeebdf1f4296dbd2b8652f","impliedFormat":99},{"version":"2f7e328dda700dcb2b72db0f58c652ae926913de27391bd11505fc5e9aae6c33","impliedFormat":99},{"version":"3de7190e4d37da0c316db53a8a60096dbcd06d1a50677ccf11d182fa26882080","impliedFormat":99},{"version":"a9d6f87e59b32b02c861aade3f4477d7277c30d43939462b93f48644fa548c58","impliedFormat":99},{"version":"2bce8fd2d16a9432110bbe0ba1e663fd02f7d8b8968cd10178ea7bc306c4a5df","impliedFormat":99},{"version":"798bedbf45a8f1e55594e6879cd46023e8767757ecce1d3feaa78d16ad728703","impliedFormat":99},{"version":"62723d5ac66f7ed6885a3931dd5cfa017797e73000d590492988a944832e8bc2","impliedFormat":99},{"version":"03db8e7df7514bf17fc729c87fff56ca99567b9aa50821f544587a666537c233","impliedFormat":99},{"version":"9b1f311ba4409968b68bf20b5d892dbd3c5b1d65c673d5841c7dbde351bc0d0b","impliedFormat":99},{"version":"2d1e8b5431502739fe335ceec0aaded030b0f918e758a5d76f61effa0965b189","impliedFormat":99},{"version":"e725839b8f884dab141b42e9d7ff5659212f6e1d7b4054caa23bc719a4629071","impliedFormat":99},{"version":"4fa38a0b8ae02507f966675d0a7d230ed67c92ab8b5736d99a16c5fbe2b42036","impliedFormat":99},{"version":"50ec1e8c23bad160ddedf8debeebc722becbddda127b8fdce06c23eacd3fe689","impliedFormat":99},{"version":"9a0aea3a113064fd607f41375ade308c035911d3c8af5ae9db89593b5ca9f1f9","impliedFormat":99},{"version":"8d643903b58a0bf739ce4e6a8b0e5fb3fbdfaacbae50581b90803934b27d5b89","impliedFormat":99},{"version":"19de2915ccebc0a1482c2337b34cb178d446def2493bf775c4018a4ea355adb8","impliedFormat":99},{"version":"9be8fc03c8b5392cd17d40fd61063d73f08d0ee3457ecf075dcb3768ae1427bd","impliedFormat":99},{"version":"a2d89a8dc5a993514ca79585039eea083a56822b1d9b9d9d85b14232e4782cbe","impliedFormat":99},{"version":"f526f20cae73f17e8f38905de4c3765287575c9c4d9ecacee41cfda8c887da5b","impliedFormat":99},{"version":"d9ec0978b7023612b9b83a71fee8972e290d02f8ff894e95cdd732cd0213b070","impliedFormat":99},{"version":"7ab10c473a058ec8ac4790b05cae6f3a86c56be9b0c0a897771d428a2a48a9f9","impliedFormat":99},{"version":"451d7a93f8249d2e1453b495b13805e58f47784ef2131061821b0e456a9fd0e1","impliedFormat":99},{"version":"21c56fe515d227ed4943f275a8b242d884046001722a4ba81f342a08dbe74ae2","impliedFormat":99},{"version":"d8311f0c39381aa1825081c921efde36e618c5cf46258c351633342a11601208","impliedFormat":99},{"version":"6b50c3bcc92dc417047740810596fcb2df2502aa3f280c9e7827e87896da168a","impliedFormat":99},{"version":"18a6b318d1e7b31e5749a52be0cf9bbce1b275f63190ef32e2c79db0579328ca","impliedFormat":99},{"version":"6a2d0af2c27b993aa85414f3759898502aa198301bc58b0d410948fe908b07b0","impliedFormat":99},{"version":"2da11b6f5c374300e5e66a6b01c3c78ec21b5d3fec0748a28cc28e00be73e006","impliedFormat":99},{"version":"0729691b39c24d222f0b854776b00530877217bfc30aac1dc7fa2f4b1795c536","impliedFormat":99},{"version":"ca45bb5c98c474d669f0e47615e4a5ae65d90a2e78531fda7862ee43e687a059","impliedFormat":99},{"version":"c1c058b91d5b9a24c95a51aea814b0ad4185f411c38ac1d5eef0bf3cebec17dc","impliedFormat":99},{"version":"3ab0ed4060b8e5b5e594138aab3e7f0262d68ad671d6678bcda51568d4fc4ccc","impliedFormat":99},{"version":"e2bf1faba4ff10a6020c41df276411f641d3fdce5c6bae1db0ec84a0bf042106","impliedFormat":99},{"version":"80b0a8fe14d47a71e23d7c3d4dcee9584d4282ef1d843b70cab1a42a4ea1588c","impliedFormat":99},{"version":"a0f02a73f6e3de48168d14abe33bf5970fdacdb52d7c574e908e75ad571e78f7","impliedFormat":99},{"version":"c728002a759d8ec6bccb10eed56184e86aeff0a762c1555b62b5d0fa9d1f7d64","impliedFormat":99},{"version":"586f94e07a295f3d02f847f9e0e47dbf14c16e04ccc172b011b3f4774a28aaea","impliedFormat":99},{"version":"cfe1a0f4ed2df36a2c65ea6bc235dbb8cf6e6c25feb6629989f1fa51210b32e7","impliedFormat":99},{"version":"8ba69c9bf6de79c177329451ffde48ddab7ec495410b86972ded226552f664df","impliedFormat":99},{"version":"15111cbe020f8802ad1d150524f974a5251f53d2fe10eb55675f9df1e82dbb62","impliedFormat":99},{"version":"782dc153c56a99c9ed07b2f6f497d8ad2747764966876dbfef32f3e27ce11421","impliedFormat":99},{"version":"cc2db30c3d8bb7feb53a9c9ff9b0b859dd5e04c83d678680930b5594b2bf99cb","impliedFormat":99},{"version":"46909b8c85a6fd52e0807d18045da0991e3bdc7373435794a6ba425bc23cc6be","impliedFormat":99},{"version":"e4e511ff63bb6bd69a2a51e472c6044298bca2c27835a34a20827bc3ef9b7d13","impliedFormat":99},{"version":"2c86f279d7db3c024de0f21cd9c8c2c972972f842357016bfbbd86955723b223","impliedFormat":99},{"version":"112c895cff9554cf754f928477c7d58a21191c8089bffbf6905c87fe2dc6054f","impliedFormat":99},{"version":"8cfc293b33082003cacbf7856b8b5e2d6dd3bde46abbd575b0c935dc83af4844","impliedFormat":99},{"version":"d2c5c53f85ce0474b3a876d76c4fc44ff7bb766b14ed1bf495f9abac181d7f5f","impliedFormat":99},{"version":"3c523f27926905fcbe20b8301a0cc2da317f3f9aea2273f8fc8d9ae88b524819","impliedFormat":99},{"version":"9ca0d706f6b039cc52552323aeccb4db72e600b67ddc7a54cebc095fc6f35539","impliedFormat":99},{"version":"a64909a9f75081342ddd061f8c6b49decf0d28051bc78e698d347bdcb9746577","impliedFormat":99},{"version":"7d8d55ae58766d0d52033eae73084c4db6a93c4630a3e17f419dd8a0b2a4dcd8","impliedFormat":99},{"version":"b8b5c8ba972d9ffff313b3c8a3321e7c14523fc58173862187e8d1cb814168ac","impliedFormat":99},{"version":"9c42c0fa76ee36cf9cc7cc34b1389fbb4bd49033ec124b93674ec635fabf7ffe","impliedFormat":99},{"version":"6184c8da9d8107e3e67c0b99dedb5d2dfe5ccf6dfea55c2a71d4037caf8ca196","impliedFormat":99},{"version":"4030ceea7bf41449c1b86478b786e3b7eadd13dfe5a4f8f5fe2eb359260e08b3","impliedFormat":99},{"version":"7bf516ec5dfc60e97a5bde32a6b73d772bd9de24a2e0ec91d83138d39ac83d04","impliedFormat":99},{"version":"e6a6fb3e6525f84edf42ba92e261240d4efead3093aca3d6eb1799d5942ba393","impliedFormat":99},{"version":"45df74648934f97d26800262e9b2af2f77ef7191d4a5c2eb1df0062f55e77891","impliedFormat":99},{"version":"3fe361e4e567f32a53af1f2c67ad62d958e3d264e974b0a8763d174102fe3b29","impliedFormat":99},{"version":"28b520acee4bc6911bfe458d1ad3ebc455fa23678463f59946ad97a327c9ab2b","impliedFormat":99},{"version":"121b39b1a9ad5d23ed1076b0db2fe326025150ef476dccb8bf87778fcc4f6dd7","impliedFormat":99},{"version":"f791f92a060b52aa043dde44eb60307938f18d4c7ac13df1b52c82a1e658953f","impliedFormat":99},{"version":"df09443e7743fd6adc7eb108e760084bacdf5914403b7aac5fbd4dc4e24e0c2c","impliedFormat":99},{"version":"eeb4ff4aa06956083eaa2aad59070361c20254b865d986bc997ee345dbd44cbb","impliedFormat":99},{"version":"ed84d5043444d51e1e5908f664addc4472c227b9da8401f13daa565f23624b6e","impliedFormat":99},{"version":"146bf888b703d8baa825f3f2fb1b7b31bda5dff803e15973d9636cdda33f4af3","impliedFormat":99},{"version":"b4ec8b7a8d23bdf7e1c31e43e5beac3209deb7571d2ccf2a9572865bf242da7c","impliedFormat":99},{"version":"3fba0d61d172091638e56fba651aa1f8a8500aac02147d29bd5a9cc0bc8f9ec2","impliedFormat":99},{"version":"a5a57deb0351b03041e0a1448d3a0cc5558c48e0ed9b79b69c99163cdca64ad8","impliedFormat":99},{"version":"9bcecf0cbc2bfc17e33199864c19549905309a0f9ecc37871146107aac6e05ae","impliedFormat":99},{"version":"d6a211db4b4a821e93c978add57e484f2a003142a6aef9dbfa1fe990c66f337b","impliedFormat":99},{"version":"bd4d10bd44ce3f630dd9ce44f102422cb2814ead5711955aa537a52c8d2cae14","impliedFormat":99},{"version":"08e4c39ab1e52eea1e528ee597170480405716bae92ebe7a7c529f490afff1e0","impliedFormat":99},{"version":"625bb2bc3867557ea7912bd4581288a9fca4f3423b8dffa1d9ed57fafc8610e3","impliedFormat":99},{"version":"d1992164ecc334257e0bef56b1fd7e3e1cea649c70c64ffc39999bb480c0ecdf","impliedFormat":99},{"version":"a53ff2c4037481eb357e33b85e0d78e8236e285b6428b93aa286ceea1db2f5dc","impliedFormat":99},{"version":"4fe608d524954b6857d78857efce623852fcb0c155f010710656f9db86e973a5","impliedFormat":99},{"version":"b53b62a9838d3f57b70cc456093662302abb9962e5555f5def046172a4fe0d4e","impliedFormat":99},{"version":"9866369eb72b6e77be2a92589c9df9be1232a1a66e96736170819e8a1297b61f","impliedFormat":99},{"version":"43abfbdf4e297868d780b8f4cfdd8b781b90ecd9f588b05e845192146a86df34","impliedFormat":99},{"version":"582419791241fb851403ae4a08d0712a63d4c94787524a7419c2bc8e0eb1b031","impliedFormat":99},{"version":"18437eeb932fe48590b15f404090db0ab3b32d58f831d5ffc157f63b04885ee5","impliedFormat":99},{"version":"0c5eaedf622d7a8150f5c2ec1f79ac3d51eea1966b0b3e61bfdea35e8ca213a7","impliedFormat":99},{"version":"fac39fc7a9367c0246de3543a6ee866a0cf2e4c3a8f64641461c9f2dac0d8aae","impliedFormat":99},{"version":"3b9f559d0200134f3c196168630997caedeadc6733523c8b6076a09615d5dec8","impliedFormat":99},{"version":"932af64286d9723da5ef7b77a0c4229829ce8e085e6bcc5f874cb0b83e8310d4","impliedFormat":99},{"version":"adeb9278f11f5561157feee565171c72fd48f5fe34ed06f71abf24e561fcaa1e","impliedFormat":99},{"version":"2269fef79b4900fc6b08c840260622ca33524771ff24fda5b9101ad98ea551f3","impliedFormat":99},{"version":"73d47498a1b73d5392d40fb42a3e7b009ae900c8423f4088c4faa663cc508886","impliedFormat":99},{"version":"7efc34cdc4da0968c3ba687bc780d5cacde561915577d8d1c1e46c7ac931d023","impliedFormat":99},{"version":"3c20a3bb0c50c819419f44aa55acc58476dad4754a16884cef06012d02b0722f","impliedFormat":99},{"version":"4569abf6bc7d51a455503670f3f1c0e9b4f8632a3b030e0794c61bfbba2d13be","impliedFormat":99},{"version":"98b2297b4dc1404078a54b61758d8643e4c1d7830af724f3ed2445d77a7a2d57","impliedFormat":99},{"version":"952ba89d75f1b589e07070fea2d8174332e3028752e76fd46e1c16cc51e6e2af","impliedFormat":99},{"version":"b6c9a2deefb6a57ff68d2a38d33c34407b9939487fc9ee9f32ba3ecf2987a88a","impliedFormat":99},{"version":"f6b371377bab3018dac2bca63e27502ecbd5d06f708ad7e312658d3b5315d948","impliedFormat":99},{"version":"31947dd8f1c8eeb7841e1f139a493a73bd520f90e59a6415375d0d8e6a031f01","impliedFormat":99},{"version":"95cd83b807e10b1af408e62caf5fea98562221e8ddca9d7ccc053d482283ddda","impliedFormat":99},{"version":"19287d6b76288c2814f1633bdd68d2b76748757ffd355e73e41151644e4773d6","impliedFormat":99},{"version":"fc4e6ec7dade5f9d422b153c5d8f6ad074bd9cc4e280415b7dc58fb5c52b5df1","impliedFormat":99},{"version":"3aea973106e1184db82d8880f0ca134388b6cbc420f7309d1c8947b842886349","impliedFormat":99},{"version":"765e278c464923da94dda7c2b281ece92f58981642421ae097862effe2bd30fa","impliedFormat":99},{"version":"de260bed7f7d25593f59e859bd7c7f8c6e6bb87e8686a0fcafa3774cb5ca02d8","impliedFormat":99},{"version":"b5c341ce978f5777fbe05bc86f65e9906a492fa6b327bda3c6aae900c22e76c6","impliedFormat":99},{"version":"686ddbfaf88f06b02c6324005042f85317187866ca0f8f4c9584dd9479653344","impliedFormat":99},{"version":"7f789c0c1db29dd3aab6e159d1ba82894a046bf8df595ac48385931ae6ad83e0","impliedFormat":99},{"version":"8eb3057d4fe9b59b2492921b73a795a2455ebe94ccb3d01027a7866612ead137","impliedFormat":99},{"version":"1e43c5d7aee1c5ec20611e28b5417f5840c75d048de9d7f1800d6808499236f8","impliedFormat":99},{"version":"d42610a5a2bee4b71769968a24878885c9910cd049569daa2d2ee94208b3a7a5","impliedFormat":99},{"version":"f6ed95506a6ed2d40ed5425747529befaa4c35fcbbc1e0d793813f6d725690fa","impliedFormat":99},{"version":"a6fcc1cd6583939506c906dff1276e7ebdc38fbe12d3e108ba38ad231bd18d97","impliedFormat":99},{"version":"ed13354f0d96fb6d5878655b1fead51722b54875e91d5e53ef16de5b71a0e278","impliedFormat":99},{"version":"1193b4872c1fb65769d8b164ca48124c7ebacc33eae03abf52087c2b29e8c46c","impliedFormat":99},{"version":"af682dfabe85688289b420d939020a10eb61f0120e393d53c127f1968b3e9f66","impliedFormat":99},{"version":"0dca04006bf13f72240c6a6a502df9c0b49c41c3cab2be75e81e9b592dcd4ea8","impliedFormat":99},{"version":"79d6ac4a2a229047259116688f9cd62fda25422dee3ad304f77d7e9af53a41ef","impliedFormat":99},{"version":"64534c17173990dc4c3d9388d16675a059aac407031cfce8f7fdffa4ee2de988","impliedFormat":99},{"version":"ba46d160a192639f3ca9e5b640b870b1263f24ac77b6895ab42960937b42dcbb","impliedFormat":99},{"version":"5e5ddd6fc5b590190dde881974ab969455e7fad61012e32423415ae3d085b037","impliedFormat":99},{"version":"1c16fd00c42b60b96fe0fa62113a953af58ddf0d93b0a49cb4919cf5644616f0","impliedFormat":99},{"version":"eb240c0e6b412c57f7d9a9f1c6cd933642a929837c807b179a818f6e8d3a4e44","impliedFormat":99},{"version":"4a7bde5a1155107fc7d9483b8830099f1a6072b6afda5b78d91eb5d6549b3956","impliedFormat":99},{"version":"3c1baaffa9a24cc7ef9eea6b64742394498e0616b127ca630aca0e11e3298006","impliedFormat":99},{"version":"87ca1c31a326c898fa3feb99ec10750d775e1c84dbb7c4b37252bcf3742c7b21","impliedFormat":99},{"version":"d7bd26af1f5457f037225602035c2d7e876b80d02663ab4ca644099ad3a55888","impliedFormat":99},{"version":"2ad0a6b93e84a56b64f92f36a07de7ebcb910822f9a72ad22df5f5d642aff6f3","impliedFormat":99},{"version":"523d1775135260f53f672264937ee0f3dc42a92a39de8bee6c48c7ea60b50b5a","impliedFormat":99},{"version":"e441b9eebbc1284e5d995d99b53ed520b76a87cab512286651c4612d86cd408e","impliedFormat":99},{"version":"76f853ee21425c339a79d28e0859d74f2e53dee2e4919edafff6883dd7b7a80f","impliedFormat":99},{"version":"00cf042cd6ba1915648c8d6d2aa00e63bbbc300ea54d28ed087185f0f662e080","impliedFormat":99},{"version":"f57e6707d035ab89a03797d34faef37deefd3dd90aa17d90de2f33dce46a2c56","impliedFormat":99},{"version":"cc8b559b2cf9380ca72922c64576a43f000275c72042b2af2415ce0fb88d7077","impliedFormat":99},{"version":"1a337ca294c428ba8f2eb01e887b28d080ee4a4307ae87e02e468b1d26af4a74","impliedFormat":99},{"version":"5a15362fc2e72765a908c0d4dd89e3ab3b763e8bc8c23f19234a709ecfd202fe","impliedFormat":99},{"version":"2dffdfe62ac8af0943853234519616db6fd8958fc7ff631149fd8364e663f361","impliedFormat":99},{"version":"5dbdb2b2229b5547d8177c34705272da5a10b8d0033c49efbc9f6efba5e617f2","impliedFormat":99},{"version":"6fc0498cd8823d139004baff830343c9a0d210c687b2402c1384fb40f0aa461c","impliedFormat":99},{"version":"8492306a4864a1dc6fc7e0cc0de0ae9279cbd37f3aae3e9dc1065afcdc83dddc","impliedFormat":99},{"version":"c011b378127497d6337a93f020a05f726db2c30d55dc56d20e6a5090f05919a6","impliedFormat":99},{"version":"f4556979e95a274687ae206bbab2bb9a71c3ad923b92df241d9ab88c184b3f40","impliedFormat":99},{"version":"50e82bb6e238db008b5beba16d733b77e8b2a933c9152d1019cf8096845171a4","impliedFormat":99},{"version":"d6011f8b8bbf5163ef1e73588e64a53e8bf1f13533c375ec53e631aad95f1375","impliedFormat":99},{"version":"693cd7936ac7acfa026d4bcb5801fce71cec49835ba45c67af1ef90dbfd30af7","impliedFormat":99},{"version":"195e2cf684ecddfc1f6420564535d7c469f9611ce7a380d6e191811f84556cd2","impliedFormat":99},{"version":"1dc6b6e7b2a7f2962f31c77f4713f3a5a132bbe14c00db75d557568fe82e4311","impliedFormat":99},{"version":"add93b1180e9aaac2dae4ef3b16f7655893e2ecbe62bd9e48366c305f0063d89","impliedFormat":99},{"version":"594bd896fe37c970aafb7a376ebeec4c0d636b62a5f611e2e27d30fb839ad8a5","impliedFormat":99},{"version":"b1c6a6faf60542ba4b4271db045d7faea56e143b326ef507d2797815250f3afc","impliedFormat":99},{"version":"8c8b165beb794260f462679329b131419e9f5f35212de11c4d53e6d4d9cbedf6","impliedFormat":99},{"version":"ee5a4cf57d49fcf977249ab73c690a59995997c4672bb73fcaaf2eed65dbd1b2","impliedFormat":99},{"version":"f9f36051f138ab1c40b76b230c2a12b3ce6e1271179f4508da06a959f8bee4c1","impliedFormat":99},{"version":"9dc2011a3573d271a45c12656326530c0930f92539accbec3531d65131a14a14","impliedFormat":99},{"version":"091521ce3ede6747f784ae6f68ad2ea86bbda76b59d2bf678bcad2f9d141f629","impliedFormat":99},{"version":"202c2be951f53bafe943fb2c8d1245e35ed0e4dfed89f48c9a948e4d186dd6d4","impliedFormat":99},{"version":"c618aead1d799dbf4f5b28df5a6b9ce13d72722000a0ec3fe90a8115b1ea9226","impliedFormat":99},{"version":"9b0bf59708549c3e77fddd36530b95b55419414f88bbe5893f7bc8b534617973","impliedFormat":99},{"version":"7e216f67c4886f1bde564fb4eebdd6b185f262fe85ad1d6128cad9b229b10354","impliedFormat":99},{"version":"cd51e60b96b4d43698df74a665aa7a16604488193de86aa60ec0c44d9f114951","impliedFormat":99},{"version":"b63341fb6c7ba6f2aeabd9fc46b43e6cc2d2b9eec06534cfd583d9709f310ec2","impliedFormat":99},{"version":"be2af50c81b15bcfe54ad60f53eb1c72dae681c72d0a9dce1967825e1b5830a3","impliedFormat":99},{"version":"be5366845dfb9726f05005331b9b9645f237f1ddc594c0def851208e8b7d297b","impliedFormat":99},{"version":"5ddd536aaeadd4bf0f020492b3788ed209a7050ce27abec4e01c7563ff65da81","impliedFormat":99},{"version":"e243b24da119c1ef0d79af2a45217e50682b139cb48e7607efd66cc01bd9dcda","impliedFormat":99},{"version":"5b1398c8257fd180d0bf62e999fe0a89751c641e87089a83b24392efda720476","impliedFormat":99},{"version":"1588b1359f8507a16dbef67cd2759965fc2e8d305e5b3eb71be5aa9506277dff","impliedFormat":99},{"version":"4c99f2524eee1ec81356e2b4f67047a4b7efaf145f1c4eb530cd358c36784423","impliedFormat":99},{"version":"b30c6b9f6f30c35d6ef84daed1c3781e367f4360171b90598c02468b0db2fc3d","impliedFormat":99},{"version":"79c0d32274ccfd45fae74ac61d17a2be27aea74c70806d22c43fc625b7e9f12a","impliedFormat":99},{"version":"1b7e3958f668063c9d24ac75279f3e610755b0f49b1c02bb3b1c232deb958f54","impliedFormat":99},{"version":"779d4022c3d0a4df070f94858a33d9ebf54af3664754536c4ce9fd37c6f4a8db","impliedFormat":99},{"version":"e662f063d46aa8c088edffdf1d96cb13d9a2cbf06bc38dc6fc62b4d125fb7b49","impliedFormat":99},{"version":"d1d612df1e41c90d9678b07740d13d4f8e6acec2f17390d4ff4be5c889a6d37d","impliedFormat":99},{"version":"c95933fe140918892d569186f17b70ef6b1162f851a0f13f6a89e8f4d599c5a1","impliedFormat":99},{"version":"1d8d30677f87c13c2786980a80750ac1e281bdb65aa013ea193766fe9f0edd74","impliedFormat":99},{"version":"4661673cbc984b8a6ee5e14875a71ed529b64e7f8e347e12c0db4cecc25ad67d","impliedFormat":99},{"version":"7f980a414274f0f23658baa9a16e21d828535f9eac538e2eab2bb965325841db","impliedFormat":99},{"version":"20fb747a339d3c1d4a032a31881d0c65695f8167575e01f222df98791a65da9b","impliedFormat":99},{"version":"dd4e7ebd3f205a11becf1157422f98db675a626243d2fbd123b8b93efe5fb505","impliedFormat":99},{"version":"43ec6b74c8d31e88bb6947bb256ad78e5c6c435cbbbad991c3ff39315b1a3dba","impliedFormat":99},{"version":"b27242dd3af2a5548d0c7231db7da63d6373636d6c4e72d9b616adaa2acef7e1","impliedFormat":99},{"version":"e0ee7ba0571b83c53a3d6ec761cf391e7128d8f8f590f8832c28661b73c21b68","impliedFormat":99},{"version":"072bfd97fc61c894ef260723f43a416d49ebd8b703696f647c8322671c598873","impliedFormat":99},{"version":"e70875232f5d5528f1650dd6f5c94a5bed344ecf04bdbb998f7f78a3c1317d02","impliedFormat":99},{"version":"8e495129cb6cd8008de6f4ff8ce34fe1302a9e0dcff8d13714bd5593be3f7898","impliedFormat":99},"012555e5b75541aac1520058fe4c99203274bf5dc44cea5aa0a4ee654f21ce99",{"version":"380b919bfa0516118edaf25b99e45f855e7bc3fd75ce4163a1cfe4a666388804","impliedFormat":1},{"version":"0b24a72109c8dd1b41f94abfe1bb296ba01b3734b8ac632db2c48ffc5dccaf01","impliedFormat":1},{"version":"fcf79300e5257a23ed3bacaa6861d7c645139c6f7ece134d15e6669447e5e6db","impliedFormat":1},{"version":"187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","impliedFormat":1},{"version":"aa2c18a1b5a086bbcaae10a4efba409cc95ba7287d8cf8f2591b53704fea3dea","impliedFormat":1},{"version":"b88749bdb18fc1398370e33aa72bc4f88274118f4960e61ce26605f9b33c5ba2","impliedFormat":1},{"version":"0aaef8cded245bf5036a7a40b65622dd6c4da71f7a35343112edbe112b348a1e","impliedFormat":1},{"version":"00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","impliedFormat":1},{"version":"a873c50d3e47c21aa09fbe1e2023d9a44efb07cc0cb8c72f418bf301b0771fd3","impliedFormat":1},{"version":"7c14ccd2eaa82619fffc1bfa877eb68a012e9fb723d07ee98db451fadb618906","impliedFormat":1},{"version":"49c36529ee09ea9ce19525af5bb84985ea8e782cb7ee8c493d9e36d027a3d019","impliedFormat":1},{"version":"df996e25faa505f85aeb294d15ebe61b399cf1d1e49959cdfaf2cc0815c203f9","impliedFormat":1},{"version":"4f6a12044ee6f458db11964153830abbc499e73d065c51c329ec97407f4b13dd","impliedFormat":1},{"version":"b6f9de62790db96554ad17ff5ff2b37e18e9eecca311430bb200b8318e282113","impliedFormat":1},"f6a725cc8537e7583ee5a6fb2dff7f90ea07c2e5a7170bbddec94f7f81293115","0df0bfd50229b02fd3631b994bd61f6ec3c8ccece553fccab2d436b053682791","ae643dc6df263acf1431a5377e0e6b370593d72d19661f818b4f220dba1fd219","d12029a3d5cbaa16d3c7fb68fe869d0fc0f4f99ac58ee36e79ac8ac7534aa557","dae0e0538a0b7a3064bd94db5e64828df9237f6f268d6c7422981c18d1baf058","c9317ed36b8715278c5e47e96ba1ee9d0cc77f10ab1af497298a8d0b41e45c99","e09ff19bc6c48126f6c249eb1405e5f0353db155d9681dbdd6104c7e2323b3e5","6718d3b8b39d98f0f194aea11062b6ae7bffbb95f7e88343cdbb73aff251ba6f","6577f8bb3a751ca1877e9bf4227285645e01bbd0b64bead48cd4bf28a1518d3f","bfe4cb7f2679da16d6f075ca74bd8df5d9cc759a65102682720104de30ab2227","4f522ea0eadcc2e87e49e9c93bca5df098a8995f3c5a9c79818a5d8855210b59","ca0c7a6230ea44b8afd056aafb7feca5cc32c034e92153aebecc4cec8bf42fed","b810200a55c79e7944a4b0dd51faede3a985495cf069a0acc1a4a4ac88bb0ed5","be91886027b9f0590199c4b46a6f4a60e87413a97d0b47112e750ece7a5201e7","91b9fde4e7ac84b86a0b3a94a6474af02d0cde889759e7428a9dcb5a2dd544e5","12854dd1283b488fa921b78b79ed27e6f3888ba1a4b883df786cdadd75dabfc5","aedcefffa0bf31e76be95e5b760e8eb2adeb2a6788fdd3d1d455ef09f7341e61","9f8f62975f929e67a8bfa95479595e42794a6fb37127ffcfc00408d10b0a8589","4397b9bc5870ce13629018a7da72b202ed16fe59667aef568ae62375f3dbab0d","f3c3997c6b25d26a2c32b64c3947d2f32e3fe873d5dbfb9f92bb5b6861639b81","4a2b8da206e1ce08ffb4ca6fc78acfdccb172c59c6b0ec1aefbb1eda03ee0f9a","1028744c310147a83c61d13c193fae6521a172244edc898e3c1fa6d95ff4c2b0","b822527ffce47c854aa5da96d8e474f758e40dc7ec05449cb0049bcbc02ca5fa","1d70e34afe04074e8b17d06307948b1bc7aed5c0590a088c8dbca11ceaee4801","cfff0b8d0e821e89ede8c3245c54ced4e9e3f9e5a4a19ab4dee7d5408ecd583c","9a2739ed2ad71c62465dbab36d2e70e96be27d4ba8364a674144a0f0d186b05f","57237dabb48b2b9364962ee7cc01ba437e40d4261601fe9743ab5d24da852edd","debd13bab86cfe44bbaf24bbc24ae69aa924bb51c90d4b1957dbf49c28c9ae2d","706db9a2508c3c9e86223c64a13d6224e021e58eeb9451d3f27134860a8e231a","62352798bf7c2cac5900f36e6f3cf11781852717b0a76d76ecced432af6d3de7","517ac9983bb2e8a65c77ff4a828618d3d8087a3ad0d947aff5fe0721f2dca818","202e795222ab35cf7c998eaa4f812ab1c5d0627e65d7082ee9026c9e11b78d4b","6a6b222683d71c517c641eb87b897e97a11bb6584e13b1b53ecbe35318084a6f",{"version":"5ebc6dda07cd1112abcba3da894fafc01c04b37f55bc94bc110da3a662236cee","impliedFormat":1},{"version":"306f17bebc63d2c9a8d7f3d9d78df6561513172e95f46c997105d9407899de92","impliedFormat":1},"fe8733318b80490c8ec2f7ffcab3990e6fb6c723fcd7e3930695d8c55c697742","bf256d86faf325c0ca60488c0ced968771d1e07a7070b396edbf7e986cf6ca69","618a36d590a7a37ade0d97e72e7ed7e07a1dce4bc15bb63765a143c70da6ac9b","f746bff76718fe09788a2da7b18893dcf7d79ce7a837cecbbbed5b9606fd5087",{"version":"0d891735a21edc75df51f3eb995e18149e119d1ce22fd40db2b260c5960b914e","impliedFormat":1},{"version":"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"829b9e6028b29e6a8b1c01ddb713efe59da04d857089298fa79acbdb3cfcfdef","impliedFormat":1},{"version":"24f8562308dd8ba6013120557fa7b44950b619610b2c6cb8784c79f11e3c4f90","impliedFormat":1},{"version":"5f90b8c733a1bda63e42160b15a2301051e83a6f9d5332a59d16eb12f463270d","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"631eff75b0e35d1b1b31081d55209abc43e16b49426546ab5a9b40bdd40b1f60","impliedFormat":1},{"version":"865a2612f5ec073dd48d454307ccabb04c48f8b96fda9940c5ebfe6b4b451f51","impliedFormat":1},{"version":"4558ac151f289d39f651a630cc358111ef72c1148e06627ef7edaeb01eb26c82","impliedFormat":1},{"version":"115b2ad73fa7d175cd71a5873d984c21593b2a022f1a2036cc39d9f53629e5dc","impliedFormat":1},{"version":"1be330b3a0b00590633f04c3b35db7fa618c9ee079258e2b24c137eb4ffcd728","impliedFormat":1},{"version":"3253d41f1fefc58f0ba77053f23a3c310cf1a2b880d3b98c63d52161baa730d3","impliedFormat":1},{"version":"413df52d4ea14472c2fa5bee62f7a40abd1eb49be0b9722ee01ee4e52e63beb2","impliedFormat":1},{"version":"1fffe726740f9787f15b532e1dc870af3cd964dbe29e191e76121aa3dd8693f2","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"acf5a2ac47b59ca07afa9abbd2b31d001bf7448b041927befae2ea5b1951d9f9","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"d71291eff1e19d8762a908ba947e891af44749f3a2cbc5bd2ec4b72f72ea795f","impliedFormat":1},{"version":"c0480e03db4b816dff2682b347c95f2177699525c54e7e6f6aa8ded890b76be7","impliedFormat":1},{"version":"27ab780875bcbb65e09da7496f2ca36288b0c541abaa75c311450a077d54ec15","impliedFormat":1},{"version":"ffa495b17a5ef1d0399586b590bd281056cee6ce3583e34f39926f8dcc6ecdb5","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa","impliedFormat":1},{"version":"b6db56e4903e9c32e533b78ac85522de734b3d3a8541bf24d256058d464bf04b","impliedFormat":1},{"version":"24daa0366f837d22c94a5c0bad5bf1fd0f6b29e1fae92dc47c3072c3fdb2fbd5","impliedFormat":1},{"version":"570bb5a00836ffad3e4127f6adf581bfc4535737d8ff763a4d6f4cc877e60d98","impliedFormat":1},{"version":"889c00f3d32091841268f0b994beba4dceaa5df7573be12c2c829d7c5fbc232c","impliedFormat":1},{"version":"65f43099ded6073336e697512d9b80f2d4fec3182b7b2316abf712e84104db00","impliedFormat":1},{"version":"ce75b1aebb33d510ff28af960a9221410a3eaf7f18fc5f21f9404075fba77256","impliedFormat":1},{"version":"d6e73f8010935b7b4c7487b6fb13ea197cc610f0965b759bec03a561ccf8423a","impliedFormat":1},{"version":"3e7efde639c6a6c3edb9847b3f61e308bf7a69685b92f665048c45132f51c218","impliedFormat":1},{"version":"174f3864e398f3f33f9a446a4f403d55a892aa55328cf6686135dfaf9e171657","impliedFormat":1},{"version":"824c76aec8d8c7e65769688cbee102238c0ef421ed6686f41b2a7d8e7e78a931","impliedFormat":1},{"version":"75b868be3463d5a8cfc0d9396f0a3d973b8c297401d00bfb008a42ab16643f13","impliedFormat":1},{"version":"5178eb4415a172c287c711dc60a619e110c3fd0b7de01ed0627e51a5336aa09c","impliedFormat":1},{"version":"ca6e5264278b53345bc1ce95f42fb0a8b733a09e3d6479c6ccfca55cdc45038c","impliedFormat":1},{"version":"15a234e5031b19c48a69ccc1607522d6e4b50f57d308ecb7fe863d44cd9f9eb3","impliedFormat":1},{"version":"ad0d1d75d129b1c80f911be438d6b61bfa8703930a8ff2be2f0e1f8a91841c64","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"496bbf339f3838c41f164238543e9fe5f1f10659cb30b68903851618464b98ba","impliedFormat":1},{"version":"9e2739b32f741859263fdba0244c194ca8e96da49b430377930b8f721d77c000","impliedFormat":1},{"version":"fb1d8e814a3eeb5101ca13515e0548e112bd1ff3fb358ece535b93e94adf5a3a","impliedFormat":1},{"version":"98b18458acb46072947aabeeeab1e410f047e0cacc972943059ca5500b0a5e95","impliedFormat":1},{"version":"361e2b13c6765d7f85bb7600b48fde782b90c7c41105b7dab1f6e7871071ba20","impliedFormat":1},{"version":"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8","impliedFormat":1},{"version":"380647d8f3b7f852cca6d154a376dbf8ac620a2f12b936594504a8a852e71d2f","impliedFormat":1},{"version":"208c9af9429dd3c76f5927b971263174aaa4bc7621ddec63f163640cbd3c473c","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"a23185bc5ef590c287c28a91baf280367b50ae4ea40327366ad01f6f4a8edbc5","impliedFormat":1},{"version":"bb37588926aba35c9283fe8d46ebf4e79ffe976343105f5c6d45f282793352b2","impliedFormat":1},{"version":"002eae065e6960458bda3cf695e578b0d1e2785523476f8a9170b103c709cd4f","impliedFormat":1},{"version":"c83bb0c9c5645a46c68356c2f73fdc9de339ce77f7f45a954f560c7e0b8d5ebb","impliedFormat":1},{"version":"05c97cddbaf99978f83d96de2d8af86aded9332592f08ce4a284d72d0952c391","impliedFormat":1},{"version":"72179f9dd22a86deaad4cc3490eb0fe69ee084d503b686985965654013f1391b","impliedFormat":1},{"version":"2e6114a7dd6feeef85b2c80120fdbfb59a5529c0dcc5bfa8447b6996c97a69f5","impliedFormat":1},{"version":"7b6ff760c8a240b40dab6e4419b989f06a5b782f4710d2967e67c695ef3e93c4","impliedFormat":1},{"version":"c8f004e6036aa1c764ad4ec543cf89a5c1893a9535c80ef3f2b653e370de45e6","impliedFormat":1},{"version":"dd80b1e600d00f5c6a6ba23f455b84a7db121219e68f89f10552c54ba46e4dc9","impliedFormat":1},{"version":"b064c36f35de7387d71c599bfcf28875849a1dbc733e82bd26cae3d1cd060521","impliedFormat":1},{"version":"6a148329edecbda07c21098639ef4254ef7869fb25a69f58e5d6a8b7b69d4236","impliedFormat":1},{"version":"8de9fe97fa9e00ec00666fa77ab6e91b35d25af8ca75dabcb01e14ad3299b150","impliedFormat":1},{"version":"f63ab283a1c8f5c79fabe7ca4ef85f9633339c4f0e822fce6a767f9d59282af2","impliedFormat":1},{"version":"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369","impliedFormat":1},{"version":"a54c996c8870ef1728a2c1fa9b8eaec0bf4a8001cd2583c02dd5869289465b10","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"3754982006a3b32c502cff0867ca83584f7a43b1035989ca73603f400de13c96","impliedFormat":1},{"version":"a30ae9bb8a8fa7b90f24b8a0496702063ae4fe75deb27da731ed4a03b2eb6631","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"50256e9c31318487f3752b7ac12ff365c8949953e04568009c8705db802776fb","impliedFormat":1},{"version":"7d73b24e7bf31dfb8a931ca6c4245f6bb0814dfae17e4b60c9e194a631fe5f7b","impliedFormat":1},{"version":"413586add0cfe7369b64979d4ec2ed56c3f771c0667fbde1bf1f10063ede0b08","impliedFormat":1},{"version":"06472528e998d152375ad3bd8ebcb69ff4694fd8d2effaf60a9d9f25a37a097a","impliedFormat":1},{"version":"50b5bc34ce6b12eccb76214b51aadfa56572aa6cc79c2b9455cdbb3d6c76af1d","impliedFormat":1},{"version":"b7e16ef7f646a50991119b205794ebfd3a4d8f8e0f314981ebbe991639023d0e","impliedFormat":1},{"version":"a401617604fa1f6ce437b81689563dfdc377069e4c58465dbd8d16069aede0a5","impliedFormat":1},{"version":"e9dd71cf12123419c60dab867d44fbee5c358169f99529121eaef277f5c83531","impliedFormat":1},{"version":"5b6a189ba3a0befa1f5d9cb028eb9eec2af2089c32f04ff50e2411f63d70f25d","impliedFormat":1},{"version":"d663134457d8d669ae0df34eabd57028bddc04fc444c4bc04bc5215afc91e1f4","impliedFormat":1},{"version":"e91f7b1344577a02f051b9b471f33044fef8334a76dc9e1de003d17595a5219b","impliedFormat":1},{"version":"3af3584f79c57853028ef9421ec172539e1fe01853296dc05a9d615ade4ffaf6","impliedFormat":1},{"version":"20865ac316b8893c1a0cc383ccfc1801443fbcc2a7255be166cf90d03fac88c9","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"461d0ad8ae5f2ff981778af912ba71b37a8426a33301daa00f21c6ccb27f8156","impliedFormat":1},{"version":"1a82deef4c1d39f6882f28d275cad4c01f907b9b39be9cbc472fcf2cf051e05b","impliedFormat":1},{"version":"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","impliedFormat":1},{"version":"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","impliedFormat":1},{"version":"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","impliedFormat":1},{"version":"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","impliedFormat":1},{"version":"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","impliedFormat":1},{"version":"1ee45496b5f8bdee6f7abc233355898e5bf9bd51255db65f5ff7ede617ca0027","impliedFormat":1},{"version":"0c7c947ff881c4274c0800deaa0086971e0bfe51f89a33bd3048eaa3792d4876","affectsGlobalScope":true,"impliedFormat":1},{"version":"db01d18853469bcb5601b9fc9826931cc84cc1a1944b33cad76fd6f1e3d8c544","affectsGlobalScope":true,"impliedFormat":1},{"version":"a8f8e6ab2fa07b45251f403548b78eaf2022f3c2254df3dc186cb2671fe4996d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"15b36126e0089bfef173ab61329e8286ce74af5e809d8a72edcafd0cc049057f","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"a57b1802794433adec9ff3fed12aa79d671faed86c49b09e02e1ac41b4f1d33a","impliedFormat":1},{"version":"ad10d4f0517599cdeca7755b930f148804e3e0e5b5a3847adce0f1f71bbccd74","impliedFormat":1},{"version":"1042064ece5bb47d6aba91648fbe0635c17c600ebdf567588b4ca715602f0a9d","impliedFormat":1},{"version":"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5","impliedFormat":1},{"version":"d6406c629bb3efc31aedb2de809bef471e475c86c7e67f3ef9b676b5d7e0d6b2","impliedFormat":1},{"version":"8c030e515014c10a2b98f9f48408e3ba18023dfd3f56e3312c6c2f3ae1f55a16","impliedFormat":1},{"version":"dafc31e9e8751f437122eb8582b93d477e002839864410ff782504a12f2a550c","impliedFormat":1},{"version":"f56bdc6884648806d34bc66d31cdb787c4718d04105ce2cd88535db214631f82","impliedFormat":1},{"version":"71d8ba39a9e024d9e4bb922464d18542ed8d2c25ee78efa7890c27213cc6e5d3","impliedFormat":1},{"version":"633d58a237f4bb25ec7d565e4ffa32cecdcee8660ac12189c4351c52557cee9e","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"13283350547389802aa35d9f2188effaeac805499169a06ef5cd77ce2a0bd63f","impliedFormat":1},{"version":"ce791f6ea807560f08065d1af6014581eeb54a05abd73294777a281b6dfd73c2","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"49f95e989b4632c6c2a578cc0078ee19a5831832d79cc59abecf5160ea71abad","impliedFormat":1},{"version":"9666533332f26e8995e4d6fe472bdeec9f15d405693723e6497bf94120c566c8","impliedFormat":1},{"version":"ce0df82a9ae6f914ba08409d4d883983cc08e6d59eb2df02d8e4d68309e7848b","impliedFormat":1},{"version":"796273b2edc72e78a04e86d7c58ae94d370ab93a0ddf40b1aa85a37a1c29ecd7","impliedFormat":1},{"version":"5df15a69187d737d6d8d066e189ae4f97e41f4d53712a46b2710ff9f8563ec9f","impliedFormat":1},{"version":"e17cd049a1448de4944800399daa4a64c5db8657cc9be7ef46be66e2a2cd0e7c","impliedFormat":1},{"version":"43fa6ea8714e18adc312b30450b13562949ba2f205a1972a459180fa54471018","impliedFormat":1},{"version":"6e89c2c177347d90916bad67714d0fb473f7e37fb3ce912f4ed521fe2892cd0d","impliedFormat":1},{"version":"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a","impliedFormat":1},{"version":"4d4927cbee21750904af7acf940c5e3c491b4d5ebc676530211e389dd375607a","impliedFormat":1},{"version":"72105519d0390262cf0abe84cf41c926ade0ff475d35eb21307b2f94de985778","impliedFormat":1},{"version":"8a97e578a9bc40eb4f1b0ca78f476f2e9154ecbbfd5567ee72943bab37fc156a","impliedFormat":1},{"version":"c857e0aae3f5f444abd791ec81206020fbcc1223e187316677e026d1c1d6fe08","impliedFormat":1},{"version":"ccf6dd45b708fb74ba9ed0f2478d4eb9195c9dfef0ff83a6092fa3cf2ff53b4f","impliedFormat":1},{"version":"2d7db1d73456e8c5075387d4240c29a2a900847f9c1bff106a2e490da8fbd457","impliedFormat":1},{"version":"2b15c805f48e4e970f8ec0b1915f22d13ca6212375e8987663e2ef5f0205e832","impliedFormat":1},{"version":"f22d05663d873ee7a600faf78abb67f3f719d32266803440cf11d5db7ac0cab2","impliedFormat":1},{"version":"d93c544ad20197b3976b0716c6d5cd5994e71165985d31dcab6e1f77feb4b8f2","impliedFormat":1},{"version":"35069c2c417bd7443ae7c7cafd1de02f665bf015479fec998985ffbbf500628c","impliedFormat":1},{"version":"a8b1c79a833ee148251e88a2553d02ce1641d71d2921cce28e79678f3d8b96aa","impliedFormat":1},{"version":"126d4f950d2bba0bd45b3a86c76554d4126c16339e257e6d2fabf8b6bf1ce00c","impliedFormat":1},{"version":"7e0b7f91c5ab6e33f511efc640d36e6f933510b11be24f98836a20a2dc914c2d","impliedFormat":1},{"version":"045b752f44bf9bbdcaffd882424ab0e15cb8d11fa94e1448942e338c8ef19fba","impliedFormat":1},{"version":"1d415445ea58f8033ba199703e55ff7483c52ac6742075b803bd3e7bbe9f5d61","impliedFormat":1},{"version":"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"2d3cc2211f352f46ea6b7cf2c751c141ffcdf514d6e7ae7ee20b7b6742da313f","impliedFormat":1},{"version":"c75445151ff8b77d9923191efed7203985b1a9e09eccf4b054e7be864e27923d","impliedFormat":1},{"version":"0aedb02516baf3e66b2c1db9fef50666d6ed257edac0f866ea32f1aa05aa474f","impliedFormat":1},{"version":"fa8a8fbf91ee2a4779496225f0312aac6635b0f21aa09cdafa4283fe32d519c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"0e8aef93d79b000deb6ec336b5645c87de167168e184e84521886f9ecc69a4b5","impliedFormat":1},{"version":"56ccb49443bfb72e5952f7012f0de1a8679f9f75fc93a5c1ac0bafb28725fc5f","impliedFormat":1},{"version":"20fa37b636fdcc1746ea0738f733d0aed17890d1cd7cb1b2f37010222c23f13e","impliedFormat":1},{"version":"d90b9f1520366d713a73bd30c5a9eb0040d0fb6076aff370796bc776fd705943","impliedFormat":1},{"version":"88e9caa9c5d2ba629240b5913842e7c57c5c0315383b8dc9d436ef2b60f1c391","impliedFormat":1},{"version":"ddf68b3b62e49cf6fd93ba2351ad0fbbcf62ca2d5d7afc9f186114e4b481c3cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef86adb77316505c6b471da1d9b8c9e428867c2566270e8894d4d773a1c4dc2","impliedFormat":1},{"version":"de7052bfee2981443498239a90c04ea5cc07065d5b9bb61b12cb6c84313ad4ef","impliedFormat":1},{"version":"b01bd582a6e41457bc56e6f0f9de4cb17f33f5f3843a7cf8210ac9c18472fb0f","impliedFormat":1},{"version":"0a437ae178f999b46b6153d79095b60c42c996bc0458c04955f1c996dc68b971","impliedFormat":1},{"version":"a3e7d932dc9c09daa99141a8e4800fc6c58c625af0d4bbb017773dc36da75426","impliedFormat":1},{"version":"43e96a3d5d1411ab40ba2f61d6a3192e58177bcf3b133a80ad2a16591611726d","impliedFormat":1},{"version":"4a2edd238d9104eac35b60d727f1123de5062f452b70ed8e0366cb36387dfdfd","impliedFormat":1},{"version":"ca921bf56756cb6fe957f6af693a35251b134fb932dc13f3dfff0bb7106f80b4","impliedFormat":1},{"version":"fee92c97f1aa59eb7098a0cc34ff4df7e6b11bae71526aca84359a2575f313d8","impliedFormat":1},{"version":"0bd0297484aacea217d0b76e55452862da3c5d9e33b24430e0719d1161657225","impliedFormat":1},{"version":"2ab6d334bcbf2aff3acfc4fd8c73ecd82b981d3c3aa47b3f3b89281772286904","impliedFormat":1},{"version":"d07cbc787a997d83f7bde3877fec5fb5b12ce8c1b7047eb792996ed9726b4dde","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"4805f6161c2c8cefb8d3b8bd96a080c0fe8dbc9315f6ad2e53238f9a79e528a6","impliedFormat":1},{"version":"b83cb14474fa60c5f3ec660146b97d122f0735627f80d82dd03e8caa39b4388c","impliedFormat":1},{"version":"f374cb24e93e7798c4d9e83ff872fa52d2cdb36306392b840a6ddf46cb925cb6","impliedFormat":1},{"version":"49179c6a23701c642bd99abe30d996919748014848b738d8e85181fc159685ff","impliedFormat":1},{"version":"7274fbffbd7c9589d8d0ffba68157237afd5cecff1e99881ea3399127e60572f","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"fcafff163ca5e66d3b87126e756e1b6dfa8c526aa9cd2a2b0a9da837d81bbd72","impliedFormat":1},{"version":"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","impliedFormat":1},{"version":"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","impliedFormat":1},{"version":"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","impliedFormat":1},{"version":"45490817629431853543adcb91c0673c25af52a456479588b6486daba34f68bb","impliedFormat":1},{"version":"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","impliedFormat":1},{"version":"8b4327413e5af38cd8cb97c59f48c3c866015d5d642f28518e3a891c469f240e","impliedFormat":1},{"version":"8514c62ce38e58457d967e9e73f128eedc1378115f712b9eef7127f7c88f82ae","impliedFormat":1},{"version":"f1289e05358c546a5b664fbb35a27738954ec2cc6eb4137350353099d154fc62","impliedFormat":1},{"version":"752513f35f6cff294ffe02d6027c41373adf7bfa35e593dbfd53d95c203635ee","impliedFormat":1},{"version":"6c800b281b9e89e69165fd11536195488de3ff53004e55905e6c0059a2d8591e","impliedFormat":1},{"version":"7d4254b4c6c67a29d5e7f65e67d72540480ac2cfb041ca484847f5ae70480b62","impliedFormat":1},{"version":"1a7e2ea171726446850ec72f4d1525d547ff7e86724cc9e7eec509725752a758","impliedFormat":1},{"version":"8c901126d73f09ecdea4785e9a187d1ac4e793e07da308009db04a7283ec2f37","impliedFormat":1},{"version":"c1de754ab5f3b0f4036d6893c74a0fc984c7fcb07936086f19bbe2974406775b","impliedFormat":1},{"version":"aab290b8e4b7c399f2c09b957666fc95335eb4522b2dd9ead1bf0cb64da6d6ee","impliedFormat":1},{"version":"94fe3281392e1015b22f39535878610b4fa6f1388dc8d78746be3bc4e4bb8950","impliedFormat":1},{"version":"2652448ac55a2010a1f71dd141f828b682298d39728f9871e1cdf8696ef443fd","impliedFormat":1},{"version":"06c25ddfc2242bd06c19f66c9eae4c46d937349a267810f89783680a1d7b5259","impliedFormat":1},{"version":"120599fd965257b1f4d0ff794bc696162832d9d8467224f4665f713a3119078b","impliedFormat":1},{"version":"5433f33b0a20300cca35d2f229a7fc20b0e8477c44be2affeb21cb464af60c76","impliedFormat":1},{"version":"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","impliedFormat":1},{"version":"bd4131091b773973ca5d2326c60b789ab1f5e02d8843b3587effe6e1ea7c9d86","impliedFormat":1},{"version":"c7f6485931085bf010fbaf46880a9b9ec1a285ad9dc8c695a9e936f5a48f34b4","impliedFormat":1},{"version":"14f6b927888a1112d662877a5966b05ac1bf7ed25d6c84386db4c23c95a5363b","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"0427df5c06fafc5fe126d14b9becd24160a288deff40e838bfbd92a35f8d0d00","impliedFormat":1},{"version":"90c54a02432d04e4246c87736e53a6a83084357acfeeba7a489c5422b22f5c7a","impliedFormat":1},{"version":"49c346823ba6d4b12278c12c977fb3a31c06b9ca719015978cb145eb86da1c61","impliedFormat":1},{"version":"bfac6e50eaa7e73bb66b7e052c38fdc8ccfc8dbde2777648642af33cf349f7f1","impliedFormat":1},{"version":"92f7c1a4da7fbfd67a2228d1687d5c2e1faa0ba865a94d3550a3941d7527a45d","impliedFormat":1},{"version":"f53b120213a9289d9a26f5af90c4c686dd71d91487a0aa5451a38366c70dc64b","impliedFormat":1},{"version":"83fe880c090afe485a5c02262c0b7cdd76a299a50c48d9bde02be8e908fb4ae6","impliedFormat":1},{"version":"0a372c2d12a259da78e21b25974d2878502f14d89c6d16b97bd9c5017ab1bc12","impliedFormat":1},{"version":"57d67b72e06059adc5e9454de26bbfe567d412b962a501d263c75c2db430f40e","impliedFormat":1},{"version":"6511e4503cf74c469c60aafd6589e4d14d5eb0a25f9bf043dcbecdf65f261972","impliedFormat":1},{"version":"ec1ca97598eda26b7a5e6c8053623acbd88e43be7c4d29c77ccd57abc4c43999","impliedFormat":1},{"version":"6e2261cd9836b2c25eecb13940d92c024ebed7f8efe23c4b084145cd3a13b8a6","impliedFormat":1},{"version":"a67b87d0281c97dfc1197ef28dfe397fc2c865ccd41f7e32b53f647184cc7307","impliedFormat":1},{"version":"771ffb773f1ddd562492a6b9aaca648192ac3f056f0e1d997678ff97dbb6bf9b","impliedFormat":1},{"version":"232f70c0cf2b432f3a6e56a8dc3417103eb162292a9fd376d51a3a9ea5fbbf6f","impliedFormat":1},{"version":"a47e6d954d22dd9ebb802e7e431b560ed7c581e79fb885e44dc92ed4f60d4c07","impliedFormat":1},{"version":"f019e57d2491c159d47a107fd90219a1734bdd2e25cd8d1db3c8fae5c6b414c4","impliedFormat":1},{"version":"8a0e762ceb20c7e72504feef83d709468a70af4abccb304f32d6b9bac1129b2c","impliedFormat":1},{"version":"d1c9bf292a54312888a77bb19dba5e2503ad803f5393beafd45d78d2f4fe9b48","impliedFormat":1},{"version":"d682336018141807fb602709e2d95a192828fcb8d5ba06dda3833a8ea98f69e3","impliedFormat":1},{"version":"6124e973eab8c52cabf3c07575204efc1784aca6b0a30c79eb85fe240a857efa","impliedFormat":1},{"version":"4fbd3116e00ed3a6410499924b6403cc9367fdca303e34838129b328058ede40","impliedFormat":1},{"version":"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f","impliedFormat":1},{"version":"4a7baeb6325920044f66c0f8e5e6f1f52e06e6d87588d837bdf44feb6f35c664","impliedFormat":1},{"version":"6dcf60530c25194a9ee0962230e874ff29d34c59605d8e069a49928759a17e0a","impliedFormat":1},{"version":"1a42d2ec31a1fe62fdc51591768695ed4a2dc64c01be113e7ff22890bebb5e3f","impliedFormat":1},{"version":"4b20fcf10a5413680e39f5666464859fc56b1003e7dfe2405ced82371ebd49b6","impliedFormat":1},{"version":"1d17ba45cfbe77a9c7e0df92f7d95f3eefd49ee23d1104d0548b215be56945ad","impliedFormat":1},{"version":"f7d628893c9fa52ba3ab01bcb5e79191636c4331ee5667ecc6373cbccff8ae12","impliedFormat":1},{"version":"1d879125d1ec570bf04bc1f362fdbe0cb538315c7ac4bcfcdf0c1e9670846aa6","impliedFormat":1},{"version":"bd5f641cc4616eee49497a362c4cb401e9346265bc52670448c4452b4d9be401","impliedFormat":1},{"version":"46273e8c29816125d0d0b56ce9a849cc77f60f9a5ba627447501d214466f0ff3","impliedFormat":1},{"version":"f82579d87701d639ff4e3930a9b24f4ee13ca74221a9a3a792feb47f01881a9c","impliedFormat":1},{"version":"d7e5d5245a8ba34a274717d085174b2c9827722778129b0081fefd341cca8f55","impliedFormat":1},{"version":"d9d32f94056181c31f553b32ce41d0ef75004912e27450738d57efcd2409c324","impliedFormat":1},{"version":"3be035da7bee86b4c3abf392e0edaa44fc6e45092995eefe36b39118c8a84068","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f828825d077c2fa0ea606649faeb122749273a353daab23924fe674e98ba44c","impliedFormat":1},{"version":"2896c2e673a5d3bd9b4246811f79486a073cbb03950c3d252fba10003c57411a","impliedFormat":1},{"version":"9252d498a77517aab5d8d4b5eb9d71e4b225bbc7123df9713e08181de63180f6","impliedFormat":1},{"version":"cb8d8ef7b9ce8ed3e6f1c814fcbf3f90dab0cb8863079236784fc350746e27c4","impliedFormat":1},{"version":"35e6379c3f7cb27b111ad4c1aa69538fd8e788ab737b8ff7596a1b40e96f4f90","impliedFormat":1},{"version":"4a889f2c763edb4d55cb624257272ac10d04a1cad2ed2948b10ed4a7fda2a428","impliedFormat":1},{"version":"7bb79aa2fead87d9d56294ef71e056487e848d7b550c9a367523ee5416c44cfa","impliedFormat":1},{"version":"72d63643a657c02d3e51cd99a08b47c9b020a565c55f246907050d3c8a5e77fb","impliedFormat":1},{"version":"27ff4196654e6373c9af16b6165120e2dd2169f9ad6abb5c935af5abd8c7938c","impliedFormat":1},{"version":"754498c5208ce3c5134f6eabd49b25cf5e1a042373515718953581636491f3c3","impliedFormat":1},{"version":"c49469a5349b3cc1965710b5b0f98ed6c028686aa8450bcb3796728873eb923e","impliedFormat":1},{"version":"fec01479923e169fb52bd4f668dbeef1d7a7ea6e6d491e15617b46f2cacfa37d","impliedFormat":1},{"version":"8a8fb3097ba52f0ae6530ec6ab34e43e316506eb1d9aa29420a4b1e92a81442d","impliedFormat":1},{"version":"44e09c831fefb6fe59b8e65ad8f68a7ecc0e708d152cfcbe7ba6d6080c31c61e","impliedFormat":1},{"version":"1c0a98de1323051010ce5b958ad47bc1c007f7921973123c999300e2b7b0ecc0","impliedFormat":1},"22cd77f3926affb85ace6090caa4a8a765e27ea75a82e32a548c2f1dcc77cbd9","80708a8c490e8f83980f3aef9f631d640da751f3f1f6502a4509c7bb92a3c8da","d2dd1ba4bd695da9eab9e8b95f5a7684ef2a7006fe17f88fd09d660648ab8be6","12b477c1eb9f48a37bda5a2be08b6c4d7533c69917faee333a064bdadf08bcfe","8cdd1a28bd74a06c9175324e05a5018451f97b1eb87af552c2bd51999b04f83c","224f4fff32eb37ad57064d57a6e8b72df1bc662a7de42a884b55c2a3b3202ded",{"version":"073515c8e6834a59c30777ccb7f3a5640ae1290c8e6fa98db705818bbdd268d5","impliedFormat":1},{"version":"931d036f1290fd8468c0d0c9bfae5d54d7b536e56443531e53af5586de45bfcf","impliedFormat":1},{"version":"f541bbe20000c83d2edf4e1cb033788922bf62b895b668a35a847ec1e0d8ed9e","impliedFormat":1},{"version":"56aba9a87997f60ecb2b1134e6dd54698a4e72061967e972a70678dbdee24509","impliedFormat":1},"ce699dc5ddb539ecad9e8ae56d46fb84ca1960ae3dab4df461ade1096129dccd","04a3ef8dc6573e0b806bec7d73e3b23892a6050aa1b38079347f4a5e26cd928d",{"version":"9971931daaf18158fc38266e838d56eb5d9d1f13360b1181bb4735a05f534c03","impliedFormat":99},{"version":"50cf7a23fc93928995caec8d7956206990f82113beeb6b3242dae8124edc3ca0","impliedFormat":99},{"version":"00573fee4b89c91d456f337a9c26d59a8b2046217f91143805b1695a32e84aa2","impliedFormat":99},{"version":"46676ef64c2429a44e2155538df101bae3dbe8dc22e84ea28cce99f98b24e71e","impliedFormat":99},{"version":"962f51218b3f753f9f16334ce7d48a42ddc7eb56df61447f2ddb8cfa55258d4f","impliedFormat":99},{"version":"0c5b705d31420477189618154d1b6a9bb62a34fa6055f56ade1a316f6adb6b3a","impliedFormat":99},{"version":"352031ac2e53031b69a09355e09ad7d95361edf32cc827cfe2417d80247a5a50","impliedFormat":99},{"version":"853b8bdb5da8c8e5d31e4d715a8057d8e96059d6774b13545c3616ed216b890c","impliedFormat":99},{"version":"babea45370fc008379519f0599f263a535ced908a0502ee7ec50df2985f71224","impliedFormat":99},{"version":"fb0c7e1cacee86d3d0da360b65a90ce3aed8dea071542add49fa4fad61611ad7","impliedFormat":99},{"version":"478f34f778d0c180d2932b7babff2ba565aba27707987956f02e2f889882d741","impliedFormat":99},{"version":"c363b57a3dfab561bfe884baacf8568eea085bd5e11ccf0992fac67537717d90","impliedFormat":99},{"version":"5192bb31561f1155bc36403bbcbdc4a93f910f6ceb8de80b66a24a5f77ed8a8c","impliedFormat":99},{"version":"084c09a35a9611e1777c02343c11ab8b1be48eb4895bbe6da90222979940b4a6","impliedFormat":99},{"version":"4b3049a2c849f0217ff4def308637931661461c329e4cf36aeb31db34c4c0c64","impliedFormat":99},{"version":"174b64363af0d3d9788584094f0f5a4fac30c869b536bb6bad9e7c3c9dce4c1d","impliedFormat":99},{"version":"d542fb814a8ceb7eb858ecd5a41434274c45a7d511b9d46feb36d83b437b08d5","impliedFormat":99},{"version":"998d9f1da9ec63fca4cc1acb3def64f03d6bd1df2da1519d9249c80cfe8fece6","impliedFormat":99},{"version":"b7d9ca4e3248f643fa86ff11872623fdc8ed2c6009836bec0e38b163b6faed0c","impliedFormat":99},{"version":"3514579e75f08ddf474adb8a4133dd4b2924f734c1b9784197ab53e2e7b129e0","impliedFormat":99},{"version":"d4f7a7a5f66b9bc6fbfd53fa08dcf8007ff752064df816da05edfa35abd2c97c","impliedFormat":99},{"version":"1f38ecf63dead74c85180bf18376dc6bc152522ef3aedf7b588cadbbd5877506","impliedFormat":99},{"version":"24af06c15fba5a7447d97bcacbcc46997c3b023e059c040740f1c6d477929142","impliedFormat":99},{"version":"facde2bec0f59cf92f4635ece51b2c3fa2d0a3bbb67458d24af61e7e6b8f003c","impliedFormat":99},{"version":"4669194e4ca5f7c160833bbb198f25681e629418a6326aba08cf0891821bfe8f","impliedFormat":99},{"version":"f919471289119d2e8f71aba81869b01f30f790e8322cf5aa7e7dee8c8dadd00a","impliedFormat":99},{"version":"3b9f5af0e636b312ec712d24f611225188627838967191bf434c547b87bde906","impliedFormat":99},{"version":"e9bc0db0144701fab1e98c4d595a293c7c840d209b389144142f0adbc36b5ec2","impliedFormat":99},{"version":"b1f00d7e185339b76f12179fa934088e28a92eb705f512fbe813107f0e2e2eb8","impliedFormat":99},"0dbe14c8e378339f1b630de668fc9f29c335ae72efc7c3bca122c1a067ff2745","cf3ef5430024588df2dcfb40bbaa42d728374d9b1c1048143d94f96a1321b366","0d42b8b6e4fd89db47f05d0160b8da0baeee6a1216742ce15073e6f3b2985c2e","14952f1788b0850ff67a42ce6ba21fe076f30c780d62857b65176cb488cbdebe",{"version":"c8b586926f789f4b2c5f3d0ab4c9abac8baded87dc5d3d5a76dab2a33df329d3","impliedFormat":99},{"version":"1094a7cca41a78a021810d740de33740214d640eec0b9f3aece8bff65f127100","impliedFormat":99},{"version":"6a02bfad54589e0a4da931eb84085ee64c896bf9c2776d7736245e0010799e8a","impliedFormat":99},{"version":"8057ce7e476a2d6ddb0560bcf9cdda6586664030e4da3ef05be7e4e89c5f1667","impliedFormat":99},{"version":"8dec746213bf21aaf5802c0a21e160551f82138ac101b2cce467207634843c13","impliedFormat":99},"baf9ee9e1aaf5a4327980fa899a5eb592c17eabf665836a2ed35f1f49ed64b45",{"version":"7ea81b87bac163bb67849d6104f82c62a8625714c1a5b31bf7d337da279b4ef4","impliedFormat":1}],"root":[[64,69],[157,162],164,428,434,435,442,443,[451,453],[556,560],[562,564],[569,571],[573,577],584,585,[689,696],[760,762],764,765,[769,771],773,775,777,782,[813,815],819,821,823,825,827,830,[867,872],1136,[1151,1175],[1180,1183],[1186,1189],[1440,1445],1450,1451,[1481,1484],1490],"options":{"declaration":true,"declarationMap":true,"esModuleInterop":true,"jsx":4,"module":99,"noUncheckedIndexedAccess":true,"rootDir":"./src","skipLibCheck":true,"strict":true,"target":9},"referencedMap":[[427,1],[425,2],[426,3],[335,4],[293,5],[306,6],[305,7],[337,8],[294,9],[297,10],[295,11],[336,12],[300,13],[301,10],[304,14],[298,15],[302,16],[296,17],[303,18],[387,19],[329,20],[333,21],[331,22],[332,23],[389,24],[328,10],[334,25],[330,26],[327,27],[424,28],[273,10],[380,29],[384,30],[381,30],[385,30],[382,30],[386,31],[383,30],[379,32],[315,33],[311,10],[314,33],[312,10],[317,34],[308,35],[316,36],[310,37],[313,38],[309,39],[1489,40],[323,38],[325,11],[318,41],[320,41],[326,42],[321,10],[319,41],[324,38],[322,38],[292,43],[287,41],[290,15],[291,15],[288,44],[289,10],[390,45],[419,46],[420,45],[421,47],[405,10],[412,48],[414,49],[398,15],[407,50],[404,51],[399,52],[409,53],[400,52],[401,54],[410,55],[403,15],[411,56],[402,52],[408,57],[406,58],[423,59],[395,60],[394,61],[396,62],[397,63],[393,11],[415,64],[422,11],[413,65],[417,66],[391,67],[418,68],[392,67],[416,69],[375,70],[299,10],[377,71],[376,10],[351,10],[353,10],[359,10],[345,10],[354,72],[352,73],[358,38],[355,10],[346,10],[344,74],[357,15],[343,10],[362,75],[356,10],[363,41],[276,10],[277,76],[274,77],[275,10],[279,11],[278,11],[280,11],[281,11],[285,15],[282,11],[283,78],[284,11],[378,79],[349,80],[340,81],[348,80],[347,80],[350,80],[338,82],[341,10],[342,10],[361,83],[365,83],[364,10],[369,10],[366,10],[367,10],[360,10],[370,10],[368,10],[121,84],[127,84],[129,85],[139,86],[120,10],[131,87],[125,88],[137,89],[132,87],[133,87],[136,90],[124,91],[134,92],[122,87],[123,87],[135,93],[138,86],[126,94],[118,10],[117,10],[141,95],[140,96],[119,10],[130,87],[128,97],[93,98],[94,10],[95,98],[106,99],[96,98],[97,10],[98,100],[92,10],[103,101],[104,102],[100,98],[99,103],[101,104],[105,104],[102,10],[77,10],[78,10],[79,105],[91,106],[80,105],[81,10],[82,10],[83,105],[85,107],[84,10],[86,105],[90,108],[88,109],[89,110],[87,10],[76,111],[109,112],[110,113],[116,114],[111,100],[112,115],[114,116],[107,117],[115,118],[108,10],[461,119],[460,10],[463,120],[462,121],[473,122],[466,123],[474,124],[471,122],[475,125],[469,122],[470,126],[472,127],[468,128],[467,129],[476,130],[464,131],[465,132],[455,10],[456,133],[479,134],[477,67],[478,135],[481,136],[480,137],[458,138],[457,139],[459,140],[266,11],[506,141],[507,142],[505,10],[510,143],[509,144],[508,141],[484,145],[485,146],[482,67],[483,147],[486,148],[501,149],[502,10],[503,150],[541,151],[539,152],[538,10],[540,153],[542,154],[511,155],[512,156],[527,67],[528,157],[550,158],[549,159],[551,160],[553,161],[552,10],[525,162],[526,163],[544,164],[543,159],[545,165],[546,10],[548,166],[547,167],[504,168],[524,10],[514,169],[515,170],[498,171],[487,172],[489,10],[499,173],[500,174],[488,10],[530,175],[533,176],[535,10],[536,10],[531,177],[534,178],[532,10],[529,10],[555,179],[537,10],[513,180],[495,181],[491,182],[492,183],[490,183],[496,184],[494,185],[497,186],[493,187],[516,188],[523,189],[522,10],[520,190],[518,10],[519,191],[517,10],[521,10],[554,10],[454,67],[1249,10],[1449,192],[1447,193],[1448,194],[1446,194],[565,195],[763,196],[772,196],[444,67],[816,67],[449,197],[446,195],[768,198],[447,195],[783,195],[767,199],[572,200],[567,201],[448,195],[445,67],[817,67],[828,67],[818,202],[820,203],[766,196],[822,200],[561,195],[824,196],[436,204],[829,205],[568,206],[566,10],[1458,207],[1454,208],[1461,209],[1456,210],[1457,10],[1459,207],[1455,210],[1452,10],[1460,210],[1453,10],[1474,211],[1479,67],[1472,211],[1473,204],[1480,212],[1471,213],[1464,213],[1462,214],[1478,215],[1475,214],[1477,213],[1476,214],[1470,214],[1469,214],[1463,213],[1465,216],[1467,213],[1468,213],[1466,213],[866,217],[845,218],[855,219],[852,219],[853,220],[837,220],[851,220],[832,219],[838,221],[841,222],[846,223],[834,221],[835,220],[848,224],[833,221],[839,221],[842,221],[847,221],[849,220],[836,220],[850,220],[844,225],[840,226],[865,227],[843,228],[854,229],[831,220],[856,220],[857,220],[858,220],[859,220],[860,220],[861,220],[862,220],[863,220],[864,220],[1491,10],[1138,230],[1139,231],[1137,232],[1140,233],[1141,234],[1142,235],[1143,236],[1144,237],[1145,238],[1146,239],[1147,240],[1148,241],[1149,242],[1184,243],[1150,243],[1185,243],[631,244],[632,244],[633,245],[591,246],[634,247],[635,248],[636,249],[586,10],[589,250],[587,10],[588,10],[637,251],[638,252],[639,253],[640,254],[641,255],[642,256],[643,256],[645,257],[644,258],[646,259],[647,260],[648,261],[630,262],[590,10],[649,263],[650,264],[651,265],[684,266],[652,267],[653,268],[654,269],[655,270],[656,271],[657,272],[658,273],[659,274],[660,275],[661,276],[662,276],[663,277],[664,10],[665,10],[666,278],[668,279],[667,280],[669,281],[670,282],[671,283],[672,284],[673,285],[674,286],[675,287],[676,288],[677,289],[678,290],[679,291],[680,292],[681,293],[682,294],[683,295],[1201,296],[1340,67],[1202,297],[1200,67],[1341,298],[1198,299],[1338,10],[1199,300],[60,10],[62,301],[1337,67],[63,67],[581,302],[580,10],[371,10],[374,303],[372,304],[373,304],[286,10],[592,10],[718,305],[719,305],[720,306],[721,305],[723,307],[722,305],[724,305],[725,305],[726,308],[700,309],[727,10],[728,10],[729,310],[697,10],[716,311],[717,312],[712,10],[703,313],[730,314],[731,315],[711,316],[715,317],[714,318],[732,10],[713,319],[733,320],[709,321],[736,322],[735,323],[704,321],[737,324],[747,309],[705,10],[734,325],[758,326],[741,327],[738,328],[739,329],[740,330],[749,331],[708,332],[742,10],[743,10],[744,333],[745,10],[746,334],[748,335],[757,336],[750,337],[752,338],[751,337],[753,337],[754,339],[755,340],[756,341],[759,342],[702,309],[699,10],[706,10],[701,10],[710,343],[707,344],[698,10],[439,345],[438,346],[437,10],[440,10],[774,347],[70,10],[74,348],[72,348],[73,349],[75,350],[71,348],[61,10],[687,351],[686,352],[688,353],[685,10],[966,354],[945,355],[1042,10],[946,356],[882,354],[883,354],[884,354],[885,354],[886,354],[887,354],[888,354],[889,354],[890,354],[891,354],[892,354],[893,354],[894,354],[895,354],[896,354],[897,354],[898,354],[899,354],[878,10],[900,354],[901,354],[902,10],[903,354],[904,354],[905,354],[906,354],[907,354],[908,354],[909,354],[910,354],[911,354],[912,354],[913,354],[914,354],[915,354],[916,354],[917,354],[918,354],[919,354],[920,354],[921,354],[922,354],[923,354],[924,354],[925,354],[926,354],[927,354],[928,354],[929,354],[930,354],[931,354],[932,354],[933,354],[934,354],[935,354],[936,354],[937,354],[938,354],[939,354],[940,354],[941,354],[942,354],[943,354],[944,354],[947,357],[948,354],[949,354],[950,358],[951,359],[952,354],[953,354],[954,354],[955,354],[956,354],[957,354],[958,354],[880,10],[959,354],[960,354],[961,354],[962,354],[963,354],[964,354],[965,354],[967,360],[968,354],[969,354],[970,354],[971,354],[972,354],[973,354],[974,354],[975,354],[976,354],[977,354],[978,354],[979,354],[980,354],[981,354],[982,354],[983,354],[984,354],[985,354],[986,10],[987,10],[988,10],[1135,361],[989,354],[990,354],[991,354],[992,354],[993,354],[994,354],[995,10],[996,354],[997,10],[998,354],[999,354],[1000,354],[1001,354],[1002,354],[1003,354],[1004,354],[1005,354],[1006,354],[1007,354],[1008,354],[1009,354],[1010,354],[1011,354],[1012,354],[1013,354],[1014,354],[1015,354],[1016,354],[1017,354],[1018,354],[1019,354],[1020,354],[1021,354],[1022,354],[1023,354],[1024,354],[1025,354],[1026,354],[1027,354],[1028,354],[1029,354],[1030,10],[1031,354],[1032,354],[1033,354],[1034,354],[1035,354],[1036,354],[1037,354],[1038,354],[1039,354],[1040,354],[1041,354],[1043,362],[879,354],[1044,354],[1045,354],[1046,10],[1047,10],[1048,10],[1049,354],[1050,10],[1051,10],[1052,10],[1053,10],[1054,10],[1055,354],[1056,354],[1057,354],[1058,354],[1059,354],[1060,354],[1061,354],[1062,354],[1067,363],[1065,364],[1064,365],[1066,366],[1063,354],[1068,354],[1069,354],[1070,354],[1071,354],[1072,354],[1073,354],[1074,354],[1075,354],[1076,354],[1077,354],[1078,10],[1079,10],[1080,354],[1081,354],[1082,10],[1083,10],[1084,10],[1085,354],[1086,354],[1087,354],[1088,354],[1089,360],[1090,354],[1091,354],[1092,354],[1093,354],[1094,354],[1095,354],[1096,354],[1097,354],[1098,354],[1099,354],[1100,354],[1101,354],[1102,354],[1103,354],[1104,354],[1105,354],[1106,354],[1107,354],[1108,354],[1109,354],[1110,354],[1111,354],[1112,354],[1113,354],[1114,354],[1115,354],[1116,354],[1117,354],[1118,354],[1119,354],[1120,354],[1121,354],[1122,354],[1123,354],[1124,354],[1125,354],[1126,354],[1127,354],[1128,354],[1129,354],[1130,354],[881,367],[1131,10],[1132,10],[1133,10],[1134,10],[582,368],[779,369],[778,10],[780,370],[388,371],[1486,372],[1485,11],[1488,373],[1487,372],[175,374],[242,375],[241,376],[240,377],[180,378],[196,379],[194,380],[195,381],[181,382],[265,383],[166,10],[168,10],[169,384],[170,10],[173,385],[176,10],[193,386],[171,10],[188,387],[174,388],[189,389],[192,390],[187,391],[190,390],[167,10],[172,10],[191,392],[197,393],[185,10],[179,394],[177,395],[186,396],[183,397],[182,397],[178,398],[184,399],[198,400],[261,401],[255,402],[248,403],[247,404],[256,405],[257,390],[249,406],[262,407],[243,408],[244,409],[245,410],[264,411],[246,404],[250,407],[251,412],[258,413],[259,388],[260,412],[252,410],[263,390],[253,414],[254,415],[199,416],[239,417],[203,418],[204,418],[205,418],[206,418],[207,418],[208,418],[209,418],[210,418],[229,418],[201,418],[211,418],[212,418],[213,418],[214,418],[215,418],[216,418],[236,418],[217,418],[218,418],[219,418],[234,418],[220,418],[235,418],[221,418],[232,418],[233,418],[222,418],[223,418],[224,418],[230,418],[231,418],[225,418],[226,418],[227,418],[228,418],[237,418],[238,418],[202,419],[200,420],[165,10],[583,421],[450,67],[163,67],[433,422],[1217,423],[1253,424],[1399,425],[1248,426],[1236,10],[1232,10],[1215,10],[1389,427],[1412,428],[1216,10],[1370,429],[1257,430],[1258,431],[1336,432],[1386,433],[1355,434],[1393,435],[1394,436],[1392,437],[1391,10],[1390,438],[1255,439],[1218,440],[1292,10],[1293,441],[1235,10],[1237,442],[1219,443],[1276,442],[1359,442],[1196,442],[1251,444],[1250,10],[1398,445],[1427,10],[1227,10],[1311,446],[1312,447],[1306,67],[1314,10],[1315,204],[1307,448],[1385,449],[1384,10],[1308,67],[1351,450],[1349,451],[1350,452],[578,453],[1283,454],[1282,455],[1281,456],[1280,457],[1190,10],[1192,10],[1395,458],[1396,459],[1397,460],[1239,10],[1226,461],[1203,10],[1327,67],[1194,462],[1326,463],[1325,464],[1316,10],[1317,10],[1324,10],[1319,10],[1322,465],[1318,10],[1320,466],[1323,467],[1321,466],[1214,10],[1230,10],[1231,10],[1266,468],[1267,469],[1265,470],[1263,471],[1264,472],[1260,10],[1334,204],[1357,204],[1402,473],[1401,10],[1344,10],[1204,474],[1309,475],[1310,476],[1301,477],[1432,10],[1333,478],[1329,479],[1335,480],[1330,481],[1328,10],[1331,10],[1348,482],[1403,483],[1404,484],[1433,485],[1434,486],[1430,487],[1381,488],[1429,489],[1275,490],[1371,491],[1229,492],[1428,493],[1193,426],[1261,10],[1268,494],[1422,495],[1259,10],[1421,496],[1197,10],[1419,497],[1238,10],[1294,498],[1415,10],[1220,10],[1221,10],[1271,499],[1234,10],[1408,500],[1298,501],[1400,502],[1297,10],[1270,10],[1262,10],[1372,503],[1373,504],[1233,10],[1375,505],[1377,506],[1376,507],[1241,10],[1269,492],[1379,508],[1420,509],[1423,510],[1205,10],[1208,10],[1206,10],[1210,10],[1207,10],[1209,10],[1211,511],[1213,10],[1363,512],[1362,10],[1368,513],[1364,514],[1367,515],[1366,515],[1369,513],[1365,514],[1228,516],[1358,517],[1407,518],[1436,519],[1438,520],[1296,10],[1437,521],[1405,483],[1313,483],[1212,10],[1300,522],[1223,523],[1224,524],[1225,525],[1291,526],[1380,526],[1277,526],[1360,527],[1278,527],[1256,528],[1222,10],[1274,529],[1273,530],[1272,531],[1361,532],[1406,533],[1305,534],[1343,535],[1304,536],[1339,537],[1342,538],[1388,539],[1387,540],[1383,541],[1354,542],[1356,543],[1353,544],[1378,545],[1347,10],[432,10],[1346,546],[1382,10],[1409,547],[1431,458],[1435,548],[1191,549],[1345,550],[1410,551],[1411,551],[430,10],[429,10],[431,10],[1413,552],[1303,67],[1352,553],[1254,10],[1243,554],[1295,10],[1290,67],[1289,555],[1425,556],[1288,557],[1195,10],[1286,67],[1287,67],[1279,10],[1242,10],[1285,558],[1284,559],[1240,560],[1299,275],[1414,275],[1374,10],[1417,561],[1416,10],[1332,562],[1302,67],[1426,563],[1252,564],[1247,565],[1246,10],[1245,566],[1244,10],[1424,567],[1439,568],[579,569],[113,10],[874,570],[877,571],[875,570],[873,572],[876,573],[781,574],[784,10],[799,575],[800,575],[812,576],[801,577],[802,578],[797,579],[795,580],[786,10],[790,581],[794,582],[792,583],[798,584],[787,585],[788,586],[789,587],[791,588],[793,589],[796,590],[803,577],[804,577],[805,577],[806,575],[807,577],[808,577],[785,577],[809,10],[811,591],[810,577],[1418,592],[826,67],[339,10],[441,10],[272,10],[58,10],[59,10],[10,10],[11,10],[13,10],[12,10],[2,10],[14,10],[15,10],[16,10],[17,10],[18,10],[19,10],[20,10],[21,10],[3,10],[22,10],[23,10],[4,10],[24,10],[28,10],[25,10],[26,10],[27,10],[29,10],[30,10],[31,10],[5,10],[32,10],[33,10],[34,10],[35,10],[6,10],[39,10],[36,10],[37,10],[38,10],[40,10],[7,10],[41,10],[46,10],[47,10],[42,10],[43,10],[44,10],[45,10],[8,10],[51,10],[48,10],[49,10],[50,10],[52,10],[9,10],[53,10],[54,10],[55,10],[57,10],[56,10],[1,10],[608,593],[618,594],[607,593],[628,595],[599,596],[598,597],[627,598],[621,599],[626,600],[601,601],[615,602],[600,603],[624,604],[596,605],[595,598],[625,606],[597,607],[602,608],[603,10],[606,608],[593,10],[629,609],[619,610],[610,611],[611,612],[613,613],[609,614],[612,615],[622,598],[604,616],[605,617],[614,618],[594,619],[617,610],[616,608],[620,10],[623,620],[776,347],[307,10],[271,621],[268,622],[269,623],[267,624],[270,625],[1179,626],[1177,621],[1176,621],[1178,621],[151,627],[152,628],[142,629],[147,629],[150,629],[148,630],[149,631],[146,629],[143,629],[144,627],[145,632],[155,633],[156,634],[154,10],[153,10],[434,635],[435,636],[64,204],[65,204],[452,637],[453,638],[557,639],[558,640],[571,641],[870,642],[872,643],[556,644],[1151,645],[1152,646],[1136,647],[574,648],[575,649],[576,650],[1153,651],[1154,652],[1155,653],[1156,654],[1157,651],[1158,655],[577,652],[584,656],[585,657],[690,658],[1159,659],[1161,660],[1160,204],[691,661],[692,204],[693,204],[694,204],[1163,662],[1162,652],[1164,663],[871,664],[695,665],[1167,666],[1165,667],[1168,668],[1166,204],[696,669],[760,670],[1173,671],[1174,672],[1170,673],[1175,674],[1189,675],[1188,676],[1440,677],[1172,678],[1169,652],[1182,679],[1442,680],[1445,681],[1444,682],[1441,683],[1443,684],[761,685],[762,686],[765,687],[770,688],[1450,689],[1451,690],[764,691],[771,692],[443,693],[773,694],[775,695],[451,696],[777,697],[769,698],[782,699],[814,700],[560,701],[813,702],[815,703],[573,704],[819,705],[821,706],[823,707],[562,708],[563,696],[570,709],[564,640],[825,710],[827,711],[830,712],[867,713],[868,701],[569,714],[1482,715],[1180,716],[1483,717],[1481,718],[157,719],[1484,720],[158,721],[68,722],[69,652],[160,723],[869,204],[1183,204],[559,204],[1186,204],[1181,724],[1187,652],[159,652],[689,725],[1171,726],[1490,727],[428,728],[66,652],[67,729],[442,730],[161,731],[162,10],[164,732]],"semanticDiagnosticsPerFile":[[782,[{"start":9414,"length":19,"messageText":"Object is possibly 'undefined'.","category":1,"code":2532}]],[871,[{"start":745,"length":3,"code":2322,"category":1,"messageText":{"messageText":"Type '{ className: string; alt: string; }' is not assignable to type 'IntrinsicAttributes & SVGAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'alt' does not exist on type 'IntrinsicAttributes & SVGAttributes'.","category":1,"code":2339}]}}]],[1160,[{"start":51,"length":27,"messageText":"Cannot find module '@/app/components/FourCard' or its corresponding type declarations.","category":1,"code":2307}]],[1181,[{"start":2020,"length":16,"messageText":"Property 'blocksPerSession' does not exist on type 'HeightContext'.","category":1,"code":2339}]],[1484,[{"start":22,"length":18,"messageText":"Module '\"@igniter/ui/context/WalletConnection/index\"' declares 'TransactionMessage' locally, but it is not exported.","category":1,"code":2459,"relatedInformation":[{"file":"./src/context/WalletConnection/index.tsx","start":233,"length":18,"messageText":"'TransactionMessage' is declared here.","category":3,"code":2728}]},{"start":42,"length":16,"messageText":"'\"@igniter/ui/context/WalletConnection/index\"' has no exported member named 'WalletConnection'. Did you mean 'useWalletConnection'?","category":1,"code":2724,"relatedInformation":[{"file":"./src/context/WalletConnection/index.tsx","start":11914,"length":19,"messageText":"'useWalletConnection' is declared here.","category":3,"code":2728}]},{"start":132,"length":17,"messageText":"Module '\"@igniter/ui/context/WalletConnection/index\"' declares 'SignedTransaction' locally, but it is not exported.","category":1,"code":2459,"relatedInformation":[{"file":"./src/context/WalletConnection/index.tsx","start":214,"length":17,"messageText":"'SignedTransaction' is declared here.","category":3,"code":2728}]}]]],"affectedFilesPendingEmit":[434,435,64,65,452,453,557,558,571,870,872,556,1151,1152,1136,574,575,576,1153,1154,1155,1156,1157,1158,577,584,585,690,1159,1161,1160,691,692,693,694,1163,1162,1164,871,695,1167,1165,1168,1166,696,760,1173,1174,1170,1175,1189,1188,1440,1172,1169,1182,1442,1445,1444,1441,1443,761,762,765,770,1450,1451,764,771,443,773,775,451,777,769,782,814,560,813,815,573,819,821,823,562,563,570,564,825,827,830,867,868,569,1482,1180,1483,1481,157,1484,158,68,69,160,869,1183,559,1186,1181,1187,159,689,1171,1490,428,66,67,442,164],"version":"5.7.3"} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ea32b990..fad8592a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -128,10 +128,10 @@ importers: version: 6.1.0 next: specifier: 15.5.16 - version: 15.5.16(@babel/core@7.28.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1) + version: 15.5.16(@babel/core@7.29.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1) next-auth: specifier: 5.0.0-beta.30 - version: 5.0.0-beta.30(next@15.5.16(@babel/core@7.28.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1))(react@19.0.1) + version: 5.0.0-beta.30(next@15.5.16(@babel/core@7.29.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1))(react@19.0.1) next-themes: specifier: 0.4.3 version: 0.4.3(react-dom@19.0.1(react@19.0.1))(react@19.0.1) @@ -192,7 +192,7 @@ importers: version: 4.0.4 ts-jest: specifier: ^29.4.4 - version: 29.4.4(@babel/core@7.28.0)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.28.0))(esbuild@0.25.9)(jest-util@30.0.5)(jest@30.1.3(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)))(typescript@5.7.3) + version: 29.4.4(@babel/core@7.29.0)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.29.0))(esbuild@0.25.9)(jest-util@30.0.5)(jest@30.1.3(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)))(typescript@5.7.3) tsx: specifier: 4.19.2 version: 4.19.2 @@ -232,6 +232,9 @@ importers: '@igniter/temporal': specifier: workspace:* version: link:../../packages/temporal + '@igniter/tx-verify': + specifier: workspace:* + version: link:../../packages/tx-verify '@pokt-foundation/pocketjs-provider': specifier: 2.2.1 version: 2.2.1 @@ -290,18 +293,27 @@ importers: '@igniter/typescript-config': specifier: workspace:* version: link:../../packages/typescript-config + '@types/jest': + specifier: ^30.0.0 + version: 30.0.0 '@types/pg': specifier: ^8.11.11 version: 8.11.11 '@types/url-join': specifier: ^4.0.1 version: 4.0.3 + jest: + specifier: ^30.1.3 + version: 30.1.3(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.14.1)(typescript@5.7.3)) nodemon: specifier: ^3.1.9 version: 3.1.10 npm-run-all: specifier: 4.1.5 version: 4.1.5 + ts-jest: + specifier: ^29.4.4 + version: 29.4.4(@babel/core@7.29.0)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.29.0))(esbuild@0.25.9)(jest-util@30.0.5)(jest@30.1.3(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.14.1)(typescript@5.7.3)))(typescript@5.7.3) tsc-alias: specifier: ^1.8.15 version: 1.8.15 @@ -388,10 +400,10 @@ importers: version: 0.456.0(react@19.0.1) next: specifier: 15.5.16 - version: 15.5.16(@babel/core@7.28.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1) + version: 15.5.16(@babel/core@7.29.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1) next-auth: specifier: 5.0.0-beta.30 - version: 5.0.0-beta.30(next@15.5.16(@babel/core@7.28.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1))(react@19.0.1) + version: 5.0.0-beta.30(next@15.5.16(@babel/core@7.29.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1))(react@19.0.1) next-themes: specifier: 0.4.3 version: 0.4.3(react-dom@19.0.1(react@19.0.1))(react@19.0.1) @@ -449,7 +461,7 @@ importers: version: 4.0.4 ts-jest: specifier: ^29.4.4 - version: 29.4.4(@babel/core@7.28.0)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.28.0))(esbuild@0.25.9)(jest-util@30.0.5)(jest@30.1.3(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)))(typescript@5.7.3) + version: 29.4.4(@babel/core@7.29.0)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.29.0))(esbuild@0.25.9)(jest-util@30.0.5)(jest@30.1.3(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)))(typescript@5.7.3) tsx: specifier: 4.19.2 version: 4.19.2 @@ -477,6 +489,9 @@ importers: '@igniter/temporal': specifier: workspace:* version: link:../../packages/temporal + '@igniter/tx-verify': + specifier: workspace:* + version: link:../../packages/tx-verify '@pokt-foundation/pocketjs-provider': specifier: 2.2.1 version: 2.2.1 @@ -526,15 +541,24 @@ importers: '@igniter/typescript-config': specifier: workspace:* version: link:../../packages/typescript-config + '@types/jest': + specifier: ^30.0.0 + version: 30.0.0 drizzle-kit: specifier: 0.31.4 version: 0.31.4 + jest: + specifier: ^30.1.3 + version: 30.1.3(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.14.1)(typescript@5.7.3)) nodemon: specifier: ^3.1.9 version: 3.1.10 npm-run-all: specifier: 4.1.5 version: 4.1.5 + ts-jest: + specifier: ^29.4.4 + version: 29.4.4(@babel/core@7.29.0)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.29.0))(esbuild@0.25.9)(jest-util@30.0.5)(jest@30.1.3(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.14.1)(typescript@5.7.3)))(typescript@5.7.3) tsc-alias: specifier: ^1.8.15 version: 1.8.15 @@ -574,7 +598,7 @@ importers: version: 30.1.3(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.14.1)(typescript@5.7.3)) ts-jest: specifier: ^29.4.4 - version: 29.4.4(@babel/core@7.28.0)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.28.0))(esbuild@0.25.9)(jest-util@30.0.5)(jest@30.1.3(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.14.1)(typescript@5.7.3)))(typescript@5.7.3) + version: 29.4.4(@babel/core@7.29.0)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.29.0))(esbuild@0.25.9)(jest-util@30.0.5)(jest@30.1.3(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.14.1)(typescript@5.7.3)))(typescript@5.7.3) tsc-alias: specifier: ^1.8.15 version: 1.8.15 @@ -642,7 +666,7 @@ importers: version: 30.1.3(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.14.1)(typescript@5.7.3)) ts-jest: specifier: ^29.4.4 - version: 29.4.4(@babel/core@7.28.0)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.28.0))(esbuild@0.25.9)(jest-util@30.0.5)(jest@30.1.3(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.14.1)(typescript@5.7.3)))(typescript@5.7.3) + version: 29.4.4(@babel/core@7.29.0)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.29.0))(esbuild@0.25.9)(jest-util@30.0.5)(jest@30.1.3(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.14.1)(typescript@5.7.3)))(typescript@5.7.3) tsc-alias: specifier: ^1.8.15 version: 1.8.15 @@ -750,6 +774,9 @@ importers: '@igniter/logger': specifier: workspace:* version: link:../logger + '@igniter/tx-verify': + specifier: workspace:* + version: link:../tx-verify cosmjs-types: specifier: 0.10.1 version: 0.10.1 @@ -771,7 +798,7 @@ importers: version: 30.1.3(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.14.1)(typescript@5.7.3)) ts-jest: specifier: ^29.4.4 - version: 29.4.4(@babel/core@7.28.0)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.28.0))(esbuild@0.25.9)(jest-util@30.0.5)(jest@30.1.3(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.14.1)(typescript@5.7.3)))(typescript@5.7.3) + version: 29.4.4(@babel/core@7.29.0)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.29.0))(esbuild@0.25.9)(jest-util@30.0.5)(jest@30.1.3(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.14.1)(typescript@5.7.3)))(typescript@5.7.3) tsc-alias: specifier: ^1.8.15 version: 1.8.15 @@ -801,6 +828,30 @@ importers: specifier: ^1.8.15 version: 1.8.15 + packages/tx-verify: + devDependencies: + '@igniter/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@igniter/typescript-config': + specifier: workspace:* + version: link:../typescript-config + '@types/jest': + specifier: ^30.0.0 + version: 30.0.0 + '@types/node': + specifier: 22.14.1 + version: 22.14.1 + jest: + specifier: ^30.1.3 + version: 30.1.3(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.14.1)(typescript@5.7.3)) + ts-jest: + specifier: ^29.4.4 + version: 29.4.4(@babel/core@7.29.0)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.29.0))(esbuild@0.25.9)(jest-util@30.0.5)(jest@30.1.3(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.14.1)(typescript@5.7.3)))(typescript@5.7.3) + tsc-alias: + specifier: ^1.8.15 + version: 1.8.15 + packages/typescript-config: {} packages/ui: @@ -826,6 +877,9 @@ importers: '@igniter/graphql': specifier: workspace:* version: link:../graphql + '@igniter/tx-verify': + specifier: workspace:* + version: link:../tx-verify '@mui/system': specifier: ^5.14.11 version: 5.17.1(@emotion/react@11.14.0(@types/react@19.0.8)(react@19.0.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.8)(react@19.0.1))(@types/react@19.0.8)(react@19.0.1))(@types/react@19.0.8)(react@19.0.1) @@ -918,7 +972,7 @@ importers: version: 0.456.0(react@19.0.1) next: specifier: 15.5.16 - version: 15.5.16(@babel/core@7.28.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1) + version: 15.5.16(@babel/core@7.29.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1) next-themes: specifier: 0.4.3 version: 0.4.3(react-dom@19.0.1(react@19.0.1))(react@19.0.1) @@ -10377,6 +10431,7 @@ packages: uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true v8-compile-cache-lib@3.0.1: @@ -10714,7 +10769,7 @@ snapshots: dependencies: '@apollo/client': 3.13.8(@types/react@19.0.8)(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.20.1(bufferutil@4.0.9)))(graphql@16.11.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1) '@apollo/client-react-streaming': 0.12.2(@apollo/client@3.13.8(@types/react@19.0.8)(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.20.1(bufferutil@4.0.9)))(graphql@16.11.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1))(@types/react@19.0.8)(graphql@16.11.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1) - next: 15.5.16(@babel/core@7.28.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1) + next: 15.5.16(@babel/core@7.29.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1) react: 19.0.1 transitivePeerDependencies: - '@types/react' @@ -14526,7 +14581,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 25.8.0 + '@types/node': 22.14.1 jest-mock: 29.7.0 optional: true @@ -14552,7 +14607,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 25.8.0 + '@types/node': 22.14.1 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -14693,7 +14748,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 25.8.0 + '@types/node': 22.14.1 '@types/yargs': 17.0.35 chalk: 4.1.2 optional: true @@ -16277,7 +16332,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 25.8.0 + '@types/node': 22.14.1 optional: true '@types/inquirer@6.5.0': @@ -16314,7 +16369,7 @@ snapshots: '@types/node-forge@1.3.14': dependencies: - '@types/node': 25.8.0 + '@types/node': 22.14.1 optional: true '@types/node@22.12.0': @@ -16952,6 +17007,20 @@ snapshots: transitivePeerDependencies: - supports-color + babel-jest@30.1.2(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@jest/transform': 30.1.2 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 7.0.1 + babel-preset-jest: 30.0.1(@babel/core@7.29.0) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + optional: true + babel-plugin-istanbul@6.1.1: dependencies: '@babel/helper-plugin-utils': 7.28.6 @@ -17105,6 +17174,26 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.0) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.0) + babel-preset-current-node-syntax@1.1.0(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.29.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) + optional: true + babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 @@ -17155,6 +17244,13 @@ snapshots: babel-plugin-jest-hoist: 30.0.1 babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.0) + babel-preset-jest@30.0.1(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + babel-plugin-jest-hoist: 30.0.1 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.29.0) + optional: true + balanced-match@1.0.2: {} base-64@0.1.0: {} @@ -17505,7 +17601,7 @@ snapshots: chrome-launcher@0.15.2: dependencies: - '@types/node': 25.8.0 + '@types/node': 22.14.1 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -17517,7 +17613,7 @@ snapshots: chromium-edge-launcher@0.2.0: dependencies: - '@types/node': 25.8.0 + '@types/node': 22.14.1 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -19783,7 +19879,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 25.8.0 + '@types/node': 22.14.1 jest-mock: 29.7.0 jest-util: 29.7.0 optional: true @@ -19805,7 +19901,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 25.8.0 + '@types/node': 22.14.1 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -19873,7 +19969,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 25.8.0 + '@types/node': 22.14.1 jest-util: 29.7.0 optional: true @@ -19993,7 +20089,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 25.8.0 + '@types/node': 22.14.1 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -20047,7 +20143,7 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 25.8.0 + '@types/node': 22.14.1 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -20892,10 +20988,10 @@ snapshots: netmask@2.0.2: {} - next-auth@5.0.0-beta.30(next@15.5.16(@babel/core@7.28.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1))(react@19.0.1): + next-auth@5.0.0-beta.30(next@15.5.16(@babel/core@7.29.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1))(react@19.0.1): dependencies: '@auth/core': 0.41.0 - next: 15.5.16(@babel/core@7.28.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1) + next: 15.5.16(@babel/core@7.29.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1) react: 19.0.1 next-themes@0.4.3(react-dom@19.0.1(react@19.0.1))(react@19.0.1): @@ -20903,7 +20999,7 @@ snapshots: react: 19.0.1 react-dom: 19.0.1(react@19.0.1) - next@15.5.16(@babel/core@7.28.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1): + next@15.5.16(@babel/core@7.29.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.1(react@19.0.1))(react@19.0.1): dependencies: '@next/env': 15.5.16 '@swc/helpers': 0.5.15 @@ -20911,7 +21007,7 @@ snapshots: postcss: 8.4.31 react: 19.0.1 react-dom: 19.0.1(react@19.0.1) - styled-jsx: 5.1.6(@babel/core@7.28.0)(babel-plugin-macros@3.1.0)(react@19.0.1) + styled-jsx: 5.1.6(@babel/core@7.29.0)(babel-plugin-macros@3.1.0)(react@19.0.1) optionalDependencies: '@next/swc-darwin-arm64': 15.5.16 '@next/swc-darwin-x64': 15.5.16 @@ -22566,12 +22662,12 @@ snapshots: structured-headers@0.4.1: optional: true - styled-jsx@5.1.6(@babel/core@7.28.0)(babel-plugin-macros@3.1.0)(react@19.0.1): + styled-jsx@5.1.6(@babel/core@7.29.0)(babel-plugin-macros@3.1.0)(react@19.0.1): dependencies: client-only: 0.0.1 react: 19.0.1 optionalDependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 babel-plugin-macros: 3.1.0 stylis@4.2.0: {} @@ -22821,7 +22917,7 @@ snapshots: dependencies: tslib: 2.8.1 - ts-jest@29.4.4(@babel/core@7.28.0)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.28.0))(esbuild@0.25.9)(jest-util@30.0.5)(jest@30.1.3(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)))(typescript@5.7.3): + ts-jest@29.4.4(@babel/core@7.29.0)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.29.0))(esbuild@0.25.9)(jest-util@30.0.5)(jest@30.1.3(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)))(typescript@5.7.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -22835,14 +22931,14 @@ snapshots: typescript: 5.7.3 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@jest/transform': 30.1.2 '@jest/types': 30.0.5 - babel-jest: 30.1.2(@babel/core@7.28.0) + babel-jest: 30.1.2(@babel/core@7.29.0) esbuild: 0.25.9 jest-util: 30.0.5 - ts-jest@29.4.4(@babel/core@7.28.0)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.28.0))(esbuild@0.25.9)(jest-util@30.0.5)(jest@30.1.3(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.14.1)(typescript@5.7.3)))(typescript@5.7.3): + ts-jest@29.4.4(@babel/core@7.29.0)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.29.0))(esbuild@0.25.9)(jest-util@30.0.5)(jest@30.1.3(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.9))(ts-node@10.9.2(@swc/core@1.10.16(@swc/helpers@0.5.15))(@types/node@22.14.1)(typescript@5.7.3)))(typescript@5.7.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -22856,10 +22952,10 @@ snapshots: typescript: 5.7.3 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@jest/transform': 30.1.2 '@jest/types': 30.0.5 - babel-jest: 30.1.2(@babel/core@7.28.0) + babel-jest: 30.1.2(@babel/core@7.29.0) esbuild: 0.25.9 jest-util: 30.0.5