Skip to content

Commit 19b51db

Browse files
committed
Use SaveSignerSignatures2
1 parent 6cbaa6b commit 19b51db

File tree

13 files changed

+62
-34
lines changed

13 files changed

+62
-34
lines changed

packages/account/src/account.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,7 @@ export class Account {
509509
const signature = await wallet.signDigest(digest)
510510

511511
const decoded = this.coders.signature.decode(signature)
512-
const signatures = this.coders.signature.signaturesOfDecoded(decoded)
512+
const signatures = this.coders.signature.signaturesOf(decoded)
513513

514514
if (signatures.length === 0) {
515515
throw new Error('No signatures found')
@@ -522,7 +522,8 @@ export class Account {
522522
const digest = ethers.id(`This is a Sequence account woo! ${Date.now()}`)
523523
const signature = await this.signDigest(digest, 0, false)
524524
const decoded = this.coders.signature.decode(signature)
525-
const signatures = this.coders.signature.signaturesOfDecoded(decoded)
525+
const recovered = await this.coders.signature.recover(decoded, { digest, chainId: 0, address: this.address })
526+
const signatures = this.coders.signature.signaturesOf(recovered.config)
526527
return this.tracker.saveWitnesses({ wallet: this.address, digest, chainId: 0, signatures })
527528
}
528529

packages/core/src/commons/signature.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export interface SignatureCoder<
3434

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

37-
recover: (data: Z, payload: SignedPayload, provider: ethers.Provider) => Promise<T>
37+
recover: (data: Z, payload: SignedPayload, provider?: ethers.Provider) => Promise<T>
3838

3939
supportsNoChainId: boolean
4040

packages/core/src/commons/signer.ts

+4-1
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,6 +55,9 @@ 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+
}
5861
return isValidEIP1271Signature(address, ethers.hexlify(digest), bytes.slice(0, -1), provider)
5962
}
6063

