@ftptech/canton-agent-wallet 0.3.2 → 0.4.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 CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  A self-custody Canton wallet + x402 autopay for AI agents. The agent holds its
4
4
  own Ed25519 key and pays for x402-gated resources on the Canton Network on its
5
- own — the hard parts of Canton (a party must be hosted on a validator, and its
5
+ own. The hard parts of Canton (a party must be hosted on a validator, and its
6
6
  API is authed) are hidden behind a facilitator **relay** the agent talks to over
7
7
  plain HTTP. The relay can *prepare* and *submit* on the agent's behalf but never
8
8
  *signs*, so it has no custody.
@@ -26,6 +26,7 @@ canton-agent-wallet create --relay-url <url> # generate + onboard a self-
26
26
  canton-agent-wallet address # print the party id (fund this)
27
27
  canton-agent-wallet balance # print CC balance
28
28
  canton-agent-wallet claim # accept incoming transfers (e.g. the initial funding)
29
+ canton-agent-wallet merge [--target <n>] [--batch <n>] [--max-rounds <n>] [--dry-run] # consolidate dust amulets so a busy wallet can be enumerated + spent again
29
30
  canton-agent-wallet merchant-onboard --facilitator <party> --synchronizer <id> # EXTERNAL-PARTY merchant: sign this wallet's once-total MerchantConsent (allocation-direct)
30
31
  canton-agent-wallet merchant-onboard-hosted --party <merchantParty> --facilitator <party> --participant-url <url> --synchronizer <id> --user-id <id> # HOSTED-PARTY merchant: create its once-total MerchantConsent via its own node's Ledger API
31
32
  canton-agent-wallet pay --relay-url <url> <url> # fetch a URL, auto-paying any x402 402 challenge
@@ -34,7 +35,7 @@ canton-agent-wallet reclaim --allocation-cid <cid> [--receiver <merchantParty>]
34
35
  canton-agent-wallet export # print the private key (backup; guard it)
35
36
  ```
36
37
 
37
- `create` and `pay` **require** a relay (facilitator) URL — pass `--relay-url
38
+ `create` and `pay` **require** a relay (facilitator) URL: pass `--relay-url
38
39
  <url>` or set `CANTON_AGENT_RELAY_URL`. There is no default: a stale built-in
39
40
  default would silently send payments to a dead host, so the CLI fails fast when
40
41
  none is given. `address`, `balance`, `claim`, `withdraw` and `export` reuse the
@@ -47,25 +48,48 @@ To be paid via the allocation-direct (Design B) path, a merchant signs a
47
48
  once-total `MerchantConsent` naming the facilitator. There are two onboarding
48
49
  commands depending on where the merchant party lives:
49
50
 
50
- - **`merchant-onboard`** — the merchant is an **external party** held in *this*
51
+ - **`merchant-onboard`**: the merchant is an **external party** held in *this*
51
52
  agent-wallet (an Ed25519 self-custody key). It onboards through the relay's
52
53
  interactive prepare → sign-the-hash-locally → execute flow, gated by
53
54
  verify-before-sign. Needs a wallet (and a relay).
54
- - **`merchant-onboard-hosted`** — the merchant is a **hosted party** that lives
55
+ - **`merchant-onboard-hosted`**: the merchant is a **hosted party** that lives
55
56
  on its **own Canton node** (a validator it operates), with no Ed25519 key. It
56
57
  authorizes the consent directly on its own participant's JSON Ledger API
57
58
  (`actAs: [merchant]`); there is **no wallet, no relay, and no Ed25519 key**, so
58
59
  this command loads none. The create shape is fixed
59
- (`MerchantConsent {merchant, facilitator}`) and moves no funds — there is no
60
+ (`MerchantConsent {merchant, facilitator}`) and moves no funds; there is no
60
61
  untrusted relay in the loop, so no verify-before-sign is required. Node
61
62
  connection comes from `--participant-url` / `--synchronizer` / `--user-id`
62
63
  (falling back to `CANTON_PARTICIPANT_URL` / `CANTON_SYNCHRONIZER_ID` /
63
64
  `CANTON_USER_ID`); flags override env. **OIDC credentials are read from env
64
65
  ONLY** (never accepted as flags): `OIDC_TOKEN_ENDPOINT`, `OIDC_CLIENT_ID`,
65
66
  `OIDC_CLIENT_SECRET`, `LEDGER_API_AUDIENCE`, and optional `OIDC_SCOPE`. The
66
- command is idempotent — if the consent already exists it prints "already
67
+ command is idempotent: if the consent already exists it prints "already
67
68
  onboarded" and submits nothing.
68
69
 
70
+ ### Consolidating dust (`merge`)
71
+
72
+ Every incoming CC transfer the wallet accepts creates a **fresh Amulet contract**,
73
+ so a busy wallet steadily accumulates thousands of tiny "dust" amulets. Past the
74
+ participant's JSON-API result cap the wallet can no longer be enumerated on-ledger
75
+ at all — `balance` then reports it holds too many contracts, and `pay` (which
76
+ selects inputs from that same enumeration) stops working. `merge` fixes both by
77
+ self-transferring the amulets back to the wallet's own party in batches; each
78
+ batch collapses ~`--batch` amulets into ~2, restoring a spendable wallet:
79
+
80
+ ```bash
81
+ canton-agent-wallet merge --dry-run # show the plan (counts + batches), change nothing
82
+ canton-agent-wallet merge # consolidate (defaults: --batch 90, --target 2, --max-rounds 30)
83
+ ```
84
+
85
+ For a wallet already too large to enumerate on-ledger, `merge` reads the holdings
86
+ from the public SV Scan ACS snapshot (paginated, no node cap) and does one sweep
87
+ over them, then finishes the tail against the live balance. It is safe to re-run:
88
+ each amulet is consumed at most once, and every merge transfer is a **self-transfer
89
+ pinned to your own party and gated by verify-before-sign** — the relay can never
90
+ turn a merge into an outbound payment. If a wallet is so large that one run cannot
91
+ finish, `merge` says so; just run it again.
92
+
69
93
  On Canton, incoming CC arrives as a **pending transfer** the agent must accept,
70
94
  so the first-run flow is:
71
95
  `create --relay-url https://facilitator.ftptech.xyz` → tell your human to send CC to
@@ -94,29 +118,29 @@ then retries the request with the on-ledger proof.
94
118
 
95
119
  ## Config (env)
96
120
 
97
- - `CANTON_AGENT_RELAY_URL` — facilitator relay base URL. **Required** for the
121
+ - `CANTON_AGENT_RELAY_URL`: facilitator relay base URL. **Required** for the
98
122
  commands that talk to a relay (`create`, `pay`); there is intentionally no
99
123
  built-in default (a stale default would silently send payments to a dead
100
124
  host). Supply it here or via `--relay-url <url>`. The current FTP facilitator
101
125
  is `https://facilitator.ftptech.xyz`.
102
- - `CANTON_AGENT_NETWORK` — `canton:testnet` (default) or `canton:mainnet`; also
126
+ - `CANTON_AGENT_NETWORK`: `canton:testnet` (default) or `canton:mainnet`; also
103
127
  settable via `--network <net>`.
104
- - `CANTON_AGENT_API_KEY` — only if the relay requires one (sent as the
128
+ - `CANTON_AGENT_API_KEY`: only if the relay requires one (sent as the
105
129
  `X-Agent-Key` header).
106
- - `HTTPS_PROXY` / `HTTP_PROXY` (or `ALL_PROXY`) — if set, the CLI routes all
130
+ - `HTTPS_PROXY` / `HTTP_PROXY` (or `ALL_PROXY`): if set, the CLI routes all
107
131
  relay calls through that proxy. Node's `fetch` does NOT honor these on its
108
132
  own, so behind a corporate/regional proxy you must set one of them or every
109
133
  call fails with `fetch failed`. Credentials are supported
110
134
  (`http://user:pass@host:port`) and never logged.
111
- - `CANTON_AGENT_HOME` — override the wallet directory (default `~/.canton-agent`;
135
+ - `CANTON_AGENT_HOME`: override the wallet directory (default `~/.canton-agent`;
112
136
  used by tests and power users).
113
137
 
114
138
  ## Your wallet is YOURS (self-custody)
115
139
 
116
140
  The wallet lives at `~/.canton-agent/wallet.json` (mode `0600`). **This file IS
117
- your money — back it up.** Losing it loses the funds. The agent reuses the same
141
+ your money, so back it up.** Losing it loses the funds. The agent reuses the same
118
142
  wallet forever and never silently creates a second one. The validator only
119
- *hosts* your party; it can never spend your CC — only your signature authorizes a
143
+ *hosts* your party; it can never spend your CC. Only your signature authorizes a
120
144
  transfer. `canton-agent-wallet export` prints the private key for backup or
121
145
  import.
122
146
 
@@ -141,7 +165,7 @@ The relay is treated as untrusted. Before signing any transfer that moves funds,
141
165
  the agent structurally decodes the relay-prepared transaction and checks the
142
166
  sender / receiver / amount / instrument against its own intent (rejecting
143
167
  ambiguous encodings that a spec-conformant parser would read differently). It
144
- then **binds** the hash it signs to those validated bytes — because the Canton
168
+ then **binds** the hash it signs to those validated bytes, because the Canton
145
169
  Ledger API is explicit that "clients MUST recompute the hash from the raw
146
170
  transaction if the preparing participant is not trusted". A compromised relay
147
171
  that returns honest bytes paired with the hash of a different (tampered)
@@ -159,7 +183,7 @@ Binding requires one of:
159
183
 
160
184
  With neither configured, a value-moving transfer **refuses to sign** (fail-closed)
161
185
  rather than blind-sign a relay-chosen hash. Accepting incoming transfers
162
- (`claim`) needs no binding — no funds leave.
186
+ (`claim`) needs no binding, since no funds leave.
163
187
 
164
188
  ## License
165
189
 
@@ -10,6 +10,16 @@ export declare const DEFAULT_NETWORK = "canton:testnet";
10
10
  export declare const VALUE_FLAGS: ReadonlySet<string>;
11
11
  /** First value following `--<name>` in `args`, or undefined. */
12
12
  export declare function flag(args: readonly string[], name: string): string | undefined;
13
+ /** True when the boolean switch `--<name>` is present anywhere in `args` (it takes
14
+ * no value). Used by `merge --dry-run`. */
15
+ export declare function boolFlag(args: readonly string[], name: string): boolean;
16
+ /**
17
+ * Parse a positive-integer `--<name> <n>` flag. Returns undefined when the flag
18
+ * is absent; THROWS on a present-but-invalid value (non-integer, ≤ 0) so a
19
+ * fat-fingered `--batch abc` fails fast with a clear message instead of silently
20
+ * falling back to a default. Pure (no process.exit) so it is unit-testable.
21
+ */
22
+ export declare function intFlag(args: readonly string[], name: string): number | undefined;
13
23
  /**
14
24
  * Positional args with any known `--flag <value>` pairs removed, so a command
15
25
  * can read its positional (e.g. `pay <url>`) regardless of where the flags
@@ -1 +1 @@
1
- {"version":3,"file":"cli-args.d.ts","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,eAAe,mBAAmB,CAAC;AAEhD,8EAA8E;AAC9E,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,MAAM,CAgB1C,CAAC;AAEH,gEAAgE;AAChE,wBAAgB,IAAI,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG9E;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAW7D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,SAAS,CAEpB;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAC5B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED,iEAAiE;AACjE,eAAO,MAAM,kBAAkB,QAEkD,CAAC"}
1
+ {"version":3,"file":"cli-args.d.ts","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,eAAe,mBAAmB,CAAC;AAEhD,8EAA8E;AAC9E,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,MAAM,CAqB1C,CAAC;AAEH,gEAAgE;AAChE,wBAAgB,IAAI,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG9E;AAED;4CAC4C;AAC5C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAQpB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAW7D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,SAAS,CAEpB;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAC5B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED,iEAAiE;AACjE,eAAO,MAAM,kBAAkB,QAEkD,CAAC"}
package/dist/cli-args.js CHANGED
@@ -17,6 +17,11 @@ export const VALUE_FLAGS = new Set([
17
17
  "--key-file",
18
18
  "--facilitator",
19
19
  "--synchronizer",
20
+ // merge: consolidate dust amulets. `--dry-run` is a BOOLEAN flag (no value), so
21
+ // it is intentionally NOT listed here — only the value-taking merge flags are.
22
+ "--target",
23
+ "--batch",
24
+ "--max-rounds",
20
25
  // merchant-onboard-hosted (hosted-party merchant onboards via its OWN node's
21
26
  // Ledger API — no wallet, no relay): node connection flags. Secrets are NEVER
22
27
  // accepted as flags (OIDC config comes from env only), so none appear here.
@@ -29,6 +34,27 @@ export function flag(args, name) {
29
34
  const i = args.indexOf(name);
30
35
  return i >= 0 && i + 1 < args.length ? args[i + 1] : undefined;
31
36
  }
37
+ /** True when the boolean switch `--<name>` is present anywhere in `args` (it takes
38
+ * no value). Used by `merge --dry-run`. */
39
+ export function boolFlag(args, name) {
40
+ return args.includes(name);
41
+ }
42
+ /**
43
+ * Parse a positive-integer `--<name> <n>` flag. Returns undefined when the flag
44
+ * is absent; THROWS on a present-but-invalid value (non-integer, ≤ 0) so a
45
+ * fat-fingered `--batch abc` fails fast with a clear message instead of silently
46
+ * falling back to a default. Pure (no process.exit) so it is unit-testable.
47
+ */
48
+ export function intFlag(args, name) {
49
+ const raw = flag(args, name);
50
+ if (raw === undefined)
51
+ return undefined;
52
+ const n = Number(raw);
53
+ if (!Number.isInteger(n) || n <= 0) {
54
+ throw new Error(`${name} must be a positive integer (got ${JSON.stringify(raw)})`);
55
+ }
56
+ return n;
57
+ }
32
58
  /**
33
59
  * Positional args with any known `--flag <value>` pairs removed, so a command
34
60
  * can read its positional (e.g. `pay <url>`) regardless of where the flags
@@ -1 +1 @@
1
- {"version":3,"file":"cli-args.js","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAEhD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC;IACtD,aAAa;IACb,WAAW;IACX,MAAM;IACN,UAAU;IACV,kBAAkB;IAClB,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,gBAAgB;IAChB,6EAA6E;IAC7E,8EAA8E;IAC9E,4EAA4E;IAC5E,SAAS;IACT,mBAAmB;IACnB,WAAW;CACZ,CAAC,CAAC;AAEH,gEAAgE;AAChE,MAAM,UAAU,IAAI,CAAC,IAAuB,EAAE,IAAY;IACxD,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAuB;IACjD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;QAC5B,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,CAAC,IAAI,CAAC,CAAC,CAAC,yBAAyB;YACjC,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAuB,EACvB,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,sBAAsB,IAAI,SAAS,CAAC;AAC9E,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAC5B,IAAuB,EACvB,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,GAAG,CAAC,oBAAoB,IAAI,eAAe,CAAC;AAChF,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,MAAM,kBAAkB,GAC7B,wEAAwE;IACxE,+EAA+E,CAAC"}
1
+ {"version":3,"file":"cli-args.js","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAEhD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC;IACtD,aAAa;IACb,WAAW;IACX,MAAM;IACN,UAAU;IACV,kBAAkB;IAClB,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,gBAAgB;IAChB,gFAAgF;IAChF,+EAA+E;IAC/E,UAAU;IACV,SAAS;IACT,cAAc;IACd,6EAA6E;IAC7E,8EAA8E;IAC9E,4EAA4E;IAC5E,SAAS;IACT,mBAAmB;IACnB,WAAW;CACZ,CAAC,CAAC;AAEH,gEAAgE;AAChE,MAAM,UAAU,IAAI,CAAC,IAAuB,EAAE,IAAY;IACxD,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,CAAC;AAED;4CAC4C;AAC5C,MAAM,UAAU,QAAQ,CAAC,IAAuB,EAAE,IAAY;IAC5D,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CACrB,IAAuB,EACvB,IAAY;IAEZ,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,oCAAoC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAuB;IACjD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;QAC5B,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,CAAC,IAAI,CAAC,CAAC,CAAC,yBAAyB;YACjC,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAuB,EACvB,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,sBAAsB,IAAI,SAAS,CAAC;AAC9E,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAC5B,IAAuB,EACvB,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,GAAG,CAAC,oBAAoB,IAAI,eAAe,CAAC;AAChF,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,MAAM,kBAAkB,GAC7B,wEAAwE;IACxE,+EAA+E,CAAC"}
package/dist/cli.js CHANGED
@@ -6,6 +6,10 @@
6
6
  * address print the party id (fund this)
7
7
  * balance print CC balance
8
8
  * claim accept incoming transfers (e.g. the initial funding)
9
+ * merge [--target <n>] [--batch <n>] [--max-rounds <n>] [--dry-run]
10
+ * consolidate dust amulets (self-transfer in batches)
11
+ * so a wallet with thousands of holdings can be
12
+ * enumerated + spent again. --dry-run prints the plan.
9
13
  * reclaim --allocation-cid <c> [--receiver <merchantParty>]
10
14
  * reclaim a locked allocation back to this wallet
11
15
  * (Allocation_Withdraw; funds return to the sender).
@@ -50,12 +54,13 @@ import { ensureWallet } from "./onboard.js";
50
54
  import { loadWallet } from "./store.js";
51
55
  import { agentKeyFromPrivatePem } from "./keys.js";
52
56
  import { makePayingFetch } from "./pay.js";
53
- import { RelayClient } from "./relay-client.js";
57
+ import { RelayClient, isHoldingsExceedNodeLimitError } from "./relay-client.js";
54
58
  import { claimAll, reclaimAllocation, createMerchantConsent } from "./tx.js";
59
+ import { mergeHoldings } from "./merge.js";
55
60
  import { createMerchantConsentHosted } from "./hosted-onboard.js";
56
61
  import { withdraw } from "./withdraw.js";
57
62
  import { installProxyFromEnv } from "./proxy.js";
58
- import { flag, positionals, resolveNetwork, resolveRelayUrl, MISSING_RELAY_HELP, } from "./cli-args.js";
63
+ import { flag, boolFlag, intFlag, positionals, resolveNetwork, resolveRelayUrl, MISSING_RELAY_HELP, } from "./cli-args.js";
59
64
  const API_KEY = process.env.CANTON_AGENT_API_KEY;
60
65
  function fail(msg) {
61
66
  console.error(msg);
@@ -108,8 +113,49 @@ async function main() {
108
113
  const w = loadWallet();
109
114
  if (!w)
110
115
  return fail("no wallet yet — run: canton-agent-wallet create");
111
- const b = await new RelayClient({ relayUrl: w.relayUrl, apiKey: API_KEY }).balance(w.party);
112
- console.log(`${b.cc} CC (${b.amulet} holding${b.amulet === 1 ? "" : "s"})`);
116
+ try {
117
+ const b = await new RelayClient({ relayUrl: w.relayUrl, apiKey: API_KEY }).balance(w.party);
118
+ console.log(`${b.cc} CC (${b.amulet} holding${b.amulet === 1 ? "" : "s"})`);
119
+ }
120
+ catch (err) {
121
+ // A whale wallet holds more amulet contracts than the participant's
122
+ // JSON-API element cap can enumerate — balance 413s. Print an actionable
123
+ // next step (consolidate) instead of a raw relay-error stack.
124
+ if (isHoldingsExceedNodeLimitError(err)) {
125
+ return fail("balance unavailable: this wallet holds too many amulet contracts to " +
126
+ "enumerate on-ledger (the participant's element cap). Consolidate them " +
127
+ "first with: canton-agent-wallet merge");
128
+ }
129
+ throw err;
130
+ }
131
+ break;
132
+ }
133
+ case "merge": {
134
+ // Consolidate dust amulets by self-transferring them in batches (receiver ==
135
+ // this wallet, enforced by verify-before-sign). Restores `balance`/`pay` for
136
+ // a wallet whose amulet count outgrew the participant's ACS element cap.
137
+ const w = loadWallet();
138
+ if (!w)
139
+ return fail("no wallet yet — run: canton-agent-wallet create");
140
+ const target = intFlag(args, "--target");
141
+ const batch = intFlag(args, "--batch");
142
+ const maxRounds = intFlag(args, "--max-rounds");
143
+ const dryRun = boolFlag(args, "--dry-run");
144
+ const relay = new RelayClient({ relayUrl: w.relayUrl, apiKey: API_KEY });
145
+ const res = await mergeHoldings(relay, w, {
146
+ ...(target !== undefined ? { target } : {}),
147
+ ...(batch !== undefined ? { batch } : {}),
148
+ ...(maxRounds !== undefined ? { maxRounds } : {}),
149
+ dryRun,
150
+ onProgress: (line) => console.log(line),
151
+ });
152
+ if (!dryRun) {
153
+ console.log(`merge complete: ${res.rounds} batch transfer(s), ` +
154
+ `${res.merged.length} amulet(s) consumed` +
155
+ (res.finalHoldings === null
156
+ ? " (still large — run `merge` again to continue)"
157
+ : ` → ${res.finalHoldings} holding(s) remain`));
158
+ }
113
159
  break;
114
160
  }
115
161
  case "claim": {
@@ -284,7 +330,7 @@ async function main() {
284
330
  break;
285
331
  }
286
332
  default:
287
- console.error("canton-agent-wallet: create | address | balance | claim | reclaim --allocation-cid <cid> [--receiver <merchantParty>] | merchant-onboard --facilitator <party> --synchronizer <id> | merchant-onboard-hosted --party <merchantParty> --facilitator <party> --participant-url <url> --synchronizer <id> --user-id <id> | pay <url> | withdraw --to <party> | export | import\n" +
333
+ console.error("canton-agent-wallet: create | address | balance | claim | merge [--target <n>] [--batch <n>] [--max-rounds <n>] [--dry-run] | reclaim --allocation-cid <cid> [--receiver <merchantParty>] | merchant-onboard --facilitator <party> --synchronizer <id> | merchant-onboard-hosted --party <merchantParty> --facilitator <party> --participant-url <url> --synchronizer <id> --user-id <id> | pay <url> | withdraw --to <party> | export | import\n" +
288
334
  " relay required for create/pay/import: --relay-url <url> or CANTON_AGENT_RELAY_URL\n" +
289
335
  " merchant-onboard = EXTERNAL-PARTY merchant (this Ed25519 wallet, via the relay).\n" +
290
336
  " merchant-onboard-hosted = HOSTED-PARTY merchant (party on its OWN Canton node, via that node's Ledger API; OIDC config from env: OIDC_TOKEN_ENDPOINT/OIDC_CLIENT_ID/OIDC_CLIENT_SECRET/LEDGER_API_AUDIENCE/[OIDC_SCOPE]).");
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export * from "./relay-client.js";
4
4
  export * from "./onboard.js";
5
5
  export * from "./relay-signer.js";
6
6
  export * from "./tx.js";
7
+ export * from "./merge.js";
7
8
  export * from "./hosted-onboard.js";
8
9
  export * from "./withdraw.js";
9
10
  export * from "./pay.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,SAAS,CAAC;AACxB,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,6BAA6B,EAC7B,kCAAkC,EAClC,iBAAiB,EACjB,gCAAgC,EAChC,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,6BAA6B,EAC7B,4BAA4B,EAC5B,+BAA+B,EAC/B,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EAChC,KAAK,gCAAgC,EACrC,KAAK,6BAA6B,GACnC,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,6BAA6B,EAC7B,kCAAkC,EAClC,iBAAiB,EACjB,gCAAgC,EAChC,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,6BAA6B,EAC7B,4BAA4B,EAC5B,+BAA+B,EAC/B,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EAChC,KAAK,gCAAgC,EACrC,KAAK,6BAA6B,GACnC,MAAM,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -4,6 +4,7 @@ export * from "./relay-client.js";
4
4
  export * from "./onboard.js";
5
5
  export * from "./relay-signer.js";
6
6
  export * from "./tx.js";
7
+ export * from "./merge.js";
7
8
  export * from "./hosted-onboard.js";
8
9
  export * from "./withdraw.js";
9
10
  export * from "./pay.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,SAAS,CAAC;AACxB,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,6BAA6B,EAC7B,kCAAkC,EAClC,iBAAiB,EACjB,gCAAgC,EAChC,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,6BAA6B,EAC7B,4BAA4B,EAC5B,+BAA+B,GAKhC,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,6BAA6B,EAC7B,kCAAkC,EAClC,iBAAiB,EACjB,gCAAgC,EAChC,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,6BAA6B,EAC7B,4BAA4B,EAC5B,+BAA+B,GAKhC,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Amulet merge / consolidate — collapse a wallet's dust Amulet UTXOs into a
3
+ * couple of holdings by self-transferring them in batches.
4
+ *
5
+ * WHY: every accepted incoming Canton transfer creates a fresh Amulet contract,
6
+ * so an active wallet accumulates thousands of dust amulets. The participant's
7
+ * JSON API caps /v2/state/active-contracts result size, so past that cap the
8
+ * wallet can no longer even be ENUMERATED through the ledger (balance → 413
9
+ * holdings_exceed_node_limit) and therefore can no longer PAY (the pay path
10
+ * selects inputHoldingCids from that same enumeration). Merging restores both.
11
+ *
12
+ * HOW: each batch executes ONE self-transfer (sender = receiver = the wallet's
13
+ * OWN party) of 1 atomic ("0.0000000001") consuming the whole batch as inputs.
14
+ * The TransferFactory returns everything else as ONE change amulet to the sender,
15
+ * so a batch of N dust amulets collapses to ~2 amulets. Using 1 atomic sidesteps
16
+ * ALL fee math (the change amulet absorbs the remainder).
17
+ *
18
+ * The transfer itself reuses the EXISTING outbound `transfer()` machinery — same
19
+ * relay resolve → build → verify-before-sign → local sign → relay execute — so
20
+ * there is no second signing path to audit. mergeHoldings only orchestrates
21
+ * batching + the whale-wallet enumeration fallback.
22
+ *
23
+ * SECURITY INVARIANT (non-negotiable): every merge transfer pins
24
+ * `receiver === wallet.party` BEFORE signing, and the verify-before-sign arm
25
+ * (`assertPreparedTransferMatches`, via `transfer()`'s `kind:"cip56"` spec, which
26
+ * pins `expect.receiver`) refuses to sign unless the prepared tx's receiver
27
+ * equals it. A compromised relay therefore cannot turn a "merge" into an outbound
28
+ * drain — the self-transfer receiver is caller intent, never the relay's value.
29
+ */
30
+ import { transfer } from "./tx.js";
31
+ import { type RelayClient } from "./relay-client.js";
32
+ import type { AgentWallet } from "./store.js";
33
+ import type { HashBindingOptions } from "./verify-prepared.js";
34
+ export interface MergeOptions {
35
+ /** Stop once the LIVE holding count is at or below this (default 2 — the two
36
+ * amulets a single self-transfer already collapses a batch into). */
37
+ target?: number;
38
+ /** Input amulets consumed per self-transfer (default 90). Bounded well under
39
+ * the participant's per-tx input limit; each batch → ~2 amulets. */
40
+ batch?: number;
41
+ /** Max live-phase rounds after the whale pass (default 30). A hard stop so a
42
+ * pathological wallet can never loop unbounded. */
43
+ maxRounds?: number;
44
+ /** Enumerate + report the plan only; execute NO transfers. */
45
+ dryRun?: boolean;
46
+ /** Hash-binding policy for the self-transfers; defaults to the env-resolved
47
+ * binding (real V2 recompute unless CANTON_AGENT_TRUST_RELAY_HASH). */
48
+ hashBinding?: HashBindingOptions;
49
+ /** Independently-trusted Amulet DSO (instrument admin) to pin on each transfer,
50
+ * exactly like `withdraw`. Defaults to CANTON_AGENT_DSO_PARTY / the network
51
+ * constant; without it a self-transfer carrying the DSO in its consequences
52
+ * fails closed (see trusted-dso.ts). */
53
+ instrumentAdmin?: string;
54
+ /** @internal Injected transfer executor (defaults to the real `transfer`). Lets
55
+ * unit tests mock the outbound seam and assert receiver === wallet.party on
56
+ * every call without stubbing the whole relay/prepare/sign chain. */
57
+ transferFn?: typeof transfer;
58
+ /** @internal Progress sink (defaults to no-op). The CLI passes a logger. */
59
+ onProgress?: (line: string) => void;
60
+ }
61
+ export interface MergeResult {
62
+ /** Number of batch self-transfers that were EXECUTED (0 for a dry run). */
63
+ rounds: number;
64
+ /** Every input amulet cid consumed across all executed batches. */
65
+ merged: string[];
66
+ /** The updateId of each executed batch self-transfer. */
67
+ updateIds: string[];
68
+ /** The final LIVE holding count, or null when the wallet still 413s on balance
69
+ * (i.e. it is STILL a whale — extremely large; another `merge` run continues). */
70
+ finalHoldings: number | null;
71
+ /** True when enumeration used the Scan-snapshot whale path (balance 413'd). */
72
+ usedScan: boolean;
73
+ /** For a dry run: the planned batch count over the enumerated holdings. */
74
+ plannedBatches?: number;
75
+ }
76
+ /**
77
+ * Consolidate the wallet's dust Amulet holdings.
78
+ *
79
+ * Phases:
80
+ * 1. ENUMERATE — `balance` if it works, else the Scan snapshot (whale).
81
+ * 2. WHALE PASS (only when enumeration used Scan) — ONE pass over the snapshot
82
+ * list in batches of `batch`; each batch is one self-transfer. The snapshot
83
+ * lags but is safe here: an idle wallet's amulets don't move and each cid is
84
+ * consumed at most once. A batch that fails on a stale/archived input cid is
85
+ * SKIPPED (logged) and the pass continues; any other failure aborts.
86
+ * 3. LIVE PHASE — loop reading the LIVE `balance`; stop when holdings ≤ target
87
+ * or `maxRounds` is hit; otherwise self-transfer the next `batch` of live
88
+ * cids. (Small wallets go straight here — step 2 is skipped.)
89
+ *
90
+ * Every self-transfer pins receiver = wallet.party (verify-before-sign enforced).
91
+ */
92
+ export declare function mergeHoldings(relay: RelayClient, wallet: AgentWallet, opts?: MergeOptions): Promise<MergeResult>;
93
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../src/merge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAQ/D,MAAM,WAAW,YAAY;IAC3B;0EACsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;yEACqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;wDACoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;4EACwE;IACxE,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC;;;6CAGyC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;0EAEsE;IACtE,UAAU,CAAC,EAAE,OAAO,QAAQ,CAAC;IAC7B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,yDAAyD;IACzD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB;uFACmF;IACnF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,+EAA+E;IAC/E,QAAQ,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA2BD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,WAAW,CAAC,CAuItB"}