145 lines
5.9 KiB
QML
145 lines
5.9 KiB
QML
import QtQuick 2.13
|
|
import QtWebChannel 1.13
|
|
import QtQuick.Dialogs 1.2
|
|
|
|
import utils 1.0
|
|
import shared.controls 1.0
|
|
|
|
import "../stores"
|
|
|
|
QtObject {
|
|
id: provider
|
|
|
|
property var createAccessDialogComponent: function(){}
|
|
property var createSendTransactionModalComponent: function(){}
|
|
property var createSignMessageModalComponent: function(){}
|
|
property var showSendingError: function(){}
|
|
property var showSigningError: function(){}
|
|
property var showToastMessage: function(){}
|
|
property int chainId: (Web3ProviderStore && Web3ProviderStore.chainId) || 1
|
|
|
|
signal web3Response(string data);
|
|
|
|
function signValue(input){
|
|
if(Utils.isHex(input) && Utils.startsWith0x(input)){
|
|
return input
|
|
}
|
|
return RootStore.getAscii2Hex(input)
|
|
}
|
|
|
|
property Connections conn: Connections {
|
|
target: Web3ProviderStore.web3ProviderInst
|
|
|
|
function onPostMessageResult(payloadMethod: string, result: string, chainId: string) {
|
|
web3Response(result)
|
|
const isSign = ["eth_sign", "personal_sign", "eth_signTypedData", "eth_signTypedData_v3"].indexOf(payloadMethod) > -1
|
|
const isTx = payloadMethod === "eth_sendTransaction"
|
|
try {
|
|
let responseObj = JSON.parse(result)
|
|
if (responseObj.error) {
|
|
throw new Error(responseObj.error)
|
|
}
|
|
|
|
if (isTx) {
|
|
showToastMessage(responseObj.result.result, chainId)
|
|
}
|
|
|
|
} catch (e) {
|
|
if (isTx) {
|
|
showSendingError(e.message)
|
|
} else if (isSign) {
|
|
showSigningError(e.message.message)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function postMessage(requestType, data) {
|
|
var request;
|
|
try {
|
|
request = JSON.parse(data)
|
|
} catch (e) {
|
|
console.error("Error parsing the message data", e)
|
|
return;
|
|
}
|
|
request.address = WalletStore.dappBrowserAccount.address
|
|
if (!request.payload) {
|
|
request.payload = {}
|
|
}
|
|
request.payload.chainId = provider.chainId
|
|
|
|
var ensAddr = Web3ProviderStore.urlENSDictionary[request.hostname];
|
|
if (ensAddr) {
|
|
request.hostname = ensAddr;
|
|
}
|
|
|
|
if (requestType === Constants.web3DisconnectAccount) {
|
|
RootStore.currentTabConnected = false
|
|
web3Response(JSON.stringify({type: Constants.web3DisconnectAccount}));
|
|
} else if (requestType === Constants.api_request) {
|
|
if (!Web3ProviderStore.hasPermission(request.hostname, request.address, request.permission)) {
|
|
RootStore.currentTabConnected = false
|
|
var dialog = createAccessDialogComponent()
|
|
dialog.request = request;
|
|
dialog.open();
|
|
} else {
|
|
RootStore.currentTabConnected = true
|
|
Web3ProviderStore.web3ProviderInst.postMessage("", requestType, JSON.stringify(request));
|
|
}
|
|
} else if (requestType === Constants.web3SendAsyncReadOnly &&
|
|
request.payload.method === "eth_sendTransaction") {
|
|
var acc = WalletStore.dappBrowserAccount
|
|
const value = RootStore.getWei2Eth(request.payload.params[0].value, 18);
|
|
const sendDialog = createSendTransactionModalComponent(request, requestType)
|
|
|
|
sendDialog.sendTransaction = function () {
|
|
if(sendDialog.bestRoutes.length === 1) {
|
|
let path = sendDialog.bestRoutes[0]
|
|
let eip1559Enabled = path.gasFees.eip1559Enabled
|
|
let maxFeePerGas = path.gasFees.maxFeePerGasM
|
|
let trx = request.payload.params[0]
|
|
// TODO: use bignumber instead of floats
|
|
trx.value = RootStore.getEth2Hex(parseFloat(value))
|
|
trx.gas = "0x" + parseInt(path.gasAmount, 10).toString(16)
|
|
trx.maxPriorityFeePerGas = RootStore.getGwei2Hex(parseFloat(eip1559Enabled ? path.gasFees.maxPriorityFeePerGas : "0"))
|
|
trx.maxFeePerGas = RootStore.getGwei2Hex(parseFloat(eip1559Enabled ? maxFeePerGas : path.gasFees.gasPrice))
|
|
|
|
request.payload.params[0] = trx
|
|
|
|
Web3ProviderStore.web3ProviderInst.authenticateToPostMessage(request.payload.method, requestType, JSON.stringify(request))
|
|
sendDialog.close()
|
|
}
|
|
}
|
|
|
|
sendDialog.open();
|
|
} else if (requestType === Constants.web3SendAsyncReadOnly && ["eth_sign", "personal_sign", "eth_signTypedData", "eth_signTypedData_v3"].indexOf(request.payload.method) > -1) {
|
|
const signDialog = createSignMessageModalComponent(request)
|
|
signDialog.web3Response = web3Response
|
|
signDialog.signMessage = function (enteredPassword) {
|
|
signDialog.interactedWith = true;
|
|
request.payload.password = enteredPassword;
|
|
request.payload.from = WalletStore.dappBrowserAccount.address;
|
|
switch(request.payload.method){
|
|
case Constants.personal_sign:
|
|
request.payload.params[0] = signValue(request.payload.params[0]);
|
|
case Constants.eth_sign:
|
|
request.payload.params[1] = signValue(request.payload.params[1]);
|
|
}
|
|
Web3ProviderStore.web3ProviderInst.postMessage(request.payload.method, requestType, JSON.stringify(request));
|
|
signDialog.close()
|
|
signDialog.destroy()
|
|
}
|
|
|
|
|
|
signDialog.open();
|
|
} else if (request.type === Constants.web3DisconnectAccount) {
|
|
web3Response(data);
|
|
} else {
|
|
Web3ProviderStore.web3ProviderInst.postMessage(request.payload.method, requestType, JSON.stringify(request));
|
|
}
|
|
}
|
|
|
|
WebChannel.id: "backend"
|
|
}
|