Skip to content

Commit

Permalink
fix: browser connect - send transaction command
Browse files Browse the repository at this point in the history
Fixes #16063
  • Loading branch information
saledjenic committed Sep 19, 2024
1 parent ffe046d commit bbecb47
Show file tree
Hide file tree
Showing 2 changed files with 150 additions and 16 deletions.
164 changes: 149 additions & 15 deletions ui/app/AppLayouts/Wallet/services/dapps/DappsConnectorSDK.qml
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ WalletConnectSDKBase {
console.error("Error in event data lookup", JSON.stringify(event))
return null
}
const interpreted = d.prepareData(method, data)
let enoughFunds = !isTransactionMethod(method)
let obj = sessionRequestComponent.createObject(null, {
event,
Expand All @@ -88,12 +89,12 @@ WalletConnectSDKBase {
account,
network,
data,
preparedData: interpreted.preparedData,
maxFeesText: "?",
maxFeesEthText: "?",
enoughFunds: enoughFunds,
estimatedTimeText: "?",
preparedData: event.params.request.tx.data,
})

if (obj === null) {
console.error("Error creating SessionRequestResolved for event")
return null
Expand All @@ -113,9 +114,134 @@ WalletConnectSDKBase {
}
obj.resolveDappInfoFromSession(session)

if (d.isTransactionMethod(method)) {
let tx = obj.data.tx
if (tx === null) {
console.error("Error cannot resolve tx object")
return null
}
let BigOps = SQUtils.AmountsArithmetic
let gasLimit = hexToGwei(tx.gasLimit)

if (tx.gasPrice === null || tx.gasPrice === undefined) {
let maxFeePerGas = hexToGwei(tx.maxFeePerGas)
let maxPriorityFeePerGas = hexToGwei(tx.maxPriorityFeePerGas)
let totalMaxFees = BigOps.sum(maxFeePerGas, maxPriorityFeePerGas)
let maxFees = BigOps.times(gasLimit, totalMaxFees)
let maxFeesString = maxFees.toString()
obj.maxFeesText = maxFeesString
obj.maxFeesEthText = maxFeesString
obj.enoughFunds = true
} else {
let gasPrice = hexToGwei(tx.gasPrice)
let maxFees = BigOps.times(gasLimit, gasPrice)
let maxFeesString = maxFees.toString()
obj.maxFeesText = maxFeesString
obj.maxFeesEthText = maxFeesString
obj.enoughFunds = true
}
}

return obj
}

function getTxObject(method, data) {
let tx
if (method === SessionRequest.methods.signTransaction.name) {
tx = SessionRequest.methods.signTransaction.getTxObjFromData(data)
} else if (method === SessionRequest.methods.sendTransaction.name) {
tx = SessionRequest.methods.sendTransaction.getTxObjFromData(data)
} else {
console.error("Not a transaction method")
}
return tx
}

// returns {
// preparedData,
// value // null or ETH Big number
// }
function prepareData(method, data) {
let payload = null
switch(method) {
case SessionRequest.methods.personalSign.name: {
payload = SessionRequest.methods.personalSign.getMessageFromData(data)
break
}
case SessionRequest.methods.sign.name: {
payload = SessionRequest.methods.sign.getMessageFromData(data)
break
}
case SessionRequest.methods.signTypedData_v4.name: {
const stringPayload = SessionRequest.methods.signTypedData_v4.getMessageFromData(data)
payload = JSON.stringify(JSON.parse(stringPayload), null, 2)
break
}
case SessionRequest.methods.signTypedData.name: {
const stringPayload = SessionRequest.methods.signTypedData.getMessageFromData(data)
payload = JSON.stringify(JSON.parse(stringPayload), null, 2)
break
}
case SessionRequest.methods.signTransaction.name:
case SessionRequest.methods.sendTransaction.name:
// For transactions we process the data in a different way as follows
break
default:
console.error("Unhandled method", method)
break;
}

let value = SQUtils.AmountsArithmetic.fromNumber(0)
if (d.isTransactionMethod(method)) {
let txObj = d.getTxObject(method, data)
let tx = Object.assign({}, txObj)
if (tx.value) {
value = hexToEth(tx.value)
tx.value = value.toString()
}
if (tx.maxFeePerGas) {
tx.maxFeePerGas = hexToGwei(tx.maxFeePerGas).toString()
}
if (tx.maxPriorityFeePerGas) {
tx.maxPriorityFeePerGas = hexToGwei(tx.maxPriorityFeePerGas).toString()
}
if (tx.gasPrice) {
tx.gasPrice = hexToGwei(tx.gasPrice)
}
if (tx.gasLimit) {
tx.gasLimit = parseInt(root.store.hexToDec(tx.gasLimit))
}
if (tx.nonce) {
tx.nonce = parseInt(root.store.hexToDec(tx.nonce))
}

payload = JSON.stringify(tx, null, 2)
}
return {
preparedData: payload,
value: value
}
}

function hexToEth(value) {
return hexToEthDenomination(value, "eth")
}
function hexToGwei(value) {
return hexToEthDenomination(value, "gwei")
}
function hexToEthDenomination(value, ethUnit) {
let unitMapping = {
"gwei": 9,
"eth": 18
}
let BigOps = SQUtils.AmountsArithmetic
let decValue = root.store.hexToDec(value)
if (!!decValue) {
return BigOps.div(BigOps.fromNumber(decValue), BigOps.fromNumber(1, unitMapping[ethUnit]))
}
return BigOps.fromNumber(0)
}

function isTransactionMethod(method) {
return method === SessionRequest.methods.signTransaction.name
|| method === SessionRequest.methods.sendTransaction.name
Expand All @@ -128,7 +254,7 @@ WalletConnectSDKBase {
if (event.params.request.params.length < 2) {
return null
}
address = event.params.request.params[0]
address = event.params.request.params[1]
} else if (method === SessionRequest.methods.sign.name) {
if (event.params.request.params.length === 1) {
return null
Expand All @@ -146,7 +272,10 @@ WalletConnectSDKBase {
if (event.params.request.params.length == 0) {
return null
}
address = event.params.request.params[0]
address = event.params.request.params[0].from
} else {
console.error("Unsupported method to lookup account: ", method)
return null
}
const account = SQUtils.ModelUtils.getFirstModelEntryIf(root.wcService.validAccounts, (account) => {
return account.address.toLowerCase() === address.toLowerCase();
Expand Down Expand Up @@ -227,7 +356,7 @@ WalletConnectSDKBase {
if (event.params.request.params.length == 0) {
return null
}
let tx = event.params.request.params[0]
const tx = event.params.request.params[0]
return SessionRequest.methods.sendTransaction.buildDataObject(tx)
} else {
return null
Expand Down Expand Up @@ -281,12 +410,11 @@ WalletConnectSDKBase {
password,
pin)
} else if (request.method === SessionRequest.methods.sendTransaction.name) {
let txObj = SessionRequest.methods.sendTransaction.getTxObjFromData(request.data)
store.sendTransaction(request.topic,
request.id,
request.account.address,
request.network.chainId,
txObj,
request.data.tx,
password,
pin)
}
Expand Down Expand Up @@ -478,7 +606,7 @@ WalletConnectSDKBase {
}
case SessionRequest.methods.sendTransaction.name: {
const jsonPayload = SessionRequest.methods.sendTransaction.getTxObjFromData(request.data)
return JSON.stringify(jsonPayload, null, 2)
return JSON.stringify(request.data, null, 2)
}
}
}
Expand Down Expand Up @@ -546,14 +674,20 @@ WalletConnectSDKBase {
"params": {
"chainId": `eip155:${dappInfo.chainId}`,
"request": {
"method": SessionRequest.methods.personalSign.name,
"tx": {
"data": txArgsParams.data,
},
"method": SessionRequest.methods.sendTransaction.name,
"params": [
txArgsParams.from,
txArgsParams.to,
],
{
"from": txArgsParams.from,
"to": txArgsParams.to,
"value": txArgsParams.value,
"gasLimit": txArgsParams.gas,
"gasPrice": txArgsParams.gasPrice,
"maxFeePerGas": txArgsParams.maxFeePerGas,
"maxPriorityFeePerGas": txArgsParams.maxPriorityFeePerGas,
"nonce": txArgsParams.nonce,
"data": txArgsParams.data
}
]
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion vendor/status-go
Submodule status-go updated 74 files
+46 −15 .github/workflows/commit-check.yml
+5 −0 Makefile
+1 −1 _assets/scripts/parse_commits.sh
+7 −8 _assets/scripts/tag_version.sh
+18 −0 cmd/statusd/main.go
+117 −0 cmd/statusd/server/signals_server.go
+75 −0 cmd/statusd/server/signals_server_test.go
+1 −1 go.mod
+6 −1 integration-tests/conftest.py
+8 −7 integration-tests/docker-compose.test.status-go.yml
+3 −0 integration-tests/pytest.ini
+2 −1 integration-tests/requirements.txt
+150 −0 integration-tests/schemas/accounts_getKeypairs
+20 −0 integration-tests/schemas/accounts_hasPairedDevices
+20 −0 integration-tests/schemas/accounts_remainingAccountCapacity
+3,664 −0 integration-tests/schemas/wallet_fetchAllCurrencyFormats
+3,624 −0 integration-tests/schemas/wallet_getCachedCurrencyFormats
+28 −0 integration-tests/tests/test_accounts.py
+44 −3 integration-tests/tests/test_cases.py
+9 −9 integration-tests/tests/test_wallet_rpc.py
+7 −7 logutils/override.go
+59 −0 logutils/requestlog/request_log.go
+47 −0 mobile/init_logging_test.go
+435 −114 mobile/status.go
+88 −0 mobile/status_request_log.go
+155 −0 mobile/status_request_log_test.go
+3 −0 protocol/activity_center.go
+28 −8 protocol/activity_center_persistence.go
+51 −0 protocol/messenger.go
+28 −5 protocol/messenger_mention.go
+38 −22 protocol/messenger_mention_test.go
+40 −5 protocol/messenger_pairing_and_syncing.go
+2 −1 protocol/messenger_pairing_and_syncing_test.go
+172 −149 protocol/migrations/migrations.go
+1 −0 protocol/migrations/sqlite/1721919311_add_installation_id_activity_center.up.sql
+4 −4 protocol/requests/enable_and_sync_installation.go
+7 −0 rpc/client.go
+48 −1 rpc/mock/client/client.go
+1 −11 server/pairing/connection.go
+0 −1 server/pairing/connection_test.go
+16 −5 services/connector/api.go
+5 −39 services/connector/api_test.go
+3 −7 services/connector/chainutils/utils.go
+2 −1 services/connector/commands/accounts.go
+10 −16 services/connector/commands/accounts_test.go
+4 −2 services/connector/commands/chain_id.go
+10 −36 services/connector/commands/chain_id_test.go
+2 −1 services/connector/commands/personal_sign.go
+23 −50 services/connector/commands/personal_sign_test.go
+2 −1 services/connector/commands/request_accounts.go
+16 −39 services/connector/commands/request_accounts_test.go
+2 −1 services/connector/commands/request_permissions.go
+6 −4 services/connector/commands/request_permissions_test.go
+2 −1 services/connector/commands/revoke_permissions.go
+11 −14 services/connector/commands/revoke_permissions_test.go
+14 −1 services/connector/commands/rpc_traits.go
+48 −1 services/connector/commands/send_transaction.go
+53 −50 services/connector/commands/send_transaction_test.go
+4 −2 services/connector/commands/switch_ethereum_chain.go
+13 −45 services/connector/commands/switch_ethereum_chain_test.go
+95 −22 services/connector/commands/test_helpers.go
+47 −66 services/connector/connector_flows_test.go
+5 −4 services/connector/service.go
+16 −42 services/connector/service_test.go
+98 −0 services/connector/test_helpers.go
+9 −4 services/ext/api.go
+1 −1 services/wallet/router/fees/fees.go
+103 −4 telemetry/client.go
+76 −1 telemetry/client_test.go
+6 −2 transactions/transactor.go
+6 −0 waku/simulation_test.go
+1 −0 wakuv2/config.go
+1 −0 wakuv2/message_publishing.go
+83 −9 wakuv2/waku.go

0 comments on commit bbecb47

Please sign in to comment.