From 990d279490a4780d974e86b8b64af814510b56c6 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 26 Jan 2015 10:28:15 -0800 Subject: [PATCH] Fixed spurious whisper watches firing. Additional standard APIs. Refinement of standard.js. --- alethzero/MainWin.cpp | 2 +- libethereum/LogFilter.cpp | 5 ++- libsolidity/CompilerStack.cpp | 3 ++ standard.js | 78 ++++------------------------------- 4 files changed, 16 insertions(+), 72 deletions(-) diff --git a/alethzero/MainWin.cpp b/alethzero/MainWin.cpp index 47ebf03ed..1fbed013c 100644 --- a/alethzero/MainWin.cpp +++ b/alethzero/MainWin.cpp @@ -1700,7 +1700,7 @@ void Main::on_data_textChanged() // compiler.addSources(dev::solidity::StandardSources); m_data = compiler.compile(src, m_enableOptimizer); solidity = "

Solidity

"; - solidity += "
var " + QString::fromStdString(compiler.getContractNames().back()) + " = web3.eth.contractFromAbi(" + QString::fromStdString(compiler.getInterface()).replace(QRegExp("\\s"), "").toHtmlEscaped() + ");
"; + solidity += "
var " + QString::fromStdString(compiler.getContractNames().front()) + " = web3.eth.contractFromAbi(" + QString::fromStdString(compiler.getInterface()).replace(QRegExp("\\s"), "").toHtmlEscaped() + ");
"; solidity += "
" + QString::fromStdString(compiler.getSolidityInterface()).toHtmlEscaped() + "
"; solidity += "
" + QString::fromStdString(getFunctionHashes(compiler)).toHtmlEscaped() + "
"; } diff --git a/libethereum/LogFilter.cpp b/libethereum/LogFilter.cpp index eca428cfa..65e819b98 100644 --- a/libethereum/LogFilter.cpp +++ b/libethereum/LogFilter.cpp @@ -72,11 +72,12 @@ LogEntries LogFilter::matches(TransactionReceipt const& _m) const for (LogEntry const& e: _m.log()) { if (!m_addresses.empty() && !m_addresses.count(e.address)) - continue; + goto continue2; for (auto const& t: m_topics) if (!std::count(e.topics.begin(), e.topics.end(), t)) - continue; + goto continue2; ret.push_back(e); + continue2:; } return ret; } diff --git a/libsolidity/CompilerStack.cpp b/libsolidity/CompilerStack.cpp index 8caaec083..a8ba037f2 100644 --- a/libsolidity/CompilerStack.cpp +++ b/libsolidity/CompilerStack.cpp @@ -141,6 +141,9 @@ string CompilerStack::expanded(string const& _sourceCode) { const map c_standardSources = map{ { "Config", "contract Config{function lookup(uint256 service)constant returns(address a){}function kill(){}function unregister(uint256 id){}function register(uint256 id,address service){}}" }, + { "Coin", "contract Coin{function isApprovedFor(address _target,address _proxy)constant returns(bool _r){}function isApproved(address _proxy)constant returns(bool _r){}function sendCoinFrom(address _from,uint256 _val,address _to){}function coinBalanceOf(address _a)constant returns(uint256 _r){}function sendCoin(uint256 _val,address _to){}function coinBalance()constant returns(uint256 _r){}function approve(address _a){}}"}, + { "CoinReg", "contract CoinReg{function count()constant returns(uint256 r){}function info(uint256 i)constant returns(address addr,string3 name,uint256 denom){}function register(string3 name,uint256 denom){}function unregister(){}}" }, + { "coin", "#require CoinReg\ncontract coin {function coin(string3 name, uint denom) {CoinReg(Config().lookup(3)).register(name, denom);}}" }, { "service", "#require Config\ncontract service{function service(uint _n){Config().register(_n, this);}}" }, { "owned", "contract owned{function owned(){owner = msg.sender;}address owner;}" }, { "mortal", "#require owned\ncontract mortal is owned {function kill() { if (msg.sender == owner) suicide(owner); }}" }, diff --git a/standard.js b/standard.js index 41f03384c..0f9cf6fa4 100644 --- a/standard.js +++ b/standard.js @@ -1,5 +1,3 @@ -///TODO - var compile = function(name) { return web3.eth.solidity(env.contents("/home/gav/Eth/dapp-bin/" + name + "/" + name + ".sol")); web3.eth.flush(); }; var create = function(code) { return web3.eth.transact({ 'code': code }); web3.eth.flush(); }; var createVal = function(code, val) { return web3.eth.transact(val ? { 'code': code, 'value': val } : { 'code': code }); web3.eth.flush(); }; @@ -11,6 +9,8 @@ var addrConfig = create(compile("config")); var addrNameReg = initService("namereg"); var addrGavsino = initServiceVal("gavmble", "1000000000000000000"); var addrCoinReg = initService("coins"); +var addrGavCoin = initService("coin"); +var addrRegistrar = initService("registrar"); var abiNameReg = [{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"getName","outputs":[{"name":"o_name","type":"string32"}]},{"constant":false,"inputs":[{"name":"name","type":"string32"}],"name":"register","outputs":[]},{"constant":true,"inputs":[{"name":"name","type":"string32"}],"name":"addressOf","outputs":[{"name":"addr","type":"address"}]},{"constant":true,"inputs":[{"name":"_name","type":"string32"}],"name":"getAddress","outputs":[{"name":"o_owner","type":"address"}]},{"constant":false,"inputs":[],"name":"unregister","outputs":[]},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"nameOf","outputs":[{"name":"name","type":"string32"}]}]; var regName = function(account, name) { return web3.eth.contract(addrNameReg, abiNameReg).transact({'from': account, 'gas': 10000}).register(name); }; @@ -19,71 +19,11 @@ send(web3.eth.accounts[0], '100000000000000000000', web3.eth.accounts[1]); regName(web3.eth.accounts[0], 'Gav'); regName(web3.eth.accounts[1], 'Gav Would'); -/* -// ASYNC API - -var compile = function(name) { return web3.eth.solidity(env.contents("/home/gav/Eth/dapp-bin/" + name + "/" + name + ".sol")); }; -var create = function(code) { return web3.eth.transact({ 'code': code }); }; -var createVal = function(code, val) { return web3.eth.transact(val ? { 'code': code, 'value': val } : { 'code': code }); }; -var send = function(from, val, to) { return web3.eth.transact({ 'from': from, 'value': val, 'to': to }); }; -var initService = function(name, dep) { return dep.then(function(){ return compile(name).then(create); }); }; -var initServiceVal = function(name, dep, val) { return dep.then(function(){ return compile(name).then(function(c) { createVal(c, val); }); }); }; - -var addrConfig = compile("config").then(create); -var addrNameReg = initService("namereg", addrConfig); -var addrGavsino = initServiceVal("gavmble", addrNameReg, "1000000000000000000"); - -var abiNameReg = [{"constant":true,"inputs":[{"name":"name","type":"string32"}],"name":"addressOf","outputs":[{"name":"addr","type":"address"}]},{"constant":false,"inputs":[],"name":"kill","outputs":[]},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"nameOf","outputs":[{"name":"name","type":"string32"}]},{"constant":false,"inputs":[{"name":"name","type":"string32"}],"name":"register","outputs":[]},{"constant":false,"inputs":[],"name":"unregister","outputs":[]}]; -var regName = function(account, name) { return web3.contract(addrNameReg, abiNameReg).register(name).transact({'from': account, 'gas': 10000}); }; - -//var coins = initService("coins", 1, nameReg); -//var coin = initService("coin", 2, coins); -//var approve = function(account, approvedAddress) { web3.eth.transact({ 'from': account, 'to': coin, 'gas': '10000', 'data': [ web3.fromAscii('approve'), approvedAddress ] }); }; -//var exchange = initService("exchange", 3, coin); -//var offer = function(account, haveCoin, haveVal, wantCoin, wantVal) { web3.eth.transact({ 'from': account, 'to': exchange, 'gas': '10000', 'data': [web3.fromAscii('new'), haveCoin, haveVal, wantCoin, wantVal] }); }; - -addrConfig.then(function() { - env.note("config ready"); - web3.eth.accounts.then(function(accounts) - { - env.note("accounts ready"); - var funded = send(accounts[0], '100000000000000000000', accounts[1]); - funded.then(function(){ - env.note("second account funded"); - regName(accounts[1], 'Gav Would'); - }); - regName(accounts[0], 'Gav'); - - // TODO: once we have the exchange. -// approve(accounts[0], exchange).then(function(){ offer(accounts[0], coin, '5000', '0', '5000000000000000000'); }); -// funded.then(function(){ approve(accounts[1], exchange); }); - - // TODO: once we have a new implementation of DNSReg. - // env.note('Register gav.eth...') - // eth.transact({ 'to': dnsReg, 'data': [web3.fromAscii('register'), web3.fromAscii('gav'), web3.fromAscii('opensecrecy.com')] }); - }); -}); -*/ -// TODO -/* -var nameRegJeff; - -env.note('Create NameRegJeff...') -eth.transact({ 'code': nameRegCode }, function(a) { nameRegJeff = a; }); - -env.note('Register NameRegJeff...') -eth.transact({ 'to': config, 'data': ['4', nameRegJeff] }); - -var dnsRegCode = '0x60006000546000600053602001546000600053604001546020604060206020600073661005d2720d855f1d9976f88bb10c1a3398c77f6103e8f17f7265676973746572000000000000000000000000000000000000000000000000600053606001600060200201547f446e735265670000000000000000000000000000000000000000000000000000600053606001600160200201546000600060006000604060606000600053604001536103e8f1327f6f776e65720000000000000000000000000000000000000000000000000000005761011663000000e46000396101166000f20060006000547f72656769737465720000000000000000000000000000000000000000000000006000602002350e0f630000006d596000600160200235560e0f630000006c59600032560e0f0f6300000057596000325657600260200235600160200235576001602002353257007f64657265676973746572000000000000000000000000000000000000000000006000602002350e0f63000000b95960016020023532560e0f63000000b959600032576000600160200235577f6b696c6c000000000000000000000000000000000000000000000000000000006000602002350e0f630000011559327f6f776e6572000000000000000000000000000000000000000000000000000000560e0f63000001155932ff00'; - -var dnsReg; -env.note('Create DnsReg...') -eth.transact({ 'code': dnsRegCode }, function(a) { dnsReg = a; }); - -env.note('DnsReg at address ' + dnsReg) - -env.note('Register DnsReg...') -eth.transact({ 'to': config, 'data': ['4', dnsReg] }); -*/ +// TODO: once we have the exchange. +// var offer = function(account, haveCoin, haveVal, wantCoin, wantVal) { web3.eth.transact({ 'from': account, 'to': exchange, 'gas': '10000', 'data': [web3.fromAscii('new'), haveCoin, haveVal, wantCoin, wantVal] }); }; +// approve(accounts[0], exchange).then(function(){ offer(accounts[0], coin, '5000', '0', '5000000000000000000'); }); +// funded.then(function(){ approve(accounts[1], exchange); }); -// env.load('/home/gav/Eth/cpp-ethereum/stdserv.js') +// TODO: once we have a new implementation of DNSReg. +// env.note('Register gav.eth...') +// eth.transact({ 'to': dnsReg, 'data': [web3.fromAscii('register'), web3.fromAscii('gav'), web3.fromAscii('opensecrecy.com')] });