@ftptech/canton-agent-wallet 0.8.0 → 0.9.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/cli-args.d.ts +64 -2
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +87 -2
- package/dist/cli-args.js.map +1 -1
- package/dist/cli.js +64 -5
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/quest-fund.d.ts +64 -1
- package/dist/quest-fund.d.ts.map +1 -1
- package/dist/quest-fund.js +164 -17
- package/dist/quest-fund.js.map +1 -1
- package/dist/registry-parties.d.ts +54 -0
- package/dist/registry-parties.d.ts.map +1 -0
- package/dist/registry-parties.js +94 -0
- package/dist/registry-parties.js.map +1 -0
- package/dist/relay-client.d.ts +28 -0
- package/dist/relay-client.d.ts.map +1 -1
- package/dist/relay-client.js +11 -0
- package/dist/relay-client.js.map +1 -1
- package/dist/relay-signer.d.ts +23 -8
- package/dist/relay-signer.d.ts.map +1 -1
- package/dist/relay-signer.js +25 -4
- package/dist/relay-signer.js.map +1 -1
- package/dist/tx.d.ts +43 -0
- package/dist/tx.d.ts.map +1 -1
- package/dist/tx.js +120 -2
- package/dist/tx.js.map +1 -1
- package/dist/verify-prepared.d.ts +13 -8
- package/dist/verify-prepared.d.ts.map +1 -1
- package/dist/verify-prepared.js +49 -8
- package/dist/verify-prepared.js.map +1 -1
- package/package.json +4 -4
package/dist/quest-fund.js
CHANGED
|
@@ -24,24 +24,55 @@
|
|
|
24
24
|
*/
|
|
25
25
|
import { agentKeyFromPrivatePem } from "./keys.js";
|
|
26
26
|
import { ensureWallet } from "./onboard.js";
|
|
27
|
-
import { loadWallet, saveWallet } from "./store.js";
|
|
27
|
+
import { loadWallet, saveWallet, walletDir } from "./store.js";
|
|
28
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
29
|
+
import { join } from "node:path";
|
|
28
30
|
import { RelayClient } from "./relay-client.js";
|
|
29
31
|
/** A quest leg failed or the flow could not complete. `auto_fund` catches this
|
|
30
32
|
* and falls back to the manual-funding ask, so a pay-proxy hiccup never turns
|
|
31
33
|
* into a hard tool error. */
|
|
34
|
+
/**
|
|
35
|
+
* `recoverable` is set when the quest failed AFTER step 1 handed us a real
|
|
36
|
+
* party and its private key. Losing that key loses custody of whatever the
|
|
37
|
+
* faucet already put on that party — the throw used to discard it, and the CLI
|
|
38
|
+
* then told the operator to ask their owner for CC while the grant sat on a
|
|
39
|
+
* party nobody could act as any more.
|
|
40
|
+
*/
|
|
32
41
|
export class QuestFundError extends Error {
|
|
33
|
-
constructor(message) {
|
|
42
|
+
constructor(message, recoverable) {
|
|
34
43
|
super(message);
|
|
35
44
|
this.name = "QuestFundError";
|
|
45
|
+
if (recoverable) {
|
|
46
|
+
Object.defineProperty(this, "recoverable", {
|
|
47
|
+
value: recoverable,
|
|
48
|
+
enumerable: false,
|
|
49
|
+
writable: false,
|
|
50
|
+
configurable: false,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
36
53
|
}
|
|
37
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* The parsed body, or undefined when the answer was not a readable JSON result.
|
|
57
|
+
*
|
|
58
|
+
* The distinction is the point. A reverse proxy in front of the pay-proxy
|
|
59
|
+
* answers a restart or an upstream hiccup with a 502/504 HTML page, and a
|
|
60
|
+
* rate-limiter answers 429 — none of which is the job telling us anything. The
|
|
61
|
+
* old version flattened all of it to `{}`, which matched neither "pending" nor
|
|
62
|
+
* the terminal status, so a poll that could not be read was reported as "the
|
|
63
|
+
* quest failed" on the very first blip, with 39 polls of budget still unused.
|
|
64
|
+
* The two POSTs in this file check `status !== 202` correctly; the rule was
|
|
65
|
+
* simply dropped on the reads that decide the outcome.
|
|
66
|
+
*/
|
|
38
67
|
async function jsonOf(r) {
|
|
68
|
+
if (!r.ok)
|
|
69
|
+
return undefined;
|
|
39
70
|
const text = await r.text();
|
|
40
71
|
try {
|
|
41
|
-
return JSON.parse(text) ??
|
|
72
|
+
return JSON.parse(text) ?? undefined;
|
|
42
73
|
}
|
|
43
74
|
catch {
|
|
44
|
-
return
|
|
75
|
+
return undefined;
|
|
45
76
|
}
|
|
46
77
|
}
|
|
47
78
|
/**
|
|
@@ -63,7 +94,7 @@ export async function questFund(opts) {
|
|
|
63
94
|
if (createRes.status !== 202) {
|
|
64
95
|
throw new QuestFundError(`quest create returned ${createRes.status} (expected 202)`);
|
|
65
96
|
}
|
|
66
|
-
const walletJobId = (await jsonOf(createRes))
|
|
97
|
+
const walletJobId = (await jsonOf(createRes))?.walletJobId;
|
|
67
98
|
if (typeof walletJobId !== "string" || !walletJobId) {
|
|
68
99
|
throw new QuestFundError("quest create returned no walletJobId");
|
|
69
100
|
}
|
|
@@ -73,6 +104,9 @@ export async function questFund(opts) {
|
|
|
73
104
|
await sleep(pollMs);
|
|
74
105
|
const r = await doFetch(`${base}/v1/quest/wallet/result?walletJobId=${encodeURIComponent(walletJobId)}`);
|
|
75
106
|
const body = await jsonOf(r);
|
|
107
|
+
// Unreadable answer: not a verdict. Keep polling with the budget we have.
|
|
108
|
+
if (!body)
|
|
109
|
+
continue;
|
|
76
110
|
if (body.status === "pending")
|
|
77
111
|
continue;
|
|
78
112
|
if (body.status === "funded") {
|
|
@@ -104,7 +138,7 @@ export async function questFund(opts) {
|
|
|
104
138
|
if (payRes.status !== 202) {
|
|
105
139
|
throw new QuestFundError(`quest pay returned ${payRes.status} (expected 202)`);
|
|
106
140
|
}
|
|
107
|
-
const payJobId = (await jsonOf(payRes))
|
|
141
|
+
const payJobId = (await jsonOf(payRes))?.payJobId;
|
|
108
142
|
if (typeof payJobId !== "string" || !payJobId) {
|
|
109
143
|
throw new QuestFundError("quest pay returned no payJobId");
|
|
110
144
|
}
|
|
@@ -114,16 +148,23 @@ export async function questFund(opts) {
|
|
|
114
148
|
await sleep(pollMs);
|
|
115
149
|
const r = await doFetch(`${base}/v1/quest/wallet/pay-result?payJobId=${encodeURIComponent(payJobId)}`);
|
|
116
150
|
const body = await jsonOf(r);
|
|
151
|
+
if (!body)
|
|
152
|
+
continue;
|
|
117
153
|
if (body.status === "pending")
|
|
118
154
|
continue;
|
|
119
155
|
if (body.status === "done") {
|
|
120
156
|
done = body;
|
|
121
157
|
break;
|
|
122
158
|
}
|
|
123
|
-
throw new QuestFundError(`quest STEP 2 failed: ${String(body.error ?? body.status ?? "unknown")}
|
|
159
|
+
throw new QuestFundError(`quest STEP 2 failed: ${String(body.error ?? body.status ?? "unknown")}`, { secret, party, network: typeof network === "string" ? network : "canton:mainnet" });
|
|
160
|
+
}
|
|
161
|
+
if (!done) {
|
|
162
|
+
throw new QuestFundError("quest STEP 2 timed out", {
|
|
163
|
+
secret,
|
|
164
|
+
party,
|
|
165
|
+
network: typeof network === "string" ? network : "canton:mainnet",
|
|
166
|
+
});
|
|
124
167
|
}
|
|
125
|
-
if (!done)
|
|
126
|
-
throw new QuestFundError("quest STEP 2 timed out");
|
|
127
168
|
return {
|
|
128
169
|
secret,
|
|
129
170
|
party,
|
|
@@ -133,6 +174,26 @@ export async function questFund(opts) {
|
|
|
133
174
|
image: typeof done.image === "string" ? done.image : undefined,
|
|
134
175
|
};
|
|
135
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* Persist a key rescued from a failed quest, beside the wallet but never AS the
|
|
179
|
+
* wallet.
|
|
180
|
+
*
|
|
181
|
+
* EXPORTED because the MCP server runs the same quest through the lower-level
|
|
182
|
+
* `questFund` and needs the same rescue. It had none: the only copy of the
|
|
183
|
+
* private key rode away inside the thrown Error and was collected, leaving
|
|
184
|
+
* faucet CC on a MainNet party nobody can spend. One rescue, one place. Overwriting wallet.json here would destroy the private key of an
|
|
185
|
+
* existing wallet on an error path — the exact loss this rescue exists to
|
|
186
|
+
* prevent, aimed at the other wallet. The party goes in the filename so two
|
|
187
|
+
* rescues cannot silently overwrite each other.
|
|
188
|
+
*/
|
|
189
|
+
export function writeRescueKey(secret, party, _network) {
|
|
190
|
+
const d = walletDir();
|
|
191
|
+
mkdirSync(d, { recursive: true, mode: 0o700 });
|
|
192
|
+
const safe = party.replace(/[^A-Za-z0-9_.-]/g, "_").slice(0, 80);
|
|
193
|
+
const p = join(d, `rescued-key-${safe}.pem`);
|
|
194
|
+
writeFileSync(p, secret.endsWith("\n") ? secret : secret + "\n", { mode: 0o600 });
|
|
195
|
+
return p;
|
|
196
|
+
}
|
|
136
197
|
/**
|
|
137
198
|
* Bootstrap a funded self-custody wallet through the quest (mint → grant →
|
|
138
199
|
* CanTrust payment → change) and INSTALL it (`saveWallet`) so the caller owns the
|
|
@@ -148,25 +209,111 @@ export async function fundViaQuest(opts) {
|
|
|
148
209
|
const load = opts.loadWalletImpl ?? loadWallet;
|
|
149
210
|
const balanceOf = opts.balanceOf ??
|
|
150
211
|
(async (relayUrl, party) => (await new RelayClient({ relayUrl }).balance(party)).cc);
|
|
212
|
+
const pendingOf = opts.pendingOf ??
|
|
213
|
+
(async (relayUrl, party) => (await new RelayClient({ relayUrl }).pending(party)).pending);
|
|
151
214
|
const existing = load();
|
|
152
215
|
if (existing) {
|
|
153
|
-
|
|
216
|
+
// UNREADABLE IS NOT EMPTY.
|
|
217
|
+
//
|
|
218
|
+
// The guard below is the only thing standing between an existing wallet
|
|
219
|
+
// and `saveWallet` overwriting it — and overwriting wallet.json destroys
|
|
220
|
+
// the private key, which is the one thing here that cannot be undone. The
|
|
221
|
+
// old code caught the balance read into `cc = "0"` and commented that as
|
|
222
|
+
// "treat as empty and proceed to bootstrap": a relay blip, a DNS hiccup or
|
|
223
|
+
// any 5xx therefore looked exactly like an empty wallet, and the key of a
|
|
224
|
+
// wallet holding real CC was replaced.
|
|
225
|
+
//
|
|
226
|
+
// A wallet is only ever replaced when we KNOW it is empty. If the balance
|
|
227
|
+
// cannot be read we refuse and say so; the caller retries when the relay
|
|
228
|
+
// is back, and nothing was lost in the meantime.
|
|
229
|
+
let cc;
|
|
154
230
|
try {
|
|
155
231
|
cc = await balanceOf(opts.relayUrl, existing.party);
|
|
156
232
|
}
|
|
157
|
-
catch {
|
|
158
|
-
|
|
233
|
+
catch (err) {
|
|
234
|
+
throw new QuestFundError(`a wallet already exists (${existing.party}) but its balance could not ` +
|
|
235
|
+
`be read (${err instanceof Error ? err.message : String(err)}) — ` +
|
|
236
|
+
`refusing to overwrite it, because an unreadable balance is not an ` +
|
|
237
|
+
`empty one and replacing the wallet would destroy its private key. ` +
|
|
238
|
+
`Retry once the relay is reachable.`);
|
|
159
239
|
}
|
|
160
240
|
if (Number(cc) > 0) {
|
|
161
241
|
return { kind: "already_funded", party: existing.party, balanceCc: cc };
|
|
162
242
|
}
|
|
243
|
+
// A BALANCE OF ZERO IS NOT PROOF OF AN EMPTY WALLET.
|
|
244
|
+
//
|
|
245
|
+
// The relay's /balance counts `Splice.Amulet:Amulet` contracts and nothing
|
|
246
|
+
// else (facilitator routes/wallet.ts scopes the query to that template on
|
|
247
|
+
// purpose). CC that someone has SENT to this party but that nobody has
|
|
248
|
+
// accepted yet is not an Amulet — it is a pending TransferInstruction, and
|
|
249
|
+
// it reads as 0.0000000000 here.
|
|
250
|
+
//
|
|
251
|
+
// That is the normal state of an agent wallet, not an exotic one: an agent
|
|
252
|
+
// has no TransferPreapproval, which is precisely why a separate `claim`
|
|
253
|
+
// step exists ("run after the owner has sent CC"). So the window between
|
|
254
|
+
// "owner sent the funds" and "agent accepted them" is exactly the window in
|
|
255
|
+
// which this guard called the wallet empty and `saveWallet` destroyed the
|
|
256
|
+
// private key of the party those funds are addressed to. The CC stays on
|
|
257
|
+
// the ledger, addressed to a party nobody can act as any more.
|
|
258
|
+
//
|
|
259
|
+
// Same rule as the balance read above, applied to the other half of the
|
|
260
|
+
// question: unreadable is not empty, and neither is unclaimed.
|
|
261
|
+
let pending;
|
|
262
|
+
try {
|
|
263
|
+
pending = await pendingOf(opts.relayUrl, existing.party);
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
throw new QuestFundError(`a wallet already exists (${existing.party}) and reads as empty, but ` +
|
|
267
|
+
`its pending incoming transfers could not be read (${err instanceof Error ? err.message : String(err)}) — refusing to overwrite it, because a balance of zero only proves ` +
|
|
268
|
+
`there are no ACCEPTED funds. Retry once the relay is reachable.`);
|
|
269
|
+
}
|
|
270
|
+
if (pending.length > 0) {
|
|
271
|
+
const total = pending
|
|
272
|
+
.reduce((sum, p) => sum + Number(p.amount ?? 0), 0)
|
|
273
|
+
.toFixed(10);
|
|
274
|
+
throw new QuestFundError(`a wallet already exists (${existing.party}) with ${pending.length} ` +
|
|
275
|
+
`unaccepted incoming transfer(s) totalling ${total} CC — refusing to ` +
|
|
276
|
+
`overwrite it, because replacing the wallet would destroy the private ` +
|
|
277
|
+
`key those funds are addressed to and they could never be claimed. ` +
|
|
278
|
+
`Run \`claim\` to accept them first.`);
|
|
279
|
+
}
|
|
163
280
|
}
|
|
164
281
|
const runQuest = opts.questFundImpl ?? questFund;
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
282
|
+
const rescueKey = opts.rescueKeyImpl ?? writeRescueKey;
|
|
283
|
+
let funded;
|
|
284
|
+
try {
|
|
285
|
+
funded = await runQuest({
|
|
286
|
+
payProxyUrl: opts.payProxyUrl,
|
|
287
|
+
...(opts.prompt !== undefined ? { prompt: opts.prompt } : {}),
|
|
288
|
+
...(opts.fetchImpl ? { fetchImpl: opts.fetchImpl } : {}),
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
catch (err) {
|
|
292
|
+
// A QUEST THAT FAILS PAST STEP 1 STILL LEFT US HOLDING A KEY.
|
|
293
|
+
//
|
|
294
|
+
// Step 2 is the leg that faucets, accepts and spends, so by the time it can
|
|
295
|
+
// fail the party may already hold real CC. Letting the exception carry the
|
|
296
|
+
// only copy of its private key away turned a recoverable interruption into
|
|
297
|
+
// funds nobody can ever move. We write the key out and name the file in the
|
|
298
|
+
// error — deliberately NOT into wallet.json, which may hold another wallet
|
|
299
|
+
// whose own key must not be destroyed by an error path.
|
|
300
|
+
const rec = err instanceof QuestFundError ? err.recoverable : undefined;
|
|
301
|
+
if (!rec)
|
|
302
|
+
throw err;
|
|
303
|
+
let where;
|
|
304
|
+
try {
|
|
305
|
+
where = rescueKey(rec.secret, rec.party, rec.network);
|
|
306
|
+
}
|
|
307
|
+
catch (writeErr) {
|
|
308
|
+
throw new QuestFundError(`${err.message} — and the funded party's key could NOT be ` +
|
|
309
|
+
`written to disk (${writeErr instanceof Error ? writeErr.message : String(writeErr)}). Party ${rec.party} may hold CC that is now unreachable; capture ` +
|
|
310
|
+
`the key from this process before it exits.`, rec);
|
|
311
|
+
}
|
|
312
|
+
throw new QuestFundError(`${err.message} — the funded party's key was saved to ${where}. ` +
|
|
313
|
+
`Party ${rec.party} may already hold CC: run ` +
|
|
314
|
+
`\`canton-agent-wallet import --key-file ${where}\` in an empty wallet ` +
|
|
315
|
+
`home to take custody, then \`claim\`.`, rec);
|
|
316
|
+
}
|
|
170
317
|
const install = opts.installKey ??
|
|
171
318
|
(async (secret, relayUrl, network) => {
|
|
172
319
|
const key = agentKeyFromPrivatePem(secret);
|
package/dist/quest-fund.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quest-fund.js","sourceRoot":"","sources":["../src/quest-fund.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAoB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"quest-fund.js","sourceRoot":"","sources":["../src/quest-fund.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAoB,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA6BhD;;8BAE8B;AAC9B;;;;;;GAMG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAwBvC,YACE,OAAe,EACf,WAAgE;QAEhE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE;gBACzC,KAAK,EAAE,WAAW;gBAClB,UAAU,EAAE,KAAK;gBACjB,QAAQ,EAAE,KAAK;gBACf,YAAY,EAAE,KAAK;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF;AAED;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,MAAM,CAAC,CAAW;IAC/B,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC;QACH,OAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAA6B,IAAI,SAAS,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAmB;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IACrC,MAAM,KAAK,GACT,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAE9E,yBAAyB;IACzB,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,IAAI,yBAAyB,EAAE;QAChE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;IACH,IAAI,SAAS,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC7B,MAAM,IAAI,cAAc,CACtB,yBAAyB,SAAS,CAAC,MAAM,iBAAiB,CAC3D,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC;IAC3D,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;QACpD,MAAM,IAAI,cAAc,CAAC,sCAAsC,CAAC,CAAC;IACnE,CAAC;IAED,8BAA8B;IAC9B,IAAI,MAA2C,CAAC;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,CAAC,GAAG,MAAM,OAAO,CACrB,GAAG,IAAI,uCAAuC,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAChF,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7B,0EAA0E;QAC1E,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,SAAS;QACxC,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7B,MAAM,GAAG,IAAI,CAAC;YACd,MAAM;QACR,CAAC;QACD,MAAM,IAAI,cAAc,CACtB,wBAAwB,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,EAAE,CACzE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,cAAc,CAAC,wBAAwB,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,IACE,OAAO,MAAM,KAAK,QAAQ;QAC1B,OAAO,WAAW,KAAK,QAAQ;QAC/B,OAAO,KAAK,KAAK,QAAQ,EACzB,CAAC;QACD,MAAM,IAAI,cAAc,CAAC,iDAAiD,CAAC,CAAC;IAC9E,CAAC;IAED,+EAA+E;IAC/E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,IAAI,sBAAsB,EAAE;QAC1D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,WAAW;YACX,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D,CAAC;KACH,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC1B,MAAM,IAAI,cAAc,CACtB,sBAAsB,MAAM,CAAC,MAAM,iBAAiB,CACrD,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC;IAClD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,cAAc,CAAC,gCAAgC,CAAC,CAAC;IAC7D,CAAC;IAED,kCAAkC;IAClC,IAAI,IAAyC,CAAC;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,CAAC,GAAG,MAAM,OAAO,CACrB,GAAG,IAAI,wCAAwC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAC9E,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,SAAS;QACxC,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,IAAI,GAAG,IAAI,CAAC;YACZ,MAAM;QACR,CAAC;QACD,MAAM,IAAI,cAAc,CACtB,wBAAwB,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,EAAE,EACxE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,EAAE,CACrF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,cAAc,CAAC,wBAAwB,EAAE;YACjD,MAAM;YACN,KAAK;YACL,OAAO,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB;SAClE,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,MAAM;QACN,KAAK;QACL,OAAO,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB;QACjE,SAAS,EAAE,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAC1E,QAAQ,EAAE,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QACvE,KAAK,EAAE,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;KAC/D,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,KAAa,EAAE,QAAgB;IAC5E,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;IACtB,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,eAAe,IAAI,MAAM,CAAC,CAAC;IAC7C,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClF,OAAO,CAAC,CAAC;AACX,CAAC;AA8CD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAsB;IAEtB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,IAAI,UAAU,CAAC;IAC/C,MAAM,SAAS,GACb,IAAI,CAAC,SAAS;QACd,CAAC,KAAK,EAAE,QAAgB,EAAE,KAAa,EAAE,EAAE,CACzC,CAAC,MAAM,IAAI,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7D,MAAM,SAAS,GACb,IAAI,CAAC,SAAS;QACd,CAAC,KAAK,EAAE,QAAgB,EAAE,KAAa,EAAE,EAAE,CACzC,CAAC,MAAM,IAAI,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAElE,MAAM,QAAQ,GAAG,IAAI,EAAE,CAAC;IACxB,IAAI,QAAQ,EAAE,CAAC;QACb,2BAA2B;QAC3B,EAAE;QACF,wEAAwE;QACxE,yEAAyE;QACzE,0EAA0E;QAC1E,yEAAyE;QACzE,2EAA2E;QAC3E,0EAA0E;QAC1E,uCAAuC;QACvC,EAAE;QACF,0EAA0E;QAC1E,yEAAyE;QACzE,iDAAiD;QACjD,IAAI,EAAU,CAAC;QACf,IAAI,CAAC;YACH,EAAE,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,cAAc,CACtB,4BAA4B,QAAQ,CAAC,KAAK,8BAA8B;gBACtE,YAAY,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM;gBAClE,oEAAoE;gBACpE,oEAAoE;gBACpE,oCAAoC,CACvC,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAC1E,CAAC;QAED,qDAAqD;QACrD,EAAE;QACF,2EAA2E;QAC3E,0EAA0E;QAC1E,uEAAuE;QACvE,2EAA2E;QAC3E,iCAAiC;QACjC,EAAE;QACF,2EAA2E;QAC3E,wEAAwE;QACxE,yEAAyE;QACzE,4EAA4E;QAC5E,0EAA0E;QAC1E,yEAAyE;QACzE,+DAA+D;QAC/D,EAAE;QACF,wEAAwE;QACxE,+DAA+D;QAC/D,IAAI,OAAgD,CAAC;QACrD,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,cAAc,CACtB,4BAA4B,QAAQ,CAAC,KAAK,4BAA4B;gBACpE,qDACE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,sEAAsE;gBACtE,iEAAiE,CACpE,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,OAAO;iBAClB,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;iBAClD,OAAO,CAAC,EAAE,CAAC,CAAC;YACf,MAAM,IAAI,cAAc,CACtB,4BAA4B,QAAQ,CAAC,KAAK,UAAU,OAAO,CAAC,MAAM,GAAG;gBACnE,6CAA6C,KAAK,oBAAoB;gBACtE,uEAAuE;gBACvE,oEAAoE;gBACpE,qCAAqC,CACxC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,IAAI,SAAS,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,IAAI,cAAc,CAAC;IACvD,IAAI,MAA6C,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,QAAQ,CAAC;YACtB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,8DAA8D;QAC9D,EAAE;QACF,4EAA4E;QAC5E,2EAA2E;QAC3E,2EAA2E;QAC3E,4EAA4E;QAC5E,2EAA2E;QAC3E,wDAAwD;QACxD,MAAM,GAAG,GAAG,GAAG,YAAY,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,IAAI,CAAC,GAAG;YAAE,MAAM,GAAG,CAAC;QACpB,IAAI,KAAa,CAAC;QAClB,IAAI,CAAC;YACH,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,cAAc,CACtB,GAAI,GAAa,CAAC,OAAO,6CAA6C;gBACpE,oBACE,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAChE,YAAY,GAAG,CAAC,KAAK,gDAAgD;gBACrE,4CAA4C,EAC9C,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,cAAc,CACtB,GAAI,GAAa,CAAC,OAAO,0CAA0C,KAAK,IAAI;YAC1E,SAAS,GAAG,CAAC,KAAK,4BAA4B;YAC9C,2CAA2C,KAAK,wBAAwB;YACxE,uCAAuC,EACzC,GAAG,CACJ,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GACX,IAAI,CAAC,UAAU;QACf,CAAC,KAAK,EAAE,MAAc,EAAE,QAAgB,EAAE,OAAe,EAAE,EAAE;YAC3D,MAAM,GAAG,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;YAC3C,uEAAuE;YACvE,mEAAmE;YACnE,yEAAyE;YACzE,wEAAwE;YACxE,+DAA+D;YAC/D,sEAAsE;YACtE,uEAAuE;YACvE,uDAAuD;YACvD,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC;gBAC3B,QAAQ;gBACR,OAAO;gBACP,GAAG;gBACH,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YACH,UAAU,CAAC,CAAC,CAAC,CAAC;YACd,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAE3E,2EAA2E;IAC3E,2EAA2E;IAC3E,0EAA0E;IAC1E,oCAAoC;IACpC,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,IAAI,cAAc,CACtB,0BAA0B,MAAM,CAAC,KAAK,4BAA4B,MAAM,CAAC,KAAK,KAAK;YACjF,8DAA8D,CACjE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,MAAM;QACN,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the agent's INDEPENDENTLY-TRUSTED registry infrastructure parties for a
|
|
3
|
+
* non-Amulet CIP-56 token whose registrar runs a DA Registry Utility (USDCx, and
|
|
4
|
+
* the rest of the registry family). This is the registry-token analogue of
|
|
5
|
+
* `trusted-dso.ts`.
|
|
6
|
+
*
|
|
7
|
+
* WHY THIS EXISTS (self-custody). verify-before-sign
|
|
8
|
+
* (`assertPreparedTransferMatches`) pins the money-critical fields and runs an
|
|
9
|
+
* all-nodes foreign-party backstop. A real registry `TransferFactory_Transfer`
|
|
10
|
+
* legitimately names the registry OPERATOR and, for a bridged token, the mint
|
|
11
|
+
* BRIDGE-OPERATOR as signatories/observers of the holding + rule + preapproval
|
|
12
|
+
* contracts — OUTSIDE the transfer's sender/receiver. To keep the backstop sound
|
|
13
|
+
* those parties are admitted ONLY when the caller pins them to an INDEPENDENTLY-
|
|
14
|
+
* TRUSTED value (`trustedRegistryParties`), never a relay-supplied one — exactly
|
|
15
|
+
* as the DSO is for Amulet. The instrument ADMIN (registrar) is pinned separately
|
|
16
|
+
* via `instrumentAdmin`; this set is the EXTRA infra parties beyond it.
|
|
17
|
+
*
|
|
18
|
+
* These parties are NETWORK-WIDE CONSTANTS per registrar (the same operator/bridge
|
|
19
|
+
* for every transfer of that token on a given network), so they are configured
|
|
20
|
+
* out-of-band ONCE and are NOT learned from the relay/402 (which would be
|
|
21
|
+
* circular). Set `CANTON_AGENT_REGISTRY_TRUSTED_PARTIES` to a JSON object mapping
|
|
22
|
+
* instrument-admin party id → array of trusted infra party ids. A baked-in table
|
|
23
|
+
* of confirmed mainnet registries makes the common case work out of the box,
|
|
24
|
+
* exactly like `KNOWN_DSO_BY_NETWORK`; the env merges on top / overrides.
|
|
25
|
+
*
|
|
26
|
+
* GENERIC: nothing here is keyed on a token symbol. A new registry token is added
|
|
27
|
+
* by an env entry (or a confirmed constant), never by code.
|
|
28
|
+
*/
|
|
29
|
+
/** JSON env: `{ "<instrument-admin>": ["<operator>", "<bridge>", …] }`. */
|
|
30
|
+
export declare const REGISTRY_TRUSTED_PARTIES_ENV = "CANTON_AGENT_REGISTRY_TRUSTED_PARTIES";
|
|
31
|
+
/**
|
|
32
|
+
* Confirmed mainnet registry infra parties, keyed by instrument-admin (registrar)
|
|
33
|
+
* party id. Baked in as an out-of-band convenience anchor (network constants, not
|
|
34
|
+
* relay-learned), overridable/extendable via the env. USDCx's registrar
|
|
35
|
+
* `decentralized-usdc-interchain-rep::1220…` → the DA Registry Utility operator +
|
|
36
|
+
* the xReserve Bridge-Operator, both confirmed on a live MainNet USDCx
|
|
37
|
+
* `TransferFactory_Transfer`.
|
|
38
|
+
*/
|
|
39
|
+
export declare const KNOWN_REGISTRY_TRUSTED_PARTIES: Readonly<Record<string, readonly string[]>>;
|
|
40
|
+
/**
|
|
41
|
+
* The independently-trusted registry infra party set for `instrumentAdmin`, or an
|
|
42
|
+
* empty set when the admin is not a known/configured registry (Amulet, or an
|
|
43
|
+
* unconfigured token). Env entries MERGE with (and can extend) the baked-in
|
|
44
|
+
* constants for the same admin.
|
|
45
|
+
*/
|
|
46
|
+
export declare function resolveTrustedRegistryParties(instrumentAdmin: string, env?: NodeJS.ProcessEnv): ReadonlySet<string>;
|
|
47
|
+
/**
|
|
48
|
+
* Whether `instrumentAdmin` is an independently-trusted registry admin — i.e. the
|
|
49
|
+
* agent has an out-of-band trust anchor for it (a baked-in or env-configured infra
|
|
50
|
+
* set). Only then may the admin be pinned from the 402-supplied value; otherwise a
|
|
51
|
+
* value-moving transfer keeps the Amulet DSO anchor / fails closed.
|
|
52
|
+
*/
|
|
53
|
+
export declare function isTrustedRegistryAdmin(instrumentAdmin: string, env?: NodeJS.ProcessEnv): boolean;
|
|
54
|
+
//# sourceMappingURL=registry-parties.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-parties.d.ts","sourceRoot":"","sources":["../src/registry-parties.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,4BAA4B,0CAA0C,CAAC;AAEpF;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B,EAAE,QAAQ,CACnD,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CASlC,CAAC;AA0BF;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,eAAe,EAAE,MAAM,EACvB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,WAAW,CAAC,MAAM,CAAC,CAMrB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,eAAe,EAAE,MAAM,EACvB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAET"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the agent's INDEPENDENTLY-TRUSTED registry infrastructure parties for a
|
|
3
|
+
* non-Amulet CIP-56 token whose registrar runs a DA Registry Utility (USDCx, and
|
|
4
|
+
* the rest of the registry family). This is the registry-token analogue of
|
|
5
|
+
* `trusted-dso.ts`.
|
|
6
|
+
*
|
|
7
|
+
* WHY THIS EXISTS (self-custody). verify-before-sign
|
|
8
|
+
* (`assertPreparedTransferMatches`) pins the money-critical fields and runs an
|
|
9
|
+
* all-nodes foreign-party backstop. A real registry `TransferFactory_Transfer`
|
|
10
|
+
* legitimately names the registry OPERATOR and, for a bridged token, the mint
|
|
11
|
+
* BRIDGE-OPERATOR as signatories/observers of the holding + rule + preapproval
|
|
12
|
+
* contracts — OUTSIDE the transfer's sender/receiver. To keep the backstop sound
|
|
13
|
+
* those parties are admitted ONLY when the caller pins them to an INDEPENDENTLY-
|
|
14
|
+
* TRUSTED value (`trustedRegistryParties`), never a relay-supplied one — exactly
|
|
15
|
+
* as the DSO is for Amulet. The instrument ADMIN (registrar) is pinned separately
|
|
16
|
+
* via `instrumentAdmin`; this set is the EXTRA infra parties beyond it.
|
|
17
|
+
*
|
|
18
|
+
* These parties are NETWORK-WIDE CONSTANTS per registrar (the same operator/bridge
|
|
19
|
+
* for every transfer of that token on a given network), so they are configured
|
|
20
|
+
* out-of-band ONCE and are NOT learned from the relay/402 (which would be
|
|
21
|
+
* circular). Set `CANTON_AGENT_REGISTRY_TRUSTED_PARTIES` to a JSON object mapping
|
|
22
|
+
* instrument-admin party id → array of trusted infra party ids. A baked-in table
|
|
23
|
+
* of confirmed mainnet registries makes the common case work out of the box,
|
|
24
|
+
* exactly like `KNOWN_DSO_BY_NETWORK`; the env merges on top / overrides.
|
|
25
|
+
*
|
|
26
|
+
* GENERIC: nothing here is keyed on a token symbol. A new registry token is added
|
|
27
|
+
* by an env entry (or a confirmed constant), never by code.
|
|
28
|
+
*/
|
|
29
|
+
/** JSON env: `{ "<instrument-admin>": ["<operator>", "<bridge>", …] }`. */
|
|
30
|
+
export const REGISTRY_TRUSTED_PARTIES_ENV = "CANTON_AGENT_REGISTRY_TRUSTED_PARTIES";
|
|
31
|
+
/**
|
|
32
|
+
* Confirmed mainnet registry infra parties, keyed by instrument-admin (registrar)
|
|
33
|
+
* party id. Baked in as an out-of-band convenience anchor (network constants, not
|
|
34
|
+
* relay-learned), overridable/extendable via the env. USDCx's registrar
|
|
35
|
+
* `decentralized-usdc-interchain-rep::1220…` → the DA Registry Utility operator +
|
|
36
|
+
* the xReserve Bridge-Operator, both confirmed on a live MainNet USDCx
|
|
37
|
+
* `TransferFactory_Transfer`.
|
|
38
|
+
*/
|
|
39
|
+
export const KNOWN_REGISTRY_TRUSTED_PARTIES = {
|
|
40
|
+
"decentralized-usdc-interchain-rep::12208115f1e168dd7e792320be9c4ca720c751a02a3053c7606e1c1cd3dad9bf60ef": [
|
|
41
|
+
// DA Registry Utility operator (from /api/utilities/v0/operator).
|
|
42
|
+
"auth0_007c6643538f2eadd3e573dd05b9::12205bcc106efa0eaa7f18dc491e5c6f5fb9b0cc68dc110ae66f4ed6467475d7c78e",
|
|
43
|
+
// xReserve Bridge-Operator (mints/burns USDCx; signatory on the holding).
|
|
44
|
+
"Bridge-Operator::1220c8448890a70e65f6906bd48d797ee6551f094e9e6a53e329fd5b2b549334f13f",
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
/** Parse the env JSON (admin → party[]) fail-closed to `{}` on any malformation. */
|
|
48
|
+
function parseEnvTrustedParties(raw) {
|
|
49
|
+
if (!raw || raw.trim().length === 0)
|
|
50
|
+
return {};
|
|
51
|
+
try {
|
|
52
|
+
const parsed = JSON.parse(raw);
|
|
53
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
54
|
+
return {};
|
|
55
|
+
}
|
|
56
|
+
const out = {};
|
|
57
|
+
for (const [admin, parties] of Object.entries(parsed)) {
|
|
58
|
+
if (!Array.isArray(parties))
|
|
59
|
+
continue;
|
|
60
|
+
const ps = parties.filter((p) => typeof p === "string" && p.length > 0);
|
|
61
|
+
if (ps.length > 0)
|
|
62
|
+
out[admin] = ps;
|
|
63
|
+
}
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return {};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The independently-trusted registry infra party set for `instrumentAdmin`, or an
|
|
72
|
+
* empty set when the admin is not a known/configured registry (Amulet, or an
|
|
73
|
+
* unconfigured token). Env entries MERGE with (and can extend) the baked-in
|
|
74
|
+
* constants for the same admin.
|
|
75
|
+
*/
|
|
76
|
+
export function resolveTrustedRegistryParties(instrumentAdmin, env = process.env) {
|
|
77
|
+
const fromEnv = parseEnvTrustedParties(env[REGISTRY_TRUSTED_PARTIES_ENV]);
|
|
78
|
+
const set = new Set();
|
|
79
|
+
for (const p of KNOWN_REGISTRY_TRUSTED_PARTIES[instrumentAdmin] ?? [])
|
|
80
|
+
set.add(p);
|
|
81
|
+
for (const p of fromEnv[instrumentAdmin] ?? [])
|
|
82
|
+
set.add(p);
|
|
83
|
+
return set;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Whether `instrumentAdmin` is an independently-trusted registry admin — i.e. the
|
|
87
|
+
* agent has an out-of-band trust anchor for it (a baked-in or env-configured infra
|
|
88
|
+
* set). Only then may the admin be pinned from the 402-supplied value; otherwise a
|
|
89
|
+
* value-moving transfer keeps the Amulet DSO anchor / fails closed.
|
|
90
|
+
*/
|
|
91
|
+
export function isTrustedRegistryAdmin(instrumentAdmin, env = process.env) {
|
|
92
|
+
return resolveTrustedRegistryParties(instrumentAdmin, env).size > 0;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=registry-parties.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-parties.js","sourceRoot":"","sources":["../src/registry-parties.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,4BAA4B,GAAG,uCAAuC,CAAC;AAEpF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAEvC;IACF,yGAAyG,EACvG;QACE,kEAAkE;QAClE,0GAA0G;QAC1G,0EAA0E;QAC1E,uFAAuF;KACxF;CACJ,CAAC;AAEF,oFAAoF;AACpF,SAAS,sBAAsB,CAC7B,GAAuB;IAEvB,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,GAAG,GAA6B,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;gBAAE,SAAS;YACtC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CACvB,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAC1D,CAAC;YACF,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gBAAE,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACrC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAC3C,eAAuB,EACvB,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,OAAO,GAAG,sBAAsB,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAC1E,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,8BAA8B,CAAC,eAAe,CAAC,IAAI,EAAE;QAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClF,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE;QAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,eAAuB,EACvB,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,6BAA6B,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;AACtE,CAAC"}
|
package/dist/relay-client.d.ts
CHANGED
|
@@ -153,6 +153,13 @@ export declare class RelayClient {
|
|
|
153
153
|
* inline in the payment payload. The response still returns the prepared
|
|
154
154
|
* transaction and its hash — only `submissionRef` comes back empty. */
|
|
155
155
|
inline?: boolean;
|
|
156
|
+
/** Non-Amulet CIP-56 instrument to pay in. Omit for Canton Coin. Its admin
|
|
157
|
+
* must be configured on the relay (CANTON_X402_TOKEN_REGISTRIES) or the
|
|
158
|
+
* relay 400s. */
|
|
159
|
+
instrumentId?: {
|
|
160
|
+
admin: string;
|
|
161
|
+
id: string;
|
|
162
|
+
};
|
|
156
163
|
}): Promise<{
|
|
157
164
|
submissionRef: string;
|
|
158
165
|
preparedTransaction: string;
|
|
@@ -237,6 +244,21 @@ export declare class RelayClient {
|
|
|
237
244
|
party: string;
|
|
238
245
|
expiresAt: string;
|
|
239
246
|
}>;
|
|
247
|
+
/** REGISTRY (non-Amulet, e.g. USDCx) self-preapproval, step 1 — the relay
|
|
248
|
+
* fetches the registry operator and builds the CreateCommand for the wallet's
|
|
249
|
+
* own `Utility.Registry.App.V0.Model.TransferPreapproval`. The wallet then
|
|
250
|
+
* verify-before-signs (assertPreparedRegistrySelfPreapproval) and commits via
|
|
251
|
+
* the SAME `preapprovalSelfCommit` route. */
|
|
252
|
+
preapprovalRegistrySelfPrepare(party: string, instrumentId: {
|
|
253
|
+
admin: string;
|
|
254
|
+
id: string;
|
|
255
|
+
}): Promise<{
|
|
256
|
+
preparedTransaction: string;
|
|
257
|
+
hash: string;
|
|
258
|
+
synchronizerId: string;
|
|
259
|
+
party: string;
|
|
260
|
+
operator: string;
|
|
261
|
+
}>;
|
|
240
262
|
/** SELF-PROVIDER preapproval, step 2 — submit the merchant-signed prepared
|
|
241
263
|
* transaction; returns the created preapproval's updateId. */
|
|
242
264
|
preapprovalSelfCommit(body: {
|
|
@@ -282,6 +304,12 @@ export declare class RelayClient {
|
|
|
282
304
|
receiver: string;
|
|
283
305
|
amount: string;
|
|
284
306
|
meta?: Record<string, string>;
|
|
307
|
+
/** Non-Amulet CIP-56 instrument to resolve. Omit for Canton Coin — the
|
|
308
|
+
* relay then defaults admin=DSO, id="Amulet". */
|
|
309
|
+
instrumentId?: {
|
|
310
|
+
admin: string;
|
|
311
|
+
id: string;
|
|
312
|
+
};
|
|
285
313
|
}): Promise<ResolveFactoryResult>;
|
|
286
314
|
resolveAccept(b: {
|
|
287
315
|
instructionCid: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-client.d.ts","sourceRoot":"","sources":["../src/relay-client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"relay-client.d.ts","sourceRoot":"","sources":["../src/relay-client.ts"],"names":[],"mappings":"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"}
|
package/dist/relay-client.js
CHANGED
|
@@ -122,6 +122,17 @@ export class RelayClient {
|
|
|
122
122
|
...(expiresAt ? { expiresAt } : {}),
|
|
123
123
|
});
|
|
124
124
|
}
|
|
125
|
+
/** REGISTRY (non-Amulet, e.g. USDCx) self-preapproval, step 1 — the relay
|
|
126
|
+
* fetches the registry operator and builds the CreateCommand for the wallet's
|
|
127
|
+
* own `Utility.Registry.App.V0.Model.TransferPreapproval`. The wallet then
|
|
128
|
+
* verify-before-signs (assertPreparedRegistrySelfPreapproval) and commits via
|
|
129
|
+
* the SAME `preapprovalSelfCommit` route. */
|
|
130
|
+
preapprovalRegistrySelfPrepare(party, instrumentId) {
|
|
131
|
+
return this.req("POST", "/v1/wallet/preapproval/registry/self/prepare", {
|
|
132
|
+
party,
|
|
133
|
+
instrumentId,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
125
136
|
/** SELF-PROVIDER preapproval, step 2 — submit the merchant-signed prepared
|
|
126
137
|
* transaction; returns the created preapproval's updateId. */
|
|
127
138
|
preapprovalSelfCommit(body) {
|
package/dist/relay-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-client.js","sourceRoot":"","sources":["../src/relay-client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"relay-client.js","sourceRoot":"","sources":["../src/relay-client.ts"],"names":[],"mappings":"AAqEA;;;;;;;;;GASG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAG5B;IAEA;IAJX,YACE,OAAe,EACN,MAAc;IACvB,wEAAwE;IAC/D,IAAa;QAEtB,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,WAAM,GAAN,MAAM,CAAQ;QAEd,SAAI,GAAJ,IAAI,CAAS;QAGtB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED;;;;wCAIwC;AACxC,MAAM,UAAU,8BAA8B,CAAC,GAAY;IACzD,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;QAClC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QACpC,MAAM,IAAI,GAAI,GAAG,CAAC,IAAuC,EAAE,IAAI,CAAC;QAChE,IAAI,IAAI,KAAK,4BAA4B;YAAE,OAAO,IAAI,CAAC;IACzD,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7D,OAAO,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,OAAO,WAAW;IAEH;IADnB,YACmB,IAQhB;QARgB,SAAI,GAAJ,IAAI,CAQpB;IACA,CAAC;IAEI,OAAO;QACb,MAAM,CAAC,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;QACzE,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,CAAC,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAC1D,OAAO,CAAC,CAAC;IACX,CAAC;IAEO,KAAK,CAAC,GAAG,CACf,MAAc,EACd,IAAY,EACZ,IAAc,EACd,YAAqC;QAErC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;QACzD,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YACzB,MAAM;YACN,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE;YACvD,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACV,wEAAwE;YACxE,4EAA4E;YAC5E,MAAM,IAAI,cAAc,CACtB,SAAS,MAAM,IAAI,IAAI,OAAO,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAC9D,CAAC,CAAC,MAAM,EACR,IAAI,CACL,CAAC;QACJ,CAAC;QACD,OAAO,IAAS,CAAC;IACnB,CAAC;IAED,cAAc,CAAC,CAAmD;QAChE,OAAO,IAAI,CAAC,GAAG,CAAuB,MAAM,EAAE,4BAA4B,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IACD,eAAe,CAAC,CAGf;QACC,OAAO,IAAI,CAAC,GAAG,CAAoB,MAAM,EAAE,6BAA6B,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;IACD,aAAa,CAAC,CAAU;QACtB,OAAO,IAAI,CAAC,GAAG,CACb,MAAM,EACN,2BAA2B,EAC3B,CAAC,CACF,CAAC;IACJ,CAAC;IACD,aAAa,CAAC,CAAU;QACtB,OAAO,IAAI,CAAC,GAAG,CAAuB,MAAM,EAAE,2BAA2B,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;IACD;;;gCAG4B;IAC5B,UAAU,CAAC,CAiBV;QACC,OAAO,IAAI,CAAC,GAAG,CASZ,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD;uEACmE;IACnE,SAAS,CAAC,CAUT;QACC,OAAO,IAAI,CAAC,GAAG,CACb,MAAM,EACN,uBAAuB,EACvB,CAAC,CACF,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,KAAa;QACnB,OAAO,IAAI,CAAC,GAAG,CACb,KAAK,EACL,cAAc,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAClD,CAAC;IACJ,CAAC;IACD;;;+CAG2C;IAC3C,iBAAiB,CAAC,KAAa,EAAE,KAAa,EAAE,EAAE,GAAG,QAAQ;QAC3D,MAAM,CAAC,GAAG,SAAS,kBAAkB,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5E,OAAO,IAAI,CAAC,GAAG,CAoBZ,KAAK,EAAE,iBAAiB,kBAAkB,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;IAClF,CAAC;IACD;;;;2CAIuC;IACvC,iBAAiB,CACf,KAAa,EACb,IAAmD;QAEnD,OAAO,IAAI,CAAC,GAAG,CAMb,MAAM,EACN,iBAAiB,kBAAkB,CAAC,KAAK,CAAC,cAAc,EACxD,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EACnD,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,aAAa,EAAE,EAAE,CAClD,CAAC;IACJ,CAAC;IACD;;;sEAGkE;IAClE,sBAAsB,CAAC,KAAa,EAAE,SAAkB;QACtD,OAAO,IAAI,CAAC,GAAG,CAMZ,MAAM,EAAE,qCAAqC,EAAE;YAChD,KAAK;YACL,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IACD;;;;kDAI8C;IAC9C,8BAA8B,CAAC,KAAa,EAAE,YAA2C;QACvF,OAAO,IAAI,CAAC,GAAG,CAMZ,MAAM,EAAE,8CAA8C,EAAE;YACzD,KAAK;YACL,YAAY;SACb,CAAC,CAAC;IACL,CAAC;IACD;mEAC+D;IAC/D,qBAAqB,CAAC,IAUrB;QACC,OAAO,IAAI,CAAC,GAAG,CACb,MAAM,EACN,oCAAoC,EACpC,IAAI,CACL,CAAC;IACJ,CAAC;IACD;;;8CAG0C;IAC1C,YAAY,CAAC,KAAa;QACxB,OAAO,IAAI,CAAC,GAAG,CACb,KAAK,EACL,cAAc,kBAAkB,CAAC,KAAK,CAAC,gBAAgB,CACxD,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,KAAa;QACnB,OAAO,IAAI,CAAC,GAAG,CACb,KAAK,EACL,cAAc,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAClD,CAAC;IACJ,CAAC;IACD;;;;qEAIiE;IACjE,WAAW,CAAC,KAAa;QACvB,OAAO,IAAI,CAAC,GAAG,CACb,MAAM,EACN,yBAAyB,EACzB,EAAE,KAAK,EAAE,EACT,IAAI,CAAC,IAAI,CAAC,YAAY;YACpB,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YAC/C,CAAC,CAAC,SAAS,CACd,CAAC;IACJ,CAAC;IACD;;;+EAG2E;IAC3E,SAAS;QACP,OAAO,IAAI,CAAC,GAAG,CAEZ,KAAK,EAAE,YAAY,CAAC,CAAC;IAC1B,CAAC;IACD,sBAAsB,CAAC,CAQtB;QACC,OAAO,IAAI,CAAC,GAAG,CACb,MAAM,EACN,qCAAqC,EACrC,CAAC,CACF,CAAC;IACJ,CAAC;IACD,aAAa,CAAC,CAA6B;QACzC,OAAO,IAAI,CAAC,GAAG,CAAsB,MAAM,EAAE,2BAA2B,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;IACD;;;;;wFAKoF;IACpF,SAAS,CAAC,KAAa,EAAE,QAAgB;QACvC,OAAO,IAAI,CAAC,GAAG,CACb,KAAK,EACL,cAAc,kBAAkB,CAAC,KAAK,CAAC,wBAAwB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAC9F,CAAC;IACJ,CAAC;CACF"}
|
package/dist/relay-signer.d.ts
CHANGED
|
@@ -31,14 +31,29 @@ export declare function makeRelaySigner(wallet: AgentWallet, opts?: {
|
|
|
31
31
|
* Opt-in — a deployment whose facilitator predates the inline arm keeps the
|
|
32
32
|
* reference form by leaving this unset. */
|
|
33
33
|
inline?: boolean;
|
|
34
|
-
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
34
|
+
/**
|
|
35
|
+
* Optional spend ceiling: the MAX this signer will EVER sign for, **in CC**
|
|
36
|
+
* — the ledger Decimal, e.g. `"0.05"`. NOT the atomic integer the 402
|
|
37
|
+
* quotes.
|
|
38
|
+
*
|
|
39
|
+
* This doc used to say "the same unit the 402 quotes", which is wrong and
|
|
40
|
+
* wrong in the dangerous direction. The 402 carries `amount` as an atomic
|
|
41
|
+
* integer ("500000000" for 0.05 CC); the client converts it once
|
|
42
|
+
* (`wireAmountToLedgerDecimal`, the off-by-10^10 firewall) and hands the
|
|
43
|
+
* signer the ledger Decimal, which is what `input.amount` is here and what
|
|
44
|
+
* this compares against. A caller who followed the old sentence and wrote
|
|
45
|
+
* `"500000000"` meaning 0.05 CC got a ceiling of five hundred million CC:
|
|
46
|
+
* the guard was present, configured, and could never fire.
|
|
47
|
+
*
|
|
48
|
+
* Comparing in CC is the correct half — it bounds what is actually signed —
|
|
49
|
+
* so the fix is this sentence, not the comparison. Pinned by a test that
|
|
50
|
+
* fails if the unit ever drifts back.
|
|
51
|
+
*
|
|
52
|
+
* When set, the signer REFUSES to sign — fail closed, before any relay call
|
|
53
|
+
* — if the to-be-signed amount exceeds it. That is what makes the spend
|
|
54
|
+
* breaker load-bearing against an over-quoting (or MITM'd) merchant.
|
|
55
|
+
* Omitted → no ceiling.
|
|
56
|
+
*/
|
|
42
57
|
maxPaymentValue?: string;
|
|
43
58
|
/** Optional expected-payee pin: the ONLY recipient this signer will sign a
|
|
44
59
|
* transfer to (compared against `input.receiver`). When set, the signer
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-signer.d.ts","sourceRoot":"","sources":["../src/relay-signer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"relay-signer.d.ts","sourceRoot":"","sources":["../src/relay-signer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAShE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAY/D,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACrB,KAAK,GAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CACI,GACtC,OAAO,CAAC,CAAC,CAAC,CAeZ;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE;IACJ,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC;;;yEAGqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;gDAG4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;6EAIyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;CACnB,GACL,YAAY,CAoId"}
|