@openzeppelin/guardian-client 0.15.2 → 0.16.1
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/README.md +31 -0
- package/dist/conversion.d.ts.map +1 -1
- package/dist/conversion.js +8 -2
- package/dist/conversion.js.map +1 -1
- package/dist/error-codes.d.ts +30 -0
- package/dist/error-codes.d.ts.map +1 -0
- package/dist/error-codes.js +81 -0
- package/dist/error-codes.js.map +1 -0
- package/dist/http.d.ts +66 -10
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +156 -29
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/server-types.d.ts +17 -0
- package/dist/server-types.d.ts.map +1 -1
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/conversion.test.ts +53 -0
- package/src/conversion.ts +8 -2
- package/src/error-codes.test.ts +69 -0
- package/src/error-codes.ts +91 -0
- package/src/http.test.ts +234 -29
- package/src/http.ts +190 -29
- package/src/index.ts +9 -0
- package/src/server-types.ts +16 -1
- package/src/types.ts +36 -1
- package/dist/auth-request.test.d.ts +0 -2
- package/dist/auth-request.test.d.ts.map +0 -1
- package/dist/auth-request.test.js +0 -10
- package/dist/auth-request.test.js.map +0 -1
- package/dist/conversion.test.d.ts +0 -2
- package/dist/conversion.test.d.ts.map +0 -1
- package/dist/conversion.test.js +0 -332
- package/dist/conversion.test.js.map +0 -1
- package/dist/http.test.d.ts +0 -2
- package/dist/http.test.d.ts.map +0 -1
- package/dist/http.test.js +0 -750
- package/dist/http.test.js.map +0 -1
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,YAAY,EACV,MAAM,EACN,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACd,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAClE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,YAAY,EACV,wBAAwB,EACxB,aAAa,EACb,MAAM,EACN,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACd,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAElE,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/server-types.d.ts
CHANGED
|
@@ -24,9 +24,14 @@ export type ServerDeltaStatus = {
|
|
|
24
24
|
} | {
|
|
25
25
|
status: 'canonical';
|
|
26
26
|
timestamp: string;
|
|
27
|
+
} | {
|
|
28
|
+
status: 'retained';
|
|
29
|
+
timestamp: string;
|
|
30
|
+
reason?: 'retry_exhausted' | 'diverged';
|
|
27
31
|
} | {
|
|
28
32
|
status: 'discarded';
|
|
29
33
|
timestamp: string;
|
|
34
|
+
reason?: string;
|
|
30
35
|
};
|
|
31
36
|
export type ServerProposalType = 'add_signer' | 'remove_signer' | 'change_threshold' | 'update_procedure_threshold' | 'switch_guardian' | 'consume_notes' | 'p2id' | 'custom' | (string & {});
|
|
32
37
|
export interface ServerProposalMetadata {
|
|
@@ -47,6 +52,8 @@ export interface ServerProposalMetadata {
|
|
|
47
52
|
recipient_id?: string;
|
|
48
53
|
faucet_id?: string;
|
|
49
54
|
amount?: string;
|
|
55
|
+
/** P2ID note visibility, "public" or "private" (issue #322). Absent => public. */
|
|
56
|
+
note_type?: string;
|
|
50
57
|
}
|
|
51
58
|
export interface ServerDeltaObject {
|
|
52
59
|
account_id: string;
|
|
@@ -142,6 +149,16 @@ export interface ServerDeltaProposalResponse {
|
|
|
142
149
|
export interface ServerProposalsResponse {
|
|
143
150
|
proposals: ServerDeltaObject[];
|
|
144
151
|
}
|
|
152
|
+
export interface ServerAbandonCandidateRequest {
|
|
153
|
+
account_id: string;
|
|
154
|
+
nonce: number;
|
|
155
|
+
}
|
|
156
|
+
export interface ServerAbandonCandidateResponse {
|
|
157
|
+
account_id: string;
|
|
158
|
+
nonce: number;
|
|
159
|
+
state: 'pending' | 'abandoned' | 'retained';
|
|
160
|
+
abandon_requested_at?: string;
|
|
161
|
+
}
|
|
145
162
|
export interface ServerSignProposalRequest {
|
|
146
163
|
account_id: string;
|
|
147
164
|
commitment: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-types.d.ts","sourceRoot":"","sources":["../src/server-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,QAAQ,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,uBAAuB,GAAG,qBAAqB,GAAG,oBAAoB,CAAC;AAEnF,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,uBAAuB,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,uBAAuB,EAAE,CAAA;CAAE,GACvG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"server-types.d.ts","sourceRoot":"","sources":["../src/server-types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -54,9 +54,19 @@ export type DeltaStatus = {
|
|
|
54
54
|
} | {
|
|
55
55
|
status: 'canonical';
|
|
56
56
|
timestamp: string;
|
|
57
|
+
}
|
|
58
|
+
/** Candidate the Guardian gave up verifying (retry exhaustion or a
|
|
59
|
+
* confirmed-diverged observation) but kept for background
|
|
60
|
+
* reconciliation (issue #345); promoted to `canonical` if the chain
|
|
61
|
+
* ever shows it landed, dropped after a server-side TTL otherwise. */
|
|
62
|
+
| {
|
|
63
|
+
status: 'retained';
|
|
64
|
+
timestamp: string;
|
|
65
|
+
reason?: 'retry_exhausted' | 'diverged';
|
|
57
66
|
} | {
|
|
58
67
|
status: 'discarded';
|
|
59
68
|
timestamp: string;
|
|
69
|
+
reason?: string;
|
|
60
70
|
};
|
|
61
71
|
export type ProposalType = 'add_signer' | 'remove_signer' | 'change_threshold' | 'update_procedure_threshold' | 'switch_guardian' | 'consume_notes' | 'p2id' | 'custom' | (string & {});
|
|
62
72
|
export interface ProposalMetadata {
|
|
@@ -77,6 +87,8 @@ export interface ProposalMetadata {
|
|
|
77
87
|
recipientId?: string;
|
|
78
88
|
faucetId?: string;
|
|
79
89
|
amount?: string;
|
|
90
|
+
/** P2ID note visibility, "public" or "private" (issue #322). Absent => public. */
|
|
91
|
+
noteType?: string;
|
|
80
92
|
}
|
|
81
93
|
export interface DeltaObject {
|
|
82
94
|
accountId: string;
|
|
@@ -171,6 +183,32 @@ export interface SignProposalRequest {
|
|
|
171
183
|
commitment: string;
|
|
172
184
|
signature: ProposalSignature;
|
|
173
185
|
}
|
|
186
|
+
export interface AbandonCandidateResponse {
|
|
187
|
+
accountId: string;
|
|
188
|
+
nonce: number;
|
|
189
|
+
/**
|
|
190
|
+
* `'pending'` while the guardian's worker still has to resolve the
|
|
191
|
+
* abandon intent (the account stays locked until then); `'abandoned'`
|
|
192
|
+
* once the delta is discarded as client-abandoned and the account
|
|
193
|
+
* released; `'retained'` when the worker had already stopped
|
|
194
|
+
* verifying the candidate and released the account — unlocked, but
|
|
195
|
+
* the on-chain outcome is still uncertain: background reconciliation
|
|
196
|
+
* may promote the delta until its retention TTL expires.
|
|
197
|
+
*/
|
|
198
|
+
state: 'pending' | 'abandoned' | 'retained';
|
|
199
|
+
/**
|
|
200
|
+
* RFC 3339 UTC timestamp of the recorded abandon request. Retries
|
|
201
|
+
* return the original timestamp; absent once resolved.
|
|
202
|
+
*/
|
|
203
|
+
abandonRequestedAt?: string;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Resolution of an abandon request, as observed via the delta feed.
|
|
207
|
+
* `'retained'` means the account slot is released but the on-chain
|
|
208
|
+
* outcome is still uncertain — "unlocked but unresolved", never to be
|
|
209
|
+
* read as "the transaction did not land".
|
|
210
|
+
*/
|
|
211
|
+
export type AbandonStatus = 'waiting' | 'landed' | 'abandoned' | 'retained' | 'unexpected';
|
|
174
212
|
export interface PushDeltaResponse {
|
|
175
213
|
accountId: string;
|
|
176
214
|
nonce: number;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAC3F,WAAW,CAAC,CACV,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,kBAAkB,GACjC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAC5B,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAEhE;;;;;;;;;OASG;IACH,iBAAiB,CAAC,CAChB,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,QAAQ,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,iBAAiB,GAAG,eAAe,GAAG,cAAc,CAAC;AAEjE,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEjD,MAAM,MAAM,UAAU,GAClB;IACE,cAAc,EAAE;QACd,oBAAoB,EAAE,MAAM,EAAE,CAAC;KAChC,CAAC;CACH,GACD;IACE,UAAU,EAAE;QACV,oBAAoB,EAAE,MAAM,EAAE,CAAC;KAChC,CAAC;CACH,CAAC;AAEN,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,iBAAiB,EAAE,CAAA;CAAE,GAC/F;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/conversion.test.ts
CHANGED
|
@@ -86,6 +86,27 @@ describe('conversion', () => {
|
|
|
86
86
|
}
|
|
87
87
|
});
|
|
88
88
|
|
|
89
|
+
it('converts retained DeltaStatus with and without a reason (issue #345)', () => {
|
|
90
|
+
const withReason = fromServerDeltaStatus({
|
|
91
|
+
status: 'retained',
|
|
92
|
+
timestamp: '2026-07-23T00:00:00Z',
|
|
93
|
+
reason: 'diverged',
|
|
94
|
+
});
|
|
95
|
+
expect(withReason).toEqual({
|
|
96
|
+
status: 'retained',
|
|
97
|
+
timestamp: '2026-07-23T00:00:00Z',
|
|
98
|
+
reason: 'diverged',
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// Serde omits the field for rows without a recorded reason.
|
|
102
|
+
const withoutReason = fromServerDeltaStatus({
|
|
103
|
+
status: 'retained',
|
|
104
|
+
timestamp: '2026-07-23T00:00:00Z',
|
|
105
|
+
});
|
|
106
|
+
expect(withoutReason.status).toBe('retained');
|
|
107
|
+
expect(withoutReason.reason).toBeUndefined();
|
|
108
|
+
});
|
|
109
|
+
|
|
89
110
|
it('converts ProposalMetadata with all fields', () => {
|
|
90
111
|
const server: ServerProposalMetadata = {
|
|
91
112
|
proposal_type: 'update_procedure_threshold',
|
|
@@ -276,6 +297,22 @@ describe('conversion', () => {
|
|
|
276
297
|
});
|
|
277
298
|
});
|
|
278
299
|
|
|
300
|
+
it('round-trips retained DeltaStatus (issue #345)', () => {
|
|
301
|
+
const status: DeltaStatus = {
|
|
302
|
+
status: 'retained',
|
|
303
|
+
timestamp: '2026-07-23T00:00:00Z',
|
|
304
|
+
reason: 'retry_exhausted',
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
const server = toServerDeltaStatus(status);
|
|
308
|
+
expect(server).toEqual({
|
|
309
|
+
status: 'retained',
|
|
310
|
+
timestamp: '2026-07-23T00:00:00Z',
|
|
311
|
+
reason: 'retry_exhausted',
|
|
312
|
+
});
|
|
313
|
+
expect(fromServerDeltaStatus(server)).toEqual(status);
|
|
314
|
+
});
|
|
315
|
+
|
|
279
316
|
it('converts ProposalMetadata', () => {
|
|
280
317
|
const meta: ProposalMetadata = {
|
|
281
318
|
proposalType: 'update_procedure_threshold',
|
|
@@ -416,5 +453,21 @@ describe('conversion', () => {
|
|
|
416
453
|
expect(result.amount).toBe(original.amount);
|
|
417
454
|
expect(result.salt).toBe(original.salt);
|
|
418
455
|
});
|
|
456
|
+
|
|
457
|
+
it('p2id noteType survives roundtrip as note_type on the wire (issue #322)', () => {
|
|
458
|
+
const original: ProposalMetadata = {
|
|
459
|
+
proposalType: 'p2id',
|
|
460
|
+
recipientId: '0xrecipient',
|
|
461
|
+
faucetId: '0xfaucet',
|
|
462
|
+
amount: '1000',
|
|
463
|
+
noteType: 'private',
|
|
464
|
+
};
|
|
465
|
+
|
|
466
|
+
const server = toServerProposalMetadata(original);
|
|
467
|
+
expect(server.note_type).toBe('private');
|
|
468
|
+
|
|
469
|
+
const result = fromServerProposalMetadata(server);
|
|
470
|
+
expect(result.noteType).toBe('private');
|
|
471
|
+
});
|
|
419
472
|
});
|
|
420
473
|
});
|
package/src/conversion.ts
CHANGED
|
@@ -84,8 +84,10 @@ export function fromServerDeltaStatus(server: ServerDeltaStatus): DeltaStatus {
|
|
|
84
84
|
return { status: 'candidate', timestamp: server.timestamp };
|
|
85
85
|
case 'canonical':
|
|
86
86
|
return { status: 'canonical', timestamp: server.timestamp };
|
|
87
|
+
case 'retained':
|
|
88
|
+
return { status: 'retained', timestamp: server.timestamp, reason: server.reason };
|
|
87
89
|
case 'discarded':
|
|
88
|
-
return { status: 'discarded', timestamp: server.timestamp };
|
|
90
|
+
return { status: 'discarded', timestamp: server.timestamp, reason: server.reason };
|
|
89
91
|
}
|
|
90
92
|
}
|
|
91
93
|
|
|
@@ -106,6 +108,7 @@ export function fromServerProposalMetadata(server: ServerProposalMetadata): Prop
|
|
|
106
108
|
recipientId: server.recipient_id,
|
|
107
109
|
faucetId: server.faucet_id,
|
|
108
110
|
amount: server.amount,
|
|
111
|
+
noteType: server.note_type,
|
|
109
112
|
};
|
|
110
113
|
}
|
|
111
114
|
|
|
@@ -193,8 +196,10 @@ export function toServerDeltaStatus(status: DeltaStatus): ServerDeltaStatus {
|
|
|
193
196
|
return { status: 'candidate', timestamp: status.timestamp };
|
|
194
197
|
case 'canonical':
|
|
195
198
|
return { status: 'canonical', timestamp: status.timestamp };
|
|
199
|
+
case 'retained':
|
|
200
|
+
return { status: 'retained', timestamp: status.timestamp, reason: status.reason };
|
|
196
201
|
case 'discarded':
|
|
197
|
-
return { status: 'discarded', timestamp: status.timestamp };
|
|
202
|
+
return { status: 'discarded', timestamp: status.timestamp, reason: status.reason };
|
|
198
203
|
}
|
|
199
204
|
}
|
|
200
205
|
|
|
@@ -215,6 +220,7 @@ export function toServerProposalMetadata(meta: ProposalMetadata): ServerProposal
|
|
|
215
220
|
recipient_id: meta.recipientId,
|
|
216
221
|
faucet_id: meta.faucetId,
|
|
217
222
|
amount: meta.amount,
|
|
223
|
+
note_type: meta.noteType,
|
|
218
224
|
};
|
|
219
225
|
}
|
|
220
226
|
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { describe, it, expect } from 'vitest';
|
|
5
|
+
import {
|
|
6
|
+
GUARDIAN_ERROR_CODES,
|
|
7
|
+
isGuardianErrorCode,
|
|
8
|
+
normalizeGuardianErrorCode,
|
|
9
|
+
} from './error-codes.js';
|
|
10
|
+
|
|
11
|
+
describe('normalizeGuardianErrorCode', () => {
|
|
12
|
+
it('maps the SCREAMING_SNAKE wire forms to their snake_case union members', () => {
|
|
13
|
+
expect(normalizeGuardianErrorCode('GUARDIAN_ACCOUNT_PAUSED')).toBe('account_paused');
|
|
14
|
+
expect(normalizeGuardianErrorCode('GUARDIAN_ACCOUNT_RELEASED')).toBe('account_released');
|
|
15
|
+
expect(normalizeGuardianErrorCode('GUARDIAN_INSUFFICIENT_OPERATOR_PERMISSION')).toBe(
|
|
16
|
+
'insufficient_operator_permission'
|
|
17
|
+
);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('passes recognized snake_case codes through', () => {
|
|
21
|
+
expect(normalizeGuardianErrorCode('commitment_mismatch')).toBe('commitment_mismatch');
|
|
22
|
+
expect(normalizeGuardianErrorCode('rate_limit_exceeded')).toBe('rate_limit_exceeded');
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('returns null for unknown codes instead of widening to string', () => {
|
|
26
|
+
expect(normalizeGuardianErrorCode('some_future_code')).toBeNull();
|
|
27
|
+
expect(normalizeGuardianErrorCode('')).toBeNull();
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
describe('isGuardianErrorCode', () => {
|
|
32
|
+
it('narrows members and rejects non-members', () => {
|
|
33
|
+
expect(isGuardianErrorCode('account_paused')).toBe(true);
|
|
34
|
+
expect(isGuardianErrorCode('GUARDIAN_ACCOUNT_PAUSED')).toBe(false);
|
|
35
|
+
expect(isGuardianErrorCode('acount_paused')).toBe(false);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
describe('drift guard against GuardianError::code()', () => {
|
|
40
|
+
it('the TS union matches the server vocabulary exactly', () => {
|
|
41
|
+
// Source of truth: the match arms of `pub fn code(&self)` in the server's
|
|
42
|
+
// error module. The OpenAPI spec is not usable here — it declares `code`
|
|
43
|
+
// as a bare string with no enum (see issue #318).
|
|
44
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
45
|
+
const errorRs = readFileSync(
|
|
46
|
+
join(here, '../../../crates/server/src/error.rs'),
|
|
47
|
+
'utf8'
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
const codeFnStart = errorRs.indexOf('pub fn code(&self)');
|
|
51
|
+
expect(codeFnStart).toBeGreaterThan(-1);
|
|
52
|
+
// The function body ends at the first line containing only ` }` after
|
|
53
|
+
// the match block; slicing to the next `pub fn` is a robust over-bound.
|
|
54
|
+
const nextFn = errorRs.indexOf('pub fn', codeFnStart + 1);
|
|
55
|
+
const codeFn = errorRs.slice(codeFnStart, nextFn === -1 ? undefined : nextFn);
|
|
56
|
+
|
|
57
|
+
const serverWireCodes = [...codeFn.matchAll(/"([A-Za-z_]+)"/g)].map((m) => m[1]);
|
|
58
|
+
expect(serverWireCodes.length).toBeGreaterThan(0);
|
|
59
|
+
|
|
60
|
+
const normalizedServerCodes = new Set(
|
|
61
|
+
serverWireCodes.map((wire) => normalizeGuardianErrorCode(wire) ?? `UNKNOWN:${wire}`)
|
|
62
|
+
);
|
|
63
|
+
const unionCodes = new Set<string>(GUARDIAN_ERROR_CODES);
|
|
64
|
+
|
|
65
|
+
// Every server code must normalize into the union (no UNKNOWN: entries),
|
|
66
|
+
// and the union must not carry stale members the server no longer emits.
|
|
67
|
+
expect([...normalizedServerCodes].sort()).toEqual([...unionCodes].sort());
|
|
68
|
+
});
|
|
69
|
+
});
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed vocabulary of Guardian's stable, machine-readable error codes
|
|
3
|
+
* (issue #318). Mirrors `GuardianError::code()` in
|
|
4
|
+
* `crates/server/src/error.rs` — a drift-guard test asserts the two stay in
|
|
5
|
+
* sync. The four codes the server emits in SCREAMING_SNAKE wire form
|
|
6
|
+
* (`GUARDIAN_ACCOUNT_PAUSED`, `GUARDIAN_ACCOUNT_RELEASED`,
|
|
7
|
+
* `GUARDIAN_INSUFFICIENT_OPERATOR_PERMISSION`, `GUARDIAN_CANDIDATE_LANDED`)
|
|
8
|
+
* are normalized to snake_case here so the union has one consistent shape; use
|
|
9
|
+
* {@link normalizeGuardianErrorCode} at the wire boundary.
|
|
10
|
+
*/
|
|
11
|
+
export const GUARDIAN_ERROR_CODES = [
|
|
12
|
+
'account_already_exists',
|
|
13
|
+
'account_data_unavailable',
|
|
14
|
+
'account_not_found',
|
|
15
|
+
'account_paused',
|
|
16
|
+
'account_released',
|
|
17
|
+
'authentication_failed',
|
|
18
|
+
'authorization_failed',
|
|
19
|
+
'candidate_landed',
|
|
20
|
+
'commitment_mismatch',
|
|
21
|
+
'configuration_error',
|
|
22
|
+
'conflict_pending_delta',
|
|
23
|
+
'conflict_pending_proposal',
|
|
24
|
+
'data_unavailable',
|
|
25
|
+
'delta_not_found',
|
|
26
|
+
'insufficient_operator_permission',
|
|
27
|
+
'insufficient_signatures',
|
|
28
|
+
'invalid_account_id',
|
|
29
|
+
'invalid_commitment',
|
|
30
|
+
'invalid_cursor',
|
|
31
|
+
'invalid_delta',
|
|
32
|
+
'invalid_evm_proposal',
|
|
33
|
+
'invalid_input',
|
|
34
|
+
'invalid_limit',
|
|
35
|
+
'invalid_network_config',
|
|
36
|
+
'invalid_proposal_signature',
|
|
37
|
+
'invalid_status_filter',
|
|
38
|
+
'network_error',
|
|
39
|
+
'pending_proposals_limit',
|
|
40
|
+
'proposal_already_signed',
|
|
41
|
+
'proposal_not_found',
|
|
42
|
+
'rate_limit_exceeded',
|
|
43
|
+
'rpc_unavailable',
|
|
44
|
+
'rpc_validation_failed',
|
|
45
|
+
'signer_not_authorized',
|
|
46
|
+
'signing_error',
|
|
47
|
+
'state_not_found',
|
|
48
|
+
'storage_error',
|
|
49
|
+
'unsupported_evm_chain',
|
|
50
|
+
'unsupported_for_network',
|
|
51
|
+
] as const;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* A stable Guardian error code, compiler-checked: comparing against a
|
|
55
|
+
* non-member literal is a type error, and `switch` statements can be
|
|
56
|
+
* exhaustiveness-checked. Branch and localize on this — never on message
|
|
57
|
+
* text or the HTTP status alone.
|
|
58
|
+
*/
|
|
59
|
+
export type GuardianErrorCode = (typeof GUARDIAN_ERROR_CODES)[number];
|
|
60
|
+
|
|
61
|
+
const CODE_SET: ReadonlySet<string> = new Set(GUARDIAN_ERROR_CODES);
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Wire form → union form for the codes the server emits in SCREAMING_SNAKE.
|
|
65
|
+
* Every other code is already snake_case on the wire.
|
|
66
|
+
*/
|
|
67
|
+
const WIRE_ALIASES: Readonly<Record<string, GuardianErrorCode>> = {
|
|
68
|
+
GUARDIAN_ACCOUNT_PAUSED: 'account_paused',
|
|
69
|
+
GUARDIAN_ACCOUNT_RELEASED: 'account_released',
|
|
70
|
+
GUARDIAN_INSUFFICIENT_OPERATOR_PERMISSION: 'insufficient_operator_permission',
|
|
71
|
+
GUARDIAN_CANDIDATE_LANDED: 'candidate_landed',
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/** Type guard narrowing an arbitrary string to {@link GuardianErrorCode}. */
|
|
75
|
+
export function isGuardianErrorCode(value: string): value is GuardianErrorCode {
|
|
76
|
+
return CODE_SET.has(value);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Normalize a server-emitted wire code to the typed union: SCREAMING_SNAKE
|
|
81
|
+
* aliases map to their snake_case form; recognized snake_case codes pass
|
|
82
|
+
* through. Returns `null` for codes outside the known vocabulary (e.g. a
|
|
83
|
+
* newer server) — callers keep the verbatim wire string separately (see
|
|
84
|
+
* `GuardianHttpError.rawCode`) rather than letting an unknown code silently
|
|
85
|
+
* satisfy a string branch.
|
|
86
|
+
*/
|
|
87
|
+
export function normalizeGuardianErrorCode(raw: string): GuardianErrorCode | null {
|
|
88
|
+
const aliased = WIRE_ALIASES[raw];
|
|
89
|
+
if (aliased !== undefined) return aliased;
|
|
90
|
+
return isGuardianErrorCode(raw) ? raw : null;
|
|
91
|
+
}
|