Skip to content

Commit 1ac5c67

Browse files
committed
remove origin in eip 191 prefix exemptions
use regex to match DCL message instead
1 parent 0b359e6 commit 1ac5c67

6 files changed

Lines changed: 38 additions & 17 deletions

File tree

packages/provider/src/eip191exceptions.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,35 @@
11
import { ethers } from 'ethers'
22

3-
export function messageIsExemptFromEIP191Prefix(message: Uint8Array, origin: string | undefined): boolean {
4-
return EIP_191_PREFIX_EXCEPTIONS.some(e => e.predicate(message, origin))
3+
export function messageIsExemptFromEIP191Prefix(message: Uint8Array): boolean {
4+
return EIP_191_PREFIX_EXCEPTIONS.some(e => e.predicate(message))
55
}
66

77
const EIP_191_PREFIX_EXCEPTIONS: Array<{
88
name: string
9-
predicate: (message: Uint8Array, origin?: string) => boolean
9+
predicate: (message: Uint8Array) => boolean
1010
}> = [
1111
// NOTE: Decentraland does not support 191 correctly.
12-
{ name: 'Decentraland Exception', predicate: (_message, origin) => origin === 'https://play.decentraland.org' },
12+
{
13+
name: 'Decentraland Exception',
14+
predicate: isDecentralandLoginMessage
15+
},
1316

1417
// NOTE: 0x v3 does not support 191 correctly.
1518
// See https://gov.0x.org/t/zeip-proposal-fix-v3-eip-191-non-compliance-when-validating-eip-1271-signatures/3396 for more info.
1619
{ name: '0x v3 Exception', predicate: isZeroExV3Order }
1720
]
1821

22+
const DCL_REGEX =
23+
/^Decentraland Login\nEphemeral address: 0x[a-fA-F0-9]{40}\nExpiration: (\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)((-(\d{2}):(\d{2})|Z)?)$/
24+
export function isDecentralandLoginMessage(bytes: Uint8Array): boolean {
25+
try {
26+
const stringified = ethers.utils.toUtf8String(bytes)
27+
return DCL_REGEX.test(stringified)
28+
} catch {
29+
return false
30+
}
31+
}
32+
1933
// try to interpret bytes as abi-encoded 0x v3 OrderWithHash -
2034
// see https://github.com/0xProject/0x-protocol-specification/blob/master/v3/v3-specification.md
2135
export function isZeroExV3Order(bytes: Uint8Array): boolean {

packages/provider/src/transports/wallet-request-handler.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ export class WalletRequestHandler implements ExternalProvider, JsonRpcHandler, P
300300

301301
// Message must be prefixed with "\x19Ethereum Signed Message:\n"
302302
// as defined by EIP-191
303-
const prefixedMessage = prefixEIP191Message(message, this.connectOptions?.origin)
303+
const prefixedMessage = prefixEIP191Message(message)
304304

305305
// TODO:
306306
// if (process.env.TEST_MODE === 'true' && this.prompter === null) {

packages/provider/src/utils.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ export const messageToBytes = (message: BytesLike): Uint8Array => {
1616
return ethers.utils.toUtf8Bytes(message)
1717
}
1818

19-
export const prefixEIP191Message = (message: BytesLike, origin: string | undefined): Uint8Array => {
19+
export const prefixEIP191Message = (message: BytesLike): Uint8Array => {
2020
const messageBytes = messageToBytes(message)
21-
if (messageIsExemptFromEIP191Prefix(messageBytes, origin)) {
21+
if (messageIsExemptFromEIP191Prefix(messageBytes)) {
2222
return messageBytes
2323
} else {
2424
return ethers.utils.concat([eip191prefix, ethers.utils.toUtf8Bytes(String(messageBytes.length)), messageBytes])
@@ -50,7 +50,7 @@ export const isValidMessageSignature = async (
5050
chainId?: number,
5151
walletContext?: WalletContext
5252
): Promise<boolean | undefined> => {
53-
const prefixed = prefixEIP191Message(message, undefined)
53+
const prefixed = prefixEIP191Message(message)
5454
const digest = encodeMessageDigest(prefixed)
5555
return isValidSignature(address, digest, signature, provider, chainId, walletContext)
5656
}

packages/provider/src/utils/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ export class WalletUtils {
7676
): Promise<boolean | undefined> {
7777
const provider = this.wallet.getProvider(chainId)
7878
if (!provider) throw new Error(`unable to get provider for chainId ${chainId}`)
79-
const prefixed = prefixEIP191Message(message, undefined)
79+
const prefixed = prefixEIP191Message(message)
8080
const digest = encodeMessageDigest(prefixed)
8181
return isValidSignature(address, digest, signature, provider, chainId, walletContext)
8282
}
@@ -115,7 +115,7 @@ export class WalletUtils {
115115
walletContext = walletContext || (await this.wallet.getWalletContext())
116116
return recoverWalletConfig(
117117
address,
118-
encodeMessageDigest(prefixEIP191Message(message, undefined)),
118+
encodeMessageDigest(prefixEIP191Message(message)),
119119
signature,
120120
chainId,
121121
walletContext
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
import chaiAsPromised from 'chai-as-promised'
22
import * as chai from 'chai'
33

4-
import { isZeroExV3Order, messageIsExemptFromEIP191Prefix } from '../src/eip191exceptions'
5-
import { message1, zeroExV3Order } from './messages'
6-
import { ethers } from 'ethers'
4+
import { messageIsExemptFromEIP191Prefix } from '../src/eip191exceptions'
5+
import { dclLogin, message1, zeroExV3Order } from './messages'
76
const { expect } = chai.use(chaiAsPromised)
87

98
describe('191 prefix exceptions', () => {
109
it('decentraland is exempt', () => {
11-
expect(messageIsExemptFromEIP191Prefix(message1, 'https://play.decentraland.org')).equal(true)
10+
expect(messageIsExemptFromEIP191Prefix(dclLogin)).equal(true)
1211
})
1312

1413
it('should strip 191 prefix from 0x v3 orders', () => {
15-
expect(messageIsExemptFromEIP191Prefix(zeroExV3Order, undefined)).equal(true)
14+
expect(messageIsExemptFromEIP191Prefix(zeroExV3Order)).equal(true)
1615
})
1716

1817
it('should not strip 191 prefix from other messages', () => {
19-
expect(messageIsExemptFromEIP191Prefix(message1, undefined)).equal(false)
20-
expect(messageIsExemptFromEIP191Prefix(message1, 'https://play.example.com')).equal(false)
18+
expect(messageIsExemptFromEIP191Prefix(message1)).equal(false)
19+
expect(messageIsExemptFromEIP191Prefix(zeroExV3Order.slice(0, -10))).equal(false)
20+
expect(messageIsExemptFromEIP191Prefix(dclLogin.slice(0, -10))).equal(false)
2121
})
2222
})

packages/provider/tests/messages.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1+
import { ethers } from "ethers"
2+
13
// Ethereum personal sign: Hello, World!
24
export const message1 = new Uint8Array([
35
25, 69, 116, 104, 101, 114, 101, 117, 109, 32, 83, 105, 103, 110, 101, 100, 32, 77, 101, 115, 115, 97, 103, 101, 58, 10, 49, 51,
46
72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33
57
])
68

9+
10+
export const dclLogin = ethers.utils.toUtf8Bytes(`Decentraland Login
11+
Ephemeral address: 0xe1bCF3CAc83534a055f7254C1FD88B21159fCc67
12+
Expiration: 2022-10-27T16:03:29.191Z`)
13+
714
// Ethereum personal sign 0x v3 order
815
export const zeroExV3Order = new Uint8Array([
916
62, 254, 80, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 3, 153, 144,

0 commit comments

Comments
 (0)