accounts 0.4.14 → 0.4.16

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 (55) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +8 -8
  3. package/dist/cli/Provider.d.ts +4 -1
  4. package/dist/cli/Provider.d.ts.map +1 -1
  5. package/dist/cli/Provider.js +2 -1
  6. package/dist/cli/Provider.js.map +1 -1
  7. package/dist/cli/adapter.d.ts +2 -0
  8. package/dist/cli/adapter.d.ts.map +1 -1
  9. package/dist/cli/adapter.js +189 -26
  10. package/dist/cli/adapter.js.map +1 -1
  11. package/dist/cli/keyring.d.ts +56 -0
  12. package/dist/cli/keyring.d.ts.map +1 -0
  13. package/dist/cli/keyring.js +156 -0
  14. package/dist/cli/keyring.js.map +1 -0
  15. package/dist/core/AccessKey.d.ts +3 -1
  16. package/dist/core/AccessKey.d.ts.map +1 -1
  17. package/dist/core/AccessKey.js +28 -8
  18. package/dist/core/AccessKey.js.map +1 -1
  19. package/dist/core/Account.d.ts +7 -3
  20. package/dist/core/Account.d.ts.map +1 -1
  21. package/dist/core/Account.js +15 -6
  22. package/dist/core/Account.js.map +1 -1
  23. package/dist/core/Client.d.ts +3 -0
  24. package/dist/core/Client.d.ts.map +1 -1
  25. package/dist/core/Client.js +24 -4
  26. package/dist/core/Client.js.map +1 -1
  27. package/dist/core/Provider.d.ts.map +1 -1
  28. package/dist/core/Provider.js +30 -4
  29. package/dist/core/Provider.js.map +1 -1
  30. package/dist/core/Schema.d.ts +12 -0
  31. package/dist/core/Schema.d.ts.map +1 -1
  32. package/dist/core/TrustedHosts.d.ts +1 -3
  33. package/dist/core/TrustedHosts.d.ts.map +1 -1
  34. package/dist/core/TrustedHosts.js +2 -15
  35. package/dist/core/TrustedHosts.js.map +1 -1
  36. package/dist/core/zod/rpc.d.ts +8 -0
  37. package/dist/core/zod/rpc.d.ts.map +1 -1
  38. package/dist/core/zod/rpc.js +2 -0
  39. package/dist/core/zod/rpc.js.map +1 -1
  40. package/dist/trusted-hosts.json +15 -0
  41. package/package.json +1 -1
  42. package/src/cli/Provider.test-d.ts +1 -1
  43. package/src/cli/Provider.test.ts +226 -2
  44. package/src/cli/Provider.ts +16 -3
  45. package/src/cli/adapter.ts +256 -26
  46. package/src/cli/keyring.test.ts +118 -0
  47. package/src/cli/keyring.ts +214 -0
  48. package/src/core/AccessKey.ts +37 -8
  49. package/src/core/Account.ts +27 -9
  50. package/src/core/Client.ts +34 -4
  51. package/src/core/Provider.test.ts +14 -0
  52. package/src/core/Provider.ts +35 -4
  53. package/src/core/TrustedHosts.ts +3 -15
  54. package/src/core/zod/rpc.ts +2 -0
  55. package/src/trusted-hosts.json +15 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # accounts
2
2
 
3
+ ## 0.4.16
4
+
5
+ ### Patch Changes
6
+
7
+ - 46cd976: Made CLI use wallet.tempo.xyz as server and keys.toml
8
+ - 00de151: Added provider transport to `getClient()` so viem actions route through the provider adapter. Accepted standard `to`/`data` fields in `eth_sendTransaction` and converted them to Tempo `calls` format.
9
+
10
+ ## 0.4.15
11
+
12
+ ### Patch Changes
13
+
14
+ - 715d830: Moved trusted hosts list to `trusted-hosts.json` at the project root.
15
+
3
16
  ## 0.4.14
4
17
 
5
18
  ### Patch Changes
