Commit 402bda91 authored by YJ's avatar YJ Committed by Thibaut Sardan
Browse files

onScan find Address in Store with Appropriate Prefix (#349)

* feat: encode to network prefix based on genesis hash

* fix: try other encoding of address on scan

* fix: grumble

* fix: get prefix from constants
parent 2ed8c705
Pipeline #50760 failed with stage
in 14 seconds
......@@ -17,9 +17,10 @@
// @flow
import { GenericExtrinsicPayload } from '@polkadot/types';
import { hexStripPrefix, isU8a, u8aToHex } from '@polkadot/util';
import { checkAddress, decodeAddress, encodeAddress } from '@polkadot/util-crypto';
import { Container } from 'unstated';
import { NETWORK_LIST, NetworkProtocols } from '../constants';
import { NETWORK_LIST, NetworkProtocols, SUBSTRATE_NETWORK_LIST } from '../constants';
import { saveTx } from '../util/db';
import { isAscii } from '../util/message';
import { blake2s, brainWalletSign, decryptData, keccak, ethSign, substrateSign } from '../util/native';
......@@ -81,6 +82,20 @@ export default class ScannerStore extends Container<ScannerState> {
async setParsedData(strippedData, accountsStore) {
const parsedData = await constructDataFromBytes(strippedData);
if (!accountsStore.getByAddress(parsedData.data.account)) {
let networks = Object.keys(SUBSTRATE_NETWORK_LIST);
for (let i = 0; i < networks.length; i++) {
let key = networks[i];
let account = accountsStore.getByAddress(encodeAddress(decodeAddress(parsedData.data.account), SUBSTRATE_NETWORK_LIST[key].prefix));
if (account) {
parsedData['data']['account'] = account.address;
break;
}
}
}
if (parsedData.isMultipart) {
this.setPartData(parseData.frame, parsedData.frameCount, parseData.partData, accountsStore);
return;
......
......@@ -23,9 +23,10 @@ import {
u8aToHex,
u8aToString
} from '@polkadot/util';
import { encodeAddress } from '@polkadot/util-crypto';
import { encodeAddress, checkAddress } from '@polkadot/util-crypto';
import { blake2s, keccak } from './native';
import { blake2s } from './native';
import { NETWORK_LIST, SUBSTRATE_NETWORK_LIST, SubstrateNetworkKeys } from '../constants';
/*
Example Full Raw Data
......@@ -143,38 +144,53 @@ export async function constructDataFromBytes(bytes) {
case '53': // Substrate UOS payload
try {
const crypto = firstByte === '00' ? 'ed25519' : firstByte === '01' ? 'sr25519' : null;
data['data']['crypto'] = crypto;
const pubKeyHex = uosAfterFrames.substr(6, 64)
const publicKeyAsBytes = hexToU8a('0x' + pubKeyHex);
const ss58Encoded = encodeAddress(publicKeyAsBytes, 2); // encode to kusama
const hexEncodedData = '0x' + uosAfterFrames.slice(70);
const rawPayload = hexToU8a(hexEncodedData);
const isOversized = rawPayload.length > 256;
data['data']['crypto'] = crypto;
data['data']['account'] = ss58Encoded;
const defaultPrefix = SUBSTRATE_NETWORK_LIST[SubstrateNetworkKeys.KUSAMA].prefix;
let extrinsicPayload;
let network;
switch (secondByte) {
case '00': // sign mortal extrinsic
extrinsicPayload = new GenericExtrinsicPayload(rawPayload, { version: 3 });
data['action'] = isOversized ? 'signData' : 'signTransaction';
data['oversized'] = isOversized;
data['isHash'] = isOversized;
data['data']['data'] = isOversized
? await blake2s(u8aToHex(rawPayload))
: new GenericExtrinsicPayload(rawPayload, { version: 3 });
: extrinsicPayload;
network = NETWORK_LIST[extrinsicPayload.genesisHash.toHex()];
data['data']['account'] = encodeAddress(publicKeyAsBytes, network.prefix); // encode to the prefix;
break;
case '01': // data is a hash
data['action'] = 'signData';
data['oversized'] = false;
data['isHash'] = true;
data['data']['data'] = rawPayload;
data['data']['account'] = encodeAddress(publicKeyAsBytes, defaultPrefix); // default to Kusama
break;
case '02': // immortal
extrinsicPayload = new GenericExtrinsicPayload(rawPayload, { version: 3 });
data['action'] = isOversized ? 'signData' : 'signTransaction';
data['oversized'] = isOversized;
data['isHash'] = isOversized;
data['data']['data'] = isOversized
? await blake2s(u8aToHex(rawPayload))
: new GenericExtrinsicPayload(rawPayload, { version: 3 });
: extrinsicPayload;
network = NETWORK_LIST[extrinsicPayload.genesisHash.toHex()];
data['data']['account'] = encodeAddress(publicKeyAsBytes, network.prefix); // encode to the prefix;
break;
case '03': // Cold Signer should attempt to decode message to utf8
data['action'] = 'signData';
......@@ -183,6 +199,7 @@ export async function constructDataFromBytes(bytes) {
data['data']['data'] = isOversized
? await blake2s(u8aToHex(rawPayload))
: u8aToString(rawPayload);
data['data']['account'] = encodeAddress(publicKeyAsBytes, defaultPrefix); // default to Kusama
break;
default:
break;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment