@paybox-sh/sdk 0.8.1 → 0.8.2

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/SKILL.md CHANGED
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  name: PayBox CLI setup
3
+ version: 0.8.3
3
4
  description: >-
4
5
  Install and log in to the PayBox CLI (@paybox-sh/sdk) so an agent can pay,
5
6
  sign, and hold wallet, card, and secret credentials on the user's behalf. Use
@@ -9,6 +10,10 @@ description: >-
9
10
 
10
11
  # PayBox CLI setup
11
12
 
13
+ The human and agent guide is `https://docs.paybox.sh` (start at
14
+ getting-started and connect/mcp). This file is only the CLI film. Grok
15
+ (grok.com) and Grok Bots are different hosts; do not treat one as the other.
16
+
12
17
  The user asks to install PayBox. Two things need them: they approve wallet
13
18
  access with a passkey, and they paste one signing key. Everything else is yours,
14
19
  and they should not see it happen.
@@ -19,6 +24,13 @@ and they should not see it happen.
19
24
  npm install -g @paybox-sh/sdk
20
25
  ```
21
26
 
27
+ Then confirm what you got: `paybox --json version` reports the version and
28
+ `binary`, the path that answered. Two things go wrong here and both are quiet.
29
+ If the command is not found, the global prefix is not on this shell's `PATH`;
30
+ `npm prefix -g` gives you that prefix, and the binary sits in its `bin`. If
31
+ `binary` is under a different prefix, an older `paybox` sits earlier on `PATH`
32
+ and will keep answering every command you run.
33
+
22
34
  The CLI runs wherever you run it, which is often not the user's own machine.
23
35
  That is fine: login uses an OAuth device-code grant, so the browser that
24
36
  approves does not have to be the one the CLI can reach.
@@ -27,6 +39,10 @@ Never delete or overwrite an existing config directory. To isolate a run from
27
39
  credentials the user already has, point `PAYBOX_CONFIG_DIR` at a fresh
28
40
  directory.
29
41
 
42
+ Give each parallel run its own directory too. Commands sharing one config race
43
+ each other's token refresh, and the loser fails with `refresh token has already
44
+ been used`. Retry that one command once; do not run `login` again.
45
+
30
46
  ## Log in
31
47
 
32
48
  Run this once, in the same turn the user asks:
@@ -37,6 +53,11 @@ paybox login
37
53
 
38
54
  Add `--base-url` and `--app-url` for an environment other than the default.
39
55
 
56
+ If a config directory already exists, check `paybox --json whoami` first. When
57
+ `canSign` is already `true`, setup is done: do not run `login`, and do not send
58
+ the authorize link or the key field again. A second authorize link in one chat
59
+ reads as a setup that failed.
60
+
40
61
  The command drives the whole flow itself. Do not reimplement any of it: it
41
62
  registers a client, starts device authorization, prints a verification URL and a
42
63
  short user code, tries to open that URL locally, polls until the user approves,
@@ -104,12 +125,52 @@ to act on, send nothing.
104
125
 
105
126
  Match the user's language. Default to English unless they write otherwise.
106
127
 
107
- Once `canSign` is `true`, show them what they now have: `paybox --json
108
- credentials` for the granted wallets, then `paybox --json portfolio --address
109
- <wallet>` for balances. Every `--credential` takes the `credential.id` from that
110
- list; a wallet's name is not an id and the command will refuse it. Render a
111
- compact table, never addresses or raw JSON. The CLI cannot create wallets; it
112
- uses what the user granted during authorization.
128
+ ## Once setup is done
129
+
130
+ The silence rules above are about setup, and end here.
131
+
132
+ Show them what they now have: `paybox --json credentials` for the granted
133
+ wallets, then `paybox --json portfolio --address <wallet>` for balances. Every
134
+ `--credential` takes the `credential.id` from that list; a wallet's name is not
135
+ an id and the command will refuse it. Render a compact table, never addresses or
136
+ raw JSON. The CLI cannot create wallets; it uses what the user granted during
137
+ authorization.
138
+
139
+ When you run several operations at once, report each one where the user is
140
+ watching, as it lands, with its request id. Each spends real money on its own,
141
+ and one combined summary at the end leaves nobody able to tell which transaction
142
+ came from which request.
143
+
144
+ After that table, do two things with plugins. Do not treat Welcome as a
145
+ catalog index. There may be tens or thousands.
146
+
147
+ 1. Send them to enable plugins on the web: a markdown link labeled
148
+ **Plugins** to `https://app.paybox.sh/plugins`. That is the PayBox
149
+ app, not a host Settings → Plugins screen. Ask them to turn on what
150
+ they want to use, then say when they are back.
151
+
152
+ 2. Then call `discover_plugins` with `status` `enabled`, no `query`, and
153
+ a small `limit`. That page is what they have on, not the store. From
154
+ those plugins plus the portfolio, suggest a few concrete next moves
155
+ (about six, not one row per plugin). Use each result's `name` and
156
+ contract. Be specific: amounts, which wallet UUID, which market or
157
+ vault from the contract. Mix two enabled plugins in one suggestion
158
+ when that serves the same goal (for example fund or swap, then put
159
+ the result to work). If nothing is enabled, skip the suggestion list
160
+ and stay on the Plugins link.
161
+
162
+ When they name a plugin or a job, search: `discover_plugins` with `query`
163
+ set to what they asked, `status` `enabled` if they already turned it on,
164
+ then page with `next_cursor` only while the current page has no match.
165
+ Official plugin money uses MCP: `get_contract` with `contract_uri`
166
+ unchanged → `use_plugin` with that contract's `plugin_id`, `tool_id`,
167
+ and `input`. Do not invent a `paybox <plugin>` command; only use CLI
168
+ groups that `paybox --help` already lists. Enabled plugin tools may also
169
+ appear on `tools/list`. Plugin money always pauses for passkey.
170
+
171
+ If prod MCP (`https://api.paybox.sh/mcp`) is `unreachable` or `needsAuth` while
172
+ `paybox --json whoami` still works, say that. Do not send the human to Settings.
173
+ Do not switch to staging. Do not report the dollar as sent.
113
174
 
114
175
  ## A setup that went wrong
115
176
 
@@ -146,8 +146,6 @@ async function loginDevice(baseUrl, opts = {}) {
146
146
  token_endpoint_auth_method: "none",
147
147
  grant_types: ["urn:ietf:params:oauth:grant-type:device_code", "refresh_token"],
148
148
  response_types: ["code"],
149
- // Must match (or be a superset of) what we ask for below — the server
150
- // only grants scope that was declared at registration.
151
149
  scope
152
150
  })
153
151
  });
@@ -616,6 +614,9 @@ function signingResultForResponse(result, response) {
616
614
  const exposesPlan = response.status === "pending_approval" || response.status === "pending_signature";
617
615
  return { ...result, response, plan: exposesPlan ? result.plan : null };
618
616
  }
