|
|
@ -1,33 +1,27 @@ |
|
|
|
/* global */ |
|
|
|
/* global */ |
|
|
|
'use strict' |
|
|
|
'use strict' |
|
|
|
|
|
|
|
|
|
|
|
var $ = require('jquery') |
|
|
|
const $ = require('jquery') |
|
|
|
var yo = require('yo-yo') |
|
|
|
const yo = require('yo-yo') |
|
|
|
var ethJSUtil = require('ethereumjs-util') |
|
|
|
const ethJSUtil = require('ethereumjs-util') |
|
|
|
var BN = ethJSUtil.BN |
|
|
|
const BN = ethJSUtil.BN |
|
|
|
var helper = require('../../lib/helper') |
|
|
|
const helper = require('../../lib/helper') |
|
|
|
var copyToClipboard = require('./copy-to-clipboard') |
|
|
|
const copyToClipboard = require('./copy-to-clipboard') |
|
|
|
var css = require('../../universal-dapp-styles') |
|
|
|
const css = require('../../universal-dapp-styles') |
|
|
|
var MultiParamManager = require('./multiParamManager') |
|
|
|
const MultiParamManager = require('./multiParamManager') |
|
|
|
var remixLib = require('remix-lib') |
|
|
|
const remixLib = require('remix-lib') |
|
|
|
var txFormat = remixLib.execution.txFormat |
|
|
|
const txFormat = remixLib.execution.txFormat |
|
|
|
var txHelper = remixLib.execution.txHelper |
|
|
|
const txHelper = remixLib.execution.txHelper |
|
|
|
|
|
|
|
|
|
|
|
var confirmDialog = require('./confirmDialog') |
|
|
|
const confirmDialog = require('./confirmDialog') |
|
|
|
var modalCustom = require('./modal-dialog-custom') |
|
|
|
const modalCustom = require('./modal-dialog-custom') |
|
|
|
var modalDialog = require('./modaldialog') |
|
|
|
const modalDialog = require('./modaldialog') |
|
|
|
var TreeView = require('./TreeView') |
|
|
|
const TreeView = require('./TreeView') |
|
|
|
|
|
|
|
|
|
|
|
function UniversalDAppUI (blockchain, logCallback) { |
|
|
|
|
|
|
|
this.blockchain = blockchain |
|
|
|
|
|
|
|
this.logCallback = logCallback |
|
|
|
|
|
|
|
this.compilerData = {contractsDetails: {}} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function decodeResponseToTreeView (response, fnabi) { |
|
|
|
function decodeResponseToTreeView (response, fnabi) { |
|
|
|
var treeView = new TreeView({ |
|
|
|
const treeView = new TreeView({ |
|
|
|
extractData: (item, parent, key) => { |
|
|
|
extractData: (item, parent, key) => { |
|
|
|
var ret = {} |
|
|
|
let ret = {} |
|
|
|
if (BN.isBN(item)) { |
|
|
|
if (BN.isBN(item)) { |
|
|
|
ret.self = item.toString(10) |
|
|
|
ret.self = item.toString(10) |
|
|
|
ret.children = [] |
|
|
|
ret.children = [] |
|
|
@ -40,8 +34,16 @@ function decodeResponseToTreeView (response, fnabi) { |
|
|
|
return treeView.render(txFormat.decodeResponse(response, fnabi)) |
|
|
|
return treeView.render(txFormat.decodeResponse(response, fnabi)) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
UniversalDAppUI.prototype.renderInstance = function (contract, address, contractName) { |
|
|
|
class UniversalDAppUI { |
|
|
|
var noInstances = document.querySelector('[class^="noInstancesText"]') |
|
|
|
|
|
|
|
|
|
|
|
constructor (blockchain, logCallback) { |
|
|
|
|
|
|
|
this.blockchain = blockchain |
|
|
|
|
|
|
|
this.logCallback = logCallback |
|
|
|
|
|
|
|
this.compilerData = { contractsDetails: {} } |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
renderInstance (contract, address, contractName) { |
|
|
|
|
|
|
|
const noInstances = document.querySelector('[class^="noInstancesText"]') |
|
|
|
if (noInstances) { |
|
|
|
if (noInstances) { |
|
|
|
noInstances.parentNode.removeChild(noInstances) |
|
|
|
noInstances.parentNode.removeChild(noInstances) |
|
|
|
} |
|
|
|
} |
|
|
@ -53,14 +55,21 @@ UniversalDAppUI.prototype.renderInstance = function (contract, address, contract |
|
|
|
// this will render an instance: contract name, contract address, and all the public functions
|
|
|
|
// this will render an instance: contract name, contract address, and all the public functions
|
|
|
|
// basically this has to be called for the "atAddress" (line 393) and when a contract creation succeed
|
|
|
|
// basically this has to be called for the "atAddress" (line 393) and when a contract creation succeed
|
|
|
|
// this returns a DOM element
|
|
|
|
// this returns a DOM element
|
|
|
|
UniversalDAppUI.prototype.renderInstanceFromABI = function (contractABI, address, contractName) { |
|
|
|
renderInstanceFromABI (contractABI, address, contractName) { |
|
|
|
address = (address.slice(0, 2) === '0x' ? '' : '0x') + address.toString('hex') |
|
|
|
address = (address.slice(0, 2) === '0x' ? '' : '0x') + address.toString('hex') |
|
|
|
address = ethJSUtil.toChecksumAddress(address) |
|
|
|
address = ethJSUtil.toChecksumAddress(address) |
|
|
|
var instance = yo`<div class="instance ${css.instance} ${css.hidesub}" id="instance${address}"></div>` |
|
|
|
const instance = yo`<div class="instance ${css.instance} ${css.hidesub}" id="instance${address}"></div>` |
|
|
|
const context = this.blockchain.context() |
|
|
|
const context = this.blockchain.context() |
|
|
|
|
|
|
|
|
|
|
|
var shortAddress = helper.shortenAddress(address) |
|
|
|
function toggleClass (e) { |
|
|
|
var title = yo` |
|
|
|
$(instance).toggleClass(`${css.hidesub}`) |
|
|
|
|
|
|
|
// e.currentTarget.querySelector('i')
|
|
|
|
|
|
|
|
e.currentTarget.querySelector('i').classList.toggle(`fa-angle-right`) |
|
|
|
|
|
|
|
e.currentTarget.querySelector('i').classList.toggle(`fa-angle-down`) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const shortAddress = helper.shortenAddress(address) |
|
|
|
|
|
|
|
const title = yo` |
|
|
|
<div class="${css.title} alert alert-secondary p-2"> |
|
|
|
<div class="${css.title} alert alert-secondary p-2"> |
|
|
|
<button class="btn ${css.titleExpander}" onclick="${(e) => { toggleClass(e) }}"> |
|
|
|
<button class="btn ${css.titleExpander}" onclick="${(e) => { toggleClass(e) }}"> |
|
|
|
<i class="fas fa-angle-right" aria-hidden="true"></i> |
|
|
|
<i class="fas fa-angle-right" aria-hidden="true"></i> |
|
|
@ -78,33 +87,21 @@ UniversalDAppUI.prototype.renderInstanceFromABI = function (contractABI, address |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
` |
|
|
|
` |
|
|
|
|
|
|
|
|
|
|
|
var close = yo` |
|
|
|
const close = yo` |
|
|
|
<button |
|
|
|
<button |
|
|
|
class="${css.udappClose} p-1 btn btn-secondary" |
|
|
|
class="${css.udappClose} p-1 btn btn-secondary" |
|
|
|
onclick=${remove} |
|
|
|
onclick=${() => { instance.remove() }} |
|
|
|
title="Remove from the list" |
|
|
|
title="Remove from the list" |
|
|
|
> |
|
|
|
> |
|
|
|
<i class="${css.closeIcon} fas fa-times" aria-hidden="true"></i> |
|
|
|
<i class="${css.closeIcon} fas fa-times" aria-hidden="true"></i> |
|
|
|
</button>` |
|
|
|
</button>` |
|
|
|
title.querySelector('.btn-group').appendChild(close) |
|
|
|
title.querySelector('.btn-group').appendChild(close) |
|
|
|
|
|
|
|
|
|
|
|
var contractActionsWrapper = yo` |
|
|
|
const contractActionsWrapper = yo` |
|
|
|
<div class="${css.cActionsWrapper}"> |
|
|
|
<div class="${css.cActionsWrapper}"> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
` |
|
|
|
` |
|
|
|
|
|
|
|
|
|
|
|
function remove () { |
|
|
|
|
|
|
|
instance.remove() |
|
|
|
|
|
|
|
// @TODO perhaps add a callack here to warn the caller that the instance has been removed
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function toggleClass (e) { |
|
|
|
|
|
|
|
$(instance).toggleClass(`${css.hidesub}`) |
|
|
|
|
|
|
|
// e.currentTarget.querySelector('i')
|
|
|
|
|
|
|
|
e.currentTarget.querySelector('i').classList.toggle(`fa-angle-right`) |
|
|
|
|
|
|
|
e.currentTarget.querySelector('i').classList.toggle(`fa-angle-down`) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
instance.appendChild(title) |
|
|
|
instance.appendChild(title) |
|
|
|
instance.appendChild(contractActionsWrapper) |
|
|
|
instance.appendChild(contractActionsWrapper) |
|
|
|
|
|
|
|
|
|
|
@ -136,7 +133,7 @@ UniversalDAppUI.prototype.renderInstanceFromABI = function (contractABI, address |
|
|
|
return instance |
|
|
|
return instance |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
UniversalDAppUI.prototype.getConfirmationCb = function (modalDialog, confirmDialog) { |
|
|
|
getConfirmationCb (modalDialog, confirmDialog) { |
|
|
|
const 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) |
|
|
@ -153,7 +150,7 @@ UniversalDAppUI.prototype.getConfirmationCb = function (modalDialog, confirmDial |
|
|
|
if (!content.gasPriceStatus) { |
|
|
|
if (!content.gasPriceStatus) { |
|
|
|
cancelCb('Given gas price is not correct') |
|
|
|
cancelCb('Given gas price is not correct') |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
var gasPrice = this.blockchain.toWei(content.querySelector('#gasprice').value, 'gwei') |
|
|
|
const gasPrice = this.blockchain.toWei(content.querySelector('#gasprice').value, 'gwei') |
|
|
|
continueTxExecution(gasPrice) |
|
|
|
continueTxExecution(gasPrice) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -171,15 +168,14 @@ UniversalDAppUI.prototype.getConfirmationCb = function (modalDialog, confirmDial |
|
|
|
|
|
|
|
|
|
|
|
// 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) { |
|
|
|
getCallButton (args) { |
|
|
|
let self = this |
|
|
|
|
|
|
|
// args.funABI, args.address [fun only]
|
|
|
|
// args.funABI, args.address [fun only]
|
|
|
|
// args.contractName [constr only]
|
|
|
|
// args.contractName [constr only]
|
|
|
|
const lookupOnly = args.funABI.stateMutability === 'view' || args.funABI.stateMutability === 'pure' || 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
|
|
|
|
const outputOverride = yo`<div class=${css.value}></div>` // show return value
|
|
|
|
|
|
|
|
|
|
|
|
function clickButton (valArr, inputsValues) { |
|
|
|
const clickButton = (valArr, inputsValues) => { |
|
|
|
let logMsg |
|
|
|
let logMsg |
|
|
|
if (!lookupOnly) { |
|
|
|
if (!lookupOnly) { |
|
|
|
logMsg = `call to ${args.contractName}.${(args.funABI.name) ? args.funABI.name : '(fallback)'}` |
|
|
|
logMsg = `call to ${args.contractName}.${(args.funABI.name) ? args.funABI.name : '(fallback)'}` |
|
|
@ -187,7 +183,7 @@ UniversalDAppUI.prototype.getCallButton = function (args) { |
|
|
|
logMsg = `transact to ${args.contractName}.${(args.funABI.name) ? args.funABI.name : '(fallback)'}` |
|
|
|
logMsg = `transact to ${args.contractName}.${(args.funABI.name) ? args.funABI.name : '(fallback)'}` |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const confirmationCb = self.getConfirmationCb(modalDialog, confirmDialog) |
|
|
|
const confirmationCb = this.getConfirmationCb(modalDialog, confirmDialog) |
|
|
|
const continueCb = (error, continueTxExecution, cancelCb) => { |
|
|
|
const continueCb = (error, continueTxExecution, cancelCb) => { |
|
|
|
if (error) { |
|
|
|
if (error) { |
|
|
|
const msg = typeof error !== 'string' ? error.message : error |
|
|
|
const msg = typeof error !== 'string' ? error.message : error |
|
|
@ -222,7 +218,7 @@ UniversalDAppUI.prototype.getCallButton = function (args) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const callType = args.funABI.type !== 'fallback' ? inputsValues : '' |
|
|
|
const callType = args.funABI.type !== 'fallback' ? inputsValues : '' |
|
|
|
self.blockchain.runOrCallContractMethod(args.contractName, args.contractAbi, args.funABI, inputsValues, args.address, callType, lookupOnly, logMsg, self.logCallback, outputCb, confirmationCb, continueCb, promptCb) |
|
|
|
this.blockchain.runOrCallContractMethod(args.contractName, args.contractAbi, args.funABI, inputsValues, args.address, callType, lookupOnly, logMsg, this.logCallback, outputCb, confirmationCb, continueCb, promptCb) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
let inputs = '' |
|
|
|
let inputs = '' |
|
|
@ -240,4 +236,6 @@ UniversalDAppUI.prototype.getCallButton = function (args) { |
|
|
|
return contractActionsContainer |
|
|
|
return contractActionsContainer |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
module.exports = UniversalDAppUI |
|
|
|
module.exports = UniversalDAppUI |
|
|
|