mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
Increase likelyhood of valid method signatures being returned by getMethodData
(#14937)
* Increase likelyhood of valid method signatures being returned by getMethodData * Update coverage * Update coverage * Update coverage * add a migration to clear knownMethodData * Small typo changes Co-authored-by: Alex <adonesky@gmail.com>
This commit is contained in:
parent
f85806ce97
commit
167af09a11
30
app/scripts/migrations/072.js
Normal file
30
app/scripts/migrations/072.js
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
import { cloneDeep } from 'lodash';
|
||||||
|
|
||||||
|
const version = 72;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Should empty the `knownMethodData` object in PreferencesController
|
||||||
|
*/
|
||||||
|
export default {
|
||||||
|
version,
|
||||||
|
async migrate(originalVersionedData) {
|
||||||
|
const versionedData = cloneDeep(originalVersionedData);
|
||||||
|
versionedData.meta.version = version;
|
||||||
|
const state = versionedData.data;
|
||||||
|
const newState = transformState(state);
|
||||||
|
versionedData.data = newState;
|
||||||
|
return versionedData;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
function transformState(state) {
|
||||||
|
const PreferencesController = state?.PreferencesController || {};
|
||||||
|
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
PreferencesController: {
|
||||||
|
...PreferencesController,
|
||||||
|
knownMethodData: {},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
427
app/scripts/migrations/072.test.js
Normal file
427
app/scripts/migrations/072.test.js
Normal file
@ -0,0 +1,427 @@
|
|||||||
|
import migration72 from './072';
|
||||||
|
|
||||||
|
describe('migration #72', () => {
|
||||||
|
it('should update the version metadata', async () => {
|
||||||
|
const oldStorage = {
|
||||||
|
meta: {
|
||||||
|
version: 71,
|
||||||
|
},
|
||||||
|
data: {},
|
||||||
|
};
|
||||||
|
|
||||||
|
const newStorage = await migration72.migrate(oldStorage);
|
||||||
|
expect(newStorage.meta).toStrictEqual({
|
||||||
|
version: 72,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should empty knownMethodData object in PreferencesController', async () => {
|
||||||
|
const oldStorage = {
|
||||||
|
meta: {
|
||||||
|
version: 71,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
PreferencesController: {
|
||||||
|
knownMethodData: {
|
||||||
|
'0x095ea7b3': {
|
||||||
|
name: 'Approve',
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'0x1249c58b': {
|
||||||
|
name: 'Mint',
|
||||||
|
params: [],
|
||||||
|
},
|
||||||
|
'0x1688f0b9': {
|
||||||
|
name: 'Create Proxy With Nonce',
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'bytes',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'0x18cbafe5': {
|
||||||
|
name: 'Swap Exact Tokens For E T H',
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'address[]',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'0x23b872dd': {
|
||||||
|
name: 'Transfer From',
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'0x2e1a7d4d': {
|
||||||
|
name: 'Withdraw',
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'0x2e7ba6ef': {
|
||||||
|
name: 'Claim',
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'bytes32[]',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'0x2eb2c2d6': {
|
||||||
|
name: 'Safe Batch Transfer From',
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256[]',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256[]',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'bytes',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'0x3671f8cf': {},
|
||||||
|
'0x41441d3b': {
|
||||||
|
name: 'Enter Staking',
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'0x441a3e70': {
|
||||||
|
name: 'Withdraw',
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'0x6f652e1a': {
|
||||||
|
name: 'Create Order',
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'0x8dbdbe6d': {
|
||||||
|
name: 'Deposit',
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'0x8ed955b9': {
|
||||||
|
name: 'Harvest All',
|
||||||
|
params: [],
|
||||||
|
},
|
||||||
|
'0xa22cb465': {
|
||||||
|
name: 'Set Approval For All',
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'bool',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'0xa9059cbb': {
|
||||||
|
name: 'Transfer',
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'0xab834bab': {
|
||||||
|
name: 'Atomic Match_',
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
type: 'address[14]',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256[18]',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint8[8]',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'bytes',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'bytes',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'bytes',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'bytes',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'bytes',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'bytes',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint8[2]',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'bytes32[5]',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'0xd0e30db0': {
|
||||||
|
name: 'Deposit',
|
||||||
|
params: [],
|
||||||
|
},
|
||||||
|
'0xddd81f82': {
|
||||||
|
name: 'Register Proxy',
|
||||||
|
params: [],
|
||||||
|
},
|
||||||
|
'0xded9382a': {
|
||||||
|
name: 'Remove Liquidity E T H With Permit',
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'bool',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint8',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'bytes32',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'bytes32',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'0xe2bbb158': {
|
||||||
|
name: 'Deposit',
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'0xf305d719': {
|
||||||
|
name: 'Add Liquidity E T H',
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'uint256',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const newStorage = await migration72.migrate(oldStorage);
|
||||||
|
expect(newStorage).toStrictEqual({
|
||||||
|
meta: {
|
||||||
|
version: 72,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
PreferencesController: {
|
||||||
|
knownMethodData: {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should preserve other PreferencesController state', async () => {
|
||||||
|
const oldStorage = {
|
||||||
|
meta: {
|
||||||
|
version: 71,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
PreferencesController: {
|
||||||
|
currentLocale: 'en',
|
||||||
|
dismissSeedBackUpReminder: false,
|
||||||
|
ipfsGateway: 'dweb.link',
|
||||||
|
knownMethodData: {
|
||||||
|
'0xd0e30db0': {
|
||||||
|
name: 'Deposit',
|
||||||
|
params: [],
|
||||||
|
},
|
||||||
|
'0xddd81f82': {
|
||||||
|
name: 'Register Proxy',
|
||||||
|
params: [],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
openSeaEnabled: false,
|
||||||
|
useTokenDetection: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const newStorage = await migration72.migrate(oldStorage);
|
||||||
|
expect(newStorage).toStrictEqual({
|
||||||
|
meta: {
|
||||||
|
version: 72,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
PreferencesController: {
|
||||||
|
currentLocale: 'en',
|
||||||
|
dismissSeedBackUpReminder: false,
|
||||||
|
ipfsGateway: 'dweb.link',
|
||||||
|
knownMethodData: {},
|
||||||
|
openSeaEnabled: false,
|
||||||
|
useTokenDetection: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not change state in controllers other than PreferencesController', async () => {
|
||||||
|
const oldStorage = {
|
||||||
|
meta: {
|
||||||
|
version: 71,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
PreferencesController: {
|
||||||
|
knownMethodData: {
|
||||||
|
'0xd0e30db0': {
|
||||||
|
name: 'Deposit',
|
||||||
|
params: [],
|
||||||
|
},
|
||||||
|
'0xddd81f82': {
|
||||||
|
name: 'Register Proxy',
|
||||||
|
params: [],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
FooController: { a: 'b' },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const newStorage = await migration72.migrate(oldStorage);
|
||||||
|
expect(newStorage).toStrictEqual({
|
||||||
|
meta: {
|
||||||
|
version: 72,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
PreferencesController: {
|
||||||
|
knownMethodData: {},
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
FooController: { a: 'b' },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -75,6 +75,7 @@ import m068 from './068';
|
|||||||
import m069 from './069';
|
import m069 from './069';
|
||||||
import m070 from './070';
|
import m070 from './070';
|
||||||
import m071 from './071';
|
import m071 from './071';
|
||||||
|
import m072 from './072';
|
||||||
|
|
||||||
const migrations = [
|
const migrations = [
|
||||||
m002,
|
m002,
|
||||||
@ -147,6 +148,7 @@ const migrations = [
|
|||||||
m069,
|
m069,
|
||||||
m070,
|
m070,
|
||||||
m071,
|
m071,
|
||||||
|
m072,
|
||||||
];
|
];
|
||||||
|
|
||||||
export default migrations;
|
export default migrations;
|
||||||
|
@ -11,8 +11,8 @@ module.exports = {
|
|||||||
global: {
|
global: {
|
||||||
branches: 44,
|
branches: 44,
|
||||||
functions: 42,
|
functions: 42,
|
||||||
lines: 48,
|
lines: 52,
|
||||||
statements: 48,
|
statements: 52,
|
||||||
},
|
},
|
||||||
'./app/scripts/controllers/permissions/**/*.js': {
|
'./app/scripts/controllers/permissions/**/*.js': {
|
||||||
branches: 100,
|
branches: 100,
|
||||||
|
@ -35,12 +35,23 @@ async function getMethodFrom4Byte(fourBytePrefix) {
|
|||||||
mode: 'cors',
|
mode: 'cors',
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
fourByteResponse.results.sort((a, b) => {
|
||||||
if (fourByteResponse.count === 1) {
|
return new Date(a.created_at).getTime() < new Date(b.created_at).getTime()
|
||||||
return fourByteResponse.results[0].text_signature;
|
? -1
|
||||||
}
|
: 1;
|
||||||
return null;
|
});
|
||||||
|
return fourByteResponse.results[0].text_signature;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function pickShortest(registrySig, fourByteSig) {
|
||||||
|
if (!registrySig) {
|
||||||
|
return fourByteSig;
|
||||||
|
} else if (!fourByteSig) {
|
||||||
|
return registrySig;
|
||||||
|
}
|
||||||
|
return fourByteSig.length < registrySig.length ? fourByteSig : registrySig;
|
||||||
|
}
|
||||||
|
|
||||||
let registry;
|
let registry;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -51,7 +62,7 @@ let registry;
|
|||||||
*/
|
*/
|
||||||
export async function getMethodDataAsync(fourBytePrefix) {
|
export async function getMethodDataAsync(fourBytePrefix) {
|
||||||
try {
|
try {
|
||||||
const fourByteSig = getMethodFrom4Byte(fourBytePrefix).catch((e) => {
|
const fourByteSig = await getMethodFrom4Byte(fourBytePrefix).catch((e) => {
|
||||||
log.error(e);
|
log.error(e);
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
@ -60,11 +71,12 @@ export async function getMethodDataAsync(fourBytePrefix) {
|
|||||||
registry = new MethodRegistry({ provider: global.ethereumProvider });
|
registry = new MethodRegistry({ provider: global.ethereumProvider });
|
||||||
}
|
}
|
||||||
|
|
||||||
let sig = await registry.lookup(fourBytePrefix);
|
const registrySig = await registry.lookup(fourBytePrefix).catch((e) => {
|
||||||
|
log.error(e);
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
if (!sig) {
|
const sig = pickShortest(registrySig, fourByteSig);
|
||||||
sig = await fourByteSig;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sig) {
|
if (!sig) {
|
||||||
return {};
|
return {};
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
import { HttpProvider } from 'ethjs';
|
||||||
|
import nock from 'nock';
|
||||||
import {
|
import {
|
||||||
TRANSACTION_GROUP_STATUSES,
|
TRANSACTION_GROUP_STATUSES,
|
||||||
TRANSACTION_STATUSES,
|
TRANSACTION_STATUSES,
|
||||||
@ -55,4 +57,48 @@ describe('Transactions utils', () => {
|
|||||||
).toStrictEqual(false);
|
).toStrictEqual(false);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('getMethodDataAsync', () => {
|
||||||
|
global.ethereumProvider = new HttpProvider(
|
||||||
|
'https://mainnet.infura.io/v3/341eacb578dd44a1a049cbc5f6fd4035',
|
||||||
|
);
|
||||||
|
it('returns a valid signature for setApprovalForAll', async () => {
|
||||||
|
nock('https://www.4byte.directory:443', { encodedQueryParams: true })
|
||||||
|
.get('/api/v1/signatures/')
|
||||||
|
.query({ hex_signature: '0xa22cb465' })
|
||||||
|
.reply(200, {
|
||||||
|
count: 2,
|
||||||
|
next: null,
|
||||||
|
previous: null,
|
||||||
|
results: [
|
||||||
|
{
|
||||||
|
id: 841519,
|
||||||
|
created_at: '2022-06-12T00:50:19.305588Z',
|
||||||
|
text_signature: 'niceFunctionHerePlzClick943230089(address,bool)',
|
||||||
|
hex_signature: '0xa22cb465',
|
||||||
|
bytes_signature: '¢,´e',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 29659,
|
||||||
|
created_at: '2018-04-11T21:47:39.980645Z',
|
||||||
|
text_signature: 'setApprovalForAll(address,bool)',
|
||||||
|
hex_signature: '0xa22cb465',
|
||||||
|
bytes_signature: '¢,´e',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
nock('https://mainnet.infura.io:443', { encodedQueryParams: true })
|
||||||
|
.post('/v3/341eacb578dd44a1a049cbc5f6fd4035')
|
||||||
|
.reply(200, (_, requestBody) => ({
|
||||||
|
id: requestBody.id,
|
||||||
|
jsonrpc: '2.0',
|
||||||
|
result:
|
||||||
|
'0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002f6e69636546756e6374696f6e48657265506c7a436c69636b39343332333030383928616464726573732c626f6f6c290000000000000000000000000000000000',
|
||||||
|
}));
|
||||||
|
expect(await utils.getMethodDataAsync('0xa22cb465')).toStrictEqual({
|
||||||
|
name: 'Set Approval For All',
|
||||||
|
params: [{ type: 'address' }, { type: 'bool' }],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user