/* global prompt */ var $ = require('jquery'); var ethJSUtil = require('ethereumjs-util'); var EthJSTX = require('ethereumjs-tx'); var ethJSABI = require('ethereumjs-abi'); var EthJSBlock = require('ethereumjs-block'); var BN = ethJSUtil.BN; var EventManager = require('./lib/eventManager'); var crypto = require('crypto'); /* trigger debugRequested */ function UniversalDApp (executionContext, options, txdebugger) { this.event = new EventManager(); var self = this; self.options = options || {}; self.$el = $('
'); self.contracts; self.getAddress; self.getValue; self.getGasLimit; self.txdebugger = txdebugger; // temporary: will not be needed anymore when we'll add memory support to the VM var defaultRenderOutputModifier = function (name, content) { return content; }; self.renderOutputModifier = defaultRenderOutputModifier; self.web3 = executionContext.web3(); self.vm = executionContext.vm(); self.executionContext = executionContext; self.executionContext.event.register('contextChanged', this, function (context) { self.reset(self.contracts); }); } UniversalDApp.prototype.reset = function (contracts, getAddress, getValue, getGasLimit, renderer) { this.$el.empty(); this.contracts = contracts; this.getAddress = getAddress; this.getValue = getValue; this.getGasLimit = getGasLimit; this.renderOutputModifier = renderer; this.accounts = {}; if (this.executionContext.isVM()) { this.addAccount('3cd7232cd6f3fc66a57a6bedc1a8ed6c228fff0a327e169c2bcc5e869ed49511'); this.addAccount('2ac6c190b09897cd8987869cc7b918cfea07ee82038d492abce033c75c1b1d0c'); this.addAccount('dae9801649ba2d95a21e688b56f77905e5667c44ce868ec83f82e838712a2c7a'); this.addAccount('d74aa6d18aa79a05f3473dd030a97d3305737cbc8337d940344345c1f6b72eea'); this.addAccount('71975fbf7fe448e004ac7ae54cad0a383c3906055a65468714156a07385e96ce'); } }; UniversalDApp.prototype.newAccount = function () { var privateKey; do { privateKey = crypto.randomBytes(32); } while (!ethJSUtil.isValidPrivate(privateKey)); this._addAccount(privateKey); }; UniversalDApp.prototype.addAccount = function (privateKey, balance) { var self = this; if (self.accounts) { privateKey = new Buffer(privateKey, 'hex'); var address = ethJSUtil.privateToAddress(privateKey); // FIXME: we don't care about the callback, but we should still make this proper self.vm.stateManager.putAccountBalance(address, balance || 'f00000000000000001', function cb () {}); self.accounts['0x' + address.toString('hex')] = { privateKey: privateKey, nonce: 0 }; } }; UniversalDApp.prototype.getAccounts = function (cb) { var self = this; if (!self.executionContext.isVM()) { self.web3.eth.getAccounts(cb); } else { if (!self.accounts) { return cb('No accounts?'); } cb(null, Object.keys(self.accounts)); } }; UniversalDApp.prototype.getBalance = function (address, cb) { var self = this; address = ethJSUtil.stripHexPrefix(address); if (!self.executionContext.isVM()) { self.web3.eth.getBalance(address, function (err, res) { if (err) { cb(err); } else { cb(null, res.toString(10)); } }); } else { if (!self.accounts) { return cb('No accounts?'); } self.vm.stateManager.getAccountBalance(new Buffer(address, 'hex'), function (err, res) { if (err) { cb('Account not found'); } else { cb(null, new BN(res).toString(10)); } }); } }; UniversalDApp.prototype.render = function () { var self = this; if (self.contracts.length === 0) { self.$el.append(self.getABIInputForm()); } else { for (var c in self.contracts) { var $contractEl = $('
'); if (self.contracts[c].address) { self.getInstanceInterface(self.contracts[c], self.contracts[c].address, $contractEl); } else { var $title = $('').text(self.contracts[c].name); if (self.contracts[c].bytecode) { $title.append($('
').text((self.contracts[c].bytecode.length / 2) + ' bytes')); } $contractEl.append($title).append(self.getCreateInterface($contractEl, self.contracts[c])); } self.$el.append(self.renderOutputModifier(self.contracts[c].name, $contractEl)); } } var $legend = $('
') .append($('
').text('Attach')) .append($('
').text('Transact')) .append($('
').text('Call')); self.$el.append($('
') .html('Universal ÐApp powered by The Blockchain')); self.$el.append($legend); return self.$el; }; UniversalDApp.prototype.getContractByName = function (contractName) { var self = this; for (var c in self.contracts) { if (self.contracts[c].name === contractName) { return self.contracts[c]; } } return null; }; UniversalDApp.prototype.getABIInputForm = function (cb) { var self = this; var $el = $('
'); var $jsonInput = $('