ox 0.9.16 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +4 -4
  3. package/TxEnvelope/package.json +6 -0
  4. package/TxEnvelopeEip1559/package.json +6 -0
  5. package/TxEnvelopeEip2930/package.json +6 -0
  6. package/TxEnvelopeEip4844/package.json +6 -0
  7. package/TxEnvelopeEip7702/package.json +6 -0
  8. package/TxEnvelopeLegacy/package.json +6 -0
  9. package/_cjs/core/{TransactionEnvelope.js → TxEnvelope.js} +1 -1
  10. package/_cjs/core/TxEnvelope.js.map +1 -0
  11. package/_cjs/core/{TransactionEnvelopeEip1559.js → TxEnvelopeEip1559.js} +2 -2
  12. package/_cjs/core/TxEnvelopeEip1559.js.map +1 -0
  13. package/_cjs/core/{TransactionEnvelopeEip2930.js → TxEnvelopeEip2930.js} +2 -2
  14. package/_cjs/core/TxEnvelopeEip2930.js.map +1 -0
  15. package/_cjs/core/{TransactionEnvelopeEip4844.js → TxEnvelopeEip4844.js} +4 -4
  16. package/_cjs/core/TxEnvelopeEip4844.js.map +1 -0
  17. package/_cjs/core/{TransactionEnvelopeEip7702.js → TxEnvelopeEip7702.js} +4 -4
  18. package/_cjs/core/TxEnvelopeEip7702.js.map +1 -0
  19. package/_cjs/core/{TransactionEnvelopeLegacy.js → TxEnvelopeLegacy.js} +2 -2
  20. package/_cjs/core/TxEnvelopeLegacy.js.map +1 -0
  21. package/_cjs/core/WebAuthnP256.js +1 -1
  22. package/_cjs/core/WebAuthnP256.js.map +1 -1
  23. package/_cjs/erc8021/Attribution.js +36 -6
  24. package/_cjs/erc8021/Attribution.js.map +1 -1
  25. package/_cjs/index.docs.js +1 -0
  26. package/_cjs/index.docs.js.map +1 -1
  27. package/_cjs/index.js +7 -7
  28. package/_cjs/index.js.map +1 -1
  29. package/_cjs/tempo/AuthorizationTempo.js +101 -0
  30. package/_cjs/tempo/AuthorizationTempo.js.map +1 -0
  31. package/_cjs/tempo/KeyAuthorization.js +123 -0
  32. package/_cjs/tempo/KeyAuthorization.js.map +1 -0
  33. package/_cjs/tempo/PoolId.js +10 -0
  34. package/_cjs/tempo/PoolId.js.map +1 -0
  35. package/_cjs/tempo/SignatureEnvelope.js +394 -0
  36. package/_cjs/tempo/SignatureEnvelope.js.map +1 -0
  37. package/_cjs/tempo/Tick.js +77 -0
  38. package/_cjs/tempo/Tick.js.map +1 -0
  39. package/_cjs/tempo/TokenId.js +28 -0
  40. package/_cjs/tempo/TokenId.js.map +1 -0
  41. package/_cjs/tempo/TokenRole.js +26 -0
  42. package/_cjs/tempo/TokenRole.js.map +1 -0
  43. package/_cjs/tempo/Transaction.js +80 -0
  44. package/_cjs/tempo/Transaction.js.map +1 -0
  45. package/_cjs/tempo/TransactionReceipt.js +26 -0
  46. package/_cjs/tempo/TransactionReceipt.js.map +1 -0
  47. package/_cjs/tempo/TransactionRequest.js +53 -0
  48. package/_cjs/tempo/TransactionRequest.js.map +1 -0
  49. package/_cjs/tempo/TxEnvelopeTempo.js +267 -0
  50. package/_cjs/tempo/TxEnvelopeTempo.js.map +1 -0
  51. package/_cjs/tempo/index.js +15 -0
  52. package/_cjs/tempo/index.js.map +1 -0
  53. package/_cjs/version.js +1 -1
  54. package/_esm/core/Blobs.js +8 -8
  55. package/_esm/core/{TransactionEnvelope.js → TxEnvelope.js} +11 -11
  56. package/_esm/core/TxEnvelope.js.map +1 -0
  57. package/_esm/core/{TransactionEnvelopeEip1559.js → TxEnvelopeEip1559.js} +42 -42
  58. package/_esm/core/TxEnvelopeEip1559.js.map +1 -0
  59. package/_esm/core/{TransactionEnvelopeEip2930.js → TxEnvelopeEip2930.js} +43 -43
  60. package/_esm/core/TxEnvelopeEip2930.js.map +1 -0
  61. package/_esm/core/{TransactionEnvelopeEip4844.js → TxEnvelopeEip4844.js} +42 -42
  62. package/_esm/core/TxEnvelopeEip4844.js.map +1 -0
  63. package/_esm/core/{TransactionEnvelopeEip7702.js → TxEnvelopeEip7702.js} +40 -40
  64. package/_esm/core/TxEnvelopeEip7702.js.map +1 -0
  65. package/_esm/core/{TransactionEnvelopeLegacy.js → TxEnvelopeLegacy.js} +42 -42
  66. package/_esm/core/TxEnvelopeLegacy.js.map +1 -0
  67. package/_esm/core/WebAuthnP256.js +1 -1
  68. package/_esm/core/WebAuthnP256.js.map +1 -1
  69. package/_esm/erc8021/Attribution.js +58 -13
  70. package/_esm/erc8021/Attribution.js.map +1 -1
  71. package/_esm/index.docs.js +1 -0
  72. package/_esm/index.docs.js.map +1 -1
  73. package/_esm/index.js +192 -192
  74. package/_esm/index.js.map +1 -1
  75. package/_esm/tempo/AuthorizationTempo.js +664 -0
  76. package/_esm/tempo/AuthorizationTempo.js.map +1 -0
  77. package/_esm/tempo/KeyAuthorization.js +426 -0
  78. package/_esm/tempo/KeyAuthorization.js.map +1 -0
  79. package/_esm/tempo/PoolId.js +28 -0
  80. package/_esm/tempo/PoolId.js.map +1 -0
  81. package/_esm/tempo/SignatureEnvelope.js +660 -0
  82. package/_esm/tempo/SignatureEnvelope.js.map +1 -0
  83. package/_esm/tempo/Tick.js +147 -0
  84. package/_esm/tempo/Tick.js.map +1 -0
  85. package/_esm/tempo/TokenId.js +71 -0
  86. package/_esm/tempo/TokenId.js.map +1 -0
  87. package/_esm/tempo/TokenRole.js +40 -0
  88. package/_esm/tempo/TokenRole.js.map +1 -0
  89. package/_esm/tempo/Transaction.js +167 -0
  90. package/_esm/tempo/Transaction.js.map +1 -0
  91. package/_esm/tempo/TransactionReceipt.js +138 -0
  92. package/_esm/tempo/TransactionReceipt.js.map +1 -0
  93. package/_esm/tempo/TransactionRequest.js +99 -0
  94. package/_esm/tempo/TransactionRequest.js.map +1 -0
  95. package/_esm/tempo/TxEnvelopeTempo.js +607 -0
  96. package/_esm/tempo/TxEnvelopeTempo.js.map +1 -0
  97. package/_esm/tempo/index.js +298 -0
  98. package/_esm/tempo/index.js.map +1 -0
  99. package/_esm/version.js +1 -1
  100. package/_types/core/Blobs.d.ts +8 -8
  101. package/_types/core/{TransactionEnvelope.d.ts → TxEnvelope.d.ts} +11 -11
  102. package/_types/core/TxEnvelope.d.ts.map +1 -0
  103. package/_types/core/{TransactionEnvelopeEip1559.d.ts → TxEnvelopeEip1559.d.ts} +54 -54
  104. package/_types/core/TxEnvelopeEip1559.d.ts.map +1 -0
  105. package/_types/core/{TransactionEnvelopeEip2930.d.ts → TxEnvelopeEip2930.d.ts} +55 -55
  106. package/_types/core/TxEnvelopeEip2930.d.ts.map +1 -0
  107. package/_types/core/{TransactionEnvelopeEip4844.d.ts → TxEnvelopeEip4844.d.ts} +54 -54
  108. package/_types/core/TxEnvelopeEip4844.d.ts.map +1 -0
  109. package/_types/core/{TransactionEnvelopeEip7702.d.ts → TxEnvelopeEip7702.d.ts} +49 -49
  110. package/_types/core/TxEnvelopeEip7702.d.ts.map +1 -0
  111. package/_types/core/{TransactionEnvelopeLegacy.d.ts → TxEnvelopeLegacy.d.ts} +54 -54
  112. package/_types/core/TxEnvelopeLegacy.d.ts.map +1 -0
  113. package/_types/core/WebAuthnP256.d.ts +1 -1
  114. package/_types/core/WebAuthnP256.d.ts.map +1 -1
  115. package/_types/erc8021/Attribution.d.ts +20 -6
  116. package/_types/erc8021/Attribution.d.ts.map +1 -1
  117. package/_types/index.d.ts +192 -192
  118. package/_types/index.d.ts.map +1 -1
  119. package/_types/index.docs.d.ts +1 -0
  120. package/_types/index.docs.d.ts.map +1 -1
  121. package/_types/tempo/AuthorizationTempo.d.ts +688 -0
  122. package/_types/tempo/AuthorizationTempo.d.ts.map +1 -0
  123. package/_types/tempo/KeyAuthorization.d.ts +437 -0
  124. package/_types/tempo/KeyAuthorization.d.ts.map +1 -0
  125. package/_types/tempo/PoolId.d.ts +33 -0
  126. package/_types/tempo/PoolId.d.ts.map +1 -0
  127. package/_types/tempo/SignatureEnvelope.d.ts +438 -0
  128. package/_types/tempo/SignatureEnvelope.d.ts.map +1 -0
  129. package/_types/tempo/Tick.d.ts +120 -0
  130. package/_types/tempo/Tick.d.ts.map +1 -0
  131. package/_types/tempo/TokenId.d.ts +55 -0
  132. package/_types/tempo/TokenId.d.ts.map +1 -0
  133. package/_types/tempo/TokenRole.d.ts +29 -0
  134. package/_types/tempo/TokenRole.d.ts.map +1 -0
  135. package/_types/tempo/Transaction.d.ts +208 -0
  136. package/_types/tempo/Transaction.d.ts.map +1 -0
  137. package/_types/tempo/TransactionReceipt.d.ts +165 -0
  138. package/_types/tempo/TransactionReceipt.d.ts.map +1 -0
  139. package/_types/tempo/TransactionRequest.d.ts +89 -0
  140. package/_types/tempo/TransactionRequest.d.ts.map +1 -0
  141. package/_types/tempo/TxEnvelopeTempo.d.ts +551 -0
  142. package/_types/tempo/TxEnvelopeTempo.d.ts.map +1 -0
  143. package/_types/tempo/index.d.ts +300 -0
  144. package/_types/tempo/index.d.ts.map +1 -0
  145. package/_types/version.d.ts +1 -1
  146. package/core/Blobs.ts +8 -8
  147. package/core/{TransactionEnvelope.ts → TxEnvelope.ts} +10 -10
  148. package/core/{TransactionEnvelopeEip1559.ts → TxEnvelopeEip1559.ts} +60 -69
  149. package/core/{TransactionEnvelopeEip2930.ts → TxEnvelopeEip2930.ts} +61 -72
  150. package/core/{TransactionEnvelopeEip4844.ts → TxEnvelopeEip4844.ts} +62 -71
  151. package/core/{TransactionEnvelopeEip7702.ts → TxEnvelopeEip7702.ts} +58 -67
  152. package/core/{TransactionEnvelopeLegacy.ts → TxEnvelopeLegacy.ts} +59 -68
  153. package/core/WebAuthnP256.ts +3 -1
  154. package/erc8021/Attribution.ts +77 -15
  155. package/index.docs.ts +1 -0
  156. package/index.ts +192 -195
  157. package/package.json +91 -31
  158. package/tempo/AuthorizationTempo/package.json +6 -0
  159. package/tempo/AuthorizationTempo.test.ts +1293 -0
  160. package/tempo/AuthorizationTempo.ts +884 -0
  161. package/tempo/KeyAuthorization/package.json +6 -0
  162. package/tempo/KeyAuthorization.test.ts +1373 -0
  163. package/tempo/KeyAuthorization.ts +622 -0
  164. package/tempo/PoolId/package.json +6 -0
  165. package/tempo/PoolId.test.ts +33 -0
  166. package/tempo/PoolId.ts +42 -0
  167. package/tempo/SignatureEnvelope/package.json +6 -0
  168. package/tempo/SignatureEnvelope.test.ts +1877 -0
  169. package/tempo/SignatureEnvelope.ts +973 -0
  170. package/tempo/Tick/package.json +6 -0
  171. package/tempo/Tick.test.ts +281 -0
  172. package/tempo/Tick.ts +186 -0
  173. package/tempo/TokenId/package.json +6 -0
  174. package/tempo/TokenId.test.ts +40 -0
  175. package/tempo/TokenId.ts +80 -0
  176. package/tempo/TokenRole/package.json +6 -0
  177. package/tempo/TokenRole.test.ts +16 -0
  178. package/tempo/TokenRole.ts +45 -0
  179. package/tempo/Transaction/package.json +6 -0
  180. package/tempo/Transaction.test.ts +523 -0
  181. package/tempo/Transaction.ts +339 -0
  182. package/tempo/TransactionReceipt/package.json +6 -0
  183. package/tempo/TransactionReceipt.ts +200 -0
  184. package/tempo/TransactionRequest/package.json +6 -0
  185. package/tempo/TransactionRequest.ts +160 -0
  186. package/tempo/TxEnvelopeTempo/package.json +6 -0
  187. package/tempo/TxEnvelopeTempo.test.ts +1371 -0
  188. package/tempo/TxEnvelopeTempo.ts +972 -0
  189. package/tempo/e2e.test.ts +1387 -0
  190. package/tempo/index.ts +308 -0
  191. package/tempo/package.json +6 -0
  192. package/version.ts +1 -1
  193. package/TransactionEnvelope/package.json +0 -6
  194. package/TransactionEnvelopeEip1559/package.json +0 -6
  195. package/TransactionEnvelopeEip2930/package.json +0 -6
  196. package/TransactionEnvelopeEip4844/package.json +0 -6
  197. package/TransactionEnvelopeEip7702/package.json +0 -6
  198. package/TransactionEnvelopeLegacy/package.json +0 -6
  199. package/_cjs/core/TransactionEnvelope.js.map +0 -1
  200. package/_cjs/core/TransactionEnvelopeEip1559.js.map +0 -1
  201. package/_cjs/core/TransactionEnvelopeEip2930.js.map +0 -1
  202. package/_cjs/core/TransactionEnvelopeEip4844.js.map +0 -1
  203. package/_cjs/core/TransactionEnvelopeEip7702.js.map +0 -1
  204. package/_cjs/core/TransactionEnvelopeLegacy.js.map +0 -1
  205. package/_esm/core/TransactionEnvelope.js.map +0 -1
  206. package/_esm/core/TransactionEnvelopeEip1559.js.map +0 -1
  207. package/_esm/core/TransactionEnvelopeEip2930.js.map +0 -1
  208. package/_esm/core/TransactionEnvelopeEip4844.js.map +0 -1
  209. package/_esm/core/TransactionEnvelopeEip7702.js.map +0 -1
  210. package/_esm/core/TransactionEnvelopeLegacy.js.map +0 -1
  211. package/_types/core/TransactionEnvelope.d.ts.map +0 -1
  212. package/_types/core/TransactionEnvelopeEip1559.d.ts.map +0 -1
  213. package/_types/core/TransactionEnvelopeEip2930.d.ts.map +0 -1
  214. package/_types/core/TransactionEnvelopeEip4844.d.ts.map +0 -1
  215. package/_types/core/TransactionEnvelopeEip7702.d.ts.map +0 -1
  216. package/_types/core/TransactionEnvelopeLegacy.d.ts.map +0 -1
