From 520944eb792b8cfe3f2cd5cb9778d8270df621a9 Mon Sep 17 00:00:00 2001 From: "@greweb" Date: Thu, 6 Jan 2022 15:53:19 +0100 Subject: [PATCH] LL-8906 implement better resilience of hw-app-eth on resolution service (#755) * Implement better resilience of hw-app-eth on resolution service LL-8906 * doc --- packages/hw-app-eth/README.md | 15 ++++++++ packages/hw-app-eth/src/Eth.ts | 5 ++- .../hw-app-eth/src/services/ledger/index.ts | 34 +++++++++++-------- packages/hw-app-eth/src/services/types.ts | 16 ++++++++- 4 files changed, 54 insertions(+), 16 deletions(-) diff --git a/packages/hw-app-eth/README.md b/packages/hw-app-eth/README.md index 34635c4af..1aa0bfc12 100644 --- a/packages/hw-app-eth/README.md +++ b/packages/hw-app-eth/README.md @@ -55,6 +55,8 @@ Ledger Hardware Wallet ETH JavaScript bindings. * [byContractAddressAndChainId](#bycontractaddressandchainid) * [Parameters](#parameters-16) * [list](#list) +* [ResolutionConfig](#resolutionconfig) + * [Properties](#properties) ### Eth @@ -359,3 +361,16 @@ Returns **(TokenInfo | null | [undefined](https://developer.mozilla.org/docs/Web list all the ERC20 tokens informations Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)\** + +### ResolutionConfig + +Allows to configure precisely what the service need to resolve. +for instance you can set nft:true if you need clear signing on NFTs. If you set it and it is not a NFT transaction, it should still work but will do a useless service resolution. + +Type: {nft: [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?, externalPlugins: [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?, erc20: [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?} + +#### Properties + +* `nft` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** +* `externalPlugins` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** +* `erc20` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** diff --git a/packages/hw-app-eth/src/Eth.ts b/packages/hw-app-eth/src/Eth.ts index dc2590462..4d5300d29 100644 --- a/packages/hw-app-eth/src/Eth.ts +++ b/packages/hw-app-eth/src/Eth.ts @@ -213,7 +213,10 @@ export default class Eth { " + const resolution = await ledgerService.resolveTransaction(rawTxHex);" ); resolution = await ledgerService - .resolveTransaction(rawTxHex, this.loadConfig) + .resolveTransaction(rawTxHex, this.loadConfig, { + externalPlugins: true, + erc20: true, + }) .catch((e) => { console.warn( "an error occurred in resolveTransaction => fallback to blind signing: " + diff --git a/packages/hw-app-eth/src/services/ledger/index.ts b/packages/hw-app-eth/src/services/ledger/index.ts index af9b3a47d..577f99c7a 100644 --- a/packages/hw-app-eth/src/services/ledger/index.ts +++ b/packages/hw-app-eth/src/services/ledger/index.ts @@ -12,7 +12,7 @@ import { getNFTInfo, loadNftPlugin } from "./nfts"; import { decodeTxInfo } from "../../utils"; const ledgerService: LedgerEthTransactionService = { - resolveTransaction: async (rawTxHex, loadConfig) => { + resolveTransaction: async (rawTxHex, loadConfig, resolutionConfig) => { const resolution: LedgerEthTransactionResolution = { erc20Tokens: [], nfts: [], @@ -36,7 +36,9 @@ const ledgerService: LedgerEthTransactionService = { const rawTx = Buffer.from(rawTxHex, "hex"); const { decodedTx, chainIdTruncated } = decodeTxInfo(rawTx); const provideForContract = async (address) => { - const nftInfo = await getNFTInfo(address, chainIdTruncated, loadConfig); + const nftInfo = resolutionConfig.nft + ? await getNFTInfo(address, chainIdTruncated, loadConfig) + : null; if (nftInfo) { log( "ethereum", @@ -68,22 +70,26 @@ const ledgerService: LedgerEthTransactionService = { if (decodedTx.data.length >= 10) { const selector = decodedTx.data.substring(0, 10); - const nftPluginPayload = await loadNftPlugin( - decodedTx.to, - selector, - chainIdTruncated, - loadConfig - ); + const nftPluginPayload = resolutionConfig.nft + ? await loadNftPlugin( + decodedTx.to, + selector, + chainIdTruncated, + loadConfig + ) + : null; if (nftPluginPayload) { setPlugin(nftPluginPayload); } else { - const infos = await loadInfosForContractMethod( - decodedTx.to, - selector, - chainIdTruncated, - loadConfig - ); + const infos = resolutionConfig.externalPlugins + ? await loadInfosForContractMethod( + decodedTx.to, + selector, + chainIdTruncated, + loadConfig + ) + : null; if (infos) { const { plugin, payload, signature, erc20OfInterest, abi } = infos; diff --git a/packages/hw-app-eth/src/services/types.ts b/packages/hw-app-eth/src/services/types.ts index 8c9d8dd24..104283346 100644 --- a/packages/hw-app-eth/src/services/types.ts +++ b/packages/hw-app-eth/src/services/types.ts @@ -20,9 +20,23 @@ export type LoadConfig = { extraPlugins?: any | null; }; +/** + * Allows to configure precisely what the service need to resolve. + * for instance you can set nft:true if you need clear signing on NFTs. If you set it and it is not a NFT transaction, it should still work but will do a useless service resolution. + */ +export type ResolutionConfig = { + // NFT resolution service + nft?: boolean; + // external plugins resolution service (e.G. LIDO) + externalPlugins?: boolean; + // ERC20 resolution service (to clear sign erc20 transfers & other actions) + erc20?: boolean; +}; + export type LedgerEthTransactionService = { resolveTransaction: ( rawTxHex: string, - loadConfig: LoadConfig + loadConfig: LoadConfig, + resolutionConfig: ResolutionConfig ) => Promise; };