parent
35d94d18a0
commit
8b1a599d75
@ -0,0 +1,304 @@ |
||||
/* global alert */ |
||||
var $ = require('jquery') |
||||
|
||||
var yo = require('yo-yo') |
||||
const copy = require('clipboard-copy') |
||||
|
||||
var parseContracts = require('./contract/contractParser') |
||||
var publishOnSwarm = require('./contract/publishOnSwarm') |
||||
var modalDialog = require('./modaldialog') |
||||
|
||||
// -------------- styling ----------------------
|
||||
var csjs = require('csjs-inject') |
||||
var styleGuide = require('./style-guide') |
||||
var styles = styleGuide() |
||||
|
||||
var css = csjs` |
||||
.compileTabView { |
||||
padding: 2%; |
||||
} |
||||
.contract { |
||||
display: block; |
||||
margin: 3% 0; |
||||
} |
||||
.compileContainer extends ${styles.displayBox} { |
||||
margin-bottom: 2%; |
||||
} |
||||
.autocompileContainer { |
||||
width: 90px; |
||||
} |
||||
.autocompileTitle { |
||||
font-weight: bold; |
||||
margin: 1% 0; |
||||
} |
||||
.autocompile { |
||||
float: left; |
||||
align-self: center; |
||||
} |
||||
.autocompileText { |
||||
align-self: center; |
||||
margin: 1% 0; |
||||
font-size: 11px; |
||||
overflow: hidden; |
||||
word-break: normal; |
||||
line-height: initial; |
||||
margin-left: 3%; |
||||
} |
||||
.warnCompilationSlow { |
||||
color: orange; |
||||
} |
||||
.compileButtons { |
||||
display: flex; |
||||
align-items: baseline; |
||||
flex-wrap: wrap; |
||||
} |
||||
.name { |
||||
display: flex; |
||||
} |
||||
.size { |
||||
display: flex; |
||||
} |
||||
.compileButton extends ${styles.button} { |
||||
width: 130px; |
||||
min-width: 130px; |
||||
display: flex; |
||||
align-items: baseline; |
||||
justify-content: center; |
||||
margin-right: 1%; |
||||
font-size: 13px; |
||||
} |
||||
.container extends ${styles.displayBox} { |
||||
margin: 0; |
||||
display: flex; |
||||
align-items: center; |
||||
} |
||||
.contractNames extends ${styles.dropdown} { |
||||
width: 250px; |
||||
margin-right: 5%; |
||||
height: 32px; |
||||
font-size: 12px; |
||||
font-weight: bold; |
||||
} |
||||
.contractButtons { |
||||
display: flex; |
||||
cursor: pointer; |
||||
justify-content: center; |
||||
text-align: center; |
||||
} |
||||
.details extends ${styles.button} { |
||||
min-width: 70px; |
||||
} |
||||
.publish extends ${styles.button} { |
||||
min-width: 70px; |
||||
margin-left: 2%; |
||||
} |
||||
.copyDetails { |
||||
margin-top: 5%; |
||||
font-size: 20px; |
||||
cursor: pointer; |
||||
color: ${styles.colors.grey}; |
||||
opacity: .5; |
||||
} |
||||
.copyDetails:hover { |
||||
opacity: 1; |
||||
} |
||||
.detailsJSON { |
||||
padding: 8px 0; |
||||
background-color: ${styles.colors.white}; |
||||
border: none; |
||||
color: ${styles.colors.grey}; |
||||
} |
||||
.icon { |
||||
margin-right: 3%; |
||||
} |
||||
.spinningIcon { |
||||
margin-right: .3em; |
||||
animation: spin 2s linear infinite; |
||||
} |
||||
.bouncingIcon { |
||||
margin-right: .3em; |
||||
animation: bounce 2s infinite; |
||||
} |
||||
@keyframes spin { |
||||
0% { transform: rotate(0deg); } |
||||
100% { transform: rotate(360deg); } |
||||
} |
||||
@-webkit-keyframes bounce { |
||||
0% { |
||||
margin-bottom: 0; |
||||
color: ${styles.colors.transparent}; |
||||
} |
||||
70% { |
||||
margin-bottom: 0; |
||||
color: ${styles.colors.grey}; |
||||
} |
||||
100% { |
||||
margin-bottom: 0; |
||||
color: ${styles.colors.transparent}; |
||||
} |
||||
} |
||||
` |
||||
|
||||
module.exports = compileTab |
||||
|
||||
function compileTab (container, appAPI, appEvents, opts) { |
||||
if (typeof container === 'string') container = document.querySelector(container) |
||||
if (!container) throw new Error('no container given') |
||||
|
||||
// Containers
|
||||
var warnCompilationSlow = yo`<i title="Copy Address" style="display:none" class="${css.warnCompilationSlow} fa fa-exclamation-triangle" aria-hidden="true"></i>` |
||||
var compileIcon = yo`<i class="fa fa-refresh ${css.icon}" aria-hidden="true"></i>` |
||||
var compileContainer = yo` |
||||
<div class="${css.compileContainer}"> |
||||
<div class="${css.compileButtons}"> |
||||
<div class="${css.compileButton} "id="compile" title="Compile source code">${compileIcon} Start to compile</div> |
||||
<div class="${css.autocompileContainer}"> |
||||
<input class="${css.autocompile}" id="autoCompile" type="checkbox" checked title="Auto compile"> |
||||
<span class="${css.autocompileText}">Auto compile</span> |
||||
</div> |
||||
${warnCompilationSlow} |
||||
</div> |
||||
</div> |
||||
` |
||||
|
||||
// REGISTER EVENTS
|
||||
|
||||
// compilationDuration
|
||||
appEvents.compiler.register('compilationDuration', function tabHighlighting (speed) { |
||||
var settingsView = document.querySelector('#righthand-panel #menu .settingsView') |
||||
if (speed > 1000) { |
||||
warnCompilationSlow.setAttribute('title', `Last compilation took ${speed}ms. We suggest to turn off autocompilation.`) |
||||
warnCompilationSlow.style.display = 'inline-block' |
||||
settingsView.style.color = '#FF8B8B' |
||||
} else { |
||||
warnCompilationSlow.style.display = 'none' |
||||
settingsView.style.color = '' |
||||
} |
||||
}) |
||||
// loadingCompiler
|
||||
appEvents.editor.register('contentChanged', function changedFile () { |
||||
var compileTab = document.querySelector('.compileView') |
||||
compileTab.style.color = styles.colors.red |
||||
compileIcon.classList.add(`${css.bouncingIcon}`) |
||||
}) |
||||
appEvents.compiler.register('loadingCompiler', function start () { |
||||
compileIcon.classList.add(`${css.spinningIcon}`) |
||||
warnCompilationSlow.style.display = 'none' |
||||
compileIcon.setAttribute('title', 'compiler is loading, please wait a few moments.') |
||||
}) |
||||
appEvents.compiler.register('compilationFinished', function finish () { |
||||
var compileTab = document.querySelector('.compileView') |
||||
compileTab.style.color = styles.colors.black |
||||
compileIcon.style.color = styles.colors.black |
||||
compileIcon.classList.remove(`${css.spinningIcon}`) |
||||
compileIcon.classList.remove(`${css.bouncingIcon}`) |
||||
compileIcon.setAttribute('title', 'idle') |
||||
}) |
||||
appEvents.compiler.register('compilationStarted', function start () { |
||||
compileIcon.classList.remove(`${css.bouncingIcon}`) |
||||
compileIcon.classList.add(`${css.spinningIcon}`) |
||||
compileIcon.setAttribute('title', 'compiling...') |
||||
}) |
||||
appEvents.compiler.register('compilerLoaded', function loaded () { |
||||
compileIcon.classList.remove(`${css.spinningIcon}`) |
||||
compileIcon.setAttribute('title', '') |
||||
}) |
||||
|
||||
var el = yo` |
||||
<div class="${css.compileTabView}" id="compileTabView"> |
||||
${compileContainer} |
||||
${contractNames(container, appAPI, appEvents, opts)} |
||||
<div class='error'></div> |
||||
</div> |
||||
` |
||||
container.appendChild(el) |
||||
|
||||
/* ------------------------------------------------ |
||||
section CONTRACT DROPDOWN, DETAILS AND PUBLISH |
||||
------------------------------------------------ */ |
||||
|
||||
function contractNames (container, appAPI, appEvents, opts) { |
||||
var contractsDetails = {} |
||||
appEvents.compiler.register('compilationFinished', function (success, data, source) { |
||||
// reset the contractMetadata list (used by the publish action)
|
||||
contractsDetails = {} |
||||
// refill the dropdown list
|
||||
getContractNames(success, data) |
||||
// hightlight the tab if error
|
||||
if (success) { |
||||
document.querySelector('#righthand-panel #menu .compileView').style.color = '' |
||||
} else { |
||||
document.querySelector('#righthand-panel #menu .compileView').style.color = '#FF8B8B' |
||||
} |
||||
// display warning error if any
|
||||
var errorContainer = container.querySelector('.error') |
||||
errorContainer.innerHTML = '' |
||||
if (data['error']) { |
||||
appAPI.compilationMessage(data['error'], $(errorContainer)) |
||||
} |
||||
if (data['errors']) { |
||||
data['errors'].forEach(function (err) { |
||||
appAPI.compilationMessage(err, $(errorContainer)) |
||||
}) |
||||
} |
||||
if (errorContainer.innerHTML === '') { |
||||
appAPI.compilationMessage('Compilation successful without warning', $(errorContainer), {type: 'success'}) |
||||
} |
||||
}) |
||||
|
||||
var el = yo` |
||||
<div class="${css.container}"> |
||||
<select class="${css.contractNames}" disabled></select> |
||||
<div class="${css.contractButtons}"> |
||||
<div class="${css.details}" onclick=${() => { details() }}>Details</div> |
||||
<div class="${css.publish}" onclick=${() => { publish(appAPI) }}>Publish</div> |
||||
</div> |
||||
</div> |
||||
` |
||||
|
||||
// HELPERS
|
||||
|
||||
// GET NAMES OF ALL THE CONTRACTS
|
||||
function getContractNames (success, data) { |
||||
var contractNames = document.querySelector(`.${css.contractNames.classNames[0]}`) |
||||
contractNames.innerHTML = '' |
||||
if (success) { |
||||
contractNames.removeAttribute('disabled') |
||||
for (var name in data.contracts) { |
||||
contractsDetails[name] = parseContracts(name, data.contracts[name], appAPI.currentCompiledSourceCode()) |
||||
var contractName = yo` |
||||
<option> |
||||
<div class="${css.name}">${name}</div> |
||||
</option>` |
||||
contractNames.appendChild(contractName) |
||||
} |
||||
appAPI.resetDapp(contractsDetails) |
||||
} else { |
||||
contractNames.setAttribute('disabled', true) |
||||
appAPI.resetDapp({}) |
||||
} |
||||
} |
||||
|
||||
function details () { |
||||
var select = el.querySelector('select') |
||||
var contractName = select.children[select.selectedIndex].innerText |
||||
var details = JSON.stringify(contractsDetails[contractName], null, '\t') |
||||
var copyDetails = yo`<div class="${css.copyDetails}"><i title="Copy details" class="fa fa-clipboard" onclick=${() => { copy(details) }} aria-hidden="true"></i></div>` |
||||
var log = yo`<div><pre class="${css.detailsJSON}">${details} ${copyDetails}</pre></div>` |
||||
modalDialog(contractName, log, {label: 'OK'}, {label: ''}) |
||||
} |
||||
|
||||
function publish (appAPI) { |
||||
var selectContractNames = document.querySelector(`.${css.contractNames.classNames[0]}`) |
||||
var contract = contractsDetails[selectContractNames.children[selectContractNames.selectedIndex].innerText] |
||||
publishOnSwarm(contract, appAPI, function (err) { |
||||
if (err) { |
||||
alert('Failed to publish metadata: ' + err) |
||||
} else { |
||||
alert('Metadata published successfully') |
||||
} |
||||
}) |
||||
} |
||||
return el |
||||
} |
||||
} |
@ -0,0 +1,384 @@ |
||||
/* global alert */ |
||||
var $ = require('jquery') |
||||
|
||||
var yo = require('yo-yo') |
||||
var helper = require('../lib/helper.js') |
||||
var txExecution = require('./execution/txExecution') |
||||
var txFormat = require('./execution/txFormat') |
||||
var txHelper = require('./execution/txHelper') |
||||
const copy = require('clipboard-copy') |
||||
|
||||
// -------------- styling ----------------------
|
||||
var csjs = require('csjs-inject') |
||||
var styleGuide = require('./style-guide') |
||||
var styles = styleGuide() |
||||
|
||||
var css = csjs` |
||||
.runTabView { |
||||
padding: 2%; |
||||
display: flex; |
||||
flex-direction: column; |
||||
} |
||||
.settings extends ${styles.displayBox} { |
||||
margin-bottom: 2%; |
||||
padding: 10px 15px 15px 15px; |
||||
} |
||||
.crow { |
||||
margin-top: .5em; |
||||
display: flex; |
||||
} |
||||
.col1 extends ${styles.titleL} { |
||||
width: 30%; |
||||
float: left; |
||||
align-self: center; |
||||
} |
||||
.col1_1 extends ${styles.titleM} { |
||||
font-size: 12px; |
||||
width: 25%; |
||||
min-width: 50px; |
||||
float: left; |
||||
align-self: center; |
||||
} |
||||
.col2 extends ${styles.inputField}{ |
||||
width: 75%; |
||||
float: left; |
||||
} |
||||
.select extends ${styles.dropdown} { |
||||
width: 75%; |
||||
float: left; |
||||
text-align: center; |
||||
} |
||||
.copyaddress { |
||||
color: #C6CFF7; |
||||
margin-left: 0.5em; |
||||
margin-top: 0.7em; |
||||
cursor: pointer; |
||||
opacity: .7; |
||||
} |
||||
.copyaddress:hover { |
||||
opacity: 1; |
||||
} |
||||
.selectAddress extends ${styles.dropdown} { |
||||
width: 70%; |
||||
float: left; |
||||
text-align: center; |
||||
} |
||||
.instanceContainer extends ${styles.displayBox} { |
||||
display: flex; |
||||
flex-direction: column; |
||||
background-color: ${styles.colors.lightBlue}; |
||||
margin-top: 2%; |
||||
} |
||||
.container extends ${styles.displayBox} { |
||||
margin-top: 2%; |
||||
} |
||||
.contractNames extends ${styles.dropdown} { |
||||
height: 32px; |
||||
font-size: 12px; |
||||
width: 100%; |
||||
font-weight: bold; |
||||
background-color: ${styles.colors.lightGrey} |
||||
} |
||||
.buttons { |
||||
display: flex; |
||||
cursor: pointer; |
||||
justify-content: center; |
||||
flex-direction: column; |
||||
text-align: center; |
||||
font-size: 12px; |
||||
} |
||||
.button { |
||||
display: flex; |
||||
align-items: flex-end; |
||||
margin-top: 2%; |
||||
} |
||||
.atAddress extends ${styles.button} { |
||||
background-color: ${styles.colors.green}; |
||||
border-top-right-radius: 0; |
||||
border-bottom-right-radius: 0; |
||||
} |
||||
.create extends ${styles.button} { |
||||
background-color: ${styles.colors.lightRed}; |
||||
border-top-right-radius: 0; |
||||
border-bottom-right-radius: 0; |
||||
} |
||||
.input extends ${styles.inputField} { |
||||
border-top-left-radius: 0; |
||||
border-bottom-left-radius: 0; |
||||
width: 75%; |
||||
font-size: 10px; |
||||
padding-left: 10px; |
||||
} |
||||
.noInstancesText extends ${styles.displayBox} { |
||||
text-align: center; |
||||
color: ${styles.colors.lightGrey}; |
||||
font-style: italic; |
||||
} |
||||
.legend extends ${styles.displayBox} { |
||||
border-radius: 5px; |
||||
display: flex; |
||||
justify-content: center; |
||||
padding: 15px 8px; |
||||
word-break: normal; |
||||
flex-wrap: wrap; |
||||
} |
||||
.item { |
||||
margin-right: 1em; |
||||
display: flex; |
||||
align-items: center; |
||||
} |
||||
.transact { |
||||
color: ${styles.colors.lightRed}; |
||||
margin-right: .3em; |
||||
} |
||||
.payable { |
||||
color: ${styles.colors.red}; |
||||
margin-right: .3em; |
||||
} |
||||
.call { |
||||
color: #9DC1F5; |
||||
margin-right: .3em; |
||||
} |
||||
` |
||||
|
||||
module.exports = runTab |
||||
|
||||
var instanceContainer = yo`<div class="${css.instanceContainer}"></div>` |
||||
var noInstancesText = yo`<div class="${css.noInstancesText}">No Contract Instances.</div>` |
||||
|
||||
function runTab (container, appAPI, appEvents, opts) { |
||||
var el = yo` |
||||
<div class="${css.runTabView}" id="runTabView"> |
||||
${settings(appAPI, appEvents)} |
||||
${legend()} |
||||
${contractDropdown(appAPI, appEvents, instanceContainer)} |
||||
${instanceContainer} |
||||
</div> |
||||
` |
||||
container.appendChild(el) |
||||
|
||||
// DROPDOWN
|
||||
var selectExEnv = el.querySelector('#selectExEnvOptions') |
||||
selectExEnv.addEventListener('change', function (event) { |
||||
if (!appAPI.executionContextChange(selectExEnv.options[selectExEnv.selectedIndex].value)) { |
||||
selectExEnv.value = appAPI.executionContextProvider() |
||||
} |
||||
fillAccountsList(appAPI, el) |
||||
instanceContainer.innerHTML = '' // clear the instances list
|
||||
instanceContainer.appendChild(noInstancesText) |
||||
}) |
||||
selectExEnv.value = appAPI.executionContextProvider() |
||||
fillAccountsList(appAPI, el) |
||||
setInterval(() => { updateAccountBalances(container, appAPI) }, 1000) |
||||
} |
||||
|
||||
|
||||
function fillAccountsList (appAPI, container) { |
||||
var $txOrigin = $(container.querySelector('#txorigin')) |
||||
$txOrigin.empty() |
||||
appAPI.udapp().getAccounts((err, accounts) => { |
||||
if (err) { console.log(err) } |
||||
if (accounts && accounts[0]) { |
||||
for (var a in accounts) { $txOrigin.append($('<option />').val(accounts[a]).text(accounts[a])) } |
||||
$txOrigin.val(accounts[0]) |
||||
} else { |
||||
$txOrigin.val('unknown') |
||||
} |
||||
}) |
||||
} |
||||
|
||||
function updateAccountBalances (container, appAPI) { |
||||
var accounts = $(container.querySelector('#txorigin')).children('option') |
||||
accounts.each(function (index, value) { |
||||
(function (acc) { |
||||
appAPI.getBalance(accounts[acc].value, function (err, res) { |
||||
if (!err) { |
||||
accounts[acc].innerText = helper.shortenAddress(accounts[acc].value, res) |
||||
} |
||||
}) |
||||
})(index) |
||||
}) |
||||
} |
||||
|
||||
/* ------------------------------------------------ |
||||
section CONTRACT DROPDOWN and BUTTONS |
||||
------------------------------------------------ */ |
||||
|
||||
function contractDropdown (appAPI, appEvents, instanceContainer) { |
||||
instanceContainer.appendChild(noInstancesText) |
||||
|
||||
appEvents.compiler.register('compilationFinished', function (success, data, source) { |
||||
getContractNames(success, data) |
||||
}) |
||||
|
||||
var atAddressButtonInput = yo`<input class="${css.input} ataddressinput" placeholder="Enter contract's address - i.e. 0x60606..." title="atAddress" />` |
||||
var createButtonInput = yo`<input class="${css.input}" placeholder="" title="create" />` |
||||
var selectContractNames = yo`<select class="${css.contractNames}" disabled></select>` |
||||
var el = yo` |
||||
<div class="${css.container}"> |
||||
${selectContractNames} |
||||
<div class="${css.buttons}"> |
||||
<div class="${css.button}"> |
||||
<div class="${css.atAddress}" onclick=${function () { loadFromAddress(appAPI) }}>At Address</div> |
||||
${atAddressButtonInput} |
||||
</div> |
||||
<div class="${css.button}"> |
||||
<div class="${css.create}" onclick=${function () { createInstance() }} >Create</div> |
||||
${createButtonInput} |
||||
</div> |
||||
</div> |
||||
</div> |
||||
` |
||||
|
||||
function setInputParamsPlaceHolder () { |
||||
createButtonInput.value = '' |
||||
if (appAPI.getContracts()) { |
||||
var contract = appAPI.getContracts()[selectContractNames.children[selectContractNames.selectedIndex].innerText] |
||||
var ctrabi = txHelper.getConstructorInterface(contract.interface) |
||||
if (ctrabi.inputs.length) { |
||||
createButtonInput.setAttribute('placeholder', txHelper.inputParametersDeclarationToString(ctrabi.inputs)) |
||||
createButtonInput.removeAttribute('disabled') |
||||
return |
||||
} |
||||
} |
||||
createButtonInput.setAttribute('placeholder', '') |
||||
createButtonInput.setAttribute('disabled', true) |
||||
} |
||||
|
||||
selectContractNames.addEventListener('change', setInputParamsPlaceHolder) |
||||
|
||||
var init = false |
||||
// ADD BUTTONS AT ADDRESS AND CREATE
|
||||
function createInstance () { |
||||
var contractNames = document.querySelector(`.${css.contractNames.classNames[0]}`) |
||||
var contracts = appAPI.getContracts() |
||||
var contract = appAPI.getContracts()[contractNames.children[contractNames.selectedIndex].innerText] |
||||
var constructor = txHelper.getConstructorInterface(contract.interface) |
||||
var args = createButtonInput.value |
||||
txFormat.buildData(contract, contracts, true, constructor, args, appAPI.udapp(), appAPI.executionContext(), (error, data) => { |
||||
if (!error) { |
||||
txExecution.createContract(data, appAPI.udapp(), (error, txResult) => { |
||||
// TODO here should send the result to the dom-console
|
||||
console.log('Contract creation', error, txResult) |
||||
var address = appAPI.executionContext().isVM() ? txResult.result.createdAddress : txResult.result.contractAddress |
||||
if (!init) { |
||||
instanceContainer.innerHTML = '' |
||||
init = true |
||||
} |
||||
instanceContainer.appendChild(appAPI.udapp().renderInstance(contract, address, selectContractNames.value)) |
||||
}) |
||||
} else { |
||||
alert(error) |
||||
} |
||||
}) |
||||
} |
||||
|
||||
function loadFromAddress (appAPI) { |
||||
if (!init) { |
||||
instanceContainer.innerHTML = '' |
||||
init = true |
||||
} |
||||
var contractNames = document.querySelector(`.${css.contractNames.classNames[0]}`) |
||||
var contract = appAPI.getContracts()[contractNames.children[contractNames.selectedIndex].innerText] |
||||
var address = atAddressButtonInput.value |
||||
instanceContainer.appendChild(appAPI.udapp().renderInstance(contract, address, selectContractNames.value)) |
||||
} |
||||
|
||||
// GET NAMES OF ALL THE CONTRACTS
|
||||
function getContractNames (success, data) { |
||||
var contractNames = document.querySelector(`.${css.contractNames.classNames[0]}`) |
||||
contractNames.innerHTML = '' |
||||
if (success) { |
||||
selectContractNames.removeAttribute('disabled') |
||||
for (var name in data.contracts) { |
||||
contractNames.appendChild(yo`<option>${name}</option>`) |
||||
} |
||||
} else { |
||||
selectContractNames.setAttribute('disabled', true) |
||||
} |
||||
setInputParamsPlaceHolder() |
||||
} |
||||
|
||||
return el |
||||
} |
||||
|
||||
/* ------------------------------------------------ |
||||
section SETTINGS: Environment, Account, Gas, Value |
||||
------------------------------------------------ */ |
||||
function settings (appAPI, appEvents) { |
||||
// COPY ADDRESS
|
||||
function copyAddress () { |
||||
copy(document.querySelector('#runTabView #txorigin').value) |
||||
} |
||||
|
||||
// SETTINGS HTML
|
||||
var el = yo` |
||||
<div class="${css.settings}"> |
||||
<div class="${css.crow}"> |
||||
<div id="selectExEnv" class="${css.col1_1}"> |
||||
Environment |
||||
</div> |
||||
<select id="selectExEnvOptions" class="${css.select}"> |
||||
<option id="vm-mode" |
||||
title="Execution environment does not connect to any node, everything is local and in memory only." |
||||
value="vm" |
||||
checked name="executionContext"> |
||||
JavaScript VM |
||||
</option> |
||||
<option id="injected-mode" |
||||
title="Execution environment has been provided by Mist or similar provider." |
||||
value="injected" |
||||
checked name="executionContext"> |
||||
Injected Web3 |
||||
</option> |
||||
<option id="web3-mode" |
||||
title="Execution environment connects to node at localhost (or via IPC if available), transactions will be sent to the network and can cause loss of money or worse! |
||||
If this page is served via https and you access your node via http, it might not work. In this case, try cloning the repository and serving it via http." |
||||
value="web3" |
||||
name="executionContext"> |
||||
Web3 Provider |
||||
</option> |
||||
</select> |
||||
</div> |
||||
<div class="${css.crow}"> |
||||
<div class="${css.col1_1}">Account</div> |
||||
<select name="txorigin" class="${css.selectAddress}" id="txorigin"></select> |
||||
<i title="Copy Address" class="copytxorigin fa fa-clipboard ${css.copyaddress}" onclick=${copyAddress} aria-hidden="true"></i> |
||||
</div> |
||||
<div class="${css.crow}"> |
||||
<div class="${css.col1_1}">Gas limit</div> |
||||
<input type="number" class="${css.col2}" id="gasLimit" value="3000000"> |
||||
</div> |
||||
<div class="${css.crow} hide"> |
||||
<div class="${css.col1_1}">Gas Price</div> |
||||
<input type="number" class="${css.col2}" id="gasPrice" value="0"> |
||||
</div> |
||||
<div class="${css.crow}"> |
||||
<div class="${css.col1_1}">Value</div> |
||||
<input type="text" class="${css.col2}" id="value" value="0" title="(e.g. .7 ether ...)"> |
||||
</div> |
||||
</div> |
||||
` |
||||
|
||||
// EVENTS
|
||||
appEvents.udapp.register('transactionExecuted', (to, data, lookupOnly, txResult) => { |
||||
if (!lookupOnly) el.querySelector('#value').value = '0' |
||||
}) |
||||
|
||||
return el |
||||
} |
||||
|
||||
/* ------------------------------------------------ |
||||
section LEGEND |
||||
------------------------------------------------ */ |
||||
function legend () { |
||||
var el = |
||||
yo` |
||||
<div class="${css.legend}"> |
||||
<div class="${css.item}"><i class="fa fa-circle ${css.transact}" aria-hidden="true"></i>Transact</div/> |
||||
<div class="${css.item}"><i class="fa fa-circle ${css.payable}" aria-hidden="true"></i>Transact(Payable)</div/> |
||||
<div class="${css.item}"><i class="fa fa-circle ${css.call}" aria-hidden="true"></i>Call</div/> |
||||
</div> |
||||
` |
||||
return el |
||||
} |
Loading…
Reference in new issue