|
|
@ -142,35 +142,35 @@ UniversalDAppUI.prototype.renderInstanceFromABI = function (contractABI, address |
|
|
|
// TODO this is used by renderInstance when a new instance is displayed.
|
|
|
|
// TODO this is used by renderInstance when a new instance is displayed.
|
|
|
|
// this returns a DOM element.
|
|
|
|
// this returns a DOM element.
|
|
|
|
UniversalDAppUI.prototype.getCallButton = function (args) { |
|
|
|
UniversalDAppUI.prototype.getCallButton = function (args) { |
|
|
|
var self = this |
|
|
|
let self = this |
|
|
|
// args.funABI, args.address [fun only]
|
|
|
|
// args.funABI, args.address [fun only]
|
|
|
|
// args.contractName [constr only]
|
|
|
|
// args.contractName [constr only]
|
|
|
|
var lookupOnly = args.funABI.constant |
|
|
|
const lookupOnly = args.funABI.stateMutability === 'view' || args.funABI.stateMutability === 'pure' || args.funABI.constant |
|
|
|
|
|
|
|
|
|
|
|
var outputOverride = yo`<div class=${css.value}></div>` // show return value
|
|
|
|
var outputOverride = yo`<div class=${css.value}></div>` // show return value
|
|
|
|
|
|
|
|
|
|
|
|
function clickButton (valArr, inputsValues) { |
|
|
|
function clickButton (valArr, inputsValues) { |
|
|
|
var logMsg |
|
|
|
let logMsg |
|
|
|
if (!args.funABI.constant) { |
|
|
|
if (lookupOnly) { |
|
|
|
logMsg = `transact to ${args.contractName}.${(args.funABI.name) ? args.funABI.name : '(fallback)'}` |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
logMsg = `call to ${args.contractName}.${(args.funABI.name) ? args.funABI.name : '(fallback)'}` |
|
|
|
logMsg = `call to ${args.contractName}.${(args.funABI.name) ? args.funABI.name : '(fallback)'}` |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
logMsg = `transact to ${args.contractName}.${(args.funABI.name) ? args.funABI.name : '(fallback)'}` |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var value = inputsValues |
|
|
|
var value = inputsValues |
|
|
|
|
|
|
|
|
|
|
|
var confirmationCb = (network, tx, gasEstimation, continueTxExecution, cancelCb) => { |
|
|
|
const confirmationCb = (network, tx, gasEstimation, continueTxExecution, cancelCb) => { |
|
|
|
if (network.name !== 'Main') { |
|
|
|
if (network.name !== 'Main') { |
|
|
|
return continueTxExecution(null) |
|
|
|
return continueTxExecution(null) |
|
|
|
} |
|
|
|
} |
|
|
|
var amount = executionContext.web3().fromWei(typeConversion.toInt(tx.value), 'ether') |
|
|
|
const amount = executionContext.web3().fromWei(typeConversion.toInt(tx.value), 'ether') |
|
|
|
var content = confirmDialog(tx, amount, gasEstimation, self.udapp, |
|
|
|
const content = confirmDialog(tx, amount, gasEstimation, self.udapp, |
|
|
|
(gasPrice, cb) => { |
|
|
|
(gasPrice, cb) => { |
|
|
|
let txFeeText, priceStatus |
|
|
|
let txFeeText, priceStatus |
|
|
|
// TODO: this try catch feels like an anti pattern, can/should be
|
|
|
|
// TODO: this try catch feels like an anti pattern, can/should be
|
|
|
|
// removed, but for now keeping the original logic
|
|
|
|
// removed, but for now keeping the original logic
|
|
|
|
try { |
|
|
|
try { |
|
|
|
var fee = executionContext.web3().toBigNumber(tx.gas).mul(executionContext.web3().toBigNumber(executionContext.web3().toWei(gasPrice.toString(10), 'gwei'))) |
|
|
|
const fee = executionContext.web3().toBigNumber(tx.gas).mul(executionContext.web3().toBigNumber(executionContext.web3().toWei(gasPrice.toString(10), 'gwei'))) |
|
|
|
txFeeText = ' ' + executionContext.web3().fromWei(fee.toString(10), 'ether') + ' Ether' |
|
|
|
txFeeText = ' ' + executionContext.web3().fromWei(fee.toString(10), 'ether') + ' Ether' |
|
|
|
priceStatus = true |
|
|
|
priceStatus = true |
|
|
|
} catch (e) { |
|
|
|
} catch (e) { |
|
|
@ -181,12 +181,12 @@ UniversalDAppUI.prototype.getCallButton = function (args) { |
|
|
|
}, |
|
|
|
}, |
|
|
|
(cb) => { |
|
|
|
(cb) => { |
|
|
|
executionContext.web3().eth.getGasPrice((error, gasPrice) => { |
|
|
|
executionContext.web3().eth.getGasPrice((error, gasPrice) => { |
|
|
|
var warnMessage = ' Please fix this issue before sending any transaction. ' |
|
|
|
const warnMessage = ' Please fix this issue before sending any transaction. ' |
|
|
|
if (error) { |
|
|
|
if (error) { |
|
|
|
return cb('Unable to retrieve the current network gas price.' + warnMessage + error) |
|
|
|
return cb('Unable to retrieve the current network gas price.' + warnMessage + error) |
|
|
|
} |
|
|
|
} |
|
|
|
try { |
|
|
|
try { |
|
|
|
var gasPriceValue = executionContext.web3().fromWei(gasPrice.toString(10), 'gwei') |
|
|
|
const gasPriceValue = executionContext.web3().fromWei(gasPrice.toString(10), 'gwei') |
|
|
|
cb(null, gasPriceValue) |
|
|
|
cb(null, gasPriceValue) |
|
|
|
} catch (e) { |
|
|
|
} catch (e) { |
|
|
|
cb(warnMessage + e.message, null, false) |
|
|
|
cb(warnMessage + e.message, null, false) |
|
|
@ -194,10 +194,15 @@ UniversalDAppUI.prototype.getCallButton = function (args) { |
|
|
|
}) |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
) |
|
|
|
) |
|
|
|
modalDialog('Confirm transaction', content, |
|
|
|
modalDialog( |
|
|
|
|
|
|
|
'Confirm transaction', |
|
|
|
|
|
|
|
content, |
|
|
|
{ label: 'Confirm', |
|
|
|
{ label: 'Confirm', |
|
|
|
fn: () => { |
|
|
|
fn: () => { |
|
|
|
self.udapp.config.setUnpersistedProperty('doNotShowTransactionConfirmationAgain', content.querySelector('input#confirmsetting').checked) |
|
|
|
self.udapp.config.setUnpersistedProperty( |
|
|
|
|
|
|
|
'doNotShowTransactionConfirmationAgain', |
|
|
|
|
|
|
|
content.querySelector('input#confirmsetting').checked |
|
|
|
|
|
|
|
) |
|
|
|
// TODO: check if this is check is still valid given the refactor
|
|
|
|
// TODO: check if this is check is still valid given the refactor
|
|
|
|
if (!content.gasPriceStatus) { |
|
|
|
if (!content.gasPriceStatus) { |
|
|
|
cancelCb('Given gas price is not correct') |
|
|
|
cancelCb('Given gas price is not correct') |
|
|
@ -210,44 +215,46 @@ UniversalDAppUI.prototype.getCallButton = function (args) { |
|
|
|
fn: () => { |
|
|
|
fn: () => { |
|
|
|
return cancelCb('Transaction canceled by user.') |
|
|
|
return cancelCb('Transaction canceled by user.') |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var continueCb = (error, continueTxExecution, cancelCb) => { |
|
|
|
const continueCb = (error, continueTxExecution, cancelCb) => { |
|
|
|
if (error) { |
|
|
|
if (error) { |
|
|
|
var msg = typeof error !== 'string' ? error.message : error |
|
|
|
const msg = typeof error !== 'string' ? error.message : error |
|
|
|
modalDialog('Gas estimation failed', yo`<div>Gas estimation errored with the following message (see below).
|
|
|
|
modalDialog( |
|
|
|
The transaction execution will likely fail. Do you want to force sending? <br> |
|
|
|
'Gas estimation failed', |
|
|
|
${msg} |
|
|
|
yo` |
|
|
|
</div>`, |
|
|
|
<div>Gas estimation errored with the following message (see below). |
|
|
|
|
|
|
|
The transaction execution will likely fail. Do you want to force sending? <br>${msg}</div> |
|
|
|
|
|
|
|
`,
|
|
|
|
{ |
|
|
|
{ |
|
|
|
label: 'Send Transaction', |
|
|
|
label: 'Send Transaction', |
|
|
|
fn: () => { |
|
|
|
fn: () => continueTxExecution() |
|
|
|
continueTxExecution() |
|
|
|
}, |
|
|
|
}}, { |
|
|
|
{ |
|
|
|
label: 'Cancel Transaction', |
|
|
|
label: 'Cancel Transaction', |
|
|
|
fn: () => { |
|
|
|
fn: () => cancelCb() |
|
|
|
cancelCb() |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
) |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
continueTxExecution() |
|
|
|
continueTxExecution() |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var outputCb = (decoded) => { |
|
|
|
const outputCb = (decoded) => { |
|
|
|
outputOverride.innerHTML = '' |
|
|
|
outputOverride.innerHTML = '' |
|
|
|
outputOverride.appendChild(decoded) |
|
|
|
outputOverride.appendChild(decoded) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var promptCb = (okCb, cancelCb) => { |
|
|
|
const promptCb = (okCb, cancelCb) => { |
|
|
|
modalCustom.promptPassphrase('Passphrase requested', 'Personal mode is enabled. Please provide passphrase of account', '', okCb, cancelCb) |
|
|
|
modalCustom.promptPassphrase('Passphrase requested', 'Personal mode is enabled. Please provide passphrase of account', '', okCb, cancelCb) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// contractsDetails is used to resolve libraries
|
|
|
|
// contractsDetails is used to resolve libraries
|
|
|
|
txFormat.buildData(args.contractName, args.contractAbi, {}, false, args.funABI, args.funABI.type !== 'fallback' ? value : '', (error, data) => { |
|
|
|
txFormat.buildData(args.contractName, args.contractAbi, {}, false, args.funABI, args.funABI.type !== 'fallback' ? value : '', (error, data) => { |
|
|
|
if (!error) { |
|
|
|
if (!error) { |
|
|
|
if (!args.funABI.constant) { |
|
|
|
if (args.funABI.stateMutability !== 'constant' || args.funABI.constant) { |
|
|
|
self.logCallback(`${logMsg} pending ... `) |
|
|
|
self.logCallback(`${logMsg} pending ... `) |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
self.logCallback(`${logMsg}`) |
|
|
|
self.logCallback(`${logMsg}`) |
|
|
@ -264,7 +271,7 @@ UniversalDAppUI.prototype.getCallButton = function (args) { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if (lookupOnly) { |
|
|
|
if (lookupOnly) { |
|
|
|
var decoded = decodeResponseToTreeView(executionContext.isVM() ? txResult.result.execResult.returnValue : ethJSUtil.toBuffer(txResult.result), args.funABI) |
|
|
|
const decoded = decodeResponseToTreeView(executionContext.isVM() ? txResult.result.execResult.returnValue : ethJSUtil.toBuffer(txResult.result), args.funABI) |
|
|
|
outputCb(decoded) |
|
|
|
outputCb(decoded) |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
@ -282,11 +289,11 @@ UniversalDAppUI.prototype.getCallButton = function (args) { |
|
|
|
}) |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var multiParamManager = new MultiParamManager(lookupOnly, args.funABI, (valArray, inputsValues, domEl) => { |
|
|
|
const multiParamManager = new MultiParamManager(lookupOnly, args.funABI, (valArray, inputsValues, domEl) => { |
|
|
|
clickButton(valArray, inputsValues, domEl) |
|
|
|
clickButton(valArray, inputsValues, domEl) |
|
|
|
}, self.udapp.getInputs(args.funABI)) |
|
|
|
}, self.udapp.getInputs(args.funABI)) |
|
|
|
|
|
|
|
|
|
|
|
var contractActionsContainer = yo`<div class="${css.contractActionsContainer}" >${multiParamManager.render()}</div>` |
|
|
|
const contractActionsContainer = yo`<div class="${css.contractActionsContainer}" >${multiParamManager.render()}</div>` |
|
|
|
contractActionsContainer.appendChild(outputOverride) |
|
|
|
contractActionsContainer.appendChild(outputOverride) |
|
|
|
|
|
|
|
|
|
|
|
return contractActionsContainer |
|
|
|
return contractActionsContainer |
|
|
|