Skip to content

Commit 260bacb

Browse files
committed
More explicit when skipping validation
1 parent e8cbccd commit 260bacb

File tree

7 files changed

+38
-24
lines changed

7 files changed

+38
-24
lines changed

packages/account/src/account.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ export class Account {
522522
// Apply ERC-6492 to undeployed children
523523
const signature = await this.signDigest(digest, 0, false, 'ignore', {chainId, referenceChainId, cantValidateBehavior: "eip6492"})
524524
const decoded = this.coders.signature.decode(signature)
525-
const recovered = await this.coders.signature.recover(decoded, { digest, chainId, address: this.address })
525+
const recovered = await this.coders.signature.recover(decoded, { digest, chainId, address: this.address }, undefined, 'ignore')
526526
const signatures = this.coders.signature.signaturesOf(recovered.config)
527527
const signaturesWithReferenceChainId = signatures.map(s => ({...s, referenceChainId}))
528528
return this.tracker.saveWitnesses({ wallet: this.address, digest, chainId, signatures: signaturesWithReferenceChainId })
@@ -669,8 +669,7 @@ export class Account {
669669
await this.tracker.savePresignedConfiguration({
670670
wallet: this.address,
671671
nextConfig: config,
672-
signature,
673-
validateBehavior: 'ignore'
672+
signature
674673
})
675674

676675
// safety check, tracker should have a reverse lookup for the imageHash

packages/core/src/commons/signature.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export interface SignatureCoder<
3535

3636
trim: (data: string) => Promise<string>
3737

38-
recover: (data: Z, payload: SignedPayload, provider?: ethers.Provider) => Promise<T>
38+
recover: (data: Z, payload: SignedPayload, provider?: ethers.Provider, validateBehavior?: 'ignore' | 'throw') => Promise<T>
3939

4040
supportsNoChainId: boolean
4141

packages/core/src/commons/signer.ts

+1-4
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export function isValidSignature(
4343
address: string,
4444
digest: ethers.BytesLike,
4545
signature: ethers.BytesLike,
46-
provider?: ethers.Provider
46+
provider: ethers.Provider
4747
) {
4848
const bytes = ethers.getBytes(signature)
4949

@@ -55,9 +55,6 @@ export function isValidSignature(
5555
}
5656

5757
if (type === SigType.WALLET_BYTES32) {
58-
if (!provider) {
59-
throw new Error('Provider is required to validate EIP1271 signatures')
60-
}
6158
return isValidEIP1271Signature(address, ethers.hexlify(digest), bytes.slice(0, -1), provider)
6259
}
6360

packages/core/src/v1/signature.ts

+18-5
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,8 @@ export function encodeSignature(signature: Signature | UnrecoveredSignature | et
125125
export async function recoverSignature(
126126
data: UnrecoveredSignature,
127127
payload: base.SignedPayload,
128-
provider?: ethers.Provider
128+
provider?: ethers.Provider,
129+
validateBehavior: 'ignore' | 'throw' = 'throw'
129130
): Promise<Signature> {
130131
const subdigest = base.subdigestOf(payload)
131132
const signers = await Promise.all(
@@ -136,8 +137,15 @@ export async function recoverSignature(
136137

137138
if (s.isDynamic) {
138139
if (!s.address) throw new Error('Dynamic signature part must have address')
139-
if (!isValidSignature(s.address, subdigest, s.signature, provider)) {
140-
throw new Error(`Invalid dynamic signature part ${s.address}`)
140+
141+
if (validateBehavior !== 'ignore') {
142+
if (!provider) {
143+
throw new Error('Provider is required to validate EIP1271 signatures')
144+
}
145+
146+
if (!isValidSignature(s.address, subdigest, s.signature, provider)) {
147+
throw new Error(`Invalid dynamic signature part ${s.address}`)
148+
}
141149
}
142150

143151
return { address: s.address, weight: s.weight, signature: s.signature }
@@ -216,8 +224,13 @@ export const SignatureCoder: base.SignatureCoder<WalletConfig, Signature, Unreco
216224

217225
supportsNoChainId: true,
218226

219-
recover: (data: UnrecoveredSignature, payload: base.SignedPayload, provider: ethers.Provider): Promise<Signature> => {
220-
return recoverSignature(data, payload, provider)
227+
recover: (
228+
data: UnrecoveredSignature,
229+
payload: base.SignedPayload,
230+
provider?: ethers.Provider,
231+
validateBehavior: 'ignore' | 'throw' = 'throw'
232+
): Promise<Signature> => {
233+
return recoverSignature(data, payload, provider, validateBehavior)
221234
},
222235

223236
encodeSigners: (

packages/core/src/v2/signature.ts

+14-8
Original file line numberDiff line numberDiff line change
@@ -223,11 +223,11 @@ export class InvalidSignatureLeafError extends Error {
223223
}
224224
}
225225

226-
// Signature validity is only checked if provider is provided
227226
export async function recoverTopology(
228227
unrecovered: UnrecoveredTopology,
229228
subdigest: string,
230-
provider?: ethers.Provider
229+
provider?: ethers.Provider,
230+
validateBehavior: 'ignore' | 'throw' = 'throw'
231231
): Promise<Topology> {
232232
if (isUnrecoveredNode(unrecovered)) {
233233
const [left, right] = await Promise.all([
@@ -252,7 +252,11 @@ export async function recoverTopology(
252252
throw new Error('Dynamic signature leaf without address')
253253
}
254254

255-
if (provider) {
255+
if (validateBehavior !== 'ignore') {
256+
if (!provider) {
257+
throw new Error('Provider is required to validate EIP1271 signatures')
258+
}
259+
256260
const isValid = await isValidSignature(unrecovered.address, subdigest, unrecovered.signature, provider)
257261
if (!isValid) {
258262
throw new InvalidSignatureLeafError(unrecovered)
@@ -601,7 +605,8 @@ export function setImageHashStruct(imageHash: string) {
601605
export async function recoverSignature(
602606
signature: UnrecoveredSignature | UnrecoveredChainedSignature,
603607
payload: base.SignedPayload | { subdigest: string },
604-
provider?: ethers.Provider
608+
provider?: ethers.Provider,
609+
validateBehavior: 'ignore' | 'throw' = 'throw'
605610
): Promise<Signature | ChainedSignature> {
606611
const signedPayload = (payload as { subdigest: string }).subdigest === undefined ? (payload as base.SignedPayload) : undefined
607612

@@ -613,7 +618,7 @@ export async function recoverSignature(
613618
const subdigest = signedPayload ? base.subdigestOf(signedPayload) : (payload as { subdigest: string }).subdigest
614619

615620
if (!isUnrecoveredChainedSignature(signature)) {
616-
const tree = await recoverTopology(signature.decoded.tree, subdigest, provider)
621+
const tree = await recoverTopology(signature.decoded.tree, subdigest, provider, validateBehavior)
617622
return { version: 2, type: signature.type, subdigest, config: { version: 2, ...signature.decoded, tree } }
618623
}
619624

@@ -628,7 +633,7 @@ export async function recoverSignature(
628633
// NOTICE: Remove the suffix from the "first" siganture
629634
// otherwise we recurse infinitely
630635
for (const sig of [{ ...signature, suffix: undefined }, ...signature.suffix]) {
631-
const recovered = await recoverSignature(sig, mutatedPayload, provider)
636+
const recovered = await recoverSignature(sig, mutatedPayload, provider, validateBehavior)
632637
result.unshift(recovered)
633638

634639
const nextMessage = setImageHashStruct(imageHash(deepestConfigOfSignature(recovered)))
@@ -930,9 +935,10 @@ export const SignatureCoder: base.SignatureCoder<WalletConfig, Signature, Unreco
930935
recover: (
931936
data: UnrecoveredSignature | UnrecoveredChainedSignature,
932937
payload: base.SignedPayload,
933-
provider?: ethers.Provider
938+
provider?: ethers.Provider,
939+
validateBehavior: 'ignore' | 'throw' = 'throw'
934940
): Promise<Signature> => {
935-
return recoverSignature(data, payload, provider)
941+
return recoverSignature(data, payload, provider, validateBehavior)
936942
},
937943

938944
encodeSigners: (

packages/sessions/src/tracker.ts

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ export type PresignedConfig = {
66
nextConfig: commons.config.Config
77
signature: string
88
referenceChainId?: string
9-
validateBehavior?: 'ignore' | 'throw'
109
}
1110

1211
export type PresignedConfigLink = Omit<PresignedConfig, 'nextConfig'> & { nextImageHash: string }

packages/sessions/src/trackers/local.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -235,11 +235,11 @@ export class LocalConfigTracker implements ConfigTracker, migrator.PresignedMigr
235235
const savePayload = this.savePayload({ payload })
236236
const saveNextConfig = this.saveWalletConfig({ config: args.nextConfig })
237237

238-
const validateBehavior = args.validateBehavior ?? 'throw'
239238
const recovered = await v2.signature.SignatureCoder.recover(
240239
decoded,
241240
payload,
242-
validateBehavior === 'ignore' ? undefined : this.provider // Only validate if we are not ignoring
241+
this.provider,
242+
'ignore'
243243
)
244244

245245
// Save the recovered configuration and all signature parts

0 commit comments

Comments
 (0)