accounts 0.4.15 → 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.
- package/CHANGELOG.md +7 -0
- package/README.md +8 -8
- package/dist/cli/Provider.d.ts +4 -1
- package/dist/cli/Provider.d.ts.map +1 -1
- package/dist/cli/Provider.js +2 -1
- package/dist/cli/Provider.js.map +1 -1
- package/dist/cli/adapter.d.ts +2 -0
- package/dist/cli/adapter.d.ts.map +1 -1
- package/dist/cli/adapter.js +189 -26
- package/dist/cli/adapter.js.map +1 -1
- package/dist/cli/keyring.d.ts +56 -0
- package/dist/cli/keyring.d.ts.map +1 -0
- package/dist/cli/keyring.js +156 -0
- package/dist/cli/keyring.js.map +1 -0
- package/dist/core/AccessKey.d.ts +3 -1
- package/dist/core/AccessKey.d.ts.map +1 -1
- package/dist/core/AccessKey.js +28 -8
- package/dist/core/AccessKey.js.map +1 -1
- package/dist/core/Account.d.ts +7 -3
- package/dist/core/Account.d.ts.map +1 -1
- package/dist/core/Account.js +15 -6
- package/dist/core/Account.js.map +1 -1
- package/dist/core/Client.d.ts +3 -0
- package/dist/core/Client.d.ts.map +1 -1
- package/dist/core/Client.js +24 -4
- package/dist/core/Client.js.map +1 -1
- package/dist/core/Provider.d.ts.map +1 -1
- package/dist/core/Provider.js +30 -4
- package/dist/core/Provider.js.map +1 -1
- package/dist/core/Schema.d.ts +12 -0
- package/dist/core/Schema.d.ts.map +1 -1
- package/dist/core/zod/rpc.d.ts +8 -0
- package/dist/core/zod/rpc.d.ts.map +1 -1
- package/dist/core/zod/rpc.js +2 -0
- package/dist/core/zod/rpc.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/Provider.test-d.ts +1 -1
- package/src/cli/Provider.test.ts +226 -2
- package/src/cli/Provider.ts +16 -3
- package/src/cli/adapter.ts +256 -26
- package/src/cli/keyring.test.ts +118 -0
- package/src/cli/keyring.ts +214 -0
- package/src/core/AccessKey.ts +37 -8
- package/src/core/Account.ts +27 -9
- package/src/core/Client.ts +34 -4
- package/src/core/Provider.test.ts +14 -0
- package/src/core/Provider.ts +35 -4
- package/src/core/zod/rpc.ts +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
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
|
+
|
|
3
10
|
## 0.4.15
|
|
4
11
|
|
|
5
12
|
### 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
|
|
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
|
|
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
|
|
package/dist/cli/Provider.d.ts
CHANGED
|
@@ -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'> &
|
|
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,
|
|
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"}
|
package/dist/cli/Provider.js
CHANGED
|
@@ -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 } : {}),
|
package/dist/cli/Provider.js.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/cli/adapter.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/cli/adapter.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
20
|
-
: '`wallet_authorizeAccessKey` on the CLI adapter requires
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
};
|
package/dist/cli/adapter.js.map
CHANGED
|
@@ -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
|