package/README.md CHANGED
@@ -96,12 +96,12 @@ const { accounts } = await provider.request({
96
96
  ## Development
97
97
 
98
98
  ```sh
99
- pnpm dev # start dialog + dialog-ref + playground dev servers
100
- pnpm demo:cli-auth # run the CLI smoke-test client from playground/scripts
99
+ pnpm dev # start dialog + dialog-ref + web playground dev servers
100
+ pnpm playground:cli # run the CLI playground client
101
101
  pnpm dev:dialog # start Tempo Wallet dialog only
102
102
  pnpm dev:dialog-ref # start reference dialog implementation only (port 5174)
103
- pnpm dev:playground # start playground app only
104
- pnpm dev:hosts # start dialog + playground instances on different TLDs
103
+ pnpm dev:playground # start web playground only
104
+ pnpm dev:hosts # start dialog + web playground instances on different TLDs
105
105
  pnpm build # build library
106
106
  pnpm check # lint + format
107
107
  pnpm check:types # type checks
@@ -118,10 +118,10 @@ pnpm test # run tests
118
118
 
119
119
  The `ref-impls/` directory contains reference implementations for building on the Account SDK:
120
120
 
121
- | Directory | Description |
122
- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
123
- | `ref-impls/dialog/` | Minimal, unstyled embed dialog app demonstrating how to build a custom embed using the `Remote` API. Select `dialogRefImpl` in the playground's adapter dropdown to test against it. |
124
- | `ref-impls/cli-auth/` | Cloudflare Workers server demonstrating device-code based CLI authentication and access key authorization. |
121
+ | Directory | Description |
122
+ | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
123
+ | `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. |
124
+ | `ref-impls/cli-auth/` | Cloudflare Workers server demonstrating device-code based CLI authentication and access key authorization. |
125
125
 
126
126
  ## License
127
127
 
@@ -6,7 +6,10 @@ import { cli } from './adapter.js';
6
6
  */
7
7
  export declare function create(options: create.Options): create.ReturnType;
8
8
  export declare namespace create {
9
- type Options = Omit<CoreProvider.create.Options, 'adapter' | 'authorizeAccessKey'> & cli.Options;
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/embed/cli-auth" */
11
+ host?: string | undefined;
12
+ };
10
13
  type ReturnType = CoreProvider.create.ReturnType;
11
14
  }
12
15
  //# sourceMappingURL=Provider.d.ts.map
@@ -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;AAElC;;;GAGG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAYjE;AAED,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,KAAY,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,GAAG,oBAAoB,CAAC,GACvF,GAAG,CAAC,OAAO,CAAA;IACb,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;AAElC;;;GAGG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAoBjE;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,4FAA4F;QAC5F,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC1B,CAAA;IACD,KAAY,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,UAAU,CAAA;CACxD"}
@@ -5,11 +5,12 @@ import { cli } from './adapter.js';
5
5
  * device-code flow.
6
6
  */
7
7
  export function create(options) {
8
- const { host, open, pollIntervalMs, timeoutMs, ...rest } = options;
8
+ const { host = 'https://wallet.tempo.xyz/embed/cli-auth', keysPath, open, pollIntervalMs, timeoutMs, ...rest } = options;
9
9
  return CoreProvider.create({
10
10
  ...rest,
11
11
  adapter: cli({
12
12
  host,
13
+ ...(keysPath ? { keysPath } : {}),
13
14
  ...(open ? { open } : {}),
14
15
  ...(typeof pollIntervalMs !== 'undefined' ? { pollIntervalMs } : {}),
15
16
  ...(typeof timeoutMs !== 'undefined' ? { timeoutMs } : {}),
@@ -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;AAElC;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,OAAuB;IAC5C,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAA;IAElE,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;KACH,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;AAElC;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,OAAuB;IAC5C,MAAM,EACJ,IAAI,GAAG,yCAAyC,EAChD,QAAQ,EACR,IAAI,EACJ,cAAc,EACd,SAAS,EACT,GAAG,IAAI,EACR,GAAG,OAAO,CAAA;IAEX,OAAO,YAAY,CAAC,MAAM,CAAC;QACzB,GAAG,IAAI;QACP,OAAO,EAAE,GAAG,CAAC;YACX,IAAI;YACJ,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,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;KACH,CAAC,CAAA;AACJ,CAAC"}
@@ -9,6 +9,8 @@ export declare namespace cli {
9
9
  host: string;
10
10
  /** Provider display name. @default "Tempo CLI" */
11
11
  name?: string | undefined;
12
+ /** Path for managed CLI access keys. @default "~/.tempo/wallet/keys.toml" */
13
+ keysPath?: string | undefined;
12
14
  /** Browser opener override. */
13
15
  open?: ((url: string) => Promise<void> | void) | undefined;
14
16
  /** Poll interval in milliseconds. @default 2000 */
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/cli/adapter.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAA;AAG7C;;GAEG;AACH,wBAAgB,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAuIzD;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":"AAkBA,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAA;AAI7C;;GAEG;AACH,wBAAgB,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CA6UzD;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,6EAA6E;QAC7E,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC7B,+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,38 +1,146 @@
1
1
  import { spawn } from 'node:child_process';
2
2
  import { setTimeout as sleep } from 'node:timers/promises';
3
- import { Base64, Hash, Hex, Provider as core_Provider, RpcResponse } from 'ox';
3
+ import { Address, Base64, Hash, Hex, P256, Provider as core_Provider, PublicKey, RpcResponse, } from 'ox';
4
+ import { KeyAuthorization } from 'ox/tempo';
5
+ import { prepareTransactionRequest } from 'viem/actions';
6
+ import { Account as TempoAccount, Secp256k1 } from 'viem/tempo';
4
7
  import * as z from 'zod/mini';
8
+ import * as AccessKey from '../core/AccessKey.js';
5
9
  import * as Adapter from '../core/Adapter.js';
6
10
  import * as CliAuth from '../server/CliAuth.js';
11
+ import * as Keyring from './keyring.js';
7
12
  /**
8
13
  * Creates a CLI bootstrap adapter backed by the device-code protocol.
9
14
  */
10
15
  export function cli(options) {
11
16
  const { name = 'Tempo CLI', rdns = 'xyz.tempo.cli' } = options;
12
- return Adapter.define({ name, rdns }, ({ store }) => {
17
+ return Adapter.define({ name, rdns }, ({ getAccount, getClient, store }) => {
18
+ async function loadManagedKey(address, parameters = {}) {
19
+ const { keyType } = parameters;
20
+ const { chainId } = store.getState();
21
+ const entry = await Keyring.find({
22
+ chainId,
23
+ ...(keyType ? { keyType } : {}),
24
+ ...(options.keysPath ? { path: options.keysPath } : {}),
25
+ walletAddress: address,
26
+ });
27
+ if (!entry)
28
+ return;
29
+ const deserialized = KeyAuthorization.deserialize(entry.keyAuthorization);
30
+ if (!deserialized.signature)
31
+ throw new Error('Managed access key is missing a signature.');
32
+ const keyAuthorization = deserialized;
33
+ AccessKey.save({
34
+ address,
35
+ keyAuthorization,
36
+ privateKey: entry.key,
37
+ store,
38
+ });
39
+ return entry;
40
+ }
41
+ async function resolveManagedKey(options = {}) {
42
+ const { address, keyType } = options;
43
+ const requestedKeyType = keyType === 'p256' || keyType === 'secp256k1' ? keyType : undefined;
44
+ const entry = address
45
+ ? await loadManagedKey(address, requestedKeyType ? { keyType: requestedKeyType } : {})
46
+ : undefined;
47
+ if (entry) {
48
+ const account = entry.keyType === 'p256'
49
+ ? TempoAccount.fromP256(entry.key, { access: address })
50
+ : TempoAccount.fromSecp256k1(entry.key, { access: address });
51
+ return {
52
+ account,
53
+ key: entry.key,
54
+ keyAddress: entry.keyAddress,
55
+ keyType: entry.keyType,
56
+ publicKey: account.publicKey,
57
+ };
58
+ }
59
+ const nextKeyType = requestedKeyType === 'p256' ? 'p256' : 'secp256k1';
60
+ const key = nextKeyType === 'p256' ? P256.randomPrivateKey() : Secp256k1.randomPrivateKey();
61
+ const account = nextKeyType === 'p256'
62
+ ? TempoAccount.fromP256(key, address ? { access: address } : undefined)
63
+ : TempoAccount.fromSecp256k1(key, address ? { access: address } : undefined);
64
+ return {
65
+ account,
66
+ key,
67
+ keyAddress: Address.fromPublicKey(PublicKey.from(account.publicKey)),
68
+ keyType: nextKeyType,
69
+ publicKey: account.publicKey,
70
+ };
71
+ }
72
+ async function saveManagedKey(address, managedKey, keyAuthorization) {
73
+ if (!managedKey)
74
+ return;
75
+ const signed = KeyAuthorization.fromRpc(z.encode(CliAuth.keyAuthorization, keyAuthorization));
76
+ AccessKey.save({
77
+ address,
78
+ keyAuthorization: signed,
79
+ privateKey: managedKey.key,
80
+ store,
81
+ });
82
+ await Keyring.upsert({
83
+ chainId: Number(keyAuthorization.chainId),
84
+ expiry: keyAuthorization.expiry ?? 0,
85
+ key: managedKey.key,
86
+ keyAddress: managedKey.keyAddress,
87
+ keyAuthorization: KeyAuthorization.serialize(signed),
88
+ keyType: managedKey.keyType,
89
+ ...(keyAuthorization.limits
90
+ ? { limits: keyAuthorization.limits.map((limit) => ({ ...limit })) }
91
+ : {}),
92
+ walletAddress: address,
93
+ walletType: 'passkey',
94
+ }, options.keysPath ? { path: options.keysPath } : {});
95
+ }
96
+ async function withManagedAccessKey(fn) {
97
+ const rootAddress = store.getState().accounts[store.getState().activeAccount]?.address;
98
+ if (rootAddress)
99
+ await loadManagedKey(rootAddress);
100
+ const account = getAccount({ signable: true });
101
+ const keyAuthorization = AccessKey.getPending(account, { store });
102
+ try {
103
+ const result = await fn(account, keyAuthorization ?? undefined);
104
+ AccessKey.removePending(account, { store });
105
+ return result;
106
+ }
107
+ catch (error) {
108
+ AccessKey.remove(account, { store });
109
+ throw error;
110
+ }
111
+ }
13
112
  async function authorize(request) {
14
113
  const { host, open = defaultOpen, pollIntervalMs = 2_000, timeoutMs = 5 * 60 * 1_000, } = options;
15
114
  const { account, authorizeAccessKey, method } = request;
16
- if (!authorizeAccessKey?.publicKey)
115
+ const managedKey = authorizeAccessKey && !authorizeAccessKey.publicKey && !authorizeAccessKey.address
116
+ ? await resolveManagedKey({
117
+ ...(account ? { address: account } : {}),
118
+ ...(authorizeAccessKey.keyType ? { keyType: authorizeAccessKey.keyType } : {}),
119
+ })
120
+ : undefined;
121
+ const publicKey = authorizeAccessKey?.publicKey ?? managedKey?.publicKey;
122
+ const keyType = authorizeAccessKey?.keyType ?? managedKey?.keyType;
123
+ if (!publicKey)
17
124
  throw new RpcResponse.InvalidParamsError({
18
125
  message: method === 'wallet_connect'
19
- ? '`wallet_connect` on the CLI adapter requires `capabilities.authorizeAccessKey.publicKey`.'
20
- : '`wallet_authorizeAccessKey` on the CLI adapter requires `publicKey`.',
126
+ ? '`wallet_connect` on the CLI adapter requires `capabilities.authorizeAccessKey`.'
127
+ : '`wallet_authorizeAccessKey` on the CLI adapter requires key parameters.',
21
128
  });
22
129
  const codeVerifier = createCodeVerifier();
23
130
  const codeChallenge = createCodeChallenge(codeVerifier);
131
+ const body = {
132
+ ...(account ? { account } : {}),
133
+ chainId: BigInt(store.getState().chainId),
134
+ codeChallenge,
135
+ ...(typeof authorizeAccessKey?.expiry !== 'undefined'
136
+ ? { expiry: authorizeAccessKey.expiry }
137
+ : {}),
138
+ ...(keyType ? { keyType } : {}),
139
+ ...(authorizeAccessKey?.limits ? { limits: authorizeAccessKey.limits } : {}),
140
+ pubKey: publicKey,
141
+ };
24
142
  const created = await post({
25
- body: {
26
- ...(account ? { account } : {}),
27
- chainId: BigInt(store.getState().chainId),
28
- codeChallenge,
29
- ...(typeof authorizeAccessKey.expiry !== 'undefined'
30
- ? { expiry: authorizeAccessKey.expiry }
31
- : {}),
32
- ...(authorizeAccessKey.keyType ? { keyType: authorizeAccessKey.keyType } : {}),
33
- ...(authorizeAccessKey.limits ? { limits: authorizeAccessKey.limits } : {}),
34
- pubKey: authorizeAccessKey.publicKey,
35
- },
143
+ body,
36
144
  request: CliAuth.createRequest,
37
145
  response: CliAuth.createResponse,
38
146
  url: getApiUrl(host, 'code'),
@@ -60,6 +168,8 @@ export function cli(options) {
60
168
  }
61
169
  if (result.status === 'expired')
62
170
  throw new Error('Device code expired before authorization completed.');
171
+ if (managedKey)
172
+ await saveManagedKey(result.accountAddress, managedKey, result.keyAuthorization);
63
173
  return result;
64
174
  }
65
175
  throw new TimeoutError(url, created.code);
@@ -74,6 +184,11 @@ export function cli(options) {
74
184
  authorizeAccessKey: parameters,
75
185
  method: 'wallet_authorizeAccessKey',
76
186
  });
187
+ if (!account)
188
+ store.setState({
189
+ accounts: [{ address: result.accountAddress }],
190
+ activeAccount: 0,
191
+ });
77
192
  return {
78
193
  keyAuthorization: z.encode(CliAuth.keyAuthorization, result.keyAuthorization),
79
194
  rootAddress: result.accountAddress,
@@ -102,20 +217,68 @@ export function cli(options) {
102
217
  async revokeAccessKey() {
103
218
  throw unsupported('`wallet_revokeAccessKey` not supported by CLI adapter.');
104
219
  },
105
- async sendTransaction() {
106
- throw unsupported('`eth_sendTransaction` not supported by CLI adapter.');
220
+ async sendTransaction(parameters) {
221
+ const { feePayer, ...rest } = parameters;
222
+ const client = getClient(typeof feePayer === 'string' ? { feePayer } : {});
223
+ const { account, prepared } = await withManagedAccessKey(async (account, keyAuthorization) => ({
224
+ account,
225
+ prepared: await prepareTransactionRequest(client, {
226
+ account,
227
+ ...rest,
228
+ ...(feePayer ? { feePayer: true } : {}),
229
+ ...(keyAuthorization ? { keyAuthorization } : {}),
230
+ type: 'tempo',
231
+ }),
232
+ }));
233
+ const signed = await account.signTransaction(prepared);
234
+ return await client.request({
235
+ method: 'eth_sendRawTransaction',
236
+ params: [signed],
237
+ });
107
238
  },
108
- async sendTransactionSync() {
109
- throw unsupported('`eth_sendTransactionSync` not supported by CLI adapter.');
239
+ async sendTransactionSync(parameters) {
240
+ const { feePayer, ...rest } = parameters;
241
+ const client = getClient(typeof feePayer === 'string' ? { feePayer } : {});
242
+ const { account, prepared } = await withManagedAccessKey(async (account, keyAuthorization) => ({
243
+ account,
244
+ prepared: await prepareTransactionRequest(client, {
245
+ account,
246
+ ...rest,
247
+ ...(feePayer ? { feePayer: true } : {}),
248
+ ...(keyAuthorization ? { keyAuthorization } : {}),
249
+ type: 'tempo',
250
+ }),
251
+ }));
252
+ const signed = await account.signTransaction(prepared);
253
+ return await client.request({
254
+ method: 'eth_sendRawTransactionSync',
255
+ params: [signed],
256
+ });
110
257
  },
111
- async signPersonalMessage() {
112
- throw unsupported('`personal_sign` not supported by CLI adapter.');
258
+ async signPersonalMessage({ address, data }) {
259
+ await loadManagedKey(address);
260
+ const account = getAccount({ address, signable: true });
261
+ return await account.signMessage({ message: { raw: data } });
113
262
  },
114
- async signTransaction() {
115
- throw unsupported('`eth_signTransaction` not supported by CLI adapter.');
263
+ async signTransaction(parameters) {
264
+ const { feePayer, ...rest } = parameters;
265
+ const client = getClient(typeof feePayer === 'string' ? { feePayer } : {});
266
+ const { account, prepared } = await withManagedAccessKey(async (account, keyAuthorization) => ({
267
+ account,
268
+ prepared: await prepareTransactionRequest(client, {
269
+ account,
270
+ ...rest,
271
+ ...(feePayer ? { feePayer: true } : {}),
272
+ ...(keyAuthorization ? { keyAuthorization } : {}),
273
+ type: 'tempo',
274
+ }),
275
+ }));
276
+ return await account.signTransaction(prepared);
116
277
  },
117
- async signTypedData() {
118
- throw unsupported('`eth_signTypedData_v4` not supported by CLI adapter.');
278
+ async signTypedData({ address, data }) {
279
+ await loadManagedKey(address);
280
+ const account = getAccount({ address, signable: true });
281
+ return await account.signTypedData(JSON.parse(data));
119
282
  },
120
283
  },
121
284
  };
@@ -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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"}
@@ -0,0 +1,56 @@
1
+ import { Address, Hex } from 'ox';
2
+ import type { AccessKey } from '../core/Store.js';
3
+ /** Managed CLI access key persisted in `~/.tempo/wallet/keys.toml`. */
4
+ export type Entry = {
5
+ /** Wallet type that approved the key. */
6
+ walletType: 'passkey';
7
+ /** Root wallet address. */
8
+ walletAddress: AccessKey['access'];
9
+ /** Chain ID for the authorization. */
10
+ chainId: number;
11
+ /** Authorized access-key type. */
12
+ keyType: Extract<AccessKey['keyType'], 'secp256k1' | 'p256'>;
13
+ /** Derived access-key address. */
14
+ keyAddress: AccessKey['address'];
15
+ /** Exported private key for the managed access key. */
16
+ key: Hex.Hex;
17
+ /** Serialized key authorization payload. */
18
+ keyAuthorization: Hex.Hex;
19
+ /** Authorization expiry timestamp. */
20
+ expiry: NonNullable<AccessKey['expiry']>;
21
+ /** TIP-20 spending limits. */
22
+ limits?: AccessKey['limits'];
23
+ };
24
+ /** Returns the default managed-key file path. */
25
+ export declare function defaultPath(): string;
26
+ /** Loads managed CLI access keys from `keys.toml`. */
27
+ export declare function load(options?: load.Options): Promise<readonly Entry[]>;
28
+ export declare namespace load {
29
+ type Options = {
30
+ /** Override path for the managed-key TOML file. */
31
+ path?: string | undefined;
32
+ };
33
+ }
34
+ /** Finds a managed key by wallet address and chain ID. */
35
+ export declare function find(options: find.Options): Promise<Entry | undefined>;
36
+ export declare namespace find {
37
+ type Options = {
38
+ /** Chain ID for the managed key. */
39
+ chainId: number;
40
+ /** Restrict results to a specific managed-key type. */
41
+ keyType?: Entry['keyType'] | undefined;
42
+ /** Override path for the managed-key TOML file. */
43
+ path?: string | undefined;
44
+ /** Root wallet address. */
45
+ walletAddress: Address.Address;
46
+ };
47
+ }
48
+ /** Inserts or replaces a managed key in `keys.toml`. */
49
+ export declare function upsert(entry: Entry, options?: upsert.Options): Promise<void>;
50
+ export declare namespace upsert {
51
+ type Options = {
52
+ /** Override path for the managed-key TOML file. */
53
+ path?: string | undefined;
54
+ };
55
+ }
56
+ //# sourceMappingURL=keyring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyring.d.ts","sourceRoot":"","sources":["../../src/cli/keyring.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,IAAI,CAAA;AAEjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEjD,uEAAuE;AACvE,MAAM,MAAM,KAAK,GAAG;IAClB,yCAAyC;IACzC,UAAU,EAAE,SAAS,CAAA;IACrB,2BAA2B;IAC3B,aAAa,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAA;IAClC,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAA;IACf,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC,CAAA;IAC5D,kCAAkC;IAClC,UAAU,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IAChC,uDAAuD;IACvD,GAAG,EAAE,GAAG,CAAC,GAAG,CAAA;IACZ,4CAA4C;IAC5C,gBAAgB,EAAE,GAAG,CAAC,GAAG,CAAA;IACzB,sCAAsC;IACtC,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAA;IACxC,8BAA8B;IAC9B,MAAM,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAA;CAC7B,CAAA;AAED,iDAAiD;AACjD,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,sDAAsD;AACtD,wBAAsB,IAAI,CAAC,OAAO,GAAE,IAAI,CAAC,OAAY,GAAG,OAAO,CAAC,SAAS,KAAK,EAAE,CAAC,CAShF;AAED,MAAM,CAAC,OAAO,WAAW,IAAI,CAAC;IAC5B,KAAY,OAAO,GAAG;QACpB,mDAAmD;QACnD,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC1B,CAAA;CACF;AAED,0DAA0D;AAC1D,wBAAsB,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAW5E;AAED,MAAM,CAAC,OAAO,WAAW,IAAI,CAAC;IAC5B,KAAY,OAAO,GAAG;QACpB,oCAAoC;QACpC,OAAO,EAAE,MAAM,CAAA;QACf,uDAAuD;QACvD,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;QACtC,mDAAmD;QACnD,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB,2BAA2B;QAC3B,aAAa,EAAE,OAAO,CAAC,OAAO,CAAA;KAC/B,CAAA;CACF;AAED,wDAAwD;AACxD,wBAAsB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,MAAM,CAAC,OAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBtF;AAED,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,KAAY,OAAO,GAAG;QACpB,mDAAmD;QACnD,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC1B,CAAA;CACF"}
@@ -0,0 +1,156 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import { homedir } from 'node:os';
3
+ import { dirname, join } from 'node:path';
4
+ import { Address, Hex } from 'ox';
5
+ /** Returns the default managed-key file path. */
6
+ export function defaultPath() {
7
+ return join(homedir(), '.tempo', 'wallet', 'keys.toml');
8
+ }
9
+ /** Loads managed CLI access keys from `keys.toml`. */
10
+ export async function load(options = {}) {
11
+ const path = options.path ?? defaultPath();
12
+ try {
13
+ return parse(await readFile(path, 'utf8'));
14
+ }
15
+ catch (error) {
16
+ if (error.code === 'ENOENT')
17
+ return [];
18
+ throw error;
19
+ }
20
+ }
21
+ /** Finds a managed key by wallet address and chain ID. */
22
+ export async function find(options) {
23
+ const { chainId, keyType, path, walletAddress } = options;
24
+ const keys = await load(path ? { path } : {});
25
+ for (let i = keys.length - 1; i >= 0; i--) {
26
+ const key = keys[i];
27
+ if (key.chainId !== chainId)
28
+ continue;
29
+ if (key.walletAddress.toLowerCase() !== walletAddress.toLowerCase())
30
+ continue;
31
+ if (keyType && key.keyType !== keyType)
32
+ continue;
33
+ return key;
34
+ }
35
+ }
36
+ /** Inserts or replaces a managed key in `keys.toml`. */
37
+ export async function upsert(entry, options = {}) {
38
+ const path = options.path ?? defaultPath();
39
+ const keys = await load({ path });
40
+ const next = [
41
+ ...keys.filter((key) => !(key.chainId === entry.chainId &&
42
+ key.walletAddress.toLowerCase() === entry.walletAddress.toLowerCase() &&
43
+ key.keyAddress.toLowerCase() === entry.keyAddress.toLowerCase())),
44
+ entry,
45
+ ];
46
+ await mkdir(dirname(path), { recursive: true });
47
+ await writeFile(path, stringify(next), 'utf8');
48
+ }
49
+ function parse(text) {
50
+ const keys = [];
51
+ let key;
52
+ let limit;
53
+ function flushLimit() {
54
+ if (!key || !limit?.token || typeof limit.limit === 'undefined')
55
+ return;
56
+ key.limits = [...(key.limits ?? []), { token: limit.token, limit: limit.limit }];
57
+ limit = undefined;
58
+ }
59
+ function flushKey() {
60
+ flushLimit();
61
+ if (!key?.walletAddress ||
62
+ typeof key.chainId === 'undefined' ||
63
+ !key.keyType ||
64
+ !key.keyAddress ||
65
+ !key.key ||
66
+ !key.keyAuthorization ||
67
+ typeof key.expiry === 'undefined')
68
+ return;
69
+ keys.push({
70
+ chainId: key.chainId,
71
+ expiry: key.expiry,
72
+ key: key.key,
73
+ keyAddress: key.keyAddress,
74
+ keyAuthorization: key.keyAuthorization,
75
+ keyType: key.keyType,
76
+ ...(key.limits?.length ? { limits: key.limits } : {}),
77
+ walletAddress: key.walletAddress,
78
+ walletType: 'passkey',
79
+ });
80
+ key = undefined;
81
+ }
82
+ for (const raw of text.split('\n')) {
83
+ const line = raw.trim();
84
+ if (!line || line.startsWith('#'))
85
+ continue;
86
+ if (line === '[[keys]]') {
87
+ flushKey();
88
+ key = { walletType: 'passkey' };
89
+ continue;
90
+ }
91
+ if (line === '[[keys.limits]]') {
92
+ flushLimit();
93
+ limit = {};
94
+ continue;
95
+ }
96
+ const match = line.match(/^([a-z_]+)\s*=\s*(.+)$/);
97
+ if (!match)
98
+ continue;
99
+ const [, name, rawValue] = match;
100
+ const value = rawValue.trim();
101
+ if (limit) {
102
+ if (name === 'currency')
103
+ limit.token = stripQuotes(value);
104
+ if (name === 'limit')
105
+ limit.limit = BigInt(stripQuotes(value));
106
+ continue;
107
+ }
108
+ if (!key)
109
+ continue;
110
+ if (name === 'wallet_address')
111
+ key.walletAddress = stripQuotes(value);
112
+ if (name === 'chain_id')
113
+ key.chainId = Number.parseInt(value, 10);
114
+ if (name === 'key_type')
115
+ key.keyType = stripQuotes(value);
116
+ if (name === 'key_address')
117
+ key.keyAddress = stripQuotes(value);
118
+ if (name === 'key')
119
+ key.key = stripQuotes(value);
120
+ if (name === 'key_authorization')
121
+ key.keyAuthorization = stripQuotes(value);
122
+ if (name === 'expiry')
123
+ key.expiry = Number.parseInt(value, 10);
124
+ }
125
+ flushKey();
126
+ return keys;
127
+ }
128
+ function stringify(keys) {
129
+ return [
130
+ '# Tempo wallet keys — managed by `tempo wallet`',
131
+ '# Do not edit manually.',
132
+ '',
133
+ ...keys.flatMap((key) => [
134
+ '[[keys]]',
135
+ `wallet_type = "passkey"`,
136
+ `wallet_address = "${key.walletAddress}"`,
137
+ `chain_id = ${key.chainId}`,
138
+ `key_type = "${key.keyType}"`,
139
+ `key_address = "${key.keyAddress}"`,
140
+ `key = "${key.key}"`,
141
+ `key_authorization = "${key.keyAuthorization}"`,
142
+ `expiry = ${key.expiry}`,
143
+ '',
144
+ ...(key.limits ?? []).flatMap((limit) => [
145
+ '[[keys.limits]]',
146
+ `currency = "${limit.token}"`,
147
+ `limit = "${limit.limit}"`,
148
+ '',
149
+ ]),
150
+ ]),
151
+ ].join('\n');
152
+ }
153
+ function stripQuotes(value) {
154
+ return value.replace(/^"|"$/g, '');
155
+ }
156
+ //# sourceMappingURL=keyring.js.map