accounts 0.16.2 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +3 -4
  3. package/dist/cli/Provider.d.ts +1 -1
  4. package/dist/cli/Provider.d.ts.map +1 -1
  5. package/dist/cli/Provider.js +3 -3
  6. package/dist/cli/Provider.js.map +1 -1
  7. package/dist/cli/adapter.d.ts +13 -8
  8. package/dist/cli/adapter.d.ts.map +1 -1
  9. package/dist/cli/adapter.js +92 -303
  10. package/dist/cli/adapter.js.map +1 -1
  11. package/dist/core/adapters/deviceCode/deviceCode.d.ts +59 -0
  12. package/dist/core/adapters/deviceCode/deviceCode.d.ts.map +1 -0
  13. package/dist/core/adapters/deviceCode/deviceCode.js +93 -0
  14. package/dist/core/adapters/deviceCode/deviceCode.js.map +1 -0
  15. package/dist/core/adapters/deviceCode/index.d.ts +3 -0
  16. package/dist/core/adapters/deviceCode/index.d.ts.map +1 -0
  17. package/dist/core/adapters/deviceCode/index.js +3 -0
  18. package/dist/core/adapters/deviceCode/index.js.map +1 -0
  19. package/dist/core/adapters/deviceCode/tempoWallet.d.ts +9 -0
  20. package/dist/core/adapters/deviceCode/tempoWallet.d.ts.map +1 -0
  21. package/dist/core/adapters/deviceCode/tempoWallet.js +11 -0
  22. package/dist/core/adapters/deviceCode/tempoWallet.js.map +1 -0
  23. package/dist/core/adapters/internal/fromRequest.d.ts +10 -0
  24. package/dist/core/adapters/internal/fromRequest.d.ts.map +1 -1
  25. package/dist/core/adapters/internal/fromRequest.js +4 -2
  26. package/dist/core/adapters/internal/fromRequest.js.map +1 -1
  27. package/dist/server/CliAuth.d.ts +69 -1
  28. package/dist/server/CliAuth.d.ts.map +1 -1
  29. package/dist/server/CliAuth.js +6 -1
  30. package/dist/server/CliAuth.js.map +1 -1
  31. package/dist/server/Handler.d.ts +2 -1
  32. package/dist/server/Handler.d.ts.map +1 -1
  33. package/dist/server/Handler.js +2 -1
  34. package/dist/server/Handler.js.map +1 -1
  35. package/dist/server/index.d.ts +1 -0
  36. package/dist/server/index.d.ts.map +1 -1
  37. package/dist/server/index.js +1 -0
  38. package/dist/server/index.js.map +1 -1
  39. package/dist/server/internal/handlers/codeAuth.d.ts +1 -0
  40. package/dist/server/internal/handlers/codeAuth.d.ts.map +1 -1
  41. package/dist/server/internal/handlers/codeAuth.js +1 -0
  42. package/dist/server/internal/handlers/codeAuth.js.map +1 -1
  43. package/dist/server/internal/handlers/deviceCode.d.ts +60 -0
  44. package/dist/server/internal/handlers/deviceCode.d.ts.map +1 -0
  45. package/dist/server/internal/handlers/deviceCode.js +218 -0
  46. package/dist/server/internal/handlers/deviceCode.js.map +1 -0
  47. package/package.json +7 -1
  48. package/src/cli/Provider.localnet.test.ts +414 -470
  49. package/src/cli/Provider.test-d.ts +4 -3
  50. package/src/cli/Provider.ts +6 -6
  51. package/src/cli/adapter.ts +111 -380
  52. package/src/core/adapters/deviceCode/deviceCode.localnet.test.ts +226 -0
  53. package/src/core/adapters/deviceCode/deviceCode.test-d.ts +19 -0
  54. package/src/core/adapters/deviceCode/deviceCode.ts +157 -0
  55. package/src/core/adapters/deviceCode/index.ts +2 -0
  56. package/src/core/adapters/deviceCode/tempoWallet.ts +17 -0
  57. package/src/core/adapters/internal/fromRequest.ts +115 -88
  58. package/src/server/CliAuth.test.ts +29 -18
  59. package/src/server/CliAuth.ts +10 -2
  60. package/src/server/Handler.test-d.ts +19 -33
  61. package/src/server/Handler.ts +2 -1
  62. package/src/server/index.ts +1 -0
  63. package/src/server/internal/handlers/codeAuth.ts +1 -0
  64. package/src/server/internal/handlers/deviceCode.test.ts +140 -0
  65. package/src/server/internal/handlers/deviceCode.ts +323 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # accounts
