From aa9b7c959c41903df2bbe62100d2f61284ca2fd6 Mon Sep 17 00:00:00 2001 From: Jaco Date: Mon, 14 Jun 2021 10:47:04 +0300 Subject: [PATCH] Don't wrap/unwrap Ethereum-style (#748) * Don't wrap/unwrap Ethereum-style * Update packages/extension-dapp/src/wrapBytes.spec.ts --- packages/extension-dapp/src/wrapBytes.spec.ts | 23 +++++++++++++++++- packages/extension-dapp/src/wrapBytes.ts | 24 ++++++++++++++----- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/packages/extension-dapp/src/wrapBytes.spec.ts b/packages/extension-dapp/src/wrapBytes.spec.ts index 1af4bcd0..6f9b7676 100644 --- a/packages/extension-dapp/src/wrapBytes.spec.ts +++ b/packages/extension-dapp/src/wrapBytes.spec.ts @@ -3,9 +3,10 @@ import { u8aConcat, u8aEq, u8aToString } from '@polkadot/util'; -import { POSTFIX, PREFIX, unwrapBytes, wrapBytes } from './wrapBytes'; +import { ETHEREUM, POSTFIX, PREFIX, unwrapBytes, wrapBytes } from './wrapBytes'; const TEST_DATA = 'this is just some random message that we expect to be wrapped along the way'; +const TEST_ETH = u8aConcat(ETHEREUM, TEST_DATA); const TEST_WRAP_EMPTY = `${u8aToString(PREFIX)}${u8aToString(POSTFIX)}`; const TEST_WRAP_FULL = `${u8aToString(PREFIX)}${TEST_DATA}${u8aToString(POSTFIX)}`; const TEST_WARP_HALF_PRE = `${u8aToString(PREFIX)}${TEST_DATA}`; @@ -111,4 +112,24 @@ describe('unwrapBytes', (): void => { ) ).toEqual(''); }); + + describe('Ethereum-style', (): void => { + it('does not wrap an Ethereum wrap', (): void => { + expect( + u8aEq( + wrapBytes(TEST_ETH), + TEST_ETH + ) + ).toBe(true); + }); + + it('does not unwrap an Ethereum wrap', (): void => { + expect( + u8aEq( + unwrapBytes(TEST_ETH), + TEST_ETH + ) + ).toBe(true); + }); + }); }); diff --git a/packages/extension-dapp/src/wrapBytes.ts b/packages/extension-dapp/src/wrapBytes.ts index 7ce606f2..a5dcc12c 100644 --- a/packages/extension-dapp/src/wrapBytes.ts +++ b/packages/extension-dapp/src/wrapBytes.ts @@ -3,21 +3,32 @@ import { u8aConcat, u8aEq, u8aToU8a } from '@polkadot/util'; +export const ETHEREUM = u8aToU8a('\x19Ethereum Signed Message:\n'); export const PREFIX = u8aToU8a(''); export const POSTFIX = u8aToU8a(''); const WRAP_LEN = PREFIX.length + POSTFIX.length; -function isWrapped (u8a: Uint8Array): boolean { - return u8a.length >= WRAP_LEN && - u8aEq(u8a.subarray(0, PREFIX.length), PREFIX) && - u8aEq(u8a.slice(-POSTFIX.length), POSTFIX); +function isWrapped (u8a: Uint8Array, withEthereum: boolean): boolean { + return ( + ( + u8a.length >= WRAP_LEN && + u8aEq(u8a.subarray(0, PREFIX.length), PREFIX) && + u8aEq(u8a.slice(-POSTFIX.length), POSTFIX) + ) || + ( + withEthereum && + u8a.length >= ETHEREUM.length && + u8aEq(u8a.subarray(0, ETHEREUM.length), ETHEREUM) + ) + ); } export function unwrapBytes (bytes: string | Uint8Array): Uint8Array { const u8a = u8aToU8a(bytes); - return isWrapped(u8a) + // we don't want to unwrap Ethereum-style wraps + return isWrapped(u8a, false) ? u8a.subarray(PREFIX.length, u8a.length - POSTFIX.length) : u8a; } @@ -25,7 +36,8 @@ export function unwrapBytes (bytes: string | Uint8Array): Uint8Array { export function wrapBytes (bytes: string | Uint8Array): Uint8Array { const u8a = u8aToU8a(bytes); - return isWrapped(u8a) + // if Ethereum-wrapping, we don't add our wrapping bytes + return isWrapped(u8a, true) ? u8a : u8aConcat(PREFIX, u8a, POSTFIX); }