Skip to content

Commit 6b719f8

Browse files
Merge pull request #750 from 0xsequence/sessions-identity
Address comparison and attestation fix
2 parents 82f49e3 + 6d88036 commit 6b719f8

18 files changed

Lines changed: 60 additions & 56 deletions

File tree

packages/wallet/core/src/envelope.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,15 @@ export type Signed<T extends Payload.Payload> = Envelope<T> & {
3333

3434
export function signatureForLeaf(envelope: Signed<Payload.Payload>, leaf: Config.Leaf) {
3535
if (Config.isSignerLeaf(leaf)) {
36-
return envelope.signatures.find((sig) => isSignature(sig) && sig.address === leaf.address)
36+
return envelope.signatures.find((sig) => isSignature(sig) && Address.isEqual(sig.address, leaf.address))
3737
}
3838

3939
if (Config.isSapientSignerLeaf(leaf)) {
4040
return envelope.signatures.find(
41-
(sig) => isSapientSignature(sig) && sig.imageHash === leaf.imageHash && sig.signature.address === leaf.address,
41+
(sig) =>
42+
isSapientSignature(sig) &&
43+
sig.imageHash === leaf.imageHash &&
44+
Address.isEqual(sig.signature.address, leaf.address),
4245
)
4346
}
4447

@@ -89,7 +92,7 @@ export function addSignature(
8992
const prev = envelope.signatures.find(
9093
(sig) =>
9194
isSapientSignature(sig) &&
92-
sig.signature.address === signature.signature.address &&
95+
Address.isEqual(sig.signature.address, signature.signature.address) &&
9396
sig.imageHash === signature.imageHash,
9497
) as SapientSignature | undefined
9598

@@ -110,9 +113,9 @@ export function addSignature(
110113
envelope.signatures.push(signature)
111114
} else if (isSignature(signature)) {
112115
// Find if the signature already exists in envelope
113-
const prev = envelope.signatures.find((sig) => isSignature(sig) && sig.address === signature.address) as
114-
| Signature
115-
| undefined
116+
const prev = envelope.signatures.find(
117+
(sig) => isSignature(sig) && Address.isEqual(sig.address, signature.address),
118+
) as Signature | undefined
116119

117120
if (prev) {
118121
// If the signatures are identical, then we can do nothing

packages/wallet/core/src/signers/passkey.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,9 @@ export class Passkey implements SapientSigner, Witnessable {
203203
// Flatten and remove duplicates
204204
const flattened = signers
205205
.flat()
206-
.filter((v, i, self) => self.findIndex((t) => t.wallet === v.wallet && t.imageHash === v.imageHash) === i)
206+
.filter(
207+
(v, i, self) => self.findIndex((t) => Address.isEqual(t.wallet, v.wallet) && t.imageHash === v.imageHash) === i,
208+
)
207209

208210
// If there are no signers, return undefined
209211
if (flattened.length === 0) {

packages/wallet/core/src/signers/session/explicit.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { Payload, Permission, SessionSignature, Utils } from '@0xsequence/wallet-primitives'
22
import { AbiParameters, Address, Bytes, Hash, Hex, Provider, Secp256k1 } from 'ox'
3-
import { SignerInterface } from './session.js'
3+
import { SessionSigner } from './session.js'
44
import { MemoryPkStore, PkStore } from '../pk/index.js'
55

66
export type ExplicitParams = Omit<Permission.SessionPermissions, 'signer'>
77

8-
export class Explicit implements SignerInterface {
8+
export class Explicit implements SessionSigner {
99
private readonly _privateKey: PkStore
1010

1111
public readonly address: Address.Address

packages/wallet/core/src/signers/session/implicit.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { Attestation, Payload, Signature as SequenceSignature, SessionSignature } from '@0xsequence/wallet-primitives'
22
import { AbiFunction, Address, Bytes, Hex, Provider, Secp256k1, Signature } from 'ox'
33
import { MemoryPkStore, PkStore } from '../pk/index.js'
4-
import { SignerInterface } from './session.js'
4+
import { SessionSigner } from './session.js'
55

66
export type AttestationParams = Omit<Attestation.Attestation, 'approvedSigner'>
77

8-
export class Implicit implements SignerInterface {
8+
export class Implicit implements SessionSigner {
99
private readonly _privateKey: PkStore
1010
private readonly _identitySignature: SequenceSignature.RSY
1111
public readonly address: Address.Address

packages/wallet/core/src/signers/session/session.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { Address, Provider } from 'ox'
22
import { Payload, SessionSignature } from '@0xsequence/wallet-primitives'
33

4-
export interface SignerInterface {
5-
address: Address.Address
4+
export interface SessionSigner {
5+
address: Address.Address | Promise<Address.Address>
66

77
/// Check if the signer supports the call
88
supportedCall: (

packages/wallet/core/src/state/local/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ export class Provider implements ProviderInterface {
271271
if (Config.isSapientSignerLeaf(leaf)) {
272272
const sapientSignature = signaturesOfSigners.find(
273273
({ signer, imageHash }: { signer: Address.Address; imageHash?: Hex.Hex }) => {
274-
return imageHash && signer === leaf.address && imageHash === leaf.imageHash
274+
return imageHash && Address.isEqual(signer, leaf.address) && imageHash === leaf.imageHash
275275
},
276276
)?.signature
277277

@@ -281,7 +281,7 @@ export class Provider implements ProviderInterface {
281281
}
282282
}
283283

284-
const signature = signaturesOfSigners.find(({ signer }) => signer === leaf.address)?.signature
284+
const signature = signaturesOfSigners.find(({ signer }) => Address.isEqual(signer, leaf.address))?.signature
285285
if (!signature) {
286286
return undefined
287287
}

packages/wallet/primitives-cli/src/subcommands/signature.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Config, Signature } from '@0xsequence/wallet-primitives'
2-
import { Bytes, Hex, Signature as OxSignature } from 'ox'
2+
import { Address, Bytes, Hex, Signature as OxSignature } from 'ox'
33
import { type CommandModule } from 'yargs'
44
import { fromPosOrStdin } from '../utils.js'
55
import { PossibleElements } from './config.js'
@@ -43,7 +43,7 @@ export async function doEncode(
4343
const allSignatures = signatures.map((s) => {
4444
const values = s.split(':')
4545
return {
46-
address: values[0],
46+
address: Address.from(values[0] as `0x${string}`),
4747
type: values[1],
4848
values: values.slice(2),
4949
}
@@ -52,7 +52,7 @@ export async function doEncode(
5252
const fullTopology = Signature.fillLeaves(config.topology, (leaf) => {
5353
if (Config.isSignerLeaf(leaf)) {
5454
// Type must be 1271, eth_sign, or hash
55-
const candidate = allSignatures.find((s) => s.address === leaf.address)
55+
const candidate = allSignatures.find((s) => Address.isEqual(s.address, leaf.address))
5656

5757
if (!candidate) {
5858
return undefined
@@ -92,7 +92,7 @@ export async function doEncode(
9292
}
9393

9494
if (Config.isSapientSignerLeaf(leaf)) {
95-
const candidate = allSignatures.find((s) => s.address === leaf.address)
95+
const candidate = allSignatures.find((s) => Address.isEqual(s.address, leaf.address))
9696
if (!candidate) {
9797
return undefined
9898
}

packages/wallet/primitives/src/config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,11 @@ export function findSignerLeaf(
149149
} else if (isNode(configuration)) {
150150
return findSignerLeaf(configuration[0], address) || findSignerLeaf(configuration[1], address)
151151
} else if (isSignerLeaf(configuration)) {
152-
if (configuration.address === address) {
152+
if (Address.isEqual(configuration.address, address)) {
153153
return configuration
154154
}
155155
} else if (isSapientSignerLeaf(configuration)) {
156-
if (configuration.address === address) {
156+
if (Address.isEqual(configuration.address, address)) {
157157
return configuration
158158
}
159159
}

packages/wallet/primitives/src/session-config.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ export function getImplicitBlacklistLeaf(topology: SessionsTopology): ImplicitBl
166166

167167
export function getSessionPermissions(topology: SessionsTopology, address: Address.Address): SessionPermissions | null {
168168
if (isSessionPermissions(topology)) {
169-
if (topology.signer === address) {
169+
if (Address.isEqual(topology.signer, address)) {
170170
return topology
171171
}
172172
}
@@ -426,7 +426,7 @@ export function removeExplicitSession(
426426
signerAddress: `0x${string}`,
427427
): SessionsTopology | null {
428428
if (isSessionPermissions(topology)) {
429-
if (topology.signer === signerAddress) {
429+
if (Address.isEqual(topology.signer, signerAddress)) {
430430
return null
431431
}
432432
// Return the leaf unchanged
@@ -642,7 +642,7 @@ export function addToImplicitBlacklist(topology: SessionsTopology, address: Addr
642642
throw new Error('No blacklist found')
643643
}
644644
const { blacklist } = blacklistNode
645-
if (blacklist.some((addr) => addr === address)) {
645+
if (blacklist.some((addr) => Address.isEqual(addr, address))) {
646646
return topology
647647
}
648648
blacklist.push(address)

packages/wallet/wdk/src/identity/signer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export class IdentitySigner implements Signers.Signer {
1414
if (!Address.validate(this.authKey.identitySigner)) {
1515
throw new Error('No signer address found')
1616
}
17-
return this.authKey.identitySigner
17+
return Address.checksum(this.authKey.identitySigner)
1818
}
1919

2020
async sign(

0 commit comments

Comments
 (0)