@usesigil/kit 0.13.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/advanced-analytics.d.ts +3 -1
- package/dist/advanced-analytics.d.ts.map +1 -1
- package/dist/advanced-analytics.js +4 -6
- package/dist/advanced-analytics.js.map +1 -1
- package/dist/agent-bootstrap.d.ts +118 -0
- package/dist/agent-bootstrap.d.ts.map +1 -0
- package/dist/agent-bootstrap.js +211 -0
- package/dist/agent-bootstrap.js.map +1 -0
- package/dist/agent-errors.d.ts +3 -3
- package/dist/agent-errors.d.ts.map +1 -1
- package/dist/agent-errors.js +230 -206
- package/dist/agent-errors.js.map +1 -1
- package/dist/build-unsigned.d.ts +152 -0
- package/dist/build-unsigned.d.ts.map +1 -0
- package/dist/build-unsigned.js +152 -0
- package/dist/build-unsigned.js.map +1 -0
- package/dist/constraints/index.d.ts +23 -0
- package/dist/constraints/index.d.ts.map +1 -0
- package/dist/constraints/index.js +24 -0
- package/dist/constraints/index.js.map +1 -0
- package/dist/create-vault.d.ts +10 -2
- package/dist/create-vault.d.ts.map +1 -1
- package/dist/create-vault.js +10 -3
- package/dist/create-vault.js.map +1 -1
- package/dist/dashboard/constraint-builders.d.ts +82 -0
- package/dist/dashboard/constraint-builders.d.ts.map +1 -0
- package/dist/dashboard/constraint-builders.js +204 -0
- package/dist/dashboard/constraint-builders.js.map +1 -0
- package/dist/dashboard/errors.d.ts +37 -0
- package/dist/dashboard/errors.d.ts.map +1 -1
- package/dist/dashboard/errors.js +76 -0
- package/dist/dashboard/errors.js.map +1 -1
- package/dist/dashboard/from-json.d.ts.map +1 -1
- package/dist/dashboard/from-json.js +1 -5
- package/dist/dashboard/from-json.js.map +1 -1
- package/dist/dashboard/index.d.ts +31 -10
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +40 -10
- package/dist/dashboard/index.js.map +1 -1
- package/dist/dashboard/mutations.d.ts +60 -3
- package/dist/dashboard/mutations.d.ts.map +1 -1
- package/dist/dashboard/mutations.js +129 -32
- package/dist/dashboard/mutations.js.map +1 -1
- package/dist/dashboard/post-assertion-validation.d.ts +88 -0
- package/dist/dashboard/post-assertion-validation.d.ts.map +1 -0
- package/dist/dashboard/post-assertion-validation.js +191 -0
- package/dist/dashboard/post-assertion-validation.js.map +1 -0
- package/dist/dashboard/reads.d.ts +93 -1
- package/dist/dashboard/reads.d.ts.map +1 -1
- package/dist/dashboard/reads.js +244 -40
- package/dist/dashboard/reads.js.map +1 -1
- package/dist/dashboard/types.d.ts +149 -21
- package/dist/dashboard/types.d.ts.map +1 -1
- package/dist/errors/codes.js +1 -1
- package/dist/event-analytics.d.ts +1 -3
- package/dist/event-analytics.d.ts.map +1 -1
- package/dist/event-analytics.js +4 -9
- package/dist/event-analytics.js.map +1 -1
- package/dist/events.js +2 -2
- package/dist/events.js.map +1 -1
- package/dist/generated/accounts/agentVault.d.ts +0 -20
- package/dist/generated/accounts/agentVault.d.ts.map +1 -1
- package/dist/generated/accounts/agentVault.js +0 -2
- package/dist/generated/accounts/agentVault.js.map +1 -1
- package/dist/generated/accounts/pendingAgentPermissionsUpdate.d.ts +12 -0
- package/dist/generated/accounts/pendingAgentPermissionsUpdate.d.ts.map +1 -1
- package/dist/generated/accounts/pendingAgentPermissionsUpdate.js +3 -1
- package/dist/generated/accounts/pendingAgentPermissionsUpdate.js.map +1 -1
- package/dist/generated/accounts/pendingCloseConstraints.d.ts +12 -0
- package/dist/generated/accounts/pendingCloseConstraints.d.ts.map +1 -1
- package/dist/generated/accounts/pendingCloseConstraints.js +4 -2
- package/dist/generated/accounts/pendingCloseConstraints.js.map +1 -1
- package/dist/generated/accounts/pendingConstraintsUpdate.d.ts +14 -0
- package/dist/generated/accounts/pendingConstraintsUpdate.d.ts.map +1 -1
- package/dist/generated/accounts/pendingConstraintsUpdate.js +4 -2
- package/dist/generated/accounts/pendingConstraintsUpdate.js.map +1 -1
- package/dist/generated/accounts/pendingPolicyUpdate.d.ts +24 -8
- package/dist/generated/accounts/pendingPolicyUpdate.d.ts.map +1 -1
- package/dist/generated/accounts/pendingPolicyUpdate.js +6 -8
- package/dist/generated/accounts/pendingPolicyUpdate.js.map +1 -1
- package/dist/generated/accounts/policyConfig.d.ts +28 -18
- package/dist/generated/accounts/policyConfig.d.ts.map +1 -1
- package/dist/generated/accounts/policyConfig.js +4 -8
- package/dist/generated/accounts/policyConfig.js.map +1 -1
- package/dist/generated/accounts/sessionAuthority.d.ts +18 -8
- package/dist/generated/accounts/sessionAuthority.d.ts.map +1 -1
- package/dist/generated/accounts/sessionAuthority.js +4 -6
- package/dist/generated/accounts/sessionAuthority.js.map +1 -1
- package/dist/generated/errors/sigil.d.ts +95 -89
- package/dist/generated/errors/sigil.d.ts.map +1 -1
- package/dist/generated/errors/sigil.js +107 -98
- package/dist/generated/errors/sigil.js.map +1 -1
- package/dist/generated/event-discriminators.js +1 -1
- package/dist/generated/event-discriminators.js.map +1 -1
- package/dist/generated/instructions/cleanupOrphanConstraintsPda.d.ts +67 -0
- package/dist/generated/instructions/cleanupOrphanConstraintsPda.d.ts.map +1 -0
- package/dist/generated/instructions/cleanupOrphanConstraintsPda.js +120 -0
- package/dist/generated/instructions/cleanupOrphanConstraintsPda.js.map +1 -0
- package/dist/generated/instructions/freezeVault.d.ts +8 -5
- package/dist/generated/instructions/freezeVault.d.ts.map +1 -1
- package/dist/generated/instructions/freezeVault.js +14 -3
- package/dist/generated/instructions/freezeVault.js.map +1 -1
- package/dist/generated/instructions/index.d.ts +1 -1
- package/dist/generated/instructions/index.d.ts.map +1 -1
- package/dist/generated/instructions/index.js +1 -1
- package/dist/generated/instructions/index.js.map +1 -1
- package/dist/generated/instructions/initializeVault.d.ts +0 -8
- package/dist/generated/instructions/initializeVault.d.ts.map +1 -1
- package/dist/generated/instructions/initializeVault.js +0 -4
- package/dist/generated/instructions/initializeVault.js.map +1 -1
- package/dist/generated/instructions/queuePolicyUpdate.d.ts +8 -16
- package/dist/generated/instructions/queuePolicyUpdate.d.ts.map +1 -1
- package/dist/generated/instructions/queuePolicyUpdate.js +4 -8
- package/dist/generated/instructions/queuePolicyUpdate.js.map +1 -1
- package/dist/generated/programs/sigil.d.ts +26 -26
- package/dist/generated/programs/sigil.d.ts.map +1 -1
- package/dist/generated/programs/sigil.js +34 -34
- package/dist/generated/programs/sigil.js.map +1 -1
- package/dist/generated/types/accountConstraint.d.ts +16 -1
- package/dist/generated/types/accountConstraint.d.ts.map +1 -1
- package/dist/generated/types/accountConstraint.js +2 -0
- package/dist/generated/types/accountConstraint.js.map +1 -1
- package/dist/generated/types/accountConstraintZC.d.ts +7 -0
- package/dist/generated/types/accountConstraintZC.d.ts.map +1 -1
- package/dist/generated/types/accountConstraintZC.js +4 -2
- package/dist/generated/types/accountConstraintZC.js.map +1 -1
- package/dist/generated/types/constraintEntry.d.ts +0 -8
- package/dist/generated/types/constraintEntry.d.ts.map +1 -1
- package/dist/generated/types/constraintEntry.js +1 -5
- package/dist/generated/types/constraintEntry.js.map +1 -1
- package/dist/generated/types/constraintEntryZC.d.ts +22 -27
- package/dist/generated/types/constraintEntryZC.d.ts.map +1 -1
- package/dist/generated/types/constraintEntryZC.js +4 -6
- package/dist/generated/types/constraintEntryZC.js.map +1 -1
- package/dist/generated/types/index.d.ts +1 -1
- package/dist/generated/types/index.d.ts.map +1 -1
- package/dist/generated/types/index.js +1 -1
- package/dist/generated/types/index.js.map +1 -1
- package/dist/generated/types/orphanConstraintsPdaCleaned.d.ts +22 -0
- package/dist/generated/types/orphanConstraintsPdaCleaned.d.ts.map +1 -0
- package/dist/generated/types/{positionsSynced.js → orphanConstraintsPdaCleaned.js} +8 -10
- package/dist/generated/types/orphanConstraintsPdaCleaned.js.map +1 -0
- package/dist/generated/types/sessionFinalized.d.ts +0 -4
- package/dist/generated/types/sessionFinalized.d.ts.map +1 -1
- package/dist/generated/types/sessionFinalized.js +1 -3
- package/dist/generated/types/sessionFinalized.js.map +1 -1
- package/dist/generated/types/vaultFrozen.d.ts +12 -0
- package/dist/generated/types/vaultFrozen.d.ts.map +1 -1
- package/dist/generated/types/vaultFrozen.js +3 -1
- package/dist/generated/types/vaultFrozen.js.map +1 -1
- package/dist/index.d.ts +13 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -2
- package/dist/index.js.map +1 -1
- package/dist/inscribe.d.ts +0 -8
- package/dist/inscribe.d.ts.map +1 -1
- package/dist/inscribe.js +0 -2
- package/dist/inscribe.js.map +1 -1
- package/dist/kit-adapter.d.ts +1 -1
- package/dist/kit-adapter.d.ts.map +1 -1
- package/dist/kit-adapter.js +1 -1
- package/dist/kit-adapter.js.map +1 -1
- package/dist/logger.d.ts +48 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +36 -0
- package/dist/logger.js.map +1 -1
- package/dist/owner-transaction.d.ts +8 -0
- package/dist/owner-transaction.d.ts.map +1 -1
- package/dist/owner-transaction.js +1 -0
- package/dist/owner-transaction.js.map +1 -1
- package/dist/post-assertions/cross-field-lte.d.ts +134 -0
- package/dist/post-assertions/cross-field-lte.d.ts.map +1 -0
- package/dist/post-assertions/cross-field-lte.js +129 -0
- package/dist/post-assertions/cross-field-lte.js.map +1 -0
- package/dist/post-assertions/index.d.ts +28 -0
- package/dist/post-assertions/index.d.ts.map +1 -0
- package/dist/post-assertions/index.js +28 -0
- package/dist/post-assertions/index.js.map +1 -0
- package/dist/post-assertions/presets/flash-trade.d.ts +139 -0
- package/dist/post-assertions/presets/flash-trade.d.ts.map +1 -0
- package/dist/post-assertions/presets/flash-trade.js +154 -0
- package/dist/post-assertions/presets/flash-trade.js.map +1 -0
- package/dist/presets.d.ts +1 -13
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +0 -10
- package/dist/presets.js.map +1 -1
- package/dist/preview-create-vault.d.ts +280 -0
- package/dist/preview-create-vault.d.ts.map +1 -0
- package/dist/preview-create-vault.js +477 -0
- package/dist/preview-create-vault.js.map +1 -0
- package/dist/protocol-registry/annotations/drift.json +7 -0
- package/dist/protocol-registry/annotations/flash-trade.json +7 -0
- package/dist/protocol-registry/annotations/jupiter-borrow.json +7 -0
- package/dist/protocol-registry/annotations/jupiter-earn.json +7 -0
- package/dist/protocol-registry/annotations/jupiter-lend.json +7 -0
- package/dist/protocol-registry/annotations/jupiter.json +7 -0
- package/dist/protocol-registry/annotations/kamino.json +7 -0
- package/dist/protocol-registry/index.d.ts +45 -0
- package/dist/protocol-registry/index.d.ts.map +1 -0
- package/dist/protocol-registry/index.js +76 -0
- package/dist/protocol-registry/index.js.map +1 -0
- package/dist/protocol-tier.d.ts +157 -0
- package/dist/protocol-tier.d.ts.map +1 -0
- package/dist/protocol-tier.js +104 -0
- package/dist/protocol-tier.js.map +1 -0
- package/dist/seal.d.ts.map +1 -1
- package/dist/seal.js +30 -12
- package/dist/seal.js.map +1 -1
- package/dist/sigil.d.ts +0 -8
- package/dist/sigil.d.ts.map +1 -1
- package/dist/simulation.d.ts.map +1 -1
- package/dist/simulation.js +131 -82
- package/dist/simulation.js.map +1 -1
- package/dist/testing/devnet.d.ts.map +1 -1
- package/dist/testing/devnet.js +0 -2
- package/dist/testing/devnet.js.map +1 -1
- package/dist/testing/errors/expect.d.ts +137 -0
- package/dist/testing/errors/expect.d.ts.map +1 -0
- package/dist/testing/errors/expect.js +372 -0
- package/dist/testing/errors/expect.js.map +1 -0
- package/dist/testing/errors/index.d.ts +3 -0
- package/dist/testing/errors/index.d.ts.map +1 -0
- package/dist/testing/errors/index.js +8 -0
- package/dist/testing/errors/index.js.map +1 -0
- package/dist/testing/errors/names.generated.d.ts +188 -0
- package/dist/testing/errors/names.generated.d.ts.map +1 -0
- package/dist/testing/errors/names.generated.js +183 -0
- package/dist/testing/errors/names.generated.js.map +1 -0
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +8 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/mock-rpc.d.ts +8 -0
- package/dist/testing/mock-rpc.d.ts.map +1 -1
- package/dist/testing/mock-rpc.js +14 -0
- package/dist/testing/mock-rpc.js.map +1 -1
- package/dist/testing/mock-state.d.ts +0 -2
- package/dist/testing/mock-state.d.ts.map +1 -1
- package/dist/testing/mock-state.js +2 -5
- package/dist/testing/mock-state.js.map +1 -1
- package/dist/types.d.ts +1 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +5 -9
- package/dist/types.js.map +1 -1
- package/dist/vault-analytics.d.ts +0 -1
- package/dist/vault-analytics.d.ts.map +1 -1
- package/dist/vault-analytics.js +0 -1
- package/dist/vault-analytics.js.map +1 -1
- package/package.json +15 -3
- package/dist/generated/instructions/syncPositions.d.ts +0 -44
- package/dist/generated/instructions/syncPositions.d.ts.map +0 -1
- package/dist/generated/instructions/syncPositions.js +0 -72
- package/dist/generated/instructions/syncPositions.js.map +0 -1
- package/dist/generated/types/positionsSynced.d.ts +0 -24
- package/dist/generated/types/positionsSynced.d.ts.map +0 -1
- package/dist/generated/types/positionsSynced.js.map +0 -1
- package/dist/integrations/protocol-handler.d.ts +0 -59
- package/dist/integrations/protocol-handler.d.ts.map +0 -1
- package/dist/integrations/protocol-handler.js +0 -9
- package/dist/integrations/protocol-handler.js.map +0 -1
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @usesigil/kit/dashboard — Client-side PostAssertionEntry validator.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the on-chain `PostExecutionAssertions::validate_entries()` check
|
|
5
|
+
* in `programs/sigil/src/state/post_assertions.rs:118`. Fails fast in the
|
|
6
|
+
* dashboard before the caller burns an RPC round-trip on an entry the
|
|
7
|
+
* program will reject.
|
|
8
|
+
*
|
|
9
|
+
* Pure function: no RPC, no I/O, no side effects. Safe to call in a render
|
|
10
|
+
* loop or form handler.
|
|
11
|
+
*
|
|
12
|
+
* Every rejection path carries a human-readable message that includes the
|
|
13
|
+
* offending entry index so callers can pinpoint the bad entry in a multi-
|
|
14
|
+
* entry batch (Phase 2 PRD ISC-19).
|
|
15
|
+
*
|
|
16
|
+
* ## DxError compatibility
|
|
17
|
+
*
|
|
18
|
+
* {@link PostAssertionValidationError} is structurally a `DxError` — it has
|
|
19
|
+
* numeric `code`, string `message`, and `recovery: string[]`. This means
|
|
20
|
+
* the mutation wrapper does NOT need to wrap it via `toDxError` before
|
|
21
|
+
* re-throwing; FE always sees the typed fields (`validationCode`,
|
|
22
|
+
* `entryIndex`) intact alongside the standard DxError surface.
|
|
23
|
+
*
|
|
24
|
+
* @see programs/sigil/src/state/post_assertions.rs — source of truth
|
|
25
|
+
*/
|
|
26
|
+
import type { PostAssertionEntry } from "../generated/types/postAssertionEntry.js";
|
|
27
|
+
/**
|
|
28
|
+
* Machine-readable validation failure codes.
|
|
29
|
+
*
|
|
30
|
+
* Callers can branch on these via `err.validationCode` to produce tier-
|
|
31
|
+
* appropriate UI messaging without string-matching the human `message`
|
|
32
|
+
* field. The enum ordering mirrors the on-chain check sequence so the
|
|
33
|
+
* first failure a caller sees is also the first one `validate_entries`
|
|
34
|
+
* would reject.
|
|
35
|
+
*/
|
|
36
|
+
export type PostAssertionValidationCode = "entries_not_an_array" | "entries_contain_null" | "entry_count_out_of_range" | "value_len_out_of_range" | "expected_value_too_short" | "operator_out_of_range" | "assertion_mode_out_of_range" | "offset_out_of_range" | "cross_field_offset_b_out_of_range" | "cross_field_multiplier_bps_out_of_range" | "cross_field_flags_out_of_range" | "delta_mode_value_len_too_large" | "cross_field_value_len_too_large" | "cross_field_requires_absolute_mode" | "cross_field_multiplier_must_be_positive" | "cross_field_unknown_flags" | "cross_field_disabled_fields_must_be_zero";
|
|
37
|
+
/**
|
|
38
|
+
* Numeric `DxError.code` for every PostAssertion validation failure.
|
|
39
|
+
*
|
|
40
|
+
* All validation-class failures share this single numeric code — the more
|
|
41
|
+
* specific `validationCode` string discriminates. 7008 is the existing SDK
|
|
42
|
+
* "PRECHECK_FAILED" bucket (see `dashboard/errors.ts` SIGIL_ERROR_TO_NUMERIC),
|
|
43
|
+
* which is semantically correct: the client-side validator IS a pre-check
|
|
44
|
+
* for the on-chain validate_entries call.
|
|
45
|
+
*/
|
|
46
|
+
export declare const DX_CODE_POST_ASSERTION_VALIDATION: 7008;
|
|
47
|
+
/**
|
|
48
|
+
* Thrown by {@link validatePostAssertionEntries} when an entry fails any
|
|
49
|
+
* check the on-chain program would enforce.
|
|
50
|
+
*
|
|
51
|
+
* Structurally compatible with `DxError` — exposes `code: number`,
|
|
52
|
+
* `message: string`, and `recovery: string[]` so FE can render the error
|
|
53
|
+
* without re-wrapping. Also carries the typed `validationCode` (the
|
|
54
|
+
* specific failure reason) and `entryIndex` (the zero-based index of the
|
|
55
|
+
* offending entry, or `null` for batch-level failures).
|
|
56
|
+
*
|
|
57
|
+
* Mutation wrappers re-throw this instance directly — they do NOT wrap
|
|
58
|
+
* via `toDxError`. Wrapping would collapse the typed fields into
|
|
59
|
+
* `DX_ERROR_CODE_UNMAPPED` (7999), breaking the file docblock's promise
|
|
60
|
+
* that the FE can branch on `validationCode`.
|
|
61
|
+
*/
|
|
62
|
+
export declare class PostAssertionValidationError extends Error {
|
|
63
|
+
readonly code: number;
|
|
64
|
+
readonly validationCode: PostAssertionValidationCode;
|
|
65
|
+
readonly entryIndex: number | null;
|
|
66
|
+
readonly recovery: string[];
|
|
67
|
+
/**
|
|
68
|
+
* Always `false` — this error is thrown at CLIENT validation time,
|
|
69
|
+
* BEFORE any RPC round-trip. Present to satisfy the DxError structural
|
|
70
|
+
* contract (every DxError carries `onChainReverted`; see FE↔BE
|
|
71
|
+
* contract v2.2 C2). Pre-existing callers need no migration.
|
|
72
|
+
*/
|
|
73
|
+
readonly onChainReverted: boolean;
|
|
74
|
+
constructor(validationCode: PostAssertionValidationCode, entryIndex: number | null, message: string);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Validate a batch of PostAssertionEntry values against the exact rules
|
|
78
|
+
* the on-chain program enforces.
|
|
79
|
+
*
|
|
80
|
+
* Throws on the FIRST failing check (same as the Rust `for entry in entries`
|
|
81
|
+
* loop). Use a try/catch to recover; the error's `validationCode` +
|
|
82
|
+
* `entryIndex` identify the offending entry.
|
|
83
|
+
*
|
|
84
|
+
* @param entries Batch to check. Must be 1..=4 entries.
|
|
85
|
+
* @throws {PostAssertionValidationError} with the specific failure code.
|
|
86
|
+
*/
|
|
87
|
+
export declare function validatePostAssertionEntries(entries: readonly PostAssertionEntry[]): void;
|
|
88
|
+
//# sourceMappingURL=post-assertion-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-assertion-validation.d.ts","sourceRoot":"","sources":["../../src/dashboard/post-assertion-validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AA0BnF;;;;;;;;GAQG;AACH,MAAM,MAAM,2BAA2B,GACnC,sBAAsB,GACtB,sBAAsB,GACtB,0BAA0B,GAC1B,wBAAwB,GACxB,0BAA0B,GAC1B,uBAAuB,GACvB,6BAA6B,GAC7B,qBAAqB,GACrB,mCAAmC,GACnC,yCAAyC,GACzC,gCAAgC,GAChC,gCAAgC,GAChC,iCAAiC,GACjC,oCAAoC,GACpC,yCAAyC,GACzC,2BAA2B,GAC3B,0CAA0C,CAAC;AAE/C;;;;;;;;GAQG;AACH,eAAO,MAAM,iCAAiC,EAAG,IAAa,CAAC;AAE/D;;;;;;;;;;;;;;GAcG;AACH,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,cAAc,EAAE,2BAA2B,CAAC;IAC5D,SAAgB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,SAAgB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnC;;;;;OAKG;IACH,SAAgB,eAAe,EAAE,OAAO,CAAS;gBAG/C,cAAc,EAAE,2BAA2B,EAC3C,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,OAAO,EAAE,MAAM;CAelB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,SAAS,kBAAkB,EAAE,GACrC,IAAI,CAkCN"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// ─── Constants (pinned to Rust source) ────────────────────────────────────
|
|
2
|
+
// These MUST match the Rust constants. If they drift, the validator will
|
|
3
|
+
// pass inputs the program then rejects (or vice-versa), producing confusing
|
|
4
|
+
// round-trip failures. Keep in sync with `programs/sigil/src/state/*.rs`.
|
|
5
|
+
/** `programs/sigil/src/state/post_assertions.rs:7` */
|
|
6
|
+
const MAX_POST_ASSERTION_ENTRIES = 4;
|
|
7
|
+
/** `programs/sigil/src/state/constraints.rs:9` */
|
|
8
|
+
const MAX_CONSTRAINT_VALUE_LEN = 32;
|
|
9
|
+
/** Operator IDs (0..=6) — see `programs/sigil/src/state/constraints.rs ConstraintOperator`. */
|
|
10
|
+
const MAX_OPERATOR_VALUE = 6;
|
|
11
|
+
/** AssertionMode IDs (0..=3) — see `programs/sigil/src/state/post_assertions.rs AssertionMode`. */
|
|
12
|
+
const MAX_ASSERTION_MODE_VALUE = 3;
|
|
13
|
+
/** CrossFieldLte enable bit. Every other bit is reserved; validator rejects unknown flags. */
|
|
14
|
+
const CROSS_FIELD_LTE_FLAG = 0x01;
|
|
15
|
+
/** CrossField payloads are parsed as u64 on-chain; 8 is the max byte length. */
|
|
16
|
+
const CROSS_FIELD_MAX_VALUE_LEN = 8;
|
|
17
|
+
/** Delta modes (MaxDecrease=1, MaxIncrease=2, NoChange=3) also parse as u64. */
|
|
18
|
+
const DELTA_MAX_VALUE_LEN = 8;
|
|
19
|
+
/**
|
|
20
|
+
* Numeric `DxError.code` for every PostAssertion validation failure.
|
|
21
|
+
*
|
|
22
|
+
* All validation-class failures share this single numeric code — the more
|
|
23
|
+
* specific `validationCode` string discriminates. 7008 is the existing SDK
|
|
24
|
+
* "PRECHECK_FAILED" bucket (see `dashboard/errors.ts` SIGIL_ERROR_TO_NUMERIC),
|
|
25
|
+
* which is semantically correct: the client-side validator IS a pre-check
|
|
26
|
+
* for the on-chain validate_entries call.
|
|
27
|
+
*/
|
|
28
|
+
export const DX_CODE_POST_ASSERTION_VALIDATION = 7008;
|
|
29
|
+
/**
|
|
30
|
+
* Thrown by {@link validatePostAssertionEntries} when an entry fails any
|
|
31
|
+
* check the on-chain program would enforce.
|
|
32
|
+
*
|
|
33
|
+
* Structurally compatible with `DxError` — exposes `code: number`,
|
|
34
|
+
* `message: string`, and `recovery: string[]` so FE can render the error
|
|
35
|
+
* without re-wrapping. Also carries the typed `validationCode` (the
|
|
36
|
+
* specific failure reason) and `entryIndex` (the zero-based index of the
|
|
37
|
+
* offending entry, or `null` for batch-level failures).
|
|
38
|
+
*
|
|
39
|
+
* Mutation wrappers re-throw this instance directly — they do NOT wrap
|
|
40
|
+
* via `toDxError`. Wrapping would collapse the typed fields into
|
|
41
|
+
* `DX_ERROR_CODE_UNMAPPED` (7999), breaking the file docblock's promise
|
|
42
|
+
* that the FE can branch on `validationCode`.
|
|
43
|
+
*/
|
|
44
|
+
export class PostAssertionValidationError extends Error {
|
|
45
|
+
code;
|
|
46
|
+
validationCode;
|
|
47
|
+
entryIndex;
|
|
48
|
+
recovery;
|
|
49
|
+
/**
|
|
50
|
+
* Always `false` — this error is thrown at CLIENT validation time,
|
|
51
|
+
* BEFORE any RPC round-trip. Present to satisfy the DxError structural
|
|
52
|
+
* contract (every DxError carries `onChainReverted`; see FE↔BE
|
|
53
|
+
* contract v2.2 C2). Pre-existing callers need no migration.
|
|
54
|
+
*/
|
|
55
|
+
onChainReverted = false;
|
|
56
|
+
constructor(validationCode, entryIndex, message) {
|
|
57
|
+
super(message);
|
|
58
|
+
this.name = "PostAssertionValidationError";
|
|
59
|
+
this.code = DX_CODE_POST_ASSERTION_VALIDATION;
|
|
60
|
+
this.validationCode = validationCode;
|
|
61
|
+
this.entryIndex = entryIndex;
|
|
62
|
+
this.recovery = [
|
|
63
|
+
entryIndex !== null
|
|
64
|
+
? `Fix PostAssertion entry at index ${entryIndex} (${validationCode}) and retry.`
|
|
65
|
+
: `Fix PostAssertion batch (${validationCode}) and retry.`,
|
|
66
|
+
];
|
|
67
|
+
// Preserve prototype chain under ES5 target
|
|
68
|
+
Object.setPrototypeOf(this, PostAssertionValidationError.prototype);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Validate a batch of PostAssertionEntry values against the exact rules
|
|
73
|
+
* the on-chain program enforces.
|
|
74
|
+
*
|
|
75
|
+
* Throws on the FIRST failing check (same as the Rust `for entry in entries`
|
|
76
|
+
* loop). Use a try/catch to recover; the error's `validationCode` +
|
|
77
|
+
* `entryIndex` identify the offending entry.
|
|
78
|
+
*
|
|
79
|
+
* @param entries Batch to check. Must be 1..=4 entries.
|
|
80
|
+
* @throws {PostAssertionValidationError} with the specific failure code.
|
|
81
|
+
*/
|
|
82
|
+
export function validatePostAssertionEntries(entries) {
|
|
83
|
+
// Input-shape guard: TS doesn't enforce runtime shape, so an `any` caller
|
|
84
|
+
// can pass null/undefined/non-array without a compiler warning. Without
|
|
85
|
+
// this, `entries.length` would throw a cryptic TypeError that `toDxError`
|
|
86
|
+
// collapses to code 7999.
|
|
87
|
+
if (!Array.isArray(entries)) {
|
|
88
|
+
throw new PostAssertionValidationError("entries_not_an_array", null, `PostAssertion entries must be an array, got ${entries === null ? "null" : typeof entries}`);
|
|
89
|
+
}
|
|
90
|
+
// Batch-level: entry count must be 1..=MAX.
|
|
91
|
+
if (entries.length === 0 || entries.length > MAX_POST_ASSERTION_ENTRIES) {
|
|
92
|
+
throw new PostAssertionValidationError("entry_count_out_of_range", null, `PostAssertion entry count must be 1..=${MAX_POST_ASSERTION_ENTRIES}, got ${entries.length}`);
|
|
93
|
+
}
|
|
94
|
+
entries.forEach((entry, index) => {
|
|
95
|
+
// Per-slot null guard — forEach skips truly empty slots but an array
|
|
96
|
+
// literal `[null, validEntry]` yields `entry === null` at index 0.
|
|
97
|
+
if (entry == null) {
|
|
98
|
+
throw new PostAssertionValidationError("entries_contain_null", index, `PostAssertion[${index}]: entry is ${entry === null ? "null" : "undefined"}`);
|
|
99
|
+
}
|
|
100
|
+
validateSingleEntry(entry, index);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
// ─── Internal ─────────────────────────────────────────────────────────────
|
|
104
|
+
/**
|
|
105
|
+
* Guard that rejects non-integer, out-of-range, non-finite, or negative
|
|
106
|
+
* numeric field values at the validator layer — BEFORE Codama's u8/u16/u32
|
|
107
|
+
* encoders would either silently truncate (`8.5` → `8`) or throw a
|
|
108
|
+
* different error class (`-1` → SolanaError).
|
|
109
|
+
*
|
|
110
|
+
* Having a single typed rejection point means every invalid numeric input
|
|
111
|
+
* surfaces as `PostAssertionValidationError` with the field's specific
|
|
112
|
+
* `validationCode`, rather than a grab-bag of Codama runtime failures.
|
|
113
|
+
*/
|
|
114
|
+
function requireUintInRange(value, field, max, code, index) {
|
|
115
|
+
if (typeof value !== "number" ||
|
|
116
|
+
!Number.isInteger(value) ||
|
|
117
|
+
value < 0 ||
|
|
118
|
+
value > max) {
|
|
119
|
+
throw new PostAssertionValidationError(code, index, `PostAssertion[${index}]: ${field} must be an integer 0..=${max}, got ${JSON.stringify(value)} (${typeof value})`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function validateSingleEntry(entry, index) {
|
|
123
|
+
// Strict numeric shape checks — integer, non-negative, fits the on-chain
|
|
124
|
+
// field width. Catch non-integer (e.g. 8.5) and negative (-1) inputs that
|
|
125
|
+
// one-sided `> MAX` comparisons would miss.
|
|
126
|
+
requireUintInRange(entry.offset, "offset", 0xffff, "offset_out_of_range", index);
|
|
127
|
+
requireUintInRange(entry.valueLen, "value_len", MAX_CONSTRAINT_VALUE_LEN, "value_len_out_of_range", index);
|
|
128
|
+
requireUintInRange(entry.operator, "operator", MAX_OPERATOR_VALUE, "operator_out_of_range", index);
|
|
129
|
+
requireUintInRange(entry.assertionMode, "assertion_mode", MAX_ASSERTION_MODE_VALUE, "assertion_mode_out_of_range", index);
|
|
130
|
+
requireUintInRange(entry.crossFieldOffsetB, "cross_field_offset_b", 0xffff, "cross_field_offset_b_out_of_range", index);
|
|
131
|
+
requireUintInRange(entry.crossFieldMultiplierBps, "cross_field_multiplier_bps", 0xffffffff, "cross_field_multiplier_bps_out_of_range", index);
|
|
132
|
+
requireUintInRange(entry.crossFieldFlags, "cross_field_flags", 0xff, "cross_field_flags_out_of_range", index);
|
|
133
|
+
// value_len must additionally be >= 1 (the shared range check allows 0;
|
|
134
|
+
// on-chain requires > 0 because a zero-length value is a semantic no-op).
|
|
135
|
+
if (entry.valueLen === 0) {
|
|
136
|
+
throw new PostAssertionValidationError("value_len_out_of_range", index, `PostAssertion[${index}]: value_len must be 1..=${MAX_CONSTRAINT_VALUE_LEN}, got 0`);
|
|
137
|
+
}
|
|
138
|
+
// expected_value must be at least `value_len` bytes. Callers that pass
|
|
139
|
+
// a shorter buffer would have the on-chain program reject the entry —
|
|
140
|
+
// catch here instead.
|
|
141
|
+
if (entry.expectedValue.length < entry.valueLen) {
|
|
142
|
+
throw new PostAssertionValidationError("expected_value_too_short", index, `PostAssertion[${index}]: expected_value has ${entry.expectedValue.length} bytes but value_len=${entry.valueLen} (must be >= value_len)`);
|
|
143
|
+
}
|
|
144
|
+
// Delta modes (1/2/3) compare the pre/post snapshot as u64 — so the
|
|
145
|
+
// expected-value payload must fit in 8 bytes. The on-chain program
|
|
146
|
+
// enforces this; we mirror the check here.
|
|
147
|
+
if (entry.assertionMode >= 1 && entry.assertionMode <= 3) {
|
|
148
|
+
if (entry.valueLen > DELTA_MAX_VALUE_LEN) {
|
|
149
|
+
throw new PostAssertionValidationError("delta_mode_value_len_too_large", index, `PostAssertion[${index}]: delta assertion_mode=${entry.assertionMode} requires value_len <= ${DELTA_MAX_VALUE_LEN}, got ${entry.valueLen}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// CrossFieldLte enable bit. Since we already asserted integrality of
|
|
153
|
+
// crossFieldFlags above, the bitwise AND here is safe — no silent Int32
|
|
154
|
+
// truncation of a fractional input.
|
|
155
|
+
const crossFieldEnabled = (entry.crossFieldFlags & CROSS_FIELD_LTE_FLAG) !== 0;
|
|
156
|
+
if (crossFieldEnabled) {
|
|
157
|
+
// CrossFieldLte parses both field_A and field_B as u64 via le_bytes[0..8].
|
|
158
|
+
// Payload must fit. Upstream attacker path: value_len=16 with a crafted
|
|
159
|
+
// field would bypass the ratio check by silently truncating.
|
|
160
|
+
if (entry.valueLen > CROSS_FIELD_MAX_VALUE_LEN) {
|
|
161
|
+
throw new PostAssertionValidationError("cross_field_value_len_too_large", index, `PostAssertion[${index}]: CrossFieldLte requires value_len <= ${CROSS_FIELD_MAX_VALUE_LEN}, got ${entry.valueLen}`);
|
|
162
|
+
}
|
|
163
|
+
// CrossFieldLte is a ratio check and only composes with Absolute mode.
|
|
164
|
+
// Combining it with delta modes would read the snapshot as field_A,
|
|
165
|
+
// which is semantically nonsensical — the on-chain program hard-rejects.
|
|
166
|
+
if (entry.assertionMode !== 0) {
|
|
167
|
+
throw new PostAssertionValidationError("cross_field_requires_absolute_mode", index, `PostAssertion[${index}]: CrossFieldLte requires assertion_mode=0 (Absolute), got ${entry.assertionMode}`);
|
|
168
|
+
}
|
|
169
|
+
// multiplier_bps > 0. A zero multiplier collapses the ratio check to
|
|
170
|
+
// `field_A * 10000 <= 0 * field_B` (always false unless field_A == 0),
|
|
171
|
+
// which is either a no-op or a trap. Reject at authoring time.
|
|
172
|
+
if (entry.crossFieldMultiplierBps === 0) {
|
|
173
|
+
throw new PostAssertionValidationError("cross_field_multiplier_must_be_positive", index, `PostAssertion[${index}]: CrossFieldLte multiplier_bps must be > 0`);
|
|
174
|
+
}
|
|
175
|
+
// Only bit 0 is defined. Any other bit set indicates future-flag drift
|
|
176
|
+
// or misuse; the on-chain program rejects via `flags & 0xFE == 0`.
|
|
177
|
+
if ((entry.crossFieldFlags & 0xfe) !== 0) {
|
|
178
|
+
throw new PostAssertionValidationError("cross_field_unknown_flags", index, `PostAssertion[${index}]: cross_field_flags has reserved bits set: 0x${entry.crossFieldFlags.toString(16).padStart(2, "0")} (only bit 0 is defined)`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
// CrossFieldLte disabled → both auxiliary fields MUST be zero.
|
|
183
|
+
// A nonzero value here is a callsite bug (forgot to clear fields after
|
|
184
|
+
// switching from CrossFieldLte to plain assertion) and the program
|
|
185
|
+
// rejects via matching check.
|
|
186
|
+
if (entry.crossFieldOffsetB !== 0 || entry.crossFieldMultiplierBps !== 0) {
|
|
187
|
+
throw new PostAssertionValidationError("cross_field_disabled_fields_must_be_zero", index, `PostAssertion[${index}]: CrossFieldLte disabled but cross_field_offset_b=${entry.crossFieldOffsetB}, cross_field_multiplier_bps=${entry.crossFieldMultiplierBps} (both must be 0)`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=post-assertion-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-assertion-validation.js","sourceRoot":"","sources":["../../src/dashboard/post-assertion-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,8 +11,9 @@
|
|
|
11
11
|
* computed exactly once.
|
|
12
12
|
*/
|
|
13
13
|
import type { Address, Rpc, SolanaRpcApi } from "../kit-adapter.js";
|
|
14
|
+
import type { Alert } from "../security-analytics.js";
|
|
14
15
|
import type { VaultActivityItem } from "../event-analytics.js";
|
|
15
|
-
import type { VaultState, AgentData, SpendingData, ActivityData, ActivityFilters, ActivityRow, HealthData, PolicyData, OverviewContext, OverviewData, GetOverviewOptions } from "./types.js";
|
|
16
|
+
import type { VaultState, AgentData, SpendingData, ActivityData, ActivityFilters, ActivityRow, HealthData, PolicyData, OverviewContext, OverviewData, GetOverviewOptions, RiskMetrics, AuditTrailEntry, AuditTrailOptions } from "./types.js";
|
|
16
17
|
/**
|
|
17
18
|
* Default size of the activity window included in `getOverview`. Consumers
|
|
18
19
|
* may override via `GetOverviewOptions.activityLimit`.
|
|
@@ -135,4 +136,95 @@ export declare function getPolicy(rpc: Rpc<SolanaRpcApi>, vault: Address, networ
|
|
|
135
136
|
* update", even on the `includeActivity: false` lightweight path.
|
|
136
137
|
*/
|
|
137
138
|
export declare function getOverview(rpc: Rpc<SolanaRpcApi>, vault: Address, network: "devnet" | "mainnet", options?: GetOverviewOptions): Promise<OverviewData>;
|
|
139
|
+
/**
|
|
140
|
+
* Compose a single {@link AgentData} from a pre-fetched {@link OverviewContext}.
|
|
141
|
+
*
|
|
142
|
+
* Reuses {@link buildAgents} and filters to the requested address. Returns
|
|
143
|
+
* `null` when the agent is not registered in the vault — callers that want
|
|
144
|
+
* the throwing surface use `getAgentDetail` instead.
|
|
145
|
+
*
|
|
146
|
+
* Activity-derived fields (`lastActionType` / `lastActionProtocol` /
|
|
147
|
+
* `lastActionTimestamp` / `blockedCount24h`) follow the same defaulting rules
|
|
148
|
+
* as `buildAgents`: empty/zero when `ctx.activity` is undefined.
|
|
149
|
+
*
|
|
150
|
+
* @experimental Part of the `build*` composition surface (S10). Signature and
|
|
151
|
+
* JSON shape may shift before v1.0.
|
|
152
|
+
*
|
|
153
|
+
* @see OwnerClient.getAgentDetail — the stable single-call alternative.
|
|
154
|
+
*/
|
|
155
|
+
export declare function buildAgentDetail(ctx: OverviewContext, agent: Address): AgentData | null;
|
|
156
|
+
/**
|
|
157
|
+
* Single-agent detail wrapper around {@link getAgentProfile} + activity
|
|
158
|
+
* enrichment. Resolves vault state, fetches the same 100-event activity
|
|
159
|
+
* window as `getAgents`, and returns the {@link AgentData} for the requested
|
|
160
|
+
* agent.
|
|
161
|
+
*
|
|
162
|
+
* Throws a typed {@link SigilSdkDomainError} (mapped through `toDxError` to
|
|
163
|
+
* `SIGIL_ERROR__SDK__INVALID_PARAMS`) when the agent is not registered in
|
|
164
|
+
* the vault. Same graceful-degradation pattern as `getAgents` for activity
|
|
165
|
+
* fetch failures: enrichment fields default to empty/zero rather than
|
|
166
|
+
* propagating the failure.
|
|
167
|
+
*/
|
|
168
|
+
export declare function getAgentDetail(rpc: Rpc<SolanaRpcApi>, vault: Address, agent: Address, network: "devnet" | "mainnet"): Promise<AgentData>;
|
|
169
|
+
/**
|
|
170
|
+
* Map an {@link Alert}[] to the four-level UI risk badge. Critical wins over
|
|
171
|
+
* warning, warning wins over info; absence of any alerts is "low".
|
|
172
|
+
*
|
|
173
|
+
* Pure helper — exposed for direct testing. Most consumers use
|
|
174
|
+
* {@link getRiskMetrics}.
|
|
175
|
+
*/
|
|
176
|
+
export declare function deriveRiskLevel(alerts: readonly Alert[]): RiskMetrics["riskLevel"];
|
|
177
|
+
/**
|
|
178
|
+
* Compute {@link RiskMetrics} from a pre-fetched {@link OverviewContext}.
|
|
179
|
+
*
|
|
180
|
+
* Combines:
|
|
181
|
+
* - {@link getSpendingVelocity}(state.tracker, now, state.globalBudget) →
|
|
182
|
+
* `currentRate` becomes `spendingVelocity`; `isAccelerating` and
|
|
183
|
+
* `timeToCapSeconds` flow through directly.
|
|
184
|
+
* - 24h cap projection → `capVelocity = currentRate * 24 / cap × 100`
|
|
185
|
+
* (clamped at 0 when cap is 0n).
|
|
186
|
+
* - {@link evaluateAlertConditions}(state, vault) → `riskLevel` via
|
|
187
|
+
* {@link deriveRiskLevel}. Uses `ctx.alerts` when memoized.
|
|
188
|
+
*
|
|
189
|
+
* @experimental Part of the `build*` composition surface (S11). Signature and
|
|
190
|
+
* JSON shape may shift before v1.0.
|
|
191
|
+
*
|
|
192
|
+
* @see OwnerClient.getRiskMetrics — the stable single-call alternative.
|
|
193
|
+
*/
|
|
194
|
+
export declare function buildRiskMetrics(ctx: OverviewContext): RiskMetrics;
|
|
195
|
+
/**
|
|
196
|
+
* Risk-tilt summary for a vault — current spending velocity, daily-cap
|
|
197
|
+
* projection, and a four-level risk badge derived from the alert stream.
|
|
198
|
+
*
|
|
199
|
+
* One state resolution + one alert evaluation. Use this for the dashboard's
|
|
200
|
+
* "is something concerning right now?" indicator. For deeper inspection,
|
|
201
|
+
* pair with `getOverview` (which embeds the alert list) or the
|
|
202
|
+
* `evaluateAlertConditions` export.
|
|
203
|
+
*/
|
|
204
|
+
export declare function getRiskMetrics(rpc: Rpc<SolanaRpcApi>, vault: Address, network: "devnet" | "mainnet"): Promise<RiskMetrics>;
|
|
205
|
+
/**
|
|
206
|
+
* Filter raw {@link VaultActivityItem}[] to the audit subset and map each to
|
|
207
|
+
* an {@link AuditTrailEntry}. Pure — no RPC, no time-based filtering.
|
|
208
|
+
*
|
|
209
|
+
* Used by both `getAuditTrail` (which then applies the optional `since`
|
|
210
|
+
* timestamp filter) and direct callers that already have an activity list.
|
|
211
|
+
*
|
|
212
|
+
* @experimental Part of the `build*` composition surface (S12).
|
|
213
|
+
*/
|
|
214
|
+
export declare function buildAuditTrail(items: readonly VaultActivityItem[]): AuditTrailEntry[];
|
|
215
|
+
/**
|
|
216
|
+
* Governance + security audit trail — the policy/agent/security/escrow
|
|
217
|
+
* subset of the vault's activity stream.
|
|
218
|
+
*
|
|
219
|
+
* Use this for an admin-facing "what changed?" feed: policy queue/apply
|
|
220
|
+
* cycles, agent registrations, vault freeze/resume events, and escrow
|
|
221
|
+
* lifecycle. Trades and fund movements are excluded — they live in
|
|
222
|
+
* `getActivity()`.
|
|
223
|
+
*
|
|
224
|
+
* Activity fetch shape: one `getSignaturesForAddress` + up to `limit`
|
|
225
|
+
* sequential `getTransaction` calls (see {@link getVaultActivity}).
|
|
226
|
+
* Default limit is 100 — large enough to surface a few weeks of governance
|
|
227
|
+
* activity for a typical vault without inflating RPC cost.
|
|
228
|
+
*/
|
|
229
|
+
export declare function getAuditTrail(rpc: Rpc<SolanaRpcApi>, vault: Address, network: "devnet" | "mainnet", opts?: AuditTrailOptions): Promise<AuditTrailEntry[]>;
|
|
138
230
|
//# sourceMappingURL=reads.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reads.d.ts","sourceRoot":"","sources":["../../src/dashboard/reads.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"reads.d.ts","sourceRoot":"","sources":["../../src/dashboard/reads.ts"],"names":[],"mappings":"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"}
|