ox 0.12.3 → 0.13.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.
- package/CHANGELOG.md +17 -0
- package/_cjs/core/P256.js +1 -1
- package/_cjs/core/P256.js.map +1 -1
- package/_cjs/core/WebAuthnP256.js +15 -256
- package/_cjs/core/WebAuthnP256.js.map +1 -1
- package/_cjs/core/WebCryptoP256.js +3 -1
- package/_cjs/core/WebCryptoP256.js.map +1 -1
- package/_cjs/core/internal/webauthn.js +5 -13
- package/_cjs/core/internal/webauthn.js.map +1 -1
- package/_cjs/index.docs.js +1 -0
- package/_cjs/index.docs.js.map +1 -1
- package/_cjs/tempo/TxEnvelopeTempo.js +19 -1
- package/_cjs/tempo/TxEnvelopeTempo.js.map +1 -1
- package/_cjs/version.js +1 -1
- package/_cjs/webauthn/Authentication.js +246 -0
- package/_cjs/webauthn/Authentication.js.map +1 -0
- package/_cjs/webauthn/Authenticator.js +55 -0
- package/_cjs/webauthn/Authenticator.js.map +1 -0
- package/_cjs/webauthn/Credential.js +53 -0
- package/_cjs/webauthn/Credential.js.map +1 -0
- package/_cjs/webauthn/Registration.js +349 -0
- package/_cjs/webauthn/Registration.js.map +1 -0
- package/_cjs/webauthn/Types.js +3 -0
- package/_cjs/webauthn/Types.js.map +1 -0
- package/_cjs/webauthn/index.js +9 -0
- package/_cjs/webauthn/index.js.map +1 -0
- package/_cjs/webauthn/internal/utils.js +53 -0
- package/_cjs/webauthn/internal/utils.js.map +1 -0
- package/_esm/core/P256.js +1 -1
- package/_esm/core/P256.js.map +1 -1
- package/_esm/core/WebAuthnP256.js +13 -261
- package/_esm/core/WebAuthnP256.js.map +1 -1
- package/_esm/core/WebCryptoP256.js +4 -1
- package/_esm/core/WebCryptoP256.js.map +1 -1
- package/_esm/core/internal/webauthn.js +5 -13
- package/_esm/core/internal/webauthn.js.map +1 -1
- package/_esm/erc8021/index.js +2 -2
- package/_esm/index.docs.js +1 -0
- package/_esm/index.docs.js.map +1 -1
- package/_esm/tempo/TransactionReceipt.js +1 -1
- package/_esm/tempo/TransactionRequest.js +1 -1
- package/_esm/tempo/TxEnvelopeTempo.js +20 -1
- package/_esm/tempo/TxEnvelopeTempo.js.map +1 -1
- package/_esm/version.js +1 -1
- package/_esm/webauthn/Authentication.js +453 -0
- package/_esm/webauthn/Authentication.js.map +1 -0
- package/_esm/webauthn/Authenticator.js +176 -0
- package/_esm/webauthn/Authenticator.js.map +1 -0
- package/_esm/webauthn/Credential.js +95 -0
- package/_esm/webauthn/Credential.js.map +1 -0
- package/_esm/webauthn/Registration.js +512 -0
- package/_esm/webauthn/Registration.js.map +1 -0
- package/_esm/webauthn/Types.js +2 -0
- package/_esm/webauthn/Types.js.map +1 -0
- package/_esm/webauthn/index.js +31 -0
- package/_esm/webauthn/index.js.map +1 -0
- package/_esm/webauthn/internal/utils.js +52 -0
- package/_esm/webauthn/internal/utils.js.map +1 -0
- package/_types/core/WebAuthnP256.d.ts +33 -208
- package/_types/core/WebAuthnP256.d.ts.map +1 -1
- package/_types/core/WebCryptoP256.d.ts +2 -0
- package/_types/core/WebCryptoP256.d.ts.map +1 -1
- package/_types/core/internal/webauthn.d.ts +2 -110
- package/_types/core/internal/webauthn.d.ts.map +1 -1
- package/_types/erc8021/index.d.ts +2 -2
- package/_types/index.docs.d.ts +1 -0
- package/_types/index.docs.d.ts.map +1 -1
- package/_types/tempo/Transaction.d.ts +2 -2
- package/_types/tempo/TransactionReceipt.d.ts +2 -2
- package/_types/tempo/TransactionRequest.d.ts +2 -2
- package/_types/tempo/TxEnvelopeTempo.d.ts.map +1 -1
- package/_types/version.d.ts +1 -1
- package/_types/webauthn/Authentication.d.ts +324 -0
- package/_types/webauthn/Authentication.d.ts.map +1 -0
- package/_types/webauthn/Authenticator.d.ts +182 -0
- package/_types/webauthn/Authenticator.d.ts.map +1 -0
- package/_types/webauthn/Credential.d.ts +77 -0
- package/_types/webauthn/Credential.d.ts.map +1 -0
- package/_types/webauthn/Registration.d.ts +308 -0
- package/_types/webauthn/Registration.d.ts.map +1 -0
- package/_types/webauthn/Types.d.ts +106 -0
- package/_types/webauthn/Types.d.ts.map +1 -0
- package/_types/webauthn/index.d.ts +33 -0
- package/_types/webauthn/index.d.ts.map +1 -0
- package/_types/webauthn/internal/utils.d.ts +17 -0
- package/_types/webauthn/internal/utils.d.ts.map +1 -0
- package/core/P256.ts +1 -1
- package/core/WebAuthnP256.ts +37 -582
- package/core/WebCryptoP256.ts +6 -1
- package/core/internal/webauthn.ts +6 -165
- package/erc8021/index.ts +2 -2
- package/index.docs.ts +1 -0
- package/package.json +31 -1
- package/tempo/Transaction.ts +2 -2
- package/tempo/TransactionReceipt.ts +2 -2
- package/tempo/TransactionRequest.ts +2 -2
- package/tempo/TxEnvelopeTempo.test.ts +6 -0
- package/tempo/TxEnvelopeTempo.ts +22 -2
- package/version.ts +1 -1
- package/webauthn/Authentication/package.json +6 -0
- package/webauthn/Authentication.ts +673 -0
- package/webauthn/Authenticator/package.json +6 -0
- package/webauthn/Authenticator.ts +259 -0
- package/webauthn/Credential/package.json +6 -0
- package/webauthn/Credential.ts +146 -0
- package/webauthn/Registration/package.json +6 -0
- package/webauthn/Registration.ts +805 -0
- package/webauthn/Types/package.json +6 -0
- package/webauthn/Types.ts +158 -0
- package/webauthn/index.ts +38 -0
- package/webauthn/internal/utils.ts +63 -0
- package/webauthn/package.json +6 -0
package/core/WebCryptoP256.ts
CHANGED
|
@@ -283,7 +283,10 @@ export declare namespace sign {
|
|
|
283
283
|
* @returns Whether the payload was signed by the provided public key.
|
|
284
284
|
*/
|
|
285
285
|
export async function verify(options: verify.Options): Promise<boolean> {
|
|
286
|
-
const { payload, signature } = options
|
|
286
|
+
const { lowS = true, payload, signature } = options
|
|
287
|
+
|
|
288
|
+
// Reject high-S signatures if lowS is enabled.
|
|
289
|
+
if (lowS && signature.s > p256.CURVE.n / 2n) return false
|
|
287
290
|
|
|
288
291
|
const publicKey = await globalThis.crypto.subtle.importKey(
|
|
289
292
|
'raw',
|
|
@@ -306,6 +309,8 @@ export async function verify(options: verify.Options): Promise<boolean> {
|
|
|
306
309
|
|
|
307
310
|
export declare namespace verify {
|
|
308
311
|
type Options = {
|
|
312
|
+
/** If set to `true`, only low-S signatures will be accepted. @default true */
|
|
313
|
+
lowS?: boolean | undefined
|
|
309
314
|
/** Public key that signed the payload. */
|
|
310
315
|
publicKey: PublicKey.PublicKey<boolean>
|
|
311
316
|
/** Signature of the payload. */
|
|
@@ -1,157 +1,7 @@
|
|
|
1
1
|
import { p256 } from '@noble/curves/p256'
|
|
2
|
+
import * as Registration from '../../webauthn/Registration.js'
|
|
2
3
|
import type * as Errors from '../Errors.js'
|
|
3
|
-
import * as Hex from '../Hex.js'
|
|
4
4
|
import * as PublicKey from '../PublicKey.js'
|
|
5
|
-
import { CredentialCreationFailedError } from '../WebAuthnP256.js'
|
|
6
|
-
|
|
7
|
-
/** @internal */
|
|
8
|
-
export type AttestationConveyancePreference =
|
|
9
|
-
| 'direct'
|
|
10
|
-
| 'enterprise'
|
|
11
|
-
| 'indirect'
|
|
12
|
-
| 'none'
|
|
13
|
-
|
|
14
|
-
/** @internal */
|
|
15
|
-
export type AuthenticatorAttachment = 'cross-platform' | 'platform'
|
|
16
|
-
|
|
17
|
-
/** @internal */
|
|
18
|
-
export type AuthenticatorTransport =
|
|
19
|
-
| 'ble'
|
|
20
|
-
| 'hybrid'
|
|
21
|
-
| 'internal'
|
|
22
|
-
| 'nfc'
|
|
23
|
-
| 'usb'
|
|
24
|
-
|
|
25
|
-
/** @internal */
|
|
26
|
-
export type COSEAlgorithmIdentifier = number
|
|
27
|
-
|
|
28
|
-
/** @internal */
|
|
29
|
-
export type CredentialMediationRequirement =
|
|
30
|
-
| 'conditional'
|
|
31
|
-
| 'optional'
|
|
32
|
-
| 'required'
|
|
33
|
-
| 'silent'
|
|
34
|
-
|
|
35
|
-
/** @internal */
|
|
36
|
-
export type PublicKeyCredentialType = 'public-key'
|
|
37
|
-
|
|
38
|
-
/** @internal */
|
|
39
|
-
export type ResidentKeyRequirement = 'discouraged' | 'preferred' | 'required'
|
|
40
|
-
|
|
41
|
-
/** @internal */
|
|
42
|
-
export type UserVerificationRequirement =
|
|
43
|
-
| 'discouraged'
|
|
44
|
-
| 'preferred'
|
|
45
|
-
| 'required'
|
|
46
|
-
|
|
47
|
-
/** @internal */
|
|
48
|
-
export type LargeBlobSupport = {
|
|
49
|
-
support: 'required' | 'preferred'
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/** @internal */
|
|
53
|
-
export type BufferSource = ArrayBufferView | ArrayBuffer
|
|
54
|
-
|
|
55
|
-
/** @internal */
|
|
56
|
-
export type PrfExtension = Record<'eval', Record<'first', Uint8Array>>
|
|
57
|
-
|
|
58
|
-
/** @internal */
|
|
59
|
-
export interface AuthenticationExtensionsClientInputs {
|
|
60
|
-
appid?: string
|
|
61
|
-
credProps?: boolean
|
|
62
|
-
hmacCreateSecret?: boolean
|
|
63
|
-
minPinLength?: boolean
|
|
64
|
-
prf?: PrfExtension
|
|
65
|
-
largeBlob?: LargeBlobSupport
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/** @internal */
|
|
69
|
-
export interface AuthenticatorSelectionCriteria {
|
|
70
|
-
authenticatorAttachment?: AuthenticatorAttachment
|
|
71
|
-
requireResidentKey?: boolean
|
|
72
|
-
residentKey?: ResidentKeyRequirement
|
|
73
|
-
userVerification?: UserVerificationRequirement
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/** @internal */
|
|
77
|
-
export interface Credential {
|
|
78
|
-
readonly id: string
|
|
79
|
-
readonly type: string
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/** @internal */
|
|
83
|
-
export interface CredentialCreationOptions {
|
|
84
|
-
publicKey?: PublicKeyCredentialCreationOptions
|
|
85
|
-
signal?: AbortSignal
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/** @internal */
|
|
89
|
-
export interface CredentialRequestOptions {
|
|
90
|
-
mediation?: CredentialMediationRequirement
|
|
91
|
-
publicKey?: PublicKeyCredentialRequestOptions
|
|
92
|
-
signal?: AbortSignal
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/** @internal */
|
|
96
|
-
export interface PublicKeyCredential extends Credential {
|
|
97
|
-
readonly authenticatorAttachment: string | null
|
|
98
|
-
readonly rawId: ArrayBuffer
|
|
99
|
-
readonly response: AuthenticatorResponse
|
|
100
|
-
getClientExtensionResults(): AuthenticationExtensionsClientOutputs
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/** @internal */
|
|
104
|
-
export interface PublicKeyCredentialCreationOptions {
|
|
105
|
-
attestation?: AttestationConveyancePreference
|
|
106
|
-
authenticatorSelection?: AuthenticatorSelectionCriteria
|
|
107
|
-
challenge: BufferSource
|
|
108
|
-
excludeCredentials?: PublicKeyCredentialDescriptor[]
|
|
109
|
-
extensions?: AuthenticationExtensionsClientInputs
|
|
110
|
-
pubKeyCredParams: PublicKeyCredentialParameters[]
|
|
111
|
-
rp: PublicKeyCredentialRpEntity
|
|
112
|
-
timeout?: number
|
|
113
|
-
user: PublicKeyCredentialUserEntity
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/** @internal */
|
|
117
|
-
export interface PublicKeyCredentialDescriptor {
|
|
118
|
-
id: BufferSource
|
|
119
|
-
transports?: AuthenticatorTransport[]
|
|
120
|
-
type: PublicKeyCredentialType
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/** @internal */
|
|
124
|
-
export interface PublicKeyCredentialEntity {
|
|
125
|
-
name: string
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/** @internal */
|
|
129
|
-
export interface PublicKeyCredentialParameters {
|
|
130
|
-
alg: COSEAlgorithmIdentifier
|
|
131
|
-
type: PublicKeyCredentialType
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/** @internal */
|
|
135
|
-
export interface PublicKeyCredentialRequestOptions {
|
|
136
|
-
allowCredentials?: PublicKeyCredentialDescriptor[]
|
|
137
|
-
challenge: BufferSource
|
|
138
|
-
extensions?: AuthenticationExtensionsClientInputs
|
|
139
|
-
rpId?: string
|
|
140
|
-
timeout?: number
|
|
141
|
-
userVerification?: UserVerificationRequirement
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/** @internal */
|
|
145
|
-
export interface PublicKeyCredentialRpEntity extends PublicKeyCredentialEntity {
|
|
146
|
-
id?: string
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/** @internal */
|
|
150
|
-
export interface PublicKeyCredentialUserEntity
|
|
151
|
-
extends PublicKeyCredentialEntity {
|
|
152
|
-
displayName: string
|
|
153
|
-
id: BufferSource
|
|
154
|
-
}
|
|
155
5
|
|
|
156
6
|
/**
|
|
157
7
|
* Parses an ASN.1 signature into a r and s value.
|
|
@@ -159,17 +9,8 @@ export interface PublicKeyCredentialUserEntity
|
|
|
159
9
|
* @internal
|
|
160
10
|
*/
|
|
161
11
|
export function parseAsn1Signature(bytes: Uint8Array) {
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
const s_start = bytes[r_end + 2] === 0 ? r_end + 3 : r_end + 2
|
|
165
|
-
|
|
166
|
-
const r = BigInt(Hex.fromBytes(bytes.slice(r_start, r_end)))
|
|
167
|
-
const s = BigInt(Hex.fromBytes(bytes.slice(s_start)))
|
|
168
|
-
|
|
169
|
-
return {
|
|
170
|
-
r,
|
|
171
|
-
s: s > p256.CURVE.n / 2n ? p256.CURVE.n - s : s,
|
|
172
|
-
}
|
|
12
|
+
const sig = p256.Signature.fromDER(bytes).normalizeS()
|
|
13
|
+
return { r: sig.r, s: sig.s }
|
|
173
14
|
}
|
|
174
15
|
|
|
175
16
|
/**
|
|
@@ -183,7 +24,7 @@ export async function parseCredentialPublicKey(
|
|
|
183
24
|
): Promise<PublicKey.PublicKey> {
|
|
184
25
|
try {
|
|
185
26
|
const publicKeyBuffer = response.getPublicKey()
|
|
186
|
-
if (!publicKeyBuffer) throw new
|
|
27
|
+
if (!publicKeyBuffer) throw new Registration.CreateFailedError()
|
|
187
28
|
|
|
188
29
|
// Converting `publicKeyBuffer` throws when credential is created by 1Password Firefox Add-on
|
|
189
30
|
const publicKeyBytes = new Uint8Array(publicKeyBuffer)
|
|
@@ -218,7 +59,7 @@ export async function parseCredentialPublicKey(
|
|
|
218
59
|
for (let i = 0; i < data.length - coordinate.length; i++)
|
|
219
60
|
if (coordinate.every((byte, j) => data[i + j] === byte))
|
|
220
61
|
return i + coordinate.length
|
|
221
|
-
throw new
|
|
62
|
+
throw new Registration.CreateFailedError()
|
|
222
63
|
}
|
|
223
64
|
|
|
224
65
|
const xStart = findStart(0x21)
|
|
@@ -235,5 +76,5 @@ export async function parseCredentialPublicKey(
|
|
|
235
76
|
}
|
|
236
77
|
|
|
237
78
|
export declare namespace parseCredentialPublicKey {
|
|
238
|
-
type ErrorType =
|
|
79
|
+
type ErrorType = Registration.CreateFailedError | Errors.GlobalErrorType
|
|
239
80
|
}
|
package/erc8021/index.ts
CHANGED
|
@@ -17,7 +17,7 @@ export type {}
|
|
|
17
17
|
*
|
|
18
18
|
* const dataSuffix2 = Attribution.toDataSuffix({
|
|
19
19
|
* codes: ['baseapp', 'morpho'],
|
|
20
|
-
*
|
|
20
|
+
* codeRegistry: { address: '0x0000000000000000000000000000000000000000', chainId: 1 },
|
|
21
21
|
* })
|
|
22
22
|
* ```
|
|
23
23
|
*
|
|
@@ -30,7 +30,7 @@ export type {}
|
|
|
30
30
|
* const attribution = Attribution.fromData('0x...')
|
|
31
31
|
*
|
|
32
32
|
* console.log(attribution)
|
|
33
|
-
* // @log: { codes: ['baseapp', 'morpho'],
|
|
33
|
+
* // @log: { codes: ['baseapp', 'morpho'], codeRegistry: { address: '0x...', chainId: 1 } }
|
|
34
34
|
* ```
|
|
35
35
|
*
|
|
36
36
|
* @category ERC-8021
|
package/index.docs.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ox",
|
|
3
3
|
"description": "Ethereum Standard Library",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.13.0",
|
|
5
5
|
"main": "./_cjs/index.js",
|
|
6
6
|
"module": "./_esm/index.js",
|
|
7
7
|
"types": "./_types/index.d.ts",
|
|
@@ -554,6 +554,36 @@
|
|
|
554
554
|
"import": "./_esm/trusted-setups/index.js",
|
|
555
555
|
"default": "./_cjs/trusted-setups/index.js"
|
|
556
556
|
},
|
|
557
|
+
"./webauthn/Authentication": {
|
|
558
|
+
"types": "./_types/webauthn/Authentication.d.ts",
|
|
559
|
+
"import": "./_esm/webauthn/Authentication.js",
|
|
560
|
+
"default": "./_cjs/webauthn/Authentication.js"
|
|
561
|
+
},
|
|
562
|
+
"./webauthn/Authenticator": {
|
|
563
|
+
"types": "./_types/webauthn/Authenticator.d.ts",
|
|
564
|
+
"import": "./_esm/webauthn/Authenticator.js",
|
|
565
|
+
"default": "./_cjs/webauthn/Authenticator.js"
|
|
566
|
+
},
|
|
567
|
+
"./webauthn/Credential": {
|
|
568
|
+
"types": "./_types/webauthn/Credential.d.ts",
|
|
569
|
+
"import": "./_esm/webauthn/Credential.js",
|
|
570
|
+
"default": "./_cjs/webauthn/Credential.js"
|
|
571
|
+
},
|
|
572
|
+
"./webauthn/Registration": {
|
|
573
|
+
"types": "./_types/webauthn/Registration.d.ts",
|
|
574
|
+
"import": "./_esm/webauthn/Registration.js",
|
|
575
|
+
"default": "./_cjs/webauthn/Registration.js"
|
|
576
|
+
},
|
|
577
|
+
"./webauthn/Types": {
|
|
578
|
+
"types": "./_types/webauthn/Types.d.ts",
|
|
579
|
+
"import": "./_esm/webauthn/Types.js",
|
|
580
|
+
"default": "./_cjs/webauthn/Types.js"
|
|
581
|
+
},
|
|
582
|
+
"./webauthn": {
|
|
583
|
+
"types": "./_types/webauthn/index.d.ts",
|
|
584
|
+
"import": "./_esm/webauthn/index.js",
|
|
585
|
+
"default": "./_cjs/webauthn/index.js"
|
|
586
|
+
},
|
|
557
587
|
"./window": {
|
|
558
588
|
"types": "./_types/window/index.d.ts",
|
|
559
589
|
"import": "./_esm/window/index.js",
|
package/tempo/Transaction.ts
CHANGED
|
@@ -13,7 +13,7 @@ import type { Call } from './TxEnvelopeTempo.js'
|
|
|
13
13
|
/**
|
|
14
14
|
* A Transaction as defined in the [Execution API specification](https://github.com/ethereum/execution-apis/blob/main/src/schemas/transaction.yaml).
|
|
15
15
|
*
|
|
16
|
-
* @see {@link https://docs.tempo.xyz/protocol/transactions
|
|
16
|
+
* @see {@link https://docs.tempo.xyz/protocol/transactions}
|
|
17
17
|
*/
|
|
18
18
|
export type Transaction<
|
|
19
19
|
pending extends boolean = false,
|
|
@@ -39,7 +39,7 @@ export type Rpc<pending extends boolean = false> = UnionCompute<
|
|
|
39
39
|
* Features configurable fee tokens, call batching, fee sponsorship, access keys,
|
|
40
40
|
* parallelizable nonces, and scheduled execution via `validAfter`/`validBefore`.
|
|
41
41
|
*
|
|
42
|
-
* @see {@link https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction
|
|
42
|
+
* @see {@link https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction}
|
|
43
43
|
*/
|
|
44
44
|
export type Tempo<
|
|
45
45
|
pending extends boolean = false,
|
|
@@ -9,7 +9,7 @@ import * as ox_TransactionReceipt from '../core/TransactionReceipt.js'
|
|
|
9
9
|
* Extends standard receipts with `feePayer` (the address that paid fees) and
|
|
10
10
|
* `feeToken` (the TIP-20 token used for fee payment).
|
|
11
11
|
*
|
|
12
|
-
* @see {@link https://docs.tempo.xyz/protocol/transactions
|
|
12
|
+
* @see {@link https://docs.tempo.xyz/protocol/transactions}
|
|
13
13
|
*/
|
|
14
14
|
export type TransactionReceipt<
|
|
15
15
|
status = ox_TransactionReceipt.Status,
|
|
@@ -60,7 +60,7 @@ export const toRpcType = {
|
|
|
60
60
|
/**
|
|
61
61
|
* Converts an RPC receipt to a TransactionReceipt.
|
|
62
62
|
*
|
|
63
|
-
* @see {@link https://docs.tempo.xyz/protocol/transactions
|
|
63
|
+
* @see {@link https://docs.tempo.xyz/protocol/transactions}
|
|
64
64
|
*
|
|
65
65
|
* @example
|
|
66
66
|
* ```ts twoslash
|
|
@@ -16,7 +16,7 @@ type KeyType = 'secp256k1' | 'p256' | 'webAuthn'
|
|
|
16
16
|
* Extends the [Execution API specification](https://github.com/ethereum/execution-apis/blob/4aca1d7a3e5aab24c8f6437131289ad386944eaa/src/schemas/transaction.yaml#L358-L423)
|
|
17
17
|
* with Tempo-specific fields for batched calls, fee tokens, access keys, and scheduled execution.
|
|
18
18
|
*
|
|
19
|
-
* @see {@link https://docs.tempo.xyz/protocol/transactions
|
|
19
|
+
* @see {@link https://docs.tempo.xyz/protocol/transactions}
|
|
20
20
|
*/
|
|
21
21
|
export type TransactionRequest<
|
|
22
22
|
bigintType = bigint,
|
|
@@ -54,7 +54,7 @@ export type Rpc = Omit<
|
|
|
54
54
|
/**
|
|
55
55
|
* Converts a {@link ox#TransactionRequest.TransactionRequest} to a {@link ox#TransactionRequest.Rpc}.
|
|
56
56
|
*
|
|
57
|
-
* @see {@link https://docs.tempo.xyz/protocol/transactions
|
|
57
|
+
* @see {@link https://docs.tempo.xyz/protocol/transactions}
|
|
58
58
|
*
|
|
59
59
|
* @example
|
|
60
60
|
* ```ts twoslash
|
|
@@ -7,6 +7,7 @@ import * as TxEnvelopeTempo from './TxEnvelopeTempo.js'
|
|
|
7
7
|
|
|
8
8
|
const privateKey =
|
|
9
9
|
'0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'
|
|
10
|
+
const address = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey }))
|
|
10
11
|
|
|
11
12
|
describe('assert', () => {
|
|
12
13
|
test('empty calls list', () => {
|
|
@@ -340,6 +341,7 @@ describe('deserialize', () => {
|
|
|
340
341
|
})
|
|
341
342
|
expect(TxEnvelopeTempo.deserialize(serialized)).toEqual({
|
|
342
343
|
...transaction,
|
|
344
|
+
from: address,
|
|
343
345
|
signature: { signature, type: 'secp256k1' },
|
|
344
346
|
})
|
|
345
347
|
})
|
|
@@ -354,6 +356,7 @@ describe('deserialize', () => {
|
|
|
354
356
|
})
|
|
355
357
|
expect(TxEnvelopeTempo.deserialize(serialized)).toEqual({
|
|
356
358
|
...transaction,
|
|
359
|
+
from: address,
|
|
357
360
|
signature: { signature, type: 'secp256k1' },
|
|
358
361
|
})
|
|
359
362
|
})
|
|
@@ -377,6 +380,7 @@ describe('deserialize', () => {
|
|
|
377
380
|
delete signature.yParity
|
|
378
381
|
expect(TxEnvelopeTempo.deserialize(serialized)).toEqual({
|
|
379
382
|
...transaction,
|
|
383
|
+
from: Address.fromPublicKey(publicKey),
|
|
380
384
|
signature: { prehash: true, publicKey, signature, type: 'p256' },
|
|
381
385
|
})
|
|
382
386
|
})
|
|
@@ -417,6 +421,7 @@ describe('deserialize', () => {
|
|
|
417
421
|
]).slice(2)}` as const
|
|
418
422
|
const deserialized = TxEnvelopeTempo.deserialize(serialized)
|
|
419
423
|
expect(deserialized.feePayerSignature).toBe(null)
|
|
424
|
+
expect(deserialized.from).toBe('0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266')
|
|
420
425
|
})
|
|
421
426
|
|
|
422
427
|
test('feePayerSignature with signature tuple', () => {
|
|
@@ -1174,6 +1179,7 @@ describe('serialize', () => {
|
|
|
1174
1179
|
delete signature.yParity
|
|
1175
1180
|
expect(TxEnvelopeTempo.deserialize(serialized)).toEqual({
|
|
1176
1181
|
...transaction,
|
|
1182
|
+
from: Address.fromPublicKey(publicKey),
|
|
1177
1183
|
nonceKey: 0n,
|
|
1178
1184
|
signature: { prehash: true, publicKey, signature, type: 'p256' },
|
|
1179
1185
|
})
|
package/tempo/TxEnvelopeTempo.ts
CHANGED
|
@@ -351,9 +351,11 @@ export function deserialize(serialized: Serialized): Compute<TxEnvelopeTempo> {
|
|
|
351
351
|
if (
|
|
352
352
|
feePayerSignatureOrSender === '0x00' ||
|
|
353
353
|
Address.validate(feePayerSignatureOrSender)
|
|
354
|
-
)
|
|
354
|
+
) {
|
|
355
355
|
transaction.feePayerSignature = null
|
|
356
|
-
|
|
356
|
+
if (Address.validate(feePayerSignatureOrSender))
|
|
357
|
+
transaction.from = feePayerSignatureOrSender
|
|
358
|
+
} else
|
|
357
359
|
transaction.feePayerSignature = Signature.fromTuple(
|
|
358
360
|
feePayerSignatureOrSender as never,
|
|
359
361
|
)
|
|
@@ -373,6 +375,24 @@ export function deserialize(serialized: Serialized): Compute<TxEnvelopeTempo> {
|
|
|
373
375
|
signature: signatureEnvelope,
|
|
374
376
|
}
|
|
375
377
|
|
|
378
|
+
// Recover sender address from the signature if not already set.
|
|
379
|
+
if (!transaction.from && signatureEnvelope) {
|
|
380
|
+
try {
|
|
381
|
+
if (signatureEnvelope.type === 'keychain')
|
|
382
|
+
transaction.from = signatureEnvelope.userAddress
|
|
383
|
+
else if (
|
|
384
|
+
signatureEnvelope.type === 'p256' ||
|
|
385
|
+
signatureEnvelope.type === 'webAuthn'
|
|
386
|
+
)
|
|
387
|
+
transaction.from = Address.fromPublicKey(signatureEnvelope.publicKey)
|
|
388
|
+
else if (signatureEnvelope.type === 'secp256k1')
|
|
389
|
+
transaction.from = Secp256k1.recoverAddress({
|
|
390
|
+
payload: getSignPayload(from(transaction)),
|
|
391
|
+
signature: signatureEnvelope.signature,
|
|
392
|
+
})
|
|
393
|
+
} catch {}
|
|
394
|
+
}
|
|
395
|
+
|
|
376
396
|
assert(transaction)
|
|
377
397
|
|
|
378
398
|
return transaction
|
package/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** @internal */
|
|
2
|
-
export const version = '0.
|
|
2
|
+
export const version = '0.13.0'
|