2
2
 
3
+ ## 0.17.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 9e77565: Rewrote `accounts/cli` onto the Wata device-code transport and deprecated `CliAuth` and `Handler.codeAuth` in favor of `Handler.deviceCode`.
8
+
9
+ ```diff
10
+ - Provider.create({
11
+ - host: 'https://wallet.example.com/api/auth/cli',
12
+ - pollIntervalMs: 1000,
13
+ - timeoutMs: 60_000,
14
+ - })
15
+ + Provider.create({
16
+ + host: 'https://wallet.example.com/auth/device',
17
+ + pollingInterval: 1000,
18
+ + timeout: 60_000,
19
+ + })
20
+ ```
21
+
22
+ - 9e77565: Added a `deviceCode` adapter (`accounts/deviceCode`) that forwards wallet RPC through the Wata device-code transport (RFC 8628 with PKCE), with a `tempoWallet` preset.
23
+
24
+ ```ts
25
+ import { deviceCode } from "accounts/deviceCode";
26
+
27
+ const adapter = deviceCode({
28
+ name: "Example CLI",
29
+ onPrompt: ({ userCode, verificationUriFull }) =>
30
+ console.log(userCode, verificationUriFull),
31
+ rdns: "com.example.cli",
32
+ url: "https://wallet.tempo.xyz/auth/device",
33
+ });
34
+ ```
35
+
3
36
  ## 0.16.2
4
37
 
5
38
  ### Patch Changes
package/README.md CHANGED
@@ -105,10 +105,9 @@ Set `VITE_BASE_URL` to the production docs origin when using a custom domain.
105
105
 
106
106
  The `ref-impls/` directory contains reference implementations for building with Tempo Accounts SDK:
107
107
 
108
- | Directory | Description |
109
- | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
110
- | `ref-impls/dialog/` | Minimal, unstyled embed dialog app demonstrating how to build a custom embed using the `Remote` API. Select `dialogRefImpl` in the web playground's adapter dropdown to test against it. |
111
- | `ref-impls/cli-auth/` | Minimal React + Cloudflare/Vite host reference for device-code CLI auth: built-in code-auth endpoints plus a single unstyled approval screen and local smoke client. |
108
+ | Directory | Description |
109
+ | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
110
+ | `ref-impls/dialog/` | Minimal, unstyled embed dialog app demonstrating how to build a custom embed using the `Remote` API. Select `dialogRefImpl` in the web playground's adapter dropdown to test against it. |
112
111
 
113
112
  ## License
114
113
 
@@ -7,7 +7,7 @@ import { cli } from './adapter.js';
7
7
  export declare function create(options: create.Options): create.ReturnType;
