Don't wrap/unwrap Ethereum-style (#748)
* Don't wrap/unwrap Ethereum-style * Update packages/extension-dapp/src/wrapBytes.spec.ts
This commit is contained in:
@@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -3,21 +3,32 @@
|
||||
|
||||
import { u8aConcat, u8aEq, u8aToU8a } from '@polkadot/util';
|
||||
|
||||
export const ETHEREUM = u8aToU8a('\x19Ethereum Signed Message:\n');
|
||||
export const PREFIX = u8aToU8a('<Bytes>');
|
||||
export const POSTFIX = u8aToU8a('</Bytes>');
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user