Skip to content

Commit 6059992

Browse files
committed
feat(eth): implement the unsigned consolidation for eth
ticket: WIN-5700
1 parent eb0faa5 commit 6059992

File tree

8 files changed

+331
-7
lines changed

8 files changed

+331
-7
lines changed

electron/main/index.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { TrxConsolidationRecoveryOptions } from '../types';
1+
import { EthRecoveryConsolidationRecoveryOptions, TrxConsolidationRecoveryOptions } from '../types';
22
import EthereumCommon from '@ethereumjs/common';
33

44
process.env.DIST_ELECTRON = join(__dirname, '../..');
@@ -12,7 +12,7 @@ import { AbstractUtxoCoin } from '@bitgo/abstract-utxo';
1212
import { BitGoAPI } from '@bitgo/sdk-api';
1313
import { Ada, Tada } from '@bitgo/sdk-coin-ada';
1414
import { Dot, Tdot } from '@bitgo/sdk-coin-dot';
15-
import { AbstractEthLikeNewCoins } from '@bitgo/sdk-coin-eth';
15+
import { AbstractEthLikeNewCoins, Eth, Hteth } from '@bitgo/sdk-coin-eth';
1616
import { Sol, Tsol, SolToken } from '@bitgo/sdk-coin-sol';
1717
import { Trx, Ttrx, TrxToken } from '@bitgo/sdk-coin-trx';
1818
import { BaseCoin } from '@bitgo/sdk-core';
@@ -270,6 +270,11 @@ async function createWindow() {
270270
params as TrxConsolidationRecoveryOptions
271271
);
272272
}
273+
case 'eth':
274+
case 'hteth': {
275+
const ethLikeCoin = sdk.coin(coin) as unknown as Eth | Hteth;
276+
return await ethLikeCoin.recoverConsolidations(params as EthRecoveryConsolidationRecoveryOptions);
277+
}
273278
default:
274279
throw new Error(
275280
`Coin: ${coin} does not support consolidation recovery`

electron/preload/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ import {
3333
SolRecoveryConsolidationRecoveryOptions,
3434
SuiRecoverConsolidationRecoveryBatch,
3535
SuiRecoveryConsolidationRecoveryOptions,
36+
EthRecoveryConsolidationRecoveryOptions,
37+
EthRecoverConsolidationRecoveryBatch,
3638
} from '../types';
3739

3840
import type * as EthLikeCommon from '@ethereumjs/common';
@@ -61,6 +63,7 @@ type Commands = {
6163
| TaoRecoveryConsolidationRecoveryOptions
6264
| SolRecoveryConsolidationRecoveryOptions
6365
| SuiRecoveryConsolidationRecoveryOptions
66+
| EthRecoveryConsolidationRecoveryOptions
6467
): Promise<
6568
| Error
6669
| TrxConsolidationRecoveryBatch
@@ -69,6 +72,7 @@ type Commands = {
6972
| TaoRecoverConsolidationRecoveryBatch
7073
| SolRecoverConsolidationRecoveryBatch
7174
| SuiRecoverConsolidationRecoveryBatch
75+
| EthRecoverConsolidationRecoveryBatch
7276
>;
7377
writeFile(
7478
file: string,
@@ -185,13 +189,15 @@ const commands: Commands = {
185189
| DotRecoveryConsolidationRecoveryOptions
186190
| TaoRecoveryConsolidationRecoveryOptions
187191
| SolRecoveryConsolidationRecoveryOptions
192+
| EthRecoveryConsolidationRecoveryOptions
188193
): Promise<
189194
| Error
190195
| TrxConsolidationRecoveryBatch
191196
| AdaRecoveryConsolidationRecoveryBatch
192197
| DotRecoverConsolidationRecoveryBatch
193198
| TaoRecoverConsolidationRecoveryBatch
194199
| SolRecoverConsolidationRecoveryBatch
200+
| EthRecoverConsolidationRecoveryBatch
195201
> {
196202
return ipcRenderer.invoke('recoverConsolidations', coin, params);
197203
},

electron/types.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ export type SuiRecoveryConsolidationRecoveryOptions =
6969
| Parameters<Tsui['recoverConsolidations']>[0];
7070
export type TrxConsolidationRecoveryOptions = ConsolidationRecoveryOptions;
7171

72+
export type EthRecoveryConsolidationRecoveryOptions =
73+
| Parameters<Eth['recoverConsolidations']>[0]
74+
| Parameters<Hteth['recoverConsolidations']>[0];
75+
7276
export type AdaRecoveryConsolidationRecoveryBatch = Awaited<
7377
ReturnType<Ada['recoverConsolidations'] | Tada['recoverConsolidations']>
7478
>;
@@ -85,3 +89,7 @@ export type SuiRecoverConsolidationRecoveryBatch = Awaited<
8589
ReturnType<Sui['recoverConsolidations'] | Tsui['recoverConsolidations']>
8690
>;
8791
export type TrxConsolidationRecoveryBatch = ConsolidationRecoveryBatch;
92+
93+
export type EthRecoverConsolidationRecoveryBatch = Awaited<
94+
ReturnType<Eth['recoverConsolidations'] | Hteth['recoverConsolidations']>
95+
>;

src/containers/BuildUnsignedConsolidation/BuildUnsignedConsolidationCoin.tsx

Lines changed: 82 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { useNavigate, useParams } from 'react-router-dom';
22
import {
33
assert,
44
BitgoEnv,
5+
getEip1559Params,
6+
getEthLikeRecoveryChainId,
57
includePubsFor,
68
safeEnv,
79
updateKeysFromIds,
@@ -17,6 +19,7 @@ import { GenericEcdsaForm } from '~/containers/BuildUnsignedConsolidation/Generi
1719
import { SolForm } from '~/containers/BuildUnsignedConsolidation/SolForm';
1820
import { SolTokenForm } from '~/containers/BuildUnsignedConsolidation/SolTokenForm';
1921
import { SuiTokenForm } from '~/containers/BuildUnsignedConsolidation/SuiTokenForm';
22+
import { EthLikeForm } from './EthLikeForm';
2023

2124
type ConsolidationFormProps = {
2225
coin?: string;
@@ -361,11 +364,11 @@ function ConsolidationForm({ coin, environment }: ConsolidationFormProps) {
361364
const parentCoin = tokenParentCoins[coin];
362365
const chainData = await window.queries.getChain(parentCoin);
363366
const consolidateData = await window.commands.recoverConsolidations(parentCoin, {
364-
...(await updateKeysFromIds(parentCoin, values)),
365-
bitgoKey: values.bitgoKey.replace(/\s+/g, ''),
366-
tokenContractAddress: values.packageId,
367-
seed: values.seed,
368-
});
367+
...(await updateKeysFromIds(parentCoin, values)),
368+
bitgoKey: values.bitgoKey.replace(/\s+/g, ''),
369+
tokenContractAddress: values.packageId,
370+
seed: values.seed,
371+
});
369372

370373
if (consolidateData instanceof Error) {
371374
throw consolidateData;
@@ -399,6 +402,80 @@ function ConsolidationForm({ coin, environment }: ConsolidationFormProps) {
399402
console.log(e);
400403
}
401404

405+
setSubmitting(false);
406+
}
407+
}}
408+
/>
409+
);
410+
case 'eth':
411+
case 'hteth':
412+
return (
413+
<EthLikeForm
414+
key={coin}
415+
coinName={coin}
416+
onSubmit={async (values, { setSubmitting }) => {
417+
setAlert(undefined);
418+
setSubmitting(true);
419+
try {
420+
await window.commands.setBitGoEnvironment(
421+
environment,
422+
coin,
423+
values.apiKey
424+
);
425+
const chainData = await window.queries.getChain(coin);
426+
427+
const { maxFeePerGas, maxPriorityFeePerGas, ...rest } =
428+
await updateKeysFromIds(coin, values);
429+
const recoverData = await window.commands.recoverConsolidations(
430+
coin,
431+
{
432+
...rest,
433+
coinName: coin,
434+
eip1559: getEip1559Params(
435+
coin,
436+
maxFeePerGas,
437+
maxPriorityFeePerGas
438+
),
439+
replayProtectionOptions: {
440+
chain: getEthLikeRecoveryChainId(coin, environment),
441+
hardfork: 'london',
442+
},
443+
bitgoKey: '',
444+
ignoreAddressTypes: [],
445+
}
446+
);
447+
448+
if (recoverData instanceof Error) {
449+
throw recoverData;
450+
}
451+
452+
const showSaveDialogData = await window.commands.showSaveDialog({
453+
filters: [
454+
{
455+
name: 'Custom File Type',
456+
extensions: ['json'],
457+
},
458+
],
459+
defaultPath: `~/${chainData}-unsigned-sweep-${Date.now()}.json`,
460+
});
461+
462+
if (!showSaveDialogData.filePath) {
463+
throw new Error('No file path selected');
464+
}
465+
466+
await window.commands.writeFile(
467+
showSaveDialogData.filePath,
468+
JSON.stringify(recoverData, null, 2),
469+
{ encoding: 'utf-8' }
470+
);
471+
472+
navigate(`/${environment}/build-unsigned-sweep/${coin}/success`);
473+
} catch (err) {
474+
if (err instanceof Error) {
475+
setAlert(err.message);
476+
} else {
477+
console.error(err);
478+
}
402479
setSubmitting(false);
403480
}
404481
}}

0 commit comments

Comments
 (0)