8
8
  export declare namespace create {
9
9
  type Options = Omit<CoreProvider.create.Options & cli.Options, 'adapter' | 'authorizeAccessKey' | 'host'> & {
10
- /** Host URL for the device-code flow. @default "https://wallet.tempo.xyz/api/auth/cli" */
10
+ /** Base URL of the wallet's device-code endpoints. @default "https://wallet.tempo.xyz/auth/device" */
11
11
  host?: string | undefined;
12
12
  };
13
13
  type ReturnType = CoreProvider.create.ReturnType;
@@ -1 +1 @@
1
- {"version":3,"file":"Provider.d.ts","sourceRoot":"","sources":["../../src/cli/Provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAGlC;;;GAGG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CA4BjE;AAED,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,KAAY,OAAO,GAAG,IAAI,CACxB,YAAY,CAAC,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,EACzC,SAAS,GAAG,oBAAoB,GAAG,MAAM,CAC1C,GAAG;QACF,0FAA0F;QAC1F,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC1B,CAAA;IACD,KAAY,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,UAAU,CAAA;CACxD"}
1
+ {"version":3,"file":"Provider.d.ts","sourceRoot":"","sources":["../../src/cli/Provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAGlC;;;GAGG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CA4BjE;AAED,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,KAAY,OAAO,GAAG,IAAI,CACxB,YAAY,CAAC,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,EACzC,SAAS,GAAG,oBAAoB,GAAG,MAAM,CAC1C,GAAG;QACF,sGAAsG;QACtG,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC1B,CAAA;IACD,KAAY,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,UAAU,CAAA;CACxD"}
@@ -6,7 +6,7 @@ import * as Storage from './storage.js';
6
6
  * device-code flow.
7
7
  */
8
8
  export function create(options) {
9
- const { host = 'https://wallet.tempo.xyz/api/auth/cli', open, pollIntervalMs, storage = Storage.filesystem(), timeoutMs, ...rest } = options;
9
+ const { host = 'https://wallet.tempo.xyz/auth/device', open, pollingInterval, storage = Storage.filesystem(), timeout, ...rest } = options;
10
10
  // CLI defaults `mode` to `'pull'` (local account friendly path).
11
11
  const mpp = (() => {
12
12
  if (!options.mpp)
@@ -20,8 +20,8 @@ export function create(options) {
20
20
  adapter: cli({
21
21
  host,
22
22
  ...(open ? { open } : {}),
23
- ...(typeof pollIntervalMs !== 'undefined' ? { pollIntervalMs } : {}),
24
- ...(typeof timeoutMs !== 'undefined' ? { timeoutMs } : {}),
23
+ ...(pollingInterval !== undefined ? { pollingInterval } : {}),
24
+ ...(timeout !== undefined ? { timeout } : {}),
25
25
  }),
26
26
  ...(mpp ? { mpp } : {}),
27
27
  storage,
@@ -1 +1 @@
1
- {"version":3,"file":"Provider.js","sourceRoot":"","sources":["../../src/cli/Provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAClC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AAEvC;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,OAAuB;IAC5C,MAAM,EACJ,IAAI,GAAG,uCAAuC,EAC9C,IAAI,EACJ,cAAc,EACd,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,EAC9B,SAAS,EACT,GAAG,IAAI,EACR,GAAG,OAAO,CAAA;IAEX,iEAAiE;IACjE,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE;QAChB,IAAI,CAAC,OAAO,CAAC,GAAG;YAAE,OAAO,SAAS,CAAA;QAClC,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ;YAAE,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;QACrF,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,CAAA;IAClC,CAAC,CAAC,EAAE,CAAA;IAEJ,OAAO,YAAY,CAAC,MAAM,CAAC;QACzB,GAAG,IAAI;QACP,OAAO,EAAE,GAAG,CAAC;YACX,IAAI;YACJ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,OAAO,cAAc,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,GAAG,CAAC,OAAO,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3D,CAAC;QACF,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvB,OAAO;KACR,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"Provider.js","sourceRoot":"","sources":["../../src/cli/Provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAClC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AAEvC;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,OAAuB;IAC5C,MAAM,EACJ,IAAI,GAAG,sCAAsC,EAC7C,IAAI,EACJ,eAAe,EACf,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,EAC9B,OAAO,EACP,GAAG,IAAI,EACR,GAAG,OAAO,CAAA;IAEX,iEAAiE;IACjE,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE;QAChB,IAAI,CAAC,OAAO,CAAC,GAAG;YAAE,OAAO,SAAS,CAAA;QAClC,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ;YAAE,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;QACrF,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,CAAA;IAClC,CAAC,CAAC,EAAE,CAAA;IAEJ,OAAO,YAAY,CAAC,MAAM,CAAC;QACzB,GAAG,IAAI;QACP,OAAO,EAAE,GAAG,CAAC;YACX,IAAI;YACJ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CAAC;QACF,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvB,OAAO;KACR,CAAC,CAAA;AACJ,CAAC"}
@@ -1,22 +1,27 @@
1
- import * as Adapter from '../core/Adapter.js';
1
+ import type { DeviceCode } from 'wata';
2
+ import type * as Adapter from '../core/Adapter.js';
2
3
  /**
3
- * Creates a CLI bootstrap adapter backed by the device code protocol.
4
+ * Creates a CLI bootstrap adapter backed by the Wata device-code transport
5
+ * (OAuth 2.0 Device Authorization Grant, RFC 8628 with PKCE).
6
+ *
7
+ * Authorization opens the wallet's verification page in a browser; the wallet
8
+ * responds with a signed key authorization once the user approves.
4
9
  */
5
10
  export declare function cli(options: cli.Options): Adapter.Adapter;
6
11
  export declare namespace cli {
7
12
  type Options = {
8
- /** Host URL for the device code flow. API calls are made under the same base path. */
13
+ /** Base URL of the wallet's device-code endpoints (derives `/register` and `/token`). */
9
14
  host: string;
10
15
  /** Provider display name. @default "Tempo CLI" */
11
16
  name?: string | undefined;
12
17
  /** Browser opener override. */
13
- open?: ((url: string) => Promise<void> | void) | undefined;
14
- /** Poll interval in milliseconds. @default 2000 */
15
- pollIntervalMs?: number | undefined;
18
+ open?: ((url: string, prompt: DeviceCode.Prompt) => Promise<void> | void) | undefined;
19
+ /** Poll cadence override in milliseconds. Defaults to the host-advertised interval. */
20
+ pollingInterval?: number | undefined;
16
21
  /** Reverse-DNS provider identifier. @default "xyz.tempo.cli" */
17
22
  rdns?: string | undefined;
18
- /** Poll timeout in milliseconds. @default 300000 */
19
- timeoutMs?: number | undefined;
23
+ /** Overall wait for user approval in milliseconds. @default 300000 */
24
+ timeout?: number | undefined;
20
25
  };
21
26
  }
22
27
  //# sourceMappingURL=adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/cli/adapter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAA;AAI7C;;GAEG;AACH,wBAAgB,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CA6SzD;AAED,MAAM,CAAC,OAAO,WAAW,GAAG,CAAC;IAC3B,KAAY,OAAO,GAAG;QACpB,sFAAsF;QACtF,IAAI,EAAE,MAAM,CAAA;QACZ,kDAAkD;QAClD,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB,+BAA+B;QAC/B,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,CAAA;QAC1D,mDAAmD;QACnD,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACnC,gEAAgE;QAChE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB,oDAAoD;QACpD,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC/B,CAAA;CACF"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/cli/adapter.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AAGtC,OAAO,KAAK,KAAK,OAAO,MAAM,oBAAoB,CAAA;AAKlD;;;;;;GAMG;AACH,wBAAgB,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CA4GzD;AAED,MAAM,CAAC,OAAO,WAAW,GAAG,CAAC;IAC3B,KAAY,OAAO,GAAG;QACpB,yFAAyF;QACzF,IAAI,EAAE,MAAM,CAAA;QACZ,kDAAkD;QAClD,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB,+BAA+B;QAC/B,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,CAAA;QACrF,uFAAuF;QACvF,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACpC,gEAAgE;QAChE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB,sEAAsE;QACtE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC7B,CAAA;CACF"}
@@ -1,299 +1,115 @@
1
1
  import { spawn } from 'node:child_process';
2
- import { setTimeout as sleep } from 'node:timers/promises';
3
- import { Base64, Hash, Hex, Provider as core_Provider, RpcResponse } from 'ox';
2
+ import { Provider as core_Provider } from 'ox';
4
3
  import { KeyAuthorization } from 'ox/tempo';
4
+ import { hashMessage, hashTypedData } from 'viem';
5
5
  import * as z from 'zod/mini';
6
- import * as Adapter from '../core/Adapter.js';
6
+ import { deviceCode } from '../core/adapters/deviceCode/deviceCode.js';
7
7
  import * as Keystore from '../core/Keystore.js';
8
- import * as CliAuth from '../server/CliAuth.js';
8
+ import * as Rpc from '../core/zod/rpc.js';
9
9
  /**
10
- * Creates a CLI bootstrap adapter backed by the device code protocol.
10
+ * Creates a CLI bootstrap adapter backed by the Wata device-code transport
11
+ * (OAuth 2.0 Device Authorization Grant, RFC 8628 with PKCE).
12
+ *
13
+ * Authorization opens the wallet's verification page in a browser; the wallet
14
+ * responds with a signed key authorization once the user approves.
11
15
  */
12
16
  export function cli(options) {
13
- const { name = 'Tempo CLI', rdns = 'xyz.tempo.cli' } = options;
14
- return Adapter.define({ name, rdns }, ({ getClient, store }) => {
15
- // The CLI persists to string-based filesystem storage, so its p256
16
- // default opts into an extractable WebCrypto key (a non-extractable one
17
- // could not survive a restart). secp256k1 stays available for explicit
18
- // requests. Shared between the device code ceremony and the instance
19
- // declaration so records hydrate through the same keystores.
20
- const keystores = {
21
- p256: Keystore.webCryptoP256({ extractable: true }),
22
- secp256k1: Keystore.secp256k1(),
23
- };
24
- async function saveGeneratedAccessKey(address, accessKey, keyAuthorization) {
25
- const signed = KeyAuthorization.fromRpc(z.encode(CliAuth.keyAuthorization, keyAuthorization));
26
- store.accessKeys.add({
27
- account: address,
28
- authorization: signed,
29
- handle: accessKey.handle,
30
- publicKey: accessKey.publicKey,
31
- });
32
- }
33
- async function authorize(request) {
34
- const { host, open = defaultOpen, pollIntervalMs = 2_000, timeoutMs = 5 * 60 * 1_000, } = options;
35
- const { account, authorizeAccessKey, method } = request;
36
- // p256 by default; secp256k1 only when explicitly requested.
37
- const generatedKeyType = authorizeAccessKey?.keyType === 'secp256k1' ? 'secp256k1' : 'p256';
38
- const generatedAccessKey = authorizeAccessKey && !authorizeAccessKey.publicKey && !authorizeAccessKey.address
39
- ? await keystores[generatedKeyType].createKey()
40
- : undefined;
41
- const publicKey = authorizeAccessKey?.publicKey ?? generatedAccessKey?.publicKey;
42
- const keyType = authorizeAccessKey?.keyType ?? (generatedAccessKey ? generatedKeyType : undefined);
43
- if (!publicKey)
44
- throw new RpcResponse.InvalidParamsError({
45
- message: method === 'wallet_connect'
46
- ? '`wallet_connect` on the CLI adapter requires `capabilities.authorizeAccessKey`.'
47
- : '`wallet_authorizeAccessKey` on the CLI adapter requires key parameters.',
48
- });
49
- const codeVerifier = createCodeVerifier();
50
- const codeChallenge = createCodeChallenge(codeVerifier);
51
- const body = {
52
- ...(account ? { account } : {}),
53
- chainId: BigInt(store.getState().chainId),
54
- codeChallenge,
55
- ...(typeof authorizeAccessKey?.expiry !== 'undefined'
56
- ? { expiry: authorizeAccessKey.expiry }
57
- : {}),
58
- ...(keyType ? { keyType } : {}),
59
- ...(authorizeAccessKey?.limits ? { limits: authorizeAccessKey.limits } : {}),
60
- pubKey: publicKey,
61
- ...(request.showDeposit !== undefined ? { showDeposit: request.showDeposit } : {}),
62
- };
63
- const created = await post({
64
- body,
65
- request: CliAuth.createRequest,
66
- response: CliAuth.createResponse,
67
- url: getApiUrl(host, 'code'),
68
- });
69
- const url = getBrowserUrl(host, created.code);
70
- try {
71
- await open(url);
72
- }
73
- catch (error) {
74
- throw new OpenError(url, created.code, error);
75
- }
76
- const startedAt = Date.now();
77
- while (Date.now() - startedAt < timeoutMs) {
78
- const result = await post({
79
- body: {
80
- codeVerifier,
81
- },
82
- request: CliAuth.pollRequest,
83
- response: CliAuth.pollResponse,
84
- url: getApiUrl(host, `poll/${created.code}`),
85
- });
86
- if (result.status === 'pending') {
87
- await sleep(pollIntervalMs);
88
- continue;
89
- }
90
- if (result.status === 'expired')
91
- throw new Error('Device code expired before authorization completed.');
92
- if (result.action === 'updateAccessKey')
93
- throw new Error('Device code action does not match the authorization request.');
94
- if (generatedAccessKey)
95
- await saveGeneratedAccessKey(result.accountAddress, generatedAccessKey, result.keyAuthorization);
96
- return result;
97
- }
98
- throw new TimeoutError(url, created.code);
99
- }
100
- async function update(parameters) {
101
- const { host, open = defaultOpen, pollIntervalMs = 2_000, timeoutMs = 5 * 60 * 1_000, } = options;
102
- const chainId = Number(parameters.chainId ?? store.getState().chainId);
103
- const current = store.accessKeys.list({
104
- accessKey: parameters.accessKeyAddress,
105
- account: parameters.address,
106
- chainId,
107
- })[0];
108
- const status = current?.keyAuthorization
109
- ? await store.accessKeys.getStatus({
110
- accessKey: parameters.accessKeyAddress,
111
- account: parameters.address,
112
- chainId,
113
- client: getClient({ chainId }),
114
- })
115
- : undefined;
116
- const pendingKeyAuthorization = status === 'pending' && current?.keyAuthorization
117
- ? KeyAuthorization.toRpc(current.keyAuthorization)
118
- : undefined;
119
- const codeVerifier = createCodeVerifier();
120
- const body = {
121
- action: 'updateAccessKey',
122
- accessKeyAddress: parameters.accessKeyAddress,
123
- account: parameters.address,
124
- chainId: BigInt(chainId),
125
- codeChallenge: createCodeChallenge(codeVerifier),
126
- ...(pendingKeyAuthorization
127
- ? {
128
- keyAuthorization: z.decode(CliAuth.keyAuthorization, {
129
- ...pendingKeyAuthorization,
130
- address: pendingKeyAuthorization.keyId,
131
- }),
132
- }
133
- : {}),
134
- limits: parameters.limits,
135
- };
136
- const created = await post({
137
- body,
138
- request: CliAuth.createRequest,
139
- response: CliAuth.createResponse,
140
- url: getApiUrl(host, 'code'),
141
- });
142
- const url = getBrowserUrl(host, created.code);
143
- try {
144
- await open(url);
145
- }
146
- catch (error) {
147
- throw new OpenError(url, created.code, error);
148
- }
149
- const startedAt = Date.now();
150
- while (Date.now() - startedAt < timeoutMs) {
151
- const result = await post({
152
- body: { codeVerifier },
153
- request: CliAuth.pollRequest,
154
- response: CliAuth.pollResponse,
155
- url: getApiUrl(host, `poll/${created.code}`),
17
+ const { host, name = 'Tempo CLI', open = defaultOpen, pollingInterval, rdns = 'xyz.tempo.cli', timeout, } = options;
18
+ return deviceCode({
19
+ actions: ({ getClient, request, store }) => {
20
+ async function getAccessKey(address) {
21
+ const account = await store.accessKeys.select({
22
+ account: address,
23
+ chainId: store.getState().chainId,
156
24
  });
157
- if (result.status === 'pending') {
158
- await sleep(pollIntervalMs);
159
- continue;
160
- }
161
- if (result.status === 'expired')
162
- throw new Error('Device code expired before access key update completed.');
163
- if (result.action !== 'updateAccessKey')
164
- throw new Error('Device code action does not match the access key update request.');
165
- if (result.keyAuthorization) {
166
- store.accessKeys.updateAuthorization({
167
- accessKey: parameters.accessKeyAddress,
168
- account: parameters.address,
169
- authorization: KeyAuthorization.fromRpc(z.encode(CliAuth.keyAuthorization, result.keyAuthorization)),
170
- chainId,
25
+ if (!account)
26
+ throw new core_Provider.UnauthorizedError({
27
+ message: `Account "${address}" cannot sign with an access key.`,
171
28
  });
172
- }
173
- return;
29
+ return account;
174
30
  }
175
- throw new TimeoutError(url, created.code);
176
- }
177
- return {
178
- actions: {
179
- async authorizeAccessKey(parameters) {
180
- const { accounts, activeAccount } = store.getState();
181
- const account = accounts[activeAccount]?.address;
182
- const result = await authorize({
183
- ...(account ? { account } : {}),
184
- authorizeAccessKey: parameters,
185
- method: 'wallet_authorizeAccessKey',
186
- ...(parameters.showDeposit !== undefined
187
- ? { showDeposit: parameters.showDeposit }
188
- : {}),
189
- });
190
- if (!account)
191
- store.setState({
192
- accounts: [{ address: result.accountAddress }],
193
- activeAccount: 0,
194
- });
195
- return {
196
- keyAuthorization: z.encode(CliAuth.keyAuthorization, result.keyAuthorization),
197
- rootAddress: result.accountAddress,
198
- };
31
+ return {
32
+ async signPersonalMessage(parameters) {
33
+ const account = await getAccessKey(parameters.address);
34
+ return await account.sign({ hash: hashMessage({ raw: parameters.data }) });
199
35
  },
200
- async createAccount(parameters) {
201
- if (parameters?.digest)
202
- throw unsupported('`wallet_connect` digest signing not supported by CLI adapter.');
203
- const result = await authorize({
204
- authorizeAccessKey: parameters?.authorizeAccessKey,
205
- method: 'wallet_connect',
206
- ...(parameters?.showDeposit !== undefined
207
- ? { showDeposit: parameters.showDeposit }
208
- : {}),
36
+ async signTypedData(parameters) {
37
+ const account = await getAccessKey(parameters.address);
38
+ return await account.sign({
39
+ hash: hashTypedData(JSON.parse(parameters.data)),
209
40
  });
210
- return {
211
- accounts: [
212
- {
213
- address: result.accountAddress,
214
- capabilities: {},
215
- },
216
- ],
217
- keyAuthorization: z.encode(CliAuth.keyAuthorization, result.keyAuthorization),
218
- };
219
41
  },
220
- async loadAccounts(parameters) {
221
- if (parameters?.digest)
222
- throw unsupported('`wallet_connect` digest signing not supported by CLI adapter.');
223
- const result = await authorize({
224
- authorizeAccessKey: parameters?.authorizeAccessKey,
225
- method: 'wallet_connect',
226
- ...(parameters?.showDeposit !== undefined
227
- ? { showDeposit: parameters.showDeposit }
228
- : {}),
42
+ // Limit updates run their own ceremony: the wallet returns a
43
+ // replacement signed authorization for a pending (unpublished) key,
44
+ // or applies the update on-chain for a published one.
45
+ async updateAccessKey(parameters) {
46
+ const chainId = Number(parameters.chainId ?? store.getState().chainId);
47
+ const current = store.accessKeys.list({
48
+ accessKey: parameters.accessKeyAddress,
49
+ account: parameters.address,
50
+ chainId,
51
+ })[0];
52
+ const status = current?.keyAuthorization
53
+ ? await store.accessKeys.getStatus({
54
+ accessKey: parameters.accessKeyAddress,
55
+ account: parameters.address,
56
+ chainId,
57
+ client: getClient({ chainId }),
58
+ })
59
+ : undefined;
60
+ const pendingKeyAuthorization = status === 'pending' && current?.keyAuthorization
61
+ ? KeyAuthorization.toRpc(current.keyAuthorization)
62
+ : undefined;
63
+ const encoded = z.encode(Rpc.wallet_updateAccessKey.parameters, {
64
+ ...parameters,
65
+ chainId: BigInt(chainId),
229
66
  });
230
- return {
231
- accounts: [
67
+ const result = (await request({
68
+ context: { account: parameters.address, chainId },
69
+ method: 'wallet_updateAccessKey',
70
+ params: [
232
71
  {
233
- address: result.accountAddress,
234
- capabilities: {},
72
+ ...encoded,
73
+ ...(pendingKeyAuthorization ? { keyAuthorization: pendingKeyAuthorization } : {}),
235
74
  },
236
75
  ],
237
- keyAuthorization: z.encode(CliAuth.keyAuthorization, result.keyAuthorization),
238
- };
239
- },
240
- async revokeAccessKey() {
241
- throw unsupported('`wallet_revokeAccessKey` not supported by CLI adapter.');
242
- },
243
- async updateAccessKey(parameters) {
244
- await update(parameters);
76
+ }));
77
+ if (result?.keyAuthorization)
78
+ store.accessKeys.updateAuthorization({
79
+ accessKey: parameters.accessKeyAddress,
80
+ account: parameters.address,
81
+ authorization: KeyAuthorization.fromRpc(result.keyAuthorization),
82
+ chainId,
83
+ });
245
84
  },
246
- },
247
- async getAccount(options = {}) {
248
- const { accounts, activeAccount, chainId } = store.getState();
249
- const address = options.address ?? accounts[activeAccount]?.address;
250
- if (!address)
251
- throw new core_Provider.DisconnectedError({ message: 'No active account.' });
252
- const account = await store.accessKeys.select({ account: address, chainId });
253
- if (!account)
254
- throw new core_Provider.UnauthorizedError({
255
- message: `Account "${address}" cannot sign with an access key.`,
256
- });
257
- return { account };
258
- },
259
- accessKey: { keystores },
260
- };
261
- });
262
- }
263
- class OpenError extends Error {
264
- code;
265
- cause;
266
- url;
267
- constructor(url, code, cause) {
268
- super(`Failed to open browser for device code ${formatCode(code)}. Open ${url} manually.`);
269
- this.name = 'OpenError';
270
- this.code = code;
271
- this.cause = cause;
272
- this.url = url;
273
- }
274
- }
275
- class TimeoutError extends Error {
276
- code;
277
- url;
278
- constructor(url, code) {
279
- super(`Timed out waiting for device code ${formatCode(code)}. Continue at ${url}.`);
280
- this.name = 'TimeoutError';
281
- this.code = code;
282
- this.url = url;
283
- }
284
- }
285
- function createCodeChallenge(codeVerifier) {
286
- return Base64.fromBytes(Hash.sha256(Hex.fromString(codeVerifier), { as: 'Bytes' }), {
287
- pad: false,
288
- url: true,
85
+ };
86
+ },
87
+ // The CLI persists to string-based filesystem storage, so its p256
88
+ // default opts into an extractable WebCrypto key (a non-extractable one
89
+ // could not survive a restart). secp256k1 stays available for explicit
90
+ // requests.
91
+ keystores: {
92
+ p256: Keystore.webCryptoP256({ extractable: true }),
93
+ secp256k1: Keystore.secp256k1(),
94
+ },
95
+ meta: { name },
96
+ // Only the ceremonies (bootstrap and limit updates) open a browser;
97
+ // everything else signs locally with the stored access key or fails fast.
98
+ methods: ['wallet_connect', 'wallet_authorizeAccessKey', 'wallet_updateAccessKey'],
99
+ name,
100
+ async onPrompt(prompt) {
101
+ if (!prompt.verificationUriFull) {
102
+ const code = prompt.userCode.replace(/^(.{4})(.{4})$/, '$1-$2');
103
+ process.stdout.write(`Enter code ${code} at ${prompt.verificationUri}\n`);
104
+ }
105
+ await open(prompt.verificationUriFull ?? prompt.verificationUri, prompt);
106
+ },
107
+ rdns,
108
+ ...(pollingInterval !== undefined ? { pollingInterval } : {}),
109
+ ...(timeout !== undefined ? { timeout } : {}),
110
+ url: host,
289
111
  });
290
112
  }
291
- function createCodeVerifier() {
292
- return Base64.fromBytes(Hex.toBytes(Hex.random(32)), { pad: false, url: true });
293
- }
294
- function formatCode(code) {
295
- return code.length === 8 ? `${code.slice(0, 4)}-${code.slice(4)}` : code;
296
- }
297
113
  function defaultOpen(url) {
298
114
  const command = process.platform === 'darwin'
299
115
  ? { command: 'open', args: [url] }
@@ -306,31 +122,4 @@ function defaultOpen(url) {
306
122
  });
307
123
  child.unref();
308
124
  }
309
- function getApiUrl(serviceUrl, path) {
310
- const url = new URL(serviceUrl);
311
- url.pathname = `${url.pathname.replace(/\/$/, '')}/${path.replace(/^\//, '')}`;
312
- url.search = '';
313
- return url.toString();
314
- }
315
- function getBrowserUrl(serviceUrl, code) {
316
- const url = new URL(serviceUrl);
317
- url.searchParams.set('code', code);
318
- return url.toString();
319
- }
320
- async function post(options) {
321
- const result = await fetch(options.url, {
322
- body: JSON.stringify(z.encode(options.request, options.body)),
323
- headers: { 'content-type': 'application/json' },
324
- method: 'POST',
325
- });
326
- const json = (await result.json().catch(() => ({})));
327
- if (!result.ok) {
328
- const error = json.error;
329
- throw new Error(typeof error === 'string' ? error : `Request failed: ${result.status}`);
330
- }
331
- return z.decode(options.response, json);
332
- }
333
- function unsupported(message) {
334
- return new core_Provider.UnsupportedMethodError({ message });
335
- }
336
125
  //# sourceMappingURL=adapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/cli/adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/cli/adapter.ts"],"names":[],"mappings":"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"}