@@ -0,0 +1,660 @@
1
+ import * as Errors from '../core/Errors.js';
2
+ import * as Hex from '../core/Hex.js';
3
+ import * as Json from '../core/Json.js';
4
+ import * as Signature from '../core/Signature.js';
5
+ /** Signature type identifiers for encoding/decoding */
6
+ const serializedP256Type = '0x01';
7
+ const serializedWebAuthnType = '0x02';
8
+ const serializedKeychainType = '0x03';
9
+ /** List of supported signature types. */
10
+ export const types = ['secp256k1', 'p256', 'webAuthn'];
11
+ /**
12
+ * Asserts that a {@link ox#SignatureEnvelope.SignatureEnvelope} is valid.
13
+ *
14
+ * @example
15
+ * ```ts twoslash
16
+ * import { SignatureEnvelope } from 'ox/tempo'
17
+ *
18
+ * SignatureEnvelope.assert({
19
+ * type: 'secp256k1',
20
+ * signature: {
21
+ * r: 0n,
22
+ * s: 0n,
23
+ * yParity: 0,
24
+ * },
25
+ * })
26
+ * ```
27
+ *
28
+ * @param envelope - The signature envelope to assert.
29
+ * @throws `CoercionError` if the envelope type cannot be determined.
30
+ */
31
+ export function assert(envelope) {
32
+ const type = getType(envelope);
33
+ if (type === 'secp256k1') {
34
+ const secp256k1 = envelope;
35
+ Signature.assert(secp256k1.signature);
36
+ return;
37
+ }
38
+ if (type === 'p256') {
39
+ const p256 = envelope;
40
+ const missing = [];
41
+ if (typeof p256.signature?.r !== 'bigint')
42
+ missing.push('signature.r');
43
+ if (typeof p256.signature?.s !== 'bigint')
44
+ missing.push('signature.s');
45
+ if (typeof p256.prehash !== 'boolean')
46
+ missing.push('prehash');
47
+ if (!p256.publicKey)
48
+ missing.push('publicKey');
49
+ else {
50
+ if (typeof p256.publicKey.x !== 'bigint')
51
+ missing.push('publicKey.x');
52
+ if (typeof p256.publicKey.y !== 'bigint')
53
+ missing.push('publicKey.y');
54
+ }
55
+ if (missing.length > 0)
56
+ throw new MissingPropertiesError({ envelope, missing, type: 'p256' });
57
+ return;
58
+ }
59
+ if (type === 'webAuthn') {
60
+ const webauthn = envelope;
61
+ const missing = [];
62
+ if (typeof webauthn.signature?.r !== 'bigint')
63
+ missing.push('signature.r');
64
+ if (typeof webauthn.signature?.s !== 'bigint')
65
+ missing.push('signature.s');
66
+ if (!webauthn.metadata)
67
+ missing.push('metadata');
68
+ else {
69
+ if (!webauthn.metadata.authenticatorData)
70
+ missing.push('metadata.authenticatorData');
71
+ if (!webauthn.metadata.clientDataJSON)
72
+ missing.push('metadata.clientDataJSON');
73
+ }
74
+ if (!webauthn.publicKey)
75
+ missing.push('publicKey');
76
+ else {
77
+ if (typeof webauthn.publicKey.x !== 'bigint')
78
+ missing.push('publicKey.x');
79
+ if (typeof webauthn.publicKey.y !== 'bigint')
80
+ missing.push('publicKey.y');
81
+ }
82
+ if (missing.length > 0)
83
+ throw new MissingPropertiesError({ envelope, missing, type: 'webAuthn' });
84
+ return;
85
+ }
86
+ if (type === 'keychain') {
87
+ const keychain = envelope;
88
+ assert(keychain.inner);
89
+ return;
90
+ }
91
+ }
92
+ /**
93
+ * Deserializes a hex-encoded signature envelope into a typed signature object.
94
+ *
95
+ * Wire format detection:
96
+ * - 65 bytes (no prefix): secp256k1 signature
97
+ * - Type `0x01` + 129 bytes: P256 signature (r, s, pubKeyX, pubKeyY, prehash)
98
+ * - Type `0x02` + variable: WebAuthn signature (webauthnData, r, s, pubKeyX, pubKeyY)
99
+ * - Type `0x03` + 20 bytes + inner: Keychain signature (userAddress + inner signature)
100
+ *
101
+ * [Signature Types](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction#signature-types)
102
+ *
103
+ * @example
104
+ * ```ts twoslash
105
+ * import { SignatureEnvelope } from 'ox/tempo'
106
+ *
107
+ * const envelope = SignatureEnvelope.deserialize('0x...')
108
+ * ```
109
+ *
110
+ * @param serialized - The hex-encoded signature envelope to deserialize.
111
+ * @returns The deserialized signature envelope.
112
+ * @throws `CoercionError` if the serialized value cannot be coerced to a valid signature envelope.
113
+ */
114
+ export function deserialize(serialized) {
115
+ const size = Hex.size(serialized);
116
+ // Backward compatibility: 65 bytes means secp256k1 without type identifier
117
+ if (size === 65) {
118
+ const signature = Signature.fromHex(serialized);
119
+ Signature.assert(signature);
120
+ return { signature, type: 'secp256k1' };
121
+ }
122
+ // For all other lengths, first byte is the type identifier
123
+ const typeId = Hex.slice(serialized, 0, 1);
124
+ const data = Hex.slice(serialized, 1);
125
+ const dataSize = Hex.size(data);
126
+ if (typeId === serializedP256Type) {
127
+ // P256: 32 (r) + 32 (s) + 32 (pubKeyX) + 32 (pubKeyY) + 1 (prehash) = 129 bytes
128
+ if (dataSize !== 129)
129
+ throw new InvalidSerializedError({
130
+ reason: `Invalid P256 signature envelope size: expected 129 bytes, got ${dataSize} bytes`,
131
+ serialized,
132
+ });
133
+ return {
134
+ publicKey: {
135
+ prefix: 4,
136
+ x: Hex.toBigInt(Hex.slice(data, 64, 96)),
137
+ y: Hex.toBigInt(Hex.slice(data, 96, 128)),
138
+ },
139
+ prehash: Hex.toNumber(Hex.slice(data, 128, 129)) !== 0,
140
+ signature: {
141
+ r: Hex.toBigInt(Hex.slice(data, 0, 32)),
142
+ s: Hex.toBigInt(Hex.slice(data, 32, 64)),
143
+ },
144
+ type: 'p256',
145
+ };
146
+ }
147
+ if (typeId === serializedWebAuthnType) {
148
+ // WebAuthn: variable (webauthnData) + 32 (r) + 32 (s) + 32 (pubKeyX) + 32 (pubKeyY)
149
+ // Minimum: 128 bytes (at least some authenticator data + signature components)
150
+ if (dataSize < 128)
151
+ throw new InvalidSerializedError({
152
+ reason: `Invalid WebAuthn signature envelope size: expected at least 128 bytes, got ${dataSize} bytes`,
153
+ serialized,
154
+ });
155
+ const webauthnDataSize = dataSize - 128;
156
+ const webauthnData = Hex.slice(data, 0, webauthnDataSize);
157
+ // Parse webauthnData into authenticatorData and clientDataJSON
158
+ // According to the Rust code, it's authenticatorData || clientDataJSON
159
+ // We need to find the split point (minimum authenticatorData is 37 bytes)
160
+ let authenticatorData;
161
+ let clientDataJSON;
162
+ // Try to find the JSON start (clientDataJSON should start with '{')
163
+ for (let split = 37; split < webauthnDataSize; split++) {
164
+ const potentialJson = Hex.toString(Hex.slice(webauthnData, split));
165
+ if (potentialJson.startsWith('{') && potentialJson.endsWith('}')) {
166
+ try {
167
+ JSON.parse(potentialJson);
168
+ authenticatorData = Hex.slice(webauthnData, 0, split);
169
+ clientDataJSON = potentialJson;
170
+ break;
171
+ }
172
+ catch { }
173
+ }
174
+ }
175
+ if (!authenticatorData || !clientDataJSON)
176
+ throw new InvalidSerializedError({
177
+ reason: 'Unable to parse WebAuthn metadata: could not extract valid authenticatorData and clientDataJSON',
178
+ serialized,
179
+ });
180
+ return {
181
+ publicKey: {
182
+ prefix: 4,
183
+ x: Hex.toBigInt(Hex.slice(data, webauthnDataSize + 64, webauthnDataSize + 96)),
184
+ y: Hex.toBigInt(Hex.slice(data, webauthnDataSize + 96, webauthnDataSize + 128)),
185
+ },
186
+ metadata: {
187
+ authenticatorData,
188
+ clientDataJSON,
189
+ },
190
+ signature: {
191
+ r: Hex.toBigInt(Hex.slice(data, webauthnDataSize, webauthnDataSize + 32)),
192
+ s: Hex.toBigInt(Hex.slice(data, webauthnDataSize + 32, webauthnDataSize + 64)),
193
+ },
194
+ type: 'webAuthn',
195
+ };
196
+ }
197
+ if (typeId === serializedKeychainType) {
198
+ const userAddress = Hex.slice(data, 0, 20);
199
+ const inner = deserialize(Hex.slice(data, 20));
200
+ return {
201
+ userAddress,
202
+ inner,
203
+ type: 'keychain',
204
+ };
205
+ }
206
+ throw new InvalidSerializedError({
207
+ reason: `Unknown signature type identifier: ${typeId}. Expected ${serializedP256Type} (P256) or ${serializedWebAuthnType} (WebAuthn)`,
208
+ serialized,
209
+ });
210
+ }
211
+ /**
212
+ * Coerces a value to a signature envelope.
213
+ *
214
+ * Accepts either a serialized hex string or an existing signature envelope object.
215
+ * Use this to wrap raw signatures from {@link ox#Secp256k1.(sign:function)}, {@link ox#P256.(sign:function)},
216
+ * {@link ox#WebCryptoP256.(sign:function)}, or {@link ox#WebAuthnP256.(sign:function)} into the envelope format
217
+ * required by Tempo transactions.
218
+ *
219
+ * [Signature Types](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction#signature-types)
220
+ *
221
+ * @example
222
+ * ### Secp256k1
223
+ *
224
+ * Standard Ethereum ECDSA signature using the secp256k1 curve.
225
+ *
226
+ * ```ts twoslash
227
+ * import { Secp256k1 } from 'ox'
228
+ * import { SignatureEnvelope } from 'ox/tempo'
229
+ *
230
+ * const privateKey = Secp256k1.randomPrivateKey()
231
+ * const signature = Secp256k1.sign({ payload: '0xdeadbeef', privateKey })
232
+ *
233
+ * const envelope = SignatureEnvelope.from(signature)
234
+ * ```
235
+ *
236
+ * @example
237
+ * ### P256
238
+ *
239
+ * ECDSA signature using the P-256 (secp256r1) curve. Requires embedding the
240
+ * public key.
241
+ *
242
+ * ```ts twoslash
243
+ * import { P256 } from 'ox'
244
+ * import { SignatureEnvelope } from 'ox/tempo'
245
+ *
246
+ * const { privateKey, publicKey } = P256.createKeyPair()
247
+ * const signature = P256.sign({ payload: '0xdeadbeef', privateKey })
248
+ *
249
+ * const envelope = SignatureEnvelope.from({
250
+ * signature,
251
+ * publicKey,
252
+ * })
253
+ * ```
254
+ *
255
+ * @example
256
+ * ### P256 (WebCrypto)
257
+ *
258
+ * When using WebCrypto keys, `prehash` must be `true` since WebCrypto always
259
+ * SHA256 hashes the digest before signing.
260
+ *
261
+ * ```ts twoslash
262
+ * // @noErrors
263
+ * import { WebCryptoP256 } from 'ox'
264
+ * import { SignatureEnvelope } from 'ox/tempo'
265
+ *
266
+ * const { privateKey, publicKey } = await WebCryptoP256.createKeyPair()
267
+ * const signature = await WebCryptoP256.sign({ payload: '0xdeadbeef', privateKey })
268
+ *
269
+ * const envelope = SignatureEnvelope.from({
270
+ * signature,
271
+ * publicKey,
272
+ * prehash: true,
273
+ * })
274
+ * ```
275
+ *
276
+ * @example
277
+ * ### WebAuthn
278
+ *
279
+ * Passkey-based signature using WebAuthn. Includes authenticator metadata
280
+ * (authenticatorData and clientDataJSON) along with the P-256 signature and
281
+ * public key.
282
+ *
283
+ * ```ts twoslash
284
+ * // @noErrors
285
+ * import { WebAuthnP256 } from 'ox'
286
+ * import { SignatureEnvelope } from 'ox/tempo'
287
+ *
288
+ * const credential = await WebAuthnP256.createCredential({
289
+ * name: 'Example',
290
+ * })
291
+ *
292
+ * const { metadata, signature } = await WebAuthnP256.sign({
293
+ * challenge: '0xdeadbeef',
294
+ * credentialId: credential.id,
295
+ * })
296
+ *
297
+ * const envelope = SignatureEnvelope.from({
298
+ * signature,
299
+ * publicKey: credential.publicKey,
300
+ * metadata,
301
+ * })
302
+ * ```
303
+ *
304
+ * @example
305
+ * ### Keychain
306
+ *
307
+ * Wraps another signature type with a user address, used for delegated signing
308
+ * via access keys on behalf of a root account.
309
+ *
310
+ * ```ts twoslash
311
+ * import { Secp256k1 } from 'ox'
312
+ * import { SignatureEnvelope } from 'ox/tempo'
313
+ *
314
+ * const privateKey = Secp256k1.randomPrivateKey()
315
+ * const signature = Secp256k1.sign({ payload: '0xdeadbeef', privateKey })
316
+ *
317
+ * const envelope = SignatureEnvelope.from({
318
+ * userAddress: '0x1234567890123456789012345678901234567890',
319
+ * inner: SignatureEnvelope.from(signature),
320
+ * })
321
+ * ```
322
+ *
323
+ * @param value - The value to coerce (either a hex string or signature envelope).
324
+ * @returns The signature envelope.
325
+ */
326
+ export function from(value) {
327
+ if (typeof value === 'string')
328
+ return deserialize(value);
329
+ if (typeof value === 'object' &&
330
+ value !== null &&
331
+ 'r' in value &&
332
+ 's' in value &&
333
+ 'yParity' in value)
334
+ return { signature: value, type: 'secp256k1' };
335
+ const type = getType(value);
336
+ return {
337
+ ...value,
338
+ ...(type === 'p256' ? { prehash: value.prehash } : {}),
339
+ type,
340
+ };
341
+ }
342
+ /**
343
+ * Converts an RPC-formatted signature envelope to a typed signature envelope.
344
+ *
345
+ * @example
346
+ * ```ts twoslash
347
+ * import { SignatureEnvelope } from 'ox/tempo'
348
+ *
349
+ * const envelope = SignatureEnvelope.fromRpc({
350
+ * r: '0x0',
351
+ * s: '0x0',
352
+ * yParity: '0x0',
353
+ * type: 'secp256k1',
354
+ * })
355
+ * ```
356
+ *
357
+ * @param envelope - The RPC signature envelope to convert.
358
+ * @returns The signature envelope with bigint values.
359
+ */
360
+ export function fromRpc(envelope) {
361
+ if (envelope.type === 'secp256k1')
362
+ return {
363
+ signature: Signature.fromRpc(envelope),
364
+ type: 'secp256k1',
365
+ };
366
+ if (envelope.type === 'p256') {
367
+ return {
368
+ prehash: envelope.prehash,
369
+ publicKey: {
370
+ prefix: 4,
371
+ x: Hex.toBigInt(envelope.pubKeyX),
372
+ y: Hex.toBigInt(envelope.pubKeyY),
373
+ },
374
+ signature: {
375
+ r: Hex.toBigInt(envelope.r),
376
+ s: Hex.toBigInt(envelope.s),
377
+ },
378
+ type: 'p256',
379
+ };
380
+ }
381
+ if (envelope.type === 'webAuthn') {
382
+ const webauthnData = envelope.webauthnData;
383
+ const webauthnDataSize = Hex.size(webauthnData);
384
+ // Parse webauthnData into authenticatorData and clientDataJSON
385
+ let authenticatorData;
386
+ let clientDataJSON;
387
+ // Try to find the JSON start (clientDataJSON should start with '{')
388
+ for (let split = 37; split < webauthnDataSize; split++) {
389
+ const potentialJson = Hex.toString(Hex.slice(webauthnData, split));
390
+ if (potentialJson.startsWith('{') && potentialJson.endsWith('}')) {
391
+ try {
392
+ JSON.parse(potentialJson);
393
+ authenticatorData = Hex.slice(webauthnData, 0, split);
394
+ clientDataJSON = potentialJson;
395
+ break;
396
+ }
397
+ catch { }
398
+ }
399
+ }
400
+ if (!authenticatorData || !clientDataJSON)
401
+ throw new InvalidSerializedError({
402
+ reason: 'Unable to parse WebAuthn metadata: could not extract valid authenticatorData and clientDataJSON',
403
+ serialized: webauthnData,
404
+ });
405
+ return {
406
+ metadata: {
407
+ authenticatorData,
408
+ clientDataJSON,
409
+ },
410
+ publicKey: {
411
+ prefix: 4,
412
+ x: Hex.toBigInt(envelope.pubKeyX),
413
+ y: Hex.toBigInt(envelope.pubKeyY),
414
+ },
415
+ signature: {
416
+ r: Hex.toBigInt(envelope.r),
417
+ s: Hex.toBigInt(envelope.s),
418
+ },
419
+ type: 'webAuthn',
420
+ };
421
+ }
422
+ if (envelope.type === 'keychain' ||
423
+ ('userAddress' in envelope && 'signature' in envelope))
424
+ return {
425
+ type: 'keychain',
426
+ userAddress: envelope.userAddress,
427
+ inner: fromRpc(envelope.signature),
428
+ };
429
+ throw new CoercionError({ envelope });
430
+ }
431
+ /**
432
+ * Determines the signature type of an envelope.
433
+ *
434
+ * @example
435
+ * ```ts twoslash
436
+ * import { SignatureEnvelope } from 'ox/tempo'
437
+ *
438
+ * const type = SignatureEnvelope.getType({
439
+ * signature: { r: 0n, s: 0n, yParity: 0 },
440
+ * })
441
+ * // @log: 'secp256k1'
442
+ * ```
443
+ *
444
+ * @param envelope - The signature envelope to inspect.
445
+ * @returns The signature type ('secp256k1', 'p256', or 'webAuthn').
446
+ * @throws `CoercionError` if the envelope type cannot be determined.
447
+ */
448
+ export function getType(envelope) {
449
+ if (typeof envelope !== 'object' || envelope === null)
450
+ throw new CoercionError({ envelope });
451
+ if ('type' in envelope && envelope.type)
452
+ return envelope.type;
453
+ // Detect secp256k1 signature (backwards compatibility: also support flat structure)
454
+ if ('signature' in envelope &&
455
+ !('publicKey' in envelope) &&
456
+ typeof envelope.signature === 'object' &&
457
+ envelope.signature !== null &&
458
+ 'r' in envelope.signature &&
459
+ 's' in envelope.signature &&
460
+ 'yParity' in envelope.signature)
461
+ return 'secp256k1';
462
+ // Detect secp256k1 signature (flat structure)
463
+ if ('r' in envelope && 's' in envelope && 'yParity' in envelope)
464
+ return 'secp256k1';
465
+ // Detect P256 signature
466
+ if ('signature' in envelope &&
467
+ 'prehash' in envelope &&
468
+ 'publicKey' in envelope &&
469
+ typeof envelope.prehash === 'boolean')
470
+ return 'p256';
471
+ // Detect WebAuthn signature
472
+ if ('signature' in envelope &&
473
+ 'metadata' in envelope &&
474
+ 'publicKey' in envelope)
475
+ return 'webAuthn';
476
+ // Detect Keychain signature
477
+ if ('userAddress' in envelope && 'inner' in envelope)
478
+ return 'keychain';
479
+ throw new CoercionError({
480
+ envelope,
481
+ });
482
+ }
483
+ /**
484
+ * Serializes a signature envelope to a hex-encoded string.
485
+ *
486
+ * Wire format:
487
+ * - secp256k1: 65 bytes (no type prefix, for backward compatibility)
488
+ * - P256: `0x01` + r (32) + s (32) + pubKeyX (32) + pubKeyY (32) + prehash (1) = 130 bytes
489
+ * - WebAuthn: `0x02` + webauthnData (variable) + r (32) + s (32) + pubKeyX (32) + pubKeyY (32)
490
+ * - Keychain: `0x03` + userAddress (20) + inner signature (recursive)
491
+ *
492
+ * [Signature Types](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction#signature-types)
493
+ *
494
+ * @example
495
+ * ```ts twoslash
496
+ * import { SignatureEnvelope } from 'ox/tempo'
497
+ *
498
+ * const serialized = SignatureEnvelope.serialize({
499
+ * signature: { r: 0n, s: 0n, yParity: 0 },
500
+ * type: 'secp256k1',
501
+ * })
502
+ * ```
503
+ *
504
+ * @param envelope - The signature envelope to serialize.
505
+ * @returns The hex-encoded serialized signature.
506
+ * @throws `CoercionError` if the envelope cannot be serialized.
507
+ */
508
+ export function serialize(envelope) {
509
+ const type = getType(envelope);
510
+ // Backward compatibility: no type identifier for secp256k1
511
+ if (type === 'secp256k1') {
512
+ const secp256k1 = envelope;
513
+ return Signature.toHex(secp256k1.signature);
514
+ }
515
+ if (type === 'p256') {
516
+ const p256 = envelope;
517
+ // Format: 1 byte (type) + 32 (r) + 32 (s) + 32 (pubKeyX) + 32 (pubKeyY) + 1 (prehash)
518
+ return Hex.concat(serializedP256Type, Hex.fromNumber(p256.signature.r, { size: 32 }), Hex.fromNumber(p256.signature.s, { size: 32 }), Hex.fromNumber(p256.publicKey.x, { size: 32 }), Hex.fromNumber(p256.publicKey.y, { size: 32 }), Hex.fromNumber(p256.prehash ? 1 : 0, { size: 1 }));
519
+ }
520
+ if (type === 'webAuthn') {
521
+ const webauthn = envelope;
522
+ // Format: 1 byte (type) + variable (authenticatorData || clientDataJSON) + 32 (r) + 32 (s) + 32 (pubKeyX) + 32 (pubKeyY)
523
+ const webauthnData = Hex.concat(webauthn.metadata.authenticatorData, Hex.fromString(webauthn.metadata.clientDataJSON));
524
+ return Hex.concat(serializedWebAuthnType, webauthnData, Hex.fromNumber(webauthn.signature.r, { size: 32 }), Hex.fromNumber(webauthn.signature.s, { size: 32 }), Hex.fromNumber(webauthn.publicKey.x, { size: 32 }), Hex.fromNumber(webauthn.publicKey.y, { size: 32 }));
525
+ }
526
+ if (type === 'keychain') {
527
+ const keychain = envelope;
528
+ return Hex.concat(serializedKeychainType, keychain.userAddress, serialize(keychain.inner));
529
+ }
530
+ throw new CoercionError({ envelope });
531
+ }
532
+ /**
533
+ * Converts a signature envelope to RPC format.
534
+ *
535
+ * @example
536
+ * ```ts twoslash
537
+ * import { SignatureEnvelope } from 'ox/tempo'
538
+ *
539
+ * const rpc = SignatureEnvelope.toRpc({
540
+ * signature: { r: 0n, s: 0n, yParity: 0 },
541
+ * type: 'secp256k1',
542
+ * })
543
+ * ```
544
+ *
545
+ * @param envelope - The signature envelope to convert.
546
+ * @returns The RPC signature envelope with hex values.
547
+ */
548
+ export function toRpc(envelope) {
549
+ const type = getType(envelope);
550
+ if (type === 'secp256k1') {
551
+ const secp256k1 = envelope;
552
+ return {
553
+ ...Signature.toRpc(secp256k1.signature),
554
+ type: 'secp256k1',
555
+ };
556
+ }
557
+ if (type === 'p256') {
558
+ const p256 = envelope;
559
+ return {
560
+ prehash: p256.prehash,
561
+ pubKeyX: Hex.fromNumber(p256.publicKey.x, { size: 32 }),
562
+ pubKeyY: Hex.fromNumber(p256.publicKey.y, { size: 32 }),
563
+ r: Hex.fromNumber(p256.signature.r, { size: 32 }),
564
+ s: Hex.fromNumber(p256.signature.s, { size: 32 }),
565
+ type: 'p256',
566
+ };
567
+ }
568
+ if (type === 'webAuthn') {
569
+ const webauthn = envelope;
570
+ const webauthnData = Hex.concat(webauthn.metadata.authenticatorData, Hex.fromString(webauthn.metadata.clientDataJSON));
571
+ return {
572
+ pubKeyX: Hex.fromNumber(webauthn.publicKey.x, { size: 32 }),
573
+ pubKeyY: Hex.fromNumber(webauthn.publicKey.y, { size: 32 }),
574
+ r: Hex.fromNumber(webauthn.signature.r, { size: 32 }),
575
+ s: Hex.fromNumber(webauthn.signature.s, { size: 32 }),
576
+ type: 'webAuthn',
577
+ webauthnData,
578
+ };
579
+ }
580
+ if (type === 'keychain') {
581
+ const keychain = envelope;
582
+ return {
583
+ type: 'keychain',
584
+ userAddress: keychain.userAddress,
585
+ signature: toRpc(keychain.inner),
586
+ };
587
+ }
588
+ throw new CoercionError({ envelope });
589
+ }
590
+ /**
591
+ * Validates a signature envelope. Returns `true` if the envelope is valid, `false` otherwise.
592
+ *
593
+ * @example
594
+ * ```ts twoslash
595
+ * import { SignatureEnvelope } from 'ox/tempo'
596
+ *
597
+ * const valid = SignatureEnvelope.validate({
598
+ * signature: { r: 0n, s: 0n, yParity: 0 },
599
+ * type: 'secp256k1',
600
+ * })
601
+ * // @log: true
602
+ * ```
603
+ *
604
+ * @param envelope - The signature envelope to validate.
605
+ * @returns `true` if valid, `false` otherwise.
606
+ */
607
+ export function validate(envelope) {
608
+ try {
609
+ assert(envelope);
610
+ return true;
611
+ }
612
+ catch {
613
+ return false;
614
+ }
615
+ }
616
+ /**
617
+ * Error thrown when a signature envelope cannot be coerced to a valid type.
618
+ */
619
+ export class CoercionError extends Errors.BaseError {
620
+ constructor({ envelope }) {
621
+ super(`Unable to coerce value (\`${Json.stringify(envelope)}\`) to a valid signature envelope.`);
622
+ Object.defineProperty(this, "name", {
623
+ enumerable: true,
624
+ configurable: true,
625
+ writable: true,
626
+ value: 'SignatureEnvelope.CoercionError'
627
+ });
628
+ }
629
+ }
630
+ /**
631
+ * Error thrown when a signature envelope is missing required properties.
632
+ */
633
+ export class MissingPropertiesError extends Errors.BaseError {
634
+ constructor({ envelope, missing, type, }) {
635
+ super(`Signature envelope of type "${type}" is missing required properties: ${missing.map((m) => `\`${m}\``).join(', ')}.\n\nProvided: ${Json.stringify(envelope)}`);
636
+ Object.defineProperty(this, "name", {
637
+ enumerable: true,
638
+ configurable: true,
639
+ writable: true,
640
+ value: 'SignatureEnvelope.MissingPropertiesError'
641
+ });
642
+ }
643
+ }
644
+ /**
645
+ * Error thrown when a serialized signature envelope cannot be deserialized.
646
+ */
647
+ export class InvalidSerializedError extends Errors.BaseError {
648
+ constructor({ reason, serialized, }) {
649
+ super(`Unable to deserialize signature envelope: ${reason}`, {
650
+ metaMessages: [`Serialized: ${serialized}`],
651
+ });
652
+ Object.defineProperty(this, "name", {
653
+ enumerable: true,
654
+ configurable: true,
655
+ writable: true,
656
+ value: 'SignatureEnvelope.InvalidSerializedError'
657
+ });
658
+ }
659
+ }
660
+ //# sourceMappingURL=SignatureEnvelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignatureEnvelope.js","sourceRoot":"","sources":["../../tempo/SignatureEnvelope.ts"],"names":[],"mappings":"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"}