From cad6122f547dc42701061db33d6fa02068bceb38 Mon Sep 17 00:00:00 2001 From: peachbits Date: Mon, 16 Dec 2024 17:54:50 -0800 Subject: [PATCH] Fix eth_sendRawTransaction handling --- CHANGELOG.md | 1 + .../modals/WcSmartContractModal.tsx | 37 ++++++++++++++++--- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4874da8d1c9..03cda22f01c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ - changed: Handle errors in StakeKit API responses - fixed: Missing "Done" button when managing tokens for certain assets - fixed: Only send successful import items to completion scene +- fixed: WalletConnect `eth_sendRawTransaction` event handling - removed: Removed patch for usb and node-hid ## 4.19.0 diff --git a/src/components/modals/WcSmartContractModal.tsx b/src/components/modals/WcSmartContractModal.tsx index efe88d99f8c..dc30f649df9 100644 --- a/src/components/modals/WcSmartContractModal.tsx +++ b/src/components/modals/WcSmartContractModal.tsx @@ -1,6 +1,6 @@ import { abs, add, div, gt, mul } from 'biggystring' import { asArray, asEither, asNumber, asObject, asOptional, asString, asTuple, asUnknown, asValue } from 'cleaners' -import { EdgeCurrencyWallet, EdgeSpendInfo } from 'edge-core-js' +import { EdgeCurrencyWallet, EdgeSpendInfo, EdgeTransaction } from 'edge-core-js' import * as React from 'react' import { Image, ScrollView, View } from 'react-native' import { AirshipBridge } from 'react-native-airship' @@ -116,8 +116,7 @@ export const WcSmartContractModal = (props: Props) => { await wallet.saveTx(signTx) break } - case 'eth_sendTransaction': - case 'eth_sendRawTransaction': { + case 'eth_sendTransaction': { const cleanPayload = asEvmTransactionPayload(payload) const spendInfo: EdgeSpendInfo = await wallet.otherMethods.txRpcParamsToSpendInfo(cleanPayload.params[0]) const tx = await wallet.makeSpend(spendInfo) @@ -127,6 +126,27 @@ export const WcSmartContractModal = (props: Props) => { await wallet.saveTx(sentTx) break } + case 'eth_sendRawTransaction': { + const cleanPayload = asEvmSendRawTransactionPayload(payload) + const fakeEdgeTransaction: EdgeTransaction = { + blockHeight: 0, + currencyCode: wallet.currencyInfo.currencyCode, + date: 0, + isSend: false, + memos: [], + nativeAmount: '0', + networkFee: '0', + networkFees: [], + ourReceiveAddresses: [], + signedTx: cleanPayload.params[0], + tokenId: null, + txid: '', + walletId: wallet.id + } + const sentTx = await wallet.broadcastTx(fakeEdgeTransaction) + await walletConnect.approveRequest(topic, requestId, sentTx.txid) + break + } case 'algo_signTxn': { const cleanPayload = asAlgoWcRpcPayload(payload) const signedTxs = await Promise.all(cleanPayload.params[0].map(async txnObj => await wallet.signMessage(txnObj.txn))) @@ -229,7 +249,12 @@ const asEvmSignPayload = asObject({ params: asTuple(asString, asString) }) -const asEvmTransactionMethod = asValue('eth_sendTransaction', 'eth_signTransaction', 'eth_sendRawTransaction') +const asEvmSendRawTransactionMethod = asValue('eth_sendRawTransaction') +const asEvmSendRawTransactionPayload = asObject({ + method: asEvmSendRawTransactionMethod, + params: asTuple(asString) +}) +const asEvmTransactionMethod = asValue('eth_sendTransaction', 'eth_signTransaction') const asEvmTransactionPayload = asObject({ method: asEvmTransactionMethod, params: asTuple( @@ -293,7 +318,9 @@ const asCosmosSignAminoPayload = asObject({ }) }) -const asPayload = asObject({ method: asEither(asCosmosPayloadMethod, asAlgoPayloadMethod, asEvmSignMethod, asEvmTransactionMethod) }).withRest +const asPayload = asObject({ + method: asEither(asCosmosPayloadMethod, asAlgoPayloadMethod, asEvmSignMethod, asEvmTransactionMethod, asEvmSendRawTransactionMethod) +}).withRest export const asWcSmartContractModalProps = asObject({ dApp: asObject({