aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmd/ethereum/flags.go2
-rw-r--r--cmd/ethereum/main.go2
-rw-r--r--cmd/mist/assets/ext/big.js46
-rw-r--r--cmd/mist/assets/ext/bignumber.min.js2
-rw-r--r--cmd/mist/assets/ext/dist/ethereum.js2
-rw-r--r--cmd/mist/assets/ext/ethereum.js/.bowerrc5
-rw-r--r--cmd/mist/assets/ext/ethereum.js/.editorconfig12
-rw-r--r--cmd/mist/assets/ext/ethereum.js/.gitignore18
-rw-r--r--cmd/mist/assets/ext/ethereum.js/.jshintrc50
-rw-r--r--cmd/mist/assets/ext/ethereum.js/.npmignore9
-rw-r--r--cmd/mist/assets/ext/ethereum.js/.travis.yml11
-rw-r--r--cmd/mist/assets/ext/ethereum.js/LICENSE14
-rw-r--r--cmd/mist/assets/ext/ethereum.js/README.md79
-rw-r--r--cmd/mist/assets/ext/ethereum.js/bower.json51
-rw-r--r--cmd/mist/assets/ext/ethereum.js/dist/ethereum.js1184
-rw-r--r--cmd/mist/assets/ext/ethereum.js/dist/ethereum.js.map29
-rw-r--r--cmd/mist/assets/ext/ethereum.js/dist/ethereum.min.js1
-rw-r--r--cmd/mist/assets/ext/ethereum.js/example/balance.html41
-rw-r--r--cmd/mist/assets/ext/ethereum.js/example/contract.html75
-rw-r--r--cmd/mist/assets/ext/ethereum.js/example/node-app.js16
-rw-r--r--cmd/mist/assets/ext/ethereum.js/gulpfile.js104
-rw-r--r--cmd/mist/assets/ext/ethereum.js/index.js8
-rw-r--r--cmd/mist/assets/ext/ethereum.js/lib/abi.js267
-rw-r--r--cmd/mist/assets/ext/ethereum.js/lib/autoprovider.js103
-rw-r--r--cmd/mist/assets/ext/ethereum.js/lib/contract.js66
-rw-r--r--cmd/mist/assets/ext/ethereum.js/lib/httprpc.js95
-rw-r--r--cmd/mist/assets/ext/ethereum.js/lib/qt.js46
-rw-r--r--cmd/mist/assets/ext/ethereum.js/lib/web3.js509
-rw-r--r--cmd/mist/assets/ext/ethereum.js/lib/websocket.js78
-rw-r--r--cmd/mist/assets/ext/ethereum.js/package.json67
-rw-r--r--cmd/mist/assets/ext/example/balance.html9
-rw-r--r--cmd/mist/assets/qml/depricated_browser.qml (renamed from cmd/mist/assets/qml/browser.qml)0
-rw-r--r--cmd/mist/assets/qml/main.qml64
-rw-r--r--cmd/mist/assets/qml/views/browser.qml208
-rw-r--r--cmd/mist/assets/qml/views/info.qml2
-rw-r--r--cmd/mist/assets/qml/views/wallet.qml15
-rw-r--r--cmd/mist/bindings.go2
-rw-r--r--cmd/mist/debugger.go2
-rw-r--r--cmd/mist/errors.go2
-rw-r--r--cmd/mist/ext_app.go26
-rw-r--r--cmd/mist/flags.go2
-rw-r--r--cmd/mist/gui.go112
-rw-r--r--cmd/mist/html_container.go8
-rw-r--r--cmd/mist/main.go7
-rw-r--r--cmd/mist/qml_container.go4
-rw-r--r--cmd/mist/ui_lib.go89
-rw-r--r--cmd/utils/cmd.go20
-rw-r--r--core/block_processor.go21
-rw-r--r--core/filter.go118
-rw-r--r--eth/backend.go10
-rw-r--r--event/filter/old_filter.go8
-rw-r--r--javascript/javascript_runtime.go4
-rw-r--r--javascript/types.go70
-rw-r--r--rpc/args.go218
-rw-r--r--rpc/http/server.go111
-rw-r--r--rpc/json.go44
-rw-r--r--rpc/message.go169
-rw-r--r--rpc/packages.go335
-rw-r--r--rpc/server.go67
-rw-r--r--rpc/writer.go75
-rw-r--r--rpc/ws/server.go123
-rw-r--r--ui/filter.go26
-rw-r--r--ui/qt/filter.go19
-rw-r--r--ui/qt/qwhisper/whisper.go2
-rw-r--r--ui/qt/webengine/all.cpp1
-rw-r--r--ui/qt/webengine/cpp/webengine.cpp6
-rw-r--r--ui/qt/webengine/cpp/webengine.h14
-rw-r--r--ui/qt/webengine/webengine.go18
-rw-r--r--websocket/util.go (renamed from cmd/utils/websockets.go)49
-rw-r--r--xeth/config.go35
-rw-r--r--xeth/hexface.go239
-rw-r--r--xeth/object.go26
-rw-r--r--xeth/types.go (renamed from xeth/js_types.go)86
-rw-r--r--xeth/world.go57
-rw-r--r--xeth/xeth.go267
75 files changed, 1572 insertions, 4210 deletions
diff --git a/cmd/ethereum/flags.go b/cmd/ethereum/flags.go
index f829744dc..e0fbbb008 100644
--- a/cmd/ethereum/flags.go
+++ b/cmd/ethereum/flags.go
@@ -41,6 +41,7 @@ var (
StartRpc bool
StartWebSockets bool
RpcPort int
+ WsPort int
NatType string
PMPGateway string
OutboundPort string
@@ -96,6 +97,7 @@ func Init() {
flag.StringVar(&PMPGateway, "pmp", "", "Gateway IP for PMP")
flag.IntVar(&MaxPeer, "maxpeer", 30, "maximum desired peers")
flag.IntVar(&RpcPort, "rpcport", 8080, "port to start json-rpc server on")
+ flag.IntVar(&WsPort, "wsport", 40404, "port to start websocket rpc server on")
flag.BoolVar(&StartRpc, "rpc", false, "start rpc server")
flag.BoolVar(&StartWebSockets, "ws", false, "start websocket server")
flag.BoolVar(&NonInteractive, "y", false, "non-interactive mode (say yes to confirmations)")
diff --git a/cmd/ethereum/main.go b/cmd/ethereum/main.go
index b816c678e..92dbf5a6f 100644
--- a/cmd/ethereum/main.go
+++ b/cmd/ethereum/main.go
@@ -131,7 +131,7 @@ func main() {
}
if StartWebSockets {
- utils.StartWebSockets(ethereum)
+ utils.StartWebSockets(ethereum, WsPort)
}
utils.StartEthereum(ethereum, UseSeed)
diff --git a/cmd/mist/assets/ext/big.js b/cmd/mist/assets/ext/big.js
index daa8d7227..145a6aa6c 100644
--- a/cmd/mist/assets/ext/big.js
+++ b/cmd/mist/assets/ext/big.js
@@ -15,7 +15,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
// MA 02110-1301 USA
-var bigInt = (function () {
+var BigNumber = (function () {
var base = 10000000, logBase = 7;
var sign = {
positive: false,
@@ -73,7 +73,7 @@ var bigInt = (function () {
var isValid = (base == 16 ? /^[0-9A-F]*$/ : /^[0-9]+$/).test(text);
if (!isValid) throw new Error("Invalid integer");
if (base == 16) {
- var val = bigInt(0);
+ var val = BigNumber(0);
while (text.length) {
v = text.charCodeAt(0) - 48;
if (v > 9)
@@ -89,19 +89,19 @@ var bigInt = (function () {
value.push(+text.slice(divider));
text = text.slice(0, divider);
}
- var val = bigInt(value, s);
+ var val = BigNumber(value, s);
if (first) normalize(first, val);
return val;
}
};
var goesInto = function (a, b) {
- var a = bigInt(a, sign.positive), b = bigInt(b, sign.positive);
+ var a = BigNumber(a, sign.positive), b = BigNumber(b, sign.positive);
if (a.equals(0)) throw new Error("Cannot divide by 0");
var n = 0;
do {
var inc = 1;
- var c = bigInt(a.value, sign.positive), t = c.times(10);
+ var c = BigNumber(a.value, sign.positive), t = c.times(10);
while (t.lesser(b)) {
c = t;
inc *= 10;
@@ -119,7 +119,7 @@ var bigInt = (function () {
};
};
- var bigInt = function (value, s) {
+ var BigNumber = function (value, s) {
var self = {
value: value,
sign: s
@@ -129,11 +129,11 @@ var bigInt = (function () {
sign: s,
negate: function (m) {
var first = m || self;
- return bigInt(first.value, !first.sign);
+ return BigNumber(first.value, !first.sign);
},
abs: function (m) {
var first = m || self;
- return bigInt(first.value, sign.positive);
+ return BigNumber(first.value, sign.positive);
},
add: function (n, m) {
var s, first = self, second;
@@ -141,8 +141,8 @@ var bigInt = (function () {
else second = parse(n, first);
s = first.sign;
if (first.sign !== second.sign) {
- first = bigInt(first.value, sign.positive);
- second = bigInt(second.value, sign.positive);
+ first = BigNumber(first.value, sign.positive);
+ second = BigNumber(second.value, sign.positive);
return s === sign.positive ?
o.subtract(first, second) :
o.subtract(second, first);
@@ -157,7 +157,7 @@ var bigInt = (function () {
sum -= carry * base;
result.push(sum);
}
- return bigInt(result, s);
+ return BigNumber(result, s);
},
plus: function (n, m) {
return o.add(n, m);
@@ -178,7 +178,7 @@ var bigInt = (function () {
var minuend = (borrow * base) + tmp - b[i];
result.push(minuend);
}
- return bigInt(result, sign.positive);
+ return BigNumber(result, sign.positive);
},
minus: function (n, m) {
return o.subtract(n, m);
@@ -223,7 +223,7 @@ var bigInt = (function () {
sum -= carry * base;
result.push(sum);
}
- return bigInt(result, s);
+ return BigNumber(result, s);
},
times: function (n, m) {
return o.multiply(n, m);
@@ -233,9 +233,9 @@ var bigInt = (function () {
if (m) (first = parse(n)) && (second = parse(m));
else second = parse(n, first);
s = first.sign !== second.sign;
- if (bigInt(first.value, first.sign).equals(0)) return {
- quotient: bigInt([0], sign.positive),
- remainder: bigInt([0], sign.positive)
+ if (BigNumber(first.value, first.sign).equals(0)) return {
+ quotient: BigNumber([0], sign.positive),
+ remainder: BigNumber([0], sign.positive)
};
if (second.equals(0)) throw new Error("Cannot divide by zero");
var a = first.value, b = second.value;
@@ -248,8 +248,8 @@ var bigInt = (function () {
}
result.reverse();
return {
- quotient: bigInt(result, s),
- remainder: bigInt(remainder, first.sign)
+ quotient: BigNumber(result, s),
+ remainder: BigNumber(remainder, first.sign)
};
},
divide: function (n, m) {
@@ -268,7 +268,7 @@ var bigInt = (function () {
var a = first, b = second;
if (b.lesser(0)) return ZERO;
if (b.equals(0)) return ONE;
- var result = bigInt(a.value, a.sign);
+ var result = BigNumber(a.value, a.sign);
if (b.mod(2).equals(0)) {
var c = result.pow(b.over(2));
@@ -377,9 +377,9 @@ var bigInt = (function () {
return o;
};
- var ZERO = bigInt([0], sign.positive);
- var ONE = bigInt([1], sign.positive);
- var MINUS_ONE = bigInt([1], sign.negative);
+ var ZERO = BigNumber([0], sign.positive);
+ var ONE = BigNumber([1], sign.positive);
+ var MINUS_ONE = BigNumber([1], sign.negative);
var fnReturn = function (a) {
if (typeof a === "undefined") return ZERO;
@@ -392,6 +392,6 @@ var bigInt = (function () {
})();
if (typeof module !== "undefined") {
- module.exports = bigInt;
+ module.exports = BigNumber;
}
diff --git a/cmd/mist/assets/ext/bignumber.min.js b/cmd/mist/assets/ext/bignumber.min.js
new file mode 100644
index 000000000..c1627d780
--- /dev/null
+++ b/cmd/mist/assets/ext/bignumber.min.js
@@ -0,0 +1,2 @@
+/*! bignumber.js v2.0.0 https://github.com/MikeMcl/bignumber.js/LICENCE */
+(function(n){"use strict";function t(n,i){var b,a,l,p,o,w,s=this;if(!(s instanceof t))return new t(n,i);if(n instanceof t){if(i==null){u=0;s.s=n.s;s.e=n.e;s.c=(n=n.c)?n.slice():n;return}n+=""}else if(p=(o=typeof n)=="number"){if(i==null&&n===~~n){for(s.s=1/n<0?(n=-n,-1):1,a=u=0,l=n;l>=10;l/=10,a++);s.e=a;s.c=[n];return}n=n===0&&1/n<0?"-0":n+""}else o!="string"&&(n+="");if(o=n,i==null&&ft.test(o))s.s=o.charCodeAt(0)===45?(o=o.slice(1),-1):1;else{if(i==10)return s=new t(o),y(s,c+s.e+1,h);if(o=lt.call(o).replace(/^\+(?!-)/,""),s.s=o.charCodeAt(0)===45?(o=o.replace(/^-(?!-)/,""),-1):1,i!=null?i!=~~i&&d||(e=!(i>=2&&i<65))?(f(i,2),w=ft.test(o)):(b="["+ut.slice(0,i=i|0)+"]+",o=o.replace(/\.$/,"").replace(/^\./,"0."),(w=new RegExp("^"+b+"(?:\\."+b+")?$",i<37?"i":"").test(o))?(p&&(o.replace(/^0\.0*|\./,"").length>15&&f(n,0),p=!p),o=ct(o,10,i,s.s)):o!="Infinity"&&o!="NaN"&&(f(n,1,i),n="NaN")):w=ft.test(o),!w){s.c=s.e=null;o!="Infinity"&&(o!="NaN"&&f(n,3),s.s=null);u=0;return}}for((a=o.indexOf("."))>-1&&(o=o.replace(".","")),(l=o.search(/e/i))>0?(a<0&&(a=l),a+=+o.slice(l+1),o=o.substring(0,l)):a<0&&(a=o.length),l=0;o.charCodeAt(l)===48;l++);for(i=o.length;o.charCodeAt(--i)===48;);if(o=o.slice(l,i+1),o)if(i=o.length,p&&i>15&&f(n,0),a=a-l-1,a>v)s.c=s.e=null;else if(a<nt)s.c=[s.e=0];else{if(s.e=a,s.c=[],l=(a+1)%r,a<0&&(l+=r),l<i){for(l&&s.c.push(+o.slice(0,l)),i-=r;l<i;s.c.push(+o.slice(l,l+=r)));o=o.slice(l);l=r-o.length}else l-=i;for(;l--;o+="0");s.c.push(+o)}else s.c=[s.e=0];u=0}function et(n,t,i){for(var f=1,u=t.length;!t[--u];t.pop());for(u=t[0];u>=10;u/=10,f++);return(i=f+i*r-1)>v?n.c=n.e=null:i<nt?n.c=[n.e=0]:(n.e=i,n.c=t),n}function tt(n){for(var t,f,e=1,i=n.length,u=n[0]+"";e<i;){for(t=n[e++]+"",f=r-t.length;f--;t="0"+t);u+=t}for(i=u.length;u.charCodeAt(--i)===48;);return u.slice(0,i+1||1)}function ht(n,t,i){for(var u,r=[0],f,e=0,o=n.length;e<o;){for(f=r.length;f--;r[f]*=t);for(r[u=0]+=ut.indexOf(n.charAt(e++));u<r.length;u++)r[u]>i-1&&(r[u+1]==null&&(r[u+1]=0),r[u+1]+=r[u]/i|0,r[u]%=i)}return r.reverse()}function ct(n,i,r,u){var l,e,v,y,s,f,w,o=n.indexOf("."),p=h;for(r<37&&(n=n.toLowerCase()),o>=0&&(n=n.replace(".",""),w=new t(r),s=w.pow(n.length-o),w.c=ht(s.toFixed(),10,i),w.e=w.c.length),f=ht(n,r,i),e=v=f.length;f[--v]==0;f.pop());if(!f[0])return"0";if(o<0?--e:(s.c=f,s.e=e,s.s=u,s=a(s,w,c,p,i),f=s.c,y=s.r,e=s.e),l=e+c+1,o=f[l],v=i/2,y=y||l<0||f[l+1]!=null,y=p<4?(o!=null||y)&&(p==0||p==(s.s<0?3:2)):o>v||o==v&&(p==4||y||p==6&&f[l-1]&1||p==(s.s<0?8:7)),l<1||!f[0])f.length=1,v=0,y?(f[0]=1,e=-c):e=f[0]=0;else{if(f.length=l,y)for(--i;++f[--l]>i;)f[l]=0,l||(++e,f.unshift(1));for(v=f.length;!f[--v];);}for(o=0,n="";o<=v;n+=ut.charAt(f[o++]));if(e<0){for(;++e;n="0"+n);n="0."+n}else if(o=n.length,++e>o)for(e-=o;e--;n+="0");else e<o&&(n=n.slice(0,e)+"."+n.slice(e));return n}function rt(n,i,r){var o,u,e,f=(n=new t(n)).e;if(i==null?o=0:(y(n,++i,h),o=r?i:i+n.e-f,f=n.e),u=tt(n.c),r==1||r==2&&(i<=f||f<=p)){for(;u.length<o;u+="0");u.length>1&&(u=u.charAt(0)+"."+u.slice(1));u+=(f<0?"e":"e+")+f}else{if(r=u.length,f<0){for(e=o-r;++f;u="0"+u);u="0."+u}else if(++f>r){for(e=o-f,f-=r;f--;u+="0");e>0&&(u+=".")}else e=o-r,f<r?u=u.slice(0,f)+"."+u.slice(f):e>0&&(u+=".");if(e>0)for(;e--;u+="0");}return n.s<0&&n.c[0]?"-"+u:u}function f(n,t,i,r,f,o){if(d){var c,s=["new BigNumber","cmp","div","eq","gt","gte","lt","lte","minus","mod","plus","times","toFraction","divToInt"][u?u<0?-u:u:1/u<0?1:0]+"()",h=e?" out of range":" not a"+(f?" non-zero":"n")+" integer";h=([s+" number type has more than 15 significant digits",s+" not a base "+i+" number",s+" base"+h,s+" not a number"][t]||i+"() "+t+(o?" not a boolean or binary digit":h+(r?" or not ["+(e?" negative, positive":" integer, integer")+" ]":"")))+": "+n;e=u=0;c=new Error(h);c.name="BigNumber Error";throw c;}}function y(n,t,i,u){var c,o,e,s,a,h,p,f,y=st;if(f=n.c){n:{for(c=1,s=f[0];s>=10;s/=10,c++);if(o=t-c,o<0)o+=r,e=t,a=f[h=0],p=a/y[c-e-1]%10|0;else if(h=Math.ceil((o+1)/r),h>=f.length)if(u){for(;f.length<=h;f.push(0));a=p=0;c=1;o%=r;e=o-r+1}else break n;else{for(a=s=f[h],c=1;s>=10;s/=10,c++);o%=r;e=o-r+c;p=e<0?0:a/y[c-e-1]%10|0}if(u=u||t<0||f[h+1]!=null||(e<0?a:a%y[c-e-1]),u=i<4?(p||u)&&(i==0||i==(n.s<0?3:2)):p>5||p==5&&(i==4||u||i==6&&(o>0?e>0?a/y[c-e]:0:f[h-1])%10&1||i==(n.s<0?8:7)),t<1||!f[0])return f.length=0,u?(t-=n.e+1,f[0]=y[t%r],n.e=-t||0):f[0]=n.e=0,n;if(o==0?(f.length=h,s=1,h--):(f.length=h+1,s=y[r-o],f[h]=e>0?g(a/y[c-e]%y[e])*s:0),u)for(;;)if(h==0){for(o=1,e=f[0];e>=10;e/=10,o++);for(e=f[0]+=s,s=1;e>=10;e/=10,s++);o!=s&&(n.e++,f[0]==l&&(f[0]=1));break}else{if(f[h]+=s,f[h]!=l)break;f[h--]=0;s=1}for(o=f.length;f[--o]===0;f.pop());}n.e>v?n.c=n.e=null:n.e<nt&&(n.c=[n.e=0])}return n}var o=1e9,ot=1e6,c=20,h=4,p=-7,k=21,nt=-o,v=o,d=!0,w=parseInt,b={decimalSeparator:".",groupSeparator:",",groupSize:3,secondaryGroupSize:0,fractionGroupSeparator:" ",fractionGroupSize:0},i=t.prototype,ut="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_",e,u=0,g=Math.floor,ft=/^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,lt=String.prototype.trim||function(){return this.replace(/^\s+|\s+$/g,"")},l=1e14,r=14,s=1e7,st=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],it=new t(1),a;t.ROUND_UP=0;t.ROUND_DOWN=1;t.ROUND_CEIL=2;t.ROUND_FLOOR=3;t.ROUND_HALF_UP=4;t.ROUND_HALF_DOWN=5;t.ROUND_HALF_EVEN=6;t.ROUND_HALF_CEIL=7;t.ROUND_HALF_FLOOR=8;t.config=function(){var n,t,g=0,i={},y=arguments,a=y[0],s="config",r=function(n,t,i){return!((e=n<t||n>i)||w(n)!=n&&n!==0)},l=a&&typeof a=="object"?function(){if(a.hasOwnProperty(t))return(n=a[t])!=null}:function(){if(y.length>g)return(n=y[g++])!=null};if(l(t="DECIMAL_PLACES")&&(r(n,0,o)?c=n|0:f(n,t,s)),i[t]=c,l(t="ROUNDING_MODE")&&(r(n,0,8)?h=n|0:f(n,t,s)),i[t]=h,l(t="EXPONENTIAL_AT")&&(r(n,-o,o)?p=-(k=~~(n<0?-n:+n)):!e&&n&&r(n[0],-o,0)&&r(n[1],0,o)?(p=~~n[0],k=~~n[1]):f(n,t,s,1)),i[t]=[p,k],l(t="RANGE")&&(r(n,-o,o)&&~~n?nt=-(v=~~(n<0?-n:+n)):!e&&n&&r(n[0],-o,-1)&&r(n[1],1,o)?(nt=~~n[0],v=~~n[1]):f(n,t,s,1,1)),i[t]=[nt,v],l(t="ERRORS")&&(n===!!n||n===1||n===0?(e=u=0,w=(d=!!n)?parseInt:parseFloat):f(n,t,s,0,0,1)),i[t]=d,l(t="FORMAT"))if(typeof n=="object")b=n;else if(d){i=new Error(s+"() "+t+" not an object: "+n);i.name="BigNumber Error";throw i;}return i[t]=b,i};a=function(){function n(n,t,i){var f,e,o,h,r=0,u=n.length,c=t%s,l=t/s|0;for(n=n.slice();u--;)o=n[u]%s,h=n[u]/s|0,f=l*o+h*c,e=c*o+f%s*s+r,r=(e/i|0)+(f/s|0)+l*h,n[u]=e%i;return r&&n.unshift(r),n}function i(n,t,i,r){var u,f;if(i!=r)f=i>r?1:-1;else for(u=f=0;u<i;u++)if(n[u]!=t[u]){f=n[u]>t[u]?1:-1;break}return f}function u(n,t,i,r){for(var u=0;i--;)n[i]-=u,u=n[i]<t[i]?1:0,n[i]=u*r+n[i]-t[i];for(;!n[0]&&n.length>1;n.shift());}return function(f,e,o,s,h){var nt,ut,a,ot,p,tt,ft,it,et,v,w,st,ht,rt,lt,k,ct,d=f.s==e.s?1:-1,b=f.c,c=e.c;if(!b||!b[0]||!c||!c[0])return new t(!f.s||!e.s||(b?c&&b[0]==c[0]:!c)?NaN:b&&b[0]==0||!c?d*0:d/0);for(it=new t(d),et=it.c=[],ut=f.e-e.e,d=o+ut+1,h||(h=l,ut=(rt=f.e/r,a=rt|0,rt>0||rt===a?a:a-1)-(k=e.e/r,a=k|0,k>0||k===a?a:a-1),d=d/r|0),a=0;c[a]==(b[a]||0);a++);if(c[a]>(b[a]||0)&&ut--,d<0)et.push(1),ot=!0;else{for(rt=b.length,k=c.length,a=0,d+=2,p=g(h/(c[0]+1)),p>1&&(c=n(c,p,h),b=n(b,p,h),k=c.length,rt=b.length),ht=k,v=b.slice(0,k),w=v.length;w<k;v[w++]=0);ct=c.slice();ct.unshift(0);lt=c[0];c[1]>=h/2&&lt++;do p=0,nt=i(c,v,k,w),nt<0?(st=v[0],k!=w&&(st=st*h+(v[1]||0)),p=g(st/lt),p>1?(p>=h&&(p=h-1),tt=n(c,p,h),ft=tt.length,w=v.length,nt=i(tt,v,ft,w),nt==1&&(p--,u(tt,k<ft?ct:c,ft,h))):(p==0&&(nt=p=1),tt=c.slice()),ft=tt.length,ft<w&&tt.unshift(0),u(v,tt,w,h),nt==-1&&(w=v.length,nt=i(c,v,k,w),nt<1&&(p++,u(v,k<w?ct:c,w,h))),w=v.length):nt===0&&(p++,v=[0]),et[a++]=p,nt&&v[0]?v[w++]=b[ht]||0:(v=[b[ht]],w=1);while((ht++<rt||v[0]!=null)&&d--);ot=v[0]!=null;et[0]||et.shift()}if(h==l){for(a=1,d=et[0];d>=10;d/=10,a++);y(it,o+(it.e=a+ut*r-1)+1,s,ot)}else it.e=ut,it.r=+ot;return it}}();i.absoluteValue=i.abs=function(){var n=new t(this);return n.s<0&&(n.s=1),n};i.ceil=function(){return y(new t(this),this.e+1,2)};i.comparedTo=i.cmp=function(n,i){var f,l=this,e=l.c,o=(u=-u,n=new t(n,i)).c,r=l.s,c=n.s,s=l.e,h=n.e;if(!r||!c)return null;if(f=e&&!e[0],i=o&&!o[0],f||i)return f?i?0:-c:r;if(r!=c)return r;if(f=r<0,i=s==h,!e||!o)return i?0:!e^f?1:-1;if(!i)return s>h^f?1:-1;for(r=-1,c=(s=e.length)<(h=o.length)?s:h;++r<c;)if(e[r]!=o[r])return e[r]>o[r]^f?1:-1;return s==h?0:s>h^f?1:-1};i.decimalPlaces=i.dp=function(){var n,t,i=this.c;if(!i)return null;if(n=((t=i.length-1)-g(this.e/r))*r,t=i[t])for(;t%10==0;t/=10,n--);return n<0&&(n=0),n};i.dividedBy=i.div=function(n,i){return u=2,a(this,new t(n,i),c,h)};i.dividedToIntegerBy=i.divToInt=function(n,i){return u=13,a(this,new t(n,i),0,1)};i.equals=i.eq=function(n,t){return u=3,this.cmp(n,t)===0};i.floor=function(){return y(new t(this),this.e+1,3)};i.greaterThan=i.gt=function(n,t){return u=4,this.cmp(n,t)>0};i.greaterThanOrEqualTo=i.gte=function(n,t){return u=5,(t=this.cmp(n,t))==1||t===0};i.isFinite=function(){return!!this.c};i.isInteger=i.isInt=function(){return!!this.c&&g(this.e/r)>this.c.length-2};i.isNaN=function(){return!this.s};i.isNegative=i.isNeg=function(){return this.s<0};i.isZero=function(){return!!this.c&&this.c[0]==0};i.lessThan=i.lt=function(n,t){return u=6,this.cmp(n,t)<0};i.lessThanOrEqualTo=i.lte=function(n,t){return u=7,(t=this.cmp(n,t))==-1||t===0};i.minus=function(n,i){var e,c,v,w,p=this,s=p.s;if(u=8,n=new t(n,i),i=n.s,!s||!i)return new t(NaN);if(s!=i)return n.s=-i,p.plus(n);var y=p.e/r,a=n.e/r,f=p.c,o=n.c;if(!y||!a){if(!f||!o)return f?(n.s=-i,n):new t(o?p:NaN);if(!f[0]||!o[0])return o[0]?(n.s=-i,n):new t(f[0]?p:h==3?-0:0)}if(e=y|0,y=y>0||y===e?e:e-1,e=a|0,a=a>0||a===e?e:e-1,f=f.slice(),s=y-a){for((w=s<0)?(s=-s,v=f):(a=y,v=o),v.reverse(),i=s;i--;v.push(0));v.reverse()}else for(c=(w=(s=f.length)<(i=o.length))?s:i,s=i=0;i<c;i++)if(f[i]!=o[i]){w=f[i]<o[i];break}if(w&&(v=f,f=o,o=v,n.s=-n.s),i=(c=o.length)-(e=f.length),i>0)for(;i--;f[e++]=0);for(i=l-1;c>s;){if(f[--c]<o[c]){for(e=c;e&&!f[--e];f[e]=i);--f[e];f[c]+=l}f[c]-=o[c]}for(;f[0]==0;f.shift(),--a);return f[0]?et(n,f,a):(n.s=h==3?-1:1,n.c=[n.e=0],n)};i.modulo=i.mod=function(n,i){u=9;var r=this,f=r.c,e=(n=new t(n,i)).c,o=r.s,s=n.s;return(i=!o||!s||e&&!e[0],i||f&&!f[0])?new t(i?NaN:r):(r.s=n.s=1,i=n.cmp(r)==1,r.s=o,n.s=s,i?new t(r):r.minus(a(r,n,0,1).times(n)))};i.negated=i.neg=function(){var n=new t(this);return n.s=-n.s||null,n};i.plus=function(n,i){var h,a=this,f=a.s;if(u=10,n=new t(n,i),i=n.s,!f||!i)return new t(NaN);if(f!=i)return n.s=-i,a.minus(n);var c=a.e/r,o=n.e/r,e=a.c,s=n.c;if(!c||!o){if(!e||!s)return new t(f/0);if(!e[0]||!s[0])return s[0]?n:new t(e[0]?a:f*0)}if(f=c|0,c=c>0||c===f?f:f-1,f=o|0,o=o>0||o===f?f:f-1,e=e.slice(),f=c-o){for(f>0?(o=c,h=s):(f=-f,h=e),h.reverse();f--;h.push(0));h.reverse()}for(f=e.length,i=s.length,f-i<0&&(h=s,s=e,e=h,i=f),f=0;i;)f=(e[--i]=e[i]+s[i]+f)/l|0,e[i]%=l;return f&&(e.unshift(f),++o),et(n,e,o)};i.round=function(n,i){return n=n==null||((e=n<0||n>o)||w(n)!=n)&&!f(n,"decimal places","round")?0:n|0,i=i==null||((e=i<0||i>8)||w(i)!=i&&i!==0)&&!f(i,"mode","round")?h:i|0,y(new t(this),n+this.e+1,i)};i.squareRoot=i.sqrt=function(){var v,i,r,s,f,e=this,o=e.c,n=e.s,u=e.e,l=c+4,p=new t("0.5");if(n!==1||!o||!o[0])return new t(!n||n<0&&(!o||o[0])?NaN:o?e:1/0);if(n=Math.sqrt(+e),n==0||n==1/0?(i=tt(o),(i.length+u)%2==0&&(i+="0"),n=Math.sqrt(i),u=g((u+1)/2)-(u<0||u%2),n==1/0?i="1e"+u:(i=n.toExponential(),i=i.slice(0,i.indexOf("e")+1)+u),r=new t(i)):r=new t(n.toString()),r.c[0])for(u=r.e,n=u+l,n<3&&(n=0);;)if(f=r,r=p.times(f.plus(a(e,f,l,1))),tt(f.c).slice(0,n)===(i=tt(r.c)).slice(0,n))if(r.e<u&&--n,i=i.slice(n-3,n+1),i!="9999"&&(s||i!="4999")){+i&&(+i.slice(1)||i.charAt(0)!="5")||(y(r,r.e+c+2,1),v=!r.times(r).eq(e));break}else{if(!s&&(y(f,f.e+c+2,0),f.times(f).eq(e))){r=f;break}l+=4;n+=4;s=1}return y(r,r.e+c+1,h,v)};i.times=function(n,i){var p,e,w,b,a,y,k,d,g,nt=this,o=nt.c,h=(u=11,n=new t(n,i)).c,c=nt.e/r,f=n.e/r,v=nt.s;if(n.s=v==(i=n.s)?1:-1,!c&&(!o||!o[0])||!f&&(!h||!h[0]))return new t(!v||!i||o&&!o[0]&&!h||h&&!h[0]&&!o?NaN:!o||!h?n.s/0:n.s*0);for(e=(e=c|0,c>0||c===e?e:e-1)+(e=f|0,f>0||f===e?e:e-1),v=o.length,i=h.length,v<i&&(a=o,o=h,h=a,f=v,v=i,i=f),f=v+i,a=[];f--;a.push(0));for(c=i;--c>=0;){for(p=0,f=v+c,w=v,d=h[c]%s,g=h[c]/s|0;f>c;)y=o[--w]%s,k=o[w]/s|0,b=g*y+k*d,y=d*y+b%s*s+a[f]+p,p=(y/l|0)+(b/s|0)+g*k,a[f--]=y%l;a[f]=p}return p?++e:a.shift(),et(n,a,e)};i.toExponential=function(n){var t=this;return t.c?rt(t,n==null||((e=n<0||n>o)||w(n)!=n&&n!==0)&&!f(n,"decimal places","toExponential")?null:n|0,1):t.toString()};i.toFixed=function(n){var t,i=this,r=p,u=k;return n=n==null||((e=n<0||n>o)||w(n)!=n&&n!==0)&&!f(n,"decimal places","toFixed")?null:i.e+(n|0),p=-(k=1/0),n!=null&&i.c?(t=rt(i,n),i.s<0&&i.c&&(i.c[0]?t.indexOf("-")<0&&(t="-"+t):t=t.replace("-",""))):t=i.toString(),p=r,k=u,t};i.toFormat=function(n){var f=this;if(!f.c)return f.toString();var t,h=f.s<0,c=b.groupSeparator,r=+b.groupSize,u=+b.secondaryGroupSize,l=f.toFixed(n).split("."),i=l[0],s=l[1],e=h?i.slice(1):i,o=e.length;if(u&&(t=r,r=u,u=t,o-=t),r>0&&o>0){for(t=o%r||r,i=e.substr(0,t);t<o;t+=r)i+=c+e.substr(t,r);u>0&&(i+=c+e.slice(t));h&&(i="-"+i)}return s?i+b.decimalSeparator+((u=+b.fractionGroupSize)?s.replace(new RegExp("\\d{"+u+"}\\B","g"),"$&"+b.fractionGroupSeparator):s):i};i.toFraction=function(n){var ut,c,i,w,k,o,s,nt,rt,l=c=new t(it),y=s=new t(it),b=this,ft=b.c,p=new t(it);if(!ft)return b.toString();for(rt=tt(ft),w=p.e=rt.length-b.e-1,p.c[0]=st[(k=w%r)<0?r+k:k],(n==null||(!(u=12,o=new t(n)).s||(e=o.cmp(l)<0||!o.c)||d&&g(o.e/r)<o.c.length-1)&&!f(n,"max denominator","toFraction")||(n=o).cmp(p)>0)&&(n=w>0?p:l),k=v,v=1/0,o=new t(rt),s.c[0]=0;;){if(nt=a(o,p,0,1),i=c.plus(nt.times(y)),i.cmp(n)==1)break;c=y;y=i;l=s.plus(nt.times(i=l));s=i;p=o.minus(nt.times(i=p));o=i}return i=a(n.minus(c),y,0,1),s=s.plus(i.times(l)),c=c.plus(i.times(y)),s.s=l.s=b.s,w*=2,ut=a(l,y,w,h).minus(b).abs().cmp(a(s,c,w,h).minus(b).abs())<1?[l.toString(),y.toString()]:[s.toString(),c.toString()],v=k,ut};i.toNumber=function(){var n=this;return+n||(n.s?0*n.s:NaN)};i.toPower=i.pow=function(n){var i=n*0==0?~~n:n,r=new t(this),u=new t(it);if(((e=n<-ot||n>ot)&&(i=n/0)||w(n)!=n&&n!==0&&!(i=NaN))&&!f(n,"exponent","pow")||!i)return new t(Math.pow(+r,i));for(i=i<0?-i:i;;){if(i&1&&(u=u.times(r)),i>>=1,!i)break;r=r.times(r)}return n<0?it.div(u):u};i.toPrecision=function(n){var t=this;return n==null||((e=n<1||n>o)||w(n)!=n)&&!f(n,"precision","toPrecision")||!t.c?t.toString():rt(t,--n|0,2)};i.toString=function(n){var r,t,o,u=this,i=u.e;if(i===null)t=u.s?"Infinity":"NaN";else{if(n==r&&(i<=p||i>=k))return rt(u,r,1);if(t=tt(u.c),i<0){for(;++i;t="0"+t);t="0."+t}else if(o=t.length,i>0)if(++i>o)for(i-=o;i--;t+="0");else i<o&&(t=t.slice(0,i)+"."+t.slice(i));else if(r=t.charAt(0),o>1)t=r+"."+t.slice(1);else if(r=="0")return r;if(n!=null)if((e=!(n>=2&&n<65))||n!=~~n&&d)f(n,"base","toS");else if(t=ct(t,n|0,10,u.s),t=="0")return t}return u.s<0?"-"+t:t};i.valueOf=i.toJSON=function(){return this.toString()};typeof module!="undefined"&&module.exports?module.exports=t:typeof define=="function"&&define.amd?define(function(){return t}):n.BigNumber=t})(this) \ No newline at end of file
diff --git a/cmd/mist/assets/ext/dist/ethereum.js b/cmd/mist/assets/ext/dist/ethereum.js
index 7e7be6d9d..6e6c5020c 100644
--- a/cmd/mist/assets/ext/dist/ethereum.js
+++ b/cmd/mist/assets/ext/dist/ethereum.js
@@ -1195,4 +1195,4 @@ module.exports = web3;
},{"./lib/abi":1,"./lib/contract":2,"./lib/filter":3,"./lib/httpsync":4,"./lib/providermanager":5,"./lib/qtsync":6,"./lib/web3":7}]},{},["web3"])
-//# sourceMappingURL=ethereum.js.map \ No newline at end of file
+//# sourceMappingURL=ethereum.js.map
diff --git a/cmd/mist/assets/ext/ethereum.js/.bowerrc b/cmd/mist/assets/ext/ethereum.js/.bowerrc
deleted file mode 100644
index c3a8813e8..000000000
--- a/cmd/mist/assets/ext/ethereum.js/.bowerrc
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "directory": "example/js/",
- "cwd": "./",
- "analytics": false
-} \ No newline at end of file
diff --git a/cmd/mist/assets/ext/ethereum.js/.editorconfig b/cmd/mist/assets/ext/ethereum.js/.editorconfig
deleted file mode 100644
index 60a2751d3..000000000
--- a/cmd/mist/assets/ext/ethereum.js/.editorconfig
+++ /dev/null
@@ -1,12 +0,0 @@
-root = true
-
-[*]
-indent_style = space
-indent_size = 4
-end_of_line = lf
-charset = utf-8
-trim_trailing_whitespace = true
-insert_final_newline = true
-
-[*.md]
-trim_trailing_whitespace = false \ No newline at end of file
diff --git a/cmd/mist/assets/ext/ethereum.js/.gitignore b/cmd/mist/assets/ext/ethereum.js/.gitignore
deleted file mode 100644
index 399b6dc88..000000000
--- a/cmd/mist/assets/ext/ethereum.js/.gitignore
+++ /dev/null
@@ -1,18 +0,0 @@
-# See http://help.github.com/ignore-files/ for more about ignoring files.
-#
-# If you find yourself ignoring temporary files generated by your text editor
-# or operating system, you probably want to add a global ignore instead:
-# git config --global core.excludesfile ~/.gitignore_global
-
-*.swp
-/tmp
-*/**/*un~
-*un~
-.DS_Store
-*/**/.DS_Store
-ethereum/ethereum
-ethereal/ethereal
-example/js
-node_modules
-bower_components
-npm-debug.log
diff --git a/cmd/mist/assets/ext/ethereum.js/.jshintrc b/cmd/mist/assets/ext/ethereum.js/.jshintrc
deleted file mode 100644
index c0ec5f89d..000000000
--- a/cmd/mist/assets/ext/ethereum.js/.jshintrc
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "predef": [
- "console",
- "require",
- "equal",
- "test",
- "testBoth",
- "testWithDefault",
- "raises",
- "deepEqual",
- "start",
- "stop",
- "ok",
- "strictEqual",
- "module",
- "expect",
- "reject",
- "impl"
- ],
-
- "esnext": true,
- "proto": true,
- "node" : true,
- "browser" : true,
- "browserify" : true,
-
- "boss" : true,
- "curly": false,
- "debug": true,
- "devel": true,
- "eqeqeq": true,
- "evil": true,
- "forin": false,
- "immed": false,
- "laxbreak": false,
- "newcap": true,
- "noarg": true,
- "noempty": false,
- "nonew": false,
- "nomen": false,
- "onevar": false,
- "plusplus": false,
- "regexp": false,
- "undef": true,
- "sub": true,
- "strict": false,
- "white": false,
- "shadow": true,
- "eqnull": true
-} \ No newline at end of file
diff --git a/cmd/mist/assets/ext/ethereum.js/.npmignore b/cmd/mist/assets/ext/ethereum.js/.npmignore
deleted file mode 100644
index 5bbffe4fd..000000000
--- a/cmd/mist/assets/ext/ethereum.js/.npmignore
+++ /dev/null
@@ -1,9 +0,0 @@
-example/js
-node_modules
-test
-.gitignore
-.editorconfig
-.travis.yml
-.npmignore
-component.json
-testling.html \ No newline at end of file
diff --git a/cmd/mist/assets/ext/ethereum.js/.travis.yml b/cmd/mist/assets/ext/ethereum.js/.travis.yml
deleted file mode 100644
index fafacbd5a..000000000
--- a/cmd/mist/assets/ext/ethereum.js/.travis.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-language: node_js
-node_js:
- - "0.11"
- - "0.10"
-before_script:
- - npm install
- - npm install jshint
-script:
- - "jshint *.js lib"
-after_script:
- - npm run-script gulp
diff --git a/cmd/mist/assets/ext/ethereum.js/LICENSE b/cmd/mist/assets/ext/ethereum.js/LICENSE
deleted file mode 100644
index 0f187b873..000000000
--- a/cmd/mist/assets/ext/ethereum.js/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-This file is part of ethereum.js.
-
-ethereum.js is free software: you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-ethereum.js is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public License
-along with ethereum.js. If not, see <http://www.gnu.org/licenses/>. \ No newline at end of file
diff --git a/cmd/mist/assets/ext/ethereum.js/README.md b/cmd/mist/assets/ext/ethereum.js/README.md
deleted file mode 100644
index 865b62c6b..000000000
--- a/cmd/mist/assets/ext/ethereum.js/README.md
+++ /dev/null
@@ -1,79 +0,0 @@
-# Ethereum JavaScript API
-
-This is the Ethereum compatible JavaScript API using `Promise`s
-which implements the [Generic JSON RPC](https://github.com/ethereum/wiki/wiki/Generic-JSON-RPC) spec. It's available on npm as a node module and also for bower and component as an embeddable js
-
-[![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![dependency status][dep-image]][dep-url] [![dev dependency status][dep-dev-image]][dep-dev-url]
-
-<!-- [![browser support](https://ci.testling.com/ethereum/ethereum.js.png)](https://ci.testling.com/ethereum/ethereum.js) -->
-
-## Installation
-
-### Node.js
-
- npm install ethereum.js
-
-### For browser
-Bower
-
- bower install ethereum.js
-
-Component
-
- component install ethereum/ethereum.js
-
-* Include `ethereum.min.js` in your html file.
-* Include [es6-promise](https://github.com/jakearchibald/es6-promise) or another ES6-Shim if your browser doesn't support ECMAScript 6.
-
-## Usage
-Require the library:
-
- var web3 = require('web3');
-
-Set a provider (QtProvider, WebSocketProvider, HttpRpcProvider)
-
- var web3.setProvider(new web3.providers.WebSocketProvider('ws://localhost:40404/eth'));
-
-There you go, now you can use it:
-
-```
-web3.eth.coinbase.then(function(result){
- console.log(result);
- return web3.eth.balanceAt(result);
-}).then(function(balance){
- console.log(web3.toDecimal(balance));
-}).catch(function(err){
- console.log(err);
-});
-```
-
-
-For another example see `example/index.html`.
-
-## Building
-
-* `gulp build`
-
-
-### Testing
-
-**Please note this repo is in it's early stage.**
-
-If you'd like to run a WebSocket ethereum node check out
-[go-ethereum](https://github.com/ethereum/go-ethereum).
-
-To install ethereum and spawn a node:
-
-```
-go get github.com/ethereum/go-ethereum/ethereum
-ethereum -ws -loglevel=4
-```
-
-[npm-image]: https://badge.fury.io/js/ethereum.js.png
-[npm-url]: https://npmjs.org/package/ethereum.js
-[travis-image]: https://travis-ci.org/ethereum/ethereum.js.svg
-[travis-url]: https://travis-ci.org/ethereum/ethereum.js
-[dep-image]: https://david-dm.org/ethereum/ethereum.js.svg
-[dep-url]: https://david-dm.org/ethereum/ethereum.js
-[dep-dev-image]: https://david-dm.org/ethereum/ethereum.js/dev-status.svg
-[dep-dev-url]: https://david-dm.org/ethereum/ethereum.js#info=devDependencies \ No newline at end of file
diff --git a/cmd/mist/assets/ext/ethereum.js/bower.json b/cmd/mist/assets/ext/ethereum.js/bower.json
deleted file mode 100644
index cedae9023..000000000
--- a/cmd/mist/assets/ext/ethereum.js/bower.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "name": "ethereum.js",
- "namespace": "ethereum",
- "version": "0.0.3",
- "description": "Ethereum Compatible JavaScript API",
- "main": ["./dist/ethereum.js", "./dist/ethereum.min.js"],
- "dependencies": {
- "es6-promise": "#master"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/ethereum/ethereum.js.git"
- },
- "homepage": "https://github.com/ethereum/ethereum.js",
- "bugs": {
- "url": "https://github.com/ethereum/ethereum.js/issues"
- },
- "keywords": [
- "ethereum",
- "javascript",
- "API"
- ],
- "authors": [
- {
- "name": "Marek Kotewicz",
- "email": "marek@ethdev.com",
- "homepage": "https://github.com/debris"
- },
- {
- "name": "Marian Oancea",
- "email": "marian@ethdev.com",
- "homepage": "https://github.com/cubedro"
- }
- ],
- "license": "LGPL-3.0",
- "ignore": [
- "example",
- "lib",
- "node_modules",
- "package.json",
- ".bowerrc",
- ".editorconfig",
- ".gitignore",
- ".jshintrc",
- ".npmignore",
- ".travis.yml",
- "gulpfile.js",
- "index.js",
- "**/*.txt"
- ]
-} \ No newline at end of file
diff --git a/cmd/mist/assets/ext/ethereum.js/dist/ethereum.js b/cmd/mist/assets/ext/ethereum.js/dist/ethereum.js
deleted file mode 100644
index 4f4b5d326..000000000
--- a/cmd/mist/assets/ext/ethereum.js/dist/ethereum.js
+++ /dev/null
@@ -1,1184 +0,0 @@
-require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
-/*
- This file is part of ethereum.js.
-
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
-*/
-/** @file abi.js
- * @authors:
- * Marek Kotewicz <marek@ethdev.com>
- * Gav Wood <g@ethdev.com>
- * @date 2014
- */
-
-// TODO: is these line is supposed to be here?
-if ("build" !== 'build') {/*
- var web3 = require('./web3'); // jshint ignore:line
-*/}
-
-// TODO: make these be actually accurate instead of falling back onto JS's doubles.
-var hexToDec = function (hex) {
- return parseInt(hex, 16).toString();
-};
-
-var decToHex = function (dec) {
- return parseInt(dec).toString(16);
-};
-
-var findIndex = function (array, callback) {
- var end = false;
- var i = 0;
- for (; i < array.length && !end; i++) {
- end = callback(array[i]);
- }
- return end ? i - 1 : -1;
-};
-
-var findMethodIndex = function (json, methodName) {
- return findIndex(json, function (method) {
- return method.name === methodName;
- });
-};
-
-var padLeft = function (string, chars) {
- return new Array(chars - string.length + 1).join("0") + string;
-};
-
-var calcBitPadding = function (type, expected) {
- var value = type.slice(expected.length);
- if (value === "") {
- return 32;
- }
- return parseInt(value) / 8;
-};
-
-var calcBytePadding = function (type, expected) {
- var value = type.slice(expected.length);
- if (value === "") {
- return 32;
- }
- return parseInt(value);
-};
-
-var calcRealPadding = function (type, expected) {
- var value = type.slice(expected.length);
- if (value === "") {
- return 32;
- }
- var sizes = value.split('x');
- for (var padding = 0, i = 0; i < sizes; i++) {
- padding += (sizes[i] / 8);
- }
- return padding;
-};
-
-var setupInputTypes = function () {
-
- var prefixedType = function (prefix, calcPadding) {
- return function (type, value) {
- var expected = prefix;
- if (type.indexOf(expected) !== 0) {
- return false;
- }
-
- var padding = calcPadding(type, expected);
- if (typeof value === "number")
- value = value.toString(16);
- else if (typeof value === "string")
- value = web3.toHex(value);
- else if (value.indexOf('0x') === 0)
- value = value.substr(2);
- else
- value = (+value).toString(16);
- return padLeft(value, padding * 2);
- };
- };
-
- var namedType = function (name, padding, formatter) {
- return function (type, value) {
- if (type !== name) {
- return false;
- }
-
- return padLeft(formatter ? formatter(value) : value, padding * 2);
- };
- };
-
- var formatBool = function (value) {
- return value ? '0x1' : '0x0';
- };
-
- return [
- prefixedType('uint', calcBitPadding),
- prefixedType('int', calcBitPadding),
- prefixedType('hash', calcBitPadding),
- prefixedType('string', calcBytePadding),
- prefixedType('real', calcRealPadding),
- prefixedType('ureal', calcRealPadding),
- namedType('address', 20),
- namedType('bool', 1, formatBool),
- ];
-};
-
-var inputTypes = setupInputTypes();
-
-var toAbiInput = function (json, methodName, params) {
- var bytes = "";
- var index = findMethodIndex(json, methodName);
-
- if (index === -1) {
- return;
- }
-
- bytes = "0x" + padLeft(index.toString(16), 2);
- var method = json[index];
-
- for (var i = 0; i < method.inputs.length; i++) {
- var found = false;
- for (var j = 0; j < inputTypes.length && !found; j++) {
- found = inputTypes[j](method.inputs[i].type, params[i]);
- }
- if (!found) {
- console.error('unsupported json type: ' + method.inputs[i].type);
- }
- bytes += found;
- }
- return bytes;
-};
-
-var setupOutputTypes = function () {
-
- var prefixedType = function (prefix, calcPadding) {
- return function (type) {
- var expected = prefix;
- if (type.indexOf(expected) !== 0) {
- return -1;
- }
-
- var padding = calcPadding(type, expected);
- return padding * 2;
- };
- };
-
- var namedType = function (name, padding) {
- return function (type) {
- return name === type ? padding * 2 : -1;
- };
- };
-
- var formatInt = function (value) {
- return value.length <= 8 ? +parseInt(value, 16) : hexToDec(value);
- };
-
- var formatHash = function (value) {
- return "0x" + value;
- };
-
- var formatBool = function (value) {
- return value === '1' ? true : false;
- };
-
- var formatString = function (value) {
- return web3.toAscii(value);
- };
-
- return [
- { padding: prefixedType('uint', calcBitPadding), format: formatInt },
- { padding: prefixedType('int', calcBitPadding), format: formatInt },
- { padding: prefixedType('hash', calcBitPadding), format: formatHash },
- { padding: prefixedType('string', calcBytePadding), format: formatString },
- { padding: prefixedType('real', calcRealPadding), format: formatInt },
- { padding: prefixedType('ureal', calcRealPadding), format: formatInt },
- { padding: namedType('address', 20) },
- { padding: namedType('bool', 1), format: formatBool }
- ];
-};
-
-var outputTypes = setupOutputTypes();
-
-var fromAbiOutput = function (json, methodName, output) {
- var index = findMethodIndex(json, methodName);
-
- if (index === -1) {
- return;
- }
-
- output = output.slice(2);
-
- var result = [];
- var method = json[index];
- for (var i = 0; i < method.outputs.length; i++) {
- var padding = -1;
- for (var j = 0; j < outputTypes.length && padding === -1; j++) {
- padding = outputTypes[j].padding(method.outputs[i].type);
- }
-
- if (padding === -1) {
- // not found output parsing
- continue;
- }
- var res = output.slice(0, padding);
- var formatter = outputTypes[j - 1].format;
- result.push(formatter ? formatter(res) : ("0x" + res));
- output = output.slice(padding);
- }
-
- return result;
-};
-
-var inputParser = function (json) {
- var parser = {};
- json.forEach(function (method) {
- parser[method.name] = function () {
- var params = Array.prototype.slice.call(arguments);
- return toAbiInput(json, method.name, params);
- };
- });
-
- return parser;
-};
-
-var outputParser = function (json) {
- var parser = {};
- json.forEach(function (method) {
- parser[method.name] = function (output) {
- return fromAbiOutput(json, method.name, output);
- };
- });
-
- return parser;
-};
-
-module.exports = {
- inputParser: inputParser,
- outputParser: outputParser
-};
-
-},{}],2:[function(require,module,exports){
-/*
- This file is part of ethereum.js.
-
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
-*/
-/** @file autoprovider.js
- * @authors:
- * Marek Kotewicz <marek@ethdev.com>
- * Marian Oancea <marian@ethdev.com>
- * @date 2014
- */
-
-/*
- * @brief if qt object is available, uses QtProvider,
- * if not tries to connect over websockets
- * if it fails, it uses HttpRpcProvider
- */
-
-// TODO: is these line is supposed to be here?
-if ("build" !== 'build') {/*
- var WebSocket = require('ws'); // jshint ignore:line
- var web3 = require('./web3'); // jshint ignore:line
-*/}
-
-var AutoProvider = function (userOptions) {
- if (web3.haveProvider()) {
- return;
- }
-
- // before we determine what provider we are, we have to cache request
- this.sendQueue = [];
- this.onmessageQueue = [];
-
- if (navigator.qt) {
- this.provider = new web3.providers.QtProvider();
- return;
- }
-
- userOptions = userOptions || {};
- var options = {
- httprpc: userOptions.httprpc || 'http://localhost:8080',
- websockets: userOptions.websockets || 'ws://localhost:40404/eth'
- };
-
- var self = this;
- var closeWithSuccess = function (success) {
- ws.close();
- if (success) {
- self.provider = new web3.providers.WebSocketProvider(options.websockets);
- } else {
- self.provider = new web3.providers.HttpRpcProvider(options.httprpc);
- self.poll = self.provider.poll.bind(self.provider);
- }
- self.sendQueue.forEach(function (payload) {
- self.provider(payload);
- });
- self.onmessageQueue.forEach(function (handler) {
- self.provider.onmessage = handler;
- });
- };
-
- var ws = new WebSocket(options.websockets);
-
- ws.onopen = function() {
- closeWithSuccess(true);
- };
-
- ws.onerror = function() {
- closeWithSuccess(false);
- };
-};
-
-AutoProvider.prototype.send = function (payload) {
- if (this.provider) {
- this.provider.send(payload);
- return;
- }
- this.sendQueue.push(payload);
-};
-
-Object.defineProperty(AutoProvider.prototype, 'onmessage', {
- set: function (handler) {
- if (this.provider) {
- this.provider.onmessage = handler;
- return;
- }
- this.onmessageQueue.push(handler);
- }
-});
-
-module.exports = AutoProvider;
-
-},{}],3:[function(require,module,exports){
-/*
- This file is part of ethereum.js.
-
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
-*/
-/** @file contract.js
- * @authors:
- * Marek Kotewicz <marek@ethdev.com>
- * @date 2014
- */
-
-// TODO: is these line is supposed to be here?
-if ("build" !== 'build') {/*
- var web3 = require('./web3'); // jshint ignore:line
-*/}
-
-var abi = require('./abi');
-
-var contract = function (address, desc) {
- var inputParser = abi.inputParser(desc);
- var outputParser = abi.outputParser(desc);
-
- var contract = {};
-
- desc.forEach(function (method) {
- contract[method.name] = function () {
- var params = Array.prototype.slice.call(arguments);
- var parsed = inputParser[method.name].apply(null, params);
-
- var onSuccess = function (result) {
- return outputParser[method.name](result);
- };
-
- return {
- call: function (extra) {
- extra = extra || {};
- extra.to = address;
- extra.data = parsed;
- return web3.eth.call(extra).then(onSuccess);
- },
- transact: function (extra) {
- extra = extra || {};
- extra.to = address;
- extra.data = parsed;
- return web3.eth.transact(extra).then(onSuccess);
- }
- };
- };
- });
-
- return contract;
-};
-
-module.exports = contract;
-
-},{"./abi":1}],4:[function(require,module,exports){
-/*
- This file is part of ethereum.js.
-
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
-*/
-/** @file httprpc.js
- * @authors:
- * Marek Kotewicz <marek@ethdev.com>
- * Marian Oancea <marian@ethdev.com>
- * @date 2014
- */
-
-// TODO: is these line is supposed to be here?
-if ("build" !== 'build') {/*
- var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; // jshint ignore:line
-*/}
-
-var HttpRpcProvider = function (host) {
- this.handlers = [];
- this.host = host;
-};
-
-function formatJsonRpcObject(object) {
- return {
- jsonrpc: '2.0',
- method: object.call,
- params: object.args,
- id: object._id
- };
-}
-
-function formatJsonRpcMessage(message) {
- var object = JSON.parse(message);
-
- return {
- _id: object.id,
- data: object.result,
- error: object.error
- };
-}
-
-HttpRpcProvider.prototype.sendRequest = function (payload, cb) {
- var data = formatJsonRpcObject(payload);
-
- var request = new XMLHttpRequest();
- request.open("POST", this.host, true);
- request.send(JSON.stringify(data));
- request.onreadystatechange = function () {
- if (request.readyState === 4 && cb) {
- cb(request);
- }
- };
-};
-
-HttpRpcProvider.prototype.send = function (payload) {
- var self = this;
- this.sendRequest(payload, function (request) {
- self.handlers.forEach(function (handler) {
- handler.call(self, formatJsonRpcMessage(request.responseText));
- });
- });
-};
-
-HttpRpcProvider.prototype.poll = function (payload, id) {
- var self = this;
- this.sendRequest(payload, function (request) {
- var parsed = JSON.parse(request.responseText);
- if (parsed.error || (parsed.result instanceof Array ? parsed.result.length === 0 : !parsed.result)) {
- return;
- }
- self.handlers.forEach(function (handler) {
- handler.call(self, {_event: payload.call, _id: id, data: parsed.result});
- });
- });
-};
-
-Object.defineProperty(HttpRpcProvider.prototype, "onmessage", {
- set: function (handler) {
- this.handlers.push(handler);
- }
-});
-
-module.exports = HttpRpcProvider;
-
-},{}],5:[function(require,module,exports){
-/*
- This file is part of ethereum.js.
-
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
-*/
-/** @file qt.js
- * @authors:
- * Jeffrey Wilcke <jeff@ethdev.com>
- * Marek Kotewicz <marek@ethdev.com>
- * @date 2014
- */
-
-var QtProvider = function() {
- this.handlers = [];
-
- var self = this;
- navigator.qt.onmessage = function (message) {
- self.handlers.forEach(function (handler) {
- handler.call(self, JSON.parse(message.data));
- });
- };
-};
-
-QtProvider.prototype.send = function(payload) {
- navigator.qt.postMessage(JSON.stringify(payload));
-};
-
-Object.defineProperty(QtProvider.prototype, "onmessage", {
- set: function(handler) {
- this.handlers.push(handler);
- }
-});
-
-module.exports = QtProvider;
-
-},{}],6:[function(require,module,exports){
-/*
- This file is part of ethereum.js.
-
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
-*/
-/** @file main.js
- * @authors:
- * Jeffrey Wilcke <jeff@ethdev.com>
- * Marek Kotewicz <marek@ethdev.com>
- * Marian Oancea <marian@ethdev.com>
- * Gav Wood <g@ethdev.com>
- * @date 2014
- */
-
-function flattenPromise (obj) {
- if (obj instanceof Promise) {
- return Promise.resolve(obj);
- }
-
- if (obj instanceof Array) {
- return new Promise(function (resolve) {
- var promises = obj.map(function (o) {
- return flattenPromise(o);
- });
-
- return Promise.all(promises).then(function (res) {
- for (var i = 0; i < obj.length; i++) {
- obj[i] = res[i];
- }
- resolve(obj);
- });
- });
- }
-
- if (obj instanceof Object) {
- return new Promise(function (resolve) {
- var keys = Object.keys(obj);
- var promises = keys.map(function (key) {
- return flattenPromise(obj[key]);
- });
-
- return Promise.all(promises).then(function (res) {
- for (var i = 0; i < keys.length; i++) {
- obj[keys[i]] = res[i];
- }
- resolve(obj);
- });
- });
- }
-
- return Promise.resolve(obj);
-}
-
-var web3Methods = function () {
- return [
- { name: 'sha3', call: 'web3_sha3' }
- ];
-};
-
-var ethMethods = function () {
- var blockCall = function (args) {
- return typeof args[0] === "string" ? "eth_blockByHash" : "eth_blockByNumber";
- };
-
- var transactionCall = function (args) {
- return typeof args[0] === "string" ? 'eth_transactionByHash' : 'eth_transactionByNumber';
- };
-
- var uncleCall = function (args) {
- return typeof args[0] === "string" ? 'eth_uncleByHash' : 'eth_uncleByNumber';
- };
-
- var methods = [
- { name: 'balanceAt', call: 'eth_balanceAt' },
- { name: 'stateAt', call: 'eth_stateAt' },
- { name: 'storageAt', call: 'eth_storageAt' },
- { name: 'countAt', call: 'eth_countAt'},
- { name: 'codeAt', call: 'eth_codeAt' },
- { name: 'transact', call: 'eth_transact' },
- { name: 'call', call: 'eth_call' },
- { name: 'block', call: blockCall },
- { name: 'transaction', call: transactionCall },
- { name: 'uncle', call: uncleCall },
- { name: 'compilers', call: 'eth_compilers' },
- { name: 'lll', call: 'eth_lll' },
- { name: 'solidity', call: 'eth_solidity' },
- { name: 'serpent', call: 'eth_serpent' },
- { name: 'logs', call: 'eth_logs' }
- ];
- return methods;
-};
-
-var ethProperties = function () {
- return [
- { name: 'coinbase', getter: 'eth_coinbase', setter: 'eth_setCoinbase' },
- { name: 'listening', getter: 'eth_listening', setter: 'eth_setListening' },
- { name: 'mining', getter: 'eth_mining', setter: 'eth_setMining' },
- { name: 'gasPrice', getter: 'eth_gasPrice' },
- { name: 'account', getter: 'eth_account' },
- { name: 'accounts', getter: 'eth_accounts' },
- { name: 'peerCount', getter: 'eth_peerCount' },
- { name: 'defaultBlock', getter: 'eth_defaultBlock', setter: 'eth_setDefaultBlock' },
- { name: 'number', getter: 'eth_number'}
- ];
-};
-
-var dbMethods = function () {
- return [
- { name: 'put', call: 'db_put' },
- { name: 'get', call: 'db_get' },
- { name: 'putString', call: 'db_putString' },
- { name: 'getString', call: 'db_getString' }
- ];
-};
-
-var shhMethods = function () {
- return [
- { name: 'post', call: 'shh_post' },
- { name: 'newIdentity', call: 'shh_newIdentity' },
- { name: 'haveIdentity', call: 'shh_haveIdentity' },
- { name: 'newGroup', call: 'shh_newGroup' },
- { name: 'addToGroup', call: 'shh_addToGroup' }
- ];
-};
-
-var ethWatchMethods = function () {
- var newFilter = function (args) {
- return typeof args[0] === 'string' ? 'eth_newFilterString' : 'eth_newFilter';
- };
-
- return [
- { name: 'newFilter', call: newFilter },
- { name: 'uninstallFilter', call: 'eth_uninstallFilter' },
- { name: 'getMessages', call: 'eth_filterLogs' }
- ];
-};
-
-var shhWatchMethods = function () {
- return [
- { name: 'newFilter', call: 'shh_newFilter' },
- { name: 'uninstallFilter', call: 'shh_uninstallFilter' },
- { name: 'getMessage', call: 'shh_getMessages' }
- ];
-};
-
-var setupMethods = function (obj, methods) {
- methods.forEach(function (method) {
- obj[method.name] = function () {
- return flattenPromise(Array.prototype.slice.call(arguments)).then(function (args) {
- var call = typeof method.call === "function" ? method.call(args) : method.call;
- return {call: call, args: args};
- }).then(function (request) {
- return new Promise(function (resolve, reject) {
- web3.provider.send(request, function (err, result) {
- if (!err) {
- resolve(result);
- return;
- }
- reject(err);
- });
- });
- }).catch(function(err) {
- console.error(err);
- });
- };
- });
-};
-
-var setupProperties = function (obj, properties) {
- properties.forEach(function (property) {
- var proto = {};
- proto.get = function () {
- return new Promise(function(resolve, reject) {
- web3.provider.send({call: property.getter}, function(err, result) {
- if (!err) {
- resolve(result);
- return;
- }
- reject(err);
- });
- });
- };
- if (property.setter) {
- proto.set = function (val) {
- return flattenPromise([val]).then(function (args) {
- return new Promise(function (resolve) {
- web3.provider.send({call: property.setter, args: args}, function (err, result) {
- if (!err) {
- resolve(result);
- return;
- }
- reject(err);
- });
- });
- }).catch(function (err) {
- console.error(err);
- });
- };
- }
- Object.defineProperty(obj, property.name, proto);
- });
-};
-
-// TODO: import from a dependency, don't duplicate.
-var hexToDec = function (hex) {
- return parseInt(hex, 16).toString();
-};
-
-var decToHex = function (dec) {
- return parseInt(dec).toString(16);
-};
-
-
-var web3 = {
- _callbacks: {},
- _events: {},
- providers: {},
-
- toHex: function(str) {
- var hex = "";
- for(var i = 0; i < str.length; i++) {
- var n = str.charCodeAt(i).toString(16);
- hex += n.length < 2 ? '0' + n : n;
- }
-
- return hex;
- },
-
- toAscii: function(hex) {
- // Find termination
- var str = "";
- var i = 0, l = hex.length;
- if (hex.substring(0, 2) === '0x')
- i = 2;
- for(; i < l; i+=2) {
- var code = hex.charCodeAt(i);
- if(code === 0) {
- break;
- }
-
- str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
- }
-
- return str;
- },
-
- fromAscii: function(str, pad) {
- pad = pad === undefined ? 32 : pad;
- var hex = this.toHex(str);
- while(hex.length < pad*2)
- hex += "00";
- return "0x" + hex;
- },
-
- toDecimal: function (val) {
- return hexToDec(val.substring(2));
- },
-
- fromDecimal: function (val) {
- return "0x" + decToHex(val);
- },
-
- toEth: function(str) {
- var val = typeof str === "string" ? str.indexOf('0x') === 0 ? parseInt(str.substr(2), 16) : parseInt(str) : str;
- var unit = 0;
- var units = [ 'wei', 'Kwei', 'Mwei', 'Gwei', 'szabo', 'finney', 'ether', 'grand', 'Mether', 'Gether', 'Tether', 'Pether', 'Eether', 'Zether', 'Yether', 'Nether', 'Dether', 'Vether', 'Uether' ];
- while (val > 3000 && unit < units.length - 1)
- {
- val /= 1000;
- unit++;
- }
- var s = val.toString().length < val.toFixed(2).length ? val.toString() : val.toFixed(2);
- var replaceFunction = function($0, $1, $2) {
- return $1 + ',' + $2;
- };
-
- while (true) {
- var o = s;
- s = s.replace(/(\d)(\d\d\d[\.\,])/, replaceFunction);
- if (o === s)
- break;
- }
- return s + ' ' + units[unit];
- },
-
- eth: {
- prototype: Object(), // jshint ignore:line
- watch: function (params) {
- return new Filter(params, ethWatch);
- }
- },
-
- db: {
- prototype: Object() // jshint ignore:line
- },
-
- shh: {
- prototype: Object(), // jshint ignore:line
- watch: function (params) {
- return new Filter(params, shhWatch);
- }
- },
-
- on: function(event, id, cb) {
- if(web3._events[event] === undefined) {
- web3._events[event] = {};
- }
-
- web3._events[event][id] = cb;
- return this;
- },
-
- off: function(event, id) {
- if(web3._events[event] !== undefined) {
- delete web3._events[event][id];
- }
-
- return this;
- },
-
- trigger: function(event, id, data) {
- var callbacks = web3._events[event];
- if (!callbacks || !callbacks[id]) {
- return;
- }
- var cb = callbacks[id];
- cb(data);
- }
-};
-
-setupMethods(web3, web3Methods());
-setupMethods(web3.eth, ethMethods());
-setupProperties(web3.eth, ethProperties());
-setupMethods(web3.db, dbMethods());
-setupMethods(web3.shh, shhMethods());
-
-var ethWatch = {
- changed: 'eth_changed'
-};
-setupMethods(ethWatch, ethWatchMethods());
-var shhWatch = {
- changed: 'shh_changed'
-};
-setupMethods(shhWatch, shhWatchMethods());
-
-var ProviderManager = function() {
- this.queued = [];
- this.polls = [];
- this.ready = false;
- this.provider = undefined;
- this.id = 1;
-
- var self = this;
- var poll = function () {
- if (self.provider && self.provider.poll) {
- self.polls.forEach(function (data) {
- data.data._id = self.id;
- self.id++;
- self.provider.poll(data.data, data.id);
- });
- }
- setTimeout(poll, 12000);
- };
- poll();
-};
-
-ProviderManager.prototype.send = function(data, cb) {
- data._id = this.id;
- if (cb) {
- web3._callbacks[data._id] = cb;
- }
-
- data.args = data.args || [];
- this.id++;
-
- if(this.provider !== undefined) {
- this.provider.send(data);
- } else {
- console.warn("provider is not set");
- this.queued.push(data);
- }
-};
-
-ProviderManager.prototype.set = function(provider) {
- if(this.provider !== undefined && this.provider.unload !== undefined) {
- this.provider.unload();
- }
-
- this.provider = provider;
- this.ready = true;
-};
-
-ProviderManager.prototype.sendQueued = function() {
- for(var i = 0; this.queued.length; i++) {
- // Resend
- this.send(this.queued[i]);
- }
-};
-
-ProviderManager.prototype.installed = function() {
- return this.provider !== undefined;
-};
-
-ProviderManager.prototype.startPolling = function (data, pollId) {
- if (!this.provider || !this.provider.poll) {
- return;
- }
- this.polls.push({data: data, id: pollId});
-};
-
-ProviderManager.prototype.stopPolling = function (pollId) {
- for (var i = this.polls.length; i--;) {
- var poll = this.polls[i];
- if (poll.id === pollId) {
- this.polls.splice(i, 1);
- }
- }
-};
-
-web3.provider = new ProviderManager();
-
-web3.setProvider = function(provider) {
- provider.onmessage = messageHandler;
- web3.provider.set(provider);
- web3.provider.sendQueued();
-};
-
-web3.haveProvider = function() {
- return !!web3.provider.provider;
-};
-
-var Filter = function(options, impl) {
- this.impl = impl;
- this.callbacks = [];
-
- var self = this;
- this.promise = impl.newFilter(options);
- this.promise.then(function (id) {
- self.id = id;
- web3.on(impl.changed, id, self.trigger.bind(self));
- web3.provider.startPolling({call: impl.changed, args: [id]}, id);
- });
-};
-
-Filter.prototype.arrived = function(callback) {
- this.changed(callback);
-};
-
-Filter.prototype.changed = function(callback) {
- var self = this;
- this.promise.then(function(id) {
- self.callbacks.push(callback);
- });
-};
-
-Filter.prototype.trigger = function(messages) {
- for(var i = 0; i < this.callbacks.length; i++) {
- this.callbacks[i].call(this, messages);
- }
-};
-
-Filter.prototype.uninstall = function() {
- var self = this;
- this.promise.then(function (id) {
- self.impl.uninstallFilter(id);
- web3.provider.stopPolling(id);
- web3.off(impl.changed, id);
- });
-};
-
-Filter.prototype.messages = function() {
- var self = this;
- return this.promise.then(function (id) {
- return self.impl.getMessages(id);
- });
-};
-
-Filter.prototype.logs = function () {
- return this.messages();
-};
-
-function messageHandler(data) {
- if(data._event !== undefined) {
- web3.trigger(data._event, data._id, data.data);
- return;
- }
-
- if(data._id) {
- var cb = web3._callbacks[data._id];
- if (cb) {
- cb.call(this, data.error, data.data);
- delete web3._callbacks[data._id];
- }
- }
-}
-
-module.exports = web3;
-
-},{}],7:[function(require,module,exports){
-/*
- This file is part of ethereum.js.
-
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
-*/
-/** @file websocket.js
- * @authors:
- * Jeffrey Wilcke <jeff@ethdev.com>
- * Marek Kotewicz <marek@ethdev.com>
- * Marian Oancea <marian@ethdev.com>
- * @date 2014
- */
-
-// TODO: is these line is supposed to be here?
-if ("build" !== 'build') {/*
- var WebSocket = require('ws'); // jshint ignore:line
-*/}
-
-var WebSocketProvider = function(host) {
- // onmessage handlers
- this.handlers = [];
- // queue will be filled with messages if send is invoked before the ws is ready
- this.queued = [];
- this.ready = false;
-
- this.ws = new WebSocket(host);
-
- var self = this;
- this.ws.onmessage = function(event) {
- for(var i = 0; i < self.handlers.length; i++) {
- self.handlers[i].call(self, JSON.parse(event.data), event);
- }
- };
-
- this.ws.onopen = function() {
- self.ready = true;
-
- for(var i = 0; i < self.queued.length; i++) {
- // Resend
- self.send(self.queued[i]);
- }
- };
-};
-
-WebSocketProvider.prototype.send = function(payload) {
- if(this.ready) {
- var data = JSON.stringify(payload);
-
- this.ws.send(data);
- } else {
- this.queued.push(payload);
- }
-};
-
-WebSocketProvider.prototype.onMessage = function(handler) {
- this.handlers.push(handler);
-};
-
-WebSocketProvider.prototype.unload = function() {
- this.ws.close();
-};
-Object.defineProperty(WebSocketProvider.prototype, "onmessage", {
- set: function(provider) { this.onMessage(provider); }
-});
-
-module.exports = WebSocketProvider;
-
-},{}],"web3":[function(require,module,exports){
-var web3 = require('./lib/web3');
-web3.providers.WebSocketProvider = require('./lib/websocket');
-web3.providers.HttpRpcProvider = require('./lib/httprpc');
-web3.providers.QtProvider = require('./lib/qt');
-web3.providers.AutoProvider = require('./lib/autoprovider');
-web3.contract = require('./lib/contract');
-
-module.exports = web3;
-
-},{"./lib/autoprovider":2,"./lib/contract":3,"./lib/httprpc":4,"./lib/qt":5,"./lib/web3":6,"./lib/websocket":7}]},{},["web3"])
-
-
-//# sourceMappingURL=ethereum.js.map \ No newline at end of file
diff --git a/cmd/mist/assets/ext/ethereum.js/dist/ethereum.js.map b/cmd/mist/assets/ext/ethereum.js/dist/ethereum.js.map
deleted file mode 100644
index 9886b70ce..000000000
--- a/cmd/mist/assets/ext/ethereum.js/dist/ethereum.js.map
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "version": 3,
- "sources": [
- "node_modules/browserify/node_modules/browser-pack/_prelude.js",
- "lib/abi.js",
- "lib/autoprovider.js",
- "lib/contract.js",
- "lib/httprpc.js",
- "lib/qt.js",
- "lib/web3.js",
- "lib/websocket.js",
- "index.js"
- ],
- "names": [],
- "mappings": "AAAA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5fA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA",
- "file": "generated.js",
- "sourceRoot": "",
- "sourcesContent": [
- "(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})",
- "/*\n This file is part of ethereum.js.\n\n ethereum.js is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n ethereum.js is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.\n*/\n/** @file abi.js\n * @authors:\n * Marek Kotewicz <marek@ethdev.com>\n * Gav Wood <g@ethdev.com>\n * @date 2014\n */\n\n// TODO: is these line is supposed to be here? \nif (\"build\" !== 'build') {/*\n var web3 = require('./web3'); // jshint ignore:line\n*/}\n\n// TODO: make these be actually accurate instead of falling back onto JS's doubles.\nvar hexToDec = function (hex) {\n return parseInt(hex, 16).toString();\n};\n\nvar decToHex = function (dec) {\n return parseInt(dec).toString(16);\n};\n\nvar findIndex = function (array, callback) {\n var end = false;\n var i = 0;\n for (; i < array.length && !end; i++) {\n end = callback(array[i]);\n }\n return end ? i - 1 : -1;\n};\n\nvar findMethodIndex = function (json, methodName) {\n return findIndex(json, function (method) {\n return method.name === methodName;\n });\n};\n\nvar padLeft = function (string, chars) {\n return new Array(chars - string.length + 1).join(\"0\") + string;\n};\n\nvar calcBitPadding = function (type, expected) {\n var value = type.slice(expected.length);\n if (value === \"\") {\n return 32;\n }\n return parseInt(value) / 8;\n};\n\nvar calcBytePadding = function (type, expected) {\n var value = type.slice(expected.length);\n if (value === \"\") {\n return 32;\n }\n return parseInt(value);\n};\n\nvar calcRealPadding = function (type, expected) {\n var value = type.slice(expected.length);\n if (value === \"\") {\n return 32;\n }\n var sizes = value.split('x');\n for (var padding = 0, i = 0; i < sizes; i++) {\n padding += (sizes[i] / 8);\n }\n return padding;\n};\n\nvar setupInputTypes = function () {\n \n var prefixedType = function (prefix, calcPadding) {\n return function (type, value) {\n var expected = prefix;\n if (type.indexOf(expected) !== 0) {\n return false;\n }\n\n var padding = calcPadding(type, expected);\n if (typeof value === \"number\")\n value = value.toString(16);\n else if (typeof value === \"string\")\n value = web3.toHex(value); \n else if (value.indexOf('0x') === 0)\n value = value.substr(2);\n else\n value = (+value).toString(16);\n return padLeft(value, padding * 2);\n };\n };\n\n var namedType = function (name, padding, formatter) {\n return function (type, value) {\n if (type !== name) {\n return false;\n }\n\n return padLeft(formatter ? formatter(value) : value, padding * 2);\n };\n };\n\n var formatBool = function (value) {\n return value ? '0x1' : '0x0';\n };\n\n return [\n prefixedType('uint', calcBitPadding),\n prefixedType('int', calcBitPadding),\n prefixedType('hash', calcBitPadding),\n prefixedType('string', calcBytePadding),\n prefixedType('real', calcRealPadding),\n prefixedType('ureal', calcRealPadding),\n namedType('address', 20),\n namedType('bool', 1, formatBool),\n ];\n};\n\nvar inputTypes = setupInputTypes();\n\nvar toAbiInput = function (json, methodName, params) {\n var bytes = \"\";\n var index = findMethodIndex(json, methodName);\n\n if (index === -1) {\n return;\n }\n\n bytes = \"0x\" + padLeft(index.toString(16), 2);\n var method = json[index];\n\n for (var i = 0; i < method.inputs.length; i++) {\n var found = false;\n for (var j = 0; j < inputTypes.length && !found; j++) {\n found = inputTypes[j](method.inputs[i].type, params[i]);\n }\n if (!found) {\n console.error('unsupported json type: ' + method.inputs[i].type);\n }\n bytes += found;\n }\n return bytes;\n};\n\nvar setupOutputTypes = function () {\n\n var prefixedType = function (prefix, calcPadding) {\n return function (type) {\n var expected = prefix;\n if (type.indexOf(expected) !== 0) {\n return -1;\n }\n\n var padding = calcPadding(type, expected);\n return padding * 2;\n };\n };\n\n var namedType = function (name, padding) {\n return function (type) {\n return name === type ? padding * 2 : -1;\n };\n };\n\n var formatInt = function (value) {\n return value.length <= 8 ? +parseInt(value, 16) : hexToDec(value);\n };\n\n var formatHash = function (value) {\n return \"0x\" + value;\n };\n\n var formatBool = function (value) {\n return value === '1' ? true : false;\n };\n\n var formatString = function (value) {\n return web3.toAscii(value);\n };\n\n return [\n { padding: prefixedType('uint', calcBitPadding), format: formatInt },\n { padding: prefixedType('int', calcBitPadding), format: formatInt },\n { padding: prefixedType('hash', calcBitPadding), format: formatHash },\n { padding: prefixedType('string', calcBytePadding), format: formatString },\n { padding: prefixedType('real', calcRealPadding), format: formatInt },\n { padding: prefixedType('ureal', calcRealPadding), format: formatInt },\n { padding: namedType('address', 20) },\n { padding: namedType('bool', 1), format: formatBool }\n ];\n};\n\nvar outputTypes = setupOutputTypes();\n\nvar fromAbiOutput = function (json, methodName, output) {\n var index = findMethodIndex(json, methodName);\n\n if (index === -1) {\n return;\n }\n\n output = output.slice(2);\n\n var result = [];\n var method = json[index];\n for (var i = 0; i < method.outputs.length; i++) {\n var padding = -1;\n for (var j = 0; j < outputTypes.length && padding === -1; j++) {\n padding = outputTypes[j].padding(method.outputs[i].type);\n }\n\n if (padding === -1) {\n // not found output parsing\n continue;\n }\n var res = output.slice(0, padding);\n var formatter = outputTypes[j - 1].format;\n result.push(formatter ? formatter(res) : (\"0x\" + res));\n output = output.slice(padding);\n }\n\n return result;\n};\n\nvar inputParser = function (json) {\n var parser = {};\n json.forEach(function (method) {\n parser[method.name] = function () {\n var params = Array.prototype.slice.call(arguments);\n return toAbiInput(json, method.name, params);\n };\n });\n\n return parser;\n};\n\nvar outputParser = function (json) {\n var parser = {};\n json.forEach(function (method) {\n parser[method.name] = function (output) {\n return fromAbiOutput(json, method.name, output);\n };\n });\n\n return parser;\n};\n\nmodule.exports = {\n inputParser: inputParser,\n outputParser: outputParser\n};\n",
- "/*\n This file is part of ethereum.js.\n\n ethereum.js is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n ethereum.js is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.\n*/\n/** @file autoprovider.js\n * @authors:\n * Marek Kotewicz <marek@ethdev.com>\n * Marian Oancea <marian@ethdev.com>\n * @date 2014\n */\n\n/*\n * @brief if qt object is available, uses QtProvider,\n * if not tries to connect over websockets\n * if it fails, it uses HttpRpcProvider\n */\n\n// TODO: is these line is supposed to be here? \nif (\"build\" !== 'build') {/*\n var WebSocket = require('ws'); // jshint ignore:line\n var web3 = require('./web3'); // jshint ignore:line\n*/}\n\nvar AutoProvider = function (userOptions) {\n if (web3.haveProvider()) {\n return;\n }\n\n // before we determine what provider we are, we have to cache request\n this.sendQueue = [];\n this.onmessageQueue = [];\n\n if (navigator.qt) {\n this.provider = new web3.providers.QtProvider();\n return;\n }\n\n userOptions = userOptions || {};\n var options = {\n httprpc: userOptions.httprpc || 'http://localhost:8080',\n websockets: userOptions.websockets || 'ws://localhost:40404/eth'\n };\n\n var self = this;\n var closeWithSuccess = function (success) {\n ws.close();\n if (success) {\n self.provider = new web3.providers.WebSocketProvider(options.websockets);\n } else {\n self.provider = new web3.providers.HttpRpcProvider(options.httprpc);\n self.poll = self.provider.poll.bind(self.provider);\n }\n self.sendQueue.forEach(function (payload) {\n self.provider(payload);\n });\n self.onmessageQueue.forEach(function (handler) {\n self.provider.onmessage = handler;\n });\n };\n\n var ws = new WebSocket(options.websockets);\n\n ws.onopen = function() {\n closeWithSuccess(true);\n };\n\n ws.onerror = function() {\n closeWithSuccess(false);\n };\n};\n\nAutoProvider.prototype.send = function (payload) {\n if (this.provider) {\n this.provider.send(payload);\n return;\n }\n this.sendQueue.push(payload);\n};\n\nObject.defineProperty(AutoProvider.prototype, 'onmessage', {\n set: function (handler) {\n if (this.provider) {\n this.provider.onmessage = handler;\n return;\n }\n this.onmessageQueue.push(handler);\n }\n});\n\nmodule.exports = AutoProvider;\n",
- "/*\n This file is part of ethereum.js.\n\n ethereum.js is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n ethereum.js is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.\n*/\n/** @file contract.js\n * @authors:\n * Marek Kotewicz <marek@ethdev.com>\n * @date 2014\n */\n\n// TODO: is these line is supposed to be here? \nif (\"build\" !== 'build') {/*\n var web3 = require('./web3'); // jshint ignore:line\n*/}\n\nvar abi = require('./abi');\n\nvar contract = function (address, desc) {\n var inputParser = abi.inputParser(desc);\n var outputParser = abi.outputParser(desc);\n\n var contract = {};\n\n desc.forEach(function (method) {\n contract[method.name] = function () {\n var params = Array.prototype.slice.call(arguments);\n var parsed = inputParser[method.name].apply(null, params);\n\n var onSuccess = function (result) {\n return outputParser[method.name](result);\n };\n\n return {\n call: function (extra) {\n extra = extra || {};\n extra.to = address;\n extra.data = parsed;\n return web3.eth.call(extra).then(onSuccess);\n },\n transact: function (extra) {\n extra = extra || {};\n extra.to = address;\n extra.data = parsed;\n return web3.eth.transact(extra).then(onSuccess);\n }\n };\n };\n });\n\n return contract;\n};\n\nmodule.exports = contract;\n",
- "/*\n This file is part of ethereum.js.\n\n ethereum.js is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n ethereum.js is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.\n*/\n/** @file httprpc.js\n * @authors:\n * Marek Kotewicz <marek@ethdev.com>\n * Marian Oancea <marian@ethdev.com>\n * @date 2014\n */\n\n// TODO: is these line is supposed to be here? \nif (\"build\" !== 'build') {/*\n var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; // jshint ignore:line\n*/}\n\nvar HttpRpcProvider = function (host) {\n this.handlers = [];\n this.host = host;\n};\n\nfunction formatJsonRpcObject(object) {\n return {\n jsonrpc: '2.0',\n method: object.call,\n params: object.args,\n id: object._id\n };\n}\n\nfunction formatJsonRpcMessage(message) {\n var object = JSON.parse(message);\n\n return {\n _id: object.id,\n data: object.result,\n error: object.error\n };\n}\n\nHttpRpcProvider.prototype.sendRequest = function (payload, cb) {\n var data = formatJsonRpcObject(payload);\n\n var request = new XMLHttpRequest();\n request.open(\"POST\", this.host, true);\n request.send(JSON.stringify(data));\n request.onreadystatechange = function () {\n if (request.readyState === 4 && cb) {\n cb(request);\n }\n };\n};\n\nHttpRpcProvider.prototype.send = function (payload) {\n var self = this;\n this.sendRequest(payload, function (request) {\n self.handlers.forEach(function (handler) {\n handler.call(self, formatJsonRpcMessage(request.responseText));\n });\n });\n};\n\nHttpRpcProvider.prototype.poll = function (payload, id) {\n var self = this;\n this.sendRequest(payload, function (request) {\n var parsed = JSON.parse(request.responseText);\n if (parsed.error || (parsed.result instanceof Array ? parsed.result.length === 0 : !parsed.result)) {\n return;\n }\n self.handlers.forEach(function (handler) {\n handler.call(self, {_event: payload.call, _id: id, data: parsed.result});\n });\n });\n};\n\nObject.defineProperty(HttpRpcProvider.prototype, \"onmessage\", {\n set: function (handler) {\n this.handlers.push(handler);\n }\n});\n\nmodule.exports = HttpRpcProvider;\n",
- "/*\n This file is part of ethereum.js.\n\n ethereum.js is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n ethereum.js is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.\n*/\n/** @file qt.js\n * @authors:\n * Jeffrey Wilcke <jeff@ethdev.com>\n * Marek Kotewicz <marek@ethdev.com>\n * @date 2014\n */\n\nvar QtProvider = function() {\n this.handlers = [];\n\n var self = this;\n navigator.qt.onmessage = function (message) {\n self.handlers.forEach(function (handler) {\n handler.call(self, JSON.parse(message.data));\n });\n };\n};\n\nQtProvider.prototype.send = function(payload) {\n navigator.qt.postMessage(JSON.stringify(payload));\n};\n\nObject.defineProperty(QtProvider.prototype, \"onmessage\", {\n set: function(handler) {\n this.handlers.push(handler);\n }\n});\n\nmodule.exports = QtProvider;\n",
- "/*\n This file is part of ethereum.js.\n\n ethereum.js is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n ethereum.js is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.\n*/\n/** @file main.js\n * @authors:\n * Jeffrey Wilcke <jeff@ethdev.com>\n * Marek Kotewicz <marek@ethdev.com>\n * Marian Oancea <marian@ethdev.com>\n * Gav Wood <g@ethdev.com>\n * @date 2014\n */\n\nfunction flattenPromise (obj) {\n if (obj instanceof Promise) {\n return Promise.resolve(obj);\n }\n\n if (obj instanceof Array) {\n return new Promise(function (resolve) {\n var promises = obj.map(function (o) {\n return flattenPromise(o);\n });\n\n return Promise.all(promises).then(function (res) {\n for (var i = 0; i < obj.length; i++) {\n obj[i] = res[i];\n }\n resolve(obj);\n });\n });\n }\n\n if (obj instanceof Object) {\n return new Promise(function (resolve) {\n var keys = Object.keys(obj);\n var promises = keys.map(function (key) {\n return flattenPromise(obj[key]);\n });\n\n return Promise.all(promises).then(function (res) {\n for (var i = 0; i < keys.length; i++) {\n obj[keys[i]] = res[i];\n }\n resolve(obj);\n });\n });\n }\n\n return Promise.resolve(obj);\n}\n\nvar web3Methods = function () {\n return [\n { name: 'sha3', call: 'web3_sha3' }\n ];\n};\n\nvar ethMethods = function () {\n var blockCall = function (args) {\n return typeof args[0] === \"string\" ? \"eth_blockByHash\" : \"eth_blockByNumber\";\n };\n\n var transactionCall = function (args) {\n return typeof args[0] === \"string\" ? 'eth_transactionByHash' : 'eth_transactionByNumber';\n };\n\n var uncleCall = function (args) {\n return typeof args[0] === \"string\" ? 'eth_uncleByHash' : 'eth_uncleByNumber';\n };\n\n var methods = [\n { name: 'balanceAt', call: 'eth_balanceAt' },\n { name: 'stateAt', call: 'eth_stateAt' },\n { name: 'storageAt', call: 'eth_storageAt' },\n { name: 'countAt', call: 'eth_countAt'},\n { name: 'codeAt', call: 'eth_codeAt' },\n { name: 'transact', call: 'eth_transact' },\n { name: 'call', call: 'eth_call' },\n { name: 'block', call: blockCall },\n { name: 'transaction', call: transactionCall },\n { name: 'uncle', call: uncleCall },\n { name: 'compilers', call: 'eth_compilers' },\n { name: 'lll', call: 'eth_lll' },\n { name: 'solidity', call: 'eth_solidity' },\n { name: 'serpent', call: 'eth_serpent' },\n { name: 'logs', call: 'eth_logs' }\n ];\n return methods;\n};\n\nvar ethProperties = function () {\n return [\n { name: 'coinbase', getter: 'eth_coinbase', setter: 'eth_setCoinbase' },\n { name: 'listening', getter: 'eth_listening', setter: 'eth_setListening' },\n { name: 'mining', getter: 'eth_mining', setter: 'eth_setMining' },\n { name: 'gasPrice', getter: 'eth_gasPrice' },\n { name: 'account', getter: 'eth_account' },\n { name: 'accounts', getter: 'eth_accounts' },\n { name: 'peerCount', getter: 'eth_peerCount' },\n { name: 'defaultBlock', getter: 'eth_defaultBlock', setter: 'eth_setDefaultBlock' },\n { name: 'number', getter: 'eth_number'}\n ];\n};\n\nvar dbMethods = function () {\n return [\n { name: 'put', call: 'db_put' },\n { name: 'get', call: 'db_get' },\n { name: 'putString', call: 'db_putString' },\n { name: 'getString', call: 'db_getString' }\n ];\n};\n\nvar shhMethods = function () {\n return [\n { name: 'post', call: 'shh_post' },\n { name: 'newIdentity', call: 'shh_newIdentity' },\n { name: 'haveIdentity', call: 'shh_haveIdentity' },\n { name: 'newGroup', call: 'shh_newGroup' },\n { name: 'addToGroup', call: 'shh_addToGroup' }\n ];\n};\n\nvar ethWatchMethods = function () {\n var newFilter = function (args) {\n return typeof args[0] === 'string' ? 'eth_newFilterString' : 'eth_newFilter';\n };\n\n return [\n { name: 'newFilter', call: newFilter },\n { name: 'uninstallFilter', call: 'eth_uninstallFilter' },\n { name: 'getMessages', call: 'eth_filterLogs' }\n ];\n};\n\nvar shhWatchMethods = function () {\n return [\n { name: 'newFilter', call: 'shh_newFilter' },\n { name: 'uninstallFilter', call: 'shh_uninstallFilter' },\n { name: 'getMessage', call: 'shh_getMessages' }\n ];\n};\n\nvar setupMethods = function (obj, methods) {\n methods.forEach(function (method) {\n obj[method.name] = function () {\n return flattenPromise(Array.prototype.slice.call(arguments)).then(function (args) {\n var call = typeof method.call === \"function\" ? method.call(args) : method.call;\n return {call: call, args: args};\n }).then(function (request) {\n return new Promise(function (resolve, reject) {\n web3.provider.send(request, function (err, result) {\n if (!err) {\n resolve(result);\n return;\n }\n reject(err);\n });\n });\n }).catch(function(err) {\n console.error(err);\n });\n };\n });\n};\n\nvar setupProperties = function (obj, properties) {\n properties.forEach(function (property) {\n var proto = {};\n proto.get = function () {\n return new Promise(function(resolve, reject) {\n web3.provider.send({call: property.getter}, function(err, result) {\n if (!err) {\n resolve(result);\n return;\n }\n reject(err);\n });\n });\n };\n if (property.setter) {\n proto.set = function (val) {\n return flattenPromise([val]).then(function (args) {\n return new Promise(function (resolve) {\n web3.provider.send({call: property.setter, args: args}, function (err, result) {\n if (!err) {\n resolve(result);\n return;\n }\n reject(err);\n });\n });\n }).catch(function (err) {\n console.error(err);\n });\n };\n }\n Object.defineProperty(obj, property.name, proto);\n });\n};\n\n// TODO: import from a dependency, don't duplicate.\nvar hexToDec = function (hex) {\n return parseInt(hex, 16).toString();\n};\n\nvar decToHex = function (dec) {\n return parseInt(dec).toString(16);\n};\n\n\nvar web3 = {\n _callbacks: {},\n _events: {},\n providers: {},\n\n toHex: function(str) {\n var hex = \"\";\n for(var i = 0; i < str.length; i++) {\n var n = str.charCodeAt(i).toString(16);\n hex += n.length < 2 ? '0' + n : n;\n }\n\n return hex;\n },\n\n toAscii: function(hex) {\n // Find termination\n var str = \"\";\n var i = 0, l = hex.length;\n if (hex.substring(0, 2) === '0x')\n i = 2;\n for(; i < l; i+=2) {\n var code = hex.charCodeAt(i);\n if(code === 0) {\n break;\n }\n\n str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));\n }\n\n return str;\n },\n\n fromAscii: function(str, pad) {\n pad = pad === undefined ? 32 : pad;\n var hex = this.toHex(str);\n while(hex.length < pad*2)\n hex += \"00\";\n return \"0x\" + hex;\n },\n\n toDecimal: function (val) {\n return hexToDec(val.substring(2));\n },\n\n fromDecimal: function (val) {\n return \"0x\" + decToHex(val);\n },\n\n toEth: function(str) {\n var val = typeof str === \"string\" ? str.indexOf('0x') === 0 ? parseInt(str.substr(2), 16) : parseInt(str) : str;\n var unit = 0;\n var units = [ 'wei', 'Kwei', 'Mwei', 'Gwei', 'szabo', 'finney', 'ether', 'grand', 'Mether', 'Gether', 'Tether', 'Pether', 'Eether', 'Zether', 'Yether', 'Nether', 'Dether', 'Vether', 'Uether' ];\n while (val > 3000 && unit < units.length - 1)\n {\n val /= 1000;\n unit++;\n }\n var s = val.toString().length < val.toFixed(2).length ? val.toString() : val.toFixed(2);\n var replaceFunction = function($0, $1, $2) {\n return $1 + ',' + $2;\n };\n\n while (true) {\n var o = s;\n s = s.replace(/(\\d)(\\d\\d\\d[\\.\\,])/, replaceFunction);\n if (o === s)\n break;\n }\n return s + ' ' + units[unit];\n },\n\n eth: {\n prototype: Object(), // jshint ignore:line\n watch: function (params) {\n return new Filter(params, ethWatch);\n }\n },\n\n db: {\n prototype: Object() // jshint ignore:line\n },\n\n shh: {\n prototype: Object(), // jshint ignore:line\n watch: function (params) {\n return new Filter(params, shhWatch);\n }\n },\n\n on: function(event, id, cb) {\n if(web3._events[event] === undefined) {\n web3._events[event] = {};\n }\n\n web3._events[event][id] = cb;\n return this;\n },\n\n off: function(event, id) {\n if(web3._events[event] !== undefined) {\n delete web3._events[event][id];\n }\n\n return this;\n },\n\n trigger: function(event, id, data) {\n var callbacks = web3._events[event];\n if (!callbacks || !callbacks[id]) {\n return;\n }\n var cb = callbacks[id];\n cb(data);\n }\n};\n\nsetupMethods(web3, web3Methods());\nsetupMethods(web3.eth, ethMethods());\nsetupProperties(web3.eth, ethProperties());\nsetupMethods(web3.db, dbMethods());\nsetupMethods(web3.shh, shhMethods());\n\nvar ethWatch = {\n changed: 'eth_changed'\n};\nsetupMethods(ethWatch, ethWatchMethods());\nvar shhWatch = {\n changed: 'shh_changed'\n};\nsetupMethods(shhWatch, shhWatchMethods());\n\nvar ProviderManager = function() {\n this.queued = [];\n this.polls = [];\n this.ready = false;\n this.provider = undefined;\n this.id = 1;\n\n var self = this;\n var poll = function () {\n if (self.provider && self.provider.poll) {\n self.polls.forEach(function (data) {\n data.data._id = self.id;\n self.id++;\n self.provider.poll(data.data, data.id);\n });\n }\n setTimeout(poll, 12000);\n };\n poll();\n};\n\nProviderManager.prototype.send = function(data, cb) {\n data._id = this.id;\n if (cb) {\n web3._callbacks[data._id] = cb;\n }\n\n data.args = data.args || [];\n this.id++;\n\n if(this.provider !== undefined) {\n this.provider.send(data);\n } else {\n console.warn(\"provider is not set\");\n this.queued.push(data);\n }\n};\n\nProviderManager.prototype.set = function(provider) {\n if(this.provider !== undefined && this.provider.unload !== undefined) {\n this.provider.unload();\n }\n\n this.provider = provider;\n this.ready = true;\n};\n\nProviderManager.prototype.sendQueued = function() {\n for(var i = 0; this.queued.length; i++) {\n // Resend\n this.send(this.queued[i]);\n }\n};\n\nProviderManager.prototype.installed = function() {\n return this.provider !== undefined;\n};\n\nProviderManager.prototype.startPolling = function (data, pollId) {\n if (!this.provider || !this.provider.poll) {\n return;\n }\n this.polls.push({data: data, id: pollId});\n};\n\nProviderManager.prototype.stopPolling = function (pollId) {\n for (var i = this.polls.length; i--;) {\n var poll = this.polls[i];\n if (poll.id === pollId) {\n this.polls.splice(i, 1);\n }\n }\n};\n\nweb3.provider = new ProviderManager();\n\nweb3.setProvider = function(provider) {\n provider.onmessage = messageHandler;\n web3.provider.set(provider);\n web3.provider.sendQueued();\n};\n\nweb3.haveProvider = function() {\n return !!web3.provider.provider;\n};\n\nvar Filter = function(options, impl) {\n this.impl = impl;\n this.callbacks = [];\n\n var self = this;\n this.promise = impl.newFilter(options);\n this.promise.then(function (id) {\n self.id = id;\n web3.on(impl.changed, id, self.trigger.bind(self));\n web3.provider.startPolling({call: impl.changed, args: [id]}, id);\n });\n};\n\nFilter.prototype.arrived = function(callback) {\n this.changed(callback);\n};\n\nFilter.prototype.changed = function(callback) {\n var self = this;\n this.promise.then(function(id) {\n self.callbacks.push(callback);\n });\n};\n\nFilter.prototype.trigger = function(messages) {\n for(var i = 0; i < this.callbacks.length; i++) {\n this.callbacks[i].call(this, messages);\n }\n};\n\nFilter.prototype.uninstall = function() {\n var self = this;\n this.promise.then(function (id) {\n self.impl.uninstallFilter(id);\n web3.provider.stopPolling(id);\n web3.off(impl.changed, id);\n });\n};\n\nFilter.prototype.messages = function() {\n var self = this;\n return this.promise.then(function (id) {\n return self.impl.getMessages(id);\n });\n};\n\nFilter.prototype.logs = function () {\n return this.messages();\n};\n\nfunction messageHandler(data) {\n if(data._event !== undefined) {\n web3.trigger(data._event, data._id, data.data);\n return;\n }\n\n if(data._id) {\n var cb = web3._callbacks[data._id];\n if (cb) {\n cb.call(this, data.error, data.data);\n delete web3._callbacks[data._id];\n }\n }\n}\n\nmodule.exports = web3;\n",
- "/*\n This file is part of ethereum.js.\n\n ethereum.js is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n ethereum.js is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.\n*/\n/** @file websocket.js\n * @authors:\n * Jeffrey Wilcke <jeff@ethdev.com>\n * Marek Kotewicz <marek@ethdev.com>\n * Marian Oancea <marian@ethdev.com>\n * @date 2014\n */\n\n// TODO: is these line is supposed to be here? \nif (\"build\" !== 'build') {/*\n var WebSocket = require('ws'); // jshint ignore:line\n*/}\n\nvar WebSocketProvider = function(host) {\n // onmessage handlers\n this.handlers = [];\n // queue will be filled with messages if send is invoked before the ws is ready\n this.queued = [];\n this.ready = false;\n\n this.ws = new WebSocket(host);\n\n var self = this;\n this.ws.onmessage = function(event) {\n for(var i = 0; i < self.handlers.length; i++) {\n self.handlers[i].call(self, JSON.parse(event.data), event);\n }\n };\n\n this.ws.onopen = function() {\n self.ready = true;\n\n for(var i = 0; i < self.queued.length; i++) {\n // Resend\n self.send(self.queued[i]);\n }\n };\n};\n\nWebSocketProvider.prototype.send = function(payload) {\n if(this.ready) {\n var data = JSON.stringify(payload);\n\n this.ws.send(data);\n } else {\n this.queued.push(payload);\n }\n};\n\nWebSocketProvider.prototype.onMessage = function(handler) {\n this.handlers.push(handler);\n};\n\nWebSocketProvider.prototype.unload = function() {\n this.ws.close();\n};\nObject.defineProperty(WebSocketProvider.prototype, \"onmessage\", {\n set: function(provider) { this.onMessage(provider); }\n});\n\nmodule.exports = WebSocketProvider;\n",
- "var web3 = require('./lib/web3');\nweb3.providers.WebSocketProvider = require('./lib/websocket');\nweb3.providers.HttpRpcProvider = require('./lib/httprpc');\nweb3.providers.QtProvider = require('./lib/qt');\nweb3.providers.AutoProvider = require('./lib/autoprovider');\nweb3.contract = require('./lib/contract');\n\nmodule.exports = web3;\n"
- ]
-} \ No newline at end of file
diff --git a/cmd/mist/assets/ext/ethereum.js/dist/ethereum.min.js b/cmd/mist/assets/ext/ethereum.js/dist/ethereum.min.js
deleted file mode 100644
index 0ae9610fc..000000000
--- a/cmd/mist/assets/ext/ethereum.js/dist/ethereum.min.js
+++ /dev/null
@@ -1 +0,0 @@
-require=function t(e,n,r){function o(a,s){if(!n[a]){if(!e[a]){var u="function"==typeof require&&require;if(!s&&u)return u(a,!0);if(i)return i(a,!0);var c=new Error("Cannot find module '"+a+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[a]={exports:{}};e[a][0].call(l.exports,function(t){var n=e[a][1][t];return o(n?n:t)},l,l.exports,t,e,n,r)}return n[a].exports}for(var i="function"==typeof require&&require,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(t,e){var n=function(t){return parseInt(t,16).toString()},r=function(t,e){for(var n=!1,r=0;r<t.length&&!n;r++)n=e(t[r]);return n?r-1:-1},o=function(t,e){return r(t,function(t){return t.name===e})},i=function(t,e){return new Array(e-t.length+1).join("0")+t},a=function(t,e){var n=t.slice(e.length);return""===n?32:parseInt(n)/8},s=function(t,e){var n=t.slice(e.length);return""===n?32:parseInt(n)},u=function(t,e){var n=t.slice(e.length);if(""===n)return 32;for(var r=n.split("x"),o=0,i=0;r>i;i++)o+=r[i]/8;return o},c=function(){var t=function(t,e){return function(n,r){var o=t;if(0!==n.indexOf(o))return!1;var a=e(n,o);return r="number"==typeof r?r.toString(16):"string"==typeof r?web3.toHex(r):0===r.indexOf("0x")?r.substr(2):(+r).toString(16),i(r,2*a)}},e=function(t,e,n){return function(r,o){return r!==t?!1:i(n?n(o):o,2*e)}},n=function(t){return t?"0x1":"0x0"};return[t("uint",a),t("int",a),t("hash",a),t("string",s),t("real",u),t("ureal",u),e("address",20),e("bool",1,n)]},l=c(),h=function(t,e,n){var r="",a=o(t,e);if(-1!==a){r="0x"+i(a.toString(16),2);for(var s=t[a],u=0;u<s.inputs.length;u++){for(var c=!1,h=0;h<l.length&&!c;h++)c=l[h](s.inputs[u].type,n[u]);c||console.error("unsupported json type: "+s.inputs[u].type),r+=c}return r}},f=function(){var t=function(t,e){return function(n){var r=t;if(0!==n.indexOf(r))return-1;var o=e(n,r);return 2*o}},e=function(t,e){return function(n){return t===n?2*e:-1}},r=function(t){return t.length<=8?+parseInt(t,16):n(t)},o=function(t){return"0x"+t},i=function(t){return"1"===t?!0:!1},c=function(t){return web3.toAscii(t)};return[{padding:t("uint",a),format:r},{padding:t("int",a),format:r},{padding:t("hash",a),format:o},{padding:t("string",s),format:c},{padding:t("real",u),format:r},{padding:t("ureal",u),format:r},{padding:e("address",20)},{padding:e("bool",1),format:i}]},p=f(),d=function(t,e,n){var r=o(t,e);if(-1!==r){n=n.slice(2);for(var i=[],a=t[r],s=0;s<a.outputs.length;s++){for(var u=-1,c=0;c<p.length&&-1===u;c++)u=p[c].padding(a.outputs[s].type);if(-1!==u){var l=n.slice(0,u),h=p[c-1].format;i.push(h?h(l):"0x"+l),n=n.slice(u)}}return i}},v=function(t){var e={};return t.forEach(function(n){e[n.name]=function(){var e=Array.prototype.slice.call(arguments);return h(t,n.name,e)}}),e},g=function(t){var e={};return t.forEach(function(n){e[n.name]=function(e){return d(t,n.name,e)}}),e};e.exports={inputParser:v,outputParser:g}},{}],2:[function(t,e){var n=function(t){if(!web3.haveProvider()){if(this.sendQueue=[],this.onmessageQueue=[],navigator.qt)return void(this.provider=new web3.providers.QtProvider);t=t||{};var e={httprpc:t.httprpc||"http://localhost:8080",websockets:t.websockets||"ws://localhost:40404/eth"},n=this,r=function(t){o.close(),t?n.provider=new web3.providers.WebSocketProvider(e.websockets):(n.provider=new web3.providers.HttpRpcProvider(e.httprpc),n.poll=n.provider.poll.bind(n.provider)),n.sendQueue.forEach(function(t){n.provider(t)}),n.onmessageQueue.forEach(function(t){n.provider.onmessage=t})},o=new WebSocket(e.websockets);o.onopen=function(){r(!0)},o.onerror=function(){r(!1)}}};n.prototype.send=function(t){return this.provider?void this.provider.send(t):void this.sendQueue.push(t)},Object.defineProperty(n.prototype,"onmessage",{set:function(t){return this.provider?void(this.provider.onmessage=t):void this.onmessageQueue.push(t)}}),e.exports=n},{}],3:[function(t,e){var n=t("./abi"),r=function(t,e){var r=n.inputParser(e),o=n.outputParser(e),i={};return e.forEach(function(e){i[e.name]=function(){var n=Array.prototype.slice.call(arguments),i=r[e.name].apply(null,n),a=function(t){return o[e.name](t)};return{call:function(e){return e=e||{},e.to=t,e.data=i,web3.eth.call(e).then(a)},transact:function(e){return e=e||{},e.to=t,e.data=i,web3.eth.transact(e).then(a)}}}}),i};e.exports=r},{"./abi":1}],4:[function(t,e){function n(t){return{jsonrpc:"2.0",method:t.call,params:t.args,id:t._id}}function r(t){var e=JSON.parse(t);return{_id:e.id,data:e.result,error:e.error}}var o=function(t){this.handlers=[],this.host=t};o.prototype.sendRequest=function(t,e){var r=n(t),o=new XMLHttpRequest;o.open("POST",this.host,!0),o.send(JSON.stringify(r)),o.onreadystatechange=function(){4===o.readyState&&e&&e(o)}},o.prototype.send=function(t){var e=this;this.sendRequest(t,function(t){e.handlers.forEach(function(n){n.call(e,r(t.responseText))})})},o.prototype.poll=function(t,e){var n=this;this.sendRequest(t,function(r){var o=JSON.parse(r.responseText);!o.error&&(o.result instanceof Array?0!==o.result.length:o.result)&&n.handlers.forEach(function(r){r.call(n,{_event:t.call,_id:e,data:o.result})})})},Object.defineProperty(o.prototype,"onmessage",{set:function(t){this.handlers.push(t)}}),e.exports=o},{}],5:[function(t,e){var n=function(){this.handlers=[];var t=this;navigator.qt.onmessage=function(e){t.handlers.forEach(function(n){n.call(t,JSON.parse(e.data))})}};n.prototype.send=function(t){navigator.qt.postMessage(JSON.stringify(t))},Object.defineProperty(n.prototype,"onmessage",{set:function(t){this.handlers.push(t)}}),e.exports=n},{}],6:[function(t,e){function n(t){return t instanceof Promise?Promise.resolve(t):t instanceof Array?new Promise(function(e){var r=t.map(function(t){return n(t)});return Promise.all(r).then(function(n){for(var r=0;r<t.length;r++)t[r]=n[r];e(t)})}):t instanceof Object?new Promise(function(e){var r=Object.keys(t),o=r.map(function(e){return n(t[e])});return Promise.all(o).then(function(n){for(var o=0;o<r.length;o++)t[r[o]]=n[o];e(t)})}):Promise.resolve(t)}function r(t){if(void 0!==t._event)return void v.trigger(t._event,t._id,t.data);if(t._id){var e=v._callbacks[t._id];e&&(e.call(this,t.error,t.data),delete v._callbacks[t._id])}}var o=function(){return[{name:"sha3",call:"web3_sha3"}]},i=function(){var t=function(t){return"string"==typeof t[0]?"eth_blockByHash":"eth_blockByNumber"},e=function(t){return"string"==typeof t[0]?"eth_transactionByHash":"eth_transactionByNumber"},n=function(t){return"string"==typeof t[0]?"eth_uncleByHash":"eth_uncleByNumber"},r=[{name:"balanceAt",call:"eth_balanceAt"},{name:"stateAt",call:"eth_stateAt"},{name:"storageAt",call:"eth_storageAt"},{name:"countAt",call:"eth_countAt"},{name:"codeAt",call:"eth_codeAt"},{name:"transact",call:"eth_transact"},{name:"call",call:"eth_call"},{name:"block",call:t},{name:"transaction",call:e},{name:"uncle",call:n},{name:"compilers",call:"eth_compilers"},{name:"lll",call:"eth_lll"},{name:"solidity",call:"eth_solidity"},{name:"serpent",call:"eth_serpent"},{name:"logs",call:"eth_logs"}];return r},a=function(){return[{name:"coinbase",getter:"eth_coinbase",setter:"eth_setCoinbase"},{name:"listening",getter:"eth_listening",setter:"eth_setListening"},{name:"mining",getter:"eth_mining",setter:"eth_setMining"},{name:"gasPrice",getter:"eth_gasPrice"},{name:"account",getter:"eth_account"},{name:"accounts",getter:"eth_accounts"},{name:"peerCount",getter:"eth_peerCount"},{name:"defaultBlock",getter:"eth_defaultBlock",setter:"eth_setDefaultBlock"},{name:"number",getter:"eth_number"}]},s=function(){return[{name:"put",call:"db_put"},{name:"get",call:"db_get"},{name:"putString",call:"db_putString"},{name:"getString",call:"db_getString"}]},u=function(){return[{name:"post",call:"shh_post"},{name:"newIdentity",call:"shh_newIdentity"},{name:"haveIdentity",call:"shh_haveIdentity"},{name:"newGroup",call:"shh_newGroup"},{name:"addToGroup",call:"shh_addToGroup"}]},c=function(){var t=function(t){return"string"==typeof t[0]?"eth_newFilterString":"eth_newFilter"};return[{name:"newFilter",call:t},{name:"uninstallFilter",call:"eth_uninstallFilter"},{name:"getMessages",call:"eth_filterLogs"}]},l=function(){return[{name:"newFilter",call:"shh_newFilter"},{name:"uninstallFilter",call:"shh_uninstallFilter"},{name:"getMessage",call:"shh_getMessages"}]},h=function(t,e){e.forEach(function(e){t[e.name]=function(){return n(Array.prototype.slice.call(arguments)).then(function(t){var n="function"==typeof e.call?e.call(t):e.call;return{call:n,args:t}}).then(function(t){return new Promise(function(e,n){v.provider.send(t,function(t,r){return t?void n(t):void e(r)})})}).catch(function(t){console.error(t)})}})},f=function(t,e){e.forEach(function(e){var r={};r.get=function(){return new Promise(function(t,n){v.provider.send({call:e.getter},function(e,r){return e?void n(e):void t(r)})})},e.setter&&(r.set=function(t){return n([t]).then(function(t){return new Promise(function(n){v.provider.send({call:e.setter,args:t},function(t,e){return t?void reject(t):void n(e)})})}).catch(function(t){console.error(t)})}),Object.defineProperty(t,e.name,r)})},p=function(t){return parseInt(t,16).toString()},d=function(t){return parseInt(t).toString(16)},v={_callbacks:{},_events:{},providers:{},toHex:function(t){for(var e="",n=0;n<t.length;n++){var r=t.charCodeAt(n).toString(16);e+=r.length<2?"0"+r:r}return e},toAscii:function(t){var e="",n=0,r=t.length;for("0x"===t.substring(0,2)&&(n=2);r>n;n+=2){var o=t.charCodeAt(n);if(0===o)break;e+=String.fromCharCode(parseInt(t.substr(n,2),16))}return e},fromAscii:function(t,e){e=void 0===e?32:e;for(var n=this.toHex(t);n.length<2*e;)n+="00";return"0x"+n},toDecimal:function(t){return p(t.substring(2))},fromDecimal:function(t){return"0x"+d(t)},toEth:function(t){for(var e="string"==typeof t?0===t.indexOf("0x")?parseInt(t.substr(2),16):parseInt(t):t,n=0,r=["wei","Kwei","Mwei","Gwei","szabo","finney","ether","grand","Mether","Gether","Tether","Pether","Eether","Zether","Yether","Nether","Dether","Vether","Uether"];e>3e3&&n<r.length-1;)e/=1e3,n++;for(var o=e.toString().length<e.toFixed(2).length?e.toString():e.toFixed(2),i=function(t,e,n){return e+","+n};;){var a=o;if(o=o.replace(/(\d)(\d\d\d[\.\,])/,i),a===o)break}return o+" "+r[n]},eth:{prototype:Object(),watch:function(t){return new y(t,g)}},db:{prototype:Object()},shh:{prototype:Object(),watch:function(t){return new y(t,m)}},on:function(t,e,n){return void 0===v._events[t]&&(v._events[t]={}),v._events[t][e]=n,this},off:function(t,e){return void 0!==v._events[t]&&delete v._events[t][e],this},trigger:function(t,e,n){var r=v._events[t];if(r&&r[e]){var o=r[e];o(n)}}};h(v,o()),h(v.eth,i()),f(v.eth,a()),h(v.db,s()),h(v.shh,u());var g={changed:"eth_changed"};h(g,c());var m={changed:"shh_changed"};h(m,l());var b=function(){this.queued=[],this.polls=[],this.ready=!1,this.provider=void 0,this.id=1;var t=this,e=function(){t.provider&&t.provider.poll&&t.polls.forEach(function(e){e.data._id=t.id,t.id++,t.provider.poll(e.data,e.id)}),setTimeout(e,12e3)};e()};b.prototype.send=function(t,e){t._id=this.id,e&&(v._callbacks[t._id]=e),t.args=t.args||[],this.id++,void 0!==this.provider?this.provider.send(t):(console.warn("provider is not set"),this.queued.push(t))},b.prototype.set=function(t){void 0!==this.provider&&void 0!==this.provider.unload&&this.provider.unload(),this.provider=t,this.ready=!0},b.prototype.sendQueued=function(){for(var t=0;this.queued.length;t++)this.send(this.queued[t])},b.prototype.installed=function(){return void 0!==this.provider},b.prototype.startPolling=function(t,e){this.provider&&this.provider.poll&&this.polls.push({data:t,id:e})},b.prototype.stopPolling=function(t){for(var e=this.polls.length;e--;){var n=this.polls[e];n.id===t&&this.polls.splice(e,1)}},v.provider=new b,v.setProvider=function(t){t.onmessage=r,v.provider.set(t),v.provider.sendQueued()},v.haveProvider=function(){return!!v.provider.provider};var y=function(t,e){this.impl=e,this.callbacks=[];var n=this;this.promise=e.newFilter(t),this.promise.then(function(t){n.id=t,v.on(e.changed,t,n.trigger.bind(n)),v.provider.startPolling({call:e.changed,args:[t]},t)})};y.prototype.arrived=function(t){this.changed(t)},y.prototype.changed=function(t){var e=this;this.promise.then(function(){e.callbacks.push(t)})},y.prototype.trigger=function(t){for(var e=0;e<this.callbacks.length;e++)this.callbacks[e].call(this,t)},y.prototype.uninstall=function(){var t=this;this.promise.then(function(e){t.impl.uninstallFilter(e),v.provider.stopPolling(e),v.off(impl.changed,e)})},y.prototype.messages=function(){var t=this;return this.promise.then(function(e){return t.impl.getMessages(e)})},y.prototype.logs=function(){return this.messages()},e.exports=v},{}],7:[function(t,e){var n=function(t){this.handlers=[],this.queued=[],this.ready=!1,this.ws=new WebSocket(t);var e=this;this.ws.onmessage=function(t){for(var n=0;n<e.handlers.length;n++)e.handlers[n].call(e,JSON.parse(t.data),t)},this.ws.onopen=function(){e.ready=!0;for(var t=0;t<e.queued.length;t++)e.send(e.queued[t])}};n.prototype.send=function(t){if(this.ready){var e=JSON.stringify(t);this.ws.send(e)}else this.queued.push(t)},n.prototype.onMessage=function(t){this.handlers.push(t)},n.prototype.unload=function(){this.ws.close()},Object.defineProperty(n.prototype,"onmessage",{set:function(t){this.onMessage(t)}}),e.exports=n},{}],web3:[function(t,e){var n=t("./lib/web3");n.providers.WebSocketProvider=t("./lib/websocket"),n.providers.HttpRpcProvider=t("./lib/httprpc"),n.providers.QtProvider=t("./lib/qt"),n.providers.AutoProvider=t("./lib/autoprovider"),n.contract=t("./lib/contract"),e.exports=n},{"./lib/autoprovider":2,"./lib/contract":3,"./lib/httprpc":4,"./lib/qt":5,"./lib/web3":6,"./lib/websocket":7}]},{},["web3"]); \ No newline at end of file
diff --git a/cmd/mist/assets/ext/ethereum.js/example/balance.html b/cmd/mist/assets/ext/ethereum.js/example/balance.html
deleted file mode 100644
index d0bf094ef..000000000
--- a/cmd/mist/assets/ext/ethereum.js/example/balance.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!doctype>
-<html>
-
-<head>
-<script type="text/javascript" src="js/es6-promise/promise.min.js"></script>
-<script type="text/javascript" src="../dist/ethereum.js"></script>
-<script type="text/javascript">
-
- var web3 = require('web3');
- web3.setProvider(new web3.providers.AutoProvider());
-
- function watchBalance() {
- var coinbase = web3.eth.coinbase;
- var originalBalance = 0;
-
- web3.eth.balanceAt(coinbase).then(function (balance) {
- originalBalance = web3.toDecimal(balance);
- document.getElementById('original').innerText = 'original balance: ' + originalBalance + ' watching...';
- });
-
- web3.eth.watch({altered: coinbase}).changed(function() {
- web3.eth.balanceAt(coinbase).then(function (balance) {
- var currentBalance = web3.toDecimal(balance);
- document.getElementById("current").innerText = 'current: ' + currentBalance;
- document.getElementById("diff").innerText = 'diff: ' + (currentBalance - originalBalance);
- });
- });
- }
-
-</script>
-</head>
-<body>
- <h1>coinbase balance</h1>
- <button type="button" onClick="watchBalance();">watch balance</button>
- <div></div>
- <div id="original"></div>
- <div id="current"></div>
- <div id="diff"></div>
-</body>
-</html>
-
diff --git a/cmd/mist/assets/ext/ethereum.js/example/contract.html b/cmd/mist/assets/ext/ethereum.js/example/contract.html
deleted file mode 100644
index 403d8c9d1..000000000
--- a/cmd/mist/assets/ext/ethereum.js/example/contract.html
+++ /dev/null
@@ -1,75 +0,0 @@
-<!doctype>
-<html>
-
-<head>
-<script type="text/javascript" src="js/es6-promise/promise.min.js"></script>
-<script type="text/javascript" src="../dist/ethereum.js"></script>
-<script type="text/javascript">
-
- var web3 = require('web3');
- web3.setProvider(new web3.providers.AutoProvider());
-
- // solidity source code
- var source = "" +
- "contract test {\n" +
- " function multiply(uint a) returns(uint d) {\n" +
- " return a * 7;\n" +
- " }\n" +
- "}\n";
-
- // contract description, this will be autogenerated somehow
- var desc = [{
- "name": "multiply",
- "inputs": [
- {
- "name": "a",
- "type": "uint256"
- }
- ],
- "outputs": [
- {
- "name": "d",
- "type": "uint256"
- }
- ]
- }];
-
- var contract;
-
- function createExampleContract() {
- // hide create button
- document.getElementById('create').style.visibility = 'hidden';
- document.getElementById('source').innerText = source;
-
- // create contract
- web3.eth.transact({code: web3.eth.solidity(source)}).then(function (address) {
- contract = web3.contract(address, desc);
- document.getElementById('call').style.visibility = 'visible';
- });
- }
-
- function callExampleContract() {
- // this should be generated by ethereum
- var param = parseInt(document.getElementById('value').value);
-
- // call the contract
- contract.multiply(param).call().then(function(res) {
- document.getElementById('result').innerText = res[0];
- });
- }
-
-</script>
-</head>
-<body>
- <h1>contract</h1>
- <div id="source"></div>
- <div id='create'>
- <button type="button" onClick="createExampleContract();">create example contract</button>
- </div>
- <div id='call' style='visibility: hidden;'>
- <input type="number" id="value" onkeyup='callExampleContract()'></input>
- </div>
- <div id="result"></div>
-</body>
-</html>
-
diff --git a/cmd/mist/assets/ext/ethereum.js/example/node-app.js b/cmd/mist/assets/ext/ethereum.js/example/node-app.js
deleted file mode 100644
index f63fa9115..000000000
--- a/cmd/mist/assets/ext/ethereum.js/example/node-app.js
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env node
-
-require('es6-promise').polyfill();
-
-var web3 = require("../index.js");
-
-web3.setProvider(new web3.providers.HttpRpcProvider('http://localhost:8080'));
-
-web3.eth.coinbase.then(function(result){
- console.log(result);
- return web3.eth.balanceAt(result);
-}).then(function(balance){
- console.log(web3.toDecimal(balance));
-}).catch(function(err){
- console.log(err);
-}); \ No newline at end of file
diff --git a/cmd/mist/assets/ext/ethereum.js/gulpfile.js b/cmd/mist/assets/ext/ethereum.js/gulpfile.js
deleted file mode 100644
index b17e50c39..000000000
--- a/cmd/mist/assets/ext/ethereum.js/gulpfile.js
+++ /dev/null
@@ -1,104 +0,0 @@
-#!/usr/bin/env node
-
-'use strict';
-
-var path = require('path');
-
-var del = require('del');
-var gulp = require('gulp');
-var browserify = require('browserify');
-var jshint = require('gulp-jshint');
-var uglify = require('gulp-uglify');
-var rename = require('gulp-rename');
-var envify = require('envify/custom');
-var unreach = require('unreachable-branch-transform');
-var source = require('vinyl-source-stream');
-var exorcist = require('exorcist');
-var bower = require('bower');
-
-var DEST = './dist/';
-
-var build = function(src, dst, ugly) {
- var result = browserify({
- debug: true,
- insert_global_vars: false,
- detectGlobals: false,
- bundleExternal: false
- })
- .require('./' + src + '.js', {expose: 'web3'})
- .add('./' + src + '.js')
- .transform('envify', {
- NODE_ENV: 'build'
- })
- .transform('unreachable-branch-transform');
-
- if (ugly) {
- result = result.transform('uglifyify', {
- mangle: false,
- compress: {
- dead_code: false,
- conditionals: true,
- unused: false,
- hoist_funs: true,
- hoist_vars: true,
- negate_iife: false
- },
- beautify: true,
- warnings: true
- });
- }
-
- return result.bundle()
- .pipe(exorcist(path.join( DEST, dst + '.js.map')))
- .pipe(source(dst + '.js'))
- .pipe(gulp.dest( DEST ));
-};
-
-var uglifyFile = function(file) {
- return gulp.src( DEST + file + '.js')
- .pipe(uglify())
- .pipe(rename(file + '.min.js'))
- .pipe(gulp.dest( DEST ));
-};
-
-gulp.task('bower', function(cb){
- bower.commands.install().on('end', function (installed){
- console.log(installed);
- cb();
- });
-});
-
-gulp.task('clean', ['lint'], function(cb) {
- del([ DEST ], cb);
-});
-
-gulp.task('lint', function(){
- return gulp.src(['./*.js', './lib/*.js'])
- .pipe(jshint())
- .pipe(jshint.reporter('default'));
-});
-
-gulp.task('build', ['clean'], function () {
- return build('index', 'ethereum', true);
-});
-
-gulp.task('buildDev', ['clean'], function () {
- return build('index', 'ethereum', false);
-});
-
-gulp.task('uglify', ['build'], function(){
- return uglifyFile('ethereum');
-});
-
-gulp.task('uglify', ['buildDev'], function(){
- return uglifyFile('ethereum');
-});
-
-gulp.task('watch', function() {
- gulp.watch(['./lib/*.js'], ['lint', 'prepare', 'build']);
-});
-
-gulp.task('release', ['bower', 'lint', 'build', 'uglify']);
-gulp.task('dev', ['bower', 'lint', 'buildDev', 'uglify']);
-gulp.task('default', ['dev']);
-
diff --git a/cmd/mist/assets/ext/ethereum.js/index.js b/cmd/mist/assets/ext/ethereum.js/index.js
deleted file mode 100644
index 99ce66fad..000000000
--- a/cmd/mist/assets/ext/ethereum.js/index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var web3 = require('./lib/web3');
-web3.providers.WebSocketProvider = require('./lib/websocket');
-web3.providers.HttpRpcProvider = require('./lib/httprpc');
-web3.providers.QtProvider = require('./lib/qt');
-web3.providers.AutoProvider = require('./lib/autoprovider');
-web3.contract = require('./lib/contract');
-
-module.exports = web3;
diff --git a/cmd/mist/assets/ext/ethereum.js/lib/abi.js b/cmd/mist/assets/ext/ethereum.js/lib/abi.js
deleted file mode 100644
index 1912fff32..000000000
--- a/cmd/mist/assets/ext/ethereum.js/lib/abi.js
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- This file is part of ethereum.js.
-
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
-*/
-/** @file abi.js
- * @authors:
- * Marek Kotewicz <marek@ethdev.com>
- * Gav Wood <g@ethdev.com>
- * @date 2014
- */
-
-// TODO: is these line is supposed to be here?
-if (process.env.NODE_ENV !== 'build') {
- var web3 = require('./web3'); // jshint ignore:line
-}
-
-// TODO: make these be actually accurate instead of falling back onto JS's doubles.
-var hexToDec = function (hex) {
- return parseInt(hex, 16).toString();
-};
-
-var decToHex = function (dec) {
- return parseInt(dec).toString(16);
-};
-
-var findIndex = function (array, callback) {
- var end = false;
- var i = 0;
- for (; i < array.length && !end; i++) {
- end = callback(array[i]);
- }
- return end ? i - 1 : -1;
-};
-
-var findMethodIndex = function (json, methodName) {
- return findIndex(json, function (method) {
- return method.name === methodName;
- });
-};
-
-var padLeft = function (string, chars) {
- return new Array(chars - string.length + 1).join("0") + string;
-};
-
-var calcBitPadding = function (type, expected) {
- var value = type.slice(expected.length);
- if (value === "") {
- return 32;
- }
- return parseInt(value) / 8;
-};
-
-var calcBytePadding = function (type, expected) {
- var value = type.slice(expected.length);
- if (value === "") {
- return 32;
- }
- return parseInt(value);
-};
-
-var calcRealPadding = function (type, expected) {
- var value = type.slice(expected.length);
- if (value === "") {
- return 32;
- }
- var sizes = value.split('x');
- for (var padding = 0, i = 0; i < sizes; i++) {
- padding += (sizes[i] / 8);
- }
- return padding;
-};
-
-var setupInputTypes = function () {
-
- var prefixedType = function (prefix, calcPadding) {
- return function (type, value) {
- var expected = prefix;
- if (type.indexOf(expected) !== 0) {
- return false;
- }
-
- var padding = calcPadding(type, expected);
- if (typeof value === "number")
- value = value.toString(16);
- else if (typeof value === "string")
- value = web3.toHex(value);
- else if (value.indexOf('0x') === 0)
- value = value.substr(2);
- else
- value = (+value).toString(16);
- return padLeft(value, padding * 2);
- };
- };
-
- var namedType = function (name, padding, formatter) {
- return function (type, value) {
- if (type !== name) {
- return false;
- }
-
- return padLeft(formatter ? formatter(value) : value, padding * 2);
- };
- };
-
- var formatBool = function (value) {
- return value ? '0x1' : '0x0';
- };
-
- return [
- prefixedType('uint', calcBitPadding),
- prefixedType('int', calcBitPadding),
- prefixedType('hash', calcBitPadding),
- prefixedType('string', calcBytePadding),
- prefixedType('real', calcRealPadding),
- prefixedType('ureal', calcRealPadding),
- namedType('address', 20),
- namedType('bool', 1, formatBool),
- ];
-};
-
-var inputTypes = setupInputTypes();
-
-var toAbiInput = function (json, methodName, params) {
- var bytes = "";
- var index = findMethodIndex(json, methodName);
-
- if (index === -1) {
- return;
- }
-
- bytes = "0x" + padLeft(index.toString(16), 2);
- var method = json[index];
-
- for (var i = 0; i < method.inputs.length; i++) {
- var found = false;
- for (var j = 0; j < inputTypes.length && !found; j++) {
- found = inputTypes[j](method.inputs[i].type, params[i]);
- }
- if (!found) {
- console.error('unsupported json type: ' + method.inputs[i].type);
- }
- bytes += found;
- }
- return bytes;
-};
-
-var setupOutputTypes = function () {
-
- var prefixedType = function (prefix, calcPadding) {
- return function (type) {
- var expected = prefix;
- if (type.indexOf(expected) !== 0) {
- return -1;
- }
-
- var padding = calcPadding(type, expected);
- return padding * 2;
- };
- };
-
- var namedType = function (name, padding) {
- return function (type) {
- return name === type ? padding * 2 : -1;
- };
- };
-
- var formatInt = function (value) {
- return value.length <= 8 ? +parseInt(value, 16) : hexToDec(value);
- };
-
- var formatHash = function (value) {
- return "0x" + value;
- };
-
- var formatBool = function (value) {
- return value === '1' ? true : false;
- };
-
- var formatString = function (value) {
- return web3.toAscii(value);
- };
-
- return [
- { padding: prefixedType('uint', calcBitPadding), format: formatInt },
- { padding: prefixedType('int', calcBitPadding), format: formatInt },
- { padding: prefixedType('hash', calcBitPadding), format: formatHash },
- { padding: prefixedType('string', calcBytePadding), format: formatString },
- { padding: prefixedType('real', calcRealPadding), format: formatInt },
- { padding: prefixedType('ureal', calcRealPadding), format: formatInt },
- { padding: namedType('address', 20) },
- { padding: namedType('bool', 1), format: formatBool }
- ];
-};
-
-var outputTypes = setupOutputTypes();
-
-var fromAbiOutput = function (json, methodName, output) {
- var index = findMethodIndex(json, methodName);
-
- if (index === -1) {
- return;
- }
-
- output = output.slice(2);
-
- var result = [];
- var method = json[index];
- for (var i = 0; i < method.outputs.length; i++) {
- var padding = -1;
- for (var j = 0; j < outputTypes.length && padding === -1; j++) {
- padding = outputTypes[j].padding(method.outputs[i].type);
- }
-
- if (padding === -1) {
- // not found output parsing
- continue;
- }
- var res = output.slice(0, padding);
- var formatter = outputTypes[j - 1].format;
- result.push(formatter ? formatter(res) : ("0x" + res));
- output = output.slice(padding);
- }
-
- return result;
-};
-
-var inputParser = function (json) {
- var parser = {};
- json.forEach(function (method) {
- parser[method.name] = function () {
- var params = Array.prototype.slice.call(arguments);
- return toAbiInput(json, method.name, params);
- };
- });
-
- return parser;
-};
-
-var outputParser = function (json) {
- var parser = {};
- json.forEach(function (method) {
- parser[method.name] = function (output) {
- return fromAbiOutput(json, method.name, output);
- };
- });
-
- return parser;
-};
-
-if (typeof(module) !== "undefined") {
- module.exports = {
- inputParser: inputParser,
- outputParser: outputParser
- };
-}
diff --git a/cmd/mist/assets/ext/ethereum.js/lib/autoprovider.js b/cmd/mist/assets/ext/ethereum.js/lib/autoprovider.js
deleted file mode 100644
index 3cb83d4a0..000000000
--- a/cmd/mist/assets/ext/ethereum.js/lib/autoprovider.js
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- This file is part of ethereum.js.
-
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
-*/
-/** @file autoprovider.js
- * @authors:
- * Marek Kotewicz <marek@ethdev.com>
- * Marian Oancea <marian@ethdev.com>
- * @date 2014
- */
-
-/*
- * @brief if qt object is available, uses QtProvider,
- * if not tries to connect over websockets
- * if it fails, it uses HttpRpcProvider
- */
-
-// TODO: is these line is supposed to be here?
-if (process.env.NODE_ENV !== 'build') {
- var WebSocket = require('ws'); // jshint ignore:line
- var web3 = require('./web3'); // jshint ignore:line
-}
-
-var AutoProvider = function (userOptions) {
- if (web3.haveProvider()) {
- return;
- }
-
- // before we determine what provider we are, we have to cache request
- this.sendQueue = [];
- this.onmessageQueue = [];
-
- if (navigator.qt) {
- this.provider = new web3.providers.QtProvider();
- return;
- }
-
- userOptions = userOptions || {};
- var options = {
- httprpc: userOptions.httprpc || 'http://localhost:8080',
- websockets: userOptions.websockets || 'ws://localhost:40404/eth'
- };
-
- var self = this;
- var closeWithSuccess = function (success) {
- ws.close();
- if (success) {
- self.provider = new web3.providers.WebSocketProvider(options.websockets);
- } else {
- self.provider = new web3.providers.HttpRpcProvider(options.httprpc);
- self.poll = self.provider.poll.bind(self.provider);
- }
- self.sendQueue.forEach(function (payload) {
- self.provider(payload);
- });
- self.onmessageQueue.forEach(function (handler) {
- self.provider.onmessage = handler;
- });
- };
-
- var ws = new WebSocket(options.websockets);
-
- ws.onopen = function() {
- closeWithSuccess(true);
- };
-
- ws.onerror = function() {
- closeWithSuccess(false);
- };
-};
-
-AutoProvider.prototype.send = function (payload) {
- if (this.provider) {
- this.provider.send(payload);
- return;
- }
- this.sendQueue.push(payload);
-};
-
-Object.defineProperty(AutoProvider.prototype, 'onmessage', {
- set: function (handler) {
- if (this.provider) {
- this.provider.onmessage = handler;
- return;
- }
- this.onmessageQueue.push(handler);
- }
-});
-
-if (typeof(module) !== "undefined")
- module.exports = AutoProvider;
diff --git a/cmd/mist/assets/ext/ethereum.js/lib/contract.js b/cmd/mist/assets/ext/ethereum.js/lib/contract.js
deleted file mode 100644
index dc84eb996..000000000
--- a/cmd/mist/assets/ext/ethereum.js/lib/contract.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- This file is part of ethereum.js.
-
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
-*/
-/** @file contract.js
- * @authors:
- * Marek Kotewicz <marek@ethdev.com>
- * @date 2014
- */
-
-// TODO: is these line is supposed to be here?
-if (process.env.NODE_ENV !== 'build') {
- var web3 = require('./web3'); // jshint ignore:line
-}
-
-var abi = require('./abi');
-
-var contract = function (address, desc) {
- var inputParser = abi.inputParser(desc);
- var outputParser = abi.outputParser(desc);
-
- var contract = {};
-
- desc.forEach(function (method) {
- contract[method.name] = function () {
- var params = Array.prototype.slice.call(arguments);
- var parsed = inputParser[method.name].apply(null, params);
-
- var onSuccess = function (result) {
- return outputParser[method.name](result);
- };
-
- return {
- call: function (extra) {
- extra = extra || {};
- extra.to = address;
- extra.data = parsed;
- return web3.eth.call(extra).then(onSuccess);
- },
- transact: function (extra) {
- extra = extra || {};
- extra.to = address;
- extra.data = parsed;
- return web3.eth.transact(extra).then(onSuccess);
- }
- };
- };
- });
-
- return contract;
-};
-
-if (typeof(module) !== "undefined")
- module.exports = contract;
diff --git a/cmd/mist/assets/ext/ethereum.js/lib/httprpc.js b/cmd/mist/assets/ext/ethereum.js/lib/httprpc.js
deleted file mode 100644
index 6823b96b4..000000000
--- a/cmd/mist/assets/ext/ethereum.js/lib/httprpc.js
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- This file is part of ethereum.js.
-
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
-*/
-/** @file httprpc.js
- * @authors:
- * Marek Kotewicz <marek@ethdev.com>
- * Marian Oancea <marian@ethdev.com>
- * @date 2014
- */
-
-// TODO: is these line is supposed to be here?
-if (process.env.NODE_ENV !== 'build') {
- var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; // jshint ignore:line
-}
-
-var HttpRpcProvider = function (host) {
- this.handlers = [];
- this.host = host;
-};
-
-function formatJsonRpcObject(object) {
- return {
- jsonrpc: '2.0',
- method: object.call,
- params: object.args,
- id: object._id
- };
-}
-
-function formatJsonRpcMessage(message) {
- var object = JSON.parse(message);
-
- return {
- _id: object.id,
- data: object.result,
- error: object.error
- };
-}
-
-HttpRpcProvider.prototype.sendRequest = function (payload, cb) {
- var data = formatJsonRpcObject(payload);
-
- var request = new XMLHttpRequest();
- request.open("POST", this.host, true);
- request.send(JSON.stringify(data));
- request.onreadystatechange = function () {
- if (request.readyState === 4 && cb) {
- cb(request);
- }
- };
-};
-
-HttpRpcProvider.prototype.send = function (payload) {
- var self = this;
- this.sendRequest(payload, function (request) {
- self.handlers.forEach(function (handler) {
- handler.call(self, formatJsonRpcMessage(request.responseText));
- });
- });
-};
-
-HttpRpcProvider.prototype.poll = function (payload, id) {
- var self = this;
- this.sendRequest(payload, function (request) {
- var parsed = JSON.parse(request.responseText);
- if (parsed.error || (parsed.result instanceof Array ? parsed.result.length === 0 : !parsed.result)) {
- return;
- }
- self.handlers.forEach(function (handler) {
- handler.call(self, {_event: payload.call, _id: id, data: parsed.result});
- });
- });
-};
-
-Object.defineProperty(HttpRpcProvider.prototype, "onmessage", {
- set: function (handler) {
- this.handlers.push(handler);
- }
-});
-
-if (typeof(module) !== "undefined")
- module.exports = HttpRpcProvider;
diff --git a/cmd/mist/assets/ext/ethereum.js/lib/qt.js b/cmd/mist/assets/ext/ethereum.js/lib/qt.js
deleted file mode 100644
index f51e65da4..000000000
--- a/cmd/mist/assets/ext/ethereum.js/lib/qt.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- This file is part of ethereum.js.
-
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
-*/
-/** @file qt.js
- * @authors:
- * Jeffrey Wilcke <jeff@ethdev.com>
- * Marek Kotewicz <marek@ethdev.com>
- * @date 2014
- */
-
-var QtProvider = function() {
- this.handlers = [];
-
- var self = this;
- navigator.qt.onmessage = function (message) {
- self.handlers.forEach(function (handler) {
- handler.call(self, JSON.parse(message.data));
- });
- };
-};
-
-QtProvider.prototype.send = function(payload) {
- navigator.qt.postMessage(JSON.stringify(payload));
-};
-
-Object.defineProperty(QtProvider.prototype, "onmessage", {
- set: function(handler) {
- this.handlers.push(handler);
- }
-});
-
-if (typeof(module) !== "undefined")
- module.exports = QtProvider;
diff --git a/cmd/mist/assets/ext/ethereum.js/lib/web3.js b/cmd/mist/assets/ext/ethereum.js/lib/web3.js
deleted file mode 100644
index 2fe414259..000000000
--- a/cmd/mist/assets/ext/ethereum.js/lib/web3.js
+++ /dev/null
@@ -1,509 +0,0 @@
-/*
- This file is part of ethereum.js.
-
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
-*/
-/** @file main.js
- * @authors:
- * Jeffrey Wilcke <jeff@ethdev.com>
- * Marek Kotewicz <marek@ethdev.com>
- * Marian Oancea <marian@ethdev.com>
- * Gav Wood <g@ethdev.com>
- * @date 2014
- */
-
-function flattenPromise (obj) {
- if (obj instanceof Promise) {
- return Promise.resolve(obj);
- }
-
- if (obj instanceof Array) {
- return new Promise(function (resolve) {
- var promises = obj.map(function (o) {
- return flattenPromise(o);
- });
-
- return Promise.all(promises).then(function (res) {
- for (var i = 0; i < obj.length; i++) {
- obj[i] = res[i];
- }
- resolve(obj);
- });
- });
- }
-
- if (obj instanceof Object) {
- return new Promise(function (resolve) {
- var keys = Object.keys(obj);
- var promises = keys.map(function (key) {
- return flattenPromise(obj[key]);
- });
-
- return Promise.all(promises).then(function (res) {
- for (var i = 0; i < keys.length; i++) {
- obj[keys[i]] = res[i];
- }
- resolve(obj);
- });
- });
- }
-
- return Promise.resolve(obj);
-}
-
-var web3Methods = function () {
- return [
- { name: 'sha3', call: 'web3_sha3' }
- ];
-};
-
-var ethMethods = function () {
- var blockCall = function (args) {
- return typeof args[0] === "string" ? "eth_blockByHash" : "eth_blockByNumber";
- };
-
- var transactionCall = function (args) {
- return typeof args[0] === "string" ? 'eth_transactionByHash' : 'eth_transactionByNumber';
- };
-
- var uncleCall = function (args) {
- return typeof args[0] === "string" ? 'eth_uncleByHash' : 'eth_uncleByNumber';
- };
-
- var methods = [
- { name: 'balanceAt', call: 'eth_balanceAt' },
- { name: 'stateAt', call: 'eth_stateAt' },
- { name: 'storageAt', call: 'eth_storageAt' },
- { name: 'countAt', call: 'eth_countAt'},
- { name: 'codeAt', call: 'eth_codeAt' },
- { name: 'transact', call: 'eth_transact' },
- { name: 'call', call: 'eth_call' },
- { name: 'block', call: blockCall },
- { name: 'transaction', call: transactionCall },
- { name: 'uncle', call: uncleCall },
- { name: 'compilers', call: 'eth_compilers' },
- { name: 'lll', call: 'eth_lll' },
- { name: 'solidity', call: 'eth_solidity' },
- { name: 'serpent', call: 'eth_serpent' },
- { name: 'logs', call: 'eth_logs' }
- ];
- return methods;
-};
-
-var ethProperties = function () {
- return [
- { name: 'coinbase', getter: 'eth_coinbase', setter: 'eth_setCoinbase' },
- { name: 'listening', getter: 'eth_listening', setter: 'eth_setListening' },
- { name: 'mining', getter: 'eth_mining', setter: 'eth_setMining' },
- { name: 'gasPrice', getter: 'eth_gasPrice' },
- { name: 'account', getter: 'eth_account' },
- { name: 'accounts', getter: 'eth_accounts' },
- { name: 'peerCount', getter: 'eth_peerCount' },
- { name: 'defaultBlock', getter: 'eth_defaultBlock', setter: 'eth_setDefaultBlock' },
- { name: 'number', getter: 'eth_number'}
- ];
-};
-
-var dbMethods = function () {
- return [
- { name: 'put', call: 'db_put' },
- { name: 'get', call: 'db_get' },
- { name: 'putString', call: 'db_putString' },
- { name: 'getString', call: 'db_getString' }
- ];
-};
-
-var shhMethods = function () {
- return [
- { name: 'post', call: 'shh_post' },
- { name: 'newIdentity', call: 'shh_newIdentity' },
- { name: 'haveIdentity', call: 'shh_haveIdentity' },
- { name: 'newGroup', call: 'shh_newGroup' },
- { name: 'addToGroup', call: 'shh_addToGroup' }
- ];
-};
-
-var ethWatchMethods = function () {
- var newFilter = function (args) {
- return typeof args[0] === 'string' ? 'eth_newFilterString' : 'eth_newFilter';
- };
-
- return [
- { name: 'newFilter', call: newFilter },
- { name: 'uninstallFilter', call: 'eth_uninstallFilter' },
- { name: 'getMessages', call: 'eth_filterLogs' }
- ];
-};
-
-var shhWatchMethods = function () {
- return [
- { name: 'newFilter', call: 'shh_newFilter' },
- { name: 'uninstallFilter', call: 'shh_uninstallFilter' },
- { name: 'getMessages', call: 'shh_getMessages' }
- ];
-};
-
-var setupMethods = function (obj, methods) {
- methods.forEach(function (method) {
- obj[method.name] = function () {
- return flattenPromise(Array.prototype.slice.call(arguments)).then(function (args) {
- var call = typeof method.call === "function" ? method.call(args) : method.call;
- return {call: call, args: args};
- }).then(function (request) {
- return new Promise(function (resolve, reject) {
- web3.provider.send(request, function (err, result) {
- if (!err) {
- resolve(result);
- return;
- }
- reject(err);
- });
- });
- }).catch(function(err) {
- console.error(err);
- });
- };
- });
-};
-
-var setupProperties = function (obj, properties) {
- properties.forEach(function (property) {
- var proto = {};
- proto.get = function () {
- return new Promise(function(resolve, reject) {
- web3.provider.send({call: property.getter}, function(err, result) {
- if (!err) {
- resolve(result);
- return;
- }
- reject(err);
- });
- });
- };
- if (property.setter) {
- proto.set = function (val) {
- return flattenPromise([val]).then(function (args) {
- return new Promise(function (resolve) {
- web3.provider.send({call: property.setter, args: args}, function (err, result) {
- if (!err) {
- resolve(result);
- return;
- }
- reject(err);
- });
- });
- }).catch(function (err) {
- console.error(err);
- });
- };
- }
- Object.defineProperty(obj, property.name, proto);
- });
-};
-
-// TODO: import from a dependency, don't duplicate.
-var hexToDec = function (hex) {
- return parseInt(hex, 16).toString();
-};
-
-var decToHex = function (dec) {
- return parseInt(dec).toString(16);
-};
-
-
-var web3 = {
- _callbacks: {},
- _events: {},
- providers: {},
-
- toHex: function(str) {
- var hex = "";
- for(var i = 0; i < str.length; i++) {
- var n = str.charCodeAt(i).toString(16);
- hex += n.length < 2 ? '0' + n : n;
- }
-
- return hex;
- },
-
- toAscii: function(hex) {
- // Find termination
- var str = "";
- var i = 0, l = hex.length;
- if (hex.substring(0, 2) === '0x')
- i = 2;
- for(; i < l; i+=2) {
- var code = hex.charCodeAt(i);
- if(code === 0) {
- break;
- }
-
- str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
- }
-
- return str;
- },
-
- fromAscii: function(str, pad) {
- pad = pad === undefined ? 32 : pad;
- var hex = this.toHex(str);
- while(hex.length < pad*2)
- hex += "00";
- return "0x" + hex;
- },
-
- toDecimal: function (val) {
- return hexToDec(val.substring(2));
- },
-
- fromDecimal: function (val) {
- return "0x" + decToHex(val);
- },
-
- toEth: function(str) {
- var val = typeof str === "string" ? str.indexOf('0x') === 0 ? parseInt(str.substr(2), 16) : parseInt(str) : str;
- var unit = 0;
- var units = [ 'wei', 'Kwei', 'Mwei', 'Gwei', 'szabo', 'finney', 'ether', 'grand', 'Mether', 'Gether', 'Tether', 'Pether', 'Eether', 'Zether', 'Yether', 'Nether', 'Dether', 'Vether', 'Uether' ];
- while (val > 3000 && unit < units.length - 1)
- {
- val /= 1000;
- unit++;
- }
- var s = val.toString().length < val.toFixed(2).length ? val.toString() : val.toFixed(2);
- var replaceFunction = function($0, $1, $2) {
- return $1 + ',' + $2;
- };
-
- while (true) {
- var o = s;
- s = s.replace(/(\d)(\d\d\d[\.\,])/, replaceFunction);
- if (o === s)
- break;
- }
- return s + ' ' + units[unit];
- },
-
- eth: {
- prototype: Object(), // jshint ignore:line
- watch: function (params) {
- return new Filter(params, ethWatch);
- }
- },
-
- db: {
- prototype: Object() // jshint ignore:line
- },
-
- shh: {
- prototype: Object(), // jshint ignore:line
- watch: function (params) {
- return new Filter(params, shhWatch);
- }
- },
-
- on: function(event, id, cb) {
- if(web3._events[event] === undefined) {
- web3._events[event] = {};
- }
-
- web3._events[event][id] = cb;
- return this;
- },
-
- off: function(event, id) {
- if(web3._events[event] !== undefined) {
- delete web3._events[event][id];
- }
-
- return this;
- },
-
- trigger: function(event, id, data) {
- var callbacks = web3._events[event];
- if (!callbacks || !callbacks[id]) {
- return;
- }
- var cb = callbacks[id];
- cb(data);
- }
-};
-
-setupMethods(web3, web3Methods());
-setupMethods(web3.eth, ethMethods());
-setupProperties(web3.eth, ethProperties());
-setupMethods(web3.db, dbMethods());
-setupMethods(web3.shh, shhMethods());
-
-var ethWatch = {
- changed: 'eth_changed'
-};
-setupMethods(ethWatch, ethWatchMethods());
-var shhWatch = {
- changed: 'shh_changed'
-};
-setupMethods(shhWatch, shhWatchMethods());
-
-var ProviderManager = function() {
- this.queued = [];
- this.polls = [];
- this.ready = false;
- this.provider = undefined;
- this.id = 1;
-
- var self = this;
- var poll = function () {
- if (self.provider && self.provider.poll) {
- self.polls.forEach(function (data) {
- data.data._id = self.id;
- self.id++;
- self.provider.poll(data.data, data.id);
- });
- }
- setTimeout(poll, 12000);
- };
- poll();
-};
-
-ProviderManager.prototype.send = function(data, cb) {
- data._id = this.id;
- if (cb) {
- web3._callbacks[data._id] = cb;
- }
-
- data.args = data.args || [];
- this.id++;
-
- if(this.provider !== undefined) {
- this.provider.send(data);
- } else {
- console.warn("provider is not set");
- this.queued.push(data);
- }
-};
-
-ProviderManager.prototype.set = function(provider) {
- if(this.provider !== undefined && this.provider.unload !== undefined) {
- this.provider.unload();
- }
-
- this.provider = provider;
- this.ready = true;
-};
-
-ProviderManager.prototype.sendQueued = function() {
- for(var i = 0; this.queued.length; i++) {
- // Resend
- this.send(this.queued[i]);
- }
-};
-
-ProviderManager.prototype.installed = function() {
- return this.provider !== undefined;
-};
-
-ProviderManager.prototype.startPolling = function (data, pollId) {
- if (!this.provider || !this.provider.poll) {
- return;
- }
- this.polls.push({data: data, id: pollId});
-};
-
-ProviderManager.prototype.stopPolling = function (pollId) {
- for (var i = this.polls.length; i--;) {
- var poll = this.polls[i];
- if (poll.id === pollId) {
- this.polls.splice(i, 1);
- }
- }
-};
-
-web3.provider = new ProviderManager();
-
-web3.setProvider = function(provider) {
- provider.onmessage = messageHandler;
- web3.provider.set(provider);
- web3.provider.sendQueued();
-};
-
-web3.haveProvider = function() {
- return !!web3.provider.provider;
-};
-
-var Filter = function(options, impl) {
- this.impl = impl;
- this.callbacks = [];
-
- var self = this;
- this.promise = impl.newFilter(options);
- this.promise.then(function (id) {
- self.id = id;
- web3.on(impl.changed, id, self.trigger.bind(self));
- web3.provider.startPolling({call: impl.changed, args: [id]}, id);
- });
-};
-
-Filter.prototype.arrived = function(callback) {
- this.changed(callback);
-};
-
-Filter.prototype.changed = function(callback) {
- var self = this;
- this.promise.then(function(id) {
- self.callbacks.push(callback);
- });
-};
-
-Filter.prototype.trigger = function(messages) {
- for(var i = 0; i < this.callbacks.length; i++) {
- this.callbacks[i].call(this, messages);
- }
-};
-
-Filter.prototype.uninstall = function() {
- var self = this;
- this.promise.then(function (id) {
- self.impl.uninstallFilter(id);
- web3.provider.stopPolling(id);
- web3.off(impl.changed, id);
- });
-};
-
-Filter.prototype.messages = function() {
- var self = this;
- return this.promise.then(function (id) {
- return self.impl.getMessages(id);
- });
-};
-
-Filter.prototype.logs = function () {
- return this.messages();
-};
-
-function messageHandler(data) {
- if(data._event !== undefined) {
- web3.trigger(data._event, data._id, data.data);
- return;
- }
-
- if(data._id) {
- var cb = web3._callbacks[data._id];
- if (cb) {
- cb.call(this, data.error, data.data);
- delete web3._callbacks[data._id];
- }
- }
-}
-
-if (typeof(module) !== "undefined")
- module.exports = web3;
diff --git a/cmd/mist/assets/ext/ethereum.js/lib/websocket.js b/cmd/mist/assets/ext/ethereum.js/lib/websocket.js
deleted file mode 100644
index 5b40075e4..000000000
--- a/cmd/mist/assets/ext/ethereum.js/lib/websocket.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- This file is part of ethereum.js.
-
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
-*/
-/** @file websocket.js
- * @authors:
- * Jeffrey Wilcke <jeff@ethdev.com>
- * Marek Kotewicz <marek@ethdev.com>
- * Marian Oancea <marian@ethdev.com>
- * @date 2014
- */
-
-// TODO: is these line is supposed to be here?
-if (process.env.NODE_ENV !== 'build') {
- var WebSocket = require('ws'); // jshint ignore:line
-}
-
-var WebSocketProvider = function(host) {
- // onmessage handlers
- this.handlers = [];
- // queue will be filled with messages if send is invoked before the ws is ready
- this.queued = [];
- this.ready = false;
-
- this.ws = new WebSocket(host);
-
- var self = this;
- this.ws.onmessage = function(event) {
- for(var i = 0; i < self.handlers.length; i++) {
- self.handlers[i].call(self, JSON.parse(event.data), event);
- }
- };
-
- this.ws.onopen = function() {
- self.ready = true;
-
- for(var i = 0; i < self.queued.length; i++) {
- // Resend
- self.send(self.queued[i]);
- }
- };
-};
-
-WebSocketProvider.prototype.send = function(payload) {
- if(this.ready) {
- var data = JSON.stringify(payload);
-
- this.ws.send(data);
- } else {
- this.queued.push(payload);
- }
-};
-
-WebSocketProvider.prototype.onMessage = function(handler) {
- this.handlers.push(handler);
-};
-
-WebSocketProvider.prototype.unload = function() {
- this.ws.close();
-};
-Object.defineProperty(WebSocketProvider.prototype, "onmessage", {
- set: function(provider) { this.onMessage(provider); }
-});
-
-if (typeof(module) !== "undefined")
- module.exports = WebSocketProvider;
diff --git a/cmd/mist/assets/ext/ethereum.js/package.json b/cmd/mist/assets/ext/ethereum.js/package.json
deleted file mode 100644
index 8f5ba2255..000000000
--- a/cmd/mist/assets/ext/ethereum.js/package.json
+++ /dev/null
@@ -1,67 +0,0 @@
-{
- "name": "ethereum.js",
- "namespace": "ethereum",
- "version": "0.0.6",
- "description": "Ethereum Compatible JavaScript API",
- "main": "./index.js",
- "directories": {
- "lib": "./lib"
- },
- "dependencies": {
- "es6-promise": "*",
- "ws": "*",
- "xmlhttprequest": "*"
- },
- "devDependencies": {
- "bower": ">=1.3.0",
- "browserify": ">=6.0",
- "del": ">=0.1.1",
- "envify": "^3.0.0",
- "exorcist": "^0.1.6",
- "gulp": ">=3.4.0",
- "gulp-jshint": ">=1.5.0",
- "gulp-rename": ">=1.2.0",
- "gulp-uglify": ">=1.0.0",
- "jshint": ">=2.5.0",
- "uglifyify": "^2.6.0",
- "unreachable-branch-transform": "^0.1.0",
- "vinyl-source-stream": "^1.0.0"
- },
- "scripts": {
- "build": "gulp",
- "watch": "gulp watch",
- "lint": "gulp lint"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/ethereum/ethereum.js.git"
- },
- "homepage": "https://github.com/ethereum/ethereum.js",
- "bugs": {
- "url": "https://github.com/ethereum/ethereum.js/issues"
- },
- "keywords": [
- "ethereum",
- "javascript",
- "API"
- ],
- "author": "ethdev.com",
- "authors": [
- {
- "name": "Jeffery Wilcke",
- "email": "jeff@ethdev.com",
- "url": "https://github.com/obscuren"
- },
- {
- "name": "Marek Kotewicz",
- "email": "marek@ethdev.com",
- "url": "https://github.com/debris"
- },
- {
- "name": "Marian Oancea",
- "email": "marian@ethdev.com",
- "url": "https://github.com/cubedro"
- }
- ],
- "license": "LGPL-3.0"
-}
diff --git a/cmd/mist/assets/ext/example/balance.html b/cmd/mist/assets/ext/example/balance.html
index 88f55315a..75c41dc8e 100644
--- a/cmd/mist/assets/ext/example/balance.html
+++ b/cmd/mist/assets/ext/example/balance.html
@@ -2,11 +2,13 @@
<html>
<head>
-<script type="text/javascript" src="js/bignumber.js/bignumber.min.js"></script>
+<script type="text/javascript" src="../bignumber.min.js"></script>
<script type="text/javascript" src="../dist/ethereum.js"></script>
<script type="text/javascript">
+console.log("hello world");
var web3 = require('web3');
+console.log(web3)
web3.setProvider(new web3.providers.HttpSyncProvider('http://localhost:8080'));
function watchBalance() {
@@ -25,6 +27,11 @@
});
}
+var request = new XMLHttpRequest();
+request.open('POST', "http://localhost:8080", false);
+request.send({});
+
+
</script>
</head>
<body>
diff --git a/cmd/mist/assets/qml/browser.qml b/cmd/mist/assets/qml/depricated_browser.qml
index 7056dbbf3..7056dbbf3 100644
--- a/cmd/mist/assets/qml/browser.qml
+++ b/cmd/mist/assets/qml/depricated_browser.qml
diff --git a/cmd/mist/assets/qml/main.qml b/cmd/mist/assets/qml/main.qml
index c6b524549..b8e56cd8b 100644
--- a/cmd/mist/assets/qml/main.qml
+++ b/cmd/mist/assets/qml/main.qml
@@ -16,22 +16,11 @@ ApplicationWindow {
width: 1200
height: 820
- minimumHeight: 300
+ minimumHeight: 800
+ minimumWidth: 600
title: "Mist"
- /*
- // This signal is used by the filter API. The filter API connects using this signal handler from
- // the different QML files and plugins.
- signal messages(var messages, int id);
- function invokeFilterCallback(data, receiverSeed) {
- //var messages = JSON.parse(data)
- // Signal handler
- messages(data, receiverSeed);
- root.browser.view.messages(data, receiverSeed);
- }
- */
-
TextField {
id: copyElementHax
visible: false
@@ -56,7 +45,8 @@ ApplicationWindow {
mainSplit.setView(wallet.view, wallet.menuItem);
- newBrowserTab("http://etherian.io");
+ console.log("starting browser")
+ newBrowserTab("http://etherian.io");
// Command setup
gui.sendCommand(0)
@@ -64,7 +54,7 @@ ApplicationWindow {
function activeView(view, menuItem) {
mainSplit.setView(view, menuItem)
- if (view.hideUrl) {
+ if (view.hideUrl) {
urlPane.visible = false;
mainView.anchors.top = rootView.top
} else {
@@ -118,12 +108,12 @@ ApplicationWindow {
}
}
- function newBrowserTab(url) {
- var window = addPlugin("./browser.qml", {noAdd: true, close: true, section: "apps", active: true});
- window.view.url = url;
- window.menuItem.title = "Browser Tab";
- activeView(window.view, window.menuItem);
- }
+ function newBrowserTab(url) {
+ var window = addPlugin("./views/browser.qml", {noAdd: true, close: true, section: "apps", active: true});
+ window.view.url = url;
+ window.menuItem.title = "Browser Tab";
+ activeView(window.view, window.menuItem);
+ }
menuBar: MenuBar {
Menu {
@@ -145,13 +135,13 @@ ApplicationWindow {
}
}
- MenuItem {
- text: "New tab"
- shortcut: "Ctrl+t"
- onTriggered: {
- newBrowserTab("http://etherian.io");
- }
- }
+ MenuItem {
+ text: "New tab"
+ shortcut: "Ctrl+t"
+ onTriggered: {
+ newBrowserTab("http://etherian.io");
+ }
+ }
MenuSeparator {}
@@ -501,15 +491,15 @@ ApplicationWindow {
this.view.destroy()
this.destroy()
- for (var i = 0; i < mainSplit.views.length; i++) {
- var view = mainSplit.views[i];
- if (view.menuItem === this) {
- mainSplit.views.splice(i, 1);
- break;
- }
- }
+ for (var i = 0; i < mainSplit.views.length; i++) {
+ var view = mainSplit.views[i];
+ if (view.menuItem === this) {
+ mainSplit.views.splice(i, 1);
+ break;
+ }
+ }
gui.removePlugin(this.path)
- activeView(mainSplit.views[0].view, mainSplit.views[0].menuItem);
+ activeView(mainSplit.views[0].view, mainSplit.views[0].menuItem);
}
}
}
@@ -650,7 +640,7 @@ ApplicationWindow {
Keys.onReturnPressed: {
if(/^https?/.test(this.text)) {
- newBrowserTab(this.text);
+ newBrowserTab(this.text);
} else {
addPlugin(this.text, {close: true, section: "apps"})
}
diff --git a/cmd/mist/assets/qml/views/browser.qml b/cmd/mist/assets/qml/views/browser.qml
new file mode 100644
index 000000000..0b70e0120
--- /dev/null
+++ b/cmd/mist/assets/qml/views/browser.qml
@@ -0,0 +1,208 @@
+import QtQuick 2.0
+import QtQuick.Controls 1.0;
+import QtQuick.Controls.Styles 1.0
+import QtQuick.Layouts 1.0;
+import QtWebEngine 1.0
+//import QtWebEngine.experimental 1.0
+import QtQuick.Window 2.0;
+
+Rectangle {
+ id: window
+ anchors.fill: parent
+ color: "#00000000"
+
+ property var title: "DApps"
+ property var iconSource: "../browser.png"
+ property var menuItem
+ property var hideUrl: true
+
+ property alias url: webview.url
+ property alias windowTitle: webview.title
+ property alias webView: webview
+
+ property var cleanPath: false
+ property var open: function(url) {
+ if(!window.cleanPath) {
+ var uri = url;
+ if(!/.*\:\/\/.*/.test(uri)) {
+ uri = "http://" + uri;
+ }
+
+ var reg = /(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.eth)(.*)/
+
+ if(reg.test(uri)) {
+ uri.replace(reg, function(match, pre, domain, path) {
+ uri = pre;
+
+ var lookup = eth.lookupDomain(domain.substring(0, domain.length - 4));
+ var ip = [];
+ for(var i = 0, l = lookup.length; i < l; i++) {
+ ip.push(lookup.charCodeAt(i))
+ }
+
+ if(ip.length != 0) {
+ uri += lookup;
+ } else {
+ uri += domain;
+ }
+
+ uri += path;
+ });
+ }
+
+ window.cleanPath = true;
+
+ webview.url = uri;
+
+ //uriNav.text = uri.text.replace(/(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.\w{2,3})(.*)/, "$1$2<span style='color:#CCC'>$3</span>");
+ uriNav.text = uri;
+ } else {
+ // Prevent inf loop.
+ window.cleanPath = false;
+ }
+ }
+
+ Component.onCompleted: {
+ }
+
+ Item {
+ objectName: "root"
+ id: root
+ anchors.fill: parent
+ state: "inspectorShown"
+
+ RowLayout {
+ id: navBar
+ height: 40
+ anchors {
+ left: parent.left
+ right: parent.right
+ leftMargin: 7
+ }
+
+ Button {
+ id: back
+ onClicked: {
+ webview.goBack()
+ }
+ style: ButtonStyle {
+ background: Image {
+ source: "../../back.png"
+ width: 30
+ height: 30
+ }
+ }
+ }
+
+ TextField {
+ anchors {
+ left: back.right
+ right: toggleInspector.left
+ leftMargin: 10
+ rightMargin: 10
+ }
+ text: webview.url;
+ id: uriNav
+ y: parent.height / 2 - this.height / 2
+
+ Keys.onReturnPressed: {
+ webview.url = this.text;
+ }
+ }
+
+ Button {
+ id: toggleInspector
+ anchors {
+ right: parent.right
+ }
+ iconSource: "../../bug.png"
+ onClicked: {
+ // XXX soon
+ return
+ if(inspector.visible == true){
+ inspector.visible = false
+ }else{
+ inspector.visible = true
+ inspector.url = webview.experimental.remoteInspectorUrl
+ }
+ }
+ }
+ }
+
+ // Border
+ Rectangle {
+ id: divider
+ anchors {
+ left: parent.left
+ right: parent.right
+ top: navBar.bottom
+ }
+ z: -1
+ height: 1
+ color: "#CCCCCC"
+ }
+
+ WebEngineView {
+ objectName: "webView"
+ id: webview
+ anchors {
+ left: parent.left
+ right: parent.right
+ bottom: parent.bottom
+ top: divider.bottom
+ }
+
+ onLoadingChanged: {
+ if (loadRequest.status == WebEngineView.LoadSucceededStatus) {
+ webview.runJavaScript(eth.readFile("bignumber.min.js"));
+ webview.runJavaScript(eth.readFile("dist/ethereum.js"));
+ }
+ }
+ onJavaScriptConsoleMessage: {
+ console.log(sourceID + ":" + lineNumber + ":" + JSON.stringify(message));
+ }
+ }
+
+ Rectangle {
+ id: sizeGrip
+ color: "gray"
+ visible: false
+ height: 10
+ anchors {
+ left: root.left
+ right: root.right
+ }
+ y: Math.round(root.height * 2 / 3)
+
+ MouseArea {
+ anchors.fill: parent
+ drag.target: sizeGrip
+ drag.minimumY: 0
+ drag.maximumY: root.height
+ drag.axis: Drag.YAxis
+ }
+ }
+
+ WebEngineView {
+ id: inspector
+ visible: false
+ anchors {
+ left: root.left
+ right: root.right
+ top: sizeGrip.bottom
+ bottom: root.bottom
+ }
+
+ }
+
+ states: [
+ State {
+ name: "inspectorShown"
+ PropertyChanges {
+ target: inspector
+ }
+ }
+ ]
+ }
+}
+
diff --git a/cmd/mist/assets/qml/views/info.qml b/cmd/mist/assets/qml/views/info.qml
index 3ff551b05..f694f1e7a 100644
--- a/cmd/mist/assets/qml/views/info.qml
+++ b/cmd/mist/assets/qml/views/info.qml
@@ -28,7 +28,7 @@ Rectangle {
text: "Address"
}
TextField {
- text: eth.key().address
+ text: ""//eth.key().address
width: 500
}
diff --git a/cmd/mist/assets/qml/views/wallet.qml b/cmd/mist/assets/qml/views/wallet.qml
index b81273a17..d6160740d 100644
--- a/cmd/mist/assets/qml/views/wallet.qml
+++ b/cmd/mist/assets/qml/views/wallet.qml
@@ -22,7 +22,8 @@ Rectangle {
function setBalance() {
//balance.text = "<b>Balance</b>: " + eth.numberToHuman(eth.balanceAt(eth.key().address))
if(menuItem)
- menuItem.secondaryTitle = eth.numberToHuman(eth.balanceAt(eth.key().address))
+ menuItem.secondaryTitle = eth.numberToHuman("0")
+ //menuItem.secondaryTitle = eth.numberToHuman(eth.balanceAt(eth.key().address))
}
ListModel {
@@ -130,7 +131,7 @@ Rectangle {
onClicked: {
var value = txValue.text + denomModel.get(valueDenom.currentIndex).zeros;
var gasPrice = "10000000000000"
- var res = eth.transact({from: eth.key().privateKey, to: txTo.text, value: value, gas: "500", gasPrice: gasPrice})
+ //var res = eth.transact({from: eth.key().privateKey, to: txTo.text, value: value, gas: "500", gasPrice: gasPrice})
}
}
}
@@ -155,17 +156,10 @@ Rectangle {
model: ListModel {
id: txModel
Component.onCompleted: {
- var me = eth.key().address;
- var filterTo = ethx.watch({latest: -1, to: me});
- var filterFrom = ethx.watch({latest: -1, from: me});
- filterTo.changed(addTxs)
- filterFrom.changed(addTxs)
-
- addTxs(filterTo.messages())
- addTxs(filterFrom.messages())
}
function addTxs(messages) {
+ /*
setBalance()
for(var i = 0; i < messages.length; i++) {
@@ -179,6 +173,7 @@ Rectangle {
}
txModel.insert(0, {num: txModel.count, from: from, to: to, value: eth.numberToHuman(message.value)})
}
+ */
}
}
}
diff --git a/cmd/mist/bindings.go b/cmd/mist/bindings.go
index f6d1c40da..706c789b1 100644
--- a/cmd/mist/bindings.go
+++ b/cmd/mist/bindings.go
@@ -61,7 +61,7 @@ func (gui *Gui) Transact(recipient, value, gas, gasPrice, d string) (string, err
data = ethutil.Bytes2Hex(utils.FormatTransactionData(d))
}
- return gui.xeth.Transact(gui.privateKey(), recipient, value, gas, gasPrice, data)
+ return gui.xeth.Transact(recipient, value, gas, gasPrice, data)
}
func (gui *Gui) SetCustomIdentifier(customIdentifier string) {
diff --git a/cmd/mist/debugger.go b/cmd/mist/debugger.go
index 58d8da7b2..dc6a39560 100644
--- a/cmd/mist/debugger.go
+++ b/cmd/mist/debugger.go
@@ -32,7 +32,7 @@ import (
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/vm"
- "gopkg.in/qml.v1"
+ "github.com/obscuren/qml"
)
type DebuggerWindow struct {
diff --git a/cmd/mist/errors.go b/cmd/mist/errors.go
index 26a172ce9..255ed07c1 100644
--- a/cmd/mist/errors.go
+++ b/cmd/mist/errors.go
@@ -24,7 +24,7 @@ import (
"fmt"
"os"
- "gopkg.in/qml.v1"
+ "github.com/obscuren/qml"
)
func ErrorWindow(err error) {
diff --git a/cmd/mist/ext_app.go b/cmd/mist/ext_app.go
index 012c94923..20ec52e60 100644
--- a/cmd/mist/ext_app.go
+++ b/cmd/mist/ext_app.go
@@ -21,16 +21,13 @@
package main
import (
- "encoding/json"
-
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/event"
- "github.com/ethereum/go-ethereum/javascript"
"github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/ui/qt"
"github.com/ethereum/go-ethereum/xeth"
- "gopkg.in/qml.v1"
+ "github.com/obscuren/qml"
)
type AppContainer interface {
@@ -47,7 +44,7 @@ type AppContainer interface {
}
type ExtApplication struct {
- *xeth.JSXEth
+ *xeth.XEth
eth core.EthManager
events event.Subscription
@@ -61,7 +58,7 @@ type ExtApplication struct {
func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication {
return &ExtApplication{
- JSXEth: xeth.NewJSXEth(lib.eth),
+ XEth: xeth.New(lib.eth),
eth: lib.eth,
watcherQuitChan: make(chan bool),
filters: make(map[string]*core.Filter),
@@ -113,13 +110,15 @@ func (app *ExtApplication) mainLoop() {
case core.NewBlockEvent:
app.container.NewBlock(ev.Block)
- case state.Messages:
- for id, filter := range app.filters {
- msgs := filter.FilterMessages(ev)
- if len(msgs) > 0 {
- app.container.Messages(msgs, id)
+ /* TODO remove
+ case state.Messages:
+ for id, filter := range app.filters {
+ msgs := filter.FilterMessages(ev)
+ if len(msgs) > 0 {
+ app.container.Messages(msgs, id)
+ }
}
- }
+ */
}
}
}
@@ -129,6 +128,7 @@ func (self *ExtApplication) Watch(filterOptions map[string]interface{}, identifi
}
func (self *ExtApplication) GetMessages(object map[string]interface{}) string {
+ /* TODO remove me
filter := qt.NewFilterFromMap(object, self.eth)
messages := filter.Find()
@@ -143,4 +143,6 @@ func (self *ExtApplication) GetMessages(object map[string]interface{}) string {
}
return string(b)
+ */
+ return ""
}
diff --git a/cmd/mist/flags.go b/cmd/mist/flags.go
index 8a67cdd0a..f530394c2 100644
--- a/cmd/mist/flags.go
+++ b/cmd/mist/flags.go
@@ -43,6 +43,7 @@ var (
StartRpc bool
StartWebSockets bool
RpcPort int
+ WsPort int
UseUPnP bool
NatType string
OutboundPort string
@@ -111,6 +112,7 @@ func Init() {
flag.BoolVar(&UseUPnP, "upnp", true, "enable UPnP support")
flag.IntVar(&MaxPeer, "maxpeer", 30, "maximum desired peers")
flag.IntVar(&RpcPort, "rpcport", 8080, "port to start json-rpc server on")
+ flag.IntVar(&WsPort, "wsport", 40404, "port to start websocket rpc server on")
flag.BoolVar(&StartRpc, "rpc", false, "start rpc server")
flag.BoolVar(&StartWebSockets, "ws", false, "start websocket server")
flag.BoolVar(&NonInteractive, "y", false, "non-interactive mode (say yes to confirmations)")
diff --git a/cmd/mist/gui.go b/cmd/mist/gui.go
index fd2ad5a11..edc799abc 100644
--- a/cmd/mist/gui.go
+++ b/cmd/mist/gui.go
@@ -32,7 +32,6 @@ import (
"path"
"runtime"
"strconv"
- "strings"
"time"
"github.com/ethereum/go-ethereum/core"
@@ -45,7 +44,7 @@ import (
"github.com/ethereum/go-ethereum/p2p"
"github.com/ethereum/go-ethereum/ui/qt/qwhisper"
"github.com/ethereum/go-ethereum/xeth"
- "gopkg.in/qml.v1"
+ "github.com/obscuren/qml"
)
var guilogger = logger.NewLogger("GUI")
@@ -76,7 +75,7 @@ type Gui struct {
logLevel logger.LogLevel
open bool
- xeth *xeth.JSXEth
+ xeth *xeth.XEth
Session string
clientIdentity *p2p.SimpleClientIdentity
@@ -94,7 +93,7 @@ func NewWindow(ethereum *eth.Ethereum, config *ethutil.ConfigManager, clientIden
panic(err)
}
- xeth := xeth.NewJSXEth(ethereum)
+ xeth := xeth.New(ethereum)
gui := &Gui{eth: ethereum,
txDb: db,
xeth: xeth,
@@ -121,9 +120,9 @@ func (gui *Gui) Start(assetPath string) {
// Register ethereum functions
qml.RegisterTypes("Ethereum", 1, 0, []qml.TypeSpec{{
- Init: func(p *xeth.JSBlock, obj qml.Object) { p.Number = 0; p.Hash = "" },
+ Init: func(p *xeth.Block, obj qml.Object) { p.Number = 0; p.Hash = "" },
}, {
- Init: func(p *xeth.JSTransaction, obj qml.Object) { p.Value = ""; p.Hash = ""; p.Address = "" },
+ Init: func(p *xeth.Transaction, obj qml.Object) { p.Value = ""; p.Hash = ""; p.Address = "" },
}, {
Init: func(p *xeth.KeyVal, obj qml.Object) { p.Key = ""; p.Value = "" },
}})
@@ -229,41 +228,44 @@ func (gui *Gui) setInitialChain(ancientBlocks bool) {
}
func (gui *Gui) loadAddressBook() {
- view := gui.getObjectByName("infoView")
- nameReg := gui.xeth.World().Config().Get("NameReg")
- if nameReg != nil {
- it := nameReg.Trie().Iterator()
- for it.Next() {
- if it.Key[0] != 0 {
- view.Call("addAddress", struct{ Name, Address string }{string(it.Key), ethutil.Bytes2Hex(it.Value)})
- }
+ /*
+ view := gui.getObjectByName("infoView")
+ nameReg := gui.xeth.World().Config().Get("NameReg")
+ if nameReg != nil {
+ it := nameReg.Trie().Iterator()
+ for it.Next() {
+ if it.Key[0] != 0 {
+ view.Call("addAddress", struct{ Name, Address string }{string(it.Key), ethutil.Bytes2Hex(it.Value)})
+ }
+ }
}
- }
+ */
}
func (self *Gui) loadMergedMiningOptions() {
- view := self.getObjectByName("mergedMiningModel")
-
- mergeMining := self.xeth.World().Config().Get("MergeMining")
- if mergeMining != nil {
- i := 0
- it := mergeMining.Trie().Iterator()
- for it.Next() {
- view.Call("addMergedMiningOption", struct {
- Checked bool
- Name, Address string
- Id, ItemId int
- }{false, string(it.Key), ethutil.Bytes2Hex(it.Value), 0, i})
-
- i++
+ /*
+ view := self.getObjectByName("mergedMiningModel")
+
+ mergeMining := self.xeth.World().Config().Get("MergeMining")
+ if mergeMining != nil {
+ i := 0
+ it := mergeMining.Trie().Iterator()
+ for it.Next() {
+ view.Call("addMergedMiningOption", struct {
+ Checked bool
+ Name, Address string
+ Id, ItemId int
+ }{false, string(it.Key), ethutil.Bytes2Hex(it.Value), 0, i})
+
+ i++
+ }
}
- }
+ */
}
func (gui *Gui) insertTransaction(window string, tx *types.Transaction) {
- nameReg := gui.xeth.World().Config().Get("NameReg")
addr := gui.address()
var inout string
@@ -274,32 +276,12 @@ func (gui *Gui) insertTransaction(window string, tx *types.Transaction) {
}
var (
- ptx = xeth.NewJSTx(tx)
- send = nameReg.Storage(tx.From())
- rec = nameReg.Storage(tx.To())
- s, r string
+ ptx = xeth.NewTx(tx)
+ send = ethutil.Bytes2Hex(tx.From())
+ rec = ethutil.Bytes2Hex(tx.To())
)
-
- if core.MessageCreatesContract(tx) {
- rec = nameReg.Storage(core.AddressFromMessage(tx))
- }
-
- if send.Len() != 0 {
- s = strings.Trim(send.Str(), "\x00")
- } else {
- s = ethutil.Bytes2Hex(tx.From())
- }
- if rec.Len() != 0 {
- r = strings.Trim(rec.Str(), "\x00")
- } else {
- if core.MessageCreatesContract(tx) {
- r = ethutil.Bytes2Hex(core.AddressFromMessage(tx))
- } else {
- r = ethutil.Bytes2Hex(tx.To())
- }
- }
- ptx.Sender = s
- ptx.Address = r
+ ptx.Sender = send
+ ptx.Address = rec
if window == "post" {
//gui.getObjectByName("transactionView").Call("addTx", ptx, inout)
@@ -320,8 +302,8 @@ func (gui *Gui) readPreviousTransactions() {
}
func (gui *Gui) processBlock(block *types.Block, initial bool) {
- name := strings.Trim(gui.xeth.World().Config().Get("NameReg").Storage(block.Coinbase()).Str(), "\x00")
- b := xeth.NewJSBlock(block)
+ name := ethutil.Bytes2Hex(block.Coinbase())
+ b := xeth.NewBlock(block)
b.Name = name
gui.getObjectByName("chainView").Call("addBlock", b, initial)
@@ -398,14 +380,6 @@ func (gui *Gui) setup() {
gui.setPeerInfo()
}()
- // Inject javascript files each time navigation is requested.
- // Unfortunately webview.experimental.userScripts injects _after_
- // the page has loaded which kind of renders it useless...
- //jsfiles := loadJavascriptAssets(gui)
- gui.getObjectByName("webView").On("navigationRequested", func() {
- //gui.getObjectByName("webView").Call("injectJs", jsfiles)
- })
-
gui.whisper.SetView(gui.getObjectByName("whisperView"))
gui.SendCommand(update)
@@ -531,9 +505,9 @@ NumGC: %d
func (gui *Gui) setPeerInfo() {
gui.win.Root().Call("setPeers", fmt.Sprintf("%d / %d", gui.eth.PeerCount(), gui.eth.MaxPeers))
gui.win.Root().Call("resetPeers")
- for _, peer := range gui.xeth.Peers() {
- gui.win.Root().Call("addPeer", peer)
- }
+ //for _, peer := range gui.xeth.Peers() {
+ //gui.win.Root().Call("addPeer", peer)
+ //}
}
func (gui *Gui) privateKey() string {
diff --git a/cmd/mist/html_container.go b/cmd/mist/html_container.go
index f2ba6fbe2..0909a6abd 100644
--- a/cmd/mist/html_container.go
+++ b/cmd/mist/html_container.go
@@ -21,7 +21,6 @@
package main
import (
- "encoding/json"
"errors"
"fmt"
"io/ioutil"
@@ -32,11 +31,10 @@ import (
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethutil"
- "github.com/ethereum/go-ethereum/javascript"
"github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/xeth"
"github.com/howeyc/fsnotify"
- "gopkg.in/qml.v1"
+ "github.com/obscuren/qml"
)
type HtmlApplication struct {
@@ -142,11 +140,12 @@ func (app *HtmlApplication) Window() *qml.Window {
}
func (app *HtmlApplication) NewBlock(block *types.Block) {
- b := &xeth.JSBlock{Number: int(block.NumberU64()), Hash: ethutil.Bytes2Hex(block.Hash())}
+ b := &xeth.Block{Number: int(block.NumberU64()), Hash: ethutil.Bytes2Hex(block.Hash())}
app.webView.Call("onNewBlockCb", b)
}
func (self *HtmlApplication) Messages(messages state.Messages, id string) {
+ /* TODO remove me
var msgs []javascript.JSMessage
for _, m := range messages {
msgs = append(msgs, javascript.NewJSMessage(m))
@@ -155,6 +154,7 @@ func (self *HtmlApplication) Messages(messages state.Messages, id string) {
b, _ := json.Marshal(msgs)
self.webView.Call("onWatchedCb", string(b), id)
+ */
}
func (app *HtmlApplication) Destroy() {
diff --git a/cmd/mist/main.go b/cmd/mist/main.go
index eb0a80add..ea984a4b5 100644
--- a/cmd/mist/main.go
+++ b/cmd/mist/main.go
@@ -30,7 +30,8 @@ import (
"github.com/ethereum/go-ethereum/eth"
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/p2p"
- "gopkg.in/qml.v1"
+ "github.com/ethereum/go-ethereum/ui/qt/webengine"
+ "github.com/obscuren/qml"
)
const (
@@ -42,6 +43,8 @@ var ethereum *eth.Ethereum
var mainlogger = logger.NewLogger("MAIN")
func run() error {
+ webengine.Initialize()
+
// precedence: code-internal flag default < config file < environment variables < command line
Init() // parsing command line
@@ -73,7 +76,7 @@ func run() error {
}
if StartWebSockets {
- utils.StartWebSockets(ethereum)
+ utils.StartWebSockets(ethereum, WsPort)
}
gui := NewWindow(ethereum, config, ethereum.ClientIdentity().(*p2p.SimpleClientIdentity), KeyRing, LogLevel)
diff --git a/cmd/mist/qml_container.go b/cmd/mist/qml_container.go
index 7f5d97bec..9d76d8fe4 100644
--- a/cmd/mist/qml_container.go
+++ b/cmd/mist/qml_container.go
@@ -29,7 +29,7 @@ import (
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/xeth"
- "gopkg.in/qml.v1"
+ "github.com/obscuren/qml"
)
type QmlApplication struct {
@@ -70,7 +70,7 @@ func (app *QmlApplication) NewWatcher(quitChan chan bool) {
// Events
func (app *QmlApplication) NewBlock(block *types.Block) {
- pblock := &xeth.JSBlock{Number: int(block.NumberU64()), Hash: ethutil.Bytes2Hex(block.Hash())}
+ pblock := &xeth.Block{Number: int(block.NumberU64()), Hash: ethutil.Bytes2Hex(block.Hash())}
app.win.Call("onNewBlockCb", pblock)
}
diff --git a/cmd/mist/ui_lib.go b/cmd/mist/ui_lib.go
index e0321f6dd..5e141bdaf 100644
--- a/cmd/mist/ui_lib.go
+++ b/cmd/mist/ui_lib.go
@@ -21,24 +21,18 @@
package main
import (
- "bytes"
"fmt"
+ "io/ioutil"
"path"
- "strconv"
- "strings"
- "github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/eth"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/event/filter"
"github.com/ethereum/go-ethereum/javascript"
"github.com/ethereum/go-ethereum/miner"
- "github.com/ethereum/go-ethereum/state"
- "github.com/ethereum/go-ethereum/ui/qt"
"github.com/ethereum/go-ethereum/xeth"
- "gopkg.in/qml.v1"
+ "github.com/obscuren/qml"
)
type memAddr struct {
@@ -48,7 +42,7 @@ type memAddr struct {
// UI Library that has some basic functionality exposed
type UiLib struct {
- *xeth.JSXEth
+ *xeth.XEth
engine *qml.Engine
eth *eth.Ethereum
connected bool
@@ -67,7 +61,7 @@ type UiLib struct {
}
func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib {
- lib := &UiLib{JSXEth: xeth.NewJSXEth(eth), engine: engine, eth: eth, assetPath: assetPath, jsEngine: javascript.NewJSRE(eth), filterCallbacks: make(map[int][]int)} //, filters: make(map[int]*xeth.JSFilter)}
+ lib := &UiLib{XEth: xeth.New(eth), engine: engine, eth: eth, assetPath: assetPath, jsEngine: javascript.NewJSRE(eth), filterCallbacks: make(map[int][]int)} //, filters: make(map[int]*xeth.JSFilter)}
lib.miner = miner.New(eth.KeyManager().Address(), eth)
lib.filterManager = filter.NewFilterManager(eth.EventMux())
go lib.filterManager.Start()
@@ -79,56 +73,6 @@ func (self *UiLib) Notef(args []interface{}) {
guilogger.Infoln(args...)
}
-func (self *UiLib) LookupDomain(domain string) string {
- world := self.World()
-
- if len(domain) > 32 {
- domain = string(crypto.Sha3([]byte(domain)))
- }
- data := world.Config().Get("DnsReg").StorageString(domain).Bytes()
-
- // Left padded = A record, Right padded = CNAME
- if len(data) > 0 && data[0] == 0 {
- data = bytes.TrimLeft(data, "\x00")
- var ipSlice []string
- for _, d := range data {
- ipSlice = append(ipSlice, strconv.Itoa(int(d)))
- }
-
- return strings.Join(ipSlice, ".")
- } else {
- data = bytes.TrimRight(data, "\x00")
-
- return string(data)
- }
-}
-
-func (self *UiLib) LookupName(addr string) string {
- var (
- nameReg = self.World().Config().Get("NameReg")
- lookup = nameReg.Storage(ethutil.Hex2Bytes(addr))
- )
-
- if lookup.Len() != 0 {
- return strings.Trim(lookup.Str(), "\x00")
- }
-
- return addr
-}
-
-func (self *UiLib) LookupAddress(name string) string {
- var (
- nameReg = self.World().Config().Get("NameReg")
- lookup = nameReg.Storage(ethutil.RightPadBytes([]byte(name), 32))
- )
-
- if lookup.Len() != 0 {
- return ethutil.Bytes2Hex(lookup.Bytes())
- }
-
- return ""
-}
-
func (self *UiLib) PastPeers() *ethutil.List {
return ethutil.NewList([]string{})
//return ethutil.NewList(eth.PastPeers())
@@ -234,8 +178,7 @@ func (self *UiLib) StartDebugger() {
func (self *UiLib) Transact(params map[string]interface{}) (string, error) {
object := mapToTxParams(params)
- return self.JSXEth.Transact(
- object["from"],
+ return self.XEth.Transact(
object["to"],
object["value"],
object["gas"],
@@ -256,7 +199,7 @@ func (self *UiLib) Compile(code string) (string, error) {
func (self *UiLib) Call(params map[string]interface{}) (string, error) {
object := mapToTxParams(params)
- return self.JSXEth.Execute(
+ return self.XEth.Execute(
object["to"],
object["value"],
object["gas"],
@@ -313,34 +256,50 @@ func (self *UiLib) ToAscii(data string) string {
/// Ethereum filter methods
func (self *UiLib) NewFilter(object map[string]interface{}, view *qml.Common) (id int) {
+ /* TODO remove me
filter := qt.NewFilterFromMap(object, self.eth)
filter.MessageCallback = func(messages state.Messages) {
- view.Call("messages", xeth.ToJSMessages(messages), id)
+ view.Call("messages", xeth.ToMessages(messages), id)
}
id = self.filterManager.InstallFilter(filter)
return id
+ */
+ return 0
}
func (self *UiLib) NewFilterString(typ string, view *qml.Common) (id int) {
+ /* TODO remove me
filter := core.NewFilter(self.eth)
filter.BlockCallback = func(block *types.Block) {
view.Call("messages", "{}", id)
}
id = self.filterManager.InstallFilter(filter)
return id
+ */
+ return 0
}
func (self *UiLib) Messages(id int) *ethutil.List {
+ /* TODO remove me
filter := self.filterManager.GetFilter(id)
if filter != nil {
- messages := xeth.ToJSMessages(filter.Find())
+ messages := xeth.ToMessages(filter.Find())
return messages
}
+ */
return ethutil.EmptyList()
}
+func (self *UiLib) ReadFile(p string) string {
+ content, err := ioutil.ReadFile(self.AssetPath(path.Join("ext", p)))
+ if err != nil {
+ guilogger.Infoln("error reading file", p, ":", err)
+ }
+ return string(content)
+}
+
func (self *UiLib) UninstallFilter(id int) {
self.filterManager.UninstallFilter(id)
}
diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go
index a57d3266f..1d4655433 100644
--- a/cmd/utils/cmd.go
+++ b/cmd/utils/cmd.go
@@ -38,8 +38,10 @@ import (
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/miner"
"github.com/ethereum/go-ethereum/rlp"
- "github.com/ethereum/go-ethereum/rpc"
+ rpchttp "github.com/ethereum/go-ethereum/rpc/http"
+ rpcws "github.com/ethereum/go-ethereum/rpc/ws"
"github.com/ethereum/go-ethereum/state"
+ // "github.com/ethereum/go-ethereum/websocket"
"github.com/ethereum/go-ethereum/xeth"
)
@@ -192,7 +194,7 @@ func KeyTasks(keyManager *crypto.KeyManager, KeyRing string, GenAddr bool, Secre
func StartRpc(ethereum *eth.Ethereum, RpcPort int) {
var err error
- ethereum.RpcServer, err = rpc.NewJsonRpcServer(xeth.NewJSXEth(ethereum), RpcPort)
+ ethereum.RpcServer, err = rpchttp.NewRpcHttpServer(xeth.New(ethereum), RpcPort)
if err != nil {
clilogger.Errorf("Could not start RPC interface (port %v): %v", RpcPort, err)
} else {
@@ -200,6 +202,20 @@ func StartRpc(ethereum *eth.Ethereum, RpcPort int) {
}
}
+func StartWebSockets(eth *eth.Ethereum, wsPort int) {
+ clilogger.Infoln("Starting WebSockets")
+
+ // sock := websocket.NewWebSocketServer(eth)
+ // go sock.Serv()
+ var err error
+ eth.WsServer, err = rpcws.NewWebSocketServer(eth, wsPort)
+ if err != nil {
+ clilogger.Errorf("Could not start RPC interface (port %v): %v", wsPort, err)
+ } else {
+ go eth.WsServer.Start()
+ }
+}
+
var gminer *miner.Miner
func GetMiner() *miner.Miner {
diff --git a/core/block_processor.go b/core/block_processor.go
index 37acc4f72..2dcaa37c2 100644
--- a/core/block_processor.go
+++ b/core/block_processor.go
@@ -330,3 +330,24 @@ func (sm *BlockProcessor) GetMessages(block *types.Block) (messages []*state.Mes
return state.Manifest().Messages, nil
}
+
+func (sm *BlockProcessor) GetLogs(block *types.Block) (logs state.Logs, err error) {
+ if !sm.bc.HasBlock(block.Header().ParentHash) {
+ return nil, ParentError(block.Header().ParentHash)
+ }
+
+ sm.lastAttemptedBlock = block
+
+ var (
+ parent = sm.bc.GetBlock(block.Header().ParentHash)
+ //state = state.New(parent.Trie().Copy())
+ state = state.New(parent.Root(), sm.db)
+ )
+
+ defer state.Reset()
+
+ sm.TransitionState(state, parent, block)
+ sm.AccumelateRewards(state, block, parent)
+
+ return state.Logs(), nil
+}
diff --git a/core/filter.go b/core/filter.go
index 29be8841c..efdd819ed 100644
--- a/core/filter.go
+++ b/core/filter.go
@@ -3,10 +3,8 @@ package core
import (
"bytes"
"math"
- "math/big"
"github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/state"
)
@@ -20,13 +18,12 @@ type Filter struct {
earliest int64
latest int64
skip int
- from, to [][]byte
+ address []byte
max int
+ topics [][]byte
- Altered []AccountChange
-
- BlockCallback func(*types.Block)
- MessageCallback func(state.Messages)
+ BlockCallback func(*types.Block)
+ LogsCallback func(state.Logs)
}
// Create a new filter which uses a bloom filter on blocks to figure out whether a particular block
@@ -35,10 +32,6 @@ func NewFilter(eth EthManager) *Filter {
return &Filter{eth: eth}
}
-func (self *Filter) AddAltered(address, stateAddress []byte) {
- self.Altered = append(self.Altered, AccountChange{address, stateAddress})
-}
-
// Set the earliest and latest block for filtering.
// -1 = latest block (i.e., the current block)
// hash = particular hash from-to
@@ -50,20 +43,12 @@ func (self *Filter) SetLatestBlock(latest int64) {
self.latest = latest
}
-func (self *Filter) SetFrom(addr [][]byte) {
- self.from = addr
-}
-
-func (self *Filter) AddFrom(addr []byte) {
- self.from = append(self.from, addr)
-}
-
-func (self *Filter) SetTo(addr [][]byte) {
- self.to = addr
+func (self *Filter) SetAddress(addr []byte) {
+ self.address = addr
}
-func (self *Filter) AddTo(addr []byte) {
- self.to = append(self.to, addr)
+func (self *Filter) SetTopics(topics [][]byte) {
+ self.topics = topics
}
func (self *Filter) SetMax(max int) {
@@ -74,8 +59,8 @@ func (self *Filter) SetSkip(skip int) {
self.skip = skip
}
-// Run filters messages with the current parameters set
-func (self *Filter) Find() []*state.Message {
+// Run filters logs with the current parameters set
+func (self *Filter) Find() state.Logs {
earliestBlock := self.eth.ChainManager().CurrentBlock()
var earliestBlockNo uint64 = uint64(self.earliest)
if self.earliest == -1 {
@@ -87,39 +72,39 @@ func (self *Filter) Find() []*state.Message {
}
var (
- messages []*state.Message
- block = self.eth.ChainManager().GetBlockByNumber(latestBlockNo)
- quit bool
+ logs state.Logs
+ block = self.eth.ChainManager().GetBlockByNumber(latestBlockNo)
+ quit bool
)
for i := 0; !quit && block != nil; i++ {
// Quit on latest
switch {
case block.NumberU64() == earliestBlockNo, block.NumberU64() == 0:
quit = true
- case self.max <= len(messages):
+ case self.max <= len(logs):
break
}
// Use bloom filtering to see if this block is interesting given the
// current parameters
if self.bloomFilter(block) {
- // Get the messages of the block
- msgs, err := self.eth.BlockProcessor().GetMessages(block)
+ // Get the logs of the block
+ logs, err := self.eth.BlockProcessor().GetLogs(block)
if err != nil {
- chainlogger.Warnln("err: filter get messages ", err)
+ chainlogger.Warnln("err: filter get logs ", err)
break
}
- messages = append(messages, self.FilterMessages(msgs)...)
+ logs = append(logs, self.FilterLogs(logs)...)
}
block = self.eth.ChainManager().GetBlock(block.ParentHash())
}
- skip := int(math.Min(float64(len(messages)), float64(self.skip)))
+ skip := int(math.Min(float64(len(logs)), float64(self.skip)))
- return messages[skip:]
+ return logs[skip:]
}
func includes(addresses [][]byte, a []byte) (found bool) {
@@ -132,70 +117,37 @@ func includes(addresses [][]byte, a []byte) (found bool) {
return
}
-func (self *Filter) FilterMessages(msgs []*state.Message) []*state.Message {
- var messages []*state.Message
+func (self *Filter) FilterLogs(logs state.Logs) state.Logs {
+ var ret state.Logs
- // Filter the messages for interesting stuff
- for _, message := range msgs {
- if len(self.to) > 0 && !includes(self.to, message.To) {
+ // Filter the logs for interesting stuff
+ for _, log := range logs {
+ if len(self.address) > 0 && !bytes.Equal(self.address, log.Address()) {
continue
}
- if len(self.from) > 0 && !includes(self.from, message.From) {
- continue
- }
-
- var match bool
- if len(self.Altered) == 0 {
- match = true
- }
-
- for _, accountChange := range self.Altered {
- if len(accountChange.Address) > 0 && bytes.Compare(message.To, accountChange.Address) != 0 {
+ for _, topic := range self.topics {
+ if !includes(log.Topics(), topic) {
continue
}
-
- if len(accountChange.StateAddress) > 0 && !includes(message.ChangedAddresses, accountChange.StateAddress) {
- continue
- }
-
- match = true
- break
- }
-
- if !match {
- continue
}
- messages = append(messages, message)
+ ret = append(ret, log)
}
- return messages
+ return ret
}
func (self *Filter) bloomFilter(block *types.Block) bool {
- var fromIncluded, toIncluded bool
- if len(self.from) > 0 {
- for _, from := range self.from {
- if types.BloomLookup(block.Bloom(), from) || bytes.Equal(block.Coinbase(), from) {
- fromIncluded = true
- break
- }
- }
- } else {
- fromIncluded = true
+ if len(self.address) > 0 && !types.BloomLookup(block.Bloom(), self.address) {
+ return false
}
- if len(self.to) > 0 {
- for _, to := range self.to {
- if types.BloomLookup(block.Bloom(), ethutil.U256(new(big.Int).Add(ethutil.Big1, ethutil.BigD(to))).Bytes()) || bytes.Equal(block.Coinbase(), to) {
- toIncluded = true
- break
- }
+ for _, topic := range self.topics {
+ if !types.BloomLookup(block.Bloom(), topic) {
+ return false
}
- } else {
- toIncluded = true
}
- return fromIncluded && toIncluded
+ return true
}
diff --git a/eth/backend.go b/eth/backend.go
index c3c7d1287..b7b5c5f85 100644
--- a/eth/backend.go
+++ b/eth/backend.go
@@ -66,7 +66,8 @@ type Ethereum struct {
txSub event.Subscription
blockSub event.Subscription
- RpcServer *rpc.JsonRpcServer
+ RpcServer rpc.RpcServer
+ WsServer rpc.RpcServer
keyManager *crypto.KeyManager
clientIdentity p2p.ClientIdentity
@@ -218,6 +219,10 @@ func (s *Ethereum) MaxPeers() int {
return s.net.MaxPeers
}
+func (s *Ethereum) Coinbase() []byte {
+ return nil // TODO
+}
+
// Start the ethereum
func (s *Ethereum) Start(seed bool) error {
err := s.net.Start()
@@ -276,6 +281,9 @@ func (s *Ethereum) Stop() {
if s.RpcServer != nil {
s.RpcServer.Stop()
}
+ if s.WsServer != nil {
+ s.WsServer.Stop()
+ }
s.txPool.Stop()
s.eventMux.Stop()
s.blockPool.Stop()
diff --git a/event/filter/old_filter.go b/event/filter/old_filter.go
index 1a9a88173..c30a7e584 100644
--- a/event/filter/old_filter.go
+++ b/event/filter/old_filter.go
@@ -77,13 +77,13 @@ out:
}
self.filterMu.RUnlock()
- case state.Messages:
+ case state.Logs:
self.filterMu.RLock()
for _, filter := range self.filters {
- if filter.MessageCallback != nil {
- msgs := filter.FilterMessages(event)
+ if filter.LogsCallback != nil {
+ msgs := filter.FilterLogs(event)
if len(msgs) > 0 {
- filter.MessageCallback(msgs)
+ filter.LogsCallback(msgs)
}
}
}
diff --git a/javascript/javascript_runtime.go b/javascript/javascript_runtime.go
index adc9022b7..c780eb754 100644
--- a/javascript/javascript_runtime.go
+++ b/javascript/javascript_runtime.go
@@ -24,7 +24,7 @@ var jsrelogger = logger.NewLogger("JSRE")
type JSRE struct {
ethereum *eth.Ethereum
Vm *otto.Otto
- pipe *xeth.JSXEth
+ pipe *xeth.XEth
events event.Subscription
@@ -49,7 +49,7 @@ func NewJSRE(ethereum *eth.Ethereum) *JSRE {
re := &JSRE{
ethereum,
otto.New(),
- xeth.NewJSXEth(ethereum),
+ xeth.New(ethereum),
nil,
make(map[string][]otto.Value),
}
diff --git a/javascript/types.go b/javascript/types.go
index 61a57033b..17f1b739e 100644
--- a/javascript/types.go
+++ b/javascript/types.go
@@ -12,14 +12,14 @@ import (
)
type JSStateObject struct {
- *xeth.JSObject
+ *xeth.Object
eth *JSEthereum
}
func (self *JSStateObject) EachStorage(call otto.FunctionCall) otto.Value {
cb := call.Argument(0)
- it := self.JSObject.Trie().Iterator()
+ it := self.Object.Trie().Iterator()
for it.Next() {
cb.Call(self.eth.toVal(self), self.eth.toVal(ethutil.Bytes2Hex(it.Key)), self.eth.toVal(ethutil.Bytes2Hex(it.Value)))
}
@@ -30,72 +30,52 @@ func (self *JSStateObject) EachStorage(call otto.FunctionCall) otto.Value {
// The JSEthereum object attempts to wrap the PEthereum object and returns
// meaningful javascript objects
type JSBlock struct {
- *xeth.JSBlock
+ *xeth.Block
eth *JSEthereum
}
func (self *JSBlock) GetTransaction(hash string) otto.Value {
- return self.eth.toVal(self.JSBlock.GetTransaction(hash))
+ return self.eth.toVal(self.Block.GetTransaction(hash))
}
-type JSMessage struct {
- To string `json:"to"`
- From string `json:"from"`
- Input string `json:"input"`
- Output string `json:"output"`
- Path int `json:"path"`
- Origin string `json:"origin"`
- Timestamp int32 `json:"timestamp"`
- Coinbase string `json:"coinbase"`
- Block string `json:"block"`
- Number int32 `json:"number"`
+type JSLog struct {
+ Address string `json:address`
+ Topics []string `json:topics`
+ Number int32 `json:number`
+ Data string `json:data`
}
-func NewJSMessage(message *state.Message) JSMessage {
- return JSMessage{
- To: ethutil.Bytes2Hex(message.To),
- From: ethutil.Bytes2Hex(message.From),
- Input: ethutil.Bytes2Hex(message.Input),
- Output: ethutil.Bytes2Hex(message.Output),
- Path: message.Path,
- Origin: ethutil.Bytes2Hex(message.Origin),
- Timestamp: int32(message.Timestamp),
- Coinbase: ethutil.Bytes2Hex(message.Origin),
- Block: ethutil.Bytes2Hex(message.Block),
- Number: int32(message.Number.Int64()),
+func NewJSLog(log state.Log) JSLog {
+ return JSLog{
+ Address: ethutil.Bytes2Hex(log.Address()),
+ Topics: nil, //ethutil.Bytes2Hex(log.Address()),
+ Number: 0,
+ Data: ethutil.Bytes2Hex(log.Data()),
}
}
type JSEthereum struct {
- *xeth.JSXEth
+ *xeth.XEth
vm *otto.Otto
ethereum *eth.Ethereum
}
func (self *JSEthereum) Block(v interface{}) otto.Value {
if number, ok := v.(int64); ok {
- return self.toVal(&JSBlock{self.JSXEth.BlockByNumber(int32(number)), self})
+ return self.toVal(&JSBlock{self.XEth.BlockByNumber(int32(number)), self})
} else if hash, ok := v.(string); ok {
- return self.toVal(&JSBlock{self.JSXEth.BlockByHash(hash), self})
+ return self.toVal(&JSBlock{self.XEth.BlockByHash(hash), self})
}
return otto.UndefinedValue()
}
-func (self *JSEthereum) Peers() otto.Value {
- return self.toVal(self.JSXEth.Peers())
-}
-
-func (self *JSEthereum) Key() otto.Value {
- return self.toVal(self.JSXEth.Key())
-}
-
func (self *JSEthereum) GetStateObject(addr string) otto.Value {
- return self.toVal(&JSStateObject{xeth.NewJSObject(self.JSXEth.World().SafeGet(ethutil.Hex2Bytes(addr))), self})
+ return self.toVal(&JSStateObject{self.XEth.State().SafeGet(addr), self})
}
func (self *JSEthereum) Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr string) otto.Value {
- r, err := self.JSXEth.Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr)
+ r, err := self.XEth.Transact(recipient, valueStr, gasStr, gasPriceStr, dataStr)
if err != nil {
fmt.Println(err)
@@ -120,13 +100,13 @@ func (self *JSEthereum) toVal(v interface{}) otto.Value {
func (self *JSEthereum) Messages(object map[string]interface{}) otto.Value {
filter := ui.NewFilterFromMap(object, self.ethereum)
- messages := filter.Find()
- var msgs []JSMessage
- for _, m := range messages {
- msgs = append(msgs, NewJSMessage(m))
+ logs := filter.Find()
+ var jslogs []JSLog
+ for _, m := range logs {
+ jslogs = append(jslogs, NewJSLog(m))
}
- v, _ := self.vm.ToValue(msgs)
+ v, _ := self.vm.ToValue(jslogs)
return v
}
diff --git a/rpc/args.go b/rpc/args.go
new file mode 100644
index 000000000..8b01cc191
--- /dev/null
+++ b/rpc/args.go
@@ -0,0 +1,218 @@
+package rpc
+
+import (
+ "encoding/json"
+)
+
+type GetBlockArgs struct {
+ BlockNumber int32
+ Hash string
+}
+
+func (obj *GetBlockArgs) UnmarshalJSON(b []byte) (err error) {
+ argint, argstr := int32(0), ""
+ if err = json.Unmarshal(b, &argint); err == nil {
+ obj.BlockNumber = argint
+ return
+ }
+ if err = json.Unmarshal(b, &argstr); err == nil {
+ obj.Hash = argstr
+ return
+ }
+ return NewErrorResponse(ErrorDecodeArgs)
+}
+
+func (obj *GetBlockArgs) requirements() error {
+ if obj.BlockNumber == 0 && obj.Hash == "" {
+ return NewErrorResponse("GetBlock requires either a block 'number' or a block 'hash' as argument")
+ }
+ return nil
+}
+
+type NewTxArgs struct {
+ Sec string `json:"sec"`
+ Recipient string `json:"recipient"`
+ Value string `json:"value"`
+ Gas string `json:"gas"`
+ GasPrice string `json:"gasprice"`
+ Init string `json:"init"`
+ Body string `json:"body"`
+}
+
+// type TxResponse struct {
+// Hash string
+// }
+
+func (obj *NewTxArgs) UnmarshalJSON(b []byte) (err error) {
+ if err = json.Unmarshal(b, obj); err == nil {
+ return
+ }
+ return NewErrorResponse(ErrorDecodeArgs)
+}
+
+func (a *NewTxArgs) requirements() error {
+ if a.Recipient == "" {
+ return NewErrorResponse("Transact requires a 'recipient' address as argument")
+ }
+ if a.Value == "" {
+ return NewErrorResponse("Transact requires a 'value' as argument")
+ }
+ if a.Gas == "" {
+ return NewErrorResponse("Transact requires a 'gas' value as argument")
+ }
+ if a.GasPrice == "" {
+ return NewErrorResponse("Transact requires a 'gasprice' value as argument")
+ }
+ return nil
+}
+
+func (a *NewTxArgs) requirementsContract() error {
+ if a.Value == "" {
+ return NewErrorResponse("Create requires a 'value' as argument")
+ }
+ if a.Gas == "" {
+ return NewErrorResponse("Create requires a 'gas' value as argument")
+ }
+ if a.GasPrice == "" {
+ return NewErrorResponse("Create requires a 'gasprice' value as argument")
+ }
+ if a.Body == "" {
+ return NewErrorResponse("Create requires a 'body' value as argument")
+ }
+ return nil
+}
+
+type PushTxArgs struct {
+ Tx string `json:"tx"`
+}
+
+func (obj *PushTxArgs) UnmarshalJSON(b []byte) (err error) {
+ arg0 := ""
+ if err = json.Unmarshal(b, arg0); err == nil {
+ obj.Tx = arg0
+ return
+ }
+ return NewErrorResponse(ErrorDecodeArgs)
+}
+
+func (a *PushTxArgs) requirementsPushTx() error {
+ if a.Tx == "" {
+ return NewErrorResponse("PushTx requires a 'tx' as argument")
+ }
+ return nil
+}
+
+type GetStorageArgs struct {
+ Address string
+ Key string
+}
+
+func (obj *GetStorageArgs) UnmarshalJSON(b []byte) (err error) {
+ arg0 := ""
+ if err = json.Unmarshal(b, arg0); err == nil {
+ obj.Address = arg0
+ return
+ }
+ return NewErrorResponse(ErrorDecodeArgs)
+}
+
+func (a *GetStorageArgs) requirements() error {
+ if a.Address == "" {
+ return NewErrorResponse("GetStorageAt requires an 'address' value as argument")
+ }
+ if a.Key == "" {
+ return NewErrorResponse("GetStorageAt requires an 'key' value as argument")
+ }
+ return nil
+}
+
+type GetStorageAtRes struct {
+ Key string `json:"key"`
+ Value string `json:"value"`
+ Address string `json:"address"`
+}
+
+type GetTxCountArgs struct {
+ Address string `json:"address"`
+}
+
+// type GetTxCountRes struct {
+// Nonce int `json:"nonce"`
+// }
+
+func (obj *GetTxCountArgs) UnmarshalJSON(b []byte) (err error) {
+ arg0 := ""
+ if err = json.Unmarshal(b, arg0); err == nil {
+ obj.Address = arg0
+ return
+ }
+ return NewErrorResponse("Could not determine JSON parameters")
+}
+
+func (a *GetTxCountArgs) requirements() error {
+ if a.Address == "" {
+ return NewErrorResponse("GetTxCountAt requires an 'address' value as argument")
+ }
+ return nil
+}
+
+// type GetPeerCountRes struct {
+// PeerCount int `json:"peerCount"`
+// }
+
+// type GetListeningRes struct {
+// IsListening bool `json:"isListening"`
+// }
+
+// type GetCoinbaseRes struct {
+// Coinbase string `json:"coinbase"`
+// }
+
+// type GetMiningRes struct {
+// IsMining bool `json:"isMining"`
+// }
+
+type GetBalanceArgs struct {
+ Address string
+}
+
+func (obj *GetBalanceArgs) UnmarshalJSON(b []byte) (err error) {
+ arg0 := ""
+ if err = json.Unmarshal(b, &arg0); err == nil {
+ obj.Address = arg0
+ return
+ }
+ return NewErrorResponse("Could not determine JSON parameters")
+}
+
+func (a *GetBalanceArgs) requirements() error {
+ if a.Address == "" {
+ return NewErrorResponse("GetBalanceAt requires an 'address' value as argument")
+ }
+ return nil
+}
+
+type BalanceRes struct {
+ Balance string `json:"balance"`
+ Address string `json:"address"`
+}
+
+type GetCodeAtArgs struct {
+ Address string
+}
+
+func (obj *GetCodeAtArgs) UnmarshalJSON(b []byte) (err error) {
+ arg0 := ""
+ if err = json.Unmarshal(b, &arg0); err == nil {
+ obj.Address = arg0
+ return
+ }
+ return NewErrorResponse(ErrorDecodeArgs)
+}
+
+func (a *GetCodeAtArgs) requirements() error {
+ if a.Address == "" {
+ return NewErrorResponse("GetCodeAt requires an 'address' value as argument")
+ }
+ return nil
+}
diff --git a/rpc/http/server.go b/rpc/http/server.go
new file mode 100644
index 000000000..965727a4e
--- /dev/null
+++ b/rpc/http/server.go
@@ -0,0 +1,111 @@
+/*
+ This file is part of go-ethereum
+
+ go-ethereum is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ go-ethereum is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
+*/
+package rpchttp
+
+import (
+ "fmt"
+ "net"
+ "net/http"
+
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/rpc"
+ "github.com/ethereum/go-ethereum/xeth"
+)
+
+var rpchttplogger = logger.NewLogger("RPC-HTTP")
+var JSON rpc.JsonWrapper
+
+func NewRpcHttpServer(pipe *xeth.XEth, port int) (*RpcHttpServer, error) {
+ sport := fmt.Sprintf(":%d", port)
+ l, err := net.Listen("tcp", sport)
+ if err != nil {
+ return nil, err
+ }
+
+ return &RpcHttpServer{
+ listener: l,
+ quit: make(chan bool),
+ pipe: pipe,
+ port: port,
+ }, nil
+}
+
+type RpcHttpServer struct {
+ quit chan bool
+ listener net.Listener
+ pipe *xeth.XEth
+ port int
+}
+
+func (s *RpcHttpServer) exitHandler() {
+out:
+ for {
+ select {
+ case <-s.quit:
+ s.listener.Close()
+ break out
+ }
+ }
+
+ rpchttplogger.Infoln("Shutdown RPC-HTTP server")
+}
+
+func (s *RpcHttpServer) Stop() {
+ close(s.quit)
+}
+
+func (s *RpcHttpServer) Start() {
+ rpchttplogger.Infof("Starting RPC-HTTP server on port %d", s.port)
+ go s.exitHandler()
+
+ api := rpc.NewEthereumApi(s.pipe)
+ h := s.apiHandler(api)
+ http.Handle("/", h)
+
+ err := http.Serve(s.listener, nil)
+ // FIX Complains on shutdown due to listner already being closed
+ if err != nil {
+ rpchttplogger.Errorln("Error on RPC-HTTP interface:", err)
+ }
+}
+
+func (s *RpcHttpServer) apiHandler(api *rpc.EthereumApi) http.Handler {
+ fn := func(w http.ResponseWriter, req *http.Request) {
+ w.Header().Set("Access-Control-Allow-Origin", "*")
+
+ rpchttplogger.Debugln("Handling request")
+
+ reqParsed, reqerr := JSON.ParseRequestBody(req)
+ if reqerr != nil {
+ JSON.Send(w, &rpc.RpcErrorResponse{JsonRpc: reqParsed.JsonRpc, ID: reqParsed.ID, Error: true, ErrorText: rpc.ErrorParseRequest})
+ return
+ }
+
+ var response interface{}
+ reserr := api.GetRequestReply(&reqParsed, &response)
+ if reserr != nil {
+ rpchttplogger.Errorln(reserr)
+ JSON.Send(w, &rpc.RpcErrorResponse{JsonRpc: reqParsed.JsonRpc, ID: reqParsed.ID, Error: true, ErrorText: reserr.Error()})
+ return
+ }
+
+ rpchttplogger.Debugf("Generated response: %T %s", response, response)
+ JSON.Send(w, &rpc.RpcSuccessResponse{JsonRpc: reqParsed.JsonRpc, ID: reqParsed.ID, Error: false, Result: response})
+ }
+
+ return http.HandlerFunc(fn)
+}
diff --git a/rpc/json.go b/rpc/json.go
index e467f9a34..9bd204818 100644
--- a/rpc/json.go
+++ b/rpc/json.go
@@ -1,20 +1,58 @@
+/*
+ This file is part of go-ethereum
+
+ go-ethereum is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ go-ethereum is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
+*/
package rpc
import (
"encoding/json"
+ "github.com/ethereum/go-ethereum/logger"
"io"
+ "net/http"
)
-type jsonWrapper struct{}
+var rpclogger = logger.NewLogger("RPC")
-func (self jsonWrapper) Send(writer io.Writer, v interface{}) (n int, err error) {
+type JsonWrapper struct{}
+
+func (self JsonWrapper) Send(writer io.Writer, v interface{}) (n int, err error) {
var payload []byte
payload, err = json.Marshal(v)
if err != nil {
+ rpclogger.Fatalln("Error marshalling JSON", err)
return 0, err
}
+ rpclogger.Infof("Sending payload: %s", payload)
return writer.Write(payload)
}
-var JSON jsonWrapper
+func (self JsonWrapper) ParseRequestBody(req *http.Request) (RpcRequest, error) {
+ var reqParsed RpcRequest
+
+ // Convert JSON to native types
+ d := json.NewDecoder(req.Body)
+ // d.UseNumber()
+ defer req.Body.Close()
+ err := d.Decode(&reqParsed)
+
+ if err != nil {
+ rpclogger.Errorln("Error decoding JSON: ", err)
+ return reqParsed, err
+ }
+ rpclogger.DebugDetailf("Parsed request: %s", reqParsed)
+
+ return reqParsed, nil
+}
diff --git a/rpc/message.go b/rpc/message.go
index c8103eded..caf50a6c0 100644
--- a/rpc/message.go
+++ b/rpc/message.go
@@ -1,14 +1,167 @@
+/*
+ This file is part of go-ethereum
+
+ go-ethereum is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ go-ethereum is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
+*/
package rpc
-import "github.com/ethereum/go-ethereum/ethutil"
+import (
+ "bytes"
+ "encoding/json"
+ "errors"
+)
+
+const (
+ ErrorArguments = "Error: Insufficient arguments"
+ ErrorNotImplemented = "Error: Method not implemented"
+ ErrorUnknown = "Error: Unknown error"
+ ErrorParseRequest = "Error: Could not parse request"
+ ErrorDecodeArgs = "Error: Could not decode arguments"
+)
+
+type ErrorResponse struct {
+ Error bool `json:"error"`
+ ErrorText string `json:"errorText"`
+}
+
+type RpcSuccessResponse struct {
+ ID int `json:"id"`
+ JsonRpc string `json:"jsonrpc"`
+ Error bool `json:"error"`
+ Result interface{} `json:"result"`
+}
+
+type RpcErrorResponse struct {
+ ID int `json:"id"`
+ JsonRpc string `json:"jsonrpc"`
+ Error bool `json:"error"`
+ ErrorText string `json:"errortext"`
+}
+
+type RpcRequest struct {
+ JsonRpc string `json:"jsonrpc"`
+ ID int `json:"id"`
+ Method string `json:"method"`
+ Params []json.RawMessage `json:"params"`
+}
+
+func (req *RpcRequest) ToGetBlockArgs() (*GetBlockArgs, error) {
+ if len(req.Params) < 1 {
+ return nil, NewErrorResponse(ErrorArguments)
+ }
+
+ args := new(GetBlockArgs)
+ r := bytes.NewReader(req.Params[0])
+ err := json.NewDecoder(r).Decode(args)
+ if err != nil {
+ return nil, NewErrorResponse(ErrorDecodeArgs)
+ }
+ rpclogger.DebugDetailf("%T %v", args, args)
+ return args, nil
+}
+
+func (req *RpcRequest) ToNewTxArgs() (*NewTxArgs, error) {
+ if len(req.Params) < 7 {
+ return nil, NewErrorResponse(ErrorArguments)
+ }
+
+ args := new(NewTxArgs)
+ r := bytes.NewReader(req.Params[0])
+ err := json.NewDecoder(r).Decode(args)
+ if err != nil {
+ return nil, NewErrorResponse(ErrorDecodeArgs)
+ }
+ rpclogger.DebugDetailf("%T %v", args, args)
+ return args, nil
+}
+
+func (req *RpcRequest) ToPushTxArgs() (*PushTxArgs, error) {
+ if len(req.Params) < 1 {
+ return nil, NewErrorResponse(ErrorArguments)
+ }
+
+ args := new(PushTxArgs)
+ r := bytes.NewReader(req.Params[0])
+ err := json.NewDecoder(r).Decode(args)
+ if err != nil {
+ return nil, NewErrorResponse(ErrorDecodeArgs)
+ }
+ rpclogger.DebugDetailf("%T %v", args, args)
+ return args, nil
+}
+
+func (req *RpcRequest) ToGetStorageArgs() (*GetStorageArgs, error) {
+ if len(req.Params) < 2 {
+ return nil, NewErrorResponse(ErrorArguments)
+ }
+
+ args := new(GetStorageArgs)
+ // TODO need to pass both arguments
+ r := bytes.NewReader(req.Params[0])
+ err := json.NewDecoder(r).Decode(args)
+ if err != nil {
+ return nil, NewErrorResponse(ErrorDecodeArgs)
+ }
+ rpclogger.DebugDetailf("%T %v", args, args)
+ return args, nil
+}
+
+func (req *RpcRequest) ToGetTxCountArgs() (*GetTxCountArgs, error) {
+ if len(req.Params) < 1 {
+ return nil, NewErrorResponse(ErrorArguments)
+ }
+
+ args := new(GetTxCountArgs)
+ r := bytes.NewReader(req.Params[0])
+ err := json.NewDecoder(r).Decode(args)
+ if err != nil {
+ return nil, NewErrorResponse(ErrorDecodeArgs)
+ }
+ rpclogger.DebugDetailf("%T %v", args, args)
+ return args, nil
+}
+
+func (req *RpcRequest) ToGetBalanceArgs() (*GetBalanceArgs, error) {
+ if len(req.Params) < 1 {
+ return nil, NewErrorResponse(ErrorArguments)
+ }
+
+ args := new(GetBalanceArgs)
+ r := bytes.NewReader(req.Params[0])
+ err := json.NewDecoder(r).Decode(args)
+ if err != nil {
+ return nil, NewErrorResponse(ErrorDecodeArgs)
+ }
+ rpclogger.DebugDetailf("%T %v", args, args)
+ return args, nil
+}
+
+func (req *RpcRequest) ToGetCodeAtArgs() (*GetCodeAtArgs, error) {
+ if len(req.Params) < 1 {
+ return nil, NewErrorResponse(ErrorArguments)
+ }
-type Message struct {
- Call string `json:"call"`
- Args []interface{} `json:"args"`
- Id int `json:"_id"`
- Data interface{} `json:"data"`
+ args := new(GetCodeAtArgs)
+ r := bytes.NewReader(req.Params[0])
+ err := json.NewDecoder(r).Decode(args)
+ if err != nil {
+ return nil, NewErrorResponse(ErrorDecodeArgs)
+ }
+ rpclogger.DebugDetailf("%T %v", args, args)
+ return args, nil
}
-func (self *Message) Arguments() *ethutil.Value {
- return ethutil.NewValue(self.Args)
+func NewErrorResponse(msg string) error {
+ return errors.New(msg)
}
diff --git a/rpc/packages.go b/rpc/packages.go
index 5535e6e79..5d17a0f90 100644
--- a/rpc/packages.go
+++ b/rpc/packages.go
@@ -1,8 +1,31 @@
+/*
+ This file is part of go-ethereum
+
+ go-ethereum is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ go-ethereum is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
+*/
+/*
+
+For each request type, define the following:
+
+1. RpcRequest "To" method [message.go], which does basic validation and conversion to "Args" type via json.Decoder()
+2. json.Decoder() calls "UnmarshalON" defined on each "Args" struct
+3. EthereumApi method, taking the "Args" type and replying with an interface to be marshalled to ON
+
+*/
package rpc
import (
- "encoding/json"
- "errors"
"math/big"
"strings"
@@ -10,195 +33,71 @@ import (
"github.com/ethereum/go-ethereum/xeth"
)
-type EthereumApi struct {
- pipe *xeth.JSXEth
-}
-
-type JsonArgs interface {
- requirements() error
-}
-
-type BlockResponse struct {
- JsonResponse
-}
-type GetBlockArgs struct {
- BlockNumber int
- Hash string
+type RpcServer interface {
+ Start()
+ Stop()
}
-type ErrorResponse struct {
- Error bool `json:"error"`
- ErrorText string `json:"errorText"`
+func NewEthereumApi(xeth *xeth.XEth) *EthereumApi {
+ return &EthereumApi{xeth: xeth}
}
-type JsonResponse interface {
-}
-
-type SuccessRes struct {
- Error bool `json:"error"`
- Result JsonResponse `json:"result"`
-}
-
-func NewSuccessRes(object JsonResponse) string {
- e := SuccessRes{Error: false, Result: object}
- res, err := json.Marshal(e)
- if err != nil {
- // This should never happen
- panic("Creating json error response failed, help")
- }
- success := string(res)
- return success
-}
-
-func NewErrorResponse(msg string) error {
- e := ErrorResponse{Error: true, ErrorText: msg}
- res, err := json.Marshal(e)
- if err != nil {
- // This should never happen
- panic("Creating json error response failed, help")
- }
- newErr := errors.New(string(res))
- return newErr
-}
-
-func (b *GetBlockArgs) requirements() error {
- if b.BlockNumber == 0 && b.Hash == "" {
- return NewErrorResponse("GetBlock requires either a block 'number' or a block 'hash' as argument")
- }
- return nil
+type EthereumApi struct {
+ xeth *xeth.XEth
}
-func (p *EthereumApi) GetBlock(args *GetBlockArgs, reply *string) error {
+func (p *EthereumApi) GetBlock(args *GetBlockArgs, reply *interface{}) error {
err := args.requirements()
if err != nil {
return err
}
- block := p.pipe.BlockByHash(args.Hash)
- *reply = NewSuccessRes(block)
- return nil
-}
-
-type NewTxArgs struct {
- Sec string
- Recipient string
- Value string
- Gas string
- GasPrice string
- Init string
- Body string
-}
-type TxResponse struct {
- Hash string
-}
-
-func (a *NewTxArgs) requirements() error {
- if a.Recipient == "" {
- return NewErrorResponse("Transact requires a 'recipient' address as argument")
- }
- if a.Value == "" {
- return NewErrorResponse("Transact requires a 'value' as argument")
- }
- if a.Gas == "" {
- return NewErrorResponse("Transact requires a 'gas' value as argument")
- }
- if a.GasPrice == "" {
- return NewErrorResponse("Transact requires a 'gasprice' value as argument")
- }
- return nil
-}
-
-func (a *NewTxArgs) requirementsContract() error {
- if a.Value == "" {
- return NewErrorResponse("Create requires a 'value' as argument")
- }
- if a.Gas == "" {
- return NewErrorResponse("Create requires a 'gas' value as argument")
- }
- if a.GasPrice == "" {
- return NewErrorResponse("Create requires a 'gasprice' value as argument")
- }
- if a.Body == "" {
- return NewErrorResponse("Create requires a 'body' value as argument")
+ if args.BlockNumber > 0 {
+ *reply = p.xeth.BlockByNumber(args.BlockNumber)
+ } else {
+ *reply = p.xeth.BlockByHash(args.Hash)
}
return nil
}
-func (p *EthereumApi) Transact(args *NewTxArgs, reply *string) error {
+func (p *EthereumApi) Transact(args *NewTxArgs, reply *interface{}) error {
err := args.requirements()
if err != nil {
return err
}
- result, _ := p.pipe.Transact(p.pipe.Key().PrivateKey, args.Recipient, args.Value, args.Gas, args.GasPrice, args.Body)
- *reply = NewSuccessRes(result)
+ result, _ := p.xeth.Transact( /* TODO specify account */ args.Recipient, args.Value, args.Gas, args.GasPrice, args.Body)
+ *reply = result
return nil
}
-func (p *EthereumApi) Create(args *NewTxArgs, reply *string) error {
+func (p *EthereumApi) Create(args *NewTxArgs, reply *interface{}) error {
err := args.requirementsContract()
if err != nil {
return err
}
- result, _ := p.pipe.Transact(p.pipe.Key().PrivateKey, "", args.Value, args.Gas, args.GasPrice, args.Body)
- *reply = NewSuccessRes(result)
+ result, _ := p.xeth.Transact( /* TODO specify account */ "", args.Value, args.Gas, args.GasPrice, args.Body)
+ *reply = result
return nil
}
-type PushTxArgs struct {
- Tx string
-}
-
-func (a *PushTxArgs) requirementsPushTx() error {
- if a.Tx == "" {
- return NewErrorResponse("PushTx requires a 'tx' as argument")
- }
- return nil
-}
-
-func (p *EthereumApi) PushTx(args *PushTxArgs, reply *string) error {
+func (p *EthereumApi) PushTx(args *PushTxArgs, reply *interface{}) error {
err := args.requirementsPushTx()
if err != nil {
return err
}
- result, _ := p.pipe.PushTx(args.Tx)
- *reply = NewSuccessRes(result)
- return nil
-}
-
-func (p *EthereumApi) GetKey(args interface{}, reply *string) error {
- *reply = NewSuccessRes(p.pipe.Key())
- return nil
-}
-
-type GetStorageArgs struct {
- Address string
- Key string
-}
-
-func (a *GetStorageArgs) requirements() error {
- if a.Address == "" {
- return NewErrorResponse("GetStorageAt requires an 'address' value as argument")
- }
- if a.Key == "" {
- return NewErrorResponse("GetStorageAt requires an 'key' value as argument")
- }
+ result, _ := p.xeth.PushTx(args.Tx)
+ *reply = result
return nil
}
-type GetStorageAtRes struct {
- Key string `json:"key"`
- Value string `json:"value"`
- Address string `json:"address"`
-}
-
-func (p *EthereumApi) GetStorageAt(args *GetStorageArgs, reply *string) error {
+func (p *EthereumApi) GetStorageAt(args *GetStorageArgs, reply *interface{}) error {
err := args.requirements()
if err != nil {
return err
}
- state := p.pipe.World().SafeGet(ethutil.Hex2Bytes(args.Address))
+ state := p.xeth.State().SafeGet(args.Address)
var hx string
if strings.Index(args.Key, "0x") == 0 {
@@ -208,104 +107,106 @@ func (p *EthereumApi) GetStorageAt(args *GetStorageArgs, reply *string) error {
i, _ := new(big.Int).SetString(args.Key, 10)
hx = ethutil.Bytes2Hex(i.Bytes())
}
- jsonlogger.Debugf("GetStorageAt(%s, %s)\n", args.Address, hx)
+ rpclogger.Debugf("GetStorageAt(%s, %s)\n", args.Address, hx)
value := state.Storage(ethutil.Hex2Bytes(hx))
- *reply = NewSuccessRes(GetStorageAtRes{Address: args.Address, Key: args.Key, Value: value.Str()})
- return nil
-}
-
-type GetTxCountArgs struct {
- Address string `json:"address"`
-}
-type GetTxCountRes struct {
- Nonce int `json:"nonce"`
-}
-
-func (a *GetTxCountArgs) requirements() error {
- if a.Address == "" {
- return NewErrorResponse("GetTxCountAt requires an 'address' value as argument")
- }
+ *reply = GetStorageAtRes{Address: args.Address, Key: args.Key, Value: value.Str()}
return nil
}
-type GetPeerCountRes struct {
- PeerCount int `json:"peerCount"`
-}
-
-func (p *EthereumApi) GetPeerCount(args *interface{}, reply *string) error {
- *reply = NewSuccessRes(GetPeerCountRes{PeerCount: p.pipe.PeerCount()})
+func (p *EthereumApi) GetPeerCount(reply *interface{}) error {
+ *reply = p.xeth.PeerCount()
return nil
}
-type GetListeningRes struct {
- IsListening bool `json:"isListening"`
-}
-
-func (p *EthereumApi) GetIsListening(args *interface{}, reply *string) error {
- *reply = NewSuccessRes(GetListeningRes{IsListening: p.pipe.IsListening()})
+func (p *EthereumApi) GetIsListening(reply *interface{}) error {
+ *reply = p.xeth.IsListening()
return nil
}
-type GetCoinbaseRes struct {
- Coinbase string `json:"coinbase"`
-}
-
-func (p *EthereumApi) GetCoinbase(args *interface{}, reply *string) error {
- *reply = NewSuccessRes(GetCoinbaseRes{Coinbase: p.pipe.CoinBase()})
+func (p *EthereumApi) GetCoinbase(reply *interface{}) error {
+ *reply = p.xeth.Coinbase()
return nil
}
-type GetMiningRes struct {
- IsMining bool `json:"isMining"`
-}
-
-func (p *EthereumApi) GetIsMining(args *interface{}, reply *string) error {
- *reply = NewSuccessRes(GetMiningRes{IsMining: p.pipe.IsMining()})
+func (p *EthereumApi) GetIsMining(reply *interface{}) error {
+ *reply = p.xeth.IsMining()
return nil
}
-func (p *EthereumApi) GetTxCountAt(args *GetTxCountArgs, reply *string) error {
+func (p *EthereumApi) GetTxCountAt(args *GetTxCountArgs, reply *interface{}) error {
err := args.requirements()
if err != nil {
return err
}
- state := p.pipe.TxCountAt(args.Address)
- *reply = NewSuccessRes(GetTxCountRes{Nonce: state})
+ *reply = p.xeth.TxCountAt(args.Address)
return nil
}
-type GetBalanceArgs struct {
- Address string
-}
-
-func (a *GetBalanceArgs) requirements() error {
- if a.Address == "" {
- return NewErrorResponse("GetBalanceAt requires an 'address' value as argument")
+func (p *EthereumApi) GetBalanceAt(args *GetBalanceArgs, reply *interface{}) error {
+ err := args.requirements()
+ if err != nil {
+ return err
}
+ state := p.xeth.State().SafeGet(args.Address)
+ *reply = BalanceRes{Balance: state.Balance().String(), Address: args.Address}
return nil
}
-type BalanceRes struct {
- Balance string `json:"balance"`
- Address string `json:"address"`
-}
-
-func (p *EthereumApi) GetBalanceAt(args *GetBalanceArgs, reply *string) error {
+func (p *EthereumApi) GetCodeAt(args *GetCodeAtArgs, reply *interface{}) error {
err := args.requirements()
if err != nil {
return err
}
- state := p.pipe.World().SafeGet(ethutil.Hex2Bytes(args.Address))
- *reply = NewSuccessRes(BalanceRes{Balance: state.Balance().String(), Address: args.Address})
- return nil
-}
-
-type TestRes struct {
- JsonResponse `json:"-"`
- Answer int `json:"answer"`
-}
-
-func (p *EthereumApi) Test(args *GetBlockArgs, reply *string) error {
- *reply = NewSuccessRes(TestRes{Answer: 15})
+ *reply = p.xeth.CodeAt(args.Address)
+ return nil
+}
+
+func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error {
+ // Spec at https://github.com/ethereum/wiki/wiki/Generic-ON-RPC
+ rpclogger.DebugDetailf("%T %s", req.Params, req.Params)
+ switch req.Method {
+ case "eth_coinbase":
+ return p.GetCoinbase(reply)
+ case "eth_listening":
+ return p.GetIsListening(reply)
+ case "eth_mining":
+ return p.GetIsMining(reply)
+ case "eth_peerCount":
+ return p.GetPeerCount(reply)
+ case "eth_countAt":
+ args, err := req.ToGetTxCountArgs()
+ if err != nil {
+ return err
+ }
+ return p.GetTxCountAt(args, reply)
+ case "eth_codeAt":
+ args, err := req.ToGetCodeAtArgs()
+ if err != nil {
+ return err
+ }
+ return p.GetCodeAt(args, reply)
+ case "eth_balanceAt":
+ args, err := req.ToGetBalanceArgs()
+ if err != nil {
+ return err
+ }
+ return p.GetBalanceAt(args, reply)
+ case "eth_stateAt":
+ args, err := req.ToGetStorageArgs()
+ if err != nil {
+ return err
+ }
+ return p.GetStorageAt(args, reply)
+ case "eth_blockByNumber", "eth_blockByHash":
+ args, err := req.ToGetBlockArgs()
+ if err != nil {
+ return err
+ }
+ return p.GetBlock(args, reply)
+ default:
+ return NewErrorResponse(ErrorNotImplemented)
+ }
+
+ rpclogger.DebugDetailf("Reply: %T %s", reply, reply)
return nil
}
diff --git a/rpc/server.go b/rpc/server.go
deleted file mode 100644
index 983dc6c33..000000000
--- a/rpc/server.go
+++ /dev/null
@@ -1,67 +0,0 @@
-package rpc
-
-import (
- "fmt"
- "net"
- "net/rpc"
- "net/rpc/jsonrpc"
-
- "github.com/ethereum/go-ethereum/logger"
- "github.com/ethereum/go-ethereum/xeth"
-)
-
-var jsonlogger = logger.NewLogger("JSON")
-
-type JsonRpcServer struct {
- quit chan bool
- listener net.Listener
- pipe *xeth.JSXEth
-}
-
-func (s *JsonRpcServer) exitHandler() {
-out:
- for {
- select {
- case <-s.quit:
- s.listener.Close()
- break out
- }
- }
-
- jsonlogger.Infoln("Shutdown JSON-RPC server")
-}
-
-func (s *JsonRpcServer) Stop() {
- close(s.quit)
-}
-
-func (s *JsonRpcServer) Start() {
- jsonlogger.Infoln("Starting JSON-RPC server")
- go s.exitHandler()
- rpc.Register(&EthereumApi{pipe: s.pipe})
- rpc.HandleHTTP()
-
- for {
- conn, err := s.listener.Accept()
- if err != nil {
- jsonlogger.Infoln("Error starting JSON-RPC:", err)
- break
- }
- jsonlogger.Debugln("Incoming request.")
- go jsonrpc.ServeConn(conn)
- }
-}
-
-func NewJsonRpcServer(pipe *xeth.JSXEth, port int) (*JsonRpcServer, error) {
- sport := fmt.Sprintf(":%d", port)
- l, err := net.Listen("tcp", sport)
- if err != nil {
- return nil, err
- }
-
- return &JsonRpcServer{
- listener: l,
- quit: make(chan bool),
- pipe: pipe,
- }, nil
-}
diff --git a/rpc/writer.go b/rpc/writer.go
deleted file mode 100644
index 4cc39f577..000000000
--- a/rpc/writer.go
+++ /dev/null
@@ -1,75 +0,0 @@
-package rpc
-
-/*
-func pack(id int, v ...interface{}) Message {
- return Message{Data: v, Id: id}
-}
-
-func WriteOn(msg *Message, writer io.Writer) {
- //msg := &Message{Seed: seed, Data: data}
-
- switch msg.Call {
- case "compile":
- data := ethutil.NewValue(msg.Args)
- bcode, err := ethutil.Compile(data.Get(0).Str(), false)
- if err != nil {
- JSON.Send(writer, pack(msg.Id, err.Error()))
- }
-
- code := ethutil.Bytes2Hex(bcode)
-
- JSON.Send(writer, pack(msg.Id, code, nil))
- case "block":
- args := msg.Arguments()
-
- block := pipe.BlockByNumber(int32(args.Get(0).Uint()))
-
- JSON.Send(writer, pack(msg.Id, block))
- case "transact":
- if mp, ok := msg.Args[0].(map[string]interface{}); ok {
- object := mapToTxParams(mp)
- JSON.Send(
- writer,
- pack(msg.Id, args(pipe.Transact(object["from"], object["to"], object["value"], object["gas"], object["gasPrice"], object["data"]))),
- )
-
- }
- case "coinbase":
- JSON.Send(writer, pack(msg.Id, pipe.CoinBase(), msg.Seed))
-
- case "listening":
- JSON.Send(writer, pack(msg.Id, pipe.IsListening()))
-
- case "mining":
- JSON.Send(writer, pack(msg.Id, pipe.IsMining()))
-
- case "peerCoint":
- JSON.Send(writer, pack(msg.Id, pipe.PeerCount()))
-
- case "countAt":
- args := msg.Arguments()
-
- JSON.Send(writer, pack(msg.Id, pipe.TxCountAt(args.Get(0).Str())))
-
- case "codeAt":
- args := msg.Arguments()
-
- JSON.Send(writer, pack(msg.Id, len(pipe.CodeAt(args.Get(0).Str()))))
-
- case "stateAt":
- args := msg.Arguments()
-
- JSON.Send(writer, pack(msg.Id, pipe.StorageAt(args.Get(0).Str(), args.Get(1).Str())))
-
- case "balanceAt":
- args := msg.Arguments()
-
- JSON.Send(writer, pack(msg.Id, pipe.BalanceAt(args.Get(0).Str())))
-
- case "newFilter":
- case "newFilterString":
- case "messages":
- // TODO
- }
-}
-*/
diff --git a/rpc/ws/server.go b/rpc/ws/server.go
new file mode 100644
index 000000000..37b08ebd9
--- /dev/null
+++ b/rpc/ws/server.go
@@ -0,0 +1,123 @@
+/*
+ This file is part of go-ethereum
+
+ go-ethereum is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ go-ethereum is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
+*/
+package ws
+
+import (
+ "fmt"
+ "net"
+ "net/http"
+
+ "code.google.com/p/go.net/websocket"
+ "github.com/ethereum/go-ethereum/eth"
+ "github.com/ethereum/go-ethereum/event/filter"
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/rpc"
+ "github.com/ethereum/go-ethereum/xeth"
+)
+
+var wslogger = logger.NewLogger("RPC-WS")
+
+type WebSocketServer struct {
+ eth *eth.Ethereum
+ filterManager *filter.FilterManager
+ port int
+ doneCh chan bool
+ listener net.Listener
+}
+
+func NewWebSocketServer(eth *eth.Ethereum, port int) (*WebSocketServer, error) {
+ sport := fmt.Sprintf(":%d", port)
+ l, err := net.Listen("tcp", sport)
+ if err != nil {
+ return nil, err
+ }
+
+ filterManager := filter.NewFilterManager(eth.EventMux())
+ go filterManager.Start()
+
+ return &WebSocketServer{eth,
+ filterManager,
+ port,
+ make(chan bool),
+ l,
+ }, nil
+}
+
+func (self *WebSocketServer) handlerLoop() {
+ for {
+ select {
+ case <-self.doneCh:
+ wslogger.Infoln("Shutdown RPC-WS server")
+ return
+ }
+ }
+}
+
+func (self *WebSocketServer) Stop() {
+ close(self.doneCh)
+}
+
+func (self *WebSocketServer) Start() {
+ wslogger.Infof("Starting RPC-WS server on port %d", self.port)
+ go self.handlerLoop()
+
+ api := rpc.NewEthereumApi(xeth.New(self.eth))
+ h := self.apiHandler(api)
+ http.Handle("/ws", h)
+
+ err := http.Serve(self.listener, nil)
+ if err != nil {
+ wslogger.Errorln("Error on RPC-WS interface:", err)
+ }
+}
+
+func (s *WebSocketServer) apiHandler(api *rpc.EthereumApi) http.Handler {
+ fn := func(w http.ResponseWriter, req *http.Request) {
+ h := sockHandler(api)
+ s := websocket.Server{Handler: h}
+ s.ServeHTTP(w, req)
+ }
+
+ return http.HandlerFunc(fn)
+}
+
+func sockHandler(api *rpc.EthereumApi) websocket.Handler {
+ fn := func(conn *websocket.Conn) {
+ for {
+ wslogger.Debugln("Handling request")
+ var reqParsed rpc.RpcRequest
+
+ if err := websocket.JSON.Receive(conn, &reqParsed); err != nil {
+ wslogger.Debugln(rpc.ErrorParseRequest)
+ websocket.JSON.Send(conn, rpc.RpcErrorResponse{JsonRpc: reqParsed.JsonRpc, ID: reqParsed.ID, Error: true, ErrorText: rpc.ErrorParseRequest})
+ continue
+ }
+
+ var response interface{}
+ reserr := api.GetRequestReply(&reqParsed, &response)
+ if reserr != nil {
+ wslogger.Errorln(reserr)
+ websocket.JSON.Send(conn, rpc.RpcErrorResponse{JsonRpc: reqParsed.JsonRpc, ID: reqParsed.ID, Error: true, ErrorText: reserr.Error()})
+ continue
+ }
+
+ wslogger.Debugf("Generated response: %T %s", response, response)
+ websocket.JSON.Send(conn, rpc.RpcSuccessResponse{JsonRpc: reqParsed.JsonRpc, ID: reqParsed.ID, Error: false, Result: response})
+ }
+ }
+ return websocket.Handler(fn)
+}
diff --git a/ui/filter.go b/ui/filter.go
index e0797dad2..8f298a40c 100644
--- a/ui/filter.go
+++ b/ui/filter.go
@@ -28,14 +28,9 @@ func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core.
filter.SetLatestBlock(val.Int())
}
- if object["to"] != nil {
- val := ethutil.NewValue(object["to"])
- filter.AddTo(fromHex(val.Str()))
- }
-
- if object["from"] != nil {
- val := ethutil.NewValue(object["from"])
- filter.AddFrom(fromHex(val.Str()))
+ if object["address"] != nil {
+ val := ethutil.NewValue(object["address"])
+ filter.SetAddress(fromHex(val.Str()))
}
if object["max"] != nil {
@@ -48,8 +43,8 @@ func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core.
filter.SetSkip(int(val.Uint()))
}
- if object["altered"] != nil {
- filter.Altered = makeAltered(object["altered"])
+ if object["topics"] != nil {
+ filter.SetTopics(MakeTopics(object["topics"]))
}
return filter
@@ -70,16 +65,13 @@ func mapToAccountChange(m map[string]interface{}) (d core.AccountChange) {
// data can come in in the following formats:
// ["aabbccdd", {id: "ccddee", at: "11223344"}], "aabbcc", {id: "ccddee", at: "1122"}
-func makeAltered(v interface{}) (d []core.AccountChange) {
+func MakeTopics(v interface{}) (d [][]byte) {
if str, ok := v.(string); ok {
- d = append(d, core.AccountChange{fromHex(str), nil})
- } else if obj, ok := v.(map[string]interface{}); ok {
- d = append(d, mapToAccountChange(obj))
- } else if slice, ok := v.([]interface{}); ok {
+ d = append(d, fromHex(str))
+ } else if slice, ok := v.([]string); ok {
for _, item := range slice {
- d = append(d, makeAltered(item)...)
+ d = append(d, fromHex(item))
}
}
-
return
}
diff --git a/ui/qt/filter.go b/ui/qt/filter.go
index 423d5bd43..bd3ad0303 100644
--- a/ui/qt/filter.go
+++ b/ui/qt/filter.go
@@ -3,30 +3,27 @@ package qt
import (
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/ui"
- "gopkg.in/qml.v1"
+ "github.com/obscuren/qml"
)
func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core.Filter {
filter := ui.NewFilterFromMap(object, eth)
- if object["altered"] != nil {
- filter.Altered = makeAltered(object["altered"])
+ if object["topics"] != nil {
+ filter.SetTopics(makeTopics(object["topics"]))
}
return filter
}
-func makeAltered(v interface{}) (d []core.AccountChange) {
+func makeTopics(v interface{}) (d [][]byte) {
if qList, ok := v.(*qml.List); ok {
- var s []interface{}
+ var s []string
qList.Convert(&s)
- d = makeAltered(s)
- } else if qMap, ok := v.(*qml.Map); ok {
- var m map[string]interface{}
- qMap.Convert(&m)
-
- d = makeAltered(m)
+ d = ui.MakeTopics(s)
+ } else if str, ok := v.(string); ok {
+ d = ui.MakeTopics(str)
}
return
diff --git a/ui/qt/qwhisper/whisper.go b/ui/qt/qwhisper/whisper.go
index 644c147b7..22671f1b5 100644
--- a/ui/qt/qwhisper/whisper.go
+++ b/ui/qt/qwhisper/whisper.go
@@ -7,7 +7,7 @@ import (
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/whisper"
- "gopkg.in/qml.v1"
+ "github.com/obscuren/qml"
)
var qlogger = logger.NewLogger("QSHH")
diff --git a/ui/qt/webengine/all.cpp b/ui/qt/webengine/all.cpp
new file mode 100644
index 000000000..3b7c2f7b8
--- /dev/null
+++ b/ui/qt/webengine/all.cpp
@@ -0,0 +1 @@
+#include "cpp/webengine.cpp"
diff --git a/ui/qt/webengine/cpp/webengine.cpp b/ui/qt/webengine/cpp/webengine.cpp
new file mode 100644
index 000000000..118b451ef
--- /dev/null
+++ b/ui/qt/webengine/cpp/webengine.cpp
@@ -0,0 +1,6 @@
+#include <QtWebEngine>
+#include "webengine.h"
+
+void webengineInitialize() {
+ QtWebEngine::initialize();
+}
diff --git a/ui/qt/webengine/cpp/webengine.h b/ui/qt/webengine/cpp/webengine.h
new file mode 100644
index 000000000..9c3b13bfa
--- /dev/null
+++ b/ui/qt/webengine/cpp/webengine.h
@@ -0,0 +1,14 @@
+#ifndef WEBENGINE_H
+#define WEBENGINE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void webengineInitialize();
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // WEBENGINE_H
diff --git a/ui/qt/webengine/webengine.go b/ui/qt/webengine/webengine.go
new file mode 100644
index 000000000..600dbb6cb
--- /dev/null
+++ b/ui/qt/webengine/webengine.go
@@ -0,0 +1,18 @@
+package webengine
+
+// #cgo CPPFLAGS: -I./
+// #cgo CXXFLAGS: -std=c++0x -pedantic-errors -Wall -fno-strict-aliasing
+// #cgo LDFLAGS: -lstdc++
+// #cgo pkg-config: Qt5WebEngine
+//
+// #include "cpp/webengine.h"
+import "C"
+
+import "github.com/obscuren/qml"
+
+// Initializes the WebEngine extension.
+func Initialize() {
+ qml.RunMain(func() {
+ C.webengineInitialize()
+ })
+}
diff --git a/cmd/utils/websockets.go b/websocket/util.go
index 48ea4014b..3c1388de0 100644
--- a/cmd/utils/websockets.go
+++ b/websocket/util.go
@@ -1,24 +1,20 @@
/*
- This file is part of go-ethereum
+ This file is part of go-ethereum
- go-ethereum is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
+ go-ethereum is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
- go-ethereum is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ go-ethereum is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
+ You should have received a copy of the GNU General Public License
+ along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
*/
-/**
- * @authors
- * Jeffrey Wilcke <i@jev.io>
- */
-package utils
+package websocket
import (
"github.com/ethereum/go-ethereum/core"
@@ -26,15 +22,11 @@ import (
"github.com/ethereum/go-ethereum/eth"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/event/filter"
- "github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/ui"
- "github.com/ethereum/go-ethereum/websocket"
"github.com/ethereum/go-ethereum/xeth"
)
-var wslogger = logger.NewLogger("WS")
-
func args(v ...interface{}) []interface{} {
return v
}
@@ -54,8 +46,8 @@ func NewWebSocketServer(eth *eth.Ethereum) *WebSocketServer {
func (self *WebSocketServer) Serv() {
pipe := xeth.NewJSXEth(self.eth)
- wsServ := websocket.NewServer("/eth", ":40404")
- wsServ.MessageFunc(func(c *websocket.Client, msg *websocket.Message) {
+ wsServ := NewServer("/eth", ":40404")
+ wsServ.MessageFunc(func(c *Client, msg *Message) {
switch msg.Call {
case "compile":
data := ethutil.NewValue(msg.Args)
@@ -127,8 +119,8 @@ func (self *WebSocketServer) Serv() {
if mp, ok := msg.Args[0].(map[string]interface{}); ok {
var id int
filter := ui.NewFilterFromMap(mp, self.eth)
- filter.MessageCallback = func(messages state.Messages) {
- c.Event(toMessages(messages), "eth_changed", id)
+ filter.LogsCallback = func(logs state.Logs) {
+ //c.Event(toMessages(messages), "eth_changed", id)
}
id = self.filterManager.InstallFilter(filter)
c.Write(id, msg.Id)
@@ -144,7 +136,7 @@ func (self *WebSocketServer) Serv() {
case "eth_filterLogs":
filter := self.filterManager.GetFilter(int(msg.Arguments().Get(0).Uint()))
if filter != nil {
- c.Write(toMessages(filter.Find()), msg.Id)
+ //c.Write(toMessages(filter.Find()), msg.Id)
}
}
@@ -162,13 +154,6 @@ func toMessages(messages state.Messages) (msgs []xeth.JSMessage) {
return
}
-func StartWebSockets(eth *eth.Ethereum) {
- wslogger.Infoln("Starting WebSockets")
-
- sock := NewWebSocketServer(eth)
- go sock.Serv()
-}
-
// TODO This is starting to become a generic method. Move to utils
func mapToTxParams(object map[string]interface{}) map[string]string {
// Default values
diff --git a/xeth/config.go b/xeth/config.go
deleted file mode 100644
index ad0660d75..000000000
--- a/xeth/config.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package xeth
-
-import "github.com/ethereum/go-ethereum/ethutil"
-
-var cnfCtr = ethutil.Hex2Bytes("661005d2720d855f1d9976f88bb10c1a3398c77f")
-
-type Config struct {
- pipe *XEth
-}
-
-func (self *Config) Get(name string) *Object {
- configCtrl := self.pipe.World().safeGet(cnfCtr)
- var addr []byte
-
- switch name {
- case "NameReg":
- addr = []byte{0}
- case "DnsReg":
- objectAddr := configCtrl.GetStorage(ethutil.BigD([]byte{0}))
- domainAddr := (&Object{self.pipe.World().safeGet(objectAddr.Bytes())}).StorageString("DnsReg").Bytes()
- return &Object{self.pipe.World().safeGet(domainAddr)}
- case "MergeMining":
- addr = []byte{4}
- default:
- addr = ethutil.RightPadBytes([]byte(name), 32)
- }
-
- objectAddr := configCtrl.GetStorage(ethutil.BigD(addr))
-
- return &Object{self.pipe.World().safeGet(objectAddr.Bytes())}
-}
-
-func (self *Config) Exist() bool {
- return self.pipe.World().Get(cnfCtr) != nil
-}
diff --git a/xeth/hexface.go b/xeth/hexface.go
deleted file mode 100644
index 808ae7d39..000000000
--- a/xeth/hexface.go
+++ /dev/null
@@ -1,239 +0,0 @@
-package xeth
-
-import (
- "bytes"
- "encoding/json"
-
- "github.com/ethereum/go-ethereum/core"
- "github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/crypto"
- "github.com/ethereum/go-ethereum/ethutil"
- "github.com/ethereum/go-ethereum/state"
-)
-
-type JSXEth struct {
- *XEth
-}
-
-func NewJSXEth(eth core.EthManager) *JSXEth {
- return &JSXEth{New(eth)}
-}
-
-func (self *JSXEth) BlockByHash(strHash string) *JSBlock {
- hash := fromHex(strHash)
- block := self.obj.ChainManager().GetBlock(hash)
-
- return NewJSBlock(block)
-}
-
-func (self *JSXEth) BlockByNumber(num int32) *JSBlock {
- if num == -1 {
- return NewJSBlock(self.obj.ChainManager().CurrentBlock())
- }
-
- return NewJSBlock(self.obj.ChainManager().GetBlockByNumber(uint64(num)))
-}
-
-func (self *JSXEth) Block(v interface{}) *JSBlock {
- if n, ok := v.(int32); ok {
- return self.BlockByNumber(n)
- } else if str, ok := v.(string); ok {
- return self.BlockByHash(str)
- } else if f, ok := v.(float64); ok { // Don't ask ...
- return self.BlockByNumber(int32(f))
- }
-
- return nil
-}
-
-func (self *JSXEth) Key() *JSKey {
- return NewJSKey(self.obj.KeyManager().KeyPair())
-}
-
-func (self *JSXEth) Accounts() []string {
- return []string{toHex(self.obj.KeyManager().Address())}
-}
-
-func (self *JSXEth) StateObject(addr string) *JSObject {
- object := &Object{self.World().safeGet(fromHex(addr))}
-
- return NewJSObject(object)
-}
-
-func (self *JSXEth) PeerCount() int {
- return self.obj.PeerCount()
-}
-
-func (self *JSXEth) Peers() []JSPeer {
- var peers []JSPeer
- for _, peer := range self.obj.Peers() {
- peers = append(peers, *NewJSPeer(peer))
- }
-
- return peers
-}
-
-func (self *JSXEth) IsMining() bool {
- return self.obj.IsMining()
-}
-
-func (self *JSXEth) IsListening() bool {
- return self.obj.IsListening()
-}
-
-func (self *JSXEth) CoinBase() string {
- return toHex(self.obj.KeyManager().Address())
-}
-
-func (self *JSXEth) NumberToHuman(balance string) string {
- b := ethutil.Big(balance)
-
- return ethutil.CurrencyToString(b)
-}
-
-func (self *JSXEth) StorageAt(addr, storageAddr string) string {
- storage := self.World().SafeGet(fromHex(addr)).Storage(fromHex(storageAddr))
-
- return toHex(storage.Bytes())
-}
-
-func (self *JSXEth) BalanceAt(addr string) string {
- return self.World().SafeGet(fromHex(addr)).Balance().String()
-}
-
-func (self *JSXEth) TxCountAt(address string) int {
- return int(self.World().SafeGet(fromHex(address)).Nonce)
-}
-
-func (self *JSXEth) CodeAt(address string) string {
- return toHex(self.World().SafeGet(fromHex(address)).Code)
-}
-
-func (self *JSXEth) IsContract(address string) bool {
- return len(self.World().SafeGet(fromHex(address)).Code) > 0
-}
-
-func (self *JSXEth) SecretToAddress(key string) string {
- pair, err := crypto.NewKeyPairFromSec(fromHex(key))
- if err != nil {
- return ""
- }
-
- return toHex(pair.Address())
-}
-
-func (self *JSXEth) Execute(addr, value, gas, price, data string) (string, error) {
- ret, err := self.ExecuteObject(&Object{
- self.World().safeGet(fromHex(addr))},
- fromHex(data),
- ethutil.NewValue(value),
- ethutil.NewValue(gas),
- ethutil.NewValue(price),
- )
-
- return toHex(ret), err
-}
-
-type KeyVal struct {
- Key string `json:"key"`
- Value string `json:"value"`
-}
-
-func (self *JSXEth) EachStorage(addr string) string {
- var values []KeyVal
- object := self.World().SafeGet(fromHex(addr))
- it := object.Trie().Iterator()
- for it.Next() {
- values = append(values, KeyVal{toHex(it.Key), toHex(it.Value)})
- }
-
- valuesJson, err := json.Marshal(values)
- if err != nil {
- return ""
- }
-
- return string(valuesJson)
-}
-
-func (self *JSXEth) ToAscii(str string) string {
- padded := ethutil.RightPadBytes([]byte(str), 32)
-
- return "0x" + toHex(padded)
-}
-
-func (self *JSXEth) FromAscii(str string) string {
- if ethutil.IsHex(str) {
- str = str[2:]
- }
-
- return string(bytes.Trim(fromHex(str), "\x00"))
-}
-
-func (self *JSXEth) FromNumber(str string) string {
- if ethutil.IsHex(str) {
- str = str[2:]
- }
-
- return ethutil.BigD(fromHex(str)).String()
-}
-
-func (self *JSXEth) Transact(key, toStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, error) {
- var (
- to []byte
- value = ethutil.NewValue(valueStr)
- gas = ethutil.NewValue(gasStr)
- gasPrice = ethutil.NewValue(gasPriceStr)
- data []byte
- )
-
- data = fromHex(codeStr)
-
- to = fromHex(toStr)
-
- keyPair, err := crypto.NewKeyPairFromSec([]byte(fromHex(key)))
- if err != nil {
- return "", err
- }
-
- tx, err := self.XEth.Transact(keyPair, to, value, gas, gasPrice, data)
- if err != nil {
- return "", err
- }
- if types.IsContractAddr(to) {
- return toHex(core.AddressFromMessage(tx)), nil
- }
-
- return toHex(tx.Hash()), nil
-}
-
-func (self *JSXEth) PushTx(txStr string) (*JSReceipt, error) {
- tx := types.NewTransactionFromBytes(fromHex(txStr))
- err := self.obj.TxPool().Add(tx)
- if err != nil {
- return nil, err
- }
-
- return NewJSReciept(core.MessageCreatesContract(tx), core.AddressFromMessage(tx), tx.Hash(), tx.From()), nil
-}
-
-func (self *JSXEth) CompileMutan(code string) string {
- data, err := self.XEth.CompileMutan(code)
- if err != nil {
- return err.Error()
- }
-
- return toHex(data)
-}
-
-func (self *JSXEth) FindInConfig(str string) string {
- return toHex(self.World().Config().Get(str).Address())
-}
-
-func ToJSMessages(messages state.Messages) *ethutil.List {
- var msgs []JSMessage
- for _, m := range messages {
- msgs = append(msgs, NewJSMessage(m))
- }
-
- return ethutil.NewList(msgs)
-}
diff --git a/xeth/object.go b/xeth/object.go
deleted file mode 100644
index a4ac41e89..000000000
--- a/xeth/object.go
+++ /dev/null
@@ -1,26 +0,0 @@
-package xeth
-
-import (
- "github.com/ethereum/go-ethereum/ethutil"
- "github.com/ethereum/go-ethereum/state"
-)
-
-type Object struct {
- *state.StateObject
-}
-
-func (self *Object) StorageString(str string) *ethutil.Value {
- if ethutil.IsHex(str) {
- return self.Storage(ethutil.Hex2Bytes(str[2:]))
- } else {
- return self.Storage(ethutil.RightPadBytes([]byte(str), 32))
- }
-}
-
-func (self *Object) StorageValue(addr *ethutil.Value) *ethutil.Value {
- return self.Storage(addr.Bytes())
-}
-
-func (self *Object) Storage(addr []byte) *ethutil.Value {
- return self.StateObject.GetStorage(ethutil.BigD(addr))
-}
diff --git a/xeth/js_types.go b/xeth/types.go
index a0be996ff..4d8543eb1 100644
--- a/xeth/js_types.go
+++ b/xeth/types.go
@@ -25,8 +25,32 @@ func fromHex(s string) []byte {
return nil
}
+type Object struct {
+ *state.StateObject
+}
+
+func NewObject(state *state.StateObject) *Object {
+ return &Object{state}
+}
+
+func (self *Object) StorageString(str string) *ethutil.Value {
+ if ethutil.IsHex(str) {
+ return self.Storage(ethutil.Hex2Bytes(str[2:]))
+ } else {
+ return self.Storage(ethutil.RightPadBytes([]byte(str), 32))
+ }
+}
+
+func (self *Object) StorageValue(addr *ethutil.Value) *ethutil.Value {
+ return self.Storage(addr.Bytes())
+}
+
+func (self *Object) Storage(addr []byte) *ethutil.Value {
+ return self.StateObject.GetStorage(ethutil.BigD(addr))
+}
+
// Block interface exposed to QML
-type JSBlock struct {
+type Block struct {
//Transactions string `json:"transactions"`
ref *types.Block
Size string `json:"size"`
@@ -45,24 +69,24 @@ type JSBlock struct {
}
// Creates a new QML Block from a chain block
-func NewJSBlock(block *types.Block) *JSBlock {
+func NewBlock(block *types.Block) *Block {
if block == nil {
- return &JSBlock{}
+ return &Block{}
}
- ptxs := make([]*JSTransaction, len(block.Transactions()))
+ ptxs := make([]*Transaction, len(block.Transactions()))
for i, tx := range block.Transactions() {
- ptxs[i] = NewJSTx(tx)
+ ptxs[i] = NewTx(tx)
}
txlist := ethutil.NewList(ptxs)
- puncles := make([]*JSBlock, len(block.Uncles()))
+ puncles := make([]*Block, len(block.Uncles()))
for i, uncle := range block.Uncles() {
- puncles[i] = NewJSBlock(types.NewBlockWithHeader(uncle))
+ puncles[i] = NewBlock(types.NewBlockWithHeader(uncle))
}
ulist := ethutil.NewList(puncles)
- return &JSBlock{
+ return &Block{
ref: block, Size: block.Size().String(),
Number: int(block.NumberU64()), GasUsed: block.GasUsed().String(),
GasLimit: block.GasLimit().String(), Hash: toHex(block.Hash()),
@@ -75,7 +99,7 @@ func NewJSBlock(block *types.Block) *JSBlock {
}
}
-func (self *JSBlock) ToString() string {
+func (self *Block) ToString() string {
if self.ref != nil {
return self.ref.String()
}
@@ -83,16 +107,16 @@ func (self *JSBlock) ToString() string {
return ""
}
-func (self *JSBlock) GetTransaction(hash string) *JSTransaction {
+func (self *Block) GetTransaction(hash string) *Transaction {
tx := self.ref.Transaction(fromHex(hash))
if tx == nil {
return nil
}
- return NewJSTx(tx)
+ return NewTx(tx)
}
-type JSTransaction struct {
+type Transaction struct {
ref *types.Transaction
Value string `json:"value"`
@@ -108,7 +132,7 @@ type JSTransaction struct {
Confirmations int `json:"confirmations"`
}
-func NewJSTx(tx *types.Transaction) *JSTransaction {
+func NewTx(tx *types.Transaction) *Transaction {
hash := toHex(tx.Hash())
receiver := toHex(tx.To())
if receiver == "0000000000000000000000000000000000000000" {
@@ -124,29 +148,21 @@ func NewJSTx(tx *types.Transaction) *JSTransaction {
data = toHex(tx.Data())
}
- return &JSTransaction{ref: tx, Hash: hash, Value: ethutil.CurrencyToString(tx.Value()), Address: receiver, Contract: createsContract, Gas: tx.Gas().String(), GasPrice: tx.GasPrice().String(), Data: data, Sender: sender, CreatesContract: createsContract, RawData: toHex(tx.Data())}
+ return &Transaction{ref: tx, Hash: hash, Value: ethutil.CurrencyToString(tx.Value()), Address: receiver, Contract: createsContract, Gas: tx.Gas().String(), GasPrice: tx.GasPrice().String(), Data: data, Sender: sender, CreatesContract: createsContract, RawData: toHex(tx.Data())}
}
-func (self *JSTransaction) ToString() string {
+func (self *Transaction) ToString() string {
return self.ref.String()
}
-type JSKey struct {
+type Key struct {
Address string `json:"address"`
PrivateKey string `json:"privateKey"`
PublicKey string `json:"publicKey"`
}
-func NewJSKey(key *crypto.KeyPair) *JSKey {
- return &JSKey{toHex(key.Address()), toHex(key.PrivateKey), toHex(key.PublicKey)}
-}
-
-type JSObject struct {
- *Object
-}
-
-func NewJSObject(object *Object) *JSObject {
- return &JSObject{object}
+func NewKey(key *crypto.KeyPair) *Key {
+ return &Key{toHex(key.Address()), toHex(key.PrivateKey), toHex(key.PublicKey)}
}
type PReceipt struct {
@@ -167,20 +183,20 @@ func NewPReciept(contractCreation bool, creationAddress, hash, address []byte) *
// Peer interface exposed to QML
-type JSPeer struct {
+type Peer struct {
ref *p2p.Peer
Ip string `json:"ip"`
Version string `json:"version"`
Caps string `json:"caps"`
}
-func NewJSPeer(peer *p2p.Peer) *JSPeer {
+func NewPeer(peer *p2p.Peer) *Peer {
var caps []string
for _, cap := range peer.Caps() {
caps = append(caps, fmt.Sprintf("%s/%d", cap.Name, cap.Version))
}
- return &JSPeer{
+ return &Peer{
ref: peer,
Ip: fmt.Sprintf("%v", peer.RemoteAddr()),
Version: fmt.Sprintf("%v", peer.Identity()),
@@ -188,15 +204,15 @@ func NewJSPeer(peer *p2p.Peer) *JSPeer {
}
}
-type JSReceipt struct {
+type Receipt struct {
CreatedContract bool `json:"createdContract"`
Address string `json:"address"`
Hash string `json:"hash"`
Sender string `json:"sender"`
}
-func NewJSReciept(contractCreation bool, creationAddress, hash, address []byte) *JSReceipt {
- return &JSReceipt{
+func NewReciept(contractCreation bool, creationAddress, hash, address []byte) *Receipt {
+ return &Receipt{
contractCreation,
toHex(creationAddress),
toHex(hash),
@@ -204,7 +220,7 @@ func NewJSReciept(contractCreation bool, creationAddress, hash, address []byte)
}
}
-type JSMessage struct {
+type Message struct {
To string `json:"to"`
From string `json:"from"`
Input string `json:"input"`
@@ -218,8 +234,8 @@ type JSMessage struct {
Value string `json:"value"`
}
-func NewJSMessage(message *state.Message) JSMessage {
- return JSMessage{
+func NewMessage(message *state.Message) Message {
+ return Message{
To: toHex(message.To),
From: toHex(message.From),
Input: toHex(message.Input),
diff --git a/xeth/world.go b/xeth/world.go
index 25c2f3eb8..cdceec50d 100644
--- a/xeth/world.go
+++ b/xeth/world.go
@@ -1,63 +1,32 @@
package xeth
-import (
- "github.com/ethereum/go-ethereum/p2p"
- "github.com/ethereum/go-ethereum/state"
-)
-
-type World struct {
- pipe *XEth
- cfg *Config
-}
-
-func NewWorld(pipe *XEth) *World {
- world := &World{pipe, nil}
- world.cfg = &Config{pipe}
+import "github.com/ethereum/go-ethereum/state"
- return world
+type State struct {
+ xeth *XEth
}
-func (self *XEth) World() *World {
- return self.world
+func NewState(xeth *XEth) *State {
+ return &State{xeth}
}
-func (self *World) State() *state.StateDB {
- return self.pipe.chainManager.State()
+func (self *State) State() *state.StateDB {
+ return self.xeth.chainManager.State()
}
-func (self *World) Get(addr []byte) *Object {
- return &Object{self.State().GetStateObject(addr)}
+func (self *State) Get(addr string) *Object {
+ return &Object{self.State().GetStateObject(fromHex(addr))}
}
-func (self *World) SafeGet(addr []byte) *Object {
+func (self *State) SafeGet(addr string) *Object {
return &Object{self.safeGet(addr)}
}
-func (self *World) safeGet(addr []byte) *state.StateObject {
- object := self.State().GetStateObject(addr)
+func (self *State) safeGet(addr string) *state.StateObject {
+ object := self.State().GetStateObject(fromHex(addr))
if object == nil {
- object = state.NewStateObject(addr, self.pipe.obj.Db())
+ object = state.NewStateObject(fromHex(addr), self.xeth.eth.Db())
}
return object
}
-
-func (self *World) Coinbase() *state.StateObject {
- return nil
-}
-
-func (self *World) IsMining() bool {
- return self.pipe.obj.IsMining()
-}
-
-func (self *World) IsListening() bool {
- return self.pipe.obj.IsListening()
-}
-
-func (self *World) Peers() []*p2p.Peer {
- return self.pipe.obj.Peers()
-}
-
-func (self *World) Config() *Config {
- return self.cfg
-}
diff --git a/xeth/xeth.go b/xeth/xeth.go
index 34d8ffd0a..89b2459b0 100644
--- a/xeth/xeth.go
+++ b/xeth/xeth.go
@@ -5,6 +5,9 @@ package xeth
*/
import (
+ "bytes"
+ "encoding/json"
+
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
@@ -15,120 +18,215 @@ import (
var pipelogger = logger.NewLogger("XETH")
-type VmVars struct {
- State *state.StateDB
+// to resolve the import cycle
+type Backend interface {
+ BlockProcessor() *core.BlockProcessor
+ ChainManager() *core.ChainManager
+ KeyManager() *crypto.KeyManager
+ IsMining() bool
+ IsListening() bool
+ PeerCount() int
+ Db() ethutil.Database
+ TxPool() *core.TxPool
}
type XEth struct {
- obj core.EthManager
+ eth Backend
blockProcessor *core.BlockProcessor
chainManager *core.ChainManager
- world *World
+ world *State
+}
+
+func New(eth Backend) *XEth {
+ xeth := &XEth{
+ eth: eth,
+ blockProcessor: eth.BlockProcessor(),
+ chainManager: eth.ChainManager(),
+ }
+ xeth.world = NewState(xeth)
+
+ return xeth
+}
+
+func (self *XEth) State() *State { return self.world }
+
+func (self *XEth) BlockByHash(strHash string) *Block {
+ hash := fromHex(strHash)
+ block := self.chainManager.GetBlock(hash)
- Vm VmVars
+ return NewBlock(block)
}
-func New(obj core.EthManager) *XEth {
- pipe := &XEth{
- obj: obj,
- blockProcessor: obj.BlockProcessor(),
- chainManager: obj.ChainManager(),
+func (self *XEth) BlockByNumber(num int32) *Block {
+ if num == -1 {
+ return NewBlock(self.chainManager.CurrentBlock())
}
- pipe.world = NewWorld(pipe)
- return pipe
+ return NewBlock(self.chainManager.GetBlockByNumber(uint64(num)))
}
-/*
- * State / Account accessors
- */
-func (self *XEth) Balance(addr []byte) *ethutil.Value {
- return ethutil.NewValue(self.World().safeGet(addr).Balance)
+func (self *XEth) Block(v interface{}) *Block {
+ if n, ok := v.(int32); ok {
+ return self.BlockByNumber(n)
+ } else if str, ok := v.(string); ok {
+ return self.BlockByHash(str)
+ } else if f, ok := v.(float64); ok { // Don't ask ...
+ return self.BlockByNumber(int32(f))
+ }
+
+ return nil
+}
+
+func (self *XEth) Accounts() []string {
+ return []string{toHex(self.eth.KeyManager().Address())}
+}
+
+func (self *XEth) PeerCount() int {
+ return self.eth.PeerCount()
}
-func (self *XEth) Nonce(addr []byte) uint64 {
- return self.World().safeGet(addr).Nonce
+func (self *XEth) IsMining() bool {
+ return self.eth.IsMining()
}
-func (self *XEth) Block(hash []byte) *types.Block {
- return self.chainManager.GetBlock(hash)
+func (self *XEth) IsListening() bool {
+ return self.eth.IsListening()
}
-func (self *XEth) Storage(addr, storageAddr []byte) *ethutil.Value {
- return self.World().safeGet(addr).GetStorage(ethutil.BigD(storageAddr))
+func (self *XEth) Coinbase() string {
+ return toHex(self.eth.KeyManager().Address())
}
-func (self *XEth) Exists(addr []byte) bool {
- return self.World().Get(addr) != nil
+func (self *XEth) NumberToHuman(balance string) string {
+ b := ethutil.Big(balance)
+
+ return ethutil.CurrencyToString(b)
+}
+
+func (self *XEth) StorageAt(addr, storageAddr string) string {
+ storage := self.State().SafeGet(addr).StorageString(storageAddr)
+
+ return toHex(storage.Bytes())
}
-// Converts the given private key to an address
-func (self *XEth) ToAddress(priv []byte) []byte {
- pair, err := crypto.NewKeyPairFromSec(priv)
+func (self *XEth) BalanceAt(addr string) string {
+ return self.State().SafeGet(addr).Balance().String()
+}
+
+func (self *XEth) TxCountAt(address string) int {
+ return int(self.State().SafeGet(address).Nonce)
+}
+
+func (self *XEth) CodeAt(address string) string {
+ return toHex(self.State().SafeGet(address).Code)
+}
+
+func (self *XEth) IsContract(address string) bool {
+ return len(self.State().SafeGet(address).Code) > 0
+}
+
+func (self *XEth) SecretToAddress(key string) string {
+ pair, err := crypto.NewKeyPairFromSec(fromHex(key))
if err != nil {
- return nil
+ return ""
}
- return pair.Address()
+ return toHex(pair.Address())
}
-/*
- * Execution helpers
- */
-func (self *XEth) Execute(addr []byte, data []byte, value, gas, price *ethutil.Value) ([]byte, error) {
- return self.ExecuteObject(&Object{self.World().safeGet(addr)}, data, value, gas, price)
+func (self *XEth) Execute(addr, value, gas, price, data string) (string, error) {
+ return "", nil
}
-func (self *XEth) ExecuteObject(object *Object, data []byte, value, gas, price *ethutil.Value) ([]byte, error) {
- var (
- initiator = state.NewStateObject(self.obj.KeyManager().KeyPair().Address(), self.obj.Db())
- block = self.chainManager.CurrentBlock()
- )
+type KeyVal struct {
+ Key string `json:"key"`
+ Value string `json:"value"`
+}
- self.Vm.State = self.World().State().Copy()
+func (self *XEth) EachStorage(addr string) string {
+ var values []KeyVal
+ object := self.State().SafeGet(addr)
+ it := object.Trie().Iterator()
+ for it.Next() {
+ values = append(values, KeyVal{toHex(it.Key), toHex(it.Value)})
+ }
- vmenv := NewEnv(self.chainManager, self.Vm.State, block, value.BigInt(), initiator.Address())
- return vmenv.Call(initiator, object.Address(), data, gas.BigInt(), price.BigInt(), value.BigInt())
+ valuesJson, err := json.Marshal(values)
+ if err != nil {
+ return ""
+ }
+
+ return string(valuesJson)
}
-/*
- * Transactional methods
- */
-func (self *XEth) TransactString(key *crypto.KeyPair, rec string, value, gas, price *ethutil.Value, data []byte) (*types.Transaction, error) {
- // Check if an address is stored by this address
- var hash []byte
- addr := self.World().Config().Get("NameReg").StorageString(rec).Bytes()
- if len(addr) > 0 {
- hash = addr
- } else if ethutil.IsHex(rec) {
- hash = ethutil.Hex2Bytes(rec[2:])
- } else {
- hash = ethutil.Hex2Bytes(rec)
+func (self *XEth) ToAscii(str string) string {
+ padded := ethutil.RightPadBytes([]byte(str), 32)
+
+ return "0x" + toHex(padded)
+}
+
+func (self *XEth) FromAscii(str string) string {
+ if ethutil.IsHex(str) {
+ str = str[2:]
}
- return self.Transact(key, hash, value, gas, price, data)
+ return string(bytes.Trim(fromHex(str), "\x00"))
}
-func (self *XEth) Transact(key *crypto.KeyPair, to []byte, value, gas, price *ethutil.Value, data []byte) (*types.Transaction, error) {
- var hash []byte
- var contractCreation bool
- if types.IsContractAddr(to) {
+func (self *XEth) FromNumber(str string) string {
+ if ethutil.IsHex(str) {
+ str = str[2:]
+ }
+
+ return ethutil.BigD(fromHex(str)).String()
+}
+
+func ToMessages(messages state.Messages) *ethutil.List {
+ var msgs []Message
+ for _, m := range messages {
+ msgs = append(msgs, NewMessage(m))
+ }
+
+ return ethutil.NewList(msgs)
+}
+
+func (self *XEth) PushTx(encodedTx string) (string, error) {
+ tx := types.NewTransactionFromBytes(fromHex(encodedTx))
+ err := self.eth.TxPool().Add(tx)
+ if err != nil {
+ return "", err
+ }
+
+ if tx.To() == nil {
+ addr := core.AddressFromMessage(tx)
+ return toHex(addr), nil
+ }
+ return toHex(tx.Hash()), nil
+}
+
+func (self *XEth) Transact(toStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, error) {
+
+ var (
+ to []byte
+ value = ethutil.NewValue(valueStr)
+ gas = ethutil.NewValue(gasStr)
+ price = ethutil.NewValue(gasPriceStr)
+ data []byte
+ key = self.eth.KeyManager().KeyPair()
+ contractCreation bool
+ )
+
+ data = fromHex(codeStr)
+ to = fromHex(toStr)
+ if len(to) == 0 {
contractCreation = true
- } else {
- // Check if an address is stored by this address
- addr := self.World().Config().Get("NameReg").Storage(to).Bytes()
- if len(addr) > 0 {
- hash = addr
- } else {
- hash = to
- }
}
var tx *types.Transaction
if contractCreation {
tx = types.NewContractCreationTx(value.BigInt(), gas.BigInt(), price.BigInt(), data)
} else {
- tx = types.NewTransactionMessage(hash, value.BigInt(), gas.BigInt(), price.BigInt(), data)
+ tx = types.NewTransactionMessage(to, value.BigInt(), gas.BigInt(), price.BigInt(), data)
}
state := self.chainManager.TransState()
@@ -143,9 +241,9 @@ func (self *XEth) Transact(key *crypto.KeyPair, to []byte, value, gas, price *et
coinbase.SetGasPool(block.GasLimit())
self.blockProcessor.ApplyTransactions(coinbase, state, block, types.Transactions{tx}, true)
- err := self.obj.TxPool().Add(tx)
+ err := self.eth.TxPool().Add(tx)
if err != nil {
- return nil, err
+ return "", err
}
state.SetNonce(key.Address(), nonce+1)
@@ -154,28 +252,9 @@ func (self *XEth) Transact(key *crypto.KeyPair, to []byte, value, gas, price *et
pipelogger.Infof("Contract addr %x\n", addr)
}
- return tx, nil
-}
-
-func (self *XEth) PushTx(tx *types.Transaction) ([]byte, error) {
- err := self.obj.TxPool().Add(tx)
- if err != nil {
- return nil, err
- }
-
- if tx.To() == nil {
- addr := core.AddressFromMessage(tx)
- pipelogger.Infof("Contract addr %x\n", addr)
- return addr, nil
- }
- return tx.Hash(), nil
-}
-
-func (self *XEth) CompileMutan(code string) ([]byte, error) {
- data, err := ethutil.Compile(code, false)
- if err != nil {
- return nil, err
+ if types.IsContractAddr(to) {
+ return toHex(core.AddressFromMessage(tx)), nil
}
- return data, nil
+ return toHex(tx.Hash()), nil
}