@ftptech/canton-agent-wallet 0.1.15 → 0.1.17
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 +30 -2
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +11 -0
- package/dist/cli-args.js.map +1 -1
- package/dist/cli.js +122 -3
- package/dist/cli.js.map +1 -1
- package/dist/hosted-onboard.d.ts +88 -0
- package/dist/hosted-onboard.d.ts.map +1 -0
- package/dist/hosted-onboard.js +207 -0
- package/dist/hosted-onboard.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/onboard.d.ts +8 -0
- package/dist/onboard.d.ts.map +1 -1
- package/dist/onboard.js +13 -4
- package/dist/onboard.js.map +1 -1
- package/dist/pay.d.ts +27 -0
- package/dist/pay.d.ts.map +1 -1
- package/dist/pay.js +33 -12
- package/dist/pay.js.map +1 -1
- package/dist/relay-client.d.ts +96 -0
- package/dist/relay-client.d.ts.map +1 -1
- package/dist/relay-client.js +36 -0
- package/dist/relay-client.js.map +1 -1
- package/dist/relay-signer.d.ts +15 -0
- package/dist/relay-signer.d.ts.map +1 -1
- package/dist/relay-signer.js +127 -1
- package/dist/relay-signer.js.map +1 -1
- package/dist/tx.d.ts +228 -0
- package/dist/tx.d.ts.map +1 -1
- package/dist/tx.js +416 -1
- package/dist/tx.js.map +1 -1
- package/dist/verify-prepared.d.ts +231 -0
- package/dist/verify-prepared.d.ts.map +1 -1
- package/dist/verify-prepared.js +1046 -13
- package/dist/verify-prepared.js.map +1 -1
- package/package.json +2 -2
package/dist/onboard.d.ts
CHANGED
|
@@ -16,6 +16,14 @@ export interface EnsureWalletOpts {
|
|
|
16
16
|
* already allocated (a second allocate returns HTTP 400). prepare + the
|
|
17
17
|
* verify-before-sign legs still run; we persist the verified prep.party. */
|
|
18
18
|
restore?: boolean;
|
|
19
|
+
/** Ephemeral mode: mint a FRESH wallet on every call and NEVER touch the
|
|
20
|
+
* on-disk store — skip `loadWallet` (always onboard a new key) and skip
|
|
21
|
+
* `saveWallet` (the full key material is returned in the wallet object for the
|
|
22
|
+
* caller to hand off; nothing is persisted by us). Used by the hosted quest
|
|
23
|
+
* one-shot, which mints a throwaway wallet per request and returns its key to
|
|
24
|
+
* the user. Every verify-before-sign leg still runs — only the file I/O is
|
|
25
|
+
* skipped. Independent of `restore`. */
|
|
26
|
+
ephemeral?: boolean;
|
|
19
27
|
}
|
|
20
28
|
export declare function ensureWallet(opts: EnsureWalletOpts): Promise<AgentWallet>;
|
|
21
29
|
//# sourceMappingURL=onboard.d.ts.map
|
package/dist/onboard.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../src/onboard.ts"],"names":[],"mappings":"AASA,OAAO,EAAiC,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACjF,OAAO,EAA0B,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOhD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;wDAEoD;IACpD,GAAG,CAAC,EAAE,gBAAgB,CAAC;IACvB;;iFAE6E;IAC7E,OAAO,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../src/onboard.ts"],"names":[],"mappings":"AASA,OAAO,EAAiC,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACjF,OAAO,EAA0B,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOhD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;wDAEoD;IACpD,GAAG,CAAC,EAAE,gBAAgB,CAAC;IACvB;;iFAE6E;IAC7E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;6CAMyC;IACzC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CA4I/E"}
|
package/dist/onboard.js
CHANGED
|
@@ -13,9 +13,14 @@ import { RelayClient } from "./relay-client.js";
|
|
|
13
13
|
import { assertOnboardingTopologyBindsKey, OnboardingTopologyMismatchError, } from "./verify-prepared.js";
|
|
14
14
|
import { recomputeTopologyMultiHash, fingerprintHex } from "./canton-hash.js";
|
|
15
15
|
export async function ensureWallet(opts) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
// Ephemeral mode skips the on-disk store entirely: never reuse an existing
|
|
17
|
+
// wallet (always mint fresh) and never persist (below). Every verify-before-
|
|
18
|
+
// sign leg still runs — only the file I/O changes.
|
|
19
|
+
if (!opts.ephemeral) {
|
|
20
|
+
const existing = loadWallet();
|
|
21
|
+
if (existing)
|
|
22
|
+
return existing;
|
|
23
|
+
}
|
|
19
24
|
const key = opts.key ?? generateAgentKey();
|
|
20
25
|
const relay = opts.relay ?? new RelayClient({ relayUrl: opts.relayUrl, apiKey: opts.apiKey });
|
|
21
26
|
const prep = await relay.onboardPrepare({
|
|
@@ -123,7 +128,11 @@ export async function ensureWallet(opts) {
|
|
|
123
128
|
publicKeyFingerprint: prep.publicKeyFingerprint,
|
|
124
129
|
createdAt: new Date().toISOString(),
|
|
125
130
|
};
|
|
126
|
-
|
|
131
|
+
// Ephemeral wallets are returned to the caller (with full key material) but
|
|
132
|
+
// NEVER written to disk — the quest one-shot hands the key to the user and
|
|
133
|
+
// keeps no copy.
|
|
134
|
+
if (!opts.ephemeral)
|
|
135
|
+
saveWallet(wallet);
|
|
127
136
|
return wallet;
|
|
128
137
|
}
|
|
129
138
|
/** The bare 32-byte Ed25519 public-key point from an SPKI/DER base64 (the point
|
package/dist/onboard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboard.js","sourceRoot":"","sources":["../src/onboard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAyB,MAAM,WAAW,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAoB,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,gCAAgC,EAChC,+BAA+B,GAChC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,0BAA0B,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"onboard.js","sourceRoot":"","sources":["../src/onboard.ts"],"names":[],"mappings":"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"}
|
package/dist/pay.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type EnsureWalletOpts } from "./onboard.js";
|
|
2
|
+
import { type AgentWallet } from "./store.js";
|
|
2
3
|
import type { HashBindingOptions } from "./verify-prepared.js";
|
|
3
4
|
export interface PayOpts extends EnsureWalletOpts {
|
|
4
5
|
/** @deprecated ignored; the relay sets the participant user. */
|
|
@@ -11,6 +12,32 @@ export interface PayOpts extends EnsureWalletOpts {
|
|
|
11
12
|
* See HashBindingOptions / verify-prepared.ts.
|
|
12
13
|
*/
|
|
13
14
|
hashBinding?: HashBindingOptions;
|
|
15
|
+
/** Max on-ledger re-pay attempts on a PERSISTING 402 (passed to
|
|
16
|
+
* wrapFetchWithCantonPayment; default 4). A custodial/proxy payer should set
|
|
17
|
+
* 1 so one logical pay mints at most one extra Create, bounding gas burn if a
|
|
18
|
+
* merchant keeps returning 402. */
|
|
19
|
+
maxPaymentRetries?: number;
|
|
20
|
+
/** Optional spend ceiling threaded into the relay signer: the MAX amount the
|
|
21
|
+
* signer will EVER sign for (same unit the 402 quotes). When set, the autopay
|
|
22
|
+
* REFUSES — fail closed, before any relay call — to sign a merchant-quoted
|
|
23
|
+
* amount above it, so an over-quoting (or MITM'd) merchant can never get the
|
|
24
|
+
* agent to sign a charge larger than the caller authorized. Omitted → no
|
|
25
|
+
* ceiling (the published MCP/pay path is unaffected when unset). */
|
|
26
|
+
maxPaymentValue?: string;
|
|
27
|
+
/** Optional expected-payee pin threaded into the relay signer: the ONLY
|
|
28
|
+
* recipient the signer will sign a transfer to. When set, the autopay REFUSES
|
|
29
|
+
* to sign if the 402's payTo is anything else (MITM'd-merchant defense).
|
|
30
|
+
* Omitted → no pin (legacy behavior). */
|
|
31
|
+
expectedPayTo?: string;
|
|
14
32
|
}
|
|
15
33
|
export declare function makePayingFetch(opts: PayOpts): Promise<typeof globalThis.fetch>;
|
|
34
|
+
/**
|
|
35
|
+
* Like makePayingFetch but for a wallet OBJECT you already hold — used by the
|
|
36
|
+
* hosted quest one-shot, which mints a FRESH ephemeral wallet per request
|
|
37
|
+
* (`ensureWallet({ ephemeral: true })`) and pays from it without ever persisting
|
|
38
|
+
* it to disk. `lockHome` is the directory for the per-wallet pay mutex; OMIT it
|
|
39
|
+
* for an ephemeral wallet — a throwaway wallet does exactly one pay, so there is
|
|
40
|
+
* no same-wallet concurrency to serialize and no home directory to lock in.
|
|
41
|
+
*/
|
|
42
|
+
export declare function makePayingFetchForWallet(wallet: AgentWallet, opts: Pick<PayOpts, "apiKey" | "hashBinding" | "maxPaymentRetries" | "maxPaymentValue" | "expectedPayTo">, lockHome?: string): Promise<typeof globalThis.fetch>;
|
|
16
43
|
//# sourceMappingURL=pay.d.ts.map
|
package/dist/pay.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pay.d.ts","sourceRoot":"","sources":["../src/pay.ts"],"names":[],"mappings":"AAQA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"pay.d.ts","sourceRoot":"","sources":["../src/pay.ts"],"names":[],"mappings":"AAQA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGnE,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,WAAW,OAAQ,SAAQ,gBAAgB;IAC/C,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC;;;wCAGoC;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;yEAKqE;IACrE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;8CAG0C;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,OAAO,UAAU,CAAC,KAAK,CAAC,CAMlC;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,IAAI,CACR,OAAO,EACP,QAAQ,GAAG,aAAa,GAAG,mBAAmB,GAAG,iBAAiB,GAAG,eAAe,CACrF,EACD,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,UAAU,CAAC,KAAK,CAAC,CA+BlC"}
|
package/dist/pay.js
CHANGED
|
@@ -12,25 +12,46 @@ import { withPayLock } from "./pay-lock.js";
|
|
|
12
12
|
import { walletDir } from "./store.js";
|
|
13
13
|
export async function makePayingFetch(opts) {
|
|
14
14
|
const wallet = await ensureWallet(opts);
|
|
15
|
+
// The file-backed wallet serializes concurrent pays via a directory mutex in
|
|
16
|
+
// its home (cross-process safe), so pass the home as the lock dir — behavior
|
|
17
|
+
// is identical to before this was extracted.
|
|
18
|
+
return makePayingFetchForWallet(wallet, opts, walletDir());
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Like makePayingFetch but for a wallet OBJECT you already hold — used by the
|
|
22
|
+
* hosted quest one-shot, which mints a FRESH ephemeral wallet per request
|
|
23
|
+
* (`ensureWallet({ ephemeral: true })`) and pays from it without ever persisting
|
|
24
|
+
* it to disk. `lockHome` is the directory for the per-wallet pay mutex; OMIT it
|
|
25
|
+
* for an ephemeral wallet — a throwaway wallet does exactly one pay, so there is
|
|
26
|
+
* no same-wallet concurrency to serialize and no home directory to lock in.
|
|
27
|
+
*/
|
|
28
|
+
export async function makePayingFetchForWallet(wallet, opts, lockHome) {
|
|
15
29
|
const signer = makeRelaySigner(wallet, {
|
|
16
30
|
apiKey: opts.apiKey,
|
|
17
31
|
...(opts.hashBinding ? { hashBinding: opts.hashBinding } : {}),
|
|
32
|
+
...(opts.maxPaymentValue !== undefined
|
|
33
|
+
? { maxPaymentValue: opts.maxPaymentValue }
|
|
34
|
+
: {}),
|
|
35
|
+
...(opts.expectedPayTo !== undefined
|
|
36
|
+
? { expectedPayTo: opts.expectedPayTo }
|
|
37
|
+
: {}),
|
|
18
38
|
});
|
|
19
|
-
const paying = wrapFetchWithCantonPayment(globalThis.fetch, signer
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
|
|
29
|
-
return async function lockedPayingFetch(input, init) {
|
|
39
|
+
const paying = wrapFetchWithCantonPayment(globalThis.fetch, signer, opts.maxPaymentRetries !== undefined
|
|
40
|
+
? { maxPaymentRetries: opts.maxPaymentRetries }
|
|
41
|
+
: {});
|
|
42
|
+
// Probe first WITHOUT the lock — only a request that actually challenges 402
|
|
43
|
+
// enters the per-wallet queue, so non-paid traffic is never delayed. When
|
|
44
|
+
// `lockHome` is set (the file-backed path) serialize the dance per wallet home
|
|
45
|
+
// (v1 nonces are sequential per sender, so concurrent dances from one wallet
|
|
46
|
+
// would otherwise race and burn re-pay Creates). An ephemeral wallet has no
|
|
47
|
+
// same-wallet concurrency and no home dir, so it skips the lock.
|
|
48
|
+
return async function payingFetch(input, init) {
|
|
30
49
|
const probe = await globalThis.fetch(input, init);
|
|
31
50
|
if (probe.status !== 402)
|
|
32
51
|
return probe;
|
|
33
|
-
|
|
52
|
+
if (lockHome === undefined)
|
|
53
|
+
return paying(input, init);
|
|
54
|
+
return withPayLock(lockHome, () => paying(input, init));
|
|
34
55
|
};
|
|
35
56
|
}
|
|
36
57
|
//# sourceMappingURL=pay.js.map
|
package/dist/pay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pay.js","sourceRoot":"","sources":["../src/pay.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAyB,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"pay.js","sourceRoot":"","sources":["../src/pay.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAyB,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAoB,MAAM,YAAY,CAAC;AAiCzD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAa;IAEb,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACxC,6EAA6E;IAC7E,6EAA6E;IAC7E,6CAA6C;IAC7C,OAAO,wBAAwB,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAmB,EACnB,IAGC,EACD,QAAiB;IAEjB,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE;QACrC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,IAAI,CAAC,eAAe,KAAK,SAAS;YACpC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE;YAC3C,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS;YAClC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE;YACvC,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,0BAA0B,CACvC,UAAU,CAAC,KAAK,EAChB,MAAM,EACN,IAAI,CAAC,iBAAiB,KAAK,SAAS;QAClC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE;QAC/C,CAAC,CAAC,EAAE,CACP,CAAC;IAEF,6EAA6E;IAC7E,0EAA0E;IAC1E,+EAA+E;IAC/E,6EAA6E;IAC7E,4EAA4E;IAC5E,iEAAiE;IACjE,OAAO,KAAK,UAAU,WAAW,CAAC,KAAK,EAAE,IAAI;QAC3C,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;QACvC,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACvD,OAAO,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/relay-client.d.ts
CHANGED
|
@@ -45,6 +45,14 @@ export interface ResolveAcceptResult {
|
|
|
45
45
|
choiceContextData: unknown;
|
|
46
46
|
disclosedContracts: unknown[];
|
|
47
47
|
}
|
|
48
|
+
/** allocation-api reclaim (Track B): the (possibly empty) Allocation_Withdraw
|
|
49
|
+
* choice-context + the disclosed AmuletAllocation contract the agent needs to
|
|
50
|
+
* exercise the withdraw. Same envelope as ResolveAcceptResult; an empty context
|
|
51
|
+
* (`{}` / `[]`) is valid when the registry exposes no withdraw choice-context. */
|
|
52
|
+
export interface ResolveWithdrawResult {
|
|
53
|
+
choiceContextData: unknown;
|
|
54
|
+
disclosedContracts: unknown[];
|
|
55
|
+
}
|
|
48
56
|
export interface PendingResult {
|
|
49
57
|
party: string;
|
|
50
58
|
pending: Array<{
|
|
@@ -80,6 +88,54 @@ export interface TransferCommandCidResult {
|
|
|
80
88
|
nonce: string;
|
|
81
89
|
transferCommandCid: string;
|
|
82
90
|
}
|
|
91
|
+
/** allocation-api: everything the agent needs to BUILD an
|
|
92
|
+
* `AllocationFactory_Allocate` exercise. None of these is a verify trust
|
|
93
|
+
* anchor — the agent pins sender/receiver/amount/executor to its OWN intent in
|
|
94
|
+
* verify-before-sign; these refs widen nothing it will sign. */
|
|
95
|
+
export interface ResolveAllocationFactoryResult {
|
|
96
|
+
/** The resolved AllocationFactory cid to exercise against. */
|
|
97
|
+
factoryId: string;
|
|
98
|
+
/** Hash-prefixed templateId for the AllocationFactory_Allocate exercise. */
|
|
99
|
+
allocationFactoryTemplateId: string;
|
|
100
|
+
/** `{admin, id}` of the instrument (Amulet = {DSO, "Amulet"}). */
|
|
101
|
+
instrumentId: {
|
|
102
|
+
admin: string;
|
|
103
|
+
id: string;
|
|
104
|
+
};
|
|
105
|
+
/** The settlementRef the SettlementInfo carries (registry-/relay-supplied;
|
|
106
|
+
* the facilitator binds it informationally). */
|
|
107
|
+
settlementRef: unknown;
|
|
108
|
+
/** The transferLegId the AllocationSpecification carries. */
|
|
109
|
+
transferLegId: string;
|
|
110
|
+
/** Registry choice-context for the AllocationFactory_Allocate extraArgs. */
|
|
111
|
+
choiceContextData: unknown;
|
|
112
|
+
disclosedContracts: unknown[];
|
|
113
|
+
}
|
|
114
|
+
/** The created Allocation / AllocationInstruction cid read off the
|
|
115
|
+
* AllocationFactory_Allocate transaction by the relay. Exactly one is set for
|
|
116
|
+
* a successful allocate (Completed vs Pending); both null if neither resolved. */
|
|
117
|
+
export interface AllocationResultResult {
|
|
118
|
+
party: string;
|
|
119
|
+
updateId: string;
|
|
120
|
+
allocationCid?: string | null;
|
|
121
|
+
allocationInstructionCid?: string | null;
|
|
122
|
+
}
|
|
123
|
+
/** The created `X402Escrow` cid read off the `X402EscrowOffer_Accept` transaction
|
|
124
|
+
* by the relay (x402-escrow "Design A"). `escrowCid` is null if the relay could
|
|
125
|
+
* not resolve the created `X402Escrow` within its poll budget. */
|
|
126
|
+
export interface EscrowResultResult {
|
|
127
|
+
party: string;
|
|
128
|
+
updateId: string;
|
|
129
|
+
escrowCid?: string | null;
|
|
130
|
+
}
|
|
131
|
+
/** x402-direct "Design B": the result of resolving/minting the standing both-party
|
|
132
|
+
* DirectSettlementConsent for a {sender, merchant} pair (facilitator-side
|
|
133
|
+
* MerchantConsent_Accept). `minted` is false when an existing consent was reused. */
|
|
134
|
+
export interface MintDirectConsentResult {
|
|
135
|
+
directConsentCid: string;
|
|
136
|
+
minted: boolean;
|
|
137
|
+
updateId?: string;
|
|
138
|
+
}
|
|
83
139
|
export declare class RelayClient {
|
|
84
140
|
private readonly opts;
|
|
85
141
|
constructor(opts: {
|
|
@@ -135,10 +191,50 @@ export declare class RelayClient {
|
|
|
135
191
|
resolveAccept(b: {
|
|
136
192
|
instructionCid: string;
|
|
137
193
|
}): Promise<ResolveAcceptResult>;
|
|
194
|
+
/** allocation-api reclaim: resolve the Allocation_Withdraw choice-context +
|
|
195
|
+
* disclosed AmuletAllocation for `allocationCid` (the agent has no Scan
|
|
196
|
+
* access). Mirrors resolveAccept. */
|
|
197
|
+
resolveWithdraw(b: {
|
|
198
|
+
allocationCid: string;
|
|
199
|
+
}): Promise<ResolveWithdrawResult>;
|
|
138
200
|
/** v1: resolve the refs needed to build a CreateTransferCommand exercise. */
|
|
139
201
|
resolveTransferCommand(b: {
|
|
140
202
|
payerParty: string;
|
|
141
203
|
}): Promise<ResolveTransferCommandResult>;
|
|
204
|
+
/** allocation-api: resolve the AllocationFactory + its disclosed contracts +
|
|
205
|
+
* choice-context (the agent has no Scan access). Mirrors
|
|
206
|
+
* resolveTransferFactory. */
|
|
207
|
+
resolveAllocationFactory(b: {
|
|
208
|
+
sender: string;
|
|
209
|
+
receiver: string;
|
|
210
|
+
amount: string;
|
|
211
|
+
executor: string;
|
|
212
|
+
allocateBeforeSeconds: number;
|
|
213
|
+
settleBeforeSeconds: number;
|
|
214
|
+
meta?: Record<string, string>;
|
|
215
|
+
}): Promise<ResolveAllocationFactoryResult>;
|
|
216
|
+
/** allocation-api: read the created Allocation / AllocationInstruction cid off
|
|
217
|
+
* the AllocationFactory_Allocate transaction (the agent is relay-only). */
|
|
218
|
+
allocationResult(party: string, updateId: string): Promise<AllocationResultResult>;
|
|
219
|
+
/** x402-escrow "Design A": read the created `X402Escrow` cid off the
|
|
220
|
+
* `X402EscrowOffer_Accept` transaction (the agent is relay-only). Mirrors
|
|
221
|
+
* `allocationResult`: the relay reads the tx by updateId and matches the created
|
|
222
|
+
* `X402Escrow` template. Requires a matching facilitator-side `escrow-result`
|
|
223
|
+
* endpoint (a `getTransactionById` + templateId-endsWith match, exactly like
|
|
224
|
+
* `allocation-result`). */
|
|
225
|
+
escrowResult(party: string, updateId: string): Promise<EscrowResultResult>;
|
|
226
|
+
/** x402-direct "Design B": resolve OR mint the standing both-party
|
|
227
|
+
* DirectSettlementConsent for the {sender, merchant} pair (the facilitator
|
|
228
|
+
* exercises MerchantConsent_Accept ALONE off the two standing consents). The
|
|
229
|
+
* client may pass the returned cid as the O(1) /settle fast-path
|
|
230
|
+
* (payload.directConsentCid). Idempotent: returns an existing consent
|
|
231
|
+
* (minted:false) when one is already standing; throws (relay error) when either
|
|
232
|
+
* party has not onboarded its once-total SenderConsent / MerchantConsent yet. */
|
|
233
|
+
mintDirectConsent(b: {
|
|
234
|
+
sender: string;
|
|
235
|
+
merchant: string;
|
|
236
|
+
maxAmount?: string | null;
|
|
237
|
+
}): Promise<MintDirectConsentResult>;
|
|
142
238
|
/** v1: resolve the cid of the just-created TransferCommand via the relay.
|
|
143
239
|
* Pass the create's `updateId` (from execute) so the relay reads the cid
|
|
144
240
|
* straight off that transaction — O(1) and immune to the ACS list cap the
|
|
@@ -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
|
@@ -68,10 +68,46 @@ export class RelayClient {
|
|
|
68
68
|
resolveAccept(b) {
|
|
69
69
|
return this.req("POST", "/v1/wallet/resolve/accept", b);
|
|
70
70
|
}
|
|
71
|
+
/** allocation-api reclaim: resolve the Allocation_Withdraw choice-context +
|
|
72
|
+
* disclosed AmuletAllocation for `allocationCid` (the agent has no Scan
|
|
73
|
+
* access). Mirrors resolveAccept. */
|
|
74
|
+
resolveWithdraw(b) {
|
|
75
|
+
return this.req("POST", "/v1/wallet/resolve/withdraw", b);
|
|
76
|
+
}
|
|
71
77
|
/** v1: resolve the refs needed to build a CreateTransferCommand exercise. */
|
|
72
78
|
resolveTransferCommand(b) {
|
|
73
79
|
return this.req("POST", "/v1/wallet/resolve/transfer-command", b);
|
|
74
80
|
}
|
|
81
|
+
/** allocation-api: resolve the AllocationFactory + its disclosed contracts +
|
|
82
|
+
* choice-context (the agent has no Scan access). Mirrors
|
|
83
|
+
* resolveTransferFactory. */
|
|
84
|
+
resolveAllocationFactory(b) {
|
|
85
|
+
return this.req("POST", "/v1/wallet/resolve/allocation-factory", b);
|
|
86
|
+
}
|
|
87
|
+
/** allocation-api: read the created Allocation / AllocationInstruction cid off
|
|
88
|
+
* the AllocationFactory_Allocate transaction (the agent is relay-only). */
|
|
89
|
+
allocationResult(party, updateId) {
|
|
90
|
+
return this.req("GET", `/v1/wallet/${encodeURIComponent(party)}/allocation-result?updateId=${encodeURIComponent(updateId)}`);
|
|
91
|
+
}
|
|
92
|
+
/** x402-escrow "Design A": read the created `X402Escrow` cid off the
|
|
93
|
+
* `X402EscrowOffer_Accept` transaction (the agent is relay-only). Mirrors
|
|
94
|
+
* `allocationResult`: the relay reads the tx by updateId and matches the created
|
|
95
|
+
* `X402Escrow` template. Requires a matching facilitator-side `escrow-result`
|
|
96
|
+
* endpoint (a `getTransactionById` + templateId-endsWith match, exactly like
|
|
97
|
+
* `allocation-result`). */
|
|
98
|
+
escrowResult(party, updateId) {
|
|
99
|
+
return this.req("GET", `/v1/wallet/${encodeURIComponent(party)}/escrow-result?updateId=${encodeURIComponent(updateId)}`);
|
|
100
|
+
}
|
|
101
|
+
/** x402-direct "Design B": resolve OR mint the standing both-party
|
|
102
|
+
* DirectSettlementConsent for the {sender, merchant} pair (the facilitator
|
|
103
|
+
* exercises MerchantConsent_Accept ALONE off the two standing consents). The
|
|
104
|
+
* client may pass the returned cid as the O(1) /settle fast-path
|
|
105
|
+
* (payload.directConsentCid). Idempotent: returns an existing consent
|
|
106
|
+
* (minted:false) when one is already standing; throws (relay error) when either
|
|
107
|
+
* party has not onboarded its once-total SenderConsent / MerchantConsent yet. */
|
|
108
|
+
mintDirectConsent(b) {
|
|
109
|
+
return this.req("POST", "/v1/wallet/direct/mint", b);
|
|
110
|
+
}
|
|
75
111
|
/** v1: resolve the cid of the just-created TransferCommand via the relay.
|
|
76
112
|
* Pass the create's `updateId` (from execute) so the relay reads the cid
|
|
77
113
|
* straight off that transaction — O(1) and immune to the ACS list cap the
|
package/dist/relay-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-client.js","sourceRoot":"","sources":["../src/relay-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"relay-client.js","sourceRoot":"","sources":["../src/relay-client.ts"],"names":[],"mappings":"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"}
|
package/dist/relay-signer.d.ts
CHANGED
|
@@ -29,5 +29,20 @@ export declare function makeRelaySigner(wallet: AgentWallet, opts?: {
|
|
|
29
29
|
* Without it, a relay-prepared tx that carries the DSO outside the root
|
|
30
30
|
* choice arg fails closed (the round-3 no-pin-fallback removal). */
|
|
31
31
|
trustedDso?: string;
|
|
32
|
+
/** Optional spend ceiling: the MAX amount this signer will EVER sign for, in
|
|
33
|
+
* the same unit the 402 quotes (compared against `input.amount`). When set,
|
|
34
|
+
* the signer REFUSES to sign — fail closed, before any relay call — if the
|
|
35
|
+
* to-be-signed amount exceeds it. This makes the spend breaker load-bearing
|
|
36
|
+
* against an over-quoting (or MITM'd) merchant: the agent never signs a
|
|
37
|
+
* charge larger than the caller authorized, no matter what the 402 returns.
|
|
38
|
+
* Omitted → no ceiling (legacy behavior; the published MCP/pay path is
|
|
39
|
+
* unaffected when unset). */
|
|
40
|
+
maxPaymentValue?: string;
|
|
41
|
+
/** Optional expected-payee pin: the ONLY recipient this signer will sign a
|
|
42
|
+
* transfer to (compared against `input.receiver`). When set, the signer
|
|
43
|
+
* REFUSES to sign — fail closed, before any relay call — if the 402's payTo
|
|
44
|
+
* is anything else, defending against a MITM'd merchant that swaps `payTo`
|
|
45
|
+
* to drain funds to an attacker. Omitted → no pin (legacy behavior). */
|
|
46
|
+
expectedPayTo?: string;
|
|
32
47
|
}): CantonSigner;
|
|
33
48
|
//# sourceMappingURL=relay-signer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-signer.d.ts","sourceRoot":"","sources":["../src/relay-signer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAKhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,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;
|
|
1
|
+
{"version":3,"file":"relay-signer.d.ts","sourceRoot":"","sources":["../src/relay-signer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAKhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,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;;;;;;;kCAO8B;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;6EAIyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;CACnB,GACL,YAAY,CAmMd"}
|
package/dist/relay-signer.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { RelayClient } from "./relay-client.js";
|
|
2
|
-
import { transfer, createTransferCommand } from "./tx.js";
|
|
2
|
+
import { transfer, createTransferCommand, allocate, createSenderConsent } from "./tx.js";
|
|
3
3
|
import { resolveHashBinding } from "./hash-binding.js";
|
|
4
4
|
import { resolveTrustedDsoParty } from "./trusted-dso.js";
|
|
5
5
|
export function makeRelaySigner(wallet, opts = {}) {
|
|
@@ -17,9 +17,41 @@ export function makeRelaySigner(wallet, opts = {}) {
|
|
|
17
17
|
// auto-DSO then works for any mainnet payment no matter how the wallet was
|
|
18
18
|
// created. Without a resolvable DSO, value-moving prepared bytes carrying it
|
|
19
19
|
// outside the root choice arg are refused (fail-closed).
|
|
20
|
+
// Spend breaker — applied at the TOP of BOTH signer arms, fail-CLOSED, BEFORE
|
|
21
|
+
// any relay call. Refuses to sign a merchant-quoted amount above the caller's
|
|
22
|
+
// ceiling or to a payee the caller did not authorize. Both pins are OPTIONAL;
|
|
23
|
+
// unset means the corresponding check is skipped (legacy behavior preserved).
|
|
24
|
+
// The amount is compared as a Number in the SAME unit as `input.amount`,
|
|
25
|
+
// matching the existing balance fast-fail (`Number(bal.cc) < Number(amount)`).
|
|
26
|
+
const enforceSpendLimits = (to, amount) => {
|
|
27
|
+
if (opts.expectedPayTo !== undefined && to !== opts.expectedPayTo) {
|
|
28
|
+
throw new Error(`refusing to sign: payee ${to} does not match the expected payTo ` +
|
|
29
|
+
`${opts.expectedPayTo} (a merchant cannot redirect this payment)`);
|
|
30
|
+
}
|
|
31
|
+
if (opts.maxPaymentValue !== undefined) {
|
|
32
|
+
const want = Number(amount);
|
|
33
|
+
const cap = Number(opts.maxPaymentValue);
|
|
34
|
+
// A configured-but-broken ceiling must FAIL CLOSED, never silently disable
|
|
35
|
+
// the cap: `want > NaN` is always false, so a non-finite cap would wave
|
|
36
|
+
// every amount through. Refuse to sign instead.
|
|
37
|
+
if (!Number.isFinite(cap)) {
|
|
38
|
+
throw new Error(`refusing to sign: configured max payment value ` +
|
|
39
|
+
`${JSON.stringify(opts.maxPaymentValue)} is not a finite number`);
|
|
40
|
+
}
|
|
41
|
+
if (!Number.isFinite(want)) {
|
|
42
|
+
throw new Error(`refusing to sign: payment amount ${JSON.stringify(amount)} is not a ` +
|
|
43
|
+
`finite number`);
|
|
44
|
+
}
|
|
45
|
+
if (want > cap) {
|
|
46
|
+
throw new Error(`refusing to sign: payment amount ${amount} exceeds the max ` +
|
|
47
|
+
`payment value ${opts.maxPaymentValue} (the merchant over-quoted)`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
};
|
|
20
51
|
return {
|
|
21
52
|
party: wallet.party,
|
|
22
53
|
async signCip56Transfer(input) {
|
|
54
|
+
enforceSpendLimits(input.receiver, input.amount);
|
|
23
55
|
const trustedDso = opts.trustedDso ?? resolveTrustedDsoParty(process.env, wallet.network);
|
|
24
56
|
const updateId = await transfer(relay, wallet, {
|
|
25
57
|
receiver: input.receiver,
|
|
@@ -30,7 +62,101 @@ export function makeRelaySigner(wallet, opts = {}) {
|
|
|
30
62
|
});
|
|
31
63
|
return { payerParty: wallet.party, updateId, transferInstructionCid: null };
|
|
32
64
|
},
|
|
65
|
+
async signAllocation(input) {
|
|
66
|
+
// Spend breaker FIRST (fail-closed, before any relay call), exactly like
|
|
67
|
+
// the other arms.
|
|
68
|
+
enforceSpendLimits(input.receiver, input.amount);
|
|
69
|
+
const trustedDso = opts.trustedDso ?? resolveTrustedDsoParty(process.env, wallet.network);
|
|
70
|
+
const r = await allocate(relay, wallet, {
|
|
71
|
+
receiver: input.receiver,
|
|
72
|
+
amount: input.amount,
|
|
73
|
+
executor: input.executor,
|
|
74
|
+
synchronizerId: input.synchronizerId,
|
|
75
|
+
allocateBeforeSeconds: input.allocateBeforeSeconds,
|
|
76
|
+
settleBeforeSeconds: input.settleBeforeSeconds,
|
|
77
|
+
...(input.transferMeta ? { transferMeta: input.transferMeta } : {}),
|
|
78
|
+
hashBinding,
|
|
79
|
+
...(trustedDso !== undefined ? { expectInstrumentAdmin: trustedDso } : {}),
|
|
80
|
+
});
|
|
81
|
+
return {
|
|
82
|
+
payerParty: r.payerParty,
|
|
83
|
+
allocationCid: r.allocationCid,
|
|
84
|
+
allocationInstructionCid: r.allocationInstructionCid,
|
|
85
|
+
updateId: r.updateId,
|
|
86
|
+
};
|
|
87
|
+
},
|
|
88
|
+
async signAllocationDirect(input) {
|
|
89
|
+
// Spend breaker FIRST (fail-closed, before any relay call), exactly like
|
|
90
|
+
// the other arms.
|
|
91
|
+
enforceSpendLimits(input.receiver, input.amount);
|
|
92
|
+
// Ensure the standing both-party DirectSettlementConsent {sender, merchant}
|
|
93
|
+
// exists (facilitator-alone mint off the two once-total consents). On the
|
|
94
|
+
// first DIRECT payment the agent's own SenderConsent may not be onboarded
|
|
95
|
+
// yet — `mintDirectConsent` then throws; create it ONCE and retry. If the
|
|
96
|
+
// retry still throws, the MERCHANT has not onboarded its MerchantConsent (the
|
|
97
|
+
// agent cannot create that on the merchant's behalf), so surface a clear,
|
|
98
|
+
// actionable error preserving the original relay error as `cause`.
|
|
99
|
+
let directConsentCid;
|
|
100
|
+
try {
|
|
101
|
+
const mint = await relay.mintDirectConsent({
|
|
102
|
+
sender: wallet.party,
|
|
103
|
+
merchant: input.receiver,
|
|
104
|
+
});
|
|
105
|
+
directConsentCid = mint.directConsentCid;
|
|
106
|
+
}
|
|
107
|
+
catch (firstErr) {
|
|
108
|
+
// The agent's own SenderConsent is the only standing consent it can mint.
|
|
109
|
+
// Create it once (verify-before-sign, the agent's own key) then retry.
|
|
110
|
+
await createSenderConsent(relay, wallet, {
|
|
111
|
+
facilitator: input.executor,
|
|
112
|
+
synchronizerId: input.synchronizerId,
|
|
113
|
+
hashBinding,
|
|
114
|
+
});
|
|
115
|
+
try {
|
|
116
|
+
const mint = await relay.mintDirectConsent({
|
|
117
|
+
sender: wallet.party,
|
|
118
|
+
merchant: input.receiver,
|
|
119
|
+
});
|
|
120
|
+
directConsentCid = mint.directConsentCid;
|
|
121
|
+
}
|
|
122
|
+
catch (retryErr) {
|
|
123
|
+
// Still failing after the sender side is onboarded → the merchant has
|
|
124
|
+
// not onboarded its MerchantConsent. The agent cannot pay direct to a
|
|
125
|
+
// merchant that has not opted into the direct path.
|
|
126
|
+
throw new Error(`cannot pay merchant ${input.receiver} via allocation-direct: it has ` +
|
|
127
|
+
`not onboarded a MerchantConsent with this facilitator yet (the agent ` +
|
|
128
|
+
`created its own SenderConsent but the both-party consent still cannot ` +
|
|
129
|
+
`be minted). The merchant must run merchant-onboard once before it can ` +
|
|
130
|
+
`receive direct payments.`, { cause: retryErr instanceof Error ? retryErr : firstErr });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const trustedDso = opts.trustedDso ?? resolveTrustedDsoParty(process.env, wallet.network);
|
|
134
|
+
// The on-ledger lock is IDENTICAL to the allocation-api arm (same
|
|
135
|
+
// AllocationFactory_Allocate, receiver = merchant, executor = facilitator);
|
|
136
|
+
// verify-before-sign in `allocate` re-checks every money-critical field.
|
|
137
|
+
const r = await allocate(relay, wallet, {
|
|
138
|
+
receiver: input.receiver,
|
|
139
|
+
amount: input.amount,
|
|
140
|
+
executor: input.executor,
|
|
141
|
+
synchronizerId: input.synchronizerId,
|
|
142
|
+
allocateBeforeSeconds: input.allocateBeforeSeconds,
|
|
143
|
+
settleBeforeSeconds: input.settleBeforeSeconds,
|
|
144
|
+
...(input.transferMeta ? { transferMeta: input.transferMeta } : {}),
|
|
145
|
+
hashBinding,
|
|
146
|
+
...(trustedDso !== undefined ? { expectInstrumentAdmin: trustedDso } : {}),
|
|
147
|
+
});
|
|
148
|
+
return {
|
|
149
|
+
payerParty: r.payerParty,
|
|
150
|
+
allocationCid: r.allocationCid,
|
|
151
|
+
allocationInstructionCid: r.allocationInstructionCid,
|
|
152
|
+
updateId: r.updateId,
|
|
153
|
+
directConsentCid,
|
|
154
|
+
};
|
|
155
|
+
},
|
|
33
156
|
async signTransferCommand(input) {
|
|
157
|
+
// Spend breaker FIRST — before even the balance pre-check, so a refused
|
|
158
|
+
// amount/payee never touches the relay (no network, no info leak).
|
|
159
|
+
enforceSpendLimits(input.receiver, input.amount);
|
|
34
160
|
// Fast-fail an underfunded wallet: without this, an unfunded agent's pay
|
|
35
161
|
// loops the client re-pay retries (each settle just rejects "no inputs")
|
|
36
162
|
// for ~30s and then returns an opaque "rejected" — surface a clear
|
package/dist/relay-signer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-signer.js","sourceRoot":"","sources":["../src/relay-signer.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"relay-signer.js","sourceRoot":"","sources":["../src/relay-signer.ts"],"names":[],"mappings":"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"}
|