617
+ function didNotHappen(r) {
618
+ return r?.status === "denied" || r?.status === "error";
619
+ }
619
620
  var PayboxError = class extends Error {
620
621
  constructor(status, body, context) {
621
622
  super(`paybox ${context} failed (${status}): ${body}`);
@@ -635,7 +636,6 @@ var PayboxClient = class _PayboxClient {
635
636
  this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
636
637
  this.fetchImpl = options.fetchImpl ?? fetch;
637
638
  }
638
- /** Build a client from `~/.config/paybox/config.json` + env, with overrides. */
639
639
  static fromConfig(overrides = {}) {
640
640
  const cfg = loadConfig();
641
641
  const client = new _PayboxClient({
@@ -659,7 +659,6 @@ var PayboxClient = class _PayboxClient {
659
659
  return null;
660
660
  }
661
661
  }
662
- /** Whether in-process signing is available (a parseable `pbxk1.` key is set). */
663
662
  get canSign() {
664
663
  return this.signingCreds() !== null;
665
664
  }
@@ -698,19 +697,14 @@ var PayboxClient = class _PayboxClient {
698
697
  return text ? JSON.parse(text) : void 0;
699
698
  }
700
699
  poster = (path, body) => this.request("POST", path, { body });
701
- /** List granted credentials plus the `ungranted` credentials (id, name, kind,
702
- * safe metadata) the user owns but hasn't granted this connector. */
703
700
  listCredentials() {
704
701
  return this.request("GET", "/agent/grants");
705
702
  }
706
- /** Token balances across chains (the `get_portfolio` tool). */
707
703
  getPortfolio(args) {
708
704
  return this.request("GET", "/agent/portfolio", {
709
705
  query: { address: args.address, network_ids: args.networkIds }
710
706
  });
711
707
  }
712
- /** Verify one confirmed Solana transaction's exact wallet/mint effect, then
713
- * read the current balance at or after its slot (`verify_solana_balance`). */
714
708
  verifySolanaBalance(args) {
715
709
  const body = {
716
710
  address: args.address,
@@ -719,7 +713,6 @@ var PayboxClient = class _PayboxClient {
719
713
  };
720
714
  return this.request("POST", "/agent/portfolio/verify-solana-balance", { body });
721
715
  }
722
- /** Charge a card credential (the `request_payment` tool). */
723
716
  requestPayment(args) {
724
717
  const operation = {
725
718
  type: "payment",
@@ -731,7 +724,6 @@ var PayboxClient = class _PayboxClient {
731
724
  };
732
725
  return this.request("POST", "/agent/request", { body: { operation } });
733
726
  }
734
- /** Reveal a secret credential (the `request_secret` tool). */
735
727
  requestSecret(args) {
736
728
  const operation = {
737
729
  type: "secret",
@@ -741,12 +733,6 @@ var PayboxClient = class _PayboxClient {
741
733
  };
742
734
  return this.request("POST", "/agent/request", { body: { operation } });
743
735
  }
744
- /** Sign with a wallet credential (the `request_wallet_sign` tool). Signs
745
- * in-process and returns the completed request when a signing key is set and
746
- * the request clears immediately; otherwise returns the pending response.
747
- * Uses `/agent/wallet-sign`, which echoes the wallet binding only while
748
- * approval or signature is pending so the signer need not resolve it
749
- * separately. Terminal responses carry a null binding. */
750
736
  async requestWalletSign(args, opts = {}) {
751
737
  return this.withExpiryRetry(
752
738
  async () => {
@@ -771,10 +757,6 @@ var PayboxClient = class _PayboxClient {
771
757
  (r) => r
772
758
  );
773
759
  }
774
- /** Swap tokens from a wallet credential (the `request_swap` tool). Returns the
775
- * parked response and its sign-ready plan while approval or signature is
776
- * pending; terminal responses carry a null plan. Signs + submits in-process
777
- * when a signing key is set and the swap cleared immediately. */
778
760
  async requestSwap(args, opts = {}) {
779
761
  return this.withExpiryRetry(
780
762
  async () => {
@@ -787,7 +769,6 @@ var PayboxClient = class _PayboxClient {
787
769
  dst_token: args.dstToken,
788
770
  amount: args.amount,
789
771
  swap_direction: args.swapDirection ?? "exact-amount-in",
790
- // Keep in sync with the request_swap MCP tool default (server side).
791
772
  slippage_bps: args.slippageBps ?? 150,
792
773
  recipient: args.recipient ?? null,
793
774
  value_cents: args.valueCents ?? null
@@ -800,10 +781,6 @@ var PayboxClient = class _PayboxClient {
800
781
  (r) => r.response
801
782
  );
802
783
  }
803
- /** Complete a swap request: optionally wait out a `pending_approval` dwell,
804
- * then sign the plan in-process and submit envelopes. Signing first refreshes
805
- * the parked request via `/agent/requests/{id}/refresh`, so a long approval
806
- * dwell never signs stale bytes. */
807
784
  async completeSwap(result, opts) {
808
785
  const creds = this.signingCreds();
809
786
  if (!(opts.autoSign ?? true) || !creds) {
@@ -827,8 +804,6 @@ var PayboxClient = class _PayboxClient {
827
804
  await this.requestAfterSign(response.request_id, opts.waitForApproval)
828
805
  );
829
806
  }
830
- /** Poll while the request sits in `pending_approval` (the user is approving
831
- * with their passkey); returns the first non-approval state. */
832
807
  async waitWhileApproval(requestId, wait) {
833
808
  const o = typeof wait === "object" ? wait : {};
834
809
  const interval = o.intervalMs ?? 2e3;
@@ -839,25 +814,14 @@ var PayboxClient = class _PayboxClient {
839
814
  await new Promise((res) => setTimeout(res, interval));
840
815
  }
841
816
  }
842
- /** Run an operation and, if it terminates on a server-marked expiry
843
- * (`retryable` on a terminal `error`/`denied`: the window elapsed and nothing
844
- * was signed or spent), re-issue it exactly once (SPE-456). Never loops: the
845
- * second attempt's result is returned as-is. */
846
817
  async withExpiryRetry(run, responseOf) {
847
818
  const first = await run();
848
819
  const r = responseOf(first);
849
- if ((r.status === "error" || r.status === "denied") && r.retryable) {
820
+ if (didNotHappen(r) && r.retryable) {
850
821
  return run();
851
822
  }
852
823
  return first;
853
824
  }
854
- /** Sign a parked request; if the sign/submit call fails, reconcile against the
855
- * authoritative state once (SPE-456). The server leaves a pre-broadcast
856
- * completion failure recoverable — the claim is released and the row stays
857
- * `pending_signature` — so re-sign a still-open request a single time; a
858
- * terminal or already-broadcast row is left as-is for the caller to read (and
859
- * for `withExpiryRetry` to re-issue if it is retryable). Bounded to one extra
860
- * attempt: a second failure propagates. */
861
825
  async signWithReconcile(requestId, sign) {
862
826
  try {
863
827
  await sign();
@@ -867,7 +831,6 @@ var PayboxClient = class _PayboxClient {
867
831
  await sign();
868
832
  }
869
833
  }
870
- /** Discover x402 services with the original array-returning response. */
871
834
  async discoverServices(query, opts = {}) {
872
835
  const result = await this.request("GET", "/agent/services", {
873
836
  query: {
@@ -878,8 +841,6 @@ var PayboxClient = class _PayboxClient {
878
841
  });
879
842
  return result.services;
880
843
  }
881
- /** Discover one bounded page of x402 services. Reuse the returned cursor with
882
- * the same query and network while `has_more` is true. */
883
844
  async discoverServicesPage(query, opts = {}) {
884
845
  return this.request("GET", "/agent/services", {
885
846
  query: {
@@ -891,10 +852,6 @@ var PayboxClient = class _PayboxClient {
891
852
  }
892
853
  });
893
854
  }
894
- /** Pay a paid x402 endpoint from a wallet credential (the `pay_x402` tool,
895
- * header mode). Signs in-process when a signing key is set and the payment
896
- * clears immediately — then the X-PAYMENT header is on the completed
897
- * response's `output.value.x_payment` (replay it on the original request). */
898
855
  async payX402(args, opts = {}) {
899
856
  return this.withExpiryRetry(
900
857
  async () => {
@@ -910,9 +867,6 @@ var PayboxClient = class _PayboxClient {
910
867
  (r) => r.response
911
868
  );
912
869
  }
913
- /** Fetch a paid x402 resource and have paybox pay for it (the `use_service`
914
- * tool, gateway mode): paybox probes the url, pays the 402, re-fetches with the
915
- * payment, and returns the resource's reply on `output.value.response`. */
916
870
  async useService(args, opts = {}) {
917
871
  return this.withExpiryRetry(
918
872
  async () => {
@@ -929,9 +883,6 @@ var PayboxClient = class _PayboxClient {
929
883
  (r) => r.response
930
884
  );
931
885
  }
932
- /** Shared completion for the two x402 entry points: optionally wait out a
933
- * `pending_approval` dwell, then sign the parked typed data in-process and
934
- * return the finished request, exactly like the swap path. */
935
886
  async completeX402(result, opts) {
936
887
  const creds = this.signingCreds();
937
888
  if (!(opts.autoSign ?? true) || !creds) {
@@ -955,20 +906,12 @@ var PayboxClient = class _PayboxClient {
955
906
  await this.requestAfterSign(response.request_id, opts.waitForApproval)
956
907
  );
957
908
  }
958
- /** Claim the usable card credentials of an approved payment (the
959
- * `claim_payment_credentials` tool). One-time: the claim is consumed. */
960
909
  claimPaymentCredentials(requestId) {
961
910
  return this.request("POST", `/agent/requests/${requestId}/credentials`);
962
911
  }
963
- /** Open the account-change flow (the `request_account_change` tool): returns a
964
- * `manage_url` deep link for the USER to open — they update this client's
965
- * access (or add a credential) in their own passkey-gated app session.
966
- * Nothing is parked or applied server-side. */
967
912
  requestAccountChange(note) {
968
913
  return this.request("POST", "/agent/account-change", { body: { note } });
969
914
  }
970
- /** A signed MoonPay checkout URL funding a granted wallet (the `get_buy_link`
971
- * tool). Share the URL with the user; generating it charges nothing. */
972
915
  getBuyLink(args) {
973
916
  return this.request("GET", "/agent/buy-link", {
974
917
  query: {
@@ -979,8 +922,6 @@ var PayboxClient = class _PayboxClient {
979
922
  }
980
923
  });
981
924
  }
982
- // ---- World REST discovery; money tools require the geofenced MCP window. ----
983
- /** Browse World prediction markets (the `world_find_markets` tool). */
984
925
  worldMarkets(args = {}) {
985
926
  return this.request("GET", "/agent/world/markets", {
986
927
  query: {
@@ -993,25 +934,19 @@ var PayboxClient = class _PayboxClient {
993
934
  }
994
935
  });
995
936
  }
996
- /** One World event with its markets (the `world_get_market` tool). Nested
997
- * markets default on, matching the tool — they carry the outcome mint ids
998
- * the orderbook/trade calls need. */
999
937
  worldMarket(eventTicker, withNestedMarkets = true) {
1000
938
  return this.request("GET", "/agent/world/market", {
1001
939
  query: {
1002
940
  event_ticker: eventTicker,
1003
- // Omit when true (the server default); send only the explicit opt-out.
1004
941
  with_nested_markets: withNestedMarkets ? void 0 : "false"
1005
942
  }
1006
943
  });
1007
944
  }
1008
- /** A World market's orderbook (the `world_orderbook` tool). */
1009
945
  worldOrderbook(id, byMint = false) {
1010
946
  return this.request("GET", "/agent/world/orderbook", {
1011
947
  query: { id, by_mint: byMint ? "true" : void 0 }
1012
948
  });
1013
949
  }
1014
- /** A World market's price history (the `world_market_prices` tool). */
1015
950
  worldPrices(args) {
1016
951
  return this.request("GET", "/agent/world/prices", {
1017
952
  query: {
@@ -1022,45 +957,30 @@ var PayboxClient = class _PayboxClient {
1022
957
  }
1023
958
  });
1024
959
  }
1025
- /** Filter addresses down to World outcome mints (the
1026
- * `world_filter_outcome_mints` tool). */
1027
960
  worldFilterOutcomeMints(addresses) {
1028
961
  return this.request("POST", "/agent/world/filter-outcome-mints", {
1029
962
  body: { addresses }
1030
963
  });
1031
964
  }
1032
- /** A wallet's World prediction-market positions: classified `positions` /
1033
- * `settled` entries (each with a `position_result`) plus `settlement_cash`
1034
- * for a settled winner's CASH cash-out (swap CASH to USDC via request_swap).
1035
- * The `world_positions` tool. */
1036
965
  worldPositions(address) {
1037
966
  return this.request("GET", "/agent/world/positions", { query: { address } });
1038
967
  }
1039
- // ---- Hyperliquid plugin (read-only spot discovery) — requires the user to
1040
- // have enabled the `hyperliquid` plugin in the paybox app. ----
1041
- /** Hyperliquid spot markets (the `hyperliquid_markets` tool). */
1042
968
  hyperliquidMarkets() {
1043
969
  return this.request("GET", "/agent/hyperliquid/markets");
1044
970
  }
1045
- /** Hyperliquid spot prices (the `hyperliquid_prices` tool). */
1046
971
  hyperliquidPrices() {
1047
972
  return this.request("GET", "/agent/hyperliquid/prices");
1048
973
  }
1049
- /** Resolve one Hyperliquid token by name (the `hyperliquid_token` tool). */
1050
974
  hyperliquidToken(name) {
1051
975
  return this.request("GET", "/agent/hyperliquid/token", { query: { name } });
1052
976
  }
1053
- /** Poll a request's status (the `get_request` tool). */
1054
977
  getRequest(requestId) {
1055
978
  return this.request("GET", `/agent/requests/${requestId}`);
1056
979
  }
1057
- /** After in-process sign, `--wait` polls through settlement/confirmation;
1058
- * without it, return the first snapshot (the historical no-wait contract). */
1059
980
  requestAfterSign(requestId, wait) {
1060
981
  if (!wait) return this.getRequest(requestId);
1061
982
  return this.waitForRequest(requestId, typeof wait === "object" ? wait : {});
1062
983
  }
1063
- /** Poll until the request leaves a pending state (or the timeout elapses). */
1064
984
  async waitForRequest(requestId, opts = {}) {
1065
985
  const interval = opts.intervalMs ?? 2e3;
1066
986
  const deadline = Date.now() + (opts.timeoutMs ?? 3e5);
@@ -1086,7 +1006,8 @@ export {
1086
1006
  loadConfig,
1087
1007
  saveConfig,
1088
1008
  credsFromToken,
1009
+ didNotHappen,
1089
1010
  PayboxError,
1090
1011
  PayboxClient
1091
1012
  };
1092
- //# sourceMappingURL=chunk-OBZSVPP7.js.map
1013
+ //# sourceMappingURL=chunk-WRPYONXW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth.ts","../src/config.ts","../node_modules/.pnpm/@paybox+mcp-app@file+..+mcp-app_@modelcontextprotocol+sdk@1.29.0_zod@4.4.3__bn.js@5.2.3_ac1e09a20c76a1143611be5dd3d4f9db/node_modules/@paybox/mcp-app/src/signing/creds.ts","../node_modules/.pnpm/@paybox+mcp-app@file+..+mcp-app_@modelcontextprotocol+sdk@1.29.0_zod@4.4.3__bn.js@5.2.3_ac1e09a20c76a1143611be5dd3d4f9db/node_modules/@paybox/mcp-app/src/signing/sign.ts","../src/signer.ts","../src/client.ts"],"sourcesContent":["\nimport { spawn } from \"node:child_process\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { createServer } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\n\nimport type { OAuthTokens } from \"./config.js\";\n\nexport function mcpResource(baseUrl: string): string {\n return `${baseUrl.replace(/\\/+$/, \"\")}/mcp`;\n}\n\nexport function appBaseFrom(baseUrl: string, override?: string): string | null {\n if (override) return override.replace(/\\/+$/, \"\");\n const m = baseUrl.replace(/\\/+$/, \"\").match(/^(https?:\\/\\/)api\\.(.+)$/);\n return m ? `${m[1]}app.${m[2]}` : null;\n}\n\nexport function agentClientId(accessToken: string): string | null {\n const payload = accessToken.split(\".\")[1];\n if (!payload) return null;\n try {\n const claims = JSON.parse(Buffer.from(payload, \"base64url\").toString(\"utf8\")) as {\n cid?: string;\n };\n return claims.cid ?? null;\n } catch {\n return null;\n }\n}\n\ninterface AsMetadata {\n registration_endpoint: string;\n authorization_endpoint: string;\n token_endpoint: string;\n device_authorization_endpoint?: string;\n}\n\nasync function metadata(baseUrl: string): Promise<AsMetadata> {\n const url = `${baseUrl.replace(/\\/+$/, \"\")}/.well-known/oauth-authorization-server`;\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`could not read OAuth metadata from ${url} (${res.status})`);\n }\n return (await res.json()) as AsMetadata;\n}\n\nfunction base64url(b: Buffer): string {\n return b.toString(\"base64url\");\n}\n\nfunction pkce(): { verifier: string; challenge: string } {\n const verifier = base64url(randomBytes(32));\n const challenge = base64url(createHash(\"sha256\").update(verifier).digest());\n return { verifier, challenge };\n}\n\nexport function openBrowser(url: string): void {\n const [cmd, args] =\n process.platform === \"darwin\"\n ? ([\"open\", [url]] as const)\n : process.platform === \"win32\"\n ? ([\"rundll32\", [\"url.dll,FileProtocolHandler\", url]] as const)\n : ([\"xdg-open\", [url]] as const);\n try {\n spawn(cmd, [...args], { stdio: \"ignore\", detached: true }).unref();\n } catch {\n }\n}\n\nconst CALLBACK_PAGE =\n \"<!doctype html><meta charset=utf-8><title>PayBox</title>\" +\n \"<body style=\\\"font:16px system-ui;padding:3rem;text-align:center\\\">\" +\n \"<h2>PayBox CLI connected</h2><p>You can close this tab and return to the terminal.</p>\";\n\nexport interface LoginOptions {\n scope?: string;\n clientName?: string;\n log?: (msg: string) => void;\n timeoutMs?: number;\n}\n\nexport async function loginLoopback(\n baseUrl: string,\n opts: LoginOptions = {},\n): Promise<OAuthTokens> {\n const scope = opts.scope ?? \"mcp offline_access\";\n const clientName = opts.clientName ?? \"PayBox CLI\";\n const log = opts.log ?? ((m: string) => console.error(m));\n const meta = await metadata(baseUrl);\n const resource = mcpResource(baseUrl);\n\n let resolveCode: (v: { code: string; state: string | null }) => void;\n let rejectCode: (e: Error) => void;\n const codePromise = new Promise<{ code: string; state: string | null }>((res, rej) => {\n resolveCode = res;\n rejectCode = rej;\n });\n\n const server = createServer((req, res) => {\n const u = new URL(req.url ?? \"/\", \"http://127.0.0.1\");\n if (u.pathname !== \"/callback\") {\n res.writeHead(404).end();\n return;\n }\n res.writeHead(200, { \"content-type\": \"text/html\" }).end(CALLBACK_PAGE);\n const code = u.searchParams.get(\"code\");\n if (code) resolveCode({ code, state: u.searchParams.get(\"state\") });\n else rejectCode(new Error(u.searchParams.get(\"error\") ?? \"authorization failed\"));\n });\n await new Promise<void>((r) => server.listen(0, \"127.0.0.1\", r));\n const port = (server.address() as AddressInfo).port;\n const redirectUri = `http://127.0.0.1:${port}/callback`;\n\n const timeoutMs = opts.timeoutMs ?? 300_000;\n const timer = setTimeout(\n () => rejectCode(new Error(`login timed out after ${Math.round(timeoutMs / 1000)}s — no approval received`)),\n timeoutMs,\n );\n timer.unref();\n\n try {\n const reg = await fetch(meta.registration_endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n client_name: clientName,\n redirect_uris: [redirectUri],\n token_endpoint_auth_method: \"none\",\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n }),\n });\n if (!reg.ok) throw new Error(`client registration failed (${reg.status}): ${await reg.text()}`);\n const { client_id: clientId } = (await reg.json()) as { client_id: string };\n\n const { verifier, challenge } = pkce();\n const state = base64url(randomBytes(16));\n const authUrl =\n `${meta.authorization_endpoint}?response_type=code` +\n `&client_id=${encodeURIComponent(clientId)}` +\n `&redirect_uri=${encodeURIComponent(redirectUri)}` +\n `&code_challenge=${challenge}&code_challenge_method=S256` +\n `&scope=${encodeURIComponent(scope)}` +\n `&state=${state}&resource=${encodeURIComponent(resource)}`;\n\n log(`Opening your browser to approve access:\\n ${authUrl}\\n`);\n openBrowser(authUrl);\n\n const { code, state: returnedState } = await codePromise;\n if (returnedState !== state) throw new Error(\"OAuth state mismatch — aborting\");\n\n const form = new URLSearchParams({\n grant_type: \"authorization_code\",\n code,\n redirect_uri: redirectUri,\n client_id: clientId,\n code_verifier: verifier,\n resource,\n });\n const tok = await fetch(meta.token_endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: form,\n });\n if (!tok.ok) throw new Error(`token exchange failed (${tok.status}): ${await tok.text()}`);\n const t = (await tok.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n };\n return {\n clientId,\n accessToken: t.access_token,\n refreshToken: t.refresh_token,\n expiresAt: t.expires_in ? Date.now() + t.expires_in * 1000 : undefined,\n resource,\n };\n } finally {\n clearTimeout(timer);\n server.close();\n }\n}\n\nexport async function loginDevice(\n baseUrl: string,\n opts: LoginOptions = {},\n): Promise<OAuthTokens> {\n const scope = opts.scope ?? \"mcp offline_access\";\n const clientName = opts.clientName ?? \"PayBox CLI\";\n const log = opts.log ?? ((m: string) => console.error(m));\n const meta = await metadata(baseUrl);\n if (!meta.device_authorization_endpoint) {\n throw new Error(\n \"this Paybox API does not advertise device_authorization_endpoint — upgrade the API and retry `paybox login`\",\n );\n }\n const resource = mcpResource(baseUrl);\n\n const reg = await fetch(meta.registration_endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n client_name: clientName,\n redirect_uris: [\"http://127.0.0.1/device\"],\n token_endpoint_auth_method: \"none\",\n grant_types: [\"urn:ietf:params:oauth:grant-type:device_code\", \"refresh_token\"],\n response_types: [\"code\"],\n scope,\n }),\n });\n if (!reg.ok) throw new Error(`client registration failed (${reg.status}): ${await reg.text()}`);\n const { client_id: clientId } = (await reg.json()) as { client_id: string };\n\n const started = await fetch(meta.device_authorization_endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({ client_id: clientId, scope, resource }),\n });\n if (!started.ok) {\n throw new Error(`device authorization failed (${started.status}): ${await started.text()}`);\n }\n const da = (await started.json()) as {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete: string;\n expires_in: number;\n interval?: number;\n };\n\n log(\n `Open this URL on your phone (or this computer) to approve access:\\n ${da.verification_uri_complete}\\n` +\n `Code: ${da.user_code}\\n`,\n );\n openBrowser(da.verification_uri_complete);\n\n const timeoutMs = opts.timeoutMs ?? da.expires_in * 1000;\n const deadline = Date.now() + timeoutMs;\n let intervalSec = da.interval && da.interval > 0 ? da.interval : 5;\n\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, intervalSec * 1000));\n const tok = await fetch(meta.token_endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: da.device_code,\n client_id: clientId,\n }),\n });\n const raw = await tok.text();\n if (tok.ok) {\n const t = JSON.parse(raw) as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n };\n return {\n clientId,\n accessToken: t.access_token,\n refreshToken: t.refresh_token,\n expiresAt: t.expires_in ? Date.now() + t.expires_in * 1000 : undefined,\n resource,\n };\n }\n let err = raw || \"authorization failed\";\n let code = \"\";\n try {\n const body = JSON.parse(raw) as { error?: string; error_description?: string };\n code = body.error ?? \"\";\n err = body.error_description ?? body.error ?? err;\n } catch {\n }\n if (code === \"authorization_pending\") continue;\n if (code === \"slow_down\") {\n intervalSec += 5;\n continue;\n }\n throw new Error(err);\n }\n throw new Error(`login timed out after ${Math.round(timeoutMs / 1000)}s — no approval received`);\n}\n\nexport async function refreshTokens(baseUrl: string, current: OAuthTokens): Promise<OAuthTokens> {\n if (!current.refreshToken) throw new Error(\"no refresh token — run `paybox login` again\");\n const meta = await metadata(baseUrl);\n const resource = current.resource ?? mcpResource(baseUrl);\n const form = new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: current.refreshToken,\n client_id: current.clientId,\n resource,\n });\n const res = await fetch(meta.token_endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: form,\n });\n if (!res.ok) throw new Error(`token refresh failed (${res.status}): ${await res.text()}`);\n const t = (await res.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n };\n return {\n ...current,\n accessToken: t.access_token,\n refreshToken: t.refresh_token ?? current.refreshToken,\n expiresAt: t.expires_in ? Date.now() + t.expires_in * 1000 : undefined,\n resource,\n };\n}\n","\nimport { chmodSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface OAuthTokens {\n clientId: string;\n accessToken: string;\n refreshToken?: string;\n expiresAt?: number;\n resource: string;\n}\n\nexport interface StoredConfig {\n baseUrl?: string;\n appUrl?: string;\n apiKey?: string;\n oauth?: OAuthTokens;\n signingKey?: string;\n}\n\nexport function configDir(): string {\n if (process.env.PAYBOX_CONFIG_DIR) return process.env.PAYBOX_CONFIG_DIR;\n const base = process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\");\n return join(base, \"paybox\");\n}\n\nexport function configFile(): string {\n return join(configDir(), \"config.json\");\n}\n\nexport function loadConfig(): StoredConfig {\n try {\n return JSON.parse(readFileSync(configFile(), \"utf8\")) as StoredConfig;\n } catch {\n return {};\n }\n}\n\nexport function saveConfig(config: StoredConfig): void {\n mkdirSync(configDir(), { recursive: true, mode: 0o700 });\n writeFileSync(configFile(), `${JSON.stringify(config, null, 2)}\\n`, { mode: 0o600 });\n if (process.platform !== \"win32\") chmodSync(configFile(), 0o600);\n}\n","\nconst STORAGE_KEY = \"paybox.walletSign.creds.v2\";\n\nexport const TOKEN_PREFIX = \"pbxk1.\";\n\nexport interface Creds {\n apiPubHex: string;\n apiPrivHex: string;\n savedAt: number;\n}\n\nlet sessionCreds: Creds | null = null;\nlet sessionDecided = false;\n\nexport function hasStorage(): boolean {\n try {\n const probe = \"__paybox_probe__\";\n window.localStorage.setItem(probe, \"1\");\n window.localStorage.removeItem(probe);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function load(): Creds | null {\n if (sessionDecided) return sessionCreds;\n try {\n const raw = window.localStorage.getItem(STORAGE_KEY);\n if (raw) {\n const parsed = JSON.parse(raw) as Partial<Creds>;\n if (\n typeof parsed.apiPubHex === \"string\" &&\n typeof parsed.apiPrivHex === \"string\" &&\n parsed.apiPubHex &&\n parsed.apiPrivHex\n ) {\n return {\n apiPubHex: parsed.apiPubHex,\n apiPrivHex: parsed.apiPrivHex,\n savedAt: typeof parsed.savedAt === \"number\" ? parsed.savedAt : 0,\n };\n }\n }\n } catch {\n }\n return null;\n}\n\nexport function save(c: Omit<Creds, \"savedAt\"> & { savedAt?: number }): void {\n const toStore: Creds = {\n apiPubHex: c.apiPubHex,\n apiPrivHex: c.apiPrivHex,\n savedAt: c.savedAt ?? Date.now(),\n };\n sessionCreds = toStore;\n sessionDecided = true;\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(toStore));\n } catch {\n }\n}\n\nexport function clear(): void {\n sessionCreds = null;\n sessionDecided = true;\n try {\n window.localStorage.removeItem(STORAGE_KEY);\n } catch {\n }\n}\n\nexport function validateHex(s: string, label: string): string | null {\n const trimmed = s.trim();\n if (!trimmed) return `${label} is required`;\n const body = trimmed.startsWith(\"0x\") || trimmed.startsWith(\"0X\") ? trimmed.slice(2) : trimmed;\n if (body.length === 0) return `${label} is empty`;\n if (body.length % 2 !== 0) return `${label} must have an even number of hex digits`;\n if (!/^[0-9a-fA-F]+$/.test(body)) return `${label} must be hexadecimal`;\n return null;\n}\n\n\nfunction b64urlEncode(s: string): string {\n return btoa(s).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nfunction b64urlDecode(s: string): string {\n let b = s.replace(/-/g, \"+\").replace(/_/g, \"/\");\n while (b.length % 4) b += \"=\";\n return atob(b);\n}\n\nexport function encodeToken(c: { apiPubHex: string; apiPrivHex: string }): string {\n return TOKEN_PREFIX + b64urlEncode(JSON.stringify({ p: c.apiPubHex, s: c.apiPrivHex }));\n}\n\nexport function parseToken(input: string): { apiPubHex: string; apiPrivHex: string } | null {\n const t = input.trim();\n if (!t) return null;\n const body = t.startsWith(TOKEN_PREFIX) ? t.slice(TOKEN_PREFIX.length) : t;\n let obj: unknown;\n try {\n obj = JSON.parse(b64urlDecode(body));\n } catch {\n return null;\n }\n if (!obj || typeof obj !== \"object\") return null;\n const o = obj as Record<string, unknown>;\n const apiPubHex = String(o.p ?? o.apiPubHex ?? \"\").trim();\n const apiPrivHex = String(o.s ?? o.apiPrivHex ?? \"\").trim();\n if (!apiPubHex || !apiPrivHex) return null;\n if (validateHex(apiPubHex, \"key\") || validateHex(apiPrivHex, \"key\")) return null;\n return { apiPubHex, apiPrivHex };\n}\n","\nimport { Buffer } from \"buffer\";\nimport nacl from \"tweetnacl\";\nimport { MoonXEvmSigner, EvmSchemeMismatchError } from \"@moon-x/evm-adapter\";\nimport { MoonXSolanaSigner, SolanaSchemeMismatchError } from \"@moon-x/solana-adapter\";\nimport { Transaction } from \"@solana/web3.js\";\nimport { hashTypedData, keccak256, serializeTransaction } from \"viem\";\nimport type {\n Authorization,\n TransactionSerializable,\n TypedDataDefinition,\n} from \"viem\";\n\nimport type { Creds } from \"./creds.js\";\n\nexport interface WireTx {\n to: `0x${string}`;\n value: string;\n data?: `0x${string}`;\n chainId: number;\n gas: string;\n maxPriorityFeePerGas: string;\n maxFeePerGas: string;\n nonce: number;\n}\n\nexport type SignIntent =\n | { op: \"message\"; message: string }\n | { op: \"typedData\"; typedData: TypedDataDefinition }\n | { op: \"transaction\"; transaction: WireTx }\n | { op: \"authorization\"; authorization: Authorization }\n | { op: \"solanaMessage\"; address: string; message: string }\n | { op: \"solanaTransaction\"; address: string; transactionBase64: string }\n | { op: \"raw\"; rawSigningPayloadHex: string };\n\nexport interface WalletBinding {\n walletId: string;\n keyId: string;\n derivationPath: string;\n}\n\nexport interface MoonxSignResult {\n scheme: string;\n signature: {\n r?: string;\n s?: string;\n recovery_id?: number;\n signature?: string;\n };\n}\n\nexport type MoonxSignTransport = (envelope: {\n signed_body: string;\n agent_signature: string;\n}) => Promise<MoonxSignResult>;\n\nexport type SignArtifactResult =\n | { ok: true; artifact: Record<string, unknown> }\n | { ok: false; error: string };\n\nfunction reviveTx(w: WireTx): TransactionSerializable {\n return {\n type: \"eip1559\",\n to: w.to,\n value: BigInt(w.value),\n data: w.data,\n chainId: w.chainId,\n gas: BigInt(w.gas),\n maxPriorityFeePerGas: BigInt(w.maxPriorityFeePerGas),\n maxFeePerGas: BigInt(w.maxFeePerGas),\n nonce: w.nonce,\n };\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n return new Uint8Array(Buffer.from(hex.replace(/^0x/, \"\"), \"hex\"));\n}\nfunction bytesToHex(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString(\"hex\");\n}\n\nfunction buildEnvelope(\n rawSigningPayloadHex: string,\n binding: WalletBinding,\n creds: Creds,\n): { signed_body: string; agent_signature: string } {\n const signedPayload = {\n raw_signing_payload: rawSigningPayloadHex.replace(/^0x/, \"\").toLowerCase(),\n key_id: binding.keyId,\n derivation_path: binding.derivationPath,\n issued_at: new Date().toISOString(),\n };\n const signedBodyBytes = new TextEncoder().encode(JSON.stringify(signedPayload));\n const keyPair = nacl.sign.keyPair.fromSeed(hexToBytes(creds.apiPrivHex));\n const agentSig = nacl.sign.detached(signedBodyBytes, keyPair.secretKey);\n return {\n signed_body: bytesToHex(signedBodyBytes),\n agent_signature: bytesToHex(agentSig),\n };\n}\n\nexport function eip1559SigningHash(tx: WireTx): `0x${string}` {\n return keccak256(serializeTransaction(reviveTx(tx)));\n}\n\nexport function solanaSigningPayload(base64Tx: string): string {\n const raw = Buffer.from(base64Tx, \"base64\");\n let i = 0;\n let sigCount = 0;\n let shift = 0;\n for (;;) {\n const b = raw[i++];\n sigCount |= (b & 0x7f) << shift;\n if ((b & 0x80) === 0) break;\n shift += 7;\n }\n if (sigCount < 1) {\n throw new Error(\"solana tx has no signature slots\");\n }\n return bytesToHex(new Uint8Array(raw.subarray(i + sigCount * 64)));\n}\n\nexport interface TxEnvelope {\n api_pub: string;\n signed_body: string;\n agent_signature: string;\n}\n\nexport interface PlanTx {\n vm?: string;\n transaction: WireTx | string;\n}\n\nexport function buildSwapEnvelopes(\n txs: PlanTx[],\n binding: WalletBinding,\n creds: Creds,\n): TxEnvelope[] {\n if (!binding.walletId) {\n throw new Error(\"PayBox did not supply a wallet id for this operation.\");\n }\n if (!binding.keyId || !binding.derivationPath) {\n throw new Error(\n \"This wallet isn't provisioned for signing yet (missing key binding). \" +\n \"Re-provision it in the PayBox app, then retry.\",\n );\n }\n return txs.map((t) => {\n const payload =\n t.vm === \"solana\"\n ? solanaSigningPayload(t.transaction as string)\n : eip1559SigningHash(t.transaction as WireTx);\n const { signed_body, agent_signature } = buildEnvelope(payload, binding, creds);\n return { api_pub: creds.apiPubHex, signed_body, agent_signature };\n });\n}\n\nexport function eip712SigningHash(typedData: TypedDataDefinition): `0x${string}` {\n return hashTypedData(typedData);\n}\n\nexport function buildX402Envelope(\n typedData: TypedDataDefinition,\n binding: WalletBinding,\n creds: Creds,\n): TxEnvelope {\n if (!binding.walletId) {\n throw new Error(\"PayBox did not supply a wallet id for this payment.\");\n }\n if (!binding.keyId || !binding.derivationPath) {\n throw new Error(\n \"This wallet isn't provisioned for signing yet (missing key binding). \" +\n \"Re-provision it in the PayBox app, then retry.\",\n );\n }\n const { signed_body, agent_signature } = buildEnvelope(\n eip712SigningHash(typedData),\n binding,\n creds,\n );\n return { api_pub: creds.apiPubHex, signed_body, agent_signature };\n}\n\nexport function buildX402SolanaEnvelope(\n transactionBase64: string,\n binding: WalletBinding,\n creds: Creds,\n): TxEnvelope {\n if (!binding.walletId) {\n throw new Error(\"PayBox did not supply a wallet id for this payment.\");\n }\n if (!binding.keyId || !binding.derivationPath) {\n throw new Error(\n \"This wallet isn't provisioned for signing yet (missing key binding). \" +\n \"Re-provision it in the PayBox app, then retry.\",\n );\n }\n const { signed_body, agent_signature } = buildEnvelope(\n solanaSigningPayload(transactionBase64),\n binding,\n creds,\n );\n return { api_pub: creds.apiPubHex, signed_body, agent_signature };\n}\n\nexport interface GaslessDigest {\n kind: \"userOp\" | \"authorization\";\n rawPayloadHex: string;\n}\n\nexport function buildGaslessEnvelopes(\n digests: GaslessDigest[],\n binding: WalletBinding,\n creds: Creds,\n): TxEnvelope[] {\n if (digests.length === 0) {\n throw new Error(\"gasless prepared calls have no signing items.\");\n }\n if (!binding.walletId) {\n throw new Error(\"PayBox did not supply a wallet id for this operation.\");\n }\n if (!binding.keyId || !binding.derivationPath) {\n throw new Error(\n \"This wallet isn't provisioned for signing yet (missing key binding). \" +\n \"Re-provision it in the PayBox app, then retry.\",\n );\n }\n return digests.map((d) => {\n const { signed_body, agent_signature } = buildEnvelope(d.rawPayloadHex, binding, creds);\n return { api_pub: creds.apiPubHex, signed_body, agent_signature };\n });\n}\n\nexport type ResolveBindingTransport = (envelope: {\n signed_body: string;\n agent_signature: string;\n}) => Promise<{ key_id?: string; derivation_path?: string }>;\n\nexport function buildIssuedAtEnvelope(creds: Creds): {\n signed_body: string;\n agent_signature: string;\n} {\n const signedBodyBytes = new TextEncoder().encode(\n JSON.stringify({ issued_at: new Date().toISOString() }),\n );\n const keyPair = nacl.sign.keyPair.fromSeed(hexToBytes(creds.apiPrivHex));\n const agentSig = nacl.sign.detached(signedBodyBytes, keyPair.secretKey);\n return {\n signed_body: bytesToHex(signedBodyBytes),\n agent_signature: bytesToHex(agentSig),\n };\n}\n\nexport async function resolveWalletBinding(\n creds: Creds,\n resolve: ResolveBindingTransport,\n): Promise<{ keyId: string; derivationPath: string }> {\n const res = await resolve(buildIssuedAtEnvelope(creds));\n if (!res.key_id || !res.derivation_path) {\n throw new Error(\"the signing service returned no binding for this wallet\");\n }\n return { keyId: res.key_id, derivationPath: res.derivation_path };\n}\n\nexport async function signIntent(\n intent: SignIntent,\n creds: Creds,\n binding: WalletBinding,\n transport: MoonxSignTransport,\n): Promise<SignArtifactResult> {\n if (!binding.walletId) {\n return { ok: false, error: \"PayBox did not supply a wallet id for this operation.\" };\n }\n if (!binding.keyId || !binding.derivationPath) {\n return {\n ok: false,\n error:\n \"This wallet isn't provisioned for signing yet (missing key binding). \" +\n \"Re-provision it in the PayBox app, then retry.\",\n };\n }\n\n const ecdsaSign = async (digest: `0x${string}`) => {\n const result = await transport(buildEnvelope(digest, binding, creds));\n const { r, s, recovery_id } = result.signature;\n if (r == null || s == null || recovery_id == null) {\n throw new Error(\"the signing service returned an ECDSA result without {r, s, recovery_id}\");\n }\n return {\n r: `0x${r}` as `0x${string}`,\n s: `0x${s}` as `0x${string}`,\n yParity: recovery_id as 0 | 1,\n };\n };\n const ed25519Sign = async (message: Uint8Array) => {\n const result = await transport(buildEnvelope(bytesToHex(message), binding, creds));\n const sig = result.signature.signature;\n if (!sig) throw new Error(\"the signing service returned an Ed25519 result without a signature\");\n return hexToBytes(sig);\n };\n\n try {\n switch (intent.op) {\n case \"message\":\n return {\n ok: true,\n artifact: { signature: await new MoonXEvmSigner(ecdsaSign).signMessage(intent.message) },\n };\n case \"typedData\":\n return {\n ok: true,\n artifact: {\n signature: await new MoonXEvmSigner(ecdsaSign).signTypedData(intent.typedData),\n },\n };\n case \"transaction\":\n return {\n ok: true,\n artifact: {\n serializedTransaction: await new MoonXEvmSigner(ecdsaSign).signTransaction(\n reviveTx(intent.transaction),\n ),\n },\n };\n case \"authorization\":\n return {\n ok: true,\n artifact: {\n authorization: await new MoonXEvmSigner(ecdsaSign).signAuthorization(\n intent.authorization,\n ),\n },\n };\n case \"solanaMessage\": {\n const sig = await new MoonXSolanaSigner(ed25519Sign, intent.address).signMessage(\n intent.message,\n );\n return { ok: true, artifact: { signature: bytesToHex(sig) } };\n }\n case \"solanaTransaction\": {\n const tx = Transaction.from(Buffer.from(intent.transactionBase64, \"base64\"));\n const signed = await new MoonXSolanaSigner(ed25519Sign, intent.address).signTransaction(\n tx,\n );\n return {\n ok: true,\n artifact: { signedTransactionBase64: Buffer.from(signed).toString(\"base64\") },\n };\n }\n case \"raw\": {\n const result = await transport(buildEnvelope(intent.rawSigningPayloadHex, binding, creds));\n return { ok: true, artifact: { scheme: result.scheme, signature: result.signature } };\n }\n default:\n return { ok: false, error: `unknown op: ${(intent as { op?: string }).op}` };\n }\n } catch (err) {\n if (err instanceof EvmSchemeMismatchError || err instanceof SolanaSchemeMismatchError) {\n return { ok: false, error: err.message };\n }\n const message = err instanceof Error ? err.message : String(err);\n return { ok: false, error: message };\n }\n}\n","\nimport { parseToken } from \"@paybox/mcp-app/creds\";\nimport type { Creds } from \"@paybox/mcp-app/creds\";\nimport {\n buildIssuedAtEnvelope,\n buildSwapEnvelopes,\n buildX402Envelope,\n buildX402SolanaEnvelope,\n signIntent,\n} from \"@paybox/mcp-app/sign\";\nimport type {\n MoonxSignResult,\n SignIntent,\n TxEnvelope,\n WalletBinding,\n} from \"@paybox/mcp-app/sign\";\n\nimport type { BindingResponse, SwapPlan, X402Plan } from \"./types.js\";\n\nexport type Poster = (path: string, body: unknown) => Promise<unknown>;\n\nexport function credsFromToken(token: string): Creds {\n if (token.trim().startsWith(\"pbx_live_\")) {\n throw new Error(\n \"invalid signing key: got a `pbx_live_` API key; expected a `pbxk1.` token (keypair only)\",\n );\n }\n const kp = parseToken(token);\n if (!kp) {\n throw new Error(\"invalid signing key: expected a `pbxk1.` token (keypair only)\");\n }\n return { apiPubHex: kp.apiPubHex, apiPrivHex: kp.apiPrivHex, savedAt: Date.now() };\n}\n\nfunction toBinding(b: BindingResponse): WalletBinding {\n return { walletId: b.wallet_id, keyId: b.key_id ?? \"\", derivationPath: b.derivation_path ?? \"\" };\n}\n\nasync function resolveBinding(\n post: Poster,\n requestId: string,\n creds: Creds,\n): Promise<WalletBinding> {\n const env = buildIssuedAtEnvelope(creds);\n const r = (await post(`/agent/requests/${requestId}/binding`, {\n api_pub: creds.apiPubHex,\n signed_body: env.signed_body,\n agent_signature: env.agent_signature,\n })) as BindingResponse;\n return toBinding(r);\n}\n\nexport async function signWalletRequest(\n post: Poster,\n requestId: string,\n intent: SignIntent,\n creds: Creds,\n binding?: BindingResponse | null,\n): Promise<Record<string, unknown>> {\n const resolved =\n binding && binding.key_id && binding.derivation_path\n ? toBinding(binding)\n : await resolveBinding(post, requestId, creds);\n const transport = (envelope: { signed_body: string; agent_signature: string }) =>\n post(`/agent/requests/${requestId}/moonx-sign`, {\n api_pub: creds.apiPubHex,\n ...envelope,\n }) as Promise<MoonxSignResult>;\n const result = await signIntent(intent, creds, resolved, transport);\n if (!result.ok) throw new Error(result.error);\n await post(`/agent/requests/${requestId}/signature`, { artifact: result.artifact });\n return result.artifact;\n}\n\nfunction isSolanaRefreshablePlan(plan: SwapPlan): boolean {\n const txs = plan.txs as Array<{ vm?: string; kind?: string }>;\n const solana = txs.some((t) => t.vm === \"solana\");\n return solana && txs.some(\n (t) => t.kind === \"swap\" || t.kind === \"prediction_trade\" || t.kind === \"jupiter_swap\",\n );\n}\n\nasync function refreshPlan(post: Poster, requestId: string): Promise<unknown> {\n const r = (await post(`/agent/requests/${requestId}/refresh`, {})) as { plan?: unknown };\n if (!r || typeof r.plan !== \"object\" || r.plan === null) {\n throw new Error(\"refresh returned no plan\");\n }\n return r.plan;\n}\n\nasync function refreshSwapPlan(post: Poster, requestId: string): Promise<SwapPlan> {\n const refreshed = (await refreshPlan(post, requestId)) as SwapPlan;\n if (!Array.isArray(refreshed.txs) || refreshed.txs.length === 0) {\n throw new Error(\"swap refresh returned a plan with no txs\");\n }\n return refreshed;\n}\n\nfunction isSolanaRailX402(plan: X402Plan): boolean {\n return plan.x402?.rail === \"solana\";\n}\n\nasync function refreshX402SolanaTx(post: Poster, requestId: string): Promise<string> {\n const refreshed = (await refreshPlan(post, requestId)) as X402Plan;\n const tx = refreshed.solana?.transaction;\n if (typeof tx !== \"string\" || tx.length === 0) {\n throw new Error(\"x402 refresh returned a plan with no Solana transaction\");\n }\n return tx;\n}\n\nexport async function signSwapRequest(\n post: Poster,\n requestId: string,\n plan: SwapPlan,\n creds: Creds,\n): Promise<void> {\n const signPlan = isSolanaRefreshablePlan(plan)\n ? await refreshSwapPlan(post, requestId)\n : plan;\n let binding: WalletBinding = {\n walletId: signPlan.binding.wallet_id,\n keyId: signPlan.binding.key_id ?? \"\",\n derivationPath: signPlan.binding.derivation_path ?? \"\",\n };\n if (binding.walletId && (!binding.keyId || !binding.derivationPath)) {\n binding = await resolveBinding(post, requestId, creds);\n }\n const envelopes: TxEnvelope[] = buildSwapEnvelopes(signPlan.txs, binding, creds);\n await post(`/agent/requests/${requestId}/envelopes`, { envelopes });\n}\n\nexport async function signX402Request(\n post: Poster,\n requestId: string,\n plan: X402Plan,\n creds: Creds,\n): Promise<void> {\n let binding: WalletBinding = {\n walletId: plan.binding.wallet_id,\n keyId: plan.binding.key_id ?? \"\",\n derivationPath: plan.binding.derivation_path ?? \"\",\n };\n if (binding.walletId && (!binding.keyId || !binding.derivationPath)) {\n binding = await resolveBinding(post, requestId, creds);\n }\n const envelope: TxEnvelope = isSolanaRailX402(plan)\n ? buildX402SolanaEnvelope(await refreshX402SolanaTx(post, requestId), binding, creds)\n : buildX402Envelope(\n plan.typed_data as Parameters<typeof buildX402Envelope>[0],\n binding,\n creds,\n );\n await post(`/agent/requests/${requestId}/envelopes`, { envelopes: [envelope] });\n}\n","\nimport { refreshTokens } from \"./auth.js\";\nimport { loadConfig, saveConfig, type OAuthTokens } from \"./config.js\";\nimport {\n credsFromToken,\n signSwapRequest,\n signWalletRequest,\n signX402Request,\n type Poster,\n} from \"./signer.js\";\nimport type {\n RequestPaymentArgs,\n RequestSecretArgs,\n RequestSwapArgs,\n RequestWalletSignArgs,\n VerifySolanaBalanceArgs as VerifySolanaBalanceWireArgs,\n} from \"./types.generated.js\";\nimport type {\n AccountChangeResult,\n AgentResponse,\n BuyLinkArgs,\n BuyLinkResult,\n ClientCredentialList,\n DiscoverServicesPage,\n DiscoverServicesOptions,\n DiscoverServicesPageOptions,\n PaymentArgs,\n PortfolioArgs,\n SecretArgs,\n ServiceSummary,\n SwapArgs,\n SwapResult,\n UseServiceArgs,\n VerifySolanaBalanceArgs,\n VerifySolanaBalanceResult,\n WalletSignArgs,\n WalletSignResult,\n WorldMarketsArgs,\n WorldPricesArgs,\n X402Args,\n X402Result,\n} from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.paybox.sh\";\nconst EXPIRY_SKEW_MS = 60_000;\n\nfunction signingResultForResponse<TPlan>(\n result: { response: AgentResponse; plan: TPlan | null },\n response: AgentResponse,\n): { response: AgentResponse; plan: TPlan | null } {\n const exposesPlan =\n response.status === \"pending_approval\" || response.status === \"pending_signature\";\n return { ...result, response, plan: exposesPlan ? result.plan : null };\n}\n\nexport function didNotHappen(r: { status?: unknown } | null | undefined): boolean {\n return r?.status === \"denied\" || r?.status === \"error\";\n}\n\nexport class PayboxError extends Error {\n constructor(\n readonly status: number,\n readonly body: string,\n context: string,\n ) {\n super(`paybox ${context} failed (${status}): ${body}`);\n this.name = \"PayboxError\";\n }\n}\n\nexport interface PayboxClientOptions {\n baseUrl?: string;\n apiKey?: string;\n token?: string;\n signingKey?: string;\n fetchImpl?: typeof fetch;\n}\n\nexport interface SignOptions {\n autoSign?: boolean;\n waitForApproval?: boolean | { intervalMs?: number; timeoutMs?: number };\n}\n\nexport class PayboxClient {\n readonly baseUrl: string;\n private readonly opts: PayboxClientOptions;\n private readonly fetchImpl: typeof fetch;\n private oauth?: OAuthTokens;\n private configBacked = false;\n\n constructor(options: PayboxClientOptions = {}) {\n this.opts = options;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.fetchImpl = options.fetchImpl ?? fetch;\n }\n\n static fromConfig(overrides: PayboxClientOptions = {}): PayboxClient {\n const cfg = loadConfig();\n const client = new PayboxClient({\n baseUrl: overrides.baseUrl ?? process.env.PAYBOX_API_URL ?? cfg.baseUrl,\n apiKey: overrides.apiKey ?? process.env.PAYBOX_API_KEY ?? cfg.apiKey,\n token: overrides.token ?? process.env.PAYBOX_ACCESS_TOKEN,\n signingKey: overrides.signingKey ?? process.env.PAYBOX_SIGNING_KEY ?? cfg.signingKey,\n fetchImpl: overrides.fetchImpl,\n });\n if (!client.opts.apiKey && !client.opts.token && cfg.oauth) {\n client.oauth = cfg.oauth;\n client.configBacked = true;\n }\n return client;\n }\n\n private signingCreds() {\n if (!this.opts.signingKey) return null;\n try {\n return credsFromToken(this.opts.signingKey);\n } catch {\n return null;\n }\n }\n\n get canSign(): boolean {\n return this.signingCreds() !== null;\n }\n\n private async bearer(): Promise<string> {\n if (this.opts.token) return this.opts.token;\n if (this.opts.apiKey) return this.opts.apiKey;\n if (this.oauth) {\n if (this.oauth.expiresAt && Date.now() > this.oauth.expiresAt - EXPIRY_SKEW_MS) {\n this.oauth = await refreshTokens(this.baseUrl, this.oauth);\n if (this.configBacked) {\n const cfg = loadConfig();\n cfg.oauth = this.oauth;\n saveConfig(cfg);\n }\n }\n return this.oauth.accessToken;\n }\n throw new Error(\n \"not authenticated — run `paybox login`, set PAYBOX_API_KEY, or pass { apiKey } / { token }\",\n );\n }\n\n private async request<T>(\n method: string,\n path: string,\n init: { query?: Record<string, string | undefined>; body?: unknown } = {},\n ): Promise<T> {\n const url = new URL(this.baseUrl + path);\n for (const [k, v] of Object.entries(init.query ?? {})) {\n if (v != null) url.searchParams.set(k, v);\n }\n const headers: Record<string, string> = { authorization: `Bearer ${await this.bearer()}` };\n let body: string | undefined;\n if (init.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n body = JSON.stringify(init.body);\n }\n const res = await this.fetchImpl(url, { method, headers, body });\n const text = await res.text();\n if (!res.ok) throw new PayboxError(res.status, text, `${method} ${path}`);\n return (text ? JSON.parse(text) : undefined) as T;\n }\n\n private readonly poster: Poster = (path, body) => this.request<unknown>(\"POST\", path, { body });\n\n listCredentials(): Promise<ClientCredentialList> {\n return this.request(\"GET\", \"/agent/grants\");\n }\n\n getPortfolio(args: PortfolioArgs): Promise<unknown> {\n return this.request(\"GET\", \"/agent/portfolio\", {\n query: { address: args.address, network_ids: args.networkIds },\n });\n }\n\n verifySolanaBalance(args: VerifySolanaBalanceArgs): Promise<VerifySolanaBalanceResult> {\n const body: VerifySolanaBalanceWireArgs = {\n address: args.address,\n token_mint: args.tokenMint,\n transaction_signature: args.transactionSignature,\n };\n return this.request(\"POST\", \"/agent/portfolio/verify-solana-balance\", { body });\n }\n\n requestPayment(args: PaymentArgs): Promise<AgentResponse> {\n const operation: RequestPaymentArgs & { type: \"payment\" } = {\n type: \"payment\",\n credential_id: args.credentialId,\n merchant: args.merchant,\n merchant_url: args.merchantUrl,\n amount_cents: args.amountCents,\n currency: args.currency ?? \"USD\",\n };\n return this.request(\"POST\", \"/agent/request\", { body: { operation } });\n }\n\n requestSecret(args: SecretArgs): Promise<AgentResponse> {\n const operation: RequestSecretArgs & { type: \"secret\" } = {\n type: \"secret\",\n credential_id: args.credentialId,\n raw: args.raw ?? false,\n purpose: args.purpose ?? null,\n };\n return this.request(\"POST\", \"/agent/request\", { body: { operation } });\n }\n\n async requestWalletSign(args: WalletSignArgs, opts: SignOptions = {}): Promise<AgentResponse> {\n return this.withExpiryRetry(\n async () => {\n const operation: RequestWalletSignArgs & { type: \"wallet_sign\" } = {\n type: \"wallet_sign\",\n credential_id: args.credentialId,\n intent: args.intent,\n };\n const { response, binding } = await this.request<WalletSignResult>(\n \"POST\",\n \"/agent/wallet-sign\",\n { body: { operation } },\n );\n const creds = this.signingCreds();\n if (\n (opts.autoSign ?? true) &&\n response.status === \"pending_signature\" &&\n creds\n ) {\n const sign = () =>\n signWalletRequest(this.poster, response.request_id, args.intent, creds, binding);\n await this.signWithReconcile(response.request_id, sign);\n return this.getRequest(response.request_id);\n }\n return response;\n },\n (r) => r,\n );\n }\n\n async requestSwap(args: SwapArgs, opts: SignOptions = {}): Promise<SwapResult> {\n return this.withExpiryRetry(\n async () => {\n const operation: RequestSwapArgs & { type: \"swap\" } = {\n type: \"swap\",\n credential_id: args.credentialId,\n src_chain: args.srcChain,\n dst_chain: args.dstChain ?? args.srcChain,\n src_token: args.srcToken,\n dst_token: args.dstToken,\n amount: args.amount,\n swap_direction: args.swapDirection ?? \"exact-amount-in\",\n slippage_bps: args.slippageBps ?? 150,\n recipient: args.recipient ?? null,\n value_cents: args.valueCents ?? null,\n };\n const result = await this.request<SwapResult>(\"POST\", \"/agent/swap\", {\n body: { operation },\n });\n return this.completeSwap(result, opts);\n },\n (r) => r.response,\n );\n }\n\n private async completeSwap(result: SwapResult, opts: SignOptions): Promise<SwapResult> {\n const creds = this.signingCreds();\n if (!(opts.autoSign ?? true) || !creds) {\n return signingResultForResponse(result, result.response);\n }\n let response = result.response;\n if (response.status === \"pending_approval\" && opts.waitForApproval) {\n response = await this.waitWhileApproval(response.request_id, opts.waitForApproval);\n }\n if (response.status !== \"pending_signature\") {\n return signingResultForResponse(result, response);\n }\n const plan = result.plan;\n if (!plan) {\n throw new Error(\"paybox returned pending_signature without a swap signing plan\");\n }\n const sign = () => signSwapRequest(this.poster, response.request_id, plan, creds);\n await this.signWithReconcile(response.request_id, sign);\n return signingResultForResponse(\n result,\n await this.requestAfterSign(response.request_id, opts.waitForApproval),\n );\n }\n\n private async waitWhileApproval(\n requestId: string,\n wait: boolean | { intervalMs?: number; timeoutMs?: number },\n ): Promise<AgentResponse> {\n const o = typeof wait === \"object\" ? wait : {};\n const interval = o.intervalMs ?? 2000;\n const deadline = Date.now() + (o.timeoutMs ?? 300_000);\n for (;;) {\n const r = await this.getRequest(requestId);\n if (r.status !== \"pending_approval\" || Date.now() > deadline) return r;\n await new Promise((res) => setTimeout(res, interval));\n }\n }\n\n private async withExpiryRetry<T>(\n run: () => Promise<T>,\n responseOf: (result: T) => AgentResponse,\n ): Promise<T> {\n const first = await run();\n const r = responseOf(first);\n if (didNotHappen(r) && r.retryable) {\n return run();\n }\n return first;\n }\n\n private async signWithReconcile(requestId: string, sign: () => Promise<unknown>): Promise<void> {\n try {\n await sign();\n } catch {\n const reconciled = await this.getRequest(requestId);\n if (reconciled.status !== \"pending_signature\") return;\n await sign();\n }\n }\n\n async discoverServices(\n query?: string,\n opts: DiscoverServicesOptions = {},\n ): Promise<ServiceSummary[]> {\n const result = await this.request<{ services: ServiceSummary[] }>(\"GET\", \"/agent/services\", {\n query: {\n query,\n network: opts.network === \"all\" ? undefined : opts.network,\n raw: opts.raw ? \"true\" : undefined,\n },\n });\n return result.services;\n }\n\n async discoverServicesPage(\n query?: string,\n opts: DiscoverServicesPageOptions = {},\n ): Promise<DiscoverServicesPage> {\n return this.request<DiscoverServicesPage>(\"GET\", \"/agent/services\", {\n query: {\n query,\n network: opts.network === \"all\" ? undefined : opts.network,\n limit: (opts.limit ?? 10).toString(),\n cursor: opts.cursor,\n raw: opts.raw ? \"true\" : undefined,\n },\n });\n }\n\n async payX402(args: X402Args, opts: SignOptions = {}): Promise<X402Result> {\n return this.withExpiryRetry(\n async () => {\n const result = await this.request<X402Result>(\"POST\", \"/agent/x402\", {\n body: {\n credential_id: args.credentialId,\n accepts: args.accepts,\n resource_url: args.resourceUrl,\n },\n });\n return this.completeX402(result, opts);\n },\n (r) => r.response,\n );\n }\n\n async useService(args: UseServiceArgs, opts: SignOptions = {}): Promise<X402Result> {\n return this.withExpiryRetry(\n async () => {\n const result = await this.request<X402Result>(\"POST\", \"/agent/use-service\", {\n body: {\n credential_id: args.credentialId,\n url: args.url,\n method: args.method,\n body: args.body,\n },\n });\n return this.completeX402(result, opts);\n },\n (r) => r.response,\n );\n }\n\n private async completeX402(result: X402Result, opts: SignOptions): Promise<X402Result> {\n const creds = this.signingCreds();\n if (!(opts.autoSign ?? true) || !creds) {\n return signingResultForResponse(result, result.response);\n }\n let response = result.response;\n if (response.status === \"pending_approval\" && opts.waitForApproval) {\n response = await this.waitWhileApproval(response.request_id, opts.waitForApproval);\n }\n if (response.status !== \"pending_signature\") {\n return signingResultForResponse(result, response);\n }\n const plan = result.plan;\n if (!plan) {\n throw new Error(\"paybox returned pending_signature without an x402 signing plan\");\n }\n const sign = () => signX402Request(this.poster, response.request_id, plan, creds);\n await this.signWithReconcile(response.request_id, sign);\n return signingResultForResponse(\n result,\n await this.requestAfterSign(response.request_id, opts.waitForApproval),\n );\n }\n\n claimPaymentCredentials(requestId: string): Promise<Record<string, unknown>> {\n return this.request(\"POST\", `/agent/requests/${requestId}/credentials`);\n }\n\n requestAccountChange(note?: string): Promise<AccountChangeResult> {\n return this.request(\"POST\", \"/agent/account-change\", { body: { note } });\n }\n\n getBuyLink(args: BuyLinkArgs): Promise<BuyLinkResult> {\n return this.request(\"GET\", \"/agent/buy-link\", {\n query: {\n credential_id: args.credentialId,\n destination_chain: args.destinationChain,\n currency_code: args.currencyCode,\n amount_usd: args.amountUsd?.toString(),\n },\n });\n }\n\n\n worldMarkets(args: WorldMarketsArgs = {}): Promise<unknown> {\n return this.request(\"GET\", \"/agent/world/markets\", {\n query: {\n events: args.events ? \"true\" : undefined,\n limit: args.limit?.toString(),\n cursor: args.cursor?.toString(),\n event_ticker: args.eventTicker,\n series_ticker: args.seriesTicker,\n status: args.status,\n },\n });\n }\n\n worldMarket(eventTicker: string, withNestedMarkets = true): Promise<unknown> {\n return this.request(\"GET\", \"/agent/world/market\", {\n query: {\n event_ticker: eventTicker,\n with_nested_markets: withNestedMarkets ? undefined : \"false\",\n },\n });\n }\n\n worldOrderbook(id: string, byMint = false): Promise<unknown> {\n return this.request(\"GET\", \"/agent/world/orderbook\", {\n query: { id, by_mint: byMint ? \"true\" : undefined },\n });\n }\n\n worldPrices(args: WorldPricesArgs): Promise<unknown> {\n return this.request(\"GET\", \"/agent/world/prices\", {\n query: {\n ticker: args.ticker,\n start_ts: args.startTs.toString(),\n end_ts: args.endTs.toString(),\n resolution: args.resolution?.toString(),\n },\n });\n }\n\n worldFilterOutcomeMints(addresses: string[]): Promise<unknown> {\n return this.request(\"POST\", \"/agent/world/filter-outcome-mints\", {\n body: { addresses },\n });\n }\n\n worldPositions(address: string): Promise<unknown> {\n return this.request(\"GET\", \"/agent/world/positions\", { query: { address } });\n }\n\n\n hyperliquidMarkets(): Promise<unknown> {\n return this.request(\"GET\", \"/agent/hyperliquid/markets\");\n }\n\n hyperliquidPrices(): Promise<unknown> {\n return this.request(\"GET\", \"/agent/hyperliquid/prices\");\n }\n\n hyperliquidToken(name: string): Promise<unknown> {\n return this.request(\"GET\", \"/agent/hyperliquid/token\", { query: { name } });\n }\n\n getRequest(requestId: string): Promise<AgentResponse> {\n return this.request(\"GET\", `/agent/requests/${requestId}`);\n }\n\n private requestAfterSign(\n requestId: string,\n wait: SignOptions[\"waitForApproval\"],\n ): Promise<AgentResponse> {\n if (!wait) return this.getRequest(requestId);\n return this.waitForRequest(requestId, typeof wait === \"object\" ? wait : {});\n }\n\n async waitForRequest(\n requestId: string,\n opts: { intervalMs?: number; timeoutMs?: number } = {},\n ): Promise<AgentResponse> {\n const interval = opts.intervalMs ?? 2000;\n const deadline = Date.now() + (opts.timeoutMs ?? 300_000);\n for (;;) {\n const r = await this.getRequest(requestId);\n const pending =\n r.status === \"pending_approval\" ||\n r.status === \"pending_signature\" ||\n r.status === \"pending_settlement\" ||\n r.status === \"pending_confirmation\";\n if (!pending || Date.now() > deadline) return r;\n await new Promise((res) => setTimeout(res, interval));\n }\n }\n}\n"],"mappings":"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","names":["Buffer","Buffer"]}