packages/core/src/v1/signature.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ 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
129129
): Promise<Signature> {
130130
const subdigest = base.subdigestOf(payload)
131131
const signers = await Promise.all(

packages/core/src/v2/signature.ts

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

226+
// Signature validity is only checked if provider is provided
226227
export async function recoverTopology(
227228
unrecovered: UnrecoveredTopology,
228229
subdigest: string,
229-
provider: ethers.Provider
230+
provider?: ethers.Provider
230231
): Promise<Topology> {
231232
if (isUnrecoveredNode(unrecovered)) {
232233
const [left, right] = await Promise.all([
@@ -251,9 +252,11 @@ export async function recoverTopology(
251252
throw new Error('Dynamic signature leaf without address')
252253
}
253254

254-
const isValid = await isValidSignature(unrecovered.address, subdigest, unrecovered.signature, provider)
255-
if (!isValid) {
256-
throw new InvalidSignatureLeafError(unrecovered)
255+
if (provider) {
256+
const isValid = await isValidSignature(unrecovered.address, subdigest, unrecovered.signature, provider)
257+
if (!isValid) {
258+
throw new InvalidSignatureLeafError(unrecovered)
259+
}
257260
}
258261

259262
return {
@@ -598,7 +601,7 @@ export function setImageHashStruct(imageHash: string) {
598601
export async function recoverSignature(
599602
signature: UnrecoveredSignature | UnrecoveredChainedSignature,
600603
payload: base.SignedPayload | { subdigest: string },
601-
provider: ethers.Provider
604+
provider?: ethers.Provider
602605
): Promise<Signature | ChainedSignature> {
603606
const signedPayload = (payload as { subdigest: string }).subdigest === undefined ? (payload as base.SignedPayload) : undefined
604607

@@ -927,7 +930,7 @@ export const SignatureCoder: base.SignatureCoder<WalletConfig, Signature, Unreco
927930
recover: (
928931
data: UnrecoveredSignature | UnrecoveredChainedSignature,
929932
payload: base.SignedPayload,
930-
provider: ethers.Provider
933+
provider?: ethers.Provider
931934
): Promise<Signature> => {
932935
return recoverSignature(data, payload, provider)
933936
},

packages/sessions/src/tracker.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ export type ConfigDataDump = {
1919
presignedTransactions: PresignedConfigLink[]
2020
}
2121

22+
export type SignerSignature = {
23+
address: string
24+
signature: string
25+
}
26+
2227
export interface ConfigTracker {
2328
loadPresignedConfiguration: (args: {
2429
wallet: string
@@ -28,7 +33,7 @@ export interface ConfigTracker {
2833

2934
savePresignedConfiguration: (args: PresignedConfig) => Promise<void>
3035

31-
saveWitnesses: (args: { wallet: string; digest: string; chainId: ethers.BigNumberish; signatures: string[] }) => Promise<void>
36+
saveWitnesses: (args: { wallet: string; digest: string; chainId: ethers.BigNumberish; signatures: string[] | SignerSignature[] }) => Promise<void>
3237

3338
configOfImageHash: (args: { imageHash: string; noCache?: boolean }) => Promise<commons.config.Config | undefined>
3439

packages/sessions/src/trackers/arweave.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { commons, universal, v2 } from '@0xsequence/core'
22
import { migrator } from '@0xsequence/migration'
33
import { CachedEIP5719 } from '@0xsequence/replacer'
44
import { ethers } from 'ethers'
5-
import { ConfigTracker, PresignedConfig, PresignedConfigLink } from '../tracker'
5+
import { ConfigTracker, PresignedConfig, PresignedConfigLink, SignerSignature } from '../tracker'
66

77
// depending on @0xsequence/abi breaks 0xsequence's proxy-transport-channel integration test
88
const MAIN_MODULE_ABI = [
@@ -231,7 +231,7 @@ export class ArweaveReader implements ConfigTracker, migrator.PresignedMigration
231231
throw new Error('arweave backend does not support saving config updates')
232232
}
233233

234-
saveWitnesses(_args: { wallet: string; digest: string; chainId: ethers.BigNumberish; signatures: string[] }): Promise<void> {
234+
saveWitnesses(_args: { wallet: string; digest: string; chainId: ethers.BigNumberish; signatures: string[] | SignerSignature[] }): Promise<void> {
235235
throw new Error('arweave backend does not support saving signatures')
236236
}
237237

packages/sessions/src/trackers/cached.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { commons, universal } from '@0xsequence/core'
22
import { migrator } from '@0xsequence/migration'
3-
import { ConfigTracker, PresignedConfig, PresignedConfigLink } from '../tracker'
3+
import { ConfigTracker, PresignedConfig, PresignedConfigLink, SignerSignature } from '../tracker'
44
import { ethers } from 'ethers'
55

66
export class CachedTracker implements migrator.PresignedMigrationTracker, ConfigTracker {
@@ -148,7 +148,7 @@ export class CachedTracker implements migrator.PresignedMigrationTracker, Config
148148
wallet: string
149149
digest: string
150150
chainId: ethers.BigNumberish
151-
signatures: string[]
151+
signatures: string[] | SignerSignature[]
152152
}): Promise<void> {
153153
await Promise.all([this.tracker.saveWitnesses(args), this.cache.saveWitnesses(args)])
154154
}

packages/sessions/src/trackers/debug.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { commons } from '@0xsequence/core'
22
import { migrator } from '@0xsequence/migration'
3-
import { ConfigTracker, PresignedConfig, PresignedConfigLink } from '../tracker'
3+
import { ConfigTracker, PresignedConfig, PresignedConfigLink, SignerSignature } from '../tracker'
44
import { ethers } from 'ethers'
55
import { bigintReplacer } from '@0xsequence/utils'
66

@@ -23,7 +23,7 @@ export class DebugConfigTracker implements ConfigTracker, migrator.PresignedMigr
2323
return this.tracker.savePresignedConfiguration(args)
2424
}
2525

26-
saveWitnesses(args: { wallet: string; digest: string; chainId: ethers.BigNumberish; signatures: string[] }): Promise<void> {
26+
saveWitnesses(args: { wallet: string; digest: string; chainId: ethers.BigNumberish; signatures: string[] | SignerSignature[] }): Promise<void> {
2727
console.debug('? saveWitnesses')
2828
debug(args, '? ')
2929
return this.tracker.saveWitnesses(args)

packages/sessions/src/trackers/deduped.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { commons } from '@0xsequence/core'
22
import { migrator } from '@0xsequence/migration'
33

44
import { ethers } from 'ethers'
5-
import { ConfigTracker, PresignedConfig, PresignedConfigLink } from '../tracker'
5+
import { ConfigTracker, PresignedConfig, PresignedConfigLink, SignerSignature } from '../tracker'
66
import { PromiseCache } from './promise-cache'
77
import { LocalConfigTracker } from './local'
88

@@ -63,7 +63,7 @@ export class DedupedTracker implements migrator.PresignedMigrationTracker, Confi
6363
return this.cache.do('savePresignedConfiguration', undefined, args => this.tracker.savePresignedConfiguration(args), args)
6464
}
6565

66-
saveWitnesses(args: { wallet: string; digest: string; chainId: ethers.BigNumberish; signatures: string[] }): Promise<void> {
66+
saveWitnesses(args: { wallet: string; digest: string; chainId: ethers.BigNumberish; signatures: string[] | SignerSignature[] }): Promise<void> {
6767
return this.cache.do('saveWitnesses', undefined, args => this.tracker.saveWitnesses(args), args)
6868
}
6969

packages/sessions/src/trackers/local.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { commons, universal, v1, v2 } from '@0xsequence/core'
22
import { migration, migrator } from '@0xsequence/migration'
33
import { ethers } from 'ethers'
44
import { CachedEIP5719 } from '@0xsequence/replacer'
5-
import { ConfigTracker, PresignedConfig, PresignedConfigLink } from '../tracker'
5+
import { ConfigTracker, PresignedConfig, PresignedConfigLink, SignerSignature } from '../tracker'
66
import { isPlainNested, isPlainNode, isPlainV2Config, MemoryTrackerStore, PlainNested, PlainNode, TrackerStore } from './stores'
77

88
export class LocalConfigTracker implements ConfigTracker, migrator.PresignedMigrationTracker {
@@ -388,7 +388,7 @@ export class LocalConfigTracker implements ConfigTracker, migrator.PresignedMigr
388388
wallet: string
389389
digest: string
390390
chainId: ethers.BigNumberish
391-
signatures: string[]
391+
signatures: string[] | SignerSignature[]
392392
}): Promise<void> => {
393393
const payload = {
394394
digest: args.digest,
@@ -401,6 +401,7 @@ export class LocalConfigTracker implements ConfigTracker, migrator.PresignedMigr
401401
await Promise.all([
402402
this.savePayload({ payload }),
403403
...args.signatures
404+
.map(s => (typeof s === 'string' ? s : s.signature))
404405
.filter(signature => {
405406
// We don't support saving witnesses for non-recoverable signatures
406407
// we could change this eventually, but the issue is that the witness may become invalid

packages/sessions/src/trackers/multiple.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ConfigTracker, PresignedConfig, PresignedConfigLink } from '../tracker'
1+
import { ConfigTracker, PresignedConfig, PresignedConfigLink, SignerSignature } from '../tracker'
22
import { migrator } from '@0xsequence/migration'
33

44
import { commons, universal } from '@0xsequence/core'
@@ -151,7 +151,7 @@ export class MultipleTracker implements migrator.PresignedMigrationTracker, Conf
151151
wallet: string
152152
digest: string
153153
chainId: ethers.BigNumberish
154-
signatures: string[]
154+
signatures: string[] | SignerSignature[]
155155
}): Promise<void> {
156156
await Promise.all(this.trackers.map(t => t.saveWitnesses(args)))
157157
}

packages/sessions/src/trackers/remote/index.ts

+25-10
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { commons, universal, v1, v2 } from '@0xsequence/core'
22
import { migrator } from '@0xsequence/migration'
33
import { ethers } from 'ethers'
4-
import { ConfigTracker, PresignedConfig, PresignedConfigLink } from '../../tracker'
4+
import { ConfigTracker, PresignedConfig, PresignedConfigLink, SignerSignature } from '../../tracker'
55
import { Sessions, SignatureType, Transaction } from './sessions.gen'
66

77
export class RemoteConfigTracker implements ConfigTracker, migrator.PresignedMigrationTracker {
@@ -56,21 +56,36 @@ export class RemoteConfigTracker implements ConfigTracker, migrator.PresignedMig
5656
wallet: string
5757
digest: string
5858
chainId: ethers.BigNumberish
59-
signatures: string[]
59+
signatures: string[] | SignerSignature[]
6060
}): Promise<void> {
6161
let filteredSignatures = args.signatures
6262
if (this.onlyRecoverable) {
6363
filteredSignatures = filteredSignatures.filter(signature => {
64-
return commons.signer.canRecover(signature)
65-
})
64+
if (typeof signature === 'string') {
65+
return commons.signer.canRecover(signature)
66+
} else {
67+
// We "recover" using the included address
68+
return !!signature.address
69+
}
70+
}) as string[] | SignerSignature[]
6671
}
6772

68-
await this.sessions.saveSignerSignatures({
69-
wallet: args.wallet,
70-
digest: args.digest,
71-
chainID: numberString(args.chainId),
72-
signatures: filteredSignatures
73-
})
73+
if (filteredSignatures.length === 0 || typeof args.signatures[0] === 'string') {
74+
await this.sessions.saveSignerSignatures({
75+
wallet: args.wallet,
76+
digest: args.digest,
77+
chainID: numberString(args.chainId),
78+
signatures: filteredSignatures as string[]
79+
})
80+
} else {
81+
await this.sessions.saveSignerSignatures2({
82+
wallet: args.wallet,
83+
digest: args.digest,
84+
chainID: numberString(args.chainId),
85+
// Rename "address" to "signer"
86+
signatures: (filteredSignatures as SignerSignature[]).map(({ address, signature }) => ({ signer: address, signature }))
87+
})
88+
}
7489
}
7590

7691
async configOfImageHash(args: { imageHash: string }): Promise<commons.config.Config | undefined> {

0 commit comments

Comments
 (0)