viem 2.57.4 → 2.57.5

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 (223) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/_cjs/actions/public/waitForTransactionReceipt.js +5 -2
  3. package/_cjs/actions/public/waitForTransactionReceipt.js.map +1 -1
  4. package/_cjs/actions/wallet/waitForCallsStatus.js +25 -2
  5. package/_cjs/actions/wallet/waitForCallsStatus.js.map +1 -1
  6. package/_cjs/chains/definitions/arcTestnet.js +11 -8
  7. package/_cjs/chains/definitions/arcTestnet.js.map +1 -1
  8. package/_cjs/chains/definitions/qmsTestnet.js +30 -0
  9. package/_cjs/chains/definitions/qmsTestnet.js.map +1 -0
  10. package/_cjs/chains/definitions/tempo.js +1 -1
  11. package/_cjs/chains/definitions/tempoModerato.js +2 -2
  12. package/_cjs/chains/index.js +7 -5
  13. package/_cjs/chains/index.js.map +1 -1
  14. package/_cjs/clients/transports/ipc.js +19 -10
  15. package/_cjs/clients/transports/ipc.js.map +1 -1
  16. package/_cjs/clients/transports/webSocket.js +19 -10
  17. package/_cjs/clients/transports/webSocket.js.map +1 -1
  18. package/_cjs/errors/version.js +1 -1
  19. package/_cjs/tempo/Account.js +40 -40
  20. package/_cjs/tempo/Account.js.map +1 -1
  21. package/_cjs/tempo/Decorator.js +9 -8
  22. package/_cjs/tempo/Decorator.js.map +1 -1
  23. package/_cjs/tempo/ExecutionError.js +1 -1
  24. package/_cjs/tempo/ExecutionError.js.map +1 -1
  25. package/_cjs/tempo/Formatters.js +8 -7
  26. package/_cjs/tempo/Formatters.js.map +1 -1
  27. package/_cjs/tempo/KeyAuthorizationManager.js +25 -16
  28. package/_cjs/tempo/KeyAuthorizationManager.js.map +1 -1
  29. package/_cjs/tempo/Relay.js +9 -4
  30. package/_cjs/tempo/Relay.js.map +1 -1
  31. package/_cjs/tempo/Transaction.js +9 -9
  32. package/_cjs/tempo/Transaction.js.map +1 -1
  33. package/_cjs/tempo/Transport.js +21 -11
  34. package/_cjs/tempo/Transport.js.map +1 -1
  35. package/_cjs/tempo/{multisig → accounts}/Config.js +8 -8
  36. package/_cjs/tempo/{multisig → accounts}/Config.js.map +1 -1
  37. package/_cjs/tempo/{multisig → accounts}/Operation.js +10 -10
  38. package/_cjs/tempo/{multisig → accounts}/Operation.js.map +1 -1
  39. package/_cjs/tempo/{multisig → accounts}/Signature.js +2 -2
  40. package/_cjs/tempo/accounts/Signature.js.map +1 -0
  41. package/_cjs/tempo/actions/accessKey.js +60 -37
  42. package/_cjs/tempo/actions/accessKey.js.map +1 -1
  43. package/_cjs/tempo/actions/{multisig.js → accounts.js} +13 -18
  44. package/_cjs/tempo/actions/accounts.js.map +1 -0
  45. package/_cjs/tempo/actions/index.js +2 -2
  46. package/_cjs/tempo/actions/index.js.map +1 -1
  47. package/_cjs/tempo/chainConfig.js +37 -37
  48. package/_cjs/tempo/chainConfig.js.map +1 -1
  49. package/_cjs/tempo/index.js +3 -3
  50. package/_cjs/tempo/index.js.map +1 -1
  51. package/_cjs/tempo/internal/relay/{multisig.js → accounts.js} +90 -93
  52. package/_cjs/tempo/internal/relay/accounts.js.map +1 -0
  53. package/_cjs/tempo/internal/relay/keyAuthorization.js +296 -0
  54. package/_cjs/tempo/internal/relay/keyAuthorization.js.map +1 -0
  55. package/_cjs/tempo/internal/relay/plugin.js +17 -7
  56. package/_cjs/tempo/internal/relay/plugin.js.map +1 -1
  57. package/_cjs/utils/hash/normalizeSignature.js +1 -1
  58. package/_cjs/utils/hash/normalizeSignature.js.map +1 -1
  59. package/_cjs/utils/rpc/http.js +66 -31
  60. package/_cjs/utils/rpc/http.js.map +1 -1
  61. package/_cjs/utils/rpc/socket.js +1 -1
  62. package/_cjs/utils/rpc/socket.js.map +1 -1
  63. package/_esm/actions/public/waitForTransactionReceipt.js +5 -2
  64. package/_esm/actions/public/waitForTransactionReceipt.js.map +1 -1
  65. package/_esm/actions/wallet/waitForCallsStatus.js +39 -2
  66. package/_esm/actions/wallet/waitForCallsStatus.js.map +1 -1
  67. package/_esm/chains/definitions/arcTestnet.js +11 -8
  68. package/_esm/chains/definitions/arcTestnet.js.map +1 -1
  69. package/_esm/chains/definitions/qmsTestnet.js +27 -0
  70. package/_esm/chains/definitions/qmsTestnet.js.map +1 -0
  71. package/_esm/chains/definitions/tempo.js +1 -1
  72. package/_esm/chains/definitions/tempoModerato.js +2 -2
  73. package/_esm/chains/index.js +1 -0
  74. package/_esm/chains/index.js.map +1 -1
  75. package/_esm/clients/transports/ipc.js +21 -10
  76. package/_esm/clients/transports/ipc.js.map +1 -1
  77. package/_esm/clients/transports/webSocket.js +21 -10
  78. package/_esm/clients/transports/webSocket.js.map +1 -1
  79. package/_esm/errors/version.js +1 -1
  80. package/_esm/tempo/Account.js +42 -42
  81. package/_esm/tempo/Account.js.map +1 -1
  82. package/_esm/tempo/Client.js +3 -3
  83. package/_esm/tempo/Decorator.js +9 -8
  84. package/_esm/tempo/Decorator.js.map +1 -1
  85. package/_esm/tempo/ExecutionError.js +1 -1
  86. package/_esm/tempo/ExecutionError.js.map +1 -1
  87. package/_esm/tempo/Formatters.js +11 -10
  88. package/_esm/tempo/Formatters.js.map +1 -1
  89. package/_esm/tempo/KeyAuthorizationManager.js +58 -16
  90. package/_esm/tempo/KeyAuthorizationManager.js.map +1 -1
  91. package/_esm/tempo/Relay.js +49 -8
  92. package/_esm/tempo/Relay.js.map +1 -1
  93. package/_esm/tempo/Transaction.js +11 -11
  94. package/_esm/tempo/Transaction.js.map +1 -1
  95. package/_esm/tempo/Transport.js +22 -12
  96. package/_esm/tempo/Transport.js.map +1 -1
  97. package/_esm/tempo/{multisig → accounts}/Config.js +14 -14
  98. package/_esm/tempo/{multisig → accounts}/Config.js.map +1 -1
  99. package/_esm/tempo/{multisig → accounts}/Operation.js +17 -17
  100. package/_esm/tempo/{multisig → accounts}/Operation.js.map +1 -1
  101. package/_esm/tempo/accounts/Signature.js +9 -0
  102. package/_esm/tempo/accounts/Signature.js.map +1 -0
  103. package/_esm/tempo/actions/accessKey.js +93 -38
  104. package/_esm/tempo/actions/accessKey.js.map +1 -1
  105. package/_esm/tempo/actions/{multisig.js → accounts.js} +31 -36
  106. package/_esm/tempo/actions/accounts.js.map +1 -0
  107. package/_esm/tempo/actions/index.js +1 -1
  108. package/_esm/tempo/actions/index.js.map +1 -1
  109. package/_esm/tempo/chainConfig.js +38 -38
  110. package/_esm/tempo/chainConfig.js.map +1 -1
  111. package/_esm/tempo/index.js +2 -1
  112. package/_esm/tempo/index.js.map +1 -1
  113. package/_esm/tempo/internal/relay/{multisig.js → accounts.js} +93 -98
  114. package/_esm/tempo/internal/relay/accounts.js.map +1 -0
  115. package/_esm/tempo/internal/relay/feePayer.js +1 -1
  116. package/_esm/tempo/internal/relay/feePayer.js.map +1 -1
  117. package/_esm/tempo/internal/relay/keyAuthorization.js +334 -0
  118. package/_esm/tempo/internal/relay/keyAuthorization.js.map +1 -0
  119. package/_esm/tempo/internal/relay/plugin.js +15 -6
  120. package/_esm/tempo/internal/relay/plugin.js.map +1 -1
  121. package/_esm/utils/hash/normalizeSignature.js +3 -2
  122. package/_esm/utils/hash/normalizeSignature.js.map +1 -1
  123. package/_esm/utils/rpc/http.js +74 -31
  124. package/_esm/utils/rpc/http.js.map +1 -1
  125. package/_esm/utils/rpc/socket.js +3 -1
  126. package/_esm/utils/rpc/socket.js.map +1 -1
  127. package/_types/actions/public/waitForTransactionReceipt.d.ts.map +1 -1
  128. package/_types/actions/wallet/waitForCallsStatus.d.ts.map +1 -1
  129. package/_types/chains/definitions/arcTestnet.d.ts +5 -5
  130. package/_types/chains/definitions/arcTestnet.d.ts.map +1 -1
  131. package/_types/chains/definitions/qmsTestnet.d.ts +50 -0
  132. package/_types/chains/definitions/qmsTestnet.d.ts.map +1 -0
  133. package/_types/chains/definitions/tempo.d.ts +2 -2
  134. package/_types/chains/definitions/tempoModerato.d.ts +4 -4
  135. package/_types/chains/index.d.ts +1 -0
  136. package/_types/chains/index.d.ts.map +1 -1
  137. package/_types/clients/transports/ipc.d.ts.map +1 -1
  138. package/_types/clients/transports/webSocket.d.ts.map +1 -1
  139. package/_types/errors/version.d.ts +1 -1
  140. package/_types/tempo/Account.d.ts +28 -28
  141. package/_types/tempo/Account.d.ts.map +1 -1
  142. package/_types/tempo/Client.d.ts +3 -3
  143. package/_types/tempo/Decorator.d.ts +63 -37
  144. package/_types/tempo/Decorator.d.ts.map +1 -1
  145. package/_types/tempo/Formatters.d.ts.map +1 -1
  146. package/_types/tempo/KeyAuthorizationManager.d.ts +45 -2
  147. package/_types/tempo/KeyAuthorizationManager.d.ts.map +1 -1
  148. package/_types/tempo/Relay.d.ts +62 -12
  149. package/_types/tempo/Relay.d.ts.map +1 -1
  150. package/_types/tempo/Transaction.d.ts +14 -11
  151. package/_types/tempo/Transaction.d.ts.map +1 -1
  152. package/_types/tempo/Transport.d.ts +20 -7
  153. package/_types/tempo/Transport.d.ts.map +1 -1
  154. package/_types/tempo/{multisig → accounts}/Config.d.ts +7 -7
  155. package/_types/tempo/accounts/Config.d.ts.map +1 -0
  156. package/_types/tempo/{multisig → accounts}/Operation.d.ts +7 -7
  157. package/_types/tempo/accounts/Operation.d.ts.map +1 -0
  158. package/_types/tempo/{multisig → accounts}/Signature.d.ts +1 -1
  159. package/_types/tempo/accounts/Signature.d.ts.map +1 -0
  160. package/_types/tempo/actions/accessKey.d.ts +59 -17
  161. package/_types/tempo/actions/accessKey.d.ts.map +1 -1
  162. package/_types/tempo/actions/{multisig.d.ts → accounts.d.ts} +28 -28
  163. package/_types/tempo/actions/{multisig.d.ts.map → accounts.d.ts.map} +1 -1
  164. package/_types/tempo/actions/index.d.ts +1 -1
  165. package/_types/tempo/actions/index.d.ts.map +1 -1
  166. package/_types/tempo/index.d.ts +3 -2
  167. package/_types/tempo/index.d.ts.map +1 -1
  168. package/_types/tempo/internal/relay/accounts.d.ts +15 -0
  169. package/_types/tempo/internal/relay/accounts.d.ts.map +1 -0
  170. package/_types/tempo/internal/relay/keyAuthorization.d.ts +25 -0
  171. package/_types/tempo/internal/relay/keyAuthorization.d.ts.map +1 -0
  172. package/_types/tempo/internal/relay/plugin.d.ts +6 -3
  173. package/_types/tempo/internal/relay/plugin.d.ts.map +1 -1
  174. package/_types/utils/hash/normalizeSignature.d.ts.map +1 -1
  175. package/_types/utils/rpc/http.d.ts.map +1 -1
  176. package/_types/utils/rpc/socket.d.ts.map +1 -1
  177. package/actions/public/waitForTransactionReceipt.ts +8 -2
  178. package/actions/wallet/waitForCallsStatus.ts +41 -2
  179. package/chains/definitions/arcTestnet.ts +11 -8
  180. package/chains/definitions/qmsTestnet.ts +27 -0
  181. package/chains/definitions/tempo.ts +1 -1
  182. package/chains/definitions/tempoModerato.ts +2 -2
  183. package/chains/index.ts +1 -0
  184. package/clients/transports/ipc.ts +38 -29
  185. package/clients/transports/webSocket.ts +42 -33
  186. package/errors/version.ts +1 -1
  187. package/package.json +2 -2
  188. package/tempo/Account.ts +95 -84
  189. package/tempo/Client.ts +3 -3
  190. package/tempo/Decorator.ts +86 -57
  191. package/tempo/ExecutionError.ts +1 -1
  192. package/tempo/Formatters.ts +14 -13
  193. package/tempo/KeyAuthorizationManager.ts +71 -19
  194. package/tempo/Relay.ts +70 -14
  195. package/tempo/Transaction.ts +31 -23
  196. package/tempo/Transport.ts +49 -21
  197. package/tempo/{multisig → accounts}/Config.ts +21 -21
  198. package/tempo/{multisig → accounts}/Operation.ts +26 -26
  199. package/tempo/{multisig → accounts}/Signature.ts +5 -3
  200. package/tempo/actions/accessKey.ts +179 -79
  201. package/tempo/actions/{multisig.ts → accounts.ts} +47 -56
  202. package/tempo/actions/index.ts +1 -1
  203. package/tempo/chainConfig.ts +52 -52
  204. package/tempo/index.ts +5 -4
  205. package/tempo/internal/relay/{multisig.ts → accounts.ts} +118 -118
  206. package/tempo/internal/relay/feePayer.ts +1 -1
  207. package/tempo/internal/relay/keyAuthorization.ts +415 -0
  208. package/tempo/internal/relay/plugin.ts +20 -7
  209. package/utils/hash/normalizeSignature.ts +3 -2
  210. package/utils/rpc/http.ts +76 -30
  211. package/utils/rpc/socket.ts +3 -1
  212. package/_cjs/tempo/actions/multisig.js.map +0 -1
  213. package/_cjs/tempo/internal/relay/multisig.js.map +0 -1
  214. package/_cjs/tempo/multisig/Signature.js.map +0 -1
  215. package/_esm/tempo/actions/multisig.js.map +0 -1
  216. package/_esm/tempo/internal/relay/multisig.js.map +0 -1
  217. package/_esm/tempo/multisig/Signature.js +0 -9
  218. package/_esm/tempo/multisig/Signature.js.map +0 -1
  219. package/_types/tempo/internal/relay/multisig.d.ts +0 -4
  220. package/_types/tempo/internal/relay/multisig.d.ts.map +0 -1
  221. package/_types/tempo/multisig/Config.d.ts.map +0 -1
  222. package/_types/tempo/multisig/Operation.d.ts.map +0 -1
  223. package/_types/tempo/multisig/Signature.d.ts.map +0 -1
