From efdb4df0e68b6fd1d38944cdabc0dcf5a4b9ab39 Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Tue, 25 Jun 2024 19:01:43 +0300 Subject: [PATCH 01/20] button text and no password input for hw --- .../swap/asset-swap/ConfirmSwapTransaction.js | 30 ++++---- .../containers/swap/asset-swap/SwapPage.js | 76 ++++++++++++++----- 2 files changed, 72 insertions(+), 34 deletions(-) diff --git a/packages/yoroi-extension/app/containers/swap/asset-swap/ConfirmSwapTransaction.js b/packages/yoroi-extension/app/containers/swap/asset-swap/ConfirmSwapTransaction.js index 69e68cde9c..a699e2b59e 100644 --- a/packages/yoroi-extension/app/containers/swap/asset-swap/ConfirmSwapTransaction.js +++ b/packages/yoroi-extension/app/containers/swap/asset-swap/ConfirmSwapTransaction.js @@ -27,7 +27,7 @@ type Props = {| slippageValue: string, walletAddress: ?string, priceImpactState: ?PriceImpact, - userPasswordState: State, + userPasswordState: ?State, txSubmitErrorState: State, onRemoteOrderDataResolved: any => Promise, defaultTokenInfo: RemoteTokenInfo, @@ -202,19 +202,21 @@ export default function ConfirmSwapTransaction({ - - { - txSubmitErrorState.update(null); - userPasswordState.update(e.target.value); - }} - error={isIncorrectPassword && 'Incorrect password!'} - /> - + {userPasswordState != null && ( + + { + txSubmitErrorState.update(null); + userPasswordState.update(e.target.value); + }} + error={isIncorrectPassword && 'Incorrect password!'} + /> + + )} ); } diff --git a/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js b/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js index 741669c5b8..9056e2a810 100644 --- a/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js +++ b/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js @@ -15,6 +15,7 @@ import SwapDisclaimerDialog from '../../../components/swap/SwapDisclaimerDialog' import { ROUTES } from '../../../routes-config'; import type { PriceImpact } from '../../../components/swap/types'; import { PriceImpactAlert } from '../../../components/swap/PriceImpact'; +import type { State } from '../context/swap-form/types'; import { StateWrap } from '../context/swap-form/types'; import LoadingSpinner from '../../../components/widgets/LoadingSpinner'; import { addressHexToBech32 } from '../../../api/ada/lib/cardanoCrypto/utils'; @@ -24,6 +25,21 @@ import { IncorrectWalletPasswordError } from '../../../api/common/errors'; import { observer } from 'mobx-react'; import useSwapForm from '../context/swap-form/useSwapForm'; import type { RemoteTokenInfo } from '../../../api/ada/lib/state-fetch/types'; +import globalMessages from '../../../i18n/global-messages'; +import type { $npm$ReactIntl$IntlShape } from 'react-intl'; +import { defineMessages, injectIntl } from 'react-intl'; + +const messages = defineMessages({ + sendUsingLedgerNano: { + id: 'wallet.send.ledger.confirmationDialog.submit', + defaultMessage: '!!!Send using Ledger', + }, + sendUsingTrezorT: { + id: 'wallet.send.trezor.confirmationDialog.submit', + defaultMessage: '!!!Send using Trezor', + }, +}); + export const PRICE_IMPACT_MODERATE_RISK = 1; export const PRICE_IMPACT_HIGH_RISK = 10; @@ -31,7 +47,11 @@ export const LIMIT_PRICE_WARNING_THRESHOLD = 0.1; const SWAP_AGGREGATOR = 'muesliswap'; -function SwapPage(props: StoresAndActionsProps): Node { +type Intl = {| + intl: $npm$ReactIntl$IntlShape, +|}; + +function SwapPage(props: StoresAndActionsProps & Intl): Node { const [openedDialog, setOpenedDialog] = useState(''); const { orderStep, setOrderStepValue } = props.stores.substores.ada.swapStore; @@ -55,6 +75,18 @@ function SwapPage(props: StoresAndActionsProps): Node { buyQuantity, } = useSwapForm(); + const wallet = props.stores.wallets.selectedOrFail; + const walletType: string = wallet.getParent().getWalletVariant(); + const isHardwareWallet = walletType !== 'web'; + const network = wallet.getParent().getNetworkInfo(); + const defaultTokenInfo = props.stores.tokenInfoStore.getDefaultTokenInfoSummary( + network.NetworkId + ); + const getTokenInfoBatch: Array => { [string]: Promise } = ids => + props.stores.tokenInfoStore.fetchMissingAndGetLocalOrRemoteMetadata(network, ids); + const getTokenInfo: string => Promise = id => + getTokenInfoBatch([id])[id].then(res => res ?? {}); + const isMarketOrder = orderType === 'market'; const impact = isMarketOrder ? Number(selectedPoolCalculation?.prices.priceImpact ?? 0) : 0; const priceImpactState: PriceImpact | null = @@ -64,7 +96,7 @@ function SwapPage(props: StoresAndActionsProps): Node { const [selectedWalletAddress, setSelectedWalletAddress] = useState(null); const [slippageValue, setSlippageValue] = useState(String(defaultSlippage)); const [signRequest, setSignRequest] = useState(null); - const userPasswordState = StateWrap(useState('')); + const userPasswordState: ?State = isHardwareWallet ? null : StateWrap(useState('')); const txSubmitErrorState = StateWrap(useState(null)); const isValidTickers = sellTokenInfo?.ticker && buyTokenInfo?.ticker; @@ -84,7 +116,9 @@ function SwapPage(props: StoresAndActionsProps): Node { && buyQuantity.error == null && isValidTickers; - const confirmationCanContinue = userPasswordState.value !== '' && signRequest != null; + const confirmationCanContinue = + (isHardwareWallet || userPasswordState.value !== '') + && signRequest != null; const isButtonLoader = orderStep === 1 && signRequest == null; @@ -92,16 +126,6 @@ function SwapPage(props: StoresAndActionsProps): Node { (orderStep === 0 && swapFormCanContinue) || (orderStep === 1 && confirmationCanContinue); - const wallet = props.stores.wallets.selectedOrFail; - const network = wallet.getParent().getNetworkInfo(); - const defaultTokenInfo = props.stores.tokenInfoStore.getDefaultTokenInfoSummary( - network.NetworkId - ); - const getTokenInfoBatch: Array => { [string]: Promise } = ids => - props.stores.tokenInfoStore.fetchMissingAndGetLocalOrRemoteMetadata(network, ids); - const getTokenInfo: string => Promise = id => - getTokenInfoBatch([id])[id].then(res => res ?? {}); - const disclaimerFlag = props.stores.substores.ada.swapStore.swapDisclaimerAcceptanceFlag; useEffect(() => { @@ -190,7 +214,7 @@ function SwapPage(props: StoresAndActionsProps): Node { function processBackToStart() { runInAction(() => { setOrderStepValue(0); - userPasswordState.update(''); + userPasswordState?.update(''); txSubmitErrorState.update(null); setSignRequest(null); }); @@ -234,7 +258,7 @@ function SwapPage(props: StoresAndActionsProps): Node { validateSignRequestAndUserPassword(); setOpenedDialog('loadingOverlay'); - const password = userPasswordState.value; + const password = userPasswordState?.value; try { await props.stores.substores.ada.wallets.adaSendAndRefresh({ @@ -260,9 +284,10 @@ function SwapPage(props: StoresAndActionsProps): Node { if (signRequest == null) { throw new Error('Incorrect state! Order transaction is not prepared properly'); } - const password = userPasswordState.value; - if (password === '') { - throw new Error('Incorrect state! User password is required'); + if (!isHardwareWallet) { + if (userPasswordState.value === '') { + throw new Error('Incorrect state! User password is required'); + } } } @@ -320,6 +345,17 @@ function SwapPage(props: StoresAndActionsProps): Node { }); }; + function confirmationButtonMessage() { + if (walletType === 'ledger') return messages.sendUsingLedgerNano; + if (walletType === 'trezor') return messages.sendUsingTrezorT; + return globalMessages.confirm; + } + + function intl(msg): string { + // noinspection JSUnresolvedFunction + return props.intl.formatMessage(msg); + } + return ( <> @@ -387,7 +423,7 @@ function SwapPage(props: StoresAndActionsProps): Node { variant="primary" disabled={!isSwapEnabled || isButtonLoader} > - {(isButtonLoader && ) || (orderStep === 0 ? 'Swap' : 'Confirm')} + {(isButtonLoader && ) || (orderStep === 0 ? 'Swap' : intl(confirmationButtonMessage()))} )} @@ -427,4 +463,4 @@ function SwapPage(props: StoresAndActionsProps): Node { ); } -export default (observer(SwapPage): React$ComponentType); +export default (injectIntl(observer(SwapPage)): React$ComponentType); From f3867cb61818bc217171e8c94d9c1a979129aa2b Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Wed, 26 Jun 2024 17:31:28 +0300 Subject: [PATCH 02/20] keep original witness set after signing from ledger --- packages/yoroi-extension/app/api/ada/index.js | 2 -- .../api/ada/transactions/shelley/ledgerTx.js | 12 +++++++--- .../ada/transactions/shelley/ledgerTx.test.js | 2 +- .../containers/swap/asset-swap/SwapPage.js | 22 +++++++++---------- .../app/stores/ada/send/LedgerSendStore.js | 6 ++--- 5 files changed, 23 insertions(+), 21 deletions(-) diff --git a/packages/yoroi-extension/app/api/ada/index.js b/packages/yoroi-extension/app/api/ada/index.js index df1d832b06..0ad037897b 100644 --- a/packages/yoroi-extension/app/api/ada/index.js +++ b/packages/yoroi-extension/app/api/ada/index.js @@ -1655,8 +1655,6 @@ export default class AdaApi { neededHashes: new Set(), wits: new Set(), }, - trezorTCatalystRegistrationTxSignData: undefined, - ledgerNanoCatalystRegistrationTxSignData: undefined, }); } catch (error) { Logger.error(`${nameof(AdaApi)}::${nameof(this.createSimpleTx)} error: ` + stringifyError(error)); diff --git a/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js b/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js index abd381b30e..4241a83ba0 100644 --- a/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js +++ b/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js @@ -41,6 +41,7 @@ import { } from '../../../../config/numbersConfig'; import cbor from 'cbor'; import { derivePublicByAddressing } from '../../lib/cardanoCrypto/deriveByAddressing'; +import { mergeWitnessSets } from '../utils'; // ==================== LEDGER ==================== // /** Generate a payload for Ledger SignTx */ @@ -502,7 +503,7 @@ export function toLedgerAddressParameters(request: {| } export function buildSignedTransaction( - txBody: RustModule.WalletV4.TransactionBody, + tx: RustModule.WalletV4.Transaction, senderUtxos: Array, witnesses: Array, publicKey: {| @@ -622,10 +623,15 @@ export function buildSignedTransaction( } witSet.set_vkeys(vkeyWitWasm); } + + const mergedWitnessSet = RustModule.WalletV4.TransactionWitnessSet.from_hex( + mergeWitnessSets(tx.witness_set().to_hex(), witSet.to_hex()) + ); + // TODO: handle script witnesses return RustModule.WalletV4.Transaction.new( - txBody, - witSet, + tx.body(), + mergedWitnessSet, metadata ); } diff --git a/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.test.js b/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.test.js index 6329ea8328..9dc5f89ffd 100644 --- a/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.test.js +++ b/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.test.js @@ -437,7 +437,7 @@ test('Create Ledger transaction', async () => { }: SignTransactionRequest)); buildSignedTransaction( - txBuilder.build(), + txBuilder.build_tx(), signRequest.senderUtxos, [ // this witnesses doesn't belong to the transaction / key. Just used to test wit generation diff --git a/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js b/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js index 9056e2a810..9b852b7c05 100644 --- a/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js +++ b/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js @@ -117,7 +117,7 @@ function SwapPage(props: StoresAndActionsProps & Intl): Node { && isValidTickers; const confirmationCanContinue = - (isHardwareWallet || userPasswordState.value !== '') + (isHardwareWallet || userPasswordState?.value !== '') && signRequest != null; const isButtonLoader = orderStep === 1 && signRequest == null; @@ -260,17 +260,15 @@ function SwapPage(props: StoresAndActionsProps & Intl): Node { setOpenedDialog('loadingOverlay'); const password = userPasswordState?.value; + const baseBroadcastRequest = { publicDeriver: wallet, signRequest }; + const broadcastRequest = isHardwareWallet + ? { [walletType]: baseBroadcastRequest } + : { normal: { ...baseBroadcastRequest, password }, + }; try { - await props.stores.substores.ada.wallets.adaSendAndRefresh({ - broadcastRequest: { - normal: { - publicDeriver: wallet, - password, - signRequest, - }, - }, - refreshWallet: () => props.stores.wallets.refreshWalletFromRemote(wallet), - }); + const refreshWallet = () => props.stores.wallets.refreshWalletFromRemote(wallet); + // $FlowIgnore[incompatible-call] + await props.stores.substores.ada.wallets.adaSendAndRefresh({ broadcastRequest, refreshWallet }); setOrderStepValue(2); resetSwapForm(); } catch (e) { @@ -285,7 +283,7 @@ function SwapPage(props: StoresAndActionsProps & Intl): Node { throw new Error('Incorrect state! Order transaction is not prepared properly'); } if (!isHardwareWallet) { - if (userPasswordState.value === '') { + if (userPasswordState?.value === '') { throw new Error('Incorrect state! User password is required'); } } diff --git a/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js b/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js index e9f7f0e997..52edde71b2 100644 --- a/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js +++ b/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js @@ -285,10 +285,10 @@ export default class LedgerSendStore extends Store { request.signRequest.self().set_auxiliary_data(metadata); } - const txBody = request.signRequest.self().build(); - const txId = Buffer.from(RustModule.WalletV4.hash_transaction(txBody).to_bytes()).toString('hex'); + const tx = request.signRequest.self().build_tx(); + const txId = Buffer.from(RustModule.WalletV4.hash_transaction(tx.body()).to_bytes()).toString('hex'); const signedTx = buildSignedTransaction( - txBody, + tx, request.signRequest.senderUtxos, ledgerSignTxResp.witnesses, request.publicKey, From 52bd07eeb65c1ce0dfe5ae8dc5999f395fe6ad70 Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Tue, 17 Sep 2024 16:21:26 +0300 Subject: [PATCH 03/20] post-merge fixes --- .../app/containers/swap/asset-swap/SwapPage.js | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js b/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js index 808747448f..4b7db19fbd 100644 --- a/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js +++ b/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js @@ -72,9 +72,9 @@ function SwapPage(props: StoresAndActionsProps & Intl): Node { const { sellTokenInfo, buyTokenInfo, resetSwapForm, sellQuantity, buyQuantity } = useSwapForm(); const wallet = props.stores.wallets.selectedOrFail; - const walletType: string = wallet.getParent().getWalletVariant(); - const isHardwareWallet = walletType !== 'web'; - const network = wallet.getParent().getNetworkInfo(); + const walletType: string = wallet.type; + const isHardwareWallet = wallet.isHardware; + const network = getNetworkById(wallet.networkId); const defaultTokenInfo = props.stores.tokenInfoStore.getDefaultTokenInfoSummary( network.NetworkId ); @@ -120,15 +120,6 @@ function SwapPage(props: StoresAndActionsProps & Intl): Node { const isSwapEnabled = (orderStep === 0 && swapFormCanContinue) || (orderStep === 1 && confirmationCanContinue); - const wallet = props.stores.wallets.selectedOrFail; - const network = getNetworkById(wallet.networkId); - const defaultTokenInfo = props.stores.tokenInfoStore.getDefaultTokenInfoSummary( - network.NetworkId - ); - const getTokenInfoBatch: (Array) => { [string]: Promise } = ids => - props.stores.tokenInfoStore.fetchMissingAndGetLocalOrRemoteMetadata(network, ids); - const getTokenInfo: string => Promise = id => getTokenInfoBatch([id])[id].then(res => res ?? {}); - const disclaimerFlag = props.stores.substores.ada.swapStore.swapDisclaimerAcceptanceFlag; useEffect(() => { @@ -258,7 +249,7 @@ function SwapPage(props: StoresAndActionsProps & Intl): Node { setOpenedDialog('loadingOverlay'); const password = userPasswordState?.value; - const baseBroadcastRequest = { publicDeriver: wallet, signRequest }; + const baseBroadcastRequest = { wallet, signRequest }; const broadcastRequest = isHardwareWallet ? { [walletType]: baseBroadcastRequest } : { normal: { ...baseBroadcastRequest, password }, From dd9cb3bbdffd78286f570e11a6193e73161799f5 Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Tue, 17 Sep 2024 20:05:53 +0300 Subject: [PATCH 04/20] ledger swap order fixes --- .../api/ada/transactions/shelley/ledgerTx.js | 22 ++++++++++++------- packages/yoroi-extension/app/api/thunk.js | 2 +- .../containers/swap/asset-swap/SwapPage.js | 4 +--- .../app/stores/ada/send/LedgerSendStore.js | 6 +++-- .../app/stores/toplevel/WalletStore.js | 6 ++--- 5 files changed, 23 insertions(+), 17 deletions(-) diff --git a/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js b/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js index 74c7aa1cf2..6f918e94f7 100644 --- a/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js +++ b/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js @@ -94,8 +94,6 @@ export async function createLedgerSignTxPayload(request: {| )); } - const ttl = txBody.ttl(); - let auxiliaryData = undefined; if (request.signRequest.ledgerNanoCatalystRegistrationTxSignData) { const { votingPublicKey, stakingKeyPath, nonce, paymentKeyPath, } = @@ -165,7 +163,8 @@ export async function createLedgerSignTxPayload(request: {| tx: { inputs: ledgerInputs, outputs: ledgerOutputs, - ttl: ttl === undefined ? ttl : ttl.toString(), + ttl: txBody.ttl_bignum()?.to_str() ?? null, + validityIntervalStart: txBody.validity_start_interval_bignum()?.to_str() ?? null, fee: txBody.fee().to_str(), network: { networkId: request.networkId, @@ -174,9 +173,12 @@ export async function createLedgerSignTxPayload(request: {| withdrawals: ledgerWithdrawal.length === 0 ? null : ledgerWithdrawal, certificates: ledgerCertificates.length === 0 ? null : ledgerCertificates, auxiliaryData, - validityIntervalStart: undefined, + scriptDataHashHex: txBody.script_data_hash()?.to_hex() ?? null, }, additionalWitnessPaths: [], + options: { + tagCborSets: false, + } }; } @@ -275,10 +277,13 @@ function _transformToLedgerOutputs(request: {| |}): Array { const result = []; + // support post-alonzo map + for (let i = 0; i < request.txOutputs.len(); i++) { const output = request.txOutputs.get(i); const address = output.address(); const jsAddr = toHexOrBase58(output.address()); + const datumHashHex = output.data_hash()?.to_hex() ?? null; const changeAddr = request.changeAddrs.find(change => jsAddr === change.address); if (changeAddr != null) { @@ -296,6 +301,7 @@ function _transformToLedgerOutputs(request: {| type: TxOutputDestinationType.DEVICE_OWNED, params: addressParams, }, + datumHashHex, }); } else { result.push({ @@ -306,7 +312,8 @@ function _transformToLedgerOutputs(request: {| params: { addressHex: Buffer.from(address.to_bytes()).toString('hex'), }, - } + }, + datumHashHex, }); } } @@ -785,7 +792,6 @@ export function buildSignedTransaction( mergeWitnessSets(tx.witness_set().to_hex(), witSet.to_hex()) ); - // TODO: handle script witnesses return RustModule.WalletV4.Transaction.new( tx.body(), mergedWitnessSet, @@ -1120,11 +1126,11 @@ export function toLedgerSignRequest( inputs: formatInputs(txBody.inputs()), outputs, fee: txBody.fee().to_str(), - ttl: txBody.ttl(), + ttl: txBody.ttl_bignum()?.to_str() ?? null, + validityIntervalStart: txBody.validity_start_interval_bignum()?.to_str() ?? null, certificates: formattedCertificates, withdrawals: formattedWithdrawals, auxiliaryData: formattedAuxiliaryData, - validityIntervalStart: txBody.validity_start_interval_bignum()?.to_str() ?? null, mint: JSON.parse(txBody.mint()?.to_json() ?? 'null')?.map( ([policyIdHex, assets]) => ({ policyIdHex, diff --git a/packages/yoroi-extension/app/api/thunk.js b/packages/yoroi-extension/app/api/thunk.js index 90eb680152..b0ed4476a3 100644 --- a/packages/yoroi-extension/app/api/thunk.js +++ b/packages/yoroi-extension/app/api/thunk.js @@ -227,7 +227,7 @@ export async function signAndBroadcastTransaction( export async function broadcastTransaction(request: BroadcastTransactionRequestType): Promise { const result = await callBackground({ type: BroadcastTransaction.typeTag, request }); - if (result.error) { + if (result?.error) { throw new Error(result.error); } return result; diff --git a/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js b/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js index 4b7db19fbd..d520c31996 100644 --- a/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js +++ b/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js @@ -282,9 +282,7 @@ function SwapPage(props: StoresAndActionsProps & Intl): Node { const isPasswordError = e instanceof IncorrectWalletPasswordError; runInAction(() => { txSubmitErrorState.update(e); - if (!isPasswordError) { - setOrderStepValue(1); - } + setOrderStepValue(isPasswordError ? 1 : 2); }); if (!isPasswordError) { console.error('Failed to submit swap tx', e); diff --git a/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js b/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js index f26aabd23c..4dde830c9f 100644 --- a/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js +++ b/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js @@ -44,6 +44,7 @@ import { } from '../../../api/ada/lib/cardanoCrypto/catalyst'; import { getNetworkById } from '../../../api/ada/lib/storage/database/prepackaged/networks.js'; import { broadcastTransaction } from '../../../api/thunk'; +import { transactionHexToHash } from '../../../api/ada/lib/cardanoCrypto/utils'; /** Note: Handles Ledger Signing */ export default class LedgerSendStore extends Store { @@ -218,6 +219,9 @@ export default class LedgerSendStore extends Store { const network = getNetworkById(request.networkId); + const tx = request.signRequest.self().build_tx(); + const txId = transactionHexToHash(tx.to_hex()); + const { ledgerSignTxPayload } = await this.api.ada.createLedgerSignTxData({ signRequest: request.signRequest, network, @@ -292,8 +296,6 @@ export default class LedgerSendStore extends Store { request.signRequest.self().set_auxiliary_data(metadata); } - const tx = request.signRequest.self().build_tx(); - const txId = Buffer.from(RustModule.WalletV4.hash_transaction(tx.body()).to_bytes()).toString('hex'); const signedTx = buildSignedTransaction( tx, request.signRequest.senderUtxos, diff --git a/packages/yoroi-extension/app/stores/toplevel/WalletStore.js b/packages/yoroi-extension/app/stores/toplevel/WalletStore.js index 8d106ef370..747ca142c9 100644 --- a/packages/yoroi-extension/app/stores/toplevel/WalletStore.js +++ b/packages/yoroi-extension/app/stores/toplevel/WalletStore.js @@ -372,7 +372,7 @@ export default class WalletStore extends Store { refreshWallet: () => Promise, |}) => Promise<{| txId: string |}> = async request => { this.sendMoneyRequest.reset(); - const tx = await this.sendMoneyRequest.execute(async () => { + const resp = await this.sendMoneyRequest.execute(async () => { const result = await request.broadcastRequest(); if (request.publicDeriverId != null) { @@ -405,8 +405,8 @@ export default class WalletStore extends Store { } return result; }).promise; - if (tx == null) throw new Error(`Should never happen`); - return tx; + if (resp == null) throw new Error(`Should never happen`); + return resp; }; isInitialSyncing: (number) => boolean = (publicDeriverId) => { From 671888f8b49bdd8bcc482f989783b68e5282f20c Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Sat, 28 Sep 2024 17:20:44 +0300 Subject: [PATCH 05/20] trezor updates --- .../api/ada/transactions/shelley/trezorTx.js | 36 +++++++++++++------ .../swap/asset-swap/ConfirmSwapTransaction.js | 2 +- .../app/stores/ada/send/TrezorSendStore.js | 21 ++++------- 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.js b/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.js index b29eba49b5..27e0e97149 100644 --- a/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.js +++ b/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.js @@ -14,7 +14,7 @@ import type { CardanoAssetGroup, CardanoToken, CardanoSignedTxWitness, -} from 'trezor-connect-flow'; +} from 'trezor-connect-flow/index'; import { CardanoCertificateType, CardanoAddressType, @@ -40,6 +40,8 @@ import { toHexOrBase58 } from '../../lib/storage/bridge/utils'; import blake2b from 'blake2b'; import cbor from 'cbor'; import { derivePublicByAddressing } from '../../lib/cardanoCrypto/deriveByAddressing'; +import { maybe } from '../../../../coreUtils'; +import { mergeWitnessSets } from '../utils'; // ==================== TREZOR ==================== // /** Generate a payload for Trezor SignTx */ @@ -84,7 +86,9 @@ export async function createTrezorSignTxPayload( inputs: trezorInputs, outputs: trezorOutputs, fee: txBody.fee().to_str(), - ttl: txBody.ttl()?.toString(), + ttl: txBody.ttl_bignum()?.to_str(), + validityIntervalStart: txBody.validity_start_interval_bignum()?.to_str(), + scriptDataHash: txBody.script_data_hash()?.to_hex(), protocolMagic: byronNetworkMagic, networkId, }; @@ -273,7 +277,10 @@ function _generateTrezorOutputs( const address = output.address(); const jsAddr = toHexOrBase58(output.address()); + // support post-alonzo map + const tokenBundle = toTrezorTokenBundle(output.amount().multiasset()); + const dataHash = maybe(output.data_hash()?.to_hex(), datumHash => ({ datumHash })) ?? {}; const changeAddr = changeAddrs.find(change => jsAddr === change.address); if (changeAddr != null) { @@ -286,7 +293,8 @@ function _generateTrezorOutputs( stakingPath: stakingKeyPath, }, amount: output.amount().coin().to_str(), - ...tokenBundle + ...tokenBundle, + ...dataHash, }); } else if (RustModule.WalletV4.ByronAddress.from_address(address)) { result.push({ @@ -295,6 +303,7 @@ function _generateTrezorOutputs( path: changeAddr.addressing.path, }, amount: output.amount().coin().to_str(), + ...dataHash, }); } else { throw new Error('unexpected change address type'); @@ -307,6 +316,7 @@ function _generateTrezorOutputs( : byronWasm.to_base58(), amount: output.amount().coin().to_str(), ...tokenBundle, + ...dataHash, }); } } @@ -380,7 +390,7 @@ export function toTrezorAddressParameters( } export function buildSignedTransaction( - txBody: RustModule.WalletV4.TransactionBody, + tx: RustModule.WalletV4.Transaction, senderUtxos: Array, witnesses: Array, publicKey: {| @@ -493,10 +503,14 @@ export function buildSignedTransaction( } witSet.set_vkeys(vkeyWitWasm); } - // TODO: handle script witnesses + + const mergedWitnessSet = RustModule.WalletV4.TransactionWitnessSet.from_hex( + mergeWitnessSets(tx.witness_set().to_hex(), witSet.to_hex()), + ); + return RustModule.WalletV4.Transaction.new( - txBody, - witSet, + tx.body(), + mergedWitnessSet, metadata ); } @@ -803,7 +817,6 @@ export function toTrezorSignRequest( formattedCollateral = formatInputs(collateral); } - const validityIntervalStart = txBody.validity_start_interval_bignum()?.to_str() ?? null; // temp workaround for buggy Mint.to_js_value() const formattedMint = JSON.parse(txBody.mint()?.to_json() ?? 'null')?.map(([policyId, assets]) => ({ policyId, @@ -824,8 +837,11 @@ export function toTrezorSignRequest( includeNetworkId: txBody.network_id() != null, }; - if (txBody.ttl()) { - result.ttl = String(txBody.ttl()); + const ttl = txBody.ttl_bignum()?.to_str(); + const validityIntervalStart = txBody.validity_start_interval_bignum()?.to_str(); + + if (ttl) { + result.ttl = ttl; } if (validityIntervalStart) { result.validityIntervalStart = validityIntervalStart; diff --git a/packages/yoroi-extension/app/containers/swap/asset-swap/ConfirmSwapTransaction.js b/packages/yoroi-extension/app/containers/swap/asset-swap/ConfirmSwapTransaction.js index a1d504fd58..9ae4a20a9f 100644 --- a/packages/yoroi-extension/app/containers/swap/asset-swap/ConfirmSwapTransaction.js +++ b/packages/yoroi-extension/app/containers/swap/asset-swap/ConfirmSwapTransaction.js @@ -219,7 +219,7 @@ export default function ConfirmSwapTransaction({ /> )} - + ); } diff --git a/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js b/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js index 37a8ca2a5b..e73d8e6268 100644 --- a/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js +++ b/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js @@ -1,19 +1,12 @@ // @flow -import { action, observable } from 'mobx'; +import { action, observable } from 'mobx'; import Store from '../../base/Store'; import { wrapWithFrame } from '../../lib/TrezorWrapper'; -import type { - SendUsingTrezorParams -} from '../../../actions/ada/trezor-send-actions'; -import { - Logger, - stringifyError, -} from '../../../utils/logging'; -import { - convertToLocalizableError -} from '../../../domain/TrezorLocalizedError'; +import type { SendUsingTrezorParams } from '../../../actions/ada/trezor-send-actions'; +import { Logger, stringifyError, } from '../../../utils/logging'; +import { convertToLocalizableError } from '../../../domain/TrezorLocalizedError'; import LocalizableError from '../../../i18n/LocalizableError'; import { ROUTES } from '../../../routes-config'; import { HaskellShelleyTxSignRequest } from '../../../api/ada/transactions/shelley/HaskellShelleyTxSignRequest'; @@ -201,10 +194,10 @@ export default class TrezorSendStore extends Store { request.params.signRequest.self().set_auxiliary_data(metadata); } - const txBody = request.params.signRequest.self().build(); + const tx = request.params.signRequest.self().build_tx(); const signedTx = buildSignedTransaction( - txBody, + tx, request.params.signRequest.senderUtxos, trezorSignTxResp.payload.witnesses, publicKeyInfo, @@ -213,7 +206,7 @@ export default class TrezorSendStore extends Store { ); const txId = Buffer.from( - RustModule.WalletV4.hash_transaction(txBody).to_bytes() + RustModule.WalletV4.hash_transaction(tx.body()).to_bytes() ).toString('hex'); await broadcastTransaction({ From b8df82f6f64dd7938ef2d74cb02f93899cf3368f Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Sat, 28 Sep 2024 17:46:27 +0300 Subject: [PATCH 06/20] trezor lib update --- packages/yoroi-extension/package-lock.json | 894 +++++++++++++++++---- packages/yoroi-extension/package.json | 2 +- 2 files changed, 748 insertions(+), 148 deletions(-) diff --git a/packages/yoroi-extension/package-lock.json b/packages/yoroi-extension/package-lock.json index e9f9d11776..d537d49f35 100644 --- a/packages/yoroi-extension/package-lock.json +++ b/packages/yoroi-extension/package-lock.json @@ -86,7 +86,7 @@ "semver": "7.6.0", "stream-browserify": "3.0.0", "tinycolor2": "1.4.2", - "trezor-connect-flow": "Emurgo/trezor-connect-flow#92d6d8c8faef25c0ea1d481aa1ecb4ba77ce539c", + "trezor-connect-flow": "Emurgo/trezor-connect-flow#9f8ae584593a5e0f302fd4dd3b0968ccf6f73513", "ts-loader": "^9.5.1", "typescript": "^5.4.5", "ua-parser-js": "1.0.37", @@ -2806,6 +2806,70 @@ "node": ">=8" } }, + "node_modules/@ethereumjs/common": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-4.4.0.tgz", + "integrity": "sha512-Fy5hMqF6GsE6DpYTyqdDIJPJgUtDn4dL120zKw+Pswuo+iLyBsEYuSyzMw6NVzD2vDzcBG9fE4+qX4X2bPc97w==", + "dependencies": { + "@ethereumjs/util": "^9.1.0" + } + }, + "node_modules/@ethereumjs/rlp": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz", + "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", + "bin": { + "rlp": "bin/rlp.cjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ethereumjs/tx": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-5.4.0.tgz", + "integrity": "sha512-SCHnK7m/AouZ7nyoR0MEXw1OO/tQojSbp88t8oxhwes5iZkZCtfFdUrJaiIb72qIpH2FVw6s1k1uP7LXuH7PsA==", + "dependencies": { + "@ethereumjs/common": "^4.4.0", + "@ethereumjs/rlp": "^5.0.2", + "@ethereumjs/util": "^9.1.0", + "ethereum-cryptography": "^2.2.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ethereumjs/util": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-9.1.0.tgz", + "integrity": "sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==", + "dependencies": { + "@ethereumjs/rlp": "^5.0.2", + "ethereum-cryptography": "^2.2.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@fivebinaries/coin-selection": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@fivebinaries/coin-selection/-/coin-selection-2.2.1.tgz", + "integrity": "sha512-iYFsYr7RY7TEvTqP9NKR4p/yf3Iybf9abUDR7lRjzanGsrLwVsREvIuyE05iRYFrvqarlk+gWRPsdR1N2hUBrg==", + "dependencies": { + "@emurgo/cardano-serialization-lib-browser": "^11.5.0", + "@emurgo/cardano-serialization-lib-nodejs": "11.5.0" + } + }, + "node_modules/@fivebinaries/coin-selection/node_modules/@emurgo/cardano-serialization-lib-browser": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-browser/-/cardano-serialization-lib-browser-11.5.0.tgz", + "integrity": "sha512-qchOJ9NYDUz10tzs5r5QhP9hK0p+ZOlRiBwPdTAxqAYLw/8emYBkQQLaS8T1DF6EkeudyrgS00ym5Trw1fo4iA==" + }, + "node_modules/@fivebinaries/coin-selection/node_modules/@emurgo/cardano-serialization-lib-nodejs": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-11.5.0.tgz", + "integrity": "sha512-IlVABlRgo9XaTR1NunwZpWcxnfEv04ba2l1vkUz4S1W7Jt36F4CtffP+jPeqBZGnAe+fnUwo0XjIJC3ZTNToNQ==" + }, "node_modules/@floating-ui/core": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", @@ -3902,6 +3966,14 @@ "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "dev": true }, + "node_modules/@mobily/ts-belt": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@mobily/ts-belt/-/ts-belt-3.13.1.tgz", + "integrity": "sha512-K5KqIhPI/EoCTbA6CGbrenM9s41OouyK8A03fGJJcla/zKucsgLbz8HNbeseoLarRPgyWJsUyCYqFhI7t3Ra9Q==", + "engines": { + "node": ">= 10.*" + } + }, "node_modules/@mui/base": { "version": "5.0.0-beta.40", "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", @@ -4356,6 +4428,31 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, + "node_modules/@noble/curves": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", + "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", + "dependencies": { + "@noble/hashes": "1.5.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", + "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@noble/hashes": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", @@ -5709,6 +5806,42 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@sentry/core": { "version": "6.19.7", "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.7.tgz", @@ -5800,6 +5933,11 @@ "integrity": "sha512-sBSO19KzdrJCM3gdx6eIxV8M9Gxfgg6iDQmH5TIAGaUu+X9VDdsINXJOnoiZ1Kx3TrHdH4bt5UVglkjsEGBcvw==", "dev": true }, + "node_modules/@sinclair/typebox": { + "version": "0.31.28", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.31.28.tgz", + "integrity": "sha512-/s55Jujywdw/Jpan+vsy6JZs1z2ZTGxTmbZTPiuSL2wz9mfzA2gN1zzaqmvfi4pq+uOt7Du85fkiwv5ymW84aQ==" + }, "node_modules/@sindresorhus/is": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz", @@ -5830,6 +5968,55 @@ "@sinonjs/commons": "^1.7.0" } }, + "node_modules/@solana/buffer-layout": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", + "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", + "dependencies": { + "buffer": "~6.0.3" + }, + "engines": { + "node": ">=5.10" + } + }, + "node_modules/@solana/web3.js": { + "version": "1.95.3", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.95.3.tgz", + "integrity": "sha512-O6rPUN0w2fkNqx/Z3QJMB9L225Ex10PRDH8bTaIUPZXMPV0QP8ZpPvjQnXK+upUczlRgzHzd6SjKIha1p+I6og==", + "dependencies": { + "@babel/runtime": "^7.25.0", + "@noble/curves": "^1.4.2", + "@noble/hashes": "^1.4.0", + "@solana/buffer-layout": "^4.0.1", + "agentkeepalive": "^4.5.0", + "bigint-buffer": "^1.1.5", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.1", + "node-fetch": "^2.7.0", + "rpc-websockets": "^9.0.2", + "superstruct": "^2.0.2" + } + }, + "node_modules/@solana/web3.js/node_modules/@babel/runtime": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@solana/web3.js/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", @@ -6037,6 +6224,19 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@swc/helpers": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", + "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@swc/helpers/node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", @@ -6059,43 +6259,77 @@ } }, "node_modules/@trezor/analytics": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.0.5.tgz", - "integrity": "sha512-XpgAsQDi8uZ+PmfCS6KUn+frUqR1ckOY9NdeC0PMGmkTzWm47oatvoyLSy2umd30T9M4h1LJECBqA80XpEV5MA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.2.0.tgz", + "integrity": "sha512-q3lJtHL0tXDEbjl/pENpmUVzVcTd9NW4G2gskY2OKLsUykWP0pqN+9YX41C/f2TvMePVEA67kzXTm9US2sB2eA==", "dependencies": { - "@trezor/env-utils": "1.0.4", - "@trezor/utils": "9.0.11" + "@trezor/env-utils": "1.2.0", + "@trezor/utils": "9.2.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" } }, "node_modules/@trezor/blockchain-link": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.1.15.tgz", - "integrity": "sha512-Y7QsggFUGk84yKY06eSuS3oTNwH+chz0fuCWMs7aKr4TxXsxILNwzoYg7Erecf+WZuydAdmjZRDT4QbmMUc65g==", - "dependencies": { - "@trezor/blockchain-link-types": "1.0.4", - "@trezor/blockchain-link-utils": "1.0.5", - "@trezor/utils": "9.0.11", - "@trezor/utxo-lib": "1.0.9", - "@types/web": "^0.0.100", - "bignumber.js": "^9.1.1", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.3.0.tgz", + "integrity": "sha512-kuDHXIVhiTzpCmqoCH3zzCtM2BK+MEIvlj+GpA9VHPQbMGM55YU6c7M2jtq3vbw1XdtyvmvTD/s7Y8/WZR+IMg==", + "dependencies": { + "@solana/buffer-layout": "^4.0.1", + "@solana/web3.js": "^1.95.0", + "@trezor/blockchain-link-types": "1.2.0", + "@trezor/blockchain-link-utils": "1.2.0", + "@trezor/utils": "9.2.0", + "@trezor/utxo-lib": "2.2.0", + "@types/web": "^0.0.138", "events": "^3.3.0", "ripple-lib": "^1.10.1", "socks-proxy-agent": "6.1.1", - "ws": "7.5.9" + "ws": "^8.18.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" } }, "node_modules/@trezor/blockchain-link-types": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.0.4.tgz", - "integrity": "sha512-EBX8Fi38mqIRStOQsUNbma1RwEP57B104N77p1CPHML3Kxu6M0DVcTulFKJKAJ6laQyfULzTeUYfEdn//dCcFA==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.2.0.tgz", + "integrity": "sha512-MCukIR4R6IuzAS4I51j9r0KRYXGBNzqMAPh0Fc9gerWvEC9rNrcsbYYDJy/7wYsiAxHRVYiqUyq9yTjUzUkdUA==", + "dependencies": { + "@solana/web3.js": "^1.95.0", + "@trezor/type-utils": "1.1.0", + "@trezor/utxo-lib": "2.2.0", + "socks-proxy-agent": "6.1.1" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/blockchain-link-types/node_modules/socks-proxy-agent": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", + "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.1", + "socks": "^2.6.1" + }, + "engines": { + "node": ">= 10" + } }, "node_modules/@trezor/blockchain-link-utils": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.0.5.tgz", - "integrity": "sha512-Kj8Zuy22ApV+FcLhMFdFVMAjbJwS4VaXndkz1OgjF7UHTb0jEJtIk5JSe5KNbvNUsyGcEAn9vZ+RogfZETOVGw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.2.0.tgz", + "integrity": "sha512-C9nMCbj5qaMvKzUXfMb1+nfPZd6StTeIBpQBFEnvHOcCl6p4Meab1HUSVJ+Dcd1Y+y0mhlWGcOw8ZvBTLIB/Pg==", "dependencies": { - "@trezor/utils": "9.0.11", - "bignumber.js": "^9.1.1" + "@mobily/ts-belt": "^3.13.1", + "@solana/web3.js": "^1.95.0", + "@trezor/env-utils": "1.2.0", + "@trezor/utils": "9.2.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" } }, "node_modules/@trezor/blockchain-link/node_modules/socks-proxy-agent": { @@ -6111,51 +6345,88 @@ "node": ">= 10" } }, + "node_modules/@trezor/blockchain-link/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@trezor/connect": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.1.1.tgz", - "integrity": "sha512-qIovN55BN5zciRiwIeEAHISjspy9jWkusBntk5z5SFmXw95KG6trms7GCodpbEuueboUS9Ts9xHorYwvqMmweg==", - "dependencies": { - "@trezor/blockchain-link": "2.1.15", - "@trezor/blockchain-link-types": "1.0.4", - "@trezor/connect-analytics": "1.0.4", - "@trezor/connect-common": "0.0.18", - "@trezor/transport": "1.1.14", - "@trezor/utils": "9.0.11", - "@trezor/utxo-lib": "1.0.9", - "bignumber.js": "^9.1.1", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.4.0.tgz", + "integrity": "sha512-gtY5coDzTEaJ/mrdXkRgpWARO/bWcEDFIuJMPjpEr27UzeTZy8loSFRA7jR3IsJXHyxJ7g8iLrd4jeuC9rdpow==", + "dependencies": { + "@babel/preset-typescript": "^7.24.7", + "@ethereumjs/common": "^4.3.0", + "@ethereumjs/tx": "^5.3.0", + "@fivebinaries/coin-selection": "2.2.1", + "@trezor/blockchain-link": "2.3.0", + "@trezor/blockchain-link-types": "1.2.0", + "@trezor/connect-analytics": "1.2.0", + "@trezor/connect-common": "0.2.0", + "@trezor/protobuf": "1.2.0", + "@trezor/protocol": "1.2.0", + "@trezor/schema-utils": "1.2.0", + "@trezor/transport": "1.3.0", + "@trezor/utils": "9.2.0", + "@trezor/utxo-lib": "2.2.0", "blakejs": "^1.2.1", "bs58": "^5.0.0", "bs58check": "^3.0.1", - "cross-fetch": "^3.1.6", - "events": "^3.3.0", - "randombytes": "2.1.0" + "cross-fetch": "^4.0.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" } }, "node_modules/@trezor/connect-analytics": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@trezor/connect-analytics/-/connect-analytics-1.0.4.tgz", - "integrity": "sha512-GLD5CCh6hcXsovxM2Fyns25GbGRCJ3lgFhWQ9WyqkFveI41cwMGCJZuXSyGSWCeMpazOYdvpgyXMqc22J2tatg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@trezor/connect-analytics/-/connect-analytics-1.2.0.tgz", + "integrity": "sha512-tgbxoHQN8TUMjZ9k2XgIya3+nYcQFG+eUKNHzBe6zN2vyXuWF93jAph4uC42L+8YbYYya080BwCXjq0YfGZQgA==", "dependencies": { - "@trezor/analytics": "1.0.5" + "@trezor/analytics": "1.2.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" } }, "node_modules/@trezor/connect-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.0.18.tgz", - "integrity": "sha512-tFian3z2ce/gQpjtFddr5NCKeJEEpV/t+Srb0Sa/STXqY/mTaADzti1aqp+/w4bL+1E2NNdAmCtsCl5AZc4a+A==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.2.0.tgz", + "integrity": "sha512-yfLbOOBQyKoXblLGTjhArv0AxAUrxm+asOYT+WFR+SocuIxFlWLOEk80HYfowucPJ1aN0W8T/kTOPCO+x9pd+Q==", "dependencies": { - "@trezor/env-utils": "1.0.4" + "@trezor/env-utils": "1.2.0", + "@trezor/utils": "9.2.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" } }, "node_modules/@trezor/connect-web": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@trezor/connect-web/-/connect-web-9.1.1.tgz", - "integrity": "sha512-FDwdARtUAITO80bahfU5gR4NS0q85rOvtyCCtwGgbH04JpOvmmoaNgYdXwfYfPaZCd2ZxZZ4omBermVPaE/wvA==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@trezor/connect-web/-/connect-web-9.4.0.tgz", + "integrity": "sha512-y3upWE6LA7Qq2uHiTcw3IOgT4vSYfG9fxUOBmtiEpBo5A0QHH7MNDk5eTVoKJ7Hcc2A/qOCR8aA++3hOXTZGrA==", "dependencies": { - "@trezor/connect": "9.1.1", - "@trezor/utils": "9.0.11", - "events": "^3.3.0" + "@trezor/connect": "9.4.0", + "@trezor/connect-common": "0.2.0", + "@trezor/utils": "9.2.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" } }, "node_modules/@trezor/connect/node_modules/base-x": { @@ -6180,92 +6451,140 @@ "bs58": "^5.0.0" } }, + "node_modules/@trezor/connect/node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, "node_modules/@trezor/env-utils": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.0.4.tgz", - "integrity": "sha512-V9DdjpCH6hyN7AYPEIV1WR44fmgN6d3iF8DtHYNljnMFOaan167DDVq51ZpSPAnyppulIEhdK7kuLDW3KPcnpw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.2.0.tgz", + "integrity": "sha512-dbOR+PIeReZW4iooN+DQIMWloZAV92jMGOTzEdcY6NA63nCV8QUSxoNZwZtU9nVRPeJLrT6cVkVG80nZjlplow==", "dependencies": { - "ua-parser-js": "^1.0.35" + "ua-parser-js": "^1.0.37" }, "peerDependencies": { - "expo-localization": "^14.1.1", - "react-native": "0.71.8", - "react-native-config": "^1.5.0" + "expo-constants": "*", + "expo-localization": "*", + "react-native": "*", + "tslib": "^2.6.2" }, "peerDependenciesMeta": { - "expo-localization": { + "expo-constants": { "optional": true }, - "react-native": { + "expo-localization": { "optional": true }, - "react-native-config": { + "react-native": { "optional": true } } }, - "node_modules/@trezor/transport": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.1.14.tgz", - "integrity": "sha512-KRurYZonsPugKyCJFEEkDi82gjD1lwNDEaROCwQvIHcdXO2spHj1XDlIWa8dgBVrglukJmYutqCzE+RtaMeVVQ==", + "node_modules/@trezor/protobuf": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.2.0.tgz", + "integrity": "sha512-lc09F0MotgKx3W9+hPGY1f/egRgymNha6PQJTgTaXam/6yoP7MSA9obQlmvndJZymbdqLb9jbtigGuLgoxx6Bw==", "dependencies": { - "@trezor/utils": "9.0.11", - "bytebuffer": "^5.0.1", - "cross-fetch": "^3.1.6", - "json-stable-stringify": "^1.0.2", - "long": "^4.0.0", - "prettier": "2.8.8", - "protobufjs": "7.2.4", - "usb": "^2.9.0" + "@trezor/schema-utils": "1.2.0", + "protobufjs": "7.2.6" + }, + "peerDependencies": { + "tslib": "^2.6.2" } }, - "node_modules/@trezor/transport/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "node_modules/@trezor/protocol": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@trezor/protocol/-/protocol-1.2.0.tgz", + "integrity": "sha512-2dE/deXGszpnOAF1FHvx1QG8pwkwCm2UqN3lfD0mBobpvTjkLqNROuOCwDN/HApMV0f3OYoIVR6Y3mgkRfc42w==", + "peerDependencies": { + "tslib": "^2.6.2" + } }, - "node_modules/@trezor/transport/node_modules/json-stable-stringify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", - "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", + "node_modules/@trezor/schema-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@trezor/schema-utils/-/schema-utils-1.2.0.tgz", + "integrity": "sha512-LUvcNpYjrkOyThVqzMobWXl7W39apyp5tlaj0LRkCQFRvpt1q8eXynjdLb2ofJTiwrMvLLFB4NRRpD3hBqu1LQ==", "dependencies": { - "call-bind": "^1.0.5", - "isarray": "^2.0.5", - "jsonify": "^0.0.1", - "object-keys": "^1.1.1" + "@sinclair/typebox": "^0.31.28", + "ts-mixer": "^6.0.3" }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "tslib": "^2.6.2" } }, - "node_modules/@trezor/transport/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "bin": { - "prettier": "bin-prettier.js" + "node_modules/@trezor/transport": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.3.0.tgz", + "integrity": "sha512-rgUwtH63PJRoOftkLcIo4/ElkaKq/2ban4wf2y/8k7lseU4OQXl5yxBJS7dGc3rVtxSBd3QhL6TY3h9icrJUVQ==", + "dependencies": { + "@trezor/protobuf": "1.2.0", + "@trezor/protocol": "1.2.0", + "@trezor/utils": "9.2.0", + "cross-fetch": "^4.0.0", + "long": "^4.0.0", + "protobufjs": "7.2.6", + "usb": "^2.11.0" }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/transport/node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/@trezor/transport/node_modules/node-addon-api": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.1.0.tgz", + "integrity": "sha512-yBY+qqWSv3dWKGODD6OGE6GnTX7Q2r+4+DfpqxHSHh8x0B4EKP9+wVGLS6U/AM1vxSNNmUEuIV5EGhYwPpfOwQ==", "engines": { - "node": ">=10.13.0" + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/@trezor/transport/node_modules/usb": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/usb/-/usb-2.14.0.tgz", + "integrity": "sha512-I3lzVOH21BsO6qPYvx1C7Ji08lbuM0qmsEtNGAphqlhNME5cz/vExY+jIXZl+HQIRybI/sTxdyLab5tALsL69w==", + "hasInstallScript": true, + "dependencies": { + "@types/w3c-web-usb": "^1.0.6", + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.5.0" }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "engines": { + "node": ">=12.22.0 <13.0 || >=14.17.0" } }, + "node_modules/@trezor/type-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@trezor/type-utils/-/type-utils-1.1.0.tgz", + "integrity": "sha512-zoPN9ZmdYlr03WyCWEQY6xCHPfhsodENYHPcZMKObVsUlhtMh1Z7OSD/pzd/NzOPBAtSctNbldx4aFu9A88afw==" + }, "node_modules/@trezor/utils": { - "version": "9.0.11", - "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.0.11.tgz", - "integrity": "sha512-HJBgR6/VYjJX8AP/fNIcYC+gDNjP2JLfgYBrT/naupEwDQJcxfn8KgUBrR1/akm61g8CPOot/YEj4o5nXuRt/g==" + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.2.0.tgz", + "integrity": "sha512-OslmtISmVl2r5lS/BPagyaWYudT/fSiezrSaKA1aDctGKOrze1JkA7p5J1j0uUAgjf9HODCiH8+PBAVXjUZL8A==", + "dependencies": { + "bignumber.js": "^9.1.2" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } }, "node_modules/@trezor/utxo-lib": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-1.0.9.tgz", - "integrity": "sha512-ezLJzAslhW6HVTyZWpfBmrXY5/hz5XKT0FkYRS7lhnf56LwtVPUkLvLqGtDPuV8djF04meXxoRNO8jjtnQgYqA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-2.2.0.tgz", + "integrity": "sha512-Fhu+QZjOMpiipmJWdRAwbJEVk4DtwZfh7jy67vjgliWlO9p8M5Ap3XzlbZGF9+mKLrACjv/yhN63XMqTbxVcqw==", "dependencies": { - "@trezor/utils": "9.0.11", + "@trezor/utils": "9.2.0", "bchaddrjs": "^0.5.2", "bech32": "^2.0.0", "bip66": "^1.1.5", @@ -6275,14 +6594,16 @@ "bn.js": "^5.2.1", "bs58": "^5.0.0", "bs58check": "^3.0.1", - "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "int64-buffer": "^1.0.1", "pushdata-bitcoin": "^1.0.1", "tiny-secp256k1": "^1.1.6", "typeforce": "^1.18.0", "varuint-bitcoin": "^1.1.2", - "wif": "^2.0.6" + "wif": "^4.0.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" } }, "node_modules/@trezor/utxo-lib/node_modules/base-x": { @@ -6307,6 +6628,14 @@ "bs58": "^5.0.0" } }, + "node_modules/@trezor/utxo-lib/node_modules/wif": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/wif/-/wif-4.0.0.tgz", + "integrity": "sha512-kADznC+4AFJNXpT8rLhbsfI7EmAcorc5nWvAdKUchGmwXEBD3n55q0/GZ3DBmc6auAvuTSsr/utiKizuXdNYOQ==", + "dependencies": { + "bs58check": "^3.0.1" + } + }, "node_modules/@ts-nameof/common": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/@ts-nameof/common/-/common-4.2.1.tgz", @@ -6418,7 +6747,6 @@ "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -6692,9 +7020,9 @@ } }, "node_modules/@types/lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==" + "version": "4.17.9", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.9.tgz", + "integrity": "sha512-w9iWudx1XWOHW5lQRS9iKpK/XuRhnN+0T7HvdCCd802FYkT1AMTnxndJHGrNJwRoRHkslGr4S29tjm1cT7x/7w==" }, "node_modules/@types/mdast": { "version": "3.0.15", @@ -6940,15 +7268,20 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, "node_modules/@types/w3c-web-usb": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.10.tgz", "integrity": "sha512-CHgUI5kTc/QLMP8hODUHhge0D4vx+9UiAwIGiT0sTy/B2XpdX1U5rJt6JSISgr6ikRT7vxV9EVAFeYZqUnl1gQ==" }, "node_modules/@types/web": { - "version": "0.0.100", - "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.100.tgz", - "integrity": "sha512-8NDSrDsyF7qv93SQ7aNFk0NqpNb1QEC1meoEZW/+KGMHZWd0WOC2DiT9pVhS5+w5q+u9+2bkBCfUQpe9wbqiPA==" + "version": "0.0.138", + "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.138.tgz", + "integrity": "sha512-oQD74hl+cNCZdSWIupJCXZ2azTuB3MJ/mrWlgYt+v4pD7/Dr78gl5hKAdieZNf9NrAqwUez79bHtnFVSNSscWA==" }, "node_modules/@types/ws": { "version": "7.4.7", @@ -7619,7 +7952,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dev": true, "dependencies": { "humanize-ms": "^1.2.1" }, @@ -8983,6 +9315,18 @@ "node": "*" } }, + "node_modules/bigint-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz", + "integrity": "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/bignumber.js": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", @@ -9256,6 +9600,16 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "node_modules/borsh": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", + "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", + "dependencies": { + "bn.js": "^5.2.0", + "bs58": "^4.0.0", + "text-encoding-utf-8": "^1.0.2" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -9539,6 +9893,19 @@ "node": ">=0.2.0" } }, + "node_modules/bufferutil": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/byline": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", @@ -9554,25 +9921,6 @@ "integrity": "sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q==", "dev": true }, - "node_modules/bytebuffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", - "integrity": "sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ==", - "dependencies": { - "long": "~3" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/bytebuffer/node_modules/long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==", - "engines": { - "node": ">=0.6" - } - }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -11259,6 +11607,7 @@ "version": "3.1.8", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dev": true, "dependencies": { "node-fetch": "^2.6.12" } @@ -12075,6 +12424,17 @@ "node": ">= 4" } }, + "node_modules/delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -12789,6 +13149,19 @@ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", + "dependencies": { + "es6-promise": "^4.0.3" + } + }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -13451,6 +13824,28 @@ "node": ">= 0.6" } }, + "node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/ethereum-cryptography/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -13837,6 +14232,14 @@ "node": ">=8" } }, + "node_modules/eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "engines": { + "node": "> 0.1.90" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -13890,6 +14293,11 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-stable-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz", + "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==" + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -15774,7 +16182,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, "dependencies": { "ms": "^2.0.0" } @@ -16826,6 +17233,14 @@ "node": ">=0.10.0" } }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "peerDependencies": { + "ws": "*" + } + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -16946,6 +17361,69 @@ "node": ">=8" } }, + "node_modules/jayson": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.2.tgz", + "integrity": "sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==", + "dependencies": { + "@types/connect": "^3.4.33", + "@types/node": "^12.12.54", + "@types/ws": "^7.4.4", + "commander": "^2.20.3", + "delay": "^5.0.0", + "es6-promisify": "^5.0.0", + "eyes": "^0.1.8", + "isomorphic-ws": "^4.0.1", + "json-stringify-safe": "^5.0.1", + "JSONStream": "^1.3.5", + "uuid": "^8.3.2", + "ws": "^7.5.10" + }, + "bin": { + "jayson": "bin/jayson.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jayson/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, + "node_modules/jayson/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/jayson/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/jayson/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/jdenticon": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jdenticon/-/jdenticon-3.2.0.tgz", @@ -19018,6 +19496,11 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -19042,10 +19525,19 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "engines": [ + "node >= 0.2.0" + ] + }, "node_modules/jsonschema": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz", @@ -19054,6 +19546,21 @@ "node": "*" } }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -22929,9 +23436,9 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/protobufjs": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", - "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -24297,6 +24804,69 @@ "lodash": "^4.17.15" } }, + "node_modules/rpc-websockets": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-9.0.4.tgz", + "integrity": "sha512-yWZWN0M+bivtoNLnaDbtny4XchdAIF5Q4g/ZsC5UC61Ckbp0QczwO8fg44rV3uYmY4WHd+EZQbn90W1d8ojzqQ==", + "dependencies": { + "@swc/helpers": "^0.5.11", + "@types/uuid": "^8.3.4", + "@types/ws": "^8.2.2", + "buffer": "^6.0.3", + "eventemitter3": "^5.0.1", + "uuid": "^8.3.2", + "ws": "^8.5.0" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/kozjak" + }, + "optionalDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + } + }, + "node_modules/rpc-websockets/node_modules/@types/ws": { + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/rpc-websockets/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/rpc-websockets/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/rpc-websockets/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -26101,6 +26671,14 @@ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, + "node_modules/superstruct": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", + "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -26584,6 +27162,11 @@ "node": ">=8" } }, + "node_modules/text-encoding-utf-8": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", + "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==" + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -26599,8 +27182,7 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "node_modules/throwback": { "version": "4.1.0", @@ -26804,11 +27386,11 @@ }, "node_modules/trezor-connect-flow": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/Emurgo/trezor-connect-flow.git#92d6d8c8faef25c0ea1d481aa1ecb4ba77ce539c", - "integrity": "sha512-XkgQsN8AVPs8ucg2qWUUY+u2lgBJnfzzBjC7SoHAp0N5VFI5vsi5CRJ4URbaC7kTMJwoOrjQ2rNyIgFEKYwm+Q==", + "resolved": "git+ssh://git@github.com/Emurgo/trezor-connect-flow.git#9f8ae584593a5e0f302fd4dd3b0968ccf6f73513", + "integrity": "sha512-+Ngo9kAJRZAXw1awmMe5vvy8UjsghTaKiziaHdPro/0WI2Pu14tyU0hQT+esmM0KT7KRbJbpR1j1flRtHLgf0Q==", "license": "MIT", "dependencies": { - "@trezor/connect-web": "9.1.1" + "@trezor/connect-web": "9.4.0" } }, "node_modules/trim-newlines": { @@ -26932,6 +27514,11 @@ "node": ">=8" } }, + "node_modules/ts-mixer": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", + "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==" + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -27677,6 +28264,19 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", diff --git a/packages/yoroi-extension/package.json b/packages/yoroi-extension/package.json index b6d37e3748..d6961ab612 100644 --- a/packages/yoroi-extension/package.json +++ b/packages/yoroi-extension/package.json @@ -220,7 +220,7 @@ "semver": "7.6.0", "stream-browserify": "3.0.0", "tinycolor2": "1.4.2", - "trezor-connect-flow": "Emurgo/trezor-connect-flow#92d6d8c8faef25c0ea1d481aa1ecb4ba77ce539c", + "trezor-connect-flow": "Emurgo/trezor-connect-flow#9f8ae584593a5e0f302fd4dd3b0968ccf6f73513", "ts-loader": "^9.5.1", "typescript": "^5.4.5", "ua-parser-js": "1.0.37", From 1ebd42a07b7f86eb9f6a0196a596d7b6ea4a98d3 Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Sat, 28 Sep 2024 23:37:36 +0300 Subject: [PATCH 07/20] simplifying hw api --- packages/yoroi-extension/app/api/ada/index.js | 6 +++ .../api/ada/transactions/shelley/ledgerTx.js | 44 +++++++++--------- .../api/ada/transactions/shelley/trezorTx.js | 44 ++++++++---------- .../app/connector/stores/ConnectorStore.js | 45 ++++++++----------- .../background/handlers/yoroi/connector.js | 2 +- packages/yoroi-extension/package-lock.json | 20 --------- packages/yoroi-extension/package.json | 1 - 7 files changed, 64 insertions(+), 98 deletions(-) diff --git a/packages/yoroi-extension/app/api/ada/index.js b/packages/yoroi-extension/app/api/ada/index.js index 15ac0c6b46..769098ab54 100644 --- a/packages/yoroi-extension/app/api/ada/index.js +++ b/packages/yoroi-extension/app/api/ada/index.js @@ -269,6 +269,12 @@ export type CreateLedgerSignTxDataRequest = {| addressingMap: string => (void | $PropertyType), cip36: boolean, |}; +export type CreateLedgerSignTxDataRequestFromRawTx = {| + txBodyHex: string, + network: $ReadOnly, + addressingMap: string => (void | $PropertyType), + cip36: boolean, +|}; export type CreateLedgerSignTxDataResponse = {| ledgerSignTxPayload: SignTransactionRequest, |}; diff --git a/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js b/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js index 6f918e94f7..e27bf23c22 100644 --- a/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js +++ b/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js @@ -43,7 +43,6 @@ import { import { ChainDerivations, } from '../../../../config/numbersConfig'; -import cbor from 'cbor'; import { derivePublicByAddressing } from '../../lib/cardanoCrypto/deriveByAddressing'; import { forceNonNull } from '../../../../coreUtils'; import { mergeWitnessSets } from '../utils'; @@ -806,16 +805,15 @@ type AddressMap = { [addressHex: string]: Array }; // this function is more generic because above functions deal only with Yoroi // extension "send" transactions. export function toLedgerSignRequest( - txBody: RustModule.WalletV4.TransactionBody, + txBodyHex: string, networkId: number, protocolMagic: number, - ownUtxoAddressMap: AddressMap, - ownStakeAddressMap: AddressMap, + ownAddressMap: AddressMap, addressedUtxos: Array, - rawTxBody: Buffer, additionalRequiredSigners: Array = [], ): SignTransactionRequest { - const parsedCbor = cbor.decode(rawTxBody); + + const txBody = RustModule.WalletV4.TransactionBody.from_hex(txBodyHex); function formatInputs(inputs: RustModule.WalletV4.TransactionInputs): Array { const formatted = []; @@ -837,8 +835,11 @@ export function toLedgerSignRequest( function formatOutput( output: RustModule.WalletV4.TransactionOutput, - isPostAlonzoTransactionOutput: boolean, ): TxOutput { + + const isPostAlonzoTransactionOutput = + output.serialization_format() === RustModule.WalletV4.CborContainerType.Map; + const addr = output.address(); let destination; @@ -857,7 +858,7 @@ export function toLedgerSignRequest( const enterpriseAddr = RustModule.WalletV4.EnterpriseAddress.from_address(addr); if (enterpriseAddr) { - const ownAddressPath = ownUtxoAddressMap[addr.to_hex()]; + const ownAddressPath = ownAddressMap[addr.to_hex()]; if (ownAddressPath) { destination = { type: TxOutputDestinationType.DEVICE_OWNED, @@ -884,14 +885,14 @@ export function toLedgerSignRequest( networkId, baseAddr.payment_cred() ).to_address().to_hex(); - const ownPaymentPath = ownUtxoAddressMap[paymentAddress]; + const ownPaymentPath = ownAddressMap[paymentAddress]; if (ownPaymentPath) { const stake = baseAddr.stake_cred(); const stakeAddr = RustModule.WalletV4.RewardAddress.new( networkId, stake, ).to_address().to_hex(); - const ownStakePath = ownStakeAddressMap[stakeAddr]; + const ownStakePath = ownAddressMap[stakeAddr]; if (ownStakePath) { // stake address is ours destination = { @@ -992,12 +993,7 @@ export function toLedgerSignRequest( const outputs = []; for (let i = 0; i < txBody.outputs().len(); i++) { - outputs.push( - formatOutput( - txBody.outputs().get(i), - parsedCbor.get(1)[i].constructor.name === 'Map', - ) - ); + outputs.push(formatOutput(txBody.outputs().get(i))); } function getRequiredSignerHashHexes(): Array { @@ -1024,8 +1020,8 @@ export function toLedgerSignRequest( networkId, Module.WalletV4.Credential.from_keyhash(hash), ).to_address().to_hex(); - return ownUtxoAddressMap[enterpriseAddress] || - ownStakeAddressMap[stakeAddress]; + return ownAddressMap[enterpriseAddress] + || ownAddressMap[stakeAddress]; } const requiredSignerHashHexes = getRequiredSignerHashHexes(); for (const hashHex of requiredSignerHashHexes) { @@ -1052,7 +1048,7 @@ export function toLedgerSignRequest( }); function addressingMap(addr: string): void | {| +path: Array |} { - const path = ownUtxoAddressMap[addr] || ownStakeAddressMap[addr]; + const path = ownAddressMap[addr]; if (path) { return { path }; } @@ -1099,10 +1095,7 @@ export function toLedgerSignRequest( let formattedCollateralReturn = null; const collateralReturn = txBody.collateral_return(); if (collateralReturn) { - formattedCollateralReturn = formatOutput( - collateralReturn, - parsedCbor.get(16).constructor.name === 'Map', - ); + formattedCollateralReturn = formatOutput(collateralReturn); } let formattedReferenceInputs = null; @@ -1151,7 +1144,7 @@ export function toLedgerSignRequest( } export function buildConnectorSignedTransaction( - txBody: RustModule.WalletV4.TransactionBody, + txBodyHex: string, witnesses: Array, publicKey: {| ...Addressing, @@ -1159,6 +1152,9 @@ export function buildConnectorSignedTransaction( |}, metadata: RustModule.WalletV4.AuxiliaryData | void ): RustModule.WalletV4.Transaction { + + const txBody = RustModule.WalletV4.TransactionBody.from_hex(txBodyHex); + const keyLevel = publicKey.addressing.startLevel + publicKey.addressing.path.length - 1; const vkeyWitWasm = RustModule.WalletV4.Vkeywitnesses.new(); diff --git a/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.js b/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.js index 27e0e97149..17b17bcd35 100644 --- a/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.js +++ b/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.js @@ -38,7 +38,6 @@ import { RustModule } from '../../lib/cardanoCrypto/rustLoader'; import { range } from 'lodash'; import { toHexOrBase58 } from '../../lib/storage/bridge/utils'; import blake2b from 'blake2b'; -import cbor from 'cbor'; import { derivePublicByAddressing } from '../../lib/cardanoCrypto/deriveByAddressing'; import { maybe } from '../../../../coreUtils'; import { mergeWitnessSets } from '../utils'; @@ -522,15 +521,14 @@ type AddressMap = { [addressHex: string]: Array }; // this function is more generic because above functions deal only with Yoroi // extension "send" transactions. export function toTrezorSignRequest( - txBody: RustModule.WalletV4.TransactionBody, + txBodyHex: string, networkId: number, protocolMagic: number, - ownUtxoAddressMap: AddressMap, - ownStakeAddressMap: AddressMap, + ownAddressMap: AddressMap, addressedUtxos: Array, - rawTxBody: Buffer, ): $Exact { - const parsedCbor = cbor.decode(rawTxBody); + + const txBody = RustModule.WalletV4.TransactionBody.from_hex(txBodyHex); function formatInputs(inputs: RustModule.WalletV4.TransactionInputs): Array { const formatted = []; @@ -555,8 +553,11 @@ export function toTrezorSignRequest( function formatOutput( output: RustModule.WalletV4.TransactionOutput, - isPostAlonzoTransactionOutput: boolean, ): CardanoOutput { + + const isPostAlonzoTransactionOutput = + output.serialization_format() === RustModule.WalletV4.CborContainerType.Map; + const amount = output.amount().coin().to_str(); const { tokenBundle } = toTrezorTokenBundle(output.amount().multiasset()); const outputDataHash = output.data_hash(); @@ -576,7 +577,7 @@ export function toTrezorSignRequest( const enterpriseAddr = RustModule.WalletV4.EnterpriseAddress.from_address(addr); if (enterpriseAddr) { - const ownAddressPath = ownUtxoAddressMap[addr.to_bech32()]; + const ownAddressPath = ownAddressMap[addr.to_bech32()]; if (ownAddressPath) { result = ({ addressParameters: { @@ -599,14 +600,14 @@ export function toTrezorSignRequest( networkId, baseAddr.payment_cred() ).to_address().to_hex(); - const ownPaymentPath = ownUtxoAddressMap[paymentAddress]; + const ownPaymentPath = ownAddressMap[paymentAddress]; if (ownPaymentPath) { const stake = baseAddr.stake_cred(); const stakeAddr = RustModule.WalletV4.RewardAddress.new( networkId, stake, ).to_address().to_hex(); - const ownStakePath = ownStakeAddressMap[stakeAddr]; + const ownStakePath = ownAddressMap[stakeAddr]; if (ownStakePath) { // stake address is ours result = ({ @@ -686,12 +687,7 @@ export function toTrezorSignRequest( const outputs = []; for (let i = 0; i < txBody.outputs().len(); i++) { - outputs.push( - formatOutput( - txBody.outputs().get(i), - parsedCbor.get(1)[i].constructor.name === 'Map', - ) - ); + outputs.push(formatOutput(txBody.outputs().get(i))); } const formattedRequiredSigners = []; @@ -708,8 +704,8 @@ export function toTrezorSignRequest( networkId, RustModule.WalletV4.Credential.from_keyhash(hash), ).to_address().to_hex(); - const ownAddressPath = ownUtxoAddressMap[enterpriseAddress] || - ownStakeAddressMap[stakeAddress]; + const ownAddressPath = ownAddressMap[enterpriseAddress] + || ownAddressMap[stakeAddress]; if (ownAddressPath) { formattedRequiredSigners.push({ keyPath: ownAddressPath, @@ -734,7 +730,7 @@ export function toTrezorSignRequest( stakeCredential ); const addressPayload = Buffer.from(rewardAddr.to_address().to_bytes()).toString('hex'); - const addressing = ownStakeAddressMap[addressPayload]; + const addressing = ownAddressMap[addressPayload]; if (addressing == null) { throw new Error('not own address in certificate'); } @@ -789,7 +785,7 @@ export function toTrezorSignRequest( } const rewardAddressPayload = rewardAddress.to_address().to_hex(); - const path = ownStakeAddressMap[rewardAddressPayload]; + const path = ownAddressMap[rewardAddressPayload]; if (path == null) { throw new Error('foreign withdrawal reward address'); } @@ -870,10 +866,7 @@ export function toTrezorSignRequest( } const collateralReturn = txBody.collateral_return(); if (collateralReturn) { - result.collateralReturn = formatOutput( - collateralReturn, - parsedCbor.get(16).constructor.name === 'Map', - ); + result.collateralReturn = formatOutput(collateralReturn); } const totalCollateral = txBody.total_collateral(); if (totalCollateral) { @@ -899,10 +892,11 @@ export function toTrezorSignRequest( } export function buildConnectorSignedTransaction( - txBody: RustModule.WalletV4.TransactionBody, + txBodyHex: string, witnesses: Array, metadata: RustModule.WalletV4.AuxiliaryData | void, ): RustModule.WalletV4.Transaction { + const txBody = RustModule.WalletV4.TransactionBody.from_hex(txBodyHex); const vkeyWitnesses = RustModule.WalletV4.Vkeywitnesses.new(); for (const witness of witnesses) { if (witness.type === CardanoTxWitnessType.BYRON_WITNESS) { diff --git a/packages/yoroi-extension/app/connector/stores/ConnectorStore.js b/packages/yoroi-extension/app/connector/stores/ConnectorStore.js index 7858d22b7e..61caea6779 100644 --- a/packages/yoroi-extension/app/connector/stores/ConnectorStore.js +++ b/packages/yoroi-extension/app/connector/stores/ConnectorStore.js @@ -61,7 +61,7 @@ import { } from '../../domain/HardwareWalletLocalizedError'; import { wrapWithFrame } from '../../stores/lib/TrezorWrapper'; import { ampli } from '../../../ampli/index'; -import { noop } from '../../coreUtils'; +import { bytesToHex, noop } from '../../coreUtils'; import { getWallets, signAndBroadcastTransaction, @@ -1020,13 +1020,12 @@ export default class ConnectorStore extends Store { rawTxBody: Buffer, additionalRequiredSigners: Array = [], ): Promise { - const ownUtxoAddressMap: {| [string]: Array |} = {}; - const ownStakeAddressMap: {| [string]: Array |} = {}; + const ownAddressMap: {| [string]: Array |} = {}; for (const { address, path } of publicDeriver.allAddresses.utxoAddresses) { - ownUtxoAddressMap[address.Hash] = path; + ownAddressMap[address.Hash] = path; } for (const { address, path } of publicDeriver.allAddresses.accountingAddresses) { - ownStakeAddressMap[address.Hash] = path; + ownAddressMap[address.Hash] = path; } @@ -1034,8 +1033,7 @@ export default class ConnectorStore extends Store { return this.ledgerSignTx( publicDeriver, rawTxBody, - ownUtxoAddressMap, - ownStakeAddressMap, + ownAddressMap, additionalRequiredSigners ); } @@ -1043,8 +1041,7 @@ export default class ConnectorStore extends Store { return this.trezorSignTx( publicDeriver, rawTxBody, - ownUtxoAddressMap, - ownStakeAddressMap, + ownAddressMap, ); } throw new Error('unexpected wallet type'); @@ -1053,8 +1050,7 @@ export default class ConnectorStore extends Store { async trezorSignTx( publicDeriver: WalletState, rawTxBody: Buffer, - ownUtxoAddressMap: {| [string]: Array |}, - ownStakeAddressMap: {| [string]: Array |}, + ownAddressMap: {| [string]: Array |}, ): Promise { const network = getNetworkById(publicDeriver.networkId); const config = getCardanoHaskellBaseConfig(network).reduce( @@ -1066,18 +1062,16 @@ export default class ConnectorStore extends Store { if (!addressedUtxos) { throw new Error('unexpected nullish addressed UTXOs'); } - const txBody = RustModule.WalletV4.TransactionBody.from_bytes(rawTxBody); + const txBodyHex = bytesToHex(rawTxBody); let trezorSignTxPayload; try { trezorSignTxPayload = toTrezorSignRequest( - txBody, + txBodyHex, Number(config.ChainNetworkId), config.ByronNetworkId, - ownUtxoAddressMap, - ownStakeAddressMap, + ownAddressMap, addressedUtxos, - rawTxBody, ); } catch { runInAction(() => { @@ -1124,14 +1118,13 @@ export default class ConnectorStore extends Store { throw new Error('hash mismatch'); } - return buildSignedTrezorTransaction(txBody, trezorSignTxResp.witnesses, undefined); + return buildSignedTrezorTransaction(txBodyHex, trezorSignTxResp.witnesses, undefined); } async ledgerSignTx( publicDeriver: WalletState, rawTxBody: Buffer, - ownUtxoAddressMap: {| [string]: Array |}, - ownStakeAddressMap: {| [string]: Array |}, + ownAddressMap: {| [string]: Array |}, additionalRequiredSigners: Array = [], ): Promise { const network = getNetworkById(publicDeriver.networkId); @@ -1144,21 +1137,19 @@ export default class ConnectorStore extends Store { if (!addressedUtxos) { throw new Error('unexpected nullish addressed UTXOs'); } - const txBody = RustModule.WalletV4.TransactionBody.from_bytes(rawTxBody); - const [drepAddressHex, drepAddressing] = getDrepRewardAddressHexAndAddressing(publicDeriver); - ownStakeAddressMap[drepAddressHex] = drepAddressing.addressing.path; + ownAddressMap[drepAddressHex] = drepAddressing.addressing.path; + + const txBodyHex = bytesToHex(rawTxBody); let ledgerSignTxPayload; try { ledgerSignTxPayload = toLedgerSignRequest( - txBody, + txBodyHex, Number(config.ChainNetworkId), config.ByronNetworkId, - ownUtxoAddressMap, - ownStakeAddressMap, + ownAddressMap, addressedUtxos, - rawTxBody, additionalRequiredSigners, ); } catch (e) { @@ -1213,7 +1204,7 @@ export default class ConnectorStore extends Store { }; return buildSignedLedgerTransaction( - txBody, + txBodyHex, ledgerSignResult.witnesses, publicKeyInfo, undefined diff --git a/packages/yoroi-extension/chrome/extension/background/handlers/yoroi/connector.js b/packages/yoroi-extension/chrome/extension/background/handlers/yoroi/connector.js index 04003276b3..6cfcf85512 100644 --- a/packages/yoroi-extension/chrome/extension/background/handlers/yoroi/connector.js +++ b/packages/yoroi-extension/chrome/extension/background/handlers/yoroi/connector.js @@ -20,7 +20,7 @@ import { } from '../../../connector/api'; import { createAuthEntry } from '../../../../../app/connector/api'; import { getWalletChecksum } from '../../../../../app/api/export/utils'; -import type CardanoTxRequest from '../../../../../app/api/ada'; +import type { CardanoTxRequest } from '../../../../../app/api/ada'; import type { RemoteUnspentOutput } from '../../../../../app/api/ada/lib/state-fetch/types'; import { DataSignErrorCodes, diff --git a/packages/yoroi-extension/package-lock.json b/packages/yoroi-extension/package-lock.json index d537d49f35..2ad5dec22c 100644 --- a/packages/yoroi-extension/package-lock.json +++ b/packages/yoroi-extension/package-lock.json @@ -46,7 +46,6 @@ "bs58check": "2.1.2", "buffer": "6.0.3", "cardano-wallet-browser": "1.2.2", - "cbor": "^8.1.0", "chacha": "2.1.0", "classnames": "2.5.1", "concurrently": "8.2.2", @@ -10191,17 +10190,6 @@ "node": ">=0.6" } }, - "node_modules/cbor": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", - "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", - "dependencies": { - "nofilter": "^3.1.0" - }, - "engines": { - "node": ">=12.19" - } - }, "node_modules/chacha": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/chacha/-/chacha-2.1.0.tgz", @@ -21848,14 +21836,6 @@ "node": ">=8" } }, - "node_modules/nofilter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", - "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", - "engines": { - "node": ">=12.19" - } - }, "node_modules/nopt": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz", diff --git a/packages/yoroi-extension/package.json b/packages/yoroi-extension/package.json index d6961ab612..6d631450a2 100644 --- a/packages/yoroi-extension/package.json +++ b/packages/yoroi-extension/package.json @@ -180,7 +180,6 @@ "bs58check": "2.1.2", "buffer": "6.0.3", "cardano-wallet-browser": "1.2.2", - "cbor": "^8.1.0", "chacha": "2.1.0", "classnames": "2.5.1", "concurrently": "8.2.2", From 9c39f61c993504861b81590fe261c2c27fbf84c1 Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Sun, 29 Sep 2024 23:37:07 +0300 Subject: [PATCH 08/20] simplifying hw api --- packages/yoroi-extension/app/api/ada/index.js | 117 ++++++++++-------- .../api/ada/transactions/shelley/ledgerTx.js | 22 ++-- .../api/ada/transactions/shelley/trezorTx.js | 24 ++-- .../app/connector/stores/ConnectorStore.js | 4 +- .../app/stores/ada/send/LedgerSendStore.js | 2 +- .../app/stores/ada/send/TrezorSendStore.js | 2 +- 6 files changed, 95 insertions(+), 76 deletions(-) diff --git a/packages/yoroi-extension/app/api/ada/index.js b/packages/yoroi-extension/app/api/ada/index.js index 769098ab54..b9ce8c6c01 100644 --- a/packages/yoroi-extension/app/api/ada/index.js +++ b/packages/yoroi-extension/app/api/ada/index.js @@ -82,8 +82,8 @@ import { generateAdaMnemonic, generateWalletRootKey, } from './lib/cardanoCrypto import { cip8Sign, v4PublicToV2, makeCip8Key, buildCoseSign1FromSignature } from './lib/cardanoCrypto/utils'; import { isValidBip39Mnemonic, } from './lib/cardanoCrypto/wallet'; import type { CardanoSignTransaction } from 'trezor-connect-flow'; -import { createTrezorSignTxPayload, } from './transactions/shelley/trezorTx'; -import { createLedgerSignTxPayload, } from './transactions/shelley/ledgerTx'; +import { createTrezorSignTxPayload, toTrezorSignRequest, } from './transactions/shelley/trezorTx'; +import { createLedgerSignTxPayload, toLedgerSignRequest, } from './transactions/shelley/ledgerTx'; import { GenericApiError, IncorrectWalletPasswordError, @@ -121,8 +121,6 @@ import type { MultiAssetSupplyFunc, RemoteUnspentOutput, SendFunc, - SignedRequest, - SignedResponse, TokenInfoFunc, UtxoData, } from './lib/state-fetch/types'; @@ -149,7 +147,7 @@ import type { SendTokenList, } from '../common/types'; import { - getCardanoHaskellBaseConfig, + getCardanoHaskellBaseConfig, getCardanoHaskellBaseConfigCombined, getNetworkById, } from './lib/storage/database/prepackaged/networks'; import { toSenderUtxos } from './transactions/transfer/utils'; @@ -157,7 +155,7 @@ import type { DefaultTokenEntry } from '../common/lib/MultiToken'; import { MultiToken } from '../common/lib/MultiToken'; import { getReceiveAddress } from '../../stores/stateless/addressStores'; import { generateRegistrationMetadata } from './lib/cardanoCrypto/catalyst'; -import { bytesToHex, hexToBytes, hexToUtf } from '../../coreUtils'; +import { bytesToHex, fail, hexToBytes, hexToUtf } from '../../coreUtils'; import type { PersistedSubmittedTransaction } from '../localStorage'; import type WalletTransaction from '../../domain/WalletTransaction'; import { derivePrivateByAddressing, derivePublicByAddressing } from './lib/cardanoCrypto/deriveByAddressing'; @@ -180,9 +178,6 @@ export type GetAllAddressesForDisplayRequest = {| type: CoreAddressT, |}; export type GetAllAddressesForDisplayResponse = Array; -export type GetAllAddressesForDisplayFunc = ( - request: GetAllAddressesForDisplayRequest -) => Promise; // getChainAddressesForDisplay @@ -192,9 +187,6 @@ export type GetChainAddressesForDisplayRequest = {| type: CoreAddressT, |}; export type GetChainAddressesForDisplayResponse = Array; -export type GetChainAddressesForDisplayFunc = ( - request: GetChainAddressesForDisplayRequest -) => Promise; // refreshTransactions @@ -246,20 +238,6 @@ export type CreateTrezorSignTxDataResponse = {| // https://github.com/trezor/connect/blob/develop/docs/methods/cardanoSignTransaction.md trezorSignTxPayload: $Exact, |}; -export type CreateTrezorSignTxDataFunc = ( - request: CreateTrezorSignTxDataRequest -) => Promise; - -// broadcastTrezorSignedTx - -export type BroadcastTrezorSignedTxRequest = {| - signedTxRequest: SignedRequest, - sendTx: SendFunc, -|}; -export type BroadcastTrezorSignedTxResponse = SignedResponse; -export type BroadcastTrezorSignedTxFunc = ( - request: BroadcastTrezorSignedTxRequest -) => Promise; // createLedgerSignTxData @@ -269,29 +247,19 @@ export type CreateLedgerSignTxDataRequest = {| addressingMap: string => (void | $PropertyType), cip36: boolean, |}; -export type CreateLedgerSignTxDataRequestFromRawTx = {| - txBodyHex: string, - network: $ReadOnly, - addressingMap: string => (void | $PropertyType), - cip36: boolean, -|}; export type CreateLedgerSignTxDataResponse = {| ledgerSignTxPayload: SignTransactionRequest, |}; -export type CreateLedgerSignTxDataFunc = ( - request: CreateLedgerSignTxDataRequest -) => Promise; -// broadcastLedgerSignedTx +// createHwSignTxData -export type BroadcastLedgerSignedTxRequest = {| - signedTxRequest: SignedRequest, - sendTx: SendFunc, +export type CreateHWSignTxDataRequestFromRawTx = {| + txBodyHex: string, + network: $ReadOnly, + addressingMap: string => (void | $PropertyType), + senderUtxos: Array, + additionalRequiredSigners?: Array, |}; -export type BroadcastLedgerSignedTxResponse = SignedResponse; -export type BroadcastLedgerSignedTxFunc = ( - request: BroadcastLedgerSignedTxRequest -) => Promise; // createUnsignedTx @@ -783,9 +751,9 @@ export default class AdaApi { } } - async createTrezorSignTxData( + createTrezorSignTxData( request: CreateTrezorSignTxDataRequest - ): Promise { + ): CreateTrezorSignTxDataResponse { try { Logger.debug(`${nameof(AdaApi)}::${nameof(this.createTrezorSignTxData)} called`); @@ -793,7 +761,7 @@ export default class AdaApi { request.network ).reduce((acc, next) => Object.assign(acc, next), {}); - const trezorSignTxPayload = await createTrezorSignTxPayload( + const trezorSignTxPayload = createTrezorSignTxPayload( request.signRequest, config.ByronNetworkId, Number.parseInt(config.ChainNetworkId, 10), @@ -809,9 +777,9 @@ export default class AdaApi { } } - async createLedgerSignTxData( + createLedgerSignTxData( request: CreateLedgerSignTxDataRequest - ): Promise { + ): CreateLedgerSignTxDataResponse { try { Logger.debug(`${nameof(AdaApi)}::${nameof(this.createLedgerSignTxData)} called`); @@ -819,7 +787,7 @@ export default class AdaApi { request.network ).reduce((acc, next) => Object.assign(acc, next), {}); - const ledgerSignTxPayload = await createLedgerSignTxPayload({ + const ledgerSignTxPayload = createLedgerSignTxPayload({ signRequest: request.signRequest, byronNetworkMagic: config.ByronNetworkId, networkId: Number.parseInt(config.ChainNetworkId, 10), @@ -839,6 +807,57 @@ export default class AdaApi { } } + createHwSignTxDataFromRawTx( + hw: 'ledger' | 'trezor', + request: CreateHWSignTxDataRequestFromRawTx + ): ( + {| hw: 'ledger', result: CreateLedgerSignTxDataResponse |} + | {| hw: 'trezor', result: CreateTrezorSignTxDataResponse |} + ) { + try { + Logger.debug(`${nameof(AdaApi)}::${nameof(this.createHwSignTxDataFromRawTx)} called`); + + const config = getCardanoHaskellBaseConfigCombined(request.network); + const protocolMagic = config.ByronNetworkId ?? fail('Missing ByronNetworkId in network config!'); + + const addressMap = s => request.addressingMap(s)?.path; + + if (hw === 'ledger') { + + const ledgerSignTxPayload = toLedgerSignRequest( + request.txBodyHex, + Number(config.ChainNetworkId), + protocolMagic, + addressMap, + request.senderUtxos, + request.additionalRequiredSigners ?? [], + ); + + Logger.debug(`${nameof(AdaApi)}::${nameof(this.createHwSignTxDataFromRawTx)} success: ` + stringifyData(ledgerSignTxPayload)); + return { hw, result: { ledgerSignTxPayload } }; + } + if (hw === 'trezor') { + + const trezorSignTxPayload = toTrezorSignRequest( + request.txBodyHex, + Number(config.ChainNetworkId), + protocolMagic, + addressMap, + request.senderUtxos, + ); + Logger.debug(`${nameof(AdaApi)}::${nameof(this.createHwSignTxDataFromRawTx)} success: ` + stringifyData(trezorSignTxPayload)); + return { hw, result: { trezorSignTxPayload } }; + } + + throw new Error('Now supported HW type: ' + hw); + + } catch (error) { + Logger.error(`${nameof(AdaApi)}::${nameof(this.createHwSignTxDataFromRawTx)} error: ` + stringifyError(error)); + if (error instanceof LocalizableError) throw error; + throw new GenericApiError(); + } + } + async createUnsignedTxForUtxos( request: CreateUnsignedTxForUtxosRequest ): Promise { diff --git a/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js b/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js index e27bf23c22..9d84903d44 100644 --- a/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js +++ b/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js @@ -49,13 +49,13 @@ import { mergeWitnessSets } from '../utils'; // ==================== LEDGER ==================== // /** Generate a payload for Ledger SignTx */ -export async function createLedgerSignTxPayload(request: {| +export function createLedgerSignTxPayload(request: {| signRequest: HaskellShelleyTxSignRequest, byronNetworkMagic: number, networkId: number, addressingMap: string => (void | $PropertyType), cip36: boolean, -|}): Promise { +|}): SignTransactionRequest { const txBody = request.signRequest.unsignedTx.build(); // Inputs @@ -798,7 +798,7 @@ export function buildSignedTransaction( ); } -type AddressMap = { [addressHex: string]: Array }; +type AddressMap = (addressHex: string) => ?Array; // Convert connector sign tx input into request to Ledger. // Note this function has some overlaps in functionality with above functions but @@ -809,7 +809,7 @@ export function toLedgerSignRequest( networkId: number, protocolMagic: number, ownAddressMap: AddressMap, - addressedUtxos: Array, + senderUtxos: Array, additionalRequiredSigners: Array = [], ): SignTransactionRequest { @@ -821,7 +821,7 @@ export function toLedgerSignRequest( const input = inputs.get(i); const hash = input.transaction_id().to_hex(); const index = input.index(); - const ownUtxo = addressedUtxos.find(utxo => + const ownUtxo = senderUtxos.find(utxo => utxo.tx_hash === hash && utxo.tx_index === index ); formatted.push({ @@ -858,7 +858,7 @@ export function toLedgerSignRequest( const enterpriseAddr = RustModule.WalletV4.EnterpriseAddress.from_address(addr); if (enterpriseAddr) { - const ownAddressPath = ownAddressMap[addr.to_hex()]; + const ownAddressPath = ownAddressMap(addr.to_hex()); if (ownAddressPath) { destination = { type: TxOutputDestinationType.DEVICE_OWNED, @@ -885,14 +885,14 @@ export function toLedgerSignRequest( networkId, baseAddr.payment_cred() ).to_address().to_hex(); - const ownPaymentPath = ownAddressMap[paymentAddress]; + const ownPaymentPath = ownAddressMap(paymentAddress); if (ownPaymentPath) { const stake = baseAddr.stake_cred(); const stakeAddr = RustModule.WalletV4.RewardAddress.new( networkId, stake, ).to_address().to_hex(); - const ownStakePath = ownAddressMap[stakeAddr]; + const ownStakePath = ownAddressMap(stakeAddr); if (ownStakePath) { // stake address is ours destination = { @@ -1020,8 +1020,8 @@ export function toLedgerSignRequest( networkId, Module.WalletV4.Credential.from_keyhash(hash), ).to_address().to_hex(); - return ownAddressMap[enterpriseAddress] - || ownAddressMap[stakeAddress]; + return ownAddressMap(enterpriseAddress) + || ownAddressMap(stakeAddress); } const requiredSignerHashHexes = getRequiredSignerHashHexes(); for (const hashHex of requiredSignerHashHexes) { @@ -1048,7 +1048,7 @@ export function toLedgerSignRequest( }); function addressingMap(addr: string): void | {| +path: Array |} { - const path = ownAddressMap[addr]; + const path = ownAddressMap(addr); if (path) { return { path }; } diff --git a/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.js b/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.js index 17b17bcd35..567d79f68d 100644 --- a/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.js +++ b/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.js @@ -44,11 +44,11 @@ import { mergeWitnessSets } from '../utils'; // ==================== TREZOR ==================== // /** Generate a payload for Trezor SignTx */ -export async function createTrezorSignTxPayload( +export function createTrezorSignTxPayload( signRequest: HaskellShelleyTxSignRequest, byronNetworkMagic: number, networkId: number, -): Promise<$Exact> { +): $Exact { const stakingKeyPath = (() => { // TODO: this entire block is super hacky // need to instead pass in a mapping from wallet addresses to addressing @@ -514,7 +514,7 @@ export function buildSignedTransaction( ); } -type AddressMap = { [addressHex: string]: Array }; +type AddressMap = (addressHex: string) => ?Array; // Convert connector sign tx input into request to Trezor. // Note this function has some overlaps in functionality with above functions but @@ -525,7 +525,7 @@ export function toTrezorSignRequest( networkId: number, protocolMagic: number, ownAddressMap: AddressMap, - addressedUtxos: Array, + senderUtxos: Array, ): $Exact { const txBody = RustModule.WalletV4.TransactionBody.from_hex(txBodyHex); @@ -536,7 +536,7 @@ export function toTrezorSignRequest( const input = inputs.get(i); const hash = input.transaction_id().to_hex(); const index = input.index(); - const ownUtxo = addressedUtxos.find(utxo => + const ownUtxo = senderUtxos.find(utxo => utxo.tx_hash === hash && utxo.tx_index === index ); const cardanoInput: CardanoInput = { @@ -577,7 +577,7 @@ export function toTrezorSignRequest( const enterpriseAddr = RustModule.WalletV4.EnterpriseAddress.from_address(addr); if (enterpriseAddr) { - const ownAddressPath = ownAddressMap[addr.to_bech32()]; + const ownAddressPath = ownAddressMap(addr.to_bech32()); if (ownAddressPath) { result = ({ addressParameters: { @@ -600,14 +600,14 @@ export function toTrezorSignRequest( networkId, baseAddr.payment_cred() ).to_address().to_hex(); - const ownPaymentPath = ownAddressMap[paymentAddress]; + const ownPaymentPath = ownAddressMap(paymentAddress); if (ownPaymentPath) { const stake = baseAddr.stake_cred(); const stakeAddr = RustModule.WalletV4.RewardAddress.new( networkId, stake, ).to_address().to_hex(); - const ownStakePath = ownAddressMap[stakeAddr]; + const ownStakePath = ownAddressMap(stakeAddr); if (ownStakePath) { // stake address is ours result = ({ @@ -704,8 +704,8 @@ export function toTrezorSignRequest( networkId, RustModule.WalletV4.Credential.from_keyhash(hash), ).to_address().to_hex(); - const ownAddressPath = ownAddressMap[enterpriseAddress] - || ownAddressMap[stakeAddress]; + const ownAddressPath = ownAddressMap(enterpriseAddress) + || ownAddressMap(stakeAddress); if (ownAddressPath) { formattedRequiredSigners.push({ keyPath: ownAddressPath, @@ -730,7 +730,7 @@ export function toTrezorSignRequest( stakeCredential ); const addressPayload = Buffer.from(rewardAddr.to_address().to_bytes()).toString('hex'); - const addressing = ownAddressMap[addressPayload]; + const addressing = ownAddressMap(addressPayload); if (addressing == null) { throw new Error('not own address in certificate'); } @@ -785,7 +785,7 @@ export function toTrezorSignRequest( } const rewardAddressPayload = rewardAddress.to_address().to_hex(); - const path = ownAddressMap[rewardAddressPayload]; + const path = ownAddressMap(rewardAddressPayload); if (path == null) { throw new Error('foreign withdrawal reward address'); } diff --git a/packages/yoroi-extension/app/connector/stores/ConnectorStore.js b/packages/yoroi-extension/app/connector/stores/ConnectorStore.js index 61caea6779..9419e077f9 100644 --- a/packages/yoroi-extension/app/connector/stores/ConnectorStore.js +++ b/packages/yoroi-extension/app/connector/stores/ConnectorStore.js @@ -1070,7 +1070,7 @@ export default class ConnectorStore extends Store { txBodyHex, Number(config.ChainNetworkId), config.ByronNetworkId, - ownAddressMap, + s => ownAddressMap[s], addressedUtxos, ); } catch { @@ -1148,7 +1148,7 @@ export default class ConnectorStore extends Store { txBodyHex, Number(config.ChainNetworkId), config.ByronNetworkId, - ownAddressMap, + s => ownAddressMap[s], addressedUtxos, additionalRequiredSigners, ); diff --git a/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js b/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js index 4dde830c9f..16417a8348 100644 --- a/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js +++ b/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js @@ -222,7 +222,7 @@ export default class LedgerSendStore extends Store { const tx = request.signRequest.self().build_tx(); const txId = transactionHexToHash(tx.to_hex()); - const { ledgerSignTxPayload } = await this.api.ada.createLedgerSignTxData({ + const { ledgerSignTxPayload } = this.api.ada.createLedgerSignTxData({ signRequest: request.signRequest, network, addressingMap: request.addressingMap, diff --git a/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js b/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js index e73d8e6268..16b7a00a51 100644 --- a/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js +++ b/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js @@ -112,7 +112,7 @@ export default class TrezorSendStore extends Store { |} => Promise<{| txId: string |}> = async (request) => { try { const network = getNetworkById(request.wallet.networkId); - const trezorSignTxDataResp = await this.api.ada.createTrezorSignTxData({ + const trezorSignTxDataResp = this.api.ada.createTrezorSignTxData({ ...request.params, network, }); From aaccbb42c7ed7cc537b5f259739c5cd6d37f8b0e Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Tue, 1 Oct 2024 19:58:05 +0300 Subject: [PATCH 09/20] raw tx signing/submitting in ledger --- packages/yoroi-extension/app/api/ada/index.js | 2 +- .../app/api/ada/lib/cardanoCrypto/utils.js | 14 ++ .../api/ada/transactions/shelley/ledgerTx.js | 21 +-- .../ada/transactions/shelley/ledgerTx.test.js | 7 +- .../api/ada/transactions/shelley/trezorTx.js | 24 ++-- .../ada/transactions/shelley/trezorTx.test.js | 2 + .../app/connector/stores/ConnectorStore.js | 100 +++++++-------- .../app/stores/ada/send/LedgerSendStore.js | 120 ++++++++++++++++-- .../app/stores/toplevel/WalletStore.js | 15 ++- 9 files changed, 211 insertions(+), 94 deletions(-) diff --git a/packages/yoroi-extension/app/api/ada/index.js b/packages/yoroi-extension/app/api/ada/index.js index b9ce8c6c01..64bde96159 100644 --- a/packages/yoroi-extension/app/api/ada/index.js +++ b/packages/yoroi-extension/app/api/ada/index.js @@ -2210,7 +2210,7 @@ export default class AdaApi { ); } - // fixme: refactor this tmp function + // async _addressedUtxosWithSubmittedTxs( originalUtxos: Array, publicDeriverId: number, diff --git a/packages/yoroi-extension/app/api/ada/lib/cardanoCrypto/utils.js b/packages/yoroi-extension/app/api/ada/lib/cardanoCrypto/utils.js index fdda92cebd..c771e62798 100644 --- a/packages/yoroi-extension/app/api/ada/lib/cardanoCrypto/utils.js +++ b/packages/yoroi-extension/app/api/ada/lib/cardanoCrypto/utils.js @@ -24,6 +24,20 @@ export function transactionHexToWitnessSet(txHex: string): string { bytesToHex(Module.WalletV4.FixedTransaction.from_hex(txHex).raw_witness_set())); } +export function transactionBodyHexToTransaction(txBodyHex: string): string { + return RustModule.WasmScope(Module => + Module.WalletV4.FixedTransaction.new( + hexToBytes(txBodyHex), + Module.WalletV4.TransactionWitnessSet.new().to_bytes(), + true, + ).to_hex()); +} + +export function transactionHexToBodyHex(txHex: string): string { + return RustModule.WasmScope(Module => + bytesToHex(Module.WalletV4.FixedTransaction.from_hex(txHex).raw_body())); +} + export function transactionHexToHash(txHex: string): string { return RustModule.WasmScope(Module => Module.WalletV4.hash_transaction(Module.WalletV4.FixedTransaction.from_hex(txHex).body()).to_hex()); diff --git a/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js b/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js index 9d84903d44..a98c33be8f 100644 --- a/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js +++ b/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.js @@ -1144,21 +1144,17 @@ export function toLedgerSignRequest( } export function buildConnectorSignedTransaction( - txBodyHex: string, + rawTxHex: string, witnesses: Array, publicKey: {| ...Addressing, key: RustModule.WalletV4.Bip32PublicKey, |}, - metadata: RustModule.WalletV4.AuxiliaryData | void -): RustModule.WalletV4.Transaction { - - const txBody = RustModule.WalletV4.TransactionBody.from_hex(txBodyHex); +): string { + const fixedTx = RustModule.WalletV4.FixedTransaction.from_hex(rawTxHex); const keyLevel = publicKey.addressing.startLevel + publicKey.addressing.path.length - 1; - const vkeyWitWasm = RustModule.WalletV4.Vkeywitnesses.new(); - for (const witness of witnesses) { const addressing = { path: witness.path, @@ -1177,14 +1173,9 @@ export function buildConnectorSignedTransaction( RustModule.WalletV4.Vkey.new(witnessKey.to_raw_key()), RustModule.WalletV4.Ed25519Signature.from_bytes(Buffer.from(witness.witnessSignatureHex, 'hex')), ); - vkeyWitWasm.add(vkeyWit); + + fixedTx.add_vkey_witness(vkeyWit); } - const witSet = RustModule.WalletV4.TransactionWitnessSet.new(); - witSet.set_vkeys(vkeyWitWasm); - return RustModule.WalletV4.Transaction.new( - txBody, - witSet, - metadata - ); + return fixedTx.to_hex(); } diff --git a/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.test.js b/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.test.js index e19731abb4..6c7b0789fa 100644 --- a/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.test.js +++ b/packages/yoroi-extension/app/api/ada/transactions/shelley/ledgerTx.test.js @@ -355,10 +355,14 @@ test('Create Ledger transaction', async () => { }); expect(response).toStrictEqual(({ + options: { + tagCborSets: false, + }, signingMode: TransactionSigningMode.ORDINARY_TRANSACTION, tx: { fee: '1000', ttl: '500', + scriptDataHashHex: null, network: { networkId: 1, protocolMagic: 764824073, @@ -412,6 +416,7 @@ test('Create Ledger transaction', async () => { type: TxOutputDestinationType.THIRD_PARTY, }, amount: `5326134`, + datumHashHex: null, tokenBundle: null, }], withdrawals: null, @@ -431,7 +436,7 @@ test('Create Ledger transaction', async () => { type: CertificateType.STAKE_REGISTRATION, }], auxiliaryData: undefined, - validityIntervalStart: undefined, + validityIntervalStart: null, }, additionalWitnessPaths: [], }: SignTransactionRequest)); diff --git a/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.js b/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.js index 567d79f68d..5307a08fbc 100644 --- a/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.js +++ b/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.js @@ -892,12 +892,12 @@ export function toTrezorSignRequest( } export function buildConnectorSignedTransaction( - txBodyHex: string, + rawTxHex: string, witnesses: Array, - metadata: RustModule.WalletV4.AuxiliaryData | void, -): RustModule.WalletV4.Transaction { - const txBody = RustModule.WalletV4.TransactionBody.from_hex(txBodyHex); - const vkeyWitnesses = RustModule.WalletV4.Vkeywitnesses.new(); +): string { + + const fixedTx = RustModule.WalletV4.FixedTransaction.from_hex(rawTxHex); + for (const witness of witnesses) { if (witness.type === CardanoTxWitnessType.BYRON_WITNESS) { throw new Error('Byron wallet does not support connector API'); @@ -908,16 +908,14 @@ export function buildConnectorSignedTransaction( ), RustModule.WalletV4.Ed25519Signature.from_hex(witness.signature), ); - vkeyWitnesses.add(vkeyWitness); + + fixedTx.add_vkey_witness(vkeyWitness); + } else { throw new Error('unexpected witness type'); } } - const witnessSet = RustModule.WalletV4.TransactionWitnessSet.new(); - witnessSet.set_vkeys(vkeyWitnesses); - return RustModule.WalletV4.Transaction.new( - txBody, - witnessSet, - metadata - ); + + + return fixedTx.to_hex(); } diff --git a/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.test.js b/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.test.js index 61773e68a5..2c81630917 100644 --- a/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.test.js +++ b/packages/yoroi-extension/app/api/ada/transactions/shelley/trezorTx.test.js @@ -242,6 +242,8 @@ test('Create Trezor transaction', async () => { ttl: '500', networkId: 1, protocolMagic: 764824073, + scriptDataHash: undefined, + validityIntervalStart: undefined, inputs: [{ path: `m/44'/1815'/0'/1/1`, prev_hash: '058405892f66075d83abd1b7fe341d2d5bfd2f6122b2f874700039e5078e0dd5', diff --git a/packages/yoroi-extension/app/connector/stores/ConnectorStore.js b/packages/yoroi-extension/app/connector/stores/ConnectorStore.js index 9419e077f9..20f01e9ca3 100644 --- a/packages/yoroi-extension/app/connector/stores/ConnectorStore.js +++ b/packages/yoroi-extension/app/connector/stores/ConnectorStore.js @@ -27,8 +27,8 @@ import Request from '../../stores/lib/LocalizedRequest'; import Store from '../../stores/base/Store'; import { getCardanoHaskellBaseConfig, - isCardanoHaskell, getNetworkById, + isCardanoHaskell, } from '../../api/ada/lib/storage/database/prepackaged/networks'; import { MultiToken } from '../../api/common/lib/MultiToken'; import { RustModule } from '../../api/ada/lib/cardanoCrypto/rustLoader'; @@ -56,27 +56,31 @@ import { convertToLocalizableError as convertToLocalizableTrezorError } from '.. import { transactionHashMismatchError, trezorSignDataUnsupportedError, - unsupportedTransactionError, unknownAddressError, + unsupportedTransactionError, } from '../../domain/HardwareWalletLocalizedError'; import { wrapWithFrame } from '../../stores/lib/TrezorWrapper'; import { ampli } from '../../../ampli/index'; -import { bytesToHex, noop } from '../../coreUtils'; +import { hexToBytes, noop } from '../../coreUtils'; import { - getWallets, - signAndBroadcastTransaction, broadcastTransaction, - userSignConfirm, - userSignReject, - signFail, - signWindowRetrieveData, connectWindowRetrieveData, - removeWalletFromWhiteList, getConnectedSites, getProtocolParameters, + getWallets, + removeWalletFromWhiteList, + signAndBroadcastTransaction, + signFail, + signWindowRetrieveData, + userSignConfirm, + userSignReject, } from '../../api/thunk'; import type { WalletState } from '../../../chrome/extension/background/types'; -import { addressBech32ToHex } from '../../api/ada/lib/cardanoCrypto/utils'; +import { + addressBech32ToHex, transactionBodyHexToTransaction, + transactionHexToBodyHex, transactionHexToHash, + transactionHexToWitnessSet +} from '../../api/ada/lib/cardanoCrypto/utils'; import AdaApi, { findPath } from '../../api/ada'; import { MessageAddressFieldType } from '@cardano-foundation/ledgerjs-hw-app-cardano'; @@ -130,7 +134,7 @@ export default class ConnectorStore extends Store { @observable adaTransaction: ?CardanoConnectorSignRequest = null; // store the transaction body for hw wallet signing - rawTxBody: ?Buffer = null; + rawTx: ?string = null; addressedUtxos: ?Array = null; reorgTxSignRequest: ?HaskellShelleyTxSignRequest = null; @@ -260,8 +264,8 @@ export default class ConnectorStore extends Store { ) { const tx = toJS(signingMessage.sign.tx); if (wallet.type !== 'mnemonic') { - const { rawTxBody } = this; - if (!rawTxBody) { + const { rawTx } = this; + if (!rawTx) { throw new Error('unexpected nullish transaction'); } @@ -271,14 +275,13 @@ export default class ConnectorStore extends Store { : [...(getScriptRequiredSigningKeys(witnessSet, Module))]; }); - const witnessSetHex = - (await this.hwSignTx( + const witnessSetHex = transactionHexToWitnessSet( + await this.hwSignTxHex( wallet, - rawTxBody, + rawTx, additionalRequiredSigners, - )) - .witness_set() - .to_hex(); + ) + ); userSignConfirm({ tx, @@ -437,17 +440,15 @@ export default class ConnectorStore extends Store { const defaultToken = this.stores.tokenInfoStore.getDefaultTokenInfo(network.NetworkId); let txBody; - const bytes = Buffer.from(tx, 'hex'); try { - // - const transaction = RustModule.WalletV4.FixedTransaction.from_bytes(bytes); - this.rawTxBody = Buffer.from(transaction.raw_body()); + const transaction = RustModule.WalletV4.FixedTransaction.from_hex(tx); + this.rawTx = tx; txBody = transaction.body(); } catch { try { // Try parsing as body for backward compatibility - txBody = RustModule.WalletV4.TransactionBody.from_bytes(bytes); - this.rawTxBody = bytes; + txBody = RustModule.WalletV4.TransactionBody.from_hex(tx); + this.rawTx = transactionBodyHexToTransaction(tx); } catch { runInAction(() => { this.unrecoverableError = 'Unable to parse input transaction.'; @@ -851,6 +852,8 @@ export default class ConnectorStore extends Store { throw new Error('unexpected nullish sign request'); } + const rawTxHex = signRequest.unsignedTx.build_tx().to_hex(); + if (publicDeriver.type === 'mnemonic') { await signAndBroadcastTransaction({ signRequest, @@ -858,19 +861,17 @@ export default class ConnectorStore extends Store { publicDeriverId: publicDeriver.publicDeriverId }); } else { - const signedTx = await this.hwSignTx( + const signedTxHex = await this.hwSignTxHex( publicDeriver, - Buffer.from(signRequest.unsignedTx.build().to_bytes()) + rawTxHex, ); await broadcastTransaction({ - signedTxHex: signedTx.to_hex(), + signedTxHex, publicDeriverId: publicDeriver.publicDeriverId, addressedUtxos, }); } - return RustModule.WalletV4.hash_transaction( - signRequest.unsignedTx.build() - ).to_hex(); + return transactionHexToHash(rawTxHex); }; getUtxosAfterReorg: string => Array = txId => { const allOutputs = this.adaTransaction?.outputs; @@ -1015,11 +1016,11 @@ export default class ConnectorStore extends Store { ); } - async hwSignTx( + async hwSignTxHex( publicDeriver: WalletState, - rawTxBody: Buffer, + rawTxHex: string, additionalRequiredSigners: Array = [], - ): Promise { + ): Promise { const ownAddressMap: {| [string]: Array |} = {}; for (const { address, path } of publicDeriver.allAddresses.utxoAddresses) { ownAddressMap[address.Hash] = path; @@ -1032,7 +1033,7 @@ export default class ConnectorStore extends Store { if (publicDeriver.type === 'ledger') { return this.ledgerSignTx( publicDeriver, - rawTxBody, + rawTxHex, ownAddressMap, additionalRequiredSigners ); @@ -1040,7 +1041,7 @@ export default class ConnectorStore extends Store { if (publicDeriver.type === 'trezor') { return this.trezorSignTx( publicDeriver, - rawTxBody, + rawTxHex, ownAddressMap, ); } @@ -1049,9 +1050,9 @@ export default class ConnectorStore extends Store { async trezorSignTx( publicDeriver: WalletState, - rawTxBody: Buffer, + rawTxHex: string, ownAddressMap: {| [string]: Array |}, - ): Promise { + ): Promise { const network = getNetworkById(publicDeriver.networkId); const config = getCardanoHaskellBaseConfig(network).reduce( (acc, next) => Object.assign(acc, next), @@ -1062,12 +1063,12 @@ export default class ConnectorStore extends Store { if (!addressedUtxos) { throw new Error('unexpected nullish addressed UTXOs'); } - const txBodyHex = bytesToHex(rawTxBody); + const rawTxBodyHex = transactionHexToBodyHex(rawTxHex); let trezorSignTxPayload; try { trezorSignTxPayload = toTrezorSignRequest( - txBodyHex, + rawTxBodyHex, Number(config.ChainNetworkId), config.ByronNetworkId, s => ownAddressMap[s], @@ -1108,7 +1109,7 @@ export default class ConnectorStore extends Store { if ( trezorSignTxResp.hash !== blake2b(256 / 8) - .update(rawTxBody) + .update(hexToBytes(rawTxBodyHex)) .digest('hex') ) { runInAction(() => { @@ -1118,15 +1119,15 @@ export default class ConnectorStore extends Store { throw new Error('hash mismatch'); } - return buildSignedTrezorTransaction(txBodyHex, trezorSignTxResp.witnesses, undefined); + return buildSignedTrezorTransaction(rawTxHex, trezorSignTxResp.witnesses); } async ledgerSignTx( publicDeriver: WalletState, - rawTxBody: Buffer, + rawTxHex: string, ownAddressMap: {| [string]: Array |}, additionalRequiredSigners: Array = [], - ): Promise { + ): Promise { const network = getNetworkById(publicDeriver.networkId); const config = getCardanoHaskellBaseConfig(network).reduce( (acc, next) => Object.assign(acc, next), @@ -1140,12 +1141,12 @@ export default class ConnectorStore extends Store { const [drepAddressHex, drepAddressing] = getDrepRewardAddressHexAndAddressing(publicDeriver); ownAddressMap[drepAddressHex] = drepAddressing.addressing.path; - const txBodyHex = bytesToHex(rawTxBody); + const rawTxBodyHex = transactionHexToBodyHex(rawTxHex); let ledgerSignTxPayload; try { ledgerSignTxPayload = toLedgerSignRequest( - txBodyHex, + rawTxBodyHex, Number(config.ChainNetworkId), config.ByronNetworkId, s => ownAddressMap[s], @@ -1185,7 +1186,7 @@ export default class ConnectorStore extends Store { if ( ledgerSignResult.txHashHex !== blake2b(256 / 8) - .update(rawTxBody) + .update(hexToBytes(rawTxBodyHex)) .digest('hex') ) { runInAction(() => { @@ -1204,10 +1205,9 @@ export default class ConnectorStore extends Store { }; return buildSignedLedgerTransaction( - txBodyHex, + rawTxHex, ledgerSignResult.witnesses, publicKeyInfo, - undefined ); } diff --git a/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js b/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js index 16417a8348..92dacbb51f 100644 --- a/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js +++ b/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js @@ -25,6 +25,7 @@ import { } from '../../../utils/logging'; import { + buildConnectorSignedTransaction, buildSignedTransaction, } from '../../../api/ada/transactions/shelley/ledgerTx'; @@ -44,7 +45,8 @@ import { } from '../../../api/ada/lib/cardanoCrypto/catalyst'; import { getNetworkById } from '../../../api/ada/lib/storage/database/prepackaged/networks.js'; import { broadcastTransaction } from '../../../api/thunk'; -import { transactionHexToHash } from '../../../api/ada/lib/cardanoCrypto/utils'; +import { transactionHexToBodyHex, transactionHexToHash } from '../../../api/ada/lib/cardanoCrypto/utils'; +import { fail } from '../../../coreUtils'; /** Note: Handles Ledger Signing */ export default class LedgerSendStore extends Store { @@ -147,7 +149,7 @@ export default class LedgerSendStore extends Store { /** Generates a payload with Ledger format and tries Send ADA using Ledger signing */ signAndBroadcastFromWallet: {| params: {| - signRequest: HaskellShelleyTxSignRequest, + signRequest: HaskellShelleyTxSignRequest | string, |}, +wallet: { publicDeriverId: number, @@ -172,17 +174,35 @@ export default class LedgerSendStore extends Store { }; const expectedSerial = request.wallet.hardwareWalletDeviceId || ''; - return this.signAndBroadcast({ - ...request.params, - publicKey: publicKeyInfo, - publicDeriverId: request.wallet.publicDeriverId, - addressingMap: genAddressingLookup( - request.wallet.networkId, - this.stores.addresses.addressSubgroupMap - ), - expectedSerial, - networkId: request.wallet.networkId, - }); + + const signRequest = request.params.signRequest; + + if (typeof signRequest === 'string') { + return this.signAndBroadcastRawTx({ + rawTxHex: signRequest, + publicKey: publicKeyInfo, + publicDeriverId: request.wallet.publicDeriverId, + addressingMap: genAddressingLookup( + request.wallet.networkId, + this.stores.addresses.addressSubgroupMap + ), + expectedSerial, + networkId: request.wallet.networkId, + }); + } else { + return this.signAndBroadcast({ + signRequest, + publicKey: publicKeyInfo, + publicDeriverId: request.wallet.publicDeriverId, + addressingMap: genAddressingLookup( + request.wallet.networkId, + this.stores.addresses.addressSubgroupMap + ), + expectedSerial, + networkId: request.wallet.networkId, + }); + } + } catch (error) { Logger.error(`${nameof(LedgerSendStore)}::${nameof(this.signAndBroadcast)} error: ` + stringifyError(error)); throw new convertToLocalizableError(error); @@ -320,6 +340,80 @@ export default class LedgerSendStore extends Store { } }; + signAndBroadcastRawTx: {| + rawTxHex: string, + publicKey: {| + key: RustModule.WalletV4.Bip32PublicKey, + ...Addressing, + |}, + addressingMap: string => (void | $PropertyType), + publicDeriverId: number, + networkId: number, + expectedSerial: string | void, + |} => Promise<{| txId: string |}> = async (request) => { + + let ledgerConnect: ?LedgerConnect; + try { + Logger.debug(`${nameof(LedgerSendStore)}::${nameof(this.signAndBroadcast)} called: ` + stringifyData(request)); + + ledgerConnect = new LedgerConnect({ + locale: this.stores.profile.currentLocale, + }); + + const { rawTxHex } = request; + + const network = getNetworkById(request.networkId); + + const txBodyHex = transactionHexToBodyHex(rawTxHex); + const txId = transactionHexToHash(rawTxHex); + + const addressedUtxos = await this.stores.wallets.getAddressedUtxos(); + + const response = this.api.ada.createHwSignTxDataFromRawTx('ledger', { + txBodyHex, + network, + addressingMap: request.addressingMap, + senderUtxos: addressedUtxos, + }); + + const ledgerSignTxPayload = response.hw === 'ledger' ? response.result.ledgerSignTxPayload + : fail('Unecpected response type from `createHwSignTxDataFromRawTx` for ledger: ' + JSON.stringify(response)); + + const ledgerSignTxResp: LedgerSignTxResponse = + await ledgerConnect.signTransaction({ + serial: request.expectedSerial, + params: ledgerSignTxPayload, + useOpenTab: true, + }); + + // There is no need of ledgerConnect after this line. + // UI was getting blocked for few seconds + // because _prepareAndBroadcastSignedTx takes time. + // Disposing here will fix the UI issue. + ledgerConnect.dispose(); + + const signedTxHex = buildConnectorSignedTransaction( + rawTxHex, + ledgerSignTxResp.witnesses, + request.publicKey, + ); + + await broadcastTransaction({ + publicDeriverId: request.publicDeriverId, + signedTxHex, + }); + + return { txId }; + } catch (error) { + Logger.error(`${nameof(LedgerSendStore)}::${nameof(this.signAndBroadcast)} error: ` + stringifyError(error)); + throw new convertToLocalizableError(error); + } finally { + if (ledgerConnect != null) { + ledgerConnect.dispose(); + } + } + }; + _cancel: void => void = () => { if (!this.isActionProcessing) { this.actions.dialogs.closeActiveDialog.trigger(); diff --git a/packages/yoroi-extension/app/stores/toplevel/WalletStore.js b/packages/yoroi-extension/app/stores/toplevel/WalletStore.js index b420f8e86d..1bca0fbb65 100644 --- a/packages/yoroi-extension/app/stores/toplevel/WalletStore.js +++ b/packages/yoroi-extension/app/stores/toplevel/WalletStore.js @@ -19,10 +19,12 @@ import type { WalletState } from '../../../chrome/extension/background/types'; import { getWallets, subscribe, listenForWalletStateUpdate } from '../../api/thunk'; import { FlagsApi } from '@emurgo/yoroi-lib/dist/flags'; import type { StorageAPI } from '@emurgo/yoroi-lib/dist/flags'; -import { createFlagStorage } from '../../api/localStorage'; +import { createFlagStorage, loadSubmittedTransactions } from '../../api/localStorage'; import { forceNonNull, timeCached } from '../../coreUtils'; import type { BestBlockResponse } from '../../api/ada/lib/state-fetch/types'; import TimeUtils from '../../api/ada/lib/storage/bridge/timeUtils'; +import type { CardanoAddressedUtxo } from '../../api/ada/transactions/types'; +import { asAddressedUtxo } from '../../api/ada/transactions/utils'; /*:: declare var chrome; @@ -419,6 +421,17 @@ export default class WalletStore extends Store { this.wallets[this.selectedIndex].name = newName; } } + + async getAddressedUtxos(): Promise> { + const wallet = this.selectedOrFail; + const submittedTxs = await loadSubmittedTransactions() || []; + return this.api.ada._addressedUtxosWithSubmittedTxs( + asAddressedUtxo(wallet.utxos), + wallet.publicDeriverId, + wallet.allUtxoAddresses, + submittedTxs, + ); + } } export const WalletCreationNotifications: {| [key: string]: Notification |} = { From 9d6e5a44e1d8fa11dce14c90b6223c2a6b746fb7 Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Wed, 2 Oct 2024 18:22:17 +0300 Subject: [PATCH 10/20] hw api refactor --- packages/yoroi-extension/app/api/ada/index.js | 18 ++++++++---------- .../app/stores/ada/AdaWalletsStore.js | 2 +- .../app/stores/ada/send/TrezorSendStore.js | 19 +++++++++---------- 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/packages/yoroi-extension/app/api/ada/index.js b/packages/yoroi-extension/app/api/ada/index.js index 64bde96159..ac76a20677 100644 --- a/packages/yoroi-extension/app/api/ada/index.js +++ b/packages/yoroi-extension/app/api/ada/index.js @@ -79,7 +79,7 @@ import { signTransaction as shelleySignTransaction, } from './transactions/shelley/transactions'; import { generateAdaMnemonic, generateWalletRootKey, } from './lib/cardanoCrypto/cryptoWallet'; -import { cip8Sign, v4PublicToV2, makeCip8Key, buildCoseSign1FromSignature } from './lib/cardanoCrypto/utils'; +import { buildCoseSign1FromSignature, cip8Sign, makeCip8Key, v4PublicToV2 } from './lib/cardanoCrypto/utils'; import { isValidBip39Mnemonic, } from './lib/cardanoCrypto/wallet'; import type { CardanoSignTransaction } from 'trezor-connect-flow'; import { createTrezorSignTxPayload, toTrezorSignRequest, } from './transactions/shelley/trezorTx'; @@ -129,10 +129,10 @@ import type { AddressRowWithPath, } from './lib/storage/bridge/traitUtils'; import { getAllAddressesForDisplay, getAllAddressesForWallet, } from './lib/storage/bridge/traitUtils'; import { asAddressedUtxo, + cardanoMinAdaRequiredFromAssets, convertAdaTransactionsToExportRows, multiTokenFromCardanoValue, multiTokenFromRemote, - cardanoMinAdaRequiredFromAssets, } from './transactions/utils'; import type { TransactionExportRow } from '../export'; @@ -147,7 +147,8 @@ import type { SendTokenList, } from '../common/types'; import { - getCardanoHaskellBaseConfig, getCardanoHaskellBaseConfigCombined, + getCardanoHaskellBaseConfig, + getCardanoHaskellBaseConfigCombined, getNetworkById, } from './lib/storage/database/prepackaged/networks'; import { toSenderUtxos } from './transactions/transfer/utils'; @@ -230,10 +231,6 @@ export type SignAndBroadcastFunc = ( // createTrezorSignTxData -export type CreateTrezorSignTxDataRequest = {| - signRequest: HaskellShelleyTxSignRequest, - network: $ReadOnly, -|}; export type CreateTrezorSignTxDataResponse = {| // https://github.com/trezor/connect/blob/develop/docs/methods/cardanoSignTransaction.md trezorSignTxPayload: $Exact, @@ -751,9 +748,10 @@ export default class AdaApi { } } - createTrezorSignTxData( - request: CreateTrezorSignTxDataRequest - ): CreateTrezorSignTxDataResponse { + createTrezorSignTxData(request: {| + signRequest: HaskellShelleyTxSignRequest, + network: $ReadOnly, + |}): CreateTrezorSignTxDataResponse { try { Logger.debug(`${nameof(AdaApi)}::${nameof(this.createTrezorSignTxData)} called`); diff --git a/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js b/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js index e6fbb91db8..ee0df74432 100644 --- a/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js +++ b/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js @@ -100,7 +100,7 @@ export default class AdaWalletsStore extends Store { const { wallet, signRequest } = request.broadcastRequest.trezor; broadcastRequest = async () => { return await this.stores.substores.ada.trezorSend.signAndBroadcast({ - params: { signRequest }, + signRequest, wallet, }); }; diff --git a/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js b/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js index 16b7a00a51..5af32abbf9 100644 --- a/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js +++ b/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js @@ -98,9 +98,7 @@ export default class TrezorSendStore extends Store { } signAndBroadcast: {| - params: {| - signRequest: HaskellShelleyTxSignRequest, - |}, + signRequest: HaskellShelleyTxSignRequest, +wallet: { publicDeriverId: number, networkId: number, @@ -110,10 +108,11 @@ export default class TrezorSendStore extends Store { ... }, |} => Promise<{| txId: string |}> = async (request) => { + const { signRequest } = request; try { const network = getNetworkById(request.wallet.networkId); const trezorSignTxDataResp = this.api.ada.createTrezorSignTxData({ - ...request.params, + signRequest, network, }); @@ -153,13 +152,13 @@ export default class TrezorSendStore extends Store { let metadata; - if (request.params.signRequest.trezorTCatalystRegistrationTxSignData) { + if (signRequest.trezorTCatalystRegistrationTxSignData) { const { votingPublicKey, stakingKey: stakingKeyHex, paymentAddress, nonce, - } = request.params.signRequest.trezorTCatalystRegistrationTxSignData; + } = signRequest.trezorTCatalystRegistrationTxSignData; const auxDataSupplement = trezorSignTxResp.payload.auxiliaryDataSupplement; if ( @@ -187,18 +186,18 @@ export default class TrezorSendStore extends Store { // ).toString('hex') === // trezorSignTxResp.payload.auxiliaryDataSupplement.auxiliaryDataHash } else { - metadata = request.params.signRequest.metadata; + metadata = signRequest.metadata; } if (metadata) { - request.params.signRequest.self().set_auxiliary_data(metadata); + signRequest.self().set_auxiliary_data(metadata); } - const tx = request.params.signRequest.self().build_tx(); + const tx = signRequest.self().build_tx(); const signedTx = buildSignedTransaction( tx, - request.params.signRequest.senderUtxos, + signRequest.senderUtxos, trezorSignTxResp.payload.witnesses, publicKeyInfo, stakingKey, From 37360eecc7cc81932e88d8339c98064a90c6b33e Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Wed, 2 Oct 2024 18:49:38 +0300 Subject: [PATCH 11/20] raw tx signing/submitting for trezor --- .../app/stores/ada/send/TrezorSendStore.js | 68 +++++++++++++++++-- 1 file changed, 64 insertions(+), 4 deletions(-) diff --git a/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js b/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js index 5af32abbf9..06325e3238 100644 --- a/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js +++ b/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js @@ -12,13 +12,18 @@ import { ROUTES } from '../../../routes-config'; import { HaskellShelleyTxSignRequest } from '../../../api/ada/transactions/shelley/HaskellShelleyTxSignRequest'; import type { ActionsMap } from '../../../actions/index'; import type { StoresMap } from '../../index'; -import { buildSignedTransaction } from '../../../api/ada/transactions/shelley/trezorTx'; +import { + buildConnectorSignedTransaction, + buildSignedTransaction +} from '../../../api/ada/transactions/shelley/trezorTx'; import { RustModule } from '../../../api/ada/lib/cardanoCrypto/rustLoader'; import { generateRegistrationMetadata } from '../../../api/ada/lib/cardanoCrypto/catalyst'; import { derivePublicByAddressing } from '../../../api/ada/lib/cardanoCrypto/deriveByAddressing'; import type { Addressing } from '../../../api/ada/lib/storage/models/PublicDeriver/interfaces'; import { getNetworkById } from '../../../api/ada/lib/storage/database/prepackaged/networks.js'; import { broadcastTransaction } from '../../../api/thunk'; +import { transactionHexToBodyHex, transactionHexToHash } from '../../../api/ada/lib/cardanoCrypto/utils'; +import { fail } from '../../../coreUtils'; /** Note: Handles Trezor Signing */ export default class TrezorSendStore extends Store { @@ -133,9 +138,7 @@ export default class TrezorSendStore extends Store { } const publicKeyInfo = { - key: RustModule.WalletV4.Bip32PublicKey.from_bytes( - Buffer.from(request.wallet.publicKey, 'hex') - ), + key: RustModule.WalletV4.Bip32PublicKey.from_hex(request.wallet.publicKey), addressing: { startLevel: 1, path: request.wallet.pathToPublic, @@ -219,6 +222,63 @@ export default class TrezorSendStore extends Store { } } + signAndBroadcastRawTx: {| + rawTxHex: string, + addressingMap: string => (void | $PropertyType), + publicDeriverId: number, + networkId: number, + |} => Promise<{| txId: string |}> = async (request) => { + const { rawTxHex } = request; + try { + const network = getNetworkById(request.networkId); + + const txBodyHex = transactionHexToBodyHex(rawTxHex); + const txId = transactionHexToHash(rawTxHex); + + const addressedUtxos = await this.stores.wallets.getAddressedUtxos(); + + const response = this.api.ada.createHwSignTxDataFromRawTx('trezor', { + txBodyHex, + network, + addressingMap: request.addressingMap, + senderUtxos: addressedUtxos, + }); + + const trezorSignTxPayload = response.hw === 'trezor' ? response.result.trezorSignTxPayload + : fail('Unecpected response type from `createHwSignTxDataFromRawTx` for trezor: ' + JSON.stringify(response)); + + const trezorSignTxResp = await wrapWithFrame(trezor => { + return trezor.cardanoSignTransaction( + JSON.parse(JSON.stringify({ ...trezorSignTxPayload })) + ); + }); + + if (trezorSignTxResp && trezorSignTxResp.payload && trezorSignTxResp.payload.error != null) { + // this Error will be converted to LocalizableError() + // noinspection ExceptionCaughtLocallyJS + throw new Error(trezorSignTxResp.payload.error); + } + if (!trezorSignTxResp.success) { + // noinspection ExceptionCaughtLocallyJS + throw new Error(`${nameof(TrezorSendStore)}::${nameof(this.signAndBroadcast)} should never happen`); + } + + const signedTxHex = buildConnectorSignedTransaction( + rawTxHex, + trezorSignTxResp.payload.witnesses, + ); + + await broadcastTransaction({ + publicDeriverId: request.publicDeriverId, + signedTxHex, + }); + return { txId }; + } catch (error) { + Logger.error(`${nameof(TrezorSendStore)}::${nameof(this.signAndBroadcast)} error: ` + stringifyError(error)); + throw new convertToLocalizableError(error); + } + } + _cancel: void => void = () => { if (!this.isActionProcessing) { this.actions.dialogs.closeActiveDialog.trigger(); From a28f6868ca35dbc4339016b3fabed1ec7cdb968e Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Wed, 2 Oct 2024 18:59:42 +0300 Subject: [PATCH 12/20] hw api refactor --- .../app/stores/ada/AdaWalletsStore.js | 4 +- .../app/stores/ada/send/LedgerSendStore.js | 29 +++++------- .../app/stores/ada/send/TrezorSendStore.js | 45 ++++++++++++++++++- 3 files changed, 58 insertions(+), 20 deletions(-) diff --git a/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js b/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js index ee0df74432..423cc0b4cf 100644 --- a/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js +++ b/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js @@ -90,7 +90,7 @@ export default class AdaWalletsStore extends Store { const { wallet, signRequest } = request.broadcastRequest.ledger; broadcastRequest = async () => { return await this.stores.substores.ada.ledgerSend.signAndBroadcastFromWallet({ - params: { signRequest }, + signRequest, wallet, }); }; @@ -99,7 +99,7 @@ export default class AdaWalletsStore extends Store { } else if (request.broadcastRequest.trezor) { const { wallet, signRequest } = request.broadcastRequest.trezor; broadcastRequest = async () => { - return await this.stores.substores.ada.trezorSend.signAndBroadcast({ + return await this.stores.substores.ada.trezorSend.signAndBroadcastFromWallet({ signRequest, wallet, }); diff --git a/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js b/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js index 92dacbb51f..38d1554618 100644 --- a/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js +++ b/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js @@ -148,9 +148,7 @@ export default class LedgerSendStore extends Store { /** Generates a payload with Ledger format and tries Send ADA using Ledger signing */ signAndBroadcastFromWallet: {| - params: {| - signRequest: HaskellShelleyTxSignRequest | string, - |}, + signRequest: HaskellShelleyTxSignRequest | string, +wallet: { publicDeriverId: number, publicKey: string, @@ -161,12 +159,10 @@ export default class LedgerSendStore extends Store { }, |} => Promise<{| txId: string |}> = async (request) => { try { - Logger.debug(`${nameof(LedgerSendStore)}::${nameof(this.signAndBroadcast)} called: ` + stringifyData(request.params)); + Logger.debug(`${nameof(LedgerSendStore)}::${nameof(this.signAndBroadcastFromWallet)} called: ` + stringifyData(request)); const publicKeyInfo = { - key: RustModule.WalletV4.Bip32PublicKey.from_bytes( - Buffer.from(request.wallet.publicKey, 'hex') - ), + key: RustModule.WalletV4.Bip32PublicKey.from_hex(request.wallet.publicKey), addressing: { startLevel: 1, path: request.wallet.pathToPublic, @@ -175,17 +171,19 @@ export default class LedgerSendStore extends Store { const expectedSerial = request.wallet.hardwareWalletDeviceId || ''; - const signRequest = request.params.signRequest; + const signRequest = request.signRequest; + + const addressingMap = genAddressingLookup( + request.wallet.networkId, + this.stores.addresses.addressSubgroupMap + ); if (typeof signRequest === 'string') { return this.signAndBroadcastRawTx({ rawTxHex: signRequest, publicKey: publicKeyInfo, publicDeriverId: request.wallet.publicDeriverId, - addressingMap: genAddressingLookup( - request.wallet.networkId, - this.stores.addresses.addressSubgroupMap - ), + addressingMap, expectedSerial, networkId: request.wallet.networkId, }); @@ -194,17 +192,14 @@ export default class LedgerSendStore extends Store { signRequest, publicKey: publicKeyInfo, publicDeriverId: request.wallet.publicDeriverId, - addressingMap: genAddressingLookup( - request.wallet.networkId, - this.stores.addresses.addressSubgroupMap - ), + addressingMap, expectedSerial, networkId: request.wallet.networkId, }); } } catch (error) { - Logger.error(`${nameof(LedgerSendStore)}::${nameof(this.signAndBroadcast)} error: ` + stringifyError(error)); + Logger.error(`${nameof(LedgerSendStore)}::${nameof(this.signAndBroadcastFromWallet)} error: ` + stringifyError(error)); throw new convertToLocalizableError(error); } }; diff --git a/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js b/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js index 06325e3238..3d73398979 100644 --- a/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js +++ b/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js @@ -5,7 +5,7 @@ import Store from '../../base/Store'; import { wrapWithFrame } from '../../lib/TrezorWrapper'; import type { SendUsingTrezorParams } from '../../../actions/ada/trezor-send-actions'; -import { Logger, stringifyError, } from '../../../utils/logging'; +import { Logger, stringifyData, stringifyError, } from '../../../utils/logging'; import { convertToLocalizableError } from '../../../domain/TrezorLocalizedError'; import LocalizableError from '../../../i18n/LocalizableError'; import { ROUTES } from '../../../routes-config'; @@ -24,6 +24,7 @@ import { getNetworkById } from '../../../api/ada/lib/storage/database/prepackage import { broadcastTransaction } from '../../../api/thunk'; import { transactionHexToBodyHex, transactionHexToHash } from '../../../api/ada/lib/cardanoCrypto/utils'; import { fail } from '../../../coreUtils'; +import { genAddressingLookup } from '../../stateless/addressStores'; /** Note: Handles Trezor Signing */ export default class TrezorSendStore extends Store { @@ -102,6 +103,48 @@ export default class TrezorSendStore extends Store { } } + signAndBroadcastFromWallet: {| + signRequest: HaskellShelleyTxSignRequest | string, + +wallet: { + publicDeriverId: number, + networkId: number, + publicKey: string, + pathToPublic: Array, + stakingAddressing: Addressing, + ... + }, + |} => Promise<{| txId: string |}> = async (request) => { + try { + Logger.debug(`${nameof(TrezorSendStore)}::${nameof(this.signAndBroadcastFromWallet)} called: ` + stringifyData(request)); + + const { signRequest, wallet } = request; + + if (typeof signRequest === 'string') { + + const addressingMap = genAddressingLookup( + request.wallet.networkId, + this.stores.addresses.addressSubgroupMap + ); + + return this.signAndBroadcastRawTx({ + rawTxHex: signRequest, + addressingMap, + publicDeriverId: request.wallet.publicDeriverId, + networkId: request.wallet.networkId, + }) + } else { + return this.signAndBroadcast({ + signRequest, + wallet, + }); + } + + } catch (error) { + Logger.error(`${nameof(TrezorSendStore)}::${nameof(this.signAndBroadcastFromWallet)} error: ` + stringifyError(error)); + throw new convertToLocalizableError(error); + } + } + signAndBroadcast: {| signRequest: HaskellShelleyTxSignRequest, +wallet: { From 82c61381799386a8e91ce163e91c6a40f814c169 Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Thu, 3 Oct 2024 00:35:09 +0300 Subject: [PATCH 13/20] hw api refactor --- .../app/stores/ada/AdaWalletsStore.js | 69 ++++++++++++++- .../app/stores/ada/send/LedgerSendStore.js | 86 ++++++++++++------- .../app/stores/ada/send/TrezorSendStore.js | 71 ++++++++------- 3 files changed, 166 insertions(+), 60 deletions(-) diff --git a/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js b/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js index 423cc0b4cf..58577844d6 100644 --- a/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js +++ b/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js @@ -8,7 +8,7 @@ import { HaskellShelleyTxSignRequest } from '../../api/ada/transactions/shelley/ import type { ActionsMap } from '../../actions/index'; import type { StoresMap } from '../index'; import { HARD_DERIVATION_START } from '../../config/numbersConfig'; -import { createWallet } from '../../api/thunk'; +import { createWallet, signTransaction } from '../../api/thunk'; import type { Addressing, QueriedUtxo, @@ -130,6 +130,73 @@ export default class AdaWalletsStore extends Store { }); }; + adaSignTransactionHex: ({| + signRequest: + | {| + normal: {| + +wallet: { + publicDeriverId: number, + +plate: { TextPart: string, ... }, + ... + }, + transactionHex: string, + password: string, + |}, + |} + | {| + trezor: {| + transactionHex: string, + +wallet: { + publicDeriverId: number, + +plate: { TextPart: string, ... }, + publicKey: string, + pathToPublic: Array, + stakingAddressing: Addressing, + networkId: number, + hardwareWalletDeviceId: ?string, + ... + }, + |}, + |} + | {| + ledger: {| + transactionHex: string, + +wallet: { + publicDeriverId: number, + +plate: { TextPart: string, ... }, + stakingAddressing: Addressing, + publicKey: string, + pathToPublic: Array, + networkId: number, + hardwareWalletDeviceId: ?string, + ... + } + |}, + |}, + |}) => Promise<{| signedTxHex: string |}> = async request => { + if (request.signRequest.ledger) { + const { wallet, transactionHex } = request.signRequest.ledger; + return this.stores.substores.ada.ledgerSend + .signRawTxFromWallet({ rawTxHex: transactionHex, wallet }); + } else if (request.signRequest.trezor) { + const { wallet, transactionHex } = request.signRequest.trezor; + return this.stores.substores.ada.trezorSend + .signRawTxFromWallet({ rawTxHex: transactionHex, wallet }); + } else if (request.signRequest.normal) { + const { wallet, transactionHex, password } = request.signRequest.normal; + const signedTxHex = await signTransaction({ + publicDeriverId: wallet.publicDeriverId, + transactionHex, + password, + }); + return { signedTxHex }; + } else { + throw new Error( + `${nameof(AdaWalletsStore)}::${nameof(this.adaSendAndRefresh)} unhandled wallet type` + ); + }; + }; + // =================== WALLET RESTORATION ==================== // _startWalletCreation: ({| diff --git a/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js b/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js index 38d1554618..e1dfac8dfa 100644 --- a/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js +++ b/packages/yoroi-extension/app/stores/ada/send/LedgerSendStore.js @@ -148,7 +148,7 @@ export default class LedgerSendStore extends Store { /** Generates a payload with Ledger format and tries Send ADA using Ledger signing */ signAndBroadcastFromWallet: {| - signRequest: HaskellShelleyTxSignRequest | string, + signRequest: HaskellShelleyTxSignRequest, +wallet: { publicDeriverId: number, publicKey: string, @@ -178,25 +178,14 @@ export default class LedgerSendStore extends Store { this.stores.addresses.addressSubgroupMap ); - if (typeof signRequest === 'string') { - return this.signAndBroadcastRawTx({ - rawTxHex: signRequest, - publicKey: publicKeyInfo, - publicDeriverId: request.wallet.publicDeriverId, - addressingMap, - expectedSerial, - networkId: request.wallet.networkId, - }); - } else { - return this.signAndBroadcast({ - signRequest, - publicKey: publicKeyInfo, - publicDeriverId: request.wallet.publicDeriverId, - addressingMap, - expectedSerial, - networkId: request.wallet.networkId, - }); - } + return this.signAndBroadcast({ + signRequest, + publicKey: publicKeyInfo, + publicDeriverId: request.wallet.publicDeriverId, + addressingMap, + expectedSerial, + networkId: request.wallet.networkId, + }); } catch (error) { Logger.error(`${nameof(LedgerSendStore)}::${nameof(this.signAndBroadcastFromWallet)} error: ` + stringifyError(error)); @@ -335,17 +324,60 @@ export default class LedgerSendStore extends Store { } }; - signAndBroadcastRawTx: {| + + signRawTxFromWallet: {| + rawTxHex: string, + +wallet: { + publicDeriverId: number, + publicKey: string, + pathToPublic: Array, + networkId: number, + hardwareWalletDeviceId: ?string, + ... + }, + |} => Promise<{| signedTxHex: string |}> = async (request) => { + try { + Logger.debug(`${nameof(LedgerSendStore)}::${nameof(this.signRawTxFromWallet)} called: ` + stringifyData(request)); + + const publicKeyInfo = { + key: RustModule.WalletV4.Bip32PublicKey.from_hex(request.wallet.publicKey), + addressing: { + startLevel: 1, + path: request.wallet.pathToPublic, + }, + }; + + const expectedSerial = request.wallet.hardwareWalletDeviceId || ''; + + const addressingMap = genAddressingLookup( + request.wallet.networkId, + this.stores.addresses.addressSubgroupMap, + ); + + return this.signRawTx({ + rawTxHex: request.rawTxHex, + publicKey: publicKeyInfo, + addressingMap, + expectedSerial, + networkId: request.wallet.networkId, + }); + + } catch (error) { + Logger.error(`${nameof(LedgerSendStore)}::${nameof(this.signRawTxFromWallet)} error: ` + stringifyError(error)); + throw new convertToLocalizableError(error); + } + } + + signRawTx: {| rawTxHex: string, publicKey: {| key: RustModule.WalletV4.Bip32PublicKey, ...Addressing, |}, addressingMap: string => (void | $PropertyType), - publicDeriverId: number, networkId: number, expectedSerial: string | void, - |} => Promise<{| txId: string |}> = async (request) => { + |} => Promise<{| signedTxHex: string |}> = async (request) => { let ledgerConnect: ?LedgerConnect; try { @@ -360,7 +392,6 @@ export default class LedgerSendStore extends Store { const network = getNetworkById(request.networkId); const txBodyHex = transactionHexToBodyHex(rawTxHex); - const txId = transactionHexToHash(rawTxHex); const addressedUtxos = await this.stores.wallets.getAddressedUtxos(); @@ -393,12 +424,7 @@ export default class LedgerSendStore extends Store { request.publicKey, ); - await broadcastTransaction({ - publicDeriverId: request.publicDeriverId, - signedTxHex, - }); - - return { txId }; + return { signedTxHex }; } catch (error) { Logger.error(`${nameof(LedgerSendStore)}::${nameof(this.signAndBroadcast)} error: ` + stringifyError(error)); throw new convertToLocalizableError(error); diff --git a/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js b/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js index 3d73398979..b52c74c338 100644 --- a/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js +++ b/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js @@ -104,7 +104,7 @@ export default class TrezorSendStore extends Store { } signAndBroadcastFromWallet: {| - signRequest: HaskellShelleyTxSignRequest | string, + signRequest: HaskellShelleyTxSignRequest, +wallet: { publicDeriverId: number, networkId: number, @@ -119,25 +119,10 @@ export default class TrezorSendStore extends Store { const { signRequest, wallet } = request; - if (typeof signRequest === 'string') { - - const addressingMap = genAddressingLookup( - request.wallet.networkId, - this.stores.addresses.addressSubgroupMap - ); - - return this.signAndBroadcastRawTx({ - rawTxHex: signRequest, - addressingMap, - publicDeriverId: request.wallet.publicDeriverId, - networkId: request.wallet.networkId, - }) - } else { - return this.signAndBroadcast({ - signRequest, - wallet, - }); - } + return this.signAndBroadcast({ + signRequest, + wallet, + }); } catch (error) { Logger.error(`${nameof(TrezorSendStore)}::${nameof(this.signAndBroadcastFromWallet)} error: ` + stringifyError(error)); @@ -265,18 +250,50 @@ export default class TrezorSendStore extends Store { } } - signAndBroadcastRawTx: {| + + signRawTxFromWallet: {| + rawTxHex: string, + +wallet: { + publicDeriverId: number, + networkId: number, + publicKey: string, + pathToPublic: Array, + stakingAddressing: Addressing, + ... + }, + |} => Promise<{| signedTxHex: string |}> = async (request) => { + try { + Logger.debug(`${nameof(TrezorSendStore)}::${nameof(this.signRawTxFromWallet)} called: ` + stringifyData(request)); + + const { rawTxHex, wallet } = request; + + const addressingMap = genAddressingLookup( + request.wallet.networkId, + this.stores.addresses.addressSubgroupMap, + ); + + return this.signRawTx({ + rawTxHex, + addressingMap, + networkId: wallet.networkId, + }); + + } catch (error) { + Logger.error(`${nameof(TrezorSendStore)}::${nameof(this.signRawTxFromWallet)} error: ` + stringifyError(error)); + throw new convertToLocalizableError(error); + } + } + + signRawTx: {| rawTxHex: string, addressingMap: string => (void | $PropertyType), - publicDeriverId: number, networkId: number, - |} => Promise<{| txId: string |}> = async (request) => { + |} => Promise<{| signedTxHex: string |}> = async (request) => { const { rawTxHex } = request; try { const network = getNetworkById(request.networkId); const txBodyHex = transactionHexToBodyHex(rawTxHex); - const txId = transactionHexToHash(rawTxHex); const addressedUtxos = await this.stores.wallets.getAddressedUtxos(); @@ -311,11 +328,7 @@ export default class TrezorSendStore extends Store { trezorSignTxResp.payload.witnesses, ); - await broadcastTransaction({ - publicDeriverId: request.publicDeriverId, - signedTxHex, - }); - return { txId }; + return { signedTxHex }; } catch (error) { Logger.error(`${nameof(TrezorSendStore)}::${nameof(this.signAndBroadcast)} error: ` + stringifyError(error)); throw new convertToLocalizableError(error); From a135b0d5a48a0835bd26eab3fe85c99434768366 Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Thu, 3 Oct 2024 00:35:30 +0300 Subject: [PATCH 14/20] swap cancel signing update --- .../app/components/swap/CancelOrderDialog.js | 33 ++++++++++--------- .../app/containers/swap/orders/OrdersPage.js | 20 ++++++++--- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/packages/yoroi-extension/app/components/swap/CancelOrderDialog.js b/packages/yoroi-extension/app/components/swap/CancelOrderDialog.js index 3b3d041445..aec30e1c5c 100644 --- a/packages/yoroi-extension/app/components/swap/CancelOrderDialog.js +++ b/packages/yoroi-extension/app/components/swap/CancelOrderDialog.js @@ -70,6 +70,7 @@ export default function CancelSwapOrderDialog({ ); } + const isPasswordWallet = walletType === 'mnemonic'; return ( } - - { - setIncorrectPassword(false); - setPassword(e.target.value); - }} - error={isIncorrectPassword && 'Incorrect password!'} - disabled={isLoading} - /> - + {isPasswordWallet ? ( + + { + setIncorrectPassword(false); + setPassword(e.target.value); + }} + error={isIncorrectPassword && 'Incorrect password!'} + disabled={isLoading} + /> + + ) : null} diff --git a/packages/yoroi-extension/app/containers/swap/orders/OrdersPage.js b/packages/yoroi-extension/app/containers/swap/orders/OrdersPage.js index a09bbd106f..6a9ab5f9c8 100644 --- a/packages/yoroi-extension/app/containers/swap/orders/OrdersPage.js +++ b/packages/yoroi-extension/app/containers/swap/orders/OrdersPage.js @@ -267,11 +267,21 @@ export default function SwapOrdersPage(props: StoresAndActionsProps): Node { return; } setCancellationState({ order, signedCollateralReorgTx, tx, isSubmitting: true }); - const signedCancelTx = await signTransaction({ - publicDeriverId: wallet.publicDeriverId, - password, - transactionHex: tx.cbor - }); + + const transactionHex = tx.cbor; + const walletType: string = wallet.type; + + const baseSignRequest = { wallet, transactionHex }; + const signRequest = wallet.isHardware + ? { [walletType]: baseSignRequest } + : { normal: { ...baseSignRequest, password } }; + + const signingResult = + // $FlowIgnore[incompatible-call] + await props.stores.substores.ada.wallets.adaSignTransactionHex({ signRequest }); + + const signedCancelTx = signingResult.signedTxHex; + const signedTransactionHexes = signedCollateralReorgTx != null ? [signedCollateralReorgTx, signedCancelTx] From 1004318292ab976f7cfefb0071be12f3dda4719e Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Thu, 3 Oct 2024 12:56:31 +0300 Subject: [PATCH 15/20] hw api refactoring --- .../app/containers/swap/orders/OrdersPage.js | 24 ++++----------- .../app/stores/ada/AdaWalletsStore.js | 29 +++++++++++++++++-- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/packages/yoroi-extension/app/containers/swap/orders/OrdersPage.js b/packages/yoroi-extension/app/containers/swap/orders/OrdersPage.js index 6a9ab5f9c8..21025168c9 100644 --- a/packages/yoroi-extension/app/containers/swap/orders/OrdersPage.js +++ b/packages/yoroi-extension/app/containers/swap/orders/OrdersPage.js @@ -245,11 +245,10 @@ export default function SwapOrdersPage(props: StoresAndActionsProps): Node { console.log('Reorg transaction is not available. Ignoring.'); return; } - const signedCollateralReorgTx = await signTransaction({ - publicDeriverId: wallet.publicDeriverId, - password, - transactionHex: collateralReorgTx.cbor - }); + + const { signedTxHex: signedCollateralReorgTx } = await props.stores.substores.ada.wallets + .adaSignTransactionHexFromWallet({ wallet, transactionHex: collateralReorgTx.cbor, password }); + setCancellationState({ order, signedCollateralReorgTx, tx }); }; @@ -268,19 +267,8 @@ export default function SwapOrdersPage(props: StoresAndActionsProps): Node { } setCancellationState({ order, signedCollateralReorgTx, tx, isSubmitting: true }); - const transactionHex = tx.cbor; - const walletType: string = wallet.type; - - const baseSignRequest = { wallet, transactionHex }; - const signRequest = wallet.isHardware - ? { [walletType]: baseSignRequest } - : { normal: { ...baseSignRequest, password } }; - - const signingResult = - // $FlowIgnore[incompatible-call] - await props.stores.substores.ada.wallets.adaSignTransactionHex({ signRequest }); - - const signedCancelTx = signingResult.signedTxHex; + const { signedTxHex: signedCancelTx } = await props.stores.substores.ada.wallets + .adaSignTransactionHexFromWallet({ wallet, transactionHex: tx.cbor, password }); const signedTransactionHexes = signedCollateralReorgTx != null diff --git a/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js b/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js index 58577844d6..6cc30c3c2a 100644 --- a/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js +++ b/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js @@ -130,6 +130,31 @@ export default class AdaWalletsStore extends Store { }); }; + adaSignTransactionHexFromWallet: ({| + transactionHex: string, + +wallet: { + publicDeriverId: number, + +plate: { TextPart: string, ... }, + publicKey: string, + pathToPublic: Array, + stakingAddressing: Addressing, + networkId: number, + hardwareWalletDeviceId: ?string, + type: 'trezor' | 'ledger' | 'mnemonic', + isHardware: boolean, + ... + }, + password: string, + |}) => Promise<{| signedTxHex: string |}> = async ({ wallet, transactionHex, password }) => { + const walletType: string = wallet.type; + const baseSignRequest = { wallet, transactionHex }; + const signRequest = wallet.isHardware + ? { [walletType]: baseSignRequest } + : { normal: { ...baseSignRequest, password } }; + // $FlowIgnore[incompatible-call] + return this.adaSignTransactionHex({ signRequest }); + } + adaSignTransactionHex: ({| signRequest: | {| @@ -192,9 +217,9 @@ export default class AdaWalletsStore extends Store { return { signedTxHex }; } else { throw new Error( - `${nameof(AdaWalletsStore)}::${nameof(this.adaSendAndRefresh)} unhandled wallet type` + `${nameof(AdaWalletsStore)}::${nameof(this.adaSignTransactionHex)} unhandled wallet type` ); - }; + } }; // =================== WALLET RESTORATION ==================== // From dc3a4a1d0932e92aaa17d9c51b3161b1dd41e630 Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Thu, 3 Oct 2024 16:50:09 +0300 Subject: [PATCH 16/20] hw api refactoring --- .../app/containers/swap/asset-swap/ConfirmSwapTransaction.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/yoroi-extension/app/containers/swap/asset-swap/ConfirmSwapTransaction.js b/packages/yoroi-extension/app/containers/swap/asset-swap/ConfirmSwapTransaction.js index 9ae4a20a9f..7a2c183cbd 100644 --- a/packages/yoroi-extension/app/containers/swap/asset-swap/ConfirmSwapTransaction.js +++ b/packages/yoroi-extension/app/containers/swap/asset-swap/ConfirmSwapTransaction.js @@ -107,7 +107,7 @@ export default function ConfirmSwapTransaction({ }, []); return ( - + Confirm swap transaction @@ -219,7 +219,7 @@ export default function ConfirmSwapTransaction({ /> )} - + ); } From 3d62c8a42eea376723153f3918781dcc352d915f Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Thu, 3 Oct 2024 17:25:43 +0300 Subject: [PATCH 17/20] lint fixes --- .../app/containers/swap/orders/OrdersPage.js | 1 - .../app/stores/ada/AdaWalletsStore.js | 13 ++++++++----- .../app/stores/ada/send/TrezorSendStore.js | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/yoroi-extension/app/containers/swap/orders/OrdersPage.js b/packages/yoroi-extension/app/containers/swap/orders/OrdersPage.js index 21025168c9..38d33a800a 100644 --- a/packages/yoroi-extension/app/containers/swap/orders/OrdersPage.js +++ b/packages/yoroi-extension/app/containers/swap/orders/OrdersPage.js @@ -27,7 +27,6 @@ import { Quantities } from '../../../utils/quantities'; import ExplorableHashContainer from '../../widgets/ExplorableHashContainer'; import { useRichOrders } from './hooks'; import { createFormattedTokenValues } from './util'; -import { signTransaction } from '../../../api/thunk'; import NoCompleteOrders from './NoCompleteOrders'; import NoOpenOrders from './NoOpenOrders'; import { LoadingCompletedOrders, LoadingOpenOrders } from './OrdersPlaceholders'; diff --git a/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js b/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js index 6cc30c3c2a..1f0aee9f2f 100644 --- a/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js +++ b/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js @@ -208,18 +208,21 @@ export default class AdaWalletsStore extends Store { return this.stores.substores.ada.trezorSend .signRawTxFromWallet({ rawTxHex: transactionHex, wallet }); } else if (request.signRequest.normal) { - const { wallet, transactionHex, password } = request.signRequest.normal; + const { + wallet, + transactionHex, + password + } = request.signRequest.normal; const signedTxHex = await signTransaction({ publicDeriverId: wallet.publicDeriverId, transactionHex, password, }); return { signedTxHex }; - } else { - throw new Error( - `${nameof(AdaWalletsStore)}::${nameof(this.adaSignTransactionHex)} unhandled wallet type` - ); } + throw new Error( + `${nameof(AdaWalletsStore)}::${nameof(this.adaSignTransactionHex)} unhandled wallet type` + ); }; // =================== WALLET RESTORATION ==================== // diff --git a/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js b/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js index b52c74c338..eff1b4799e 100644 --- a/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js +++ b/packages/yoroi-extension/app/stores/ada/send/TrezorSendStore.js @@ -22,7 +22,7 @@ import { derivePublicByAddressing } from '../../../api/ada/lib/cardanoCrypto/der import type { Addressing } from '../../../api/ada/lib/storage/models/PublicDeriver/interfaces'; import { getNetworkById } from '../../../api/ada/lib/storage/database/prepackaged/networks.js'; import { broadcastTransaction } from '../../../api/thunk'; -import { transactionHexToBodyHex, transactionHexToHash } from '../../../api/ada/lib/cardanoCrypto/utils'; +import { transactionHexToBodyHex } from '../../../api/ada/lib/cardanoCrypto/utils'; import { fail } from '../../../coreUtils'; import { genAddressingLookup } from '../../stateless/addressStores'; From 828adab55e8427e55a68dcbf5bd625fffafd4bce Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Thu, 3 Oct 2024 17:52:09 +0300 Subject: [PATCH 18/20] lint fixes --- .../app/stores/ada/AdaWalletsStore.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js b/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js index 1f0aee9f2f..bcb8e77a37 100644 --- a/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js +++ b/packages/yoroi-extension/app/stores/ada/AdaWalletsStore.js @@ -203,16 +203,14 @@ export default class AdaWalletsStore extends Store { const { wallet, transactionHex } = request.signRequest.ledger; return this.stores.substores.ada.ledgerSend .signRawTxFromWallet({ rawTxHex: transactionHex, wallet }); - } else if (request.signRequest.trezor) { + } + if (request.signRequest.trezor) { const { wallet, transactionHex } = request.signRequest.trezor; return this.stores.substores.ada.trezorSend .signRawTxFromWallet({ rawTxHex: transactionHex, wallet }); - } else if (request.signRequest.normal) { - const { - wallet, - transactionHex, - password - } = request.signRequest.normal; + } + if (request.signRequest.normal) { + const { wallet, transactionHex, password } = request.signRequest.normal; const signedTxHex = await signTransaction({ publicDeriverId: wallet.publicDeriverId, transactionHex, From 49b63127ce1e276cca27eb8da9574a39f3801c34 Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Thu, 3 Oct 2024 18:18:03 +0300 Subject: [PATCH 19/20] lint fixes --- packages/yoroi-extension/app/containers/SidebarContainer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/yoroi-extension/app/containers/SidebarContainer.js b/packages/yoroi-extension/app/containers/SidebarContainer.js index d7745dad25..5fd830a663 100644 --- a/packages/yoroi-extension/app/containers/SidebarContainer.js +++ b/packages/yoroi-extension/app/containers/SidebarContainer.js @@ -59,7 +59,7 @@ class SidebarContainer extends Component { } categoryFeatureFlagEnabled(category: SidebarCategoryRevamp): boolean { - return category.featureFlagName == null || this.state.featureFlags[category.featureFlagName]; + return category.featureFlagName == null || this.state.featureFlags[category.featureFlagName] === true; } render(): Node { From 3e1a73ef82e019181bcaa12c65f30e5d1d18d85f Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Thu, 3 Oct 2024 19:02:49 +0300 Subject: [PATCH 20/20] trezor lib rollback --- packages/yoroi-extension/package-lock.json | 894 ++++----------------- packages/yoroi-extension/package.json | 2 +- 2 files changed, 148 insertions(+), 748 deletions(-) diff --git a/packages/yoroi-extension/package-lock.json b/packages/yoroi-extension/package-lock.json index 2ad5dec22c..cc8ed07a43 100644 --- a/packages/yoroi-extension/package-lock.json +++ b/packages/yoroi-extension/package-lock.json @@ -85,7 +85,7 @@ "semver": "7.6.0", "stream-browserify": "3.0.0", "tinycolor2": "1.4.2", - "trezor-connect-flow": "Emurgo/trezor-connect-flow#9f8ae584593a5e0f302fd4dd3b0968ccf6f73513", + "trezor-connect-flow": "Emurgo/trezor-connect-flow#92d6d8c8faef25c0ea1d481aa1ecb4ba77ce539c", "ts-loader": "^9.5.1", "typescript": "^5.4.5", "ua-parser-js": "1.0.37", @@ -2805,70 +2805,6 @@ "node": ">=8" } }, - "node_modules/@ethereumjs/common": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-4.4.0.tgz", - "integrity": "sha512-Fy5hMqF6GsE6DpYTyqdDIJPJgUtDn4dL120zKw+Pswuo+iLyBsEYuSyzMw6NVzD2vDzcBG9fE4+qX4X2bPc97w==", - "dependencies": { - "@ethereumjs/util": "^9.1.0" - } - }, - "node_modules/@ethereumjs/rlp": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz", - "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", - "bin": { - "rlp": "bin/rlp.cjs" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@ethereumjs/tx": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-5.4.0.tgz", - "integrity": "sha512-SCHnK7m/AouZ7nyoR0MEXw1OO/tQojSbp88t8oxhwes5iZkZCtfFdUrJaiIb72qIpH2FVw6s1k1uP7LXuH7PsA==", - "dependencies": { - "@ethereumjs/common": "^4.4.0", - "@ethereumjs/rlp": "^5.0.2", - "@ethereumjs/util": "^9.1.0", - "ethereum-cryptography": "^2.2.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@ethereumjs/util": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-9.1.0.tgz", - "integrity": "sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==", - "dependencies": { - "@ethereumjs/rlp": "^5.0.2", - "ethereum-cryptography": "^2.2.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@fivebinaries/coin-selection": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@fivebinaries/coin-selection/-/coin-selection-2.2.1.tgz", - "integrity": "sha512-iYFsYr7RY7TEvTqP9NKR4p/yf3Iybf9abUDR7lRjzanGsrLwVsREvIuyE05iRYFrvqarlk+gWRPsdR1N2hUBrg==", - "dependencies": { - "@emurgo/cardano-serialization-lib-browser": "^11.5.0", - "@emurgo/cardano-serialization-lib-nodejs": "11.5.0" - } - }, - "node_modules/@fivebinaries/coin-selection/node_modules/@emurgo/cardano-serialization-lib-browser": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-browser/-/cardano-serialization-lib-browser-11.5.0.tgz", - "integrity": "sha512-qchOJ9NYDUz10tzs5r5QhP9hK0p+ZOlRiBwPdTAxqAYLw/8emYBkQQLaS8T1DF6EkeudyrgS00ym5Trw1fo4iA==" - }, - "node_modules/@fivebinaries/coin-selection/node_modules/@emurgo/cardano-serialization-lib-nodejs": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-11.5.0.tgz", - "integrity": "sha512-IlVABlRgo9XaTR1NunwZpWcxnfEv04ba2l1vkUz4S1W7Jt36F4CtffP+jPeqBZGnAe+fnUwo0XjIJC3ZTNToNQ==" - }, "node_modules/@floating-ui/core": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", @@ -3965,14 +3901,6 @@ "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "dev": true }, - "node_modules/@mobily/ts-belt": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@mobily/ts-belt/-/ts-belt-3.13.1.tgz", - "integrity": "sha512-K5KqIhPI/EoCTbA6CGbrenM9s41OouyK8A03fGJJcla/zKucsgLbz8HNbeseoLarRPgyWJsUyCYqFhI7t3Ra9Q==", - "engines": { - "node": ">= 10.*" - } - }, "node_modules/@mui/base": { "version": "5.0.0-beta.40", "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", @@ -4427,31 +4355,6 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, - "node_modules/@noble/curves": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", - "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", - "dependencies": { - "@noble/hashes": "1.5.0" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/curves/node_modules/@noble/hashes": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", - "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@noble/hashes": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", @@ -5805,42 +5708,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@scure/bip32": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", - "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", - "dependencies": { - "@noble/curves": "~1.4.0", - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32/node_modules/@noble/curves": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", - "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip39": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", - "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", - "dependencies": { - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@sentry/core": { "version": "6.19.7", "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.7.tgz", @@ -5932,11 +5799,6 @@ "integrity": "sha512-sBSO19KzdrJCM3gdx6eIxV8M9Gxfgg6iDQmH5TIAGaUu+X9VDdsINXJOnoiZ1Kx3TrHdH4bt5UVglkjsEGBcvw==", "dev": true }, - "node_modules/@sinclair/typebox": { - "version": "0.31.28", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.31.28.tgz", - "integrity": "sha512-/s55Jujywdw/Jpan+vsy6JZs1z2ZTGxTmbZTPiuSL2wz9mfzA2gN1zzaqmvfi4pq+uOt7Du85fkiwv5ymW84aQ==" - }, "node_modules/@sindresorhus/is": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz", @@ -5967,55 +5829,6 @@ "@sinonjs/commons": "^1.7.0" } }, - "node_modules/@solana/buffer-layout": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", - "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", - "dependencies": { - "buffer": "~6.0.3" - }, - "engines": { - "node": ">=5.10" - } - }, - "node_modules/@solana/web3.js": { - "version": "1.95.3", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.95.3.tgz", - "integrity": "sha512-O6rPUN0w2fkNqx/Z3QJMB9L225Ex10PRDH8bTaIUPZXMPV0QP8ZpPvjQnXK+upUczlRgzHzd6SjKIha1p+I6og==", - "dependencies": { - "@babel/runtime": "^7.25.0", - "@noble/curves": "^1.4.2", - "@noble/hashes": "^1.4.0", - "@solana/buffer-layout": "^4.0.1", - "agentkeepalive": "^4.5.0", - "bigint-buffer": "^1.1.5", - "bn.js": "^5.2.1", - "borsh": "^0.7.0", - "bs58": "^4.0.1", - "buffer": "6.0.3", - "fast-stable-stringify": "^1.0.0", - "jayson": "^4.1.1", - "node-fetch": "^2.7.0", - "rpc-websockets": "^9.0.2", - "superstruct": "^2.0.2" - } - }, - "node_modules/@solana/web3.js/node_modules/@babel/runtime": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", - "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@solana/web3.js/node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", @@ -6223,19 +6036,6 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@swc/helpers": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", - "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@swc/helpers/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" - }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", @@ -6258,77 +6058,43 @@ } }, "node_modules/@trezor/analytics": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.2.0.tgz", - "integrity": "sha512-q3lJtHL0tXDEbjl/pENpmUVzVcTd9NW4G2gskY2OKLsUykWP0pqN+9YX41C/f2TvMePVEA67kzXTm9US2sB2eA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.0.5.tgz", + "integrity": "sha512-XpgAsQDi8uZ+PmfCS6KUn+frUqR1ckOY9NdeC0PMGmkTzWm47oatvoyLSy2umd30T9M4h1LJECBqA80XpEV5MA==", "dependencies": { - "@trezor/env-utils": "1.2.0", - "@trezor/utils": "9.2.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" + "@trezor/env-utils": "1.0.4", + "@trezor/utils": "9.0.11" } }, "node_modules/@trezor/blockchain-link": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.3.0.tgz", - "integrity": "sha512-kuDHXIVhiTzpCmqoCH3zzCtM2BK+MEIvlj+GpA9VHPQbMGM55YU6c7M2jtq3vbw1XdtyvmvTD/s7Y8/WZR+IMg==", - "dependencies": { - "@solana/buffer-layout": "^4.0.1", - "@solana/web3.js": "^1.95.0", - "@trezor/blockchain-link-types": "1.2.0", - "@trezor/blockchain-link-utils": "1.2.0", - "@trezor/utils": "9.2.0", - "@trezor/utxo-lib": "2.2.0", - "@types/web": "^0.0.138", + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.1.15.tgz", + "integrity": "sha512-Y7QsggFUGk84yKY06eSuS3oTNwH+chz0fuCWMs7aKr4TxXsxILNwzoYg7Erecf+WZuydAdmjZRDT4QbmMUc65g==", + "dependencies": { + "@trezor/blockchain-link-types": "1.0.4", + "@trezor/blockchain-link-utils": "1.0.5", + "@trezor/utils": "9.0.11", + "@trezor/utxo-lib": "1.0.9", + "@types/web": "^0.0.100", + "bignumber.js": "^9.1.1", "events": "^3.3.0", "ripple-lib": "^1.10.1", "socks-proxy-agent": "6.1.1", - "ws": "^8.18.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" + "ws": "7.5.9" } }, "node_modules/@trezor/blockchain-link-types": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.2.0.tgz", - "integrity": "sha512-MCukIR4R6IuzAS4I51j9r0KRYXGBNzqMAPh0Fc9gerWvEC9rNrcsbYYDJy/7wYsiAxHRVYiqUyq9yTjUzUkdUA==", - "dependencies": { - "@solana/web3.js": "^1.95.0", - "@trezor/type-utils": "1.1.0", - "@trezor/utxo-lib": "2.2.0", - "socks-proxy-agent": "6.1.1" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/blockchain-link-types/node_modules/socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" - }, - "engines": { - "node": ">= 10" - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.0.4.tgz", + "integrity": "sha512-EBX8Fi38mqIRStOQsUNbma1RwEP57B104N77p1CPHML3Kxu6M0DVcTulFKJKAJ6laQyfULzTeUYfEdn//dCcFA==" }, "node_modules/@trezor/blockchain-link-utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.2.0.tgz", - "integrity": "sha512-C9nMCbj5qaMvKzUXfMb1+nfPZd6StTeIBpQBFEnvHOcCl6p4Meab1HUSVJ+Dcd1Y+y0mhlWGcOw8ZvBTLIB/Pg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.0.5.tgz", + "integrity": "sha512-Kj8Zuy22ApV+FcLhMFdFVMAjbJwS4VaXndkz1OgjF7UHTb0jEJtIk5JSe5KNbvNUsyGcEAn9vZ+RogfZETOVGw==", "dependencies": { - "@mobily/ts-belt": "^3.13.1", - "@solana/web3.js": "^1.95.0", - "@trezor/env-utils": "1.2.0", - "@trezor/utils": "9.2.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" + "@trezor/utils": "9.0.11", + "bignumber.js": "^9.1.1" } }, "node_modules/@trezor/blockchain-link/node_modules/socks-proxy-agent": { @@ -6344,88 +6110,51 @@ "node": ">= 10" } }, - "node_modules/@trezor/blockchain-link/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@trezor/connect": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.4.0.tgz", - "integrity": "sha512-gtY5coDzTEaJ/mrdXkRgpWARO/bWcEDFIuJMPjpEr27UzeTZy8loSFRA7jR3IsJXHyxJ7g8iLrd4jeuC9rdpow==", - "dependencies": { - "@babel/preset-typescript": "^7.24.7", - "@ethereumjs/common": "^4.3.0", - "@ethereumjs/tx": "^5.3.0", - "@fivebinaries/coin-selection": "2.2.1", - "@trezor/blockchain-link": "2.3.0", - "@trezor/blockchain-link-types": "1.2.0", - "@trezor/connect-analytics": "1.2.0", - "@trezor/connect-common": "0.2.0", - "@trezor/protobuf": "1.2.0", - "@trezor/protocol": "1.2.0", - "@trezor/schema-utils": "1.2.0", - "@trezor/transport": "1.3.0", - "@trezor/utils": "9.2.0", - "@trezor/utxo-lib": "2.2.0", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.1.1.tgz", + "integrity": "sha512-qIovN55BN5zciRiwIeEAHISjspy9jWkusBntk5z5SFmXw95KG6trms7GCodpbEuueboUS9Ts9xHorYwvqMmweg==", + "dependencies": { + "@trezor/blockchain-link": "2.1.15", + "@trezor/blockchain-link-types": "1.0.4", + "@trezor/connect-analytics": "1.0.4", + "@trezor/connect-common": "0.0.18", + "@trezor/transport": "1.1.14", + "@trezor/utils": "9.0.11", + "@trezor/utxo-lib": "1.0.9", + "bignumber.js": "^9.1.1", "blakejs": "^1.2.1", "bs58": "^5.0.0", "bs58check": "^3.0.1", - "cross-fetch": "^4.0.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" + "cross-fetch": "^3.1.6", + "events": "^3.3.0", + "randombytes": "2.1.0" } }, "node_modules/@trezor/connect-analytics": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@trezor/connect-analytics/-/connect-analytics-1.2.0.tgz", - "integrity": "sha512-tgbxoHQN8TUMjZ9k2XgIya3+nYcQFG+eUKNHzBe6zN2vyXuWF93jAph4uC42L+8YbYYya080BwCXjq0YfGZQgA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@trezor/connect-analytics/-/connect-analytics-1.0.4.tgz", + "integrity": "sha512-GLD5CCh6hcXsovxM2Fyns25GbGRCJ3lgFhWQ9WyqkFveI41cwMGCJZuXSyGSWCeMpazOYdvpgyXMqc22J2tatg==", "dependencies": { - "@trezor/analytics": "1.2.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" + "@trezor/analytics": "1.0.5" } }, "node_modules/@trezor/connect-common": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.2.0.tgz", - "integrity": "sha512-yfLbOOBQyKoXblLGTjhArv0AxAUrxm+asOYT+WFR+SocuIxFlWLOEk80HYfowucPJ1aN0W8T/kTOPCO+x9pd+Q==", + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.0.18.tgz", + "integrity": "sha512-tFian3z2ce/gQpjtFddr5NCKeJEEpV/t+Srb0Sa/STXqY/mTaADzti1aqp+/w4bL+1E2NNdAmCtsCl5AZc4a+A==", "dependencies": { - "@trezor/env-utils": "1.2.0", - "@trezor/utils": "9.2.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" + "@trezor/env-utils": "1.0.4" } }, "node_modules/@trezor/connect-web": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@trezor/connect-web/-/connect-web-9.4.0.tgz", - "integrity": "sha512-y3upWE6LA7Qq2uHiTcw3IOgT4vSYfG9fxUOBmtiEpBo5A0QHH7MNDk5eTVoKJ7Hcc2A/qOCR8aA++3hOXTZGrA==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@trezor/connect-web/-/connect-web-9.1.1.tgz", + "integrity": "sha512-FDwdARtUAITO80bahfU5gR4NS0q85rOvtyCCtwGgbH04JpOvmmoaNgYdXwfYfPaZCd2ZxZZ4omBermVPaE/wvA==", "dependencies": { - "@trezor/connect": "9.4.0", - "@trezor/connect-common": "0.2.0", - "@trezor/utils": "9.2.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" + "@trezor/connect": "9.1.1", + "@trezor/utils": "9.0.11", + "events": "^3.3.0" } }, "node_modules/@trezor/connect/node_modules/base-x": { @@ -6450,140 +6179,92 @@ "bs58": "^5.0.0" } }, - "node_modules/@trezor/connect/node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, "node_modules/@trezor/env-utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.2.0.tgz", - "integrity": "sha512-dbOR+PIeReZW4iooN+DQIMWloZAV92jMGOTzEdcY6NA63nCV8QUSxoNZwZtU9nVRPeJLrT6cVkVG80nZjlplow==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.0.4.tgz", + "integrity": "sha512-V9DdjpCH6hyN7AYPEIV1WR44fmgN6d3iF8DtHYNljnMFOaan167DDVq51ZpSPAnyppulIEhdK7kuLDW3KPcnpw==", "dependencies": { - "ua-parser-js": "^1.0.37" + "ua-parser-js": "^1.0.35" }, "peerDependencies": { - "expo-constants": "*", - "expo-localization": "*", - "react-native": "*", - "tslib": "^2.6.2" + "expo-localization": "^14.1.1", + "react-native": "0.71.8", + "react-native-config": "^1.5.0" }, "peerDependenciesMeta": { - "expo-constants": { - "optional": true - }, "expo-localization": { "optional": true }, "react-native": { "optional": true + }, + "react-native-config": { + "optional": true } } }, - "node_modules/@trezor/protobuf": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.2.0.tgz", - "integrity": "sha512-lc09F0MotgKx3W9+hPGY1f/egRgymNha6PQJTgTaXam/6yoP7MSA9obQlmvndJZymbdqLb9jbtigGuLgoxx6Bw==", - "dependencies": { - "@trezor/schema-utils": "1.2.0", - "protobufjs": "7.2.6" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/protocol": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@trezor/protocol/-/protocol-1.2.0.tgz", - "integrity": "sha512-2dE/deXGszpnOAF1FHvx1QG8pwkwCm2UqN3lfD0mBobpvTjkLqNROuOCwDN/HApMV0f3OYoIVR6Y3mgkRfc42w==", - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/schema-utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@trezor/schema-utils/-/schema-utils-1.2.0.tgz", - "integrity": "sha512-LUvcNpYjrkOyThVqzMobWXl7W39apyp5tlaj0LRkCQFRvpt1q8eXynjdLb2ofJTiwrMvLLFB4NRRpD3hBqu1LQ==", - "dependencies": { - "@sinclair/typebox": "^0.31.28", - "ts-mixer": "^6.0.3" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, "node_modules/@trezor/transport": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.3.0.tgz", - "integrity": "sha512-rgUwtH63PJRoOftkLcIo4/ElkaKq/2ban4wf2y/8k7lseU4OQXl5yxBJS7dGc3rVtxSBd3QhL6TY3h9icrJUVQ==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.1.14.tgz", + "integrity": "sha512-KRurYZonsPugKyCJFEEkDi82gjD1lwNDEaROCwQvIHcdXO2spHj1XDlIWa8dgBVrglukJmYutqCzE+RtaMeVVQ==", "dependencies": { - "@trezor/protobuf": "1.2.0", - "@trezor/protocol": "1.2.0", - "@trezor/utils": "9.2.0", - "cross-fetch": "^4.0.0", + "@trezor/utils": "9.0.11", + "bytebuffer": "^5.0.1", + "cross-fetch": "^3.1.6", + "json-stable-stringify": "^1.0.2", "long": "^4.0.0", - "protobufjs": "7.2.6", - "usb": "^2.11.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" + "prettier": "2.8.8", + "protobufjs": "7.2.4", + "usb": "^2.9.0" } }, - "node_modules/@trezor/transport/node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dependencies": { - "node-fetch": "^2.6.12" - } + "node_modules/@trezor/transport/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, - "node_modules/@trezor/transport/node_modules/node-addon-api": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.1.0.tgz", - "integrity": "sha512-yBY+qqWSv3dWKGODD6OGE6GnTX7Q2r+4+DfpqxHSHh8x0B4EKP9+wVGLS6U/AM1vxSNNmUEuIV5EGhYwPpfOwQ==", + "node_modules/@trezor/transport/node_modules/json-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", + "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", + "dependencies": { + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, "engines": { - "node": "^18 || ^20 || >= 21" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@trezor/transport/node_modules/usb": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/usb/-/usb-2.14.0.tgz", - "integrity": "sha512-I3lzVOH21BsO6qPYvx1C7Ji08lbuM0qmsEtNGAphqlhNME5cz/vExY+jIXZl+HQIRybI/sTxdyLab5tALsL69w==", - "hasInstallScript": true, - "dependencies": { - "@types/w3c-web-usb": "^1.0.6", - "node-addon-api": "^8.0.0", - "node-gyp-build": "^4.5.0" + "node_modules/@trezor/transport/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "bin": { + "prettier": "bin-prettier.js" }, "engines": { - "node": ">=12.22.0 <13.0 || >=14.17.0" + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/@trezor/type-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@trezor/type-utils/-/type-utils-1.1.0.tgz", - "integrity": "sha512-zoPN9ZmdYlr03WyCWEQY6xCHPfhsodENYHPcZMKObVsUlhtMh1Z7OSD/pzd/NzOPBAtSctNbldx4aFu9A88afw==" - }, "node_modules/@trezor/utils": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.2.0.tgz", - "integrity": "sha512-OslmtISmVl2r5lS/BPagyaWYudT/fSiezrSaKA1aDctGKOrze1JkA7p5J1j0uUAgjf9HODCiH8+PBAVXjUZL8A==", - "dependencies": { - "bignumber.js": "^9.1.2" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.0.11.tgz", + "integrity": "sha512-HJBgR6/VYjJX8AP/fNIcYC+gDNjP2JLfgYBrT/naupEwDQJcxfn8KgUBrR1/akm61g8CPOot/YEj4o5nXuRt/g==" }, "node_modules/@trezor/utxo-lib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-2.2.0.tgz", - "integrity": "sha512-Fhu+QZjOMpiipmJWdRAwbJEVk4DtwZfh7jy67vjgliWlO9p8M5Ap3XzlbZGF9+mKLrACjv/yhN63XMqTbxVcqw==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-1.0.9.tgz", + "integrity": "sha512-ezLJzAslhW6HVTyZWpfBmrXY5/hz5XKT0FkYRS7lhnf56LwtVPUkLvLqGtDPuV8djF04meXxoRNO8jjtnQgYqA==", "dependencies": { - "@trezor/utils": "9.2.0", + "@trezor/utils": "9.0.11", "bchaddrjs": "^0.5.2", "bech32": "^2.0.0", "bip66": "^1.1.5", @@ -6593,16 +6274,14 @@ "bn.js": "^5.2.1", "bs58": "^5.0.0", "bs58check": "^3.0.1", + "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "int64-buffer": "^1.0.1", "pushdata-bitcoin": "^1.0.1", "tiny-secp256k1": "^1.1.6", "typeforce": "^1.18.0", "varuint-bitcoin": "^1.1.2", - "wif": "^4.0.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" + "wif": "^2.0.6" } }, "node_modules/@trezor/utxo-lib/node_modules/base-x": { @@ -6627,14 +6306,6 @@ "bs58": "^5.0.0" } }, - "node_modules/@trezor/utxo-lib/node_modules/wif": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/wif/-/wif-4.0.0.tgz", - "integrity": "sha512-kADznC+4AFJNXpT8rLhbsfI7EmAcorc5nWvAdKUchGmwXEBD3n55q0/GZ3DBmc6auAvuTSsr/utiKizuXdNYOQ==", - "dependencies": { - "bs58check": "^3.0.1" - } - }, "node_modules/@ts-nameof/common": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/@ts-nameof/common/-/common-4.2.1.tgz", @@ -6746,6 +6417,7 @@ "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -7019,9 +6691,9 @@ } }, "node_modules/@types/lodash": { - "version": "4.17.9", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.9.tgz", - "integrity": "sha512-w9iWudx1XWOHW5lQRS9iKpK/XuRhnN+0T7HvdCCd802FYkT1AMTnxndJHGrNJwRoRHkslGr4S29tjm1cT7x/7w==" + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-YpS0zzoduEhuOWjAotS6A5AVCva7X4lVlYLF0FYHAY9sdraBfnatttHItlWeZdGhuEkf+OzMNg2ZYAx8t+52uQ==" }, "node_modules/@types/mdast": { "version": "3.0.15", @@ -7267,20 +6939,15 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" }, - "node_modules/@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" - }, "node_modules/@types/w3c-web-usb": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.10.tgz", "integrity": "sha512-CHgUI5kTc/QLMP8hODUHhge0D4vx+9UiAwIGiT0sTy/B2XpdX1U5rJt6JSISgr6ikRT7vxV9EVAFeYZqUnl1gQ==" }, "node_modules/@types/web": { - "version": "0.0.138", - "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.138.tgz", - "integrity": "sha512-oQD74hl+cNCZdSWIupJCXZ2azTuB3MJ/mrWlgYt+v4pD7/Dr78gl5hKAdieZNf9NrAqwUez79bHtnFVSNSscWA==" + "version": "0.0.100", + "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.100.tgz", + "integrity": "sha512-8NDSrDsyF7qv93SQ7aNFk0NqpNb1QEC1meoEZW/+KGMHZWd0WOC2DiT9pVhS5+w5q+u9+2bkBCfUQpe9wbqiPA==" }, "node_modules/@types/ws": { "version": "7.4.7", @@ -7951,6 +7618,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, "dependencies": { "humanize-ms": "^1.2.1" }, @@ -9314,18 +8982,6 @@ "node": "*" } }, - "node_modules/bigint-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz", - "integrity": "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==", - "hasInstallScript": true, - "dependencies": { - "bindings": "^1.3.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/bignumber.js": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", @@ -9599,16 +9255,6 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, - "node_modules/borsh": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", - "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", - "dependencies": { - "bn.js": "^5.2.0", - "bs58": "^4.0.0", - "text-encoding-utf-8": "^1.0.2" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -9892,19 +9538,6 @@ "node": ">=0.2.0" } }, - "node_modules/bufferutil": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", - "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, "node_modules/byline": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", @@ -9920,6 +9553,25 @@ "integrity": "sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q==", "dev": true }, + "node_modules/bytebuffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", + "integrity": "sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ==", + "dependencies": { + "long": "~3" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/bytebuffer/node_modules/long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -11595,7 +11247,6 @@ "version": "3.1.8", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "dev": true, "dependencies": { "node-fetch": "^2.6.12" } @@ -12412,17 +12063,6 @@ "node": ">= 4" } }, - "node_modules/delay": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", - "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -13137,19 +12777,6 @@ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "node_modules/es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", - "dependencies": { - "es6-promise": "^4.0.3" - } - }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -13812,28 +13439,6 @@ "node": ">= 0.6" } }, - "node_modules/ethereum-cryptography": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", - "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", - "dependencies": { - "@noble/curves": "1.4.2", - "@noble/hashes": "1.4.0", - "@scure/bip32": "1.4.0", - "@scure/bip39": "1.3.0" - } - }, - "node_modules/ethereum-cryptography/node_modules/@noble/curves": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", - "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -14220,14 +13825,6 @@ "node": ">=8" } }, - "node_modules/eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", - "engines": { - "node": "> 0.1.90" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -14281,11 +13878,6 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, - "node_modules/fast-stable-stringify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz", - "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==" - }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -16170,6 +15762,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, "dependencies": { "ms": "^2.0.0" } @@ -17221,14 +16814,6 @@ "node": ">=0.10.0" } }, - "node_modules/isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "peerDependencies": { - "ws": "*" - } - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -17349,69 +16934,6 @@ "node": ">=8" } }, - "node_modules/jayson": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.2.tgz", - "integrity": "sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==", - "dependencies": { - "@types/connect": "^3.4.33", - "@types/node": "^12.12.54", - "@types/ws": "^7.4.4", - "commander": "^2.20.3", - "delay": "^5.0.0", - "es6-promisify": "^5.0.0", - "eyes": "^0.1.8", - "isomorphic-ws": "^4.0.1", - "json-stringify-safe": "^5.0.1", - "JSONStream": "^1.3.5", - "uuid": "^8.3.2", - "ws": "^7.5.10" - }, - "bin": { - "jayson": "bin/jayson.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jayson/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" - }, - "node_modules/jayson/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/jayson/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/jayson/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/jdenticon": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jdenticon/-/jdenticon-3.2.0.tgz", @@ -19484,11 +19006,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -19513,19 +19030,10 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "engines": [ - "node >= 0.2.0" - ] - }, "node_modules/jsonschema": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz", @@ -19534,21 +19042,6 @@ "node": "*" } }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -23416,9 +22909,9 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/protobufjs": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", - "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -24784,69 +24277,6 @@ "lodash": "^4.17.15" } }, - "node_modules/rpc-websockets": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-9.0.4.tgz", - "integrity": "sha512-yWZWN0M+bivtoNLnaDbtny4XchdAIF5Q4g/ZsC5UC61Ckbp0QczwO8fg44rV3uYmY4WHd+EZQbn90W1d8ojzqQ==", - "dependencies": { - "@swc/helpers": "^0.5.11", - "@types/uuid": "^8.3.4", - "@types/ws": "^8.2.2", - "buffer": "^6.0.3", - "eventemitter3": "^5.0.1", - "uuid": "^8.3.2", - "ws": "^8.5.0" - }, - "funding": { - "type": "paypal", - "url": "https://paypal.me/kozjak" - }, - "optionalDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - } - }, - "node_modules/rpc-websockets/node_modules/@types/ws": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", - "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/rpc-websockets/node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" - }, - "node_modules/rpc-websockets/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/rpc-websockets/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -26651,14 +26081,6 @@ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, - "node_modules/superstruct": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", - "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -27142,11 +26564,6 @@ "node": ">=8" } }, - "node_modules/text-encoding-utf-8": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", - "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==" - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -27162,7 +26579,8 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true }, "node_modules/throwback": { "version": "4.1.0", @@ -27366,11 +26784,11 @@ }, "node_modules/trezor-connect-flow": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/Emurgo/trezor-connect-flow.git#9f8ae584593a5e0f302fd4dd3b0968ccf6f73513", - "integrity": "sha512-+Ngo9kAJRZAXw1awmMe5vvy8UjsghTaKiziaHdPro/0WI2Pu14tyU0hQT+esmM0KT7KRbJbpR1j1flRtHLgf0Q==", + "resolved": "git+ssh://git@github.com/Emurgo/trezor-connect-flow.git#92d6d8c8faef25c0ea1d481aa1ecb4ba77ce539c", + "integrity": "sha512-XkgQsN8AVPs8ucg2qWUUY+u2lgBJnfzzBjC7SoHAp0N5VFI5vsi5CRJ4URbaC7kTMJwoOrjQ2rNyIgFEKYwm+Q==", "license": "MIT", "dependencies": { - "@trezor/connect-web": "9.4.0" + "@trezor/connect-web": "9.1.1" } }, "node_modules/trim-newlines": { @@ -27494,11 +26912,6 @@ "node": ">=8" } }, - "node_modules/ts-mixer": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", - "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==" - }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -28244,19 +27657,6 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", diff --git a/packages/yoroi-extension/package.json b/packages/yoroi-extension/package.json index 6d631450a2..d7544cbbb4 100644 --- a/packages/yoroi-extension/package.json +++ b/packages/yoroi-extension/package.json @@ -219,7 +219,7 @@ "semver": "7.6.0", "stream-browserify": "3.0.0", "tinycolor2": "1.4.2", - "trezor-connect-flow": "Emurgo/trezor-connect-flow#9f8ae584593a5e0f302fd4dd3b0968ccf6f73513", + "trezor-connect-flow": "Emurgo/trezor-connect-flow#92d6d8c8faef25c0ea1d481aa1ecb4ba77ce539c", "ts-loader": "^9.5.1", "typescript": "^5.4.5", "ua-parser-js": "1.0.37",