@@ -114,7 +114,7 @@ export const messages: Record<`${AbiErrorName}(${string})`, string> = {
114
114
  'InvalidMasterAddress()': 'Invalid master address.',
115
115
  'InvalidMigrationIndex()': 'Invalid migration index.',
116
116
  'InvalidMode()': 'Invalid mode.',
117
- 'InvalidMultisigOwner()': 'Invalid multisig owner.',
117
+ 'InvalidMultisigOwner()': 'Invalid owner.',
118
118
  'InvalidNonceKey()': 'Invalid nonce key.',
119
119
  'InvalidOwner()': 'Invalid owner.',
120
120
  'InvalidOwnerOrder()': 'Invalid owner order.',
@@ -3,7 +3,7 @@
3
3
  import type { Address } from 'abitype'
4
4
  import * as Hex from 'ox/Hex'
5
5
  import {
6
- MultisigOperation,
6
+ AccountOperation,
7
7
  Transaction as ox_Transaction,
8
8
  TransactionRequest as ox_TransactionRequest,
9
9
  } from 'ox/tempo'
@@ -12,7 +12,7 @@ import { parseAccount } from '../accounts/utils/parseAccount.js'
12
12
  import { formatTransaction as viem_formatTransaction } from '../utils/formatters/transaction.js'
13
13
  import { formatTransactionReceipt as viem_formatTransactionReceipt } from '../utils/formatters/transactionReceipt.js'
14
14
  import { formatTransactionRequest as viem_formatTransactionRequest } from '../utils/formatters/transactionRequest.js'
15
- import type { Account, MultisigAccount } from './Account.js'
15
+ import type { Account, ConfigurableAccount } from './Account.js'
16
16
  import {
17
17
  isTempo,
18
18
  type Transaction,
@@ -33,7 +33,7 @@ export function formatTransaction(
33
33
  transaction.blockTimestamp == null
34
34
  ? undefined
35
35
  : BigInt(transaction.blockTimestamp)
36
- const multisig = transaction.multisig
36
+ const operation = transaction.operation
37
37
  const {
38
38
  feePayerSignature,
39
39
  gasPrice: _,
@@ -53,8 +53,8 @@ export function formatTransaction(
53
53
  yParity: feePayerSignature.yParity,
54
54
  }
55
55
  : undefined,
56
- multisig: formatMultisig(multisig),
57
56
  nonce: Number(nonce),
57
+ operation: formatOperation(operation),
58
58
  typeHex:
59
59
  ox_Transaction.toRpcType[
60
60
  tx.type as keyof typeof ox_Transaction.toRpcType
@@ -69,7 +69,7 @@ export function formatTransactionReceipt(
69
69
  const transactionReceipt = viem_formatTransactionReceipt(receipt as never)
70
70
  return {
71
71
  ...transactionReceipt,
72
- multisig: formatMultisig(receipt.multisig),
72
+ operation: formatOperation(receipt.operation),
73
73
  ...(receipt.status === 'pending'
74
74
  ? { status: 'pending', type: 'tempo' }
75
75
  : {}),
@@ -77,11 +77,11 @@ export function formatTransactionReceipt(
77
77
  }
78
78
 
79
79
  /** Formats a transaction operation attached to an RPC result. */
80
- function formatMultisig(value: MultisigOperation.TransactionRpc | undefined) {
80
+ function formatOperation(value: AccountOperation.TransactionRpc | undefined) {
81
81
  if (!value) return undefined
82
- const operation = MultisigOperation.fromRpc(value)
82
+ const operation = AccountOperation.fromRpc(value)
83
83
  if (operation.type !== 'transaction')
84
- throw new Error('Expected a multisig transaction operation.')
84
+ throw new Error('Expected an account transaction operation.')
85
85
  return operation
86
86
  }
87
87
 
@@ -98,21 +98,21 @@ export function formatTransactionRequest(
98
98
  keyData?: Hex.Hex | undefined
99
99
  keyId?: Address | undefined
100
100
  keyType?: 'p256' | 'secp256k1' | 'webAuthn' | undefined
101
- owner?: viem_Account | MultisigAccount | Address | undefined
101
+ owner?: viem_Account | ConfigurableAccount | Address | undefined
102
102
  signatures?: unknown
103
103
  }
104
104
  const account = request.account
105
105
  ? parseAccount<Account | viem_Account | Address>(request.account)
106
106
  : undefined
107
107
  const owner = request.owner
108
- ? parseAccount<Account | MultisigAccount | viem_Account | Address>(
108
+ ? parseAccount<Account | ConfigurableAccount | viem_Account | Address>(
109
109
  request.owner,
110
110
  )
111
111
  : undefined
112
112
 
113
113
  if (owner?.type === 'json-rpc')
114
114
  throw new Error(
115
- 'A local owner account is required to approve a multisig transaction.',
115
+ 'A local owner account is required to approve a configurable account transaction.',
116
116
  )
117
117
 
118
118
  // If the request is not a Tempo transaction, route to Viem formatter.
@@ -147,7 +147,7 @@ export function formatTransactionRequest(
147
147
  if (request.feePayer === true && !request.feePayerSignature)
148
148
  delete request.feeToken
149
149
 
150
- // Client-only TIP-1061 fields drive local signing and envelope assembly.
150
+ // Client-only TIP-1107 fields drive local signing and envelope assembly.
151
151
  const { owner: _owner, signatures: _signatures, ...rpcRequest } = request
152
152
 
153
153
  const rpc = ox_TransactionRequest.toRpc({
@@ -191,7 +191,8 @@ export function formatTransactionRequest(
191
191
  ...(keyData ? { keyData } : {}),
192
192
  ...(keyId ? { keyId } : {}),
193
193
  ...(keyType ? { keyType } : {}),
194
- // Keep the key visible to `extract`; the undefined value never reaches JSON-RPC.
194
+ // Keep client-only keys visible to `extract`; undefined values never reach JSON-RPC.
195
+ ...(request.accountSimulation ? { accountSimulation: undefined } : {}),
195
196
  ...(request.owner ? { owner: undefined } : {}),
196
197
  ...(typeof request.feePayer !== 'undefined'
197
198
  ? {
@@ -1,49 +1,101 @@
1
1
  import type { Address } from 'abitype'
2
- import type { KeyAuthorization } from 'ox/tempo'
2
+ import { KeyAuthorization } from 'ox/tempo'
3
3
  import type { MaybePromise } from '../types/utils.js'
4
+ import * as Store from './Store.js'
4
5
 
6
+ /** Identifies a pending key authorization by account, access key, and chain. */
5
7
  export type Key = {
8
+ /** Account the access key acts for. */
6
9
  address: Address
10
+ /** Access key address. */
7
11
  accessKey: Address
12
+ /** Chain the authorization is for. */
8
13
  chainId: number
9
14
  }
10
15
 
16
+ /** Pending key authorizations that the client attaches to an access key's next transaction. */
11
17
  export type KeyAuthorizationManager = {
18
+ /** Reads the pending authorization for a key. */
12
19
  get(key: Key): MaybePromise<KeyAuthorization.Signed | undefined>
20
+ /** Removes the pending authorization for a key. */
13
21
  remove(key: Key): MaybePromise<void>
22
+ /** Stores a pending authorization for a key. */
14
23
  set(key: Key, keyAuthorization: KeyAuthorization.Signed): MaybePromise<void>
15
24
  }
16
25
 
26
+ /**
27
+ * Creates a key authorization manager backed by a store.
28
+ *
29
+ * Entries use the same keys as the `Relay.keyAuthorization` plugin, so both can
30
+ * share one store.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * import { Account, KeyAuthorizationManager, Store } from 'viem/tempo'
35
+ *
36
+ * const accessKey = Account.fromP256(privateKey, {
37
+ * access: root,
38
+ * keyAuthorizationManager: KeyAuthorizationManager.from({
39
+ * store: Store.session(),
40
+ * }),
41
+ * })
42
+ * ```
43
+ *
44
+ * @param options - Manager options.
45
+ * @returns A key authorization manager.
46
+ */
17
47
  export function from(options: from.Options): KeyAuthorizationManager {
18
- return options.source
48
+ const { store } = options
49
+ return {
50
+ async get(key) {
51
+ const value = await store.getItem(getStoreKey(key))
52
+ if (!value) return undefined
53
+ try {
54
+ return KeyAuthorization.deserialize(
55
+ value as `0x${string}`,
56
+ ) as KeyAuthorization.Signed
57
+ } catch {
58
+ return undefined
59
+ }
60
+ },
61
+ async remove(key) {
62
+ await store.removeItem(getStoreKey(key))
63
+ },
64
+ async set(key, keyAuthorization) {
65
+ await store.setItem(
66
+ getStoreKey(key),
67
+ KeyAuthorization.serialize(keyAuthorization),
68
+ )
69
+ },
70
+ }
19
71
  }
20
72
 
21
73
  export declare namespace from {
22
74
  type Options = {
23
- source: KeyAuthorizationManager
75
+ /** Store for pending key authorizations. */
76
+ store: Store.Store
24
77
  }
25
78
  }
26
79
 
80
+ /**
81
+ * Creates a key authorization manager backed by a process-local memory store.
82
+ *
83
+ * @example
84
+ * ```ts
85
+ * import { KeyAuthorizationManager } from 'viem/tempo'
86
+ *
87
+ * const keyAuthorizationManager = KeyAuthorizationManager.memory()
88
+ * ```
89
+ *
90
+ * @returns A key authorization manager.
91
+ */
27
92
  export function memory(): KeyAuthorizationManager {
28
- const keyAuthorizations = new Map<string, KeyAuthorization.Signed>()
29
-
30
- return from({
31
- source: {
32
- get(key) {
33
- return keyAuthorizations.get(serializeKey(key))
34
- },
35
- remove(key) {
36
- keyAuthorizations.delete(serializeKey(key))
37
- },
38
- set(key, keyAuthorization) {
39
- keyAuthorizations.set(serializeKey(key), keyAuthorization)
40
- },
41
- },
42
- })
93
+ return from({ store: Store.memory() })
43
94
  }
44
95
 
45
- function serializeKey(key: Key) {
96
+ function getStoreKey(key: Key) {
46
97
  return [
98
+ 'keyAuthorization',
47
99
  key.chainId,
48
100
  key.address.toLowerCase(),
49
101
  key.accessKey.toLowerCase(),
package/tempo/Relay.ts CHANGED
@@ -4,9 +4,10 @@ import type { LocalAccount } from '../accounts/types.js'
4
4
  import type { Client as Client_ } from '../clients/createClient.js'
5
5
  import { ChainNotConfiguredError } from '../clients/createClientResolver.js'
6
6
  import type { EIP1193RequestOptions } from '../types/eip1193.js'
7
+ import * as Accounts from './internal/relay/accounts.js'
7
8
  import * as Sponsorship from './internal/relay/feePayer.js'
8
9
  import * as FeeToken from './internal/relay/feeToken.js'
9
- import * as Multisig from './internal/relay/multisig.js'
10
+ import * as KeyAuthorization from './internal/relay/keyAuthorization.js'
10
11
  import * as Request_ from './internal/relay/request.js'
11
12
  import * as Simulate from './internal/relay/simulate.js'
12
13
  import * as internal from './internal/relay.js'
@@ -307,13 +308,19 @@ export declare namespace Plugin {
307
308
  }
308
309
  }
309
310
 
310
- declare const multisigBrand: unique symbol
311
+ declare const accountsBrand: unique symbol
311
312
 
312
313
  /**
313
- * Coordinates native multisig approvals using shared atomic storage.
314
+ * Serves configurable accounts using shared atomic storage.
315
+ *
316
+ * The chain stores only a commitment to each account's config, so the plugin
317
+ * records every config it relays (including configs left by `updateConfig`
318
+ * calls) and serves them through `account_getConfig`. It also collects owner
319
+ * approvals until the account's threshold is met, then submits.
314
320
  *
315
321
  * Memory storage is process-local. Independent clients and multiple server
316
- * instances must use the same persistent store to share pending approvals.
322
+ * instances must use the same persistent store to share configs and pending
323
+ * approvals.
317
324
  *
318
325
  * @example
319
326
  * ```ts
@@ -321,31 +328,31 @@ declare const multisigBrand: unique symbol
321
328
  * import { Relay, Store, withRelay } from 'viem/tempo'
322
329
  *
323
330
  * const transport = withRelay(http(), {
324
- * plugins: [Relay.multisig({ store: Store.memory() })],
331
+ * plugins: [Relay.accounts({ store: Store.memory() })],
325
332
  * })
326
333
  * ```
327
334
  *
328
335
  * @param options - Shared atomic storage.
329
- * @returns A plugin that coordinates multisig requests and forwards other calls.
336
+ * @returns A plugin that handles configurable account requests and forwards other calls.
330
337
  */
331
- export function multisig(options: multisig.Options): multisig.ReturnType {
332
- return Multisig.create(options)
338
+ export function accounts(options: accounts.Options): accounts.ReturnType {
339
+ return Accounts.create(options)
333
340
  }
334
341
 
335
- export declare namespace multisig {
336
- /** Multisig coordination options. */
342
+ export declare namespace accounts {
343
+ /** Configurable account options. */
337
344
  export type Options = {
338
- /** Store shared by multisig coordinators, with atomic compare-and-set support. */
345
+ /** Store shared by relays, with atomic compare-and-set support. */
339
346
  store: Store.Atomic
340
347
  }
341
- /** Middleware advertising native multisig coordination. */
342
- export type ReturnType = Plugin & { readonly [multisigBrand]: true }
348
+ /** Middleware advertising configurable account support. */
349
+ export type ReturnType = Plugin & { readonly [accountsBrand]: true }
343
350
  }
344
351
 
345
352
  /**
346
353
  * Sponsors transactions with a local account or an external fee-payer relay.
347
354
  *
348
- * Place multisig before this plugin and fee-token selection after it.
355
+ * Place accounts before this plugin and fee-token selection after it.
349
356
  *
350
357
  * @example
351
358
  * ```ts
@@ -400,6 +407,55 @@ export function feeToken(): Plugin {
400
407
  return FeeToken.create()
401
408
  }
402
409
 
410
+ declare const keyAuthorizationBrand: unique symbol
411
+
412
+ /**
413
+ * Stores pending key authorizations and attaches them to the next fill that needs them.
414
+ *
415
+ * Signing a key authorization with `Actions.accessKey.signAuthorization` through a
416
+ * relay with this plugin saves it with `relay_saveKeyAuthorization`. Configurable
417
+ * account key authorizations are saved once they reach quorum. The next `eth_fillTransaction`
418
+ * from the access key includes the authorization until the key is active onchain.
419
+ * Remote `withRelay` transports opt in with `keyAuthorization: true`.
420
+ *
421
+ * Place this plugin before `Relay.accounts` so it can observe completed configurable
422
+ * account key authorizations, and before plugins that read the filled transaction.
423
+ *
424
+ * A saved authorization only replaces a pending authorization that expires earlier,
425
+ * so a replayed older authorization cannot replace a newer one.
426
+ *
427
+ * Memory storage is process-local. Multiple server instances must use the same
428
+ * persistent atomic store to share pending authorizations.
429
+ *
430
+ * @example
431
+ * ```ts
432
+ * import { http } from 'viem'
433
+ * import { Relay, Store, withRelay } from 'viem/tempo'
434
+ *
435
+ * const transport = withRelay(http(), {
436
+ * plugins: [Relay.keyAuthorization({ store: Store.memory() })],
437
+ * })
438
+ * ```
439
+ *
440
+ * @param options - Pending key authorization storage.
441
+ * @returns A plugin that stores and attaches pending key authorizations.
442
+ */
443
+ export function keyAuthorization(
444
+ options: keyAuthorization.Options = {},
445
+ ): keyAuthorization.ReturnType {
446
+ return KeyAuthorization.create(options)
447
+ }
448
+
449
+ export declare namespace keyAuthorization {
450
+ /** Key authorization storage options. */
451
+ export type Options = {
452
+ /** Store for pending key authorizations, with atomic compare-and-set support. Defaults to a process-local memory store. */
453
+ store?: Store.Atomic | undefined
454
+ }
455
+ /** Middleware advertising pending key authorization storage. */
456
+ export type ReturnType = Plugin & { readonly [keyAuthorizationBrand]: true }
457
+ }
458
+
403
459
  /**
404
460
  * Adds balance changes, estimated fees, and execution errors to fill capabilities.
405
461
  *
@@ -4,11 +4,11 @@ import type { Address } from 'abitype'
4
4
  import * as Hex from 'ox/Hex'
5
5
  import * as Signature from 'ox/Signature'
6
6
  import {
7
+ AccountConfig,
8
+ type AccountOperation,
9
+ type AccountSimulation,
7
10
  type AuthorizationTempo,
8
11
  type KeyAuthorization,
9
- MultisigConfig,
10
- type MultisigOperation,
11
- type MultisigSimulation,
12
12
  type TransactionReceipt as ox_TransactionReceipt,
13
13
  SignatureEnvelope,
14
14
  type TempoAddress,
@@ -43,7 +43,7 @@ import {
43
43
  } from '../utils/transaction/parseTransaction.js'
44
44
  import { serializeTransaction as viem_serializeTransaction } from '../utils/transaction/serializeTransaction.js'
45
45
  import type { RootAccount } from './Account.js'
46
- import { parseApproval } from './multisig/Signature.js'
46
+ import { parseApproval } from './accounts/Signature.js'
47
47
 
48
48
  export type Transaction<
49
49
  bigintType = bigint,
@@ -61,7 +61,7 @@ export type TransactionRpc<pending extends boolean = false> = OneOf<
61
61
  > & {
62
62
  authorizationList?: AuthorizationTempo.ListRpc | undefined
63
63
  keyAuthorization?: KeyAuthorization.Rpc | null | undefined
64
- multisig?: MultisigOperation.TransactionRpc | undefined
64
+ operation?: AccountOperation.TransactionRpc | undefined
65
65
  signature: SignatureEnvelope.SignatureEnvelopeRpc
66
66
  })
67
67
  >
@@ -82,7 +82,7 @@ export type TransactionTempo<
82
82
  feeToken?: Address | undefined
83
83
  feePayerSignature?: viem_Signature | undefined
84
84
  keyAuthorization?: KeyAuthorization.Signed<quantity, index> | null | undefined
85
- multisig?: MultisigOperation.TransactionOperation | undefined
85
+ operation?: AccountOperation.TransactionOperation | undefined
86
86
  nonceKey?: quantity | undefined
87
87
  signature: SignatureEnvelope.SignatureEnvelope
88
88
  type: type
@@ -98,7 +98,14 @@ export type TransactionRequest<
98
98
  | TransactionRequestTempo<bigintType, numberType>
99
99
  >
100
100
  export type TransactionRequestRpc = OneOf<
101
- viem_RpcTransactionRequest | TransactionRequestTempo<Hex.Hex, Hex.Hex, '0x76'>
101
+ | viem_RpcTransactionRequest
102
+ | (Omit<
103
+ TransactionRequestTempo<Hex.Hex, Hex.Hex, '0x76'>,
104
+ 'accountSimulation'
105
+ > & {
106
+ /** Account simulation spec, named `multisigSimulation` by the node. */
107
+ multisigSimulation?: AccountSimulation.Rpc | undefined
108
+ })
102
109
  >
103
110
 
104
111
  export type TransactionReceipt<
@@ -106,11 +113,11 @@ export type TransactionReceipt<
106
113
  index = number,
107
114
  status = 'success' | 'reverted' | 'pending',
108
115
  type = TransactionType,
109
- multisig = MultisigOperation.TransactionOperation,
116
+ operation = AccountOperation.TransactionOperation,
110
117
  > = viem_TransactionReceipt<quantity, index, status, type> & {
111
118
  feePayer?: Address | undefined
112
119
  feeToken?: Address | undefined
113
- multisig?: multisig | undefined
120
+ operation?: operation | undefined
114
121
  }
115
122
 
116
123
  export type TransactionReceiptRpc = TransactionReceipt<
@@ -118,7 +125,7 @@ export type TransactionReceiptRpc = TransactionReceipt<
118
125
  Hex.Hex,
119
126
  ox_TransactionReceipt.RpcStatus | 'pending',
120
127
  ox_TransactionReceipt.RpcType,
121
- MultisigOperation.TransactionRpc
128
+ AccountOperation.TransactionRpc
122
129
  >
123
130
 
124
131
  export type TransactionRequestTempo<
@@ -128,6 +135,7 @@ export type TransactionRequestTempo<
128
135
  > = TransactionRequestBase<quantity, index, type> &
129
136
  ExactPartial<FeeValuesEIP1559<quantity>> & {
130
137
  accessList?: AccessList | undefined
138
+ accountSimulation?: AccountSimulation.Spec | undefined
131
139
  calls?: readonly TxTempo.Call<quantity, TempoAddress.Address>[] | undefined
132
140
  capabilities?: ExtractCapabilities<'fillTransaction', 'Request'> | undefined
133
141
  /** Fee-payer account, external relay URL, or sponsorship preference. */
@@ -135,7 +143,6 @@ export type TransactionRequestTempo<
135
143
  feeToken?: TempoAddress.Address | bigint | undefined
136
144
  hash?: Hex.Hex | undefined
137
145
  keyAuthorization?: KeyAuthorization.Signed<quantity, index> | undefined
138
- multisigSimulation?: MultisigSimulation.Spec | undefined
139
146
  /** Nonce lane, or `'expiring'` for time-bounded transactions. `nonce` can distinguish otherwise identical expiring transactions. */
140
147
  nonceKey?: 'expiring' | quantity | undefined
141
148
  owner?: RootAccount | undefined
@@ -168,17 +175,17 @@ export type TransactionSerializableTempo<
168
175
  } & (
169
176
  | {
170
177
  from: Address
171
- multisigSimulation?: MultisigSimulation.Spec | undefined
178
+ accountSimulation?: AccountSimulation.Spec | undefined
172
179
  signatures?: readonly SignatureEnvelope.Serialized[] | undefined
173
180
  }
174
181
  | {
175
182
  from?: Address | undefined
176
- multisigSimulation?: undefined
183
+ accountSimulation?: undefined
177
184
  signatures?: readonly SignatureEnvelope.Serialized[] | undefined
178
185
  }
179
186
  | {
180
187
  from?: Address | undefined
181
- multisigSimulation?: MultisigSimulation.Spec | undefined
188
+ accountSimulation?: AccountSimulation.Spec | undefined
182
189
  signatures?: undefined
183
190
  }
184
191
  )
@@ -201,13 +208,13 @@ export function getType(
201
208
  if (
202
209
  (account?.keyType && account.keyType !== 'secp256k1') ||
203
210
  account?.source === 'accessKey' ||
204
- account?.source === 'multisig' ||
211
+ account?.source === 'configurable' ||
205
212
  typeof transaction.calls !== 'undefined' ||
206
213
  typeof transaction.feePayer !== 'undefined' ||
207
214
  typeof transaction.feePayerSignature !== 'undefined' ||
208
215
  typeof transaction.feeToken !== 'undefined' ||
209
216
  typeof transaction.keyAuthorization !== 'undefined' ||
210
- typeof transaction.multisigSimulation !== 'undefined' ||
217
+ typeof transaction.accountSimulation !== 'undefined' ||
211
218
  typeof transaction.nonceKey !== 'undefined' ||
212
219
  typeof transaction.owner !== 'undefined' ||
213
220
  typeof transaction.signature !== 'undefined' ||
@@ -314,7 +321,7 @@ async function serializeTempo(
314
321
  },
315
322
  sig?: OneOf<SignatureEnvelope.SignatureEnvelope | viem_Signature> | undefined,
316
323
  ) {
317
- // Track caller signatures separately from synthesized multisig approvals.
324
+ // Track caller signatures separately from synthesized owner approvals.
318
325
  const signature_provided = (() => {
319
326
  if (transaction.signature) return transaction.signature
320
327
  if (sig && 'type' in sig) return sig as SignatureEnvelope.SignatureEnvelope
@@ -330,7 +337,7 @@ async function serializeTempo(
330
337
  const {
331
338
  chainId,
332
339
  feePayer,
333
- multisigSimulation,
340
+ accountSimulation,
334
341
  nonce,
335
342
  owner: _owner,
336
343
  ...rest
@@ -352,7 +359,7 @@ async function serializeTempo(
352
359
  transaction.feePayerSignature !== null
353
360
  const hasSenderSignature =
354
361
  typeof signature_provided !== 'undefined' ||
355
- Boolean(multisigSimulation && transaction.signatures)
362
+ Boolean(accountSimulation && transaction.signatures)
356
363
  // Sponsorship sender signatures omit `feeToken`.
357
364
  const shouldStripFeeTokenForSponsorship =
358
365
  // Relay fills a partial sender envelope first.
@@ -393,16 +400,17 @@ async function serializeTempo(
393
400
  // Combine owner approvals before fee-payer handling.
394
401
  const signature = (() => {
395
402
  if (signature_provided) return signature_provided
396
- if (!multisigSimulation || !transaction.signatures) return undefined
403
+ if (!accountSimulation || !transaction.signatures) return undefined
397
404
 
398
405
  const payload = TxTempo.getSignPayload(TxTempo.from(transaction_sender_ox))
399
406
  const signatures = transaction.signatures.map((approval) =>
400
407
  parseApproval(approval),
401
408
  )
402
- const config = MultisigConfig.from(multisigSimulation.config)
409
+ const config = AccountConfig.from(accountSimulation.config)
403
410
  const account = transaction.from
404
- if (!account) throw new Error('A multisig sender is required for signing.')
405
- const sorted = SignatureEnvelope.sortMultisigApprovals({
411
+ if (!account)
412
+ throw new Error('A configurable account sender is required for signing.')
413
+ const sorted = SignatureEnvelope.sortApprovals({
406
414
  account,
407
415
  config,
408
416
  payload,