Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
whqwjb
go-ethereum
提交
292f7ada
G
go-ethereum
项目概览
whqwjb
/
go-ethereum
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
go-ethereum
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
292f7ada
编写于
2月 04, 2015
作者:
O
obscuren
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'develop' into miner
上级
65158d39
7c278d6a
变更
35
展开全部
显示空白变更内容
内联
并排
Showing
35 changed file
with
1340 addition
and
482 deletion
+1340
-482
cmd/mist/assets/ext/ethereum.js/bower.json
cmd/mist/assets/ext/ethereum.js/bower.json
+1
-1
cmd/mist/assets/ext/ethereum.js/dist/ethereum.js.map
cmd/mist/assets/ext/ethereum.js/dist/ethereum.js.map
+20
-8
cmd/mist/assets/ext/ethereum.js/dist/ethereum.min.js
cmd/mist/assets/ext/ethereum.js/dist/ethereum.min.js
+1
-1
cmd/mist/assets/ext/ethereum.js/example/balance.html
cmd/mist/assets/ext/ethereum.js/example/balance.html
+4
-0
cmd/mist/assets/ext/ethereum.js/example/contract.html
cmd/mist/assets/ext/ethereum.js/example/contract.html
+1
-0
cmd/mist/assets/ext/ethereum.js/example/contract_with_array.html
...t/assets/ext/ethereum.js/example/contract_with_array.html
+76
-0
cmd/mist/assets/ext/ethereum.js/example/event.html
cmd/mist/assets/ext/ethereum.js/example/event.html
+120
-0
cmd/mist/assets/ext/ethereum.js/example/event_inc.html
cmd/mist/assets/ext/ethereum.js/example/event_inc.html
+66
-0
cmd/mist/assets/ext/ethereum.js/example/natspec_contract.html
...mist/assets/ext/ethereum.js/example/natspec_contract.html
+1
-0
cmd/mist/assets/ext/ethereum.js/lib/abi.js
cmd/mist/assets/ext/ethereum.js/lib/abi.js
+50
-250
cmd/mist/assets/ext/ethereum.js/lib/const.js
cmd/mist/assets/ext/ethereum.js/lib/const.js
+56
-0
cmd/mist/assets/ext/ethereum.js/lib/contract.js
cmd/mist/assets/ext/ethereum.js/lib/contract.js
+142
-70
cmd/mist/assets/ext/ethereum.js/lib/event.js
cmd/mist/assets/ext/ethereum.js/lib/event.js
+135
-0
cmd/mist/assets/ext/ethereum.js/lib/filter.js
cmd/mist/assets/ext/ethereum.js/lib/filter.js
+30
-2
cmd/mist/assets/ext/ethereum.js/lib/formatters.js
cmd/mist/assets/ext/ethereum.js/lib/formatters.js
+154
-0
cmd/mist/assets/ext/ethereum.js/lib/httpsync.js
cmd/mist/assets/ext/ethereum.js/lib/httpsync.js
+4
-28
cmd/mist/assets/ext/ethereum.js/lib/jsonrpc.js
cmd/mist/assets/ext/ethereum.js/lib/jsonrpc.js
+65
-0
cmd/mist/assets/ext/ethereum.js/lib/providermanager.js
cmd/mist/assets/ext/ethereum.js/lib/providermanager.js
+27
-18
cmd/mist/assets/ext/ethereum.js/lib/qtsync.js
cmd/mist/assets/ext/ethereum.js/lib/qtsync.js
+2
-1
cmd/mist/assets/ext/ethereum.js/lib/types.js
cmd/mist/assets/ext/ethereum.js/lib/types.js
+79
-0
cmd/mist/assets/ext/ethereum.js/lib/utils.js
cmd/mist/assets/ext/ethereum.js/lib/utils.js
+142
-0
cmd/mist/assets/ext/ethereum.js/lib/web3.js
cmd/mist/assets/ext/ethereum.js/lib/web3.js
+22
-93
cmd/mist/assets/ext/ethereum.js/package.json
cmd/mist/assets/ext/ethereum.js/package.json
+1
-1
cmd/mist/assets/ext/ethereum.js/test/db.methods.js
cmd/mist/assets/ext/ethereum.js/test/db.methods.js
+1
-1
cmd/mist/assets/ext/ethereum.js/test/eth.methods.js
cmd/mist/assets/ext/ethereum.js/test/eth.methods.js
+1
-1
cmd/mist/assets/ext/ethereum.js/test/shh.methods.js
cmd/mist/assets/ext/ethereum.js/test/shh.methods.js
+1
-1
cmd/mist/assets/ext/ethereum.js/test/web3.methods.js
cmd/mist/assets/ext/ethereum.js/test/web3.methods.js
+1
-1
tests/files/BlockchainTests/badBlockChain.json
tests/files/BlockchainTests/badBlockChain.json
+0
-0
tests/files/BlockchainTests/basicBlockChain.json
tests/files/BlockchainTests/basicBlockChain.json
+0
-0
tests/files/StateTests/stRefundTest.json
tests/files/StateTests/stRefundTest.json
+40
-0
tests/files/VMTests/RandomTests/201502031248CPPJIT.json
tests/files/VMTests/RandomTests/201502031248CPPJIT.json
+31
-0
tests/files/VMTests/RandomTests/201502032117GO.json
tests/files/VMTests/RandomTests/201502032117GO.json
+59
-0
tests/files/index.js
tests/files/index.js
+2
-2
tests/files/package.json
tests/files/package.json
+1
-1
vm/vm.go
vm/vm.go
+4
-2
未找到文件。
cmd/mist/assets/ext/ethereum.js/bower.json
浏览文件 @
292f7ada
{
"name"
:
"ethereum.js"
,
"namespace"
:
"ethereum"
,
"version"
:
"0.0.1
0
"
,
"version"
:
"0.0.1
3
"
,
"description"
:
"Ethereum Compatible JavaScript API"
,
"main"
:
[
"./dist/ethereum.js"
,
"./dist/ethereum.min.js"
],
"dependencies"
:
{
...
...
cmd/mist/assets/ext/ethereum.js/dist/ethereum.js.map
浏览文件 @
292f7ada
此差异已折叠。
点击以展开。
cmd/mist/assets/ext/ethereum.js/dist/ethereum.min.js
浏览文件 @
292f7ada
此差异已折叠。
点击以展开。
cmd/mist/assets/ext/ethereum.js/example/balance.html
浏览文件 @
292f7ada
...
...
@@ -17,7 +17,11 @@
var
originalBalance
=
web3
.
toDecimal
(
balance
);
document
.
getElementById
(
'
original
'
).
innerText
=
'
original balance:
'
+
originalBalance
+
'
watching...
'
;
<<<<<<<
HEAD
:
cmd
/
mist
/
assets
/
ext
/
ethereum
.
js
/
example
/
balance
.
html
var
filter
=
web3
.
eth
.
watch
({
address
:
coinbase
}).
changed
(
function
()
{
=======
web3
.
eth
.
watch
(
'
pending
'
).
changed
(
function
()
{
>>>>>>>
859
a1999cb204d2c6fcb08d6569c738c5af5cd86
:
example
/
balance
.
html
balance
=
web3
.
eth
.
balanceAt
(
coinbase
)
var
currentBalance
=
web3
.
toDecimal
(
balance
);
document
.
getElementById
(
"
current
"
).
innerText
=
'
current:
'
+
currentBalance
;
...
...
cmd/mist/assets/ext/ethereum.js/example/contract.html
浏览文件 @
292f7ada
...
...
@@ -20,6 +20,7 @@
// contract description, this will be autogenerated somehow
var
desc
=
[{
"
name
"
:
"
multiply(uint256)
"
,
"
type
"
:
"
function
"
,
"
inputs
"
:
[
{
"
name
"
:
"
a
"
,
...
...
cmd/mist/assets/ext/ethereum.js/example/contract_with_array.html
0 → 100644
浏览文件 @
292f7ada
<
!
doctype
>
<html>
<head>
<script
type=
"text/javascript"
src=
"js/bignumber.js/bignumber.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
.
HttpSyncProvider
());
// solidity source code
var
source
=
""
+
"
contract test {
\n
"
+
"
function multiply(uint[] a) returns(uint d) {
\n
"
+
"
return a[0] + a[1];
\n
"
+
"
}
\n
"
+
"
}
\n
"
;
// contract description, this will be autogenerated somehow
var
desc
=
[{
"
name
"
:
"
multiply(uint256[])
"
,
"
type
"
:
"
function
"
,
"
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
var
address
=
web3
.
eth
.
transact
({
code
:
web3
.
eth
.
solidity
(
source
)});
contract
=
web3
.
eth
.
contract
(
address
,
desc
);
document
.
getElementById
(
'
call
'
).
style
.
visibility
=
'
visible
'
;
}
function
callExampleContract
()
{
// this should be generated by ethereum
var
param
=
parseInt
(
document
.
getElementById
(
'
value
'
).
value
);
var
param2
=
parseInt
(
document
.
getElementById
(
'
value2
'
).
value
);
// call the contract
var
res
=
contract
.
call
().
multiply
([
param
,
param2
]);
document
.
getElementById
(
'
result
'
).
innerText
=
res
.
toString
(
10
);
}
</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>
<input
type=
"number"
id=
"value2"
onkeyup=
'callExampleContract()'
></input>
</div>
<div
id=
"result"
></div>
</body>
</html>
cmd/mist/assets/ext/ethereum.js/example/event.html
0 → 100644
浏览文件 @
292f7ada
<
!
doctype
>
<html>
<head>
<script
type=
"text/javascript"
src=
"js/bignumber.js/bignumber.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
.
HttpSyncProvider
(
'
http://localhost:8080
'
));
var
desc
=
[{
"
type
"
:
"
event
"
,
"
inputs
"
:
[{
"
name
"
:
"
a
"
,
"
type
"
:
"
uint256
"
,
"
indexed
"
:
true
},{
"
name
"
:
"
b
"
,
"
type
"
:
"
hash256
"
,
"
indexed
"
:
false
}],
"
name
"
:
"
Event
"
},
{
"
type
"
:
"
event
"
,
"
inputs
"
:
[{
"
name
"
:
"
a
"
,
"
type
"
:
"
uint256
"
,
"
indexed
"
:
true
},{
"
name
"
:
"
b
"
,
"
type
"
:
"
hash256
"
,
"
indexed
"
:
false
}],
"
name
"
:
"
Event2
"
},
{
"
type
"
:
"
function
"
,
"
inputs
"
:
[{
"
name
"
:
"
a
"
,
"
type
"
:
"
uint256
"
}],
"
name
"
:
"
foo
"
,
"
outputs
"
:
[]
}];
var
address
=
'
0x01
'
;
var
contract
=
web3
.
eth
.
contract
(
address
,
desc
);
function
test1
()
{
// "{"topic":["0x83c9849c","0xc4d76332"],"address":"0x01"}"
web3
.
eth
.
watch
(
contract
).
changed
(
function
(
res
)
{
});
};
function
test2
()
{
// "{"topic":["0x83c9849c"],"address":"0x01"}"
web3
.
eth
.
watch
(
contract
.
Event
).
changed
(
function
(
res
)
{
});
};
function
test3
()
{
// "{"topic":["0x83c9849c"],"address":"0x01"}"
contract
.
Event
().
changed
(
function
(
res
)
{
});
};
function
test4
()
{
// "{"topic":["0x83c9849c","0000000000000000000000000000000000000000000000000000000000000045"],"address":"0x01"}"
contract
.
Event
({
a
:
69
}).
changed
(
function
(
res
)
{
});
};
function
test5
()
{
// "{"topic":["0x83c9849c",["0000000000000000000000000000000000000000000000000000000000000045","000000000000000000000000000000000000000000000000000000000000002a"]],"address":"0x01"}"
contract
.
Event
({
a
:
[
69
,
42
]}).
changed
(
function
(
res
)
{
});
};
function
test6
()
{
// "{"topic":["0x83c9849c","000000000000000000000000000000000000000000000000000000000000001e"],"max":100,"address":"0x01"}"
contract
.
Event
({
a
:
30
},
{
max
:
100
}).
changed
(
function
(
res
)
{
});
};
function
test7
()
{
// "{"topic":["0x83c9849c","000000000000000000000000000000000000000000000000000000000000001e"],"address":"0x01"}"
web3
.
eth
.
watch
(
contract
.
Event
,
{
a
:
30
}).
changed
(
function
(
res
)
{
});
};
function
test8
()
{
// "{"topic":["0x83c9849c","000000000000000000000000000000000000000000000000000000000000001e"],"max":100,"address":"0x01"}"
web3
.
eth
.
watch
(
contract
.
Event
,
{
a
:
30
},
{
max
:
100
}).
changed
(
function
(
res
)
{
});
};
// not valid
// function testX() {
// web3.eth.watch([contract.Event, contract.Event2]).changed(function (res) {
// });
// };
</script>
</head>
<body>
<div>
<button
type=
"button"
onClick=
"test1();"
>
test1
</button>
</div>
<div>
<button
type=
"button"
onClick=
"test2();"
>
test2
</button>
</div>
<div>
<button
type=
"button"
onClick=
"test3();"
>
test3
</button>
</div>
<div>
<button
type=
"button"
onClick=
"test4();"
>
test4
</button>
</div>
<div>
<button
type=
"button"
onClick=
"test5();"
>
test5
</button>
</div>
<div>
<button
type=
"button"
onClick=
"test6();"
>
test6
</button>
</div>
<div>
<button
type=
"button"
onClick=
"test7();"
>
test7
</button>
</div>
<div>
<button
type=
"button"
onClick=
"test8();"
>
test8
</button>
</div>
</body>
</html>
cmd/mist/assets/ext/ethereum.js/example/event_inc.html
0 → 100644
浏览文件 @
292f7ada
<
!
doctype
>
<html>
<head>
<script
type=
"text/javascript"
src=
"js/bignumber.js/bignumber.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
.
HttpSyncProvider
(
'
http://localhost:8080
'
));
var
source
=
""
+
"
contract Contract {
"
+
"
event Incremented(bool indexed odd, uint x);
"
+
"
function Contract() {
"
+
"
x = 69;
"
+
"
}
"
+
"
function inc() {
"
+
"
++x;
"
+
"
Incremented(x % 2 == 1, x);
"
+
"
}
"
+
"
uint x;
"
+
"
}
"
;
var
desc
=
[{
"
type
"
:
"
event
"
,
"
name
"
:
"
Incremented
"
,
"
inputs
"
:
[{
"
name
"
:
"
odd
"
,
"
type
"
:
"
bool
"
,
"
indexed
"
:
true
},{
"
name
"
:
"
x
"
,
"
type
"
:
"
uint
"
,
"
indexed
"
:
false
}],
},
{
"
type
"
:
"
function
"
,
"
name
"
:
"
inc
"
,
"
inputs
"
:
[],
"
outputs
"
:
[]
}];
var
address
;
var
contract
;
var
update
=
function
(
x
)
{
document
.
getElementById
(
'
result
'
).
innerText
=
JSON
.
stringify
(
x
);
};
var
createContract
=
function
()
{
address
=
web3
.
eth
.
transact
({
code
:
web3
.
eth
.
solidity
(
source
)});
contract
=
web3
.
eth
.
contract
(
address
,
desc
);
contract
.
Incremented
({
odd
:
true
}).
changed
(
update
);
};
var
callContract
=
function
()
{
contract
.
call
().
inc
();
};
</script>
</head>
<body>
<div>
<button
type=
"button"
onClick=
"createContract();"
>
create contract
</button>
</div>
<div>
<button
type=
"button"
onClick=
"callContract();"
>
test1
</button>
</div>
<div
id=
"result"
>
</div>
</body>
</html>
cmd/mist/assets/ext/ethereum.js/example/natspec_contract.html
浏览文件 @
292f7ada
...
...
@@ -21,6 +21,7 @@
// contract description, this will be autogenerated somehow
var
desc
=
[{
"
name
"
:
"
multiply(uint256)
"
,
"
type
"
:
"
function
"
,
"
inputs
"
:
[
{
"
name
"
:
"
a
"
,
...
...
cmd/mist/assets/ext/ethereum.js/lib/abi.js
浏览文件 @
292f7ada
...
...
@@ -21,175 +21,57 @@
* @date 2014
*/
// TODO: is these line is supposed to be here?
if
(
process
.
env
.
NODE_ENV
!==
'
build
'
)
{
var
BigNumber
=
require
(
'
bignumber.js
'
);
// jshint ignore:line
}
var
web3
=
require
(
'
./web3
'
);
var
utils
=
require
(
'
./utils
'
);
var
types
=
require
(
'
./types
'
);
var
c
=
require
(
'
./const
'
);
var
f
=
require
(
'
./formatters
'
);
var
web3
=
require
(
'
./web3
'
);
// jshint ignore:line
BigNumber
.
config
({
ROUNDING_MODE
:
BigNumber
.
ROUND_DOWN
});
var
ETH_PADDING
=
32
;
/// method signature length in bytes
var
ETH_METHOD_SIGNATURE_LENGTH
=
4
;
/// Finds first index of array element matching pattern
/// @param array
/// @param callback pattern
/// @returns index of element
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
;
};
/// @returns a function that is used as a pattern for 'findIndex'
var
findMethodIndex
=
function
(
json
,
methodName
)
{
return
findIndex
(
json
,
function
(
method
)
{
return
method
.
name
===
methodName
;
});
};
/// @returns method with given method name
var
getMethodWithName
=
function
(
json
,
methodName
)
{
var
index
=
findMethodIndex
(
json
,
methodName
);
if
(
index
===
-
1
)
{
console
.
error
(
'
method
'
+
methodName
+
'
not found in the abi
'
);
return
undefined
;
}
return
json
[
index
];
};
/// @param string string to be padded
/// @param number of characters that result string should have
/// @param sign, by default 0
/// @returns right aligned string
var
padLeft
=
function
(
string
,
chars
,
sign
)
{
return
new
Array
(
chars
-
string
.
length
+
1
).
join
(
sign
?
sign
:
"
0
"
)
+
string
;
};
/// @param expected type prefix (string)
/// @returns function which checks if type has matching prefix. if yes, returns true, otherwise false
var
prefixedType
=
function
(
prefix
)
{
return
function
(
type
)
{
return
type
.
indexOf
(
prefix
)
===
0
;
};
};
/// @param expected type name (string)
/// @returns function which checks if type is matching expected one. if yes, returns true, otherwise false
var
namedType
=
function
(
name
)
{
return
function
(
type
)
{
return
name
===
type
;
};
var
displayTypeError
=
function
(
type
)
{
console
.
error
(
'
parser does not support type:
'
+
type
);
};
/// This method should be called if we want to check if givent type is an array type
/// @returns true if it is, otherwise false
var
arrayType
=
function
(
type
)
{
return
type
.
slice
(
-
2
)
===
'
[]
'
;
};
/// Formats input value to byte representation of int
/// If value is negative, return it's two's complement
/// If the value is floating point, round it down
/// @returns right-aligned byte representation of int
var
formatInputInt
=
function
(
value
)
{
var
padding
=
ETH_PADDING
*
2
;
if
(
value
instanceof
BigNumber
||
typeof
value
===
'
number
'
)
{
if
(
typeof
value
===
'
number
'
)
value
=
new
BigNumber
(
value
);
value
=
value
.
round
();
if
(
value
.
lessThan
(
0
))
value
=
new
BigNumber
(
"
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
"
,
16
).
plus
(
value
).
plus
(
1
);
value
=
value
.
toString
(
16
);
}
else
if
(
value
.
indexOf
(
'
0x
'
)
===
0
)
value
=
value
.
substr
(
2
);
else
if
(
typeof
value
===
'
string
'
)
value
=
formatInputInt
(
new
BigNumber
(
value
));
else
value
=
(
+
value
).
toString
(
16
);
return
padLeft
(
value
,
padding
);
};
/// Formats input value to byte representation of string
/// @returns left-algined byte representation of string
var
formatInputString
=
function
(
value
)
{
return
web3
.
fromAscii
(
value
,
ETH_PADDING
).
substr
(
2
);
};
/// Formats input value to byte representation of bool
/// @returns right-aligned byte representation bool
var
formatInputBool
=
function
(
value
)
{
return
'
000000000000000000000000000000000000000000000000000000000000000
'
+
(
value
?
'
1
'
:
'
0
'
);
};
/// Formats input value to byte representation of real
/// Values are multiplied by 2^m and encoded as integers
/// @returns byte representation of real
var
formatInputReal
=
function
(
value
)
{
return
formatInputInt
(
new
BigNumber
(
value
).
times
(
new
BigNumber
(
2
).
pow
(
128
)));
};
var
dynamicTypeBytes
=
function
(
type
,
value
)
{
// TODO: decide what to do with array of strings
if
(
arrayType
(
type
)
||
type
===
'
string
'
)
// only string itself that is dynamic; stringX is static length.
return
formatInputInt
(
value
.
length
);
return
f
.
f
ormatInputInt
(
value
.
length
);
return
""
;
};
/// Setups input formatters for solidity types
/// @returns an array of input formatters
var
setupInputTypes
=
function
()
{
return
[
{
type
:
prefixedType
(
'
uint
'
),
format
:
formatInputInt
},
{
type
:
prefixedType
(
'
int
'
),
format
:
formatInputInt
},
{
type
:
prefixedType
(
'
hash
'
),
format
:
formatInputInt
},
{
type
:
prefixedType
(
'
string
'
),
format
:
formatInputString
},
{
type
:
prefixedType
(
'
real
'
),
format
:
formatInputReal
},
{
type
:
prefixedType
(
'
ureal
'
),
format
:
formatInputReal
},
{
type
:
namedType
(
'
address
'
),
format
:
formatInputInt
},
{
type
:
namedType
(
'
bool
'
),
format
:
formatInputBool
}
];
};
var
inputTypes
=
setupInputTypes
();
var
inputTypes
=
types
.
inputTypes
();
/// Formats input params to bytes
/// @param contract json abi
/// @param name of the method that we want to use
/// @param abi contract method inputs
/// @param array of params that will be formatted to bytes
/// @returns bytes representation of input params
var
toAbiInput
=
function
(
json
,
methodName
,
params
)
{
var
formatInput
=
function
(
inputs
,
params
)
{
var
bytes
=
""
;
var
method
=
getMethodWithName
(
json
,
methodName
);
var
padding
=
ETH_PADDING
*
2
;
var
padding
=
c
.
ETH_PADDING
*
2
;
/// first we iterate in search for dynamic
method
.
inputs
.
forEach
(
function
(
input
,
index
)
{
inputs
.
forEach
(
function
(
input
,
index
)
{
bytes
+=
dynamicTypeBytes
(
input
.
type
,
params
[
index
]);
});
method
.
inputs
.
forEach
(
function
(
input
,
i
)
{
inputs
.
forEach
(
function
(
input
,
i
)
{
var
typeMatch
=
false
;
for
(
var
j
=
0
;
j
<
inputTypes
.
length
&&
!
typeMatch
;
j
++
)
{
typeMatch
=
inputTypes
[
j
].
type
(
method
.
inputs
[
i
].
type
,
params
[
i
]);
typeMatch
=
inputTypes
[
j
].
type
(
inputs
[
i
].
type
,
params
[
i
]);
}
if
(
!
typeMatch
)
{
console
.
error
(
'
input parser does not support type:
'
+
method
.
inputs
[
i
].
type
);
displayTypeError
(
inputs
[
i
].
type
);
}
var
formatter
=
inputTypes
[
j
-
1
].
format
;
var
toAppend
=
""
;
if
(
arrayType
(
method
.
inputs
[
i
].
type
))
if
(
arrayType
(
inputs
[
i
].
type
))
toAppend
=
params
[
i
].
reduce
(
function
(
acc
,
curr
)
{
return
acc
+
formatter
(
curr
);
},
""
);
...
...
@@ -201,118 +83,44 @@ var toAbiInput = function (json, methodName, params) {
return
bytes
;
};
/// Check if input value is negative
/// @param value is hex format
/// @returns true if it is negative, otherwise false
var
signedIsNegative
=
function
(
value
)
{
return
(
new
BigNumber
(
value
.
substr
(
0
,
1
),
16
).
toString
(
2
).
substr
(
0
,
1
))
===
'
1
'
;
};
/// Formats input right-aligned input bytes to int
/// @returns right-aligned input bytes formatted to int
var
formatOutputInt
=
function
(
value
)
{
value
=
value
||
"
0
"
;
// check if it's negative number
// it it is, return two's complement
if
(
signedIsNegative
(
value
))
{
return
new
BigNumber
(
value
,
16
).
minus
(
new
BigNumber
(
'
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
'
,
16
)).
minus
(
1
);
}
return
new
BigNumber
(
value
,
16
);
};
/// Formats big right-aligned input bytes to uint
/// @returns right-aligned input bytes formatted to uint
var
formatOutputUInt
=
function
(
value
)
{
value
=
value
||
"
0
"
;
return
new
BigNumber
(
value
,
16
);
};
/// @returns input bytes formatted to real
var
formatOutputReal
=
function
(
value
)
{
return
formatOutputInt
(
value
).
dividedBy
(
new
BigNumber
(
2
).
pow
(
128
));
};
/// @returns input bytes formatted to ureal
var
formatOutputUReal
=
function
(
value
)
{
return
formatOutputUInt
(
value
).
dividedBy
(
new
BigNumber
(
2
).
pow
(
128
));
};
/// @returns right-aligned input bytes formatted to hex
var
formatOutputHash
=
function
(
value
)
{
return
"
0x
"
+
value
;
};
/// @returns right-aligned input bytes formatted to bool
var
formatOutputBool
=
function
(
value
)
{
return
value
===
'
0000000000000000000000000000000000000000000000000000000000000001
'
?
true
:
false
;
};
/// @returns left-aligned input bytes formatted to ascii string
var
formatOutputString
=
function
(
value
)
{
return
web3
.
toAscii
(
value
);
};
/// @returns right-aligned input bytes formatted to address
var
formatOutputAddress
=
function
(
value
)
{
return
"
0x
"
+
value
.
slice
(
value
.
length
-
40
,
value
.
length
);
};
var
dynamicBytesLength
=
function
(
type
)
{
if
(
arrayType
(
type
)
||
type
===
'
string
'
)
// only string itself that is dynamic; stringX is static length.
return
ETH_PADDING
*
2
;
return
c
.
ETH_PADDING
*
2
;
return
0
;
};
/// Setups output formaters for solidity types
/// @returns an array of output formatters
var
setupOutputTypes
=
function
()
{
return
[
{
type
:
prefixedType
(
'
uint
'
),
format
:
formatOutputUInt
},
{
type
:
prefixedType
(
'
int
'
),
format
:
formatOutputInt
},
{
type
:
prefixedType
(
'
hash
'
),
format
:
formatOutputHash
},
{
type
:
prefixedType
(
'
string
'
),
format
:
formatOutputString
},
{
type
:
prefixedType
(
'
real
'
),
format
:
formatOutputReal
},
{
type
:
prefixedType
(
'
ureal
'
),
format
:
formatOutputUReal
},
{
type
:
namedType
(
'
address
'
),
format
:
formatOutputAddress
},
{
type
:
namedType
(
'
bool
'
),
format
:
formatOutputBool
}
];
};
var
outputTypes
=
setupOutputTypes
();
var
outputTypes
=
types
.
outputTypes
();
/// Formats output bytes back to param list
/// @param contract json abi
/// @param name of the method that we want to use
/// @param contract abi method outputs
/// @param bytes representtion of output
/// @returns array of output params
var
f
romAbiOutput
=
function
(
json
,
methodName
,
output
)
{
var
f
ormatOutput
=
function
(
outs
,
output
)
{
output
=
output
.
slice
(
2
);
var
result
=
[];
var
method
=
getMethodWithName
(
json
,
methodName
);
var
padding
=
ETH_PADDING
*
2
;
var
padding
=
c
.
ETH_PADDING
*
2
;
var
dynamicPartLength
=
method
.
outp
uts
.
reduce
(
function
(
acc
,
curr
)
{
var
dynamicPartLength
=
o
uts
.
reduce
(
function
(
acc
,
curr
)
{
return
acc
+
dynamicBytesLength
(
curr
.
type
);
},
0
);
var
dynamicPart
=
output
.
slice
(
0
,
dynamicPartLength
);
output
=
output
.
slice
(
dynamicPartLength
);
method
.
outp
uts
.
forEach
(
function
(
out
,
i
)
{
o
uts
.
forEach
(
function
(
out
,
i
)
{
var
typeMatch
=
false
;
for
(
var
j
=
0
;
j
<
outputTypes
.
length
&&
!
typeMatch
;
j
++
)
{
typeMatch
=
outputTypes
[
j
].
type
(
method
.
outp
uts
[
i
].
type
);
typeMatch
=
outputTypes
[
j
].
type
(
o
uts
[
i
].
type
);
}
if
(
!
typeMatch
)
{
console
.
error
(
'
output parser does not support type:
'
+
method
.
outp
uts
[
i
].
type
);
displayTypeError
(
o
uts
[
i
].
type
);
}
var
formatter
=
outputTypes
[
j
-
1
].
format
;
if
(
arrayType
(
method
.
outp
uts
[
i
].
type
))
{
var
size
=
formatOutputUInt
(
dynamicPart
.
slice
(
0
,
padding
));
if
(
arrayType
(
o
uts
[
i
].
type
))
{
var
size
=
f
.
f
ormatOutputUInt
(
dynamicPart
.
slice
(
0
,
padding
));
dynamicPart
=
dynamicPart
.
slice
(
padding
);
var
array
=
[];
for
(
var
k
=
0
;
k
<
size
;
k
++
)
{
...
...
@@ -321,7 +129,7 @@ var fromAbiOutput = function (json, methodName, output) {
}
result
.
push
(
array
);
}
else
if
(
prefixedType
(
'
string
'
)(
method
.
outp
uts
[
i
].
type
))
{
else
if
(
types
.
prefixedType
(
'
string
'
)(
o
uts
[
i
].
type
))
{
dynamicPart
=
dynamicPart
.
slice
(
padding
);
result
.
push
(
formatter
(
output
.
slice
(
0
,
padding
)));
output
=
output
.
slice
(
padding
);
...
...
@@ -334,30 +142,18 @@ var fromAbiOutput = function (json, methodName, output) {
return
result
;
};
/// @returns display name for method eg. multiply(uint256) -> multiply
var
methodDisplayName
=
function
(
method
)
{
var
length
=
method
.
indexOf
(
'
(
'
);
return
length
!==
-
1
?
method
.
substr
(
0
,
length
)
:
method
;
};
/// @returns overloaded part of method's name
var
methodTypeName
=
function
(
method
)
{
/// TODO: make it not vulnerable
var
length
=
method
.
indexOf
(
'
(
'
);
return
length
!==
-
1
?
method
.
substr
(
length
+
1
,
method
.
length
-
1
-
(
length
+
1
))
:
""
;
};
/// @param json abi for contract
/// @returns input parser object for given json abi
/// TODO: refactor creating the parser, do not double logic from contract
var
inputParser
=
function
(
json
)
{
var
parser
=
{};
json
.
forEach
(
function
(
method
)
{
var
displayName
=
method
DisplayName
(
method
.
name
);
var
typeName
=
method
TypeName
(
method
.
name
);
var
displayName
=
utils
.
extract
DisplayName
(
method
.
name
);
var
typeName
=
utils
.
extract
TypeName
(
method
.
name
);
var
impl
=
function
()
{
var
params
=
Array
.
prototype
.
slice
.
call
(
arguments
);
return
toAbiInput
(
json
,
method
.
name
,
params
);
return
formatInput
(
method
.
inputs
,
params
);
};
if
(
parser
[
displayName
]
===
undefined
)
{
...
...
@@ -376,11 +172,11 @@ var outputParser = function (json) {
var
parser
=
{};
json
.
forEach
(
function
(
method
)
{
var
displayName
=
method
DisplayName
(
method
.
name
);
var
typeName
=
method
TypeName
(
method
.
name
);
var
displayName
=
utils
.
extract
DisplayName
(
method
.
name
);
var
typeName
=
utils
.
extract
TypeName
(
method
.
name
);
var
impl
=
function
(
output
)
{
return
f
romAbiOutput
(
json
,
method
.
name
,
output
);
return
f
ormatOutput
(
method
.
outputs
,
output
);
};
if
(
parser
[
displayName
]
===
undefined
)
{
...
...
@@ -393,18 +189,22 @@ var outputParser = function (json) {
return
parser
;
};
/// @param method name for which we want to get method signature
/// @returns (promise) contract method signature for method with given name
var
methodSignature
=
function
(
name
)
{
return
web3
.
sha3
(
web3
.
fromAscii
(
name
)).
slice
(
0
,
2
+
ETH_METHOD_SIGNATURE_LENGTH
*
2
);
/// @param function/event name for which we want to get signature
/// @returns signature of function/event with given name
var
signatureFromAscii
=
function
(
name
)
{
return
web3
.
sha3
(
web3
.
fromAscii
(
name
)).
slice
(
0
,
2
+
c
.
ETH_SIGNATURE_LENGTH
*
2
);
};
var
eventSignatureFromAscii
=
function
(
name
)
{
return
web3
.
sha3
(
web3
.
fromAscii
(
name
));
};
module
.
exports
=
{
inputParser
:
inputParser
,
outputParser
:
outputParser
,
methodSignature
:
methodSignature
,
methodDisplayName
:
methodDisplayName
,
methodTypeName
:
methodTypeName
,
getMethodWithName
:
getMethodWithName
formatInput
:
formatInput
,
formatOutput
:
formatOutput
,
signatureFromAscii
:
signatureFromAscii
,
eventSignatureFromAscii
:
eventSignatureFromAscii
};
cmd/mist/assets/ext/ethereum.js/lib/const.js
0 → 100644
浏览文件 @
292f7ada
/*
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 const.js
* @authors:
* Marek Kotewicz <marek@ethdev.com>
* @date 2015
*/
/// required to define ETH_BIGNUMBER_ROUNDING_MODE
if
(
process
.
env
.
NODE_ENV
!==
'
build
'
)
{
var
BigNumber
=
require
(
'
bignumber.js
'
);
// jshint ignore:line
}
var
ETH_UNITS
=
[
'
wei
'
,
'
Kwei
'
,
'
Mwei
'
,
'
Gwei
'
,
'
szabo
'
,
'
finney
'
,
'
ether
'
,
'
grand
'
,
'
Mether
'
,
'
Gether
'
,
'
Tether
'
,
'
Pether
'
,
'
Eether
'
,
'
Zether
'
,
'
Yether
'
,
'
Nether
'
,
'
Dether
'
,
'
Vether
'
,
'
Uether
'
];
module
.
exports
=
{
ETH_PADDING
:
32
,
ETH_SIGNATURE_LENGTH
:
4
,
ETH_UNITS
:
ETH_UNITS
,
ETH_BIGNUMBER_ROUNDING_MODE
:
{
ROUNDING_MODE
:
BigNumber
.
ROUND_DOWN
}
};
cmd/mist/assets/ext/ethereum.js/lib/contract.js
浏览文件 @
292f7ada
...
...
@@ -20,98 +20,78 @@
* @date 2014
*/
var
web3
=
require
(
'
./web3
'
);
// jshint ignore:line
var
web3
=
require
(
'
./web3
'
);
var
abi
=
require
(
'
./abi
'
);
var
utils
=
require
(
'
./utils
'
);
var
eventImpl
=
require
(
'
./event
'
);
/**
* This method should be called when we want to call / transact some solidity method from javascript
* it returns an object which has same methods available as solidity contract description
* usage example:
*
* var abi = [{
* name: 'myMethod',
* inputs: [{ name: 'a', type: 'string' }],
* outputs: [{name: 'd', type: 'string' }]
* }]; // contract abi
*
* var myContract = web3.eth.contract('0x0123123121', abi); // creation of contract object
*
* myContract.myMethod('this is test string param for call'); // myMethod call (implicit, default)
* myContract.call().myMethod('this is test string param for call'); // myMethod call (explicit)
* myContract.transact().myMethod('this is test string param for transact'); // myMethod transact
*
* @param address - address of the contract, which should be called
* @param desc - abi json description of the contract, which is being created
* @returns contract object
*/
var
contract
=
function
(
address
,
desc
)
{
desc
.
forEach
(
function
(
method
)
{
// workaround for invalid assumption that method.name is the full anonymous prototype of the method.
// it's not. it's just the name. the rest of the code assumes it's actually the anonymous
// prototype, so we make it so as a workaround.
if
(
method
.
name
.
indexOf
(
'
(
'
)
===
-
1
)
{
var
displayName
=
method
.
name
;
var
typeName
=
method
.
inputs
.
map
(
function
(
i
){
return
i
.
type
;
}).
join
();
method
.
name
=
displayName
+
'
(
'
+
typeName
+
'
)
'
;
}
});
var
inputParser
=
abi
.
inputParser
(
desc
);
var
outputParser
=
abi
.
outputParser
(
desc
);
var
exportNatspecGlobals
=
function
(
vars
)
{
// it's used byt natspec.js
// TODO: figure out better way to solve this
web3
.
_currentContractAbi
=
vars
.
abi
;
web3
.
_currentContractAddress
=
vars
.
address
;
web3
.
_currentContractMethodName
=
vars
.
method
;
web3
.
_currentContractMethodParams
=
vars
.
params
;
};
var
result
=
{};
var
addFunctionRelatedPropertiesToContract
=
function
(
contract
)
{
resul
t
.
call
=
function
(
options
)
{
resul
t
.
_isTransact
=
false
;
resul
t
.
_options
=
options
;
return
resul
t
;
contrac
t
.
call
=
function
(
options
)
{
contrac
t
.
_isTransact
=
false
;
contrac
t
.
_options
=
options
;
return
contrac
t
;
};
resul
t
.
transact
=
function
(
options
)
{
resul
t
.
_isTransact
=
true
;
resul
t
.
_options
=
options
;
return
resul
t
;
contrac
t
.
transact
=
function
(
options
)
{
contrac
t
.
_isTransact
=
true
;
contrac
t
.
_options
=
options
;
return
contrac
t
;
};
resul
t
.
_options
=
{};
contrac
t
.
_options
=
{};
[
'
gas
'
,
'
gasPrice
'
,
'
value
'
,
'
from
'
].
forEach
(
function
(
p
)
{
resul
t
[
p
]
=
function
(
v
)
{
resul
t
.
_options
[
p
]
=
v
;
return
resul
t
;
contrac
t
[
p
]
=
function
(
v
)
{
contrac
t
.
_options
[
p
]
=
v
;
return
contrac
t
;
};
});
};
desc
.
forEach
(
function
(
method
)
{
var
addFunctionsToContract
=
function
(
contract
,
desc
,
address
)
{
var
inputParser
=
abi
.
inputParser
(
desc
);
var
outputParser
=
abi
.
outputParser
(
desc
);
// create contract functions
utils
.
filterFunctions
(
desc
).
forEach
(
function
(
method
)
{
var
displayName
=
abi
.
method
DisplayName
(
method
.
name
);
var
typeName
=
abi
.
method
TypeName
(
method
.
name
);
var
displayName
=
utils
.
extract
DisplayName
(
method
.
name
);
var
typeName
=
utils
.
extract
TypeName
(
method
.
name
);
var
impl
=
function
()
{
var
params
=
Array
.
prototype
.
slice
.
call
(
arguments
);
var
signature
=
abi
.
methodSignature
(
method
.
name
);
var
signature
=
abi
.
signatureFromAscii
(
method
.
name
);
var
parsed
=
inputParser
[
displayName
][
typeName
].
apply
(
null
,
params
);
var
options
=
resul
t
.
_options
||
{};
var
options
=
contrac
t
.
_options
||
{};
options
.
to
=
address
;
options
.
data
=
signature
+
parsed
;
var
isTransact
=
result
.
_isTransact
===
true
||
(
resul
t
.
_isTransact
!==
false
&&
!
method
.
constant
);
var
isTransact
=
contract
.
_isTransact
===
true
||
(
contrac
t
.
_isTransact
!==
false
&&
!
method
.
constant
);
var
collapse
=
options
.
collapse
!==
false
;
// reset
resul
t
.
_options
=
{};
resul
t
.
_isTransact
=
null
;
contrac
t
.
_options
=
{};
contrac
t
.
_isTransact
=
null
;
if
(
isTransact
)
{
// it's used byt natspec.js
// TODO: figure out better way to solve this
web3
.
_currentContractAbi
=
desc
;
web3
.
_currentContractAddress
=
address
;
web3
.
_currentContractMethodName
=
method
.
name
;
web3
.
_currentContractMethodParams
=
params
;
exportNatspecGlobals
({
abi
:
desc
,
address
:
address
,
method
:
method
.
name
,
params
:
params
});
// transactions do not have any output, cause we do not know, when they will be processed
web3
.
eth
.
transact
(
options
);
...
...
@@ -130,13 +110,105 @@ var contract = function (address, desc) {
return
ret
;
};
if
(
resul
t
[
displayName
]
===
undefined
)
{
resul
t
[
displayName
]
=
impl
;
if
(
contrac
t
[
displayName
]
===
undefined
)
{
contrac
t
[
displayName
]
=
impl
;
}
result
[
displayName
][
typeName
]
=
impl
;
contract
[
displayName
][
typeName
]
=
impl
;
});
};
var
addEventRelatedPropertiesToContract
=
function
(
contract
,
desc
,
address
)
{
contract
.
address
=
address
;
contract
.
_onWatchEventResult
=
function
(
data
)
{
var
matchingEvent
=
event
.
getMatchingEvent
(
utils
.
filterEvents
(
desc
));
var
parser
=
eventImpl
.
outputParser
(
matchingEvent
);
return
parser
(
data
);
};
Object
.
defineProperty
(
contract
,
'
topic
'
,
{
get
:
function
()
{
return
utils
.
filterEvents
(
desc
).
map
(
function
(
e
)
{
return
abi
.
eventSignatureFromAscii
(
e
.
name
);
});
}
});
};
var
addEventsToContract
=
function
(
contract
,
desc
,
address
)
{
// create contract events
utils
.
filterEvents
(
desc
).
forEach
(
function
(
e
)
{
var
impl
=
function
()
{
var
params
=
Array
.
prototype
.
slice
.
call
(
arguments
);
var
signature
=
abi
.
eventSignatureFromAscii
(
e
.
name
);
var
event
=
eventImpl
.
inputParser
(
address
,
signature
,
e
);
var
o
=
event
.
apply
(
null
,
params
);
o
.
_onWatchEventResult
=
function
(
data
)
{
var
parser
=
eventImpl
.
outputParser
(
e
);
return
parser
(
data
);
};
return
web3
.
eth
.
watch
(
o
);
};
// this property should be used by eth.filter to check if object is an event
impl
.
_isEvent
=
true
;
var
displayName
=
utils
.
extractDisplayName
(
e
.
name
);
var
typeName
=
utils
.
extractTypeName
(
e
.
name
);
if
(
contract
[
displayName
]
===
undefined
)
{
contract
[
displayName
]
=
impl
;
}
contract
[
displayName
][
typeName
]
=
impl
;
});
};
/**
* This method should be called when we want to call / transact some solidity method from javascript
* it returns an object which has same methods available as solidity contract description
* usage example:
*
* var abi = [{
* name: 'myMethod',
* inputs: [{ name: 'a', type: 'string' }],
* outputs: [{name: 'd', type: 'string' }]
* }]; // contract abi
*
* var myContract = web3.eth.contract('0x0123123121', abi); // creation of contract object
*
* myContract.myMethod('this is test string param for call'); // myMethod call (implicit, default)
* myContract.call().myMethod('this is test string param for call'); // myMethod call (explicit)
* myContract.transact().myMethod('this is test string param for transact'); // myMethod transact
*
* @param address - address of the contract, which should be called
* @param desc - abi json description of the contract, which is being created
* @returns contract object
*/
var
contract
=
function
(
address
,
desc
)
{
// workaround for invalid assumption that method.name is the full anonymous prototype of the method.
// it's not. it's just the name. the rest of the code assumes it's actually the anonymous
// prototype, so we make it so as a workaround.
// TODO: we may not want to modify input params, maybe use copy instead?
desc
.
forEach
(
function
(
method
)
{
if
(
method
.
name
.
indexOf
(
'
(
'
)
===
-
1
)
{
var
displayName
=
method
.
name
;
var
typeName
=
method
.
inputs
.
map
(
function
(
i
){
return
i
.
type
;
}).
join
();
method
.
name
=
displayName
+
'
(
'
+
typeName
+
'
)
'
;
}
});
var
result
=
{};
addFunctionRelatedPropertiesToContract
(
result
);
addFunctionsToContract
(
result
,
desc
,
address
);
addEventRelatedPropertiesToContract
(
result
,
desc
,
address
);
addEventsToContract
(
result
,
desc
,
address
);
return
result
;
};
...
...
cmd/mist/assets/ext/ethereum.js/lib/event.js
0 → 100644
浏览文件 @
292f7ada
/*
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 event.js
* @authors:
* Marek Kotewicz <marek@ethdev.com>
* @date 2014
*/
var
abi
=
require
(
'
./abi
'
);
var
utils
=
require
(
'
./utils
'
);
/// filter inputs array && returns only indexed (or not) inputs
/// @param inputs array
/// @param bool if result should be an array of indexed params on not
/// @returns array of (not?) indexed params
var
filterInputs
=
function
(
inputs
,
indexed
)
{
return
inputs
.
filter
(
function
(
current
)
{
return
current
.
indexed
===
indexed
;
});
};
var
inputWithName
=
function
(
inputs
,
name
)
{
var
index
=
utils
.
findIndex
(
inputs
,
function
(
input
)
{
return
input
.
name
===
name
;
});
if
(
index
===
-
1
)
{
console
.
error
(
'
indexed param with name
'
+
name
+
'
not found
'
);
return
undefined
;
}
return
inputs
[
index
];
};
var
indexedParamsToTopics
=
function
(
event
,
indexed
)
{
// sort keys?
return
Object
.
keys
(
indexed
).
map
(
function
(
key
)
{
var
inputs
=
[
inputWithName
(
filterInputs
(
event
.
inputs
,
true
),
key
)];
var
value
=
indexed
[
key
];
if
(
value
instanceof
Array
)
{
return
value
.
map
(
function
(
v
)
{
return
abi
.
formatInput
(
inputs
,
[
v
]);
});
}
return
abi
.
formatInput
(
inputs
,
[
value
]);
});
};
var
inputParser
=
function
(
address
,
signature
,
event
)
{
// valid options are 'earliest', 'latest', 'offset' and 'max', as defined for 'eth.watch'
return
function
(
indexed
,
options
)
{
var
o
=
options
||
{};
o
.
address
=
address
;
o
.
topic
=
[];
o
.
topic
.
push
(
signature
);
if
(
indexed
)
{
o
.
topic
=
o
.
topic
.
concat
(
indexedParamsToTopics
(
event
,
indexed
));
}
return
o
;
};
};
var
getArgumentsObject
=
function
(
inputs
,
indexed
,
notIndexed
)
{
var
indexedCopy
=
indexed
.
slice
();
var
notIndexedCopy
=
notIndexed
.
slice
();
return
inputs
.
reduce
(
function
(
acc
,
current
)
{
var
value
;
if
(
current
.
indexed
)
value
=
indexed
.
splice
(
0
,
1
)[
0
];
else
value
=
notIndexed
.
splice
(
0
,
1
)[
0
];
acc
[
current
.
name
]
=
value
;
return
acc
;
},
{});
};
var
outputParser
=
function
(
event
)
{
return
function
(
output
)
{
var
result
=
{
event
:
utils
.
extractDisplayName
(
event
.
name
),
number
:
output
.
number
,
args
:
{}
};
if
(
!
output
.
topic
)
{
return
result
;
}
var
indexedOutputs
=
filterInputs
(
event
.
inputs
,
true
);
var
indexedData
=
"
0x
"
+
output
.
topic
.
slice
(
1
,
output
.
topic
.
length
).
map
(
function
(
topic
)
{
return
topic
.
slice
(
2
);
}).
join
(
""
);
var
indexedRes
=
abi
.
formatOutput
(
indexedOutputs
,
indexedData
);
var
notIndexedOutputs
=
filterInputs
(
event
.
inputs
,
false
);
var
notIndexedRes
=
abi
.
formatOutput
(
notIndexedOutputs
,
output
.
data
);
result
.
args
=
getArgumentsObject
(
event
.
inputs
,
indexedRes
,
notIndexedRes
);
return
result
;
};
};
var
getMatchingEvent
=
function
(
events
,
payload
)
{
for
(
var
i
=
0
;
i
<
events
.
length
;
i
++
)
{
var
signature
=
abi
.
eventSignatureFromAscii
(
events
[
i
].
name
);
if
(
signature
===
payload
.
topic
[
0
])
{
return
events
[
i
];
}
}
return
undefined
;
};
module
.
exports
=
{
inputParser
:
inputParser
,
outputParser
:
outputParser
,
getMatchingEvent
:
getMatchingEvent
};
cmd/mist/assets/ext/ethereum.js/lib/filter.js
浏览文件 @
292f7ada
...
...
@@ -27,18 +27,45 @@ var web3 = require('./web3'); // jshint ignore:line
/// should be used when we want to watch something
/// it's using inner polling mechanism and is notified about changes
/// TODO: change 'options' name cause it may be not the best matching one, since we have events
var
Filter
=
function
(
options
,
impl
)
{
if
(
typeof
options
!==
"
string
"
)
{
// topics property is deprecated, warn about it!
if
(
options
.
topics
)
{
console
.
warn
(
'
"topics" is deprecated, use "topic" instead
'
);
}
this
.
_onWatchResult
=
options
.
_onWatchEventResult
;
// evaluate lazy properties
options
=
{
to
:
options
.
to
,
topic
:
options
.
topic
,
earliest
:
options
.
earliest
,
latest
:
options
.
latest
,
max
:
options
.
max
,
skip
:
options
.
skip
,
address
:
options
.
address
};
}
this
.
impl
=
impl
;
this
.
callbacks
=
[];
this
.
id
=
impl
.
newFilter
(
options
);
web3
.
provider
.
startPolling
({
call
:
impl
.
changed
,
arg
s
:
[
this
.
id
]},
this
.
id
,
this
.
trigger
.
bind
(
this
));
web3
.
provider
.
startPolling
({
method
:
impl
.
changed
,
param
s
:
[
this
.
id
]},
this
.
id
,
this
.
trigger
.
bind
(
this
));
};
/// alias for changed*
Filter
.
prototype
.
arrived
=
function
(
callback
)
{
this
.
changed
(
callback
);
};
Filter
.
prototype
.
happened
=
function
(
callback
)
{
this
.
changed
(
callback
);
};
/// gets called when there is new eth/shh message
Filter
.
prototype
.
changed
=
function
(
callback
)
{
...
...
@@ -49,7 +76,8 @@ Filter.prototype.changed = function(callback) {
Filter
.
prototype
.
trigger
=
function
(
messages
)
{
for
(
var
i
=
0
;
i
<
this
.
callbacks
.
length
;
i
++
)
{
for
(
var
j
=
0
;
j
<
messages
.
length
;
j
++
)
{
this
.
callbacks
[
i
].
call
(
this
,
messages
[
j
]);
var
message
=
this
.
_onWatchResult
?
this
.
_onWatchResult
(
messages
[
j
])
:
messages
[
j
];
this
.
callbacks
[
i
].
call
(
this
,
message
);
}
}
};
...
...
cmd/mist/assets/ext/ethereum.js/lib/formatters.js
0 → 100644
浏览文件 @
292f7ada
/*
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 formatters.js
* @authors:
* Marek Kotewicz <marek@ethdev.com>
* @date 2015
*/
if
(
process
.
env
.
NODE_ENV
!==
'
build
'
)
{
var
BigNumber
=
require
(
'
bignumber.js
'
);
// jshint ignore:line
}
var
utils
=
require
(
'
./utils
'
);
var
c
=
require
(
'
./const
'
);
/// @param string string to be padded
/// @param number of characters that result string should have
/// @param sign, by default 0
/// @returns right aligned string
var
padLeft
=
function
(
string
,
chars
,
sign
)
{
return
new
Array
(
chars
-
string
.
length
+
1
).
join
(
sign
?
sign
:
"
0
"
)
+
string
;
};
/// Formats input value to byte representation of int
/// If value is negative, return it's two's complement
/// If the value is floating point, round it down
/// @returns right-aligned byte representation of int
var
formatInputInt
=
function
(
value
)
{
var
padding
=
c
.
ETH_PADDING
*
2
;
if
(
value
instanceof
BigNumber
||
typeof
value
===
'
number
'
)
{
if
(
typeof
value
===
'
number
'
)
value
=
new
BigNumber
(
value
);
BigNumber
.
config
(
c
.
ETH_BIGNUMBER_ROUNDING_MODE
);
value
=
value
.
round
();
if
(
value
.
lessThan
(
0
))
value
=
new
BigNumber
(
"
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
"
,
16
).
plus
(
value
).
plus
(
1
);
value
=
value
.
toString
(
16
);
}
else
if
(
value
.
indexOf
(
'
0x
'
)
===
0
)
value
=
value
.
substr
(
2
);
else
if
(
typeof
value
===
'
string
'
)
value
=
formatInputInt
(
new
BigNumber
(
value
));
else
value
=
(
+
value
).
toString
(
16
);
return
padLeft
(
value
,
padding
);
};
/// Formats input value to byte representation of string
/// @returns left-algined byte representation of string
var
formatInputString
=
function
(
value
)
{
return
utils
.
fromAscii
(
value
,
c
.
ETH_PADDING
).
substr
(
2
);
};
/// Formats input value to byte representation of bool
/// @returns right-aligned byte representation bool
var
formatInputBool
=
function
(
value
)
{
return
'
000000000000000000000000000000000000000000000000000000000000000
'
+
(
value
?
'
1
'
:
'
0
'
);
};
/// Formats input value to byte representation of real
/// Values are multiplied by 2^m and encoded as integers
/// @returns byte representation of real
var
formatInputReal
=
function
(
value
)
{
return
formatInputInt
(
new
BigNumber
(
value
).
times
(
new
BigNumber
(
2
).
pow
(
128
)));
};
/// Check if input value is negative
/// @param value is hex format
/// @returns true if it is negative, otherwise false
var
signedIsNegative
=
function
(
value
)
{
return
(
new
BigNumber
(
value
.
substr
(
0
,
1
),
16
).
toString
(
2
).
substr
(
0
,
1
))
===
'
1
'
;
};
/// Formats input right-aligned input bytes to int
/// @returns right-aligned input bytes formatted to int
var
formatOutputInt
=
function
(
value
)
{
value
=
value
||
"
0
"
;
// check if it's negative number
// it it is, return two's complement
if
(
signedIsNegative
(
value
))
{
return
new
BigNumber
(
value
,
16
).
minus
(
new
BigNumber
(
'
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
'
,
16
)).
minus
(
1
);
}
return
new
BigNumber
(
value
,
16
);
};
/// Formats big right-aligned input bytes to uint
/// @returns right-aligned input bytes formatted to uint
var
formatOutputUInt
=
function
(
value
)
{
value
=
value
||
"
0
"
;
return
new
BigNumber
(
value
,
16
);
};
/// @returns input bytes formatted to real
var
formatOutputReal
=
function
(
value
)
{
return
formatOutputInt
(
value
).
dividedBy
(
new
BigNumber
(
2
).
pow
(
128
));
};
/// @returns input bytes formatted to ureal
var
formatOutputUReal
=
function
(
value
)
{
return
formatOutputUInt
(
value
).
dividedBy
(
new
BigNumber
(
2
).
pow
(
128
));
};
/// @returns right-aligned input bytes formatted to hex
var
formatOutputHash
=
function
(
value
)
{
return
"
0x
"
+
value
;
};
/// @returns right-aligned input bytes formatted to bool
var
formatOutputBool
=
function
(
value
)
{
return
value
===
'
0000000000000000000000000000000000000000000000000000000000000001
'
?
true
:
false
;
};
/// @returns left-aligned input bytes formatted to ascii string
var
formatOutputString
=
function
(
value
)
{
return
utils
.
toAscii
(
value
);
};
/// @returns right-aligned input bytes formatted to address
var
formatOutputAddress
=
function
(
value
)
{
return
"
0x
"
+
value
.
slice
(
value
.
length
-
40
,
value
.
length
);
};
module
.
exports
=
{
formatInputInt
:
formatInputInt
,
formatInputString
:
formatInputString
,
formatInputBool
:
formatInputBool
,
formatInputReal
:
formatInputReal
,
formatOutputInt
:
formatOutputInt
,
formatOutputUInt
:
formatOutputUInt
,
formatOutputReal
:
formatOutputReal
,
formatOutputUReal
:
formatOutputUReal
,
formatOutputHash
:
formatOutputHash
,
formatOutputBool
:
formatOutputBool
,
formatOutputString
:
formatOutputString
,
formatOutputAddress
:
formatOutputAddress
};
cmd/mist/assets/ext/ethereum.js/lib/httpsync.js
浏览文件 @
292f7ada
...
...
@@ -30,40 +30,16 @@ var HttpSyncProvider = function (host) {
this
.
host
=
host
||
'
http://localhost:8080
'
;
};
/// Transforms inner message to proper jsonrpc object
/// @param inner message object
/// @returns jsonrpc object
function
formatJsonRpcObject
(
object
)
{
return
{
jsonrpc
:
'
2.0
'
,
method
:
object
.
call
,
params
:
object
.
args
,
id
:
object
.
_id
};
}
/// Transforms jsonrpc object to inner message
/// @param incoming jsonrpc message
/// @returns inner message object
function
formatJsonRpcMessage
(
message
)
{
var
object
=
JSON
.
parse
(
message
);
return
{
_id
:
object
.
id
,
data
:
object
.
result
,
error
:
object
.
error
};
}
HttpSyncProvider
.
prototype
.
send
=
function
(
payload
)
{
var
data
=
formatJsonRpcObject
(
payload
);
//
var data = formatJsonRpcObject(payload);
var
request
=
new
XMLHttpRequest
();
request
.
open
(
'
POST
'
,
this
.
host
,
false
);
request
.
send
(
JSON
.
stringify
(
data
));
request
.
send
(
JSON
.
stringify
(
payload
));
// check request.status
return
request
.
responseText
;
var
result
=
request
.
responseText
;
return
JSON
.
parse
(
result
);
};
module
.
exports
=
HttpSyncProvider
;
...
...
cmd/mist/assets/ext/ethereum.js/lib/jsonrpc.js
0 → 100644
浏览文件 @
292f7ada
/*
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 jsonrpc.js
* @authors:
* Marek Kotewicz <marek@ethdev.com>
* @date 2015
*/
var
messageId
=
1
;
/// Should be called to valid json create payload object
/// @param method of jsonrpc call, required
/// @param params, an array of method params, optional
/// @returns valid jsonrpc payload object
var
toPayload
=
function
(
method
,
params
)
{
if
(
!
method
)
console
.
error
(
'
jsonrpc method should be specified!
'
);
return
{
jsonrpc
:
'
2.0
'
,
method
:
method
,
params
:
params
||
[],
id
:
messageId
++
};
};
/// Should be called to check if jsonrpc response is valid
/// @returns true if response is valid, otherwise false
var
isValidResponse
=
function
(
response
)
{
return
!!
response
&&
!
response
.
error
&&
response
.
jsonrpc
===
'
2.0
'
&&
typeof
response
.
id
===
'
number
'
&&
response
.
result
!==
undefined
;
// only undefined is not valid json object
};
/// Should be called to create batch payload object
/// @param messages, an array of objects with method (required) and params (optional) fields
var
toBatchPayload
=
function
(
messages
)
{
return
messages
.
map
(
function
(
message
)
{
return
toPayload
(
message
.
method
,
message
.
params
);
});
};
module
.
exports
=
{
toPayload
:
toPayload
,
isValidResponse
:
isValidResponse
,
toBatchPayload
:
toBatchPayload
};
cmd/mist/assets/ext/ethereum.js/lib/providermanager.js
浏览文件 @
292f7ada
...
...
@@ -23,7 +23,9 @@
* @date 2014
*/
var
web3
=
require
(
'
./web3
'
);
// jshint ignore:line
var
web3
=
require
(
'
./web3
'
);
var
jsonrpc
=
require
(
'
./jsonrpc
'
);
/**
* Provider manager object prototype
...
...
@@ -37,25 +39,35 @@ var web3 = require('./web3'); // jshint ignore:line
var
ProviderManager
=
function
()
{
this
.
polls
=
[];
this
.
provider
=
undefined
;
this
.
id
=
1
;
var
self
=
this
;
var
poll
=
function
()
{
if
(
self
.
provider
)
{
self
.
polls
.
forEach
(
function
(
data
)
{
data
.
data
.
_id
=
self
.
id
;
self
.
id
++
;
var
result
=
self
.
provider
.
send
(
data
.
data
);
var
pollsBatch
=
self
.
polls
.
map
(
function
(
data
)
{
return
data
.
data
;
});
var
payload
=
jsonrpc
.
toBatchPayload
(
pollsBatch
);
var
results
=
self
.
provider
.
send
(
payload
);
result
=
JSON
.
parse
(
result
);
self
.
polls
.
forEach
(
function
(
data
,
index
)
{
var
result
=
results
[
index
];
if
(
!
jsonrpc
.
isValidResponse
(
result
))
{
console
.
log
(
result
);
return
;
}
result
=
result
.
result
;
// dont call the callback if result is not an array, or empty one
if
(
result
.
error
||
!
(
result
.
result
instanceof
Array
)
||
result
.
result
.
length
===
0
)
{
if
(
!
(
result
instanceof
Array
)
||
result
.
length
===
0
)
{
return
;
}
data
.
callback
(
result
.
result
);
data
.
callback
(
result
);
});
}
setTimeout
(
poll
,
1000
);
};
...
...
@@ -63,22 +75,19 @@ var ProviderManager = function() {
};
/// sends outgoing requests
/// @params data - an object with at least 'method' property
ProviderManager
.
prototype
.
send
=
function
(
data
)
{
data
.
args
=
data
.
args
||
[];
data
.
_id
=
this
.
id
++
;
var
payload
=
jsonrpc
.
toPayload
(
data
.
method
,
data
.
params
);
if
(
this
.
provider
===
undefined
)
{
console
.
error
(
'
provider is not set
'
);
return
null
;
}
//TODO: handle error here?
var
result
=
this
.
provider
.
send
(
data
);
result
=
JSON
.
parse
(
result
);
var
result
=
this
.
provider
.
send
(
payload
);
if
(
result
.
error
)
{
console
.
log
(
result
.
error
);
if
(
!
jsonrpc
.
isValidResponse
(
result
)
)
{
console
.
log
(
result
);
return
null
;
}
...
...
cmd/mist/assets/ext/ethereum.js/lib/qtsync.js
浏览文件 @
292f7ada
...
...
@@ -25,7 +25,8 @@ var QtSyncProvider = function () {
};
QtSyncProvider
.
prototype
.
send
=
function
(
payload
)
{
return
navigator
.
qt
.
callMethod
(
JSON
.
stringify
(
payload
));
var
result
=
navigator
.
qt
.
callMethod
(
JSON
.
stringify
(
payload
));
return
JSON
.
parse
(
result
);
};
module
.
exports
=
QtSyncProvider
;
...
...
cmd/mist/assets/ext/ethereum.js/lib/types.js
0 → 100644
浏览文件 @
292f7ada
/*
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 types.js
* @authors:
* Marek Kotewicz <marek@ethdev.com>
* @date 2015
*/
var
f
=
require
(
'
./formatters
'
);
/// @param expected type prefix (string)
/// @returns function which checks if type has matching prefix. if yes, returns true, otherwise false
var
prefixedType
=
function
(
prefix
)
{
return
function
(
type
)
{
return
type
.
indexOf
(
prefix
)
===
0
;
};
};
/// @param expected type name (string)
/// @returns function which checks if type is matching expected one. if yes, returns true, otherwise false
var
namedType
=
function
(
name
)
{
return
function
(
type
)
{
return
name
===
type
;
};
};
/// Setups input formatters for solidity types
/// @returns an array of input formatters
var
inputTypes
=
function
()
{
return
[
{
type
:
prefixedType
(
'
uint
'
),
format
:
f
.
formatInputInt
},
{
type
:
prefixedType
(
'
int
'
),
format
:
f
.
formatInputInt
},
{
type
:
prefixedType
(
'
hash
'
),
format
:
f
.
formatInputInt
},
{
type
:
prefixedType
(
'
string
'
),
format
:
f
.
formatInputString
},
{
type
:
prefixedType
(
'
real
'
),
format
:
f
.
formatInputReal
},
{
type
:
prefixedType
(
'
ureal
'
),
format
:
f
.
formatInputReal
},
{
type
:
namedType
(
'
address
'
),
format
:
f
.
formatInputInt
},
{
type
:
namedType
(
'
bool
'
),
format
:
f
.
formatInputBool
}
];
};
/// Setups output formaters for solidity types
/// @returns an array of output formatters
var
outputTypes
=
function
()
{
return
[
{
type
:
prefixedType
(
'
uint
'
),
format
:
f
.
formatOutputUInt
},
{
type
:
prefixedType
(
'
int
'
),
format
:
f
.
formatOutputInt
},
{
type
:
prefixedType
(
'
hash
'
),
format
:
f
.
formatOutputHash
},
{
type
:
prefixedType
(
'
string
'
),
format
:
f
.
formatOutputString
},
{
type
:
prefixedType
(
'
real
'
),
format
:
f
.
formatOutputReal
},
{
type
:
prefixedType
(
'
ureal
'
),
format
:
f
.
formatOutputUReal
},
{
type
:
namedType
(
'
address
'
),
format
:
f
.
formatOutputAddress
},
{
type
:
namedType
(
'
bool
'
),
format
:
f
.
formatOutputBool
}
];
};
module
.
exports
=
{
prefixedType
:
prefixedType
,
namedType
:
namedType
,
inputTypes
:
inputTypes
,
outputTypes
:
outputTypes
};
cmd/mist/assets/ext/ethereum.js/lib/utils.js
0 → 100644
浏览文件 @
292f7ada
/*
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 utils.js
* @authors:
* Marek Kotewicz <marek@ethdev.com>
* @date 2015
*/
var
c
=
require
(
'
./const
'
);
/// Finds first index of array element matching pattern
/// @param array
/// @param callback pattern
/// @returns index of element
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
;
};
/// @returns ascii string representation of hex value prefixed with 0x
var
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
=
parseInt
(
hex
.
substr
(
i
,
2
),
16
);
if
(
code
===
0
)
{
break
;
}
str
+=
String
.
fromCharCode
(
code
);
}
return
str
;
};
var
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
;
};
/// @returns hex representation (prefixed by 0x) of ascii string
var
fromAscii
=
function
(
str
,
pad
)
{
pad
=
pad
===
undefined
?
0
:
pad
;
var
hex
=
toHex
(
str
);
while
(
hex
.
length
<
pad
*
2
)
hex
+=
"
00
"
;
return
"
0x
"
+
hex
;
};
/// @returns display name for function/event eg. multiply(uint256) -> multiply
var
extractDisplayName
=
function
(
name
)
{
var
length
=
name
.
indexOf
(
'
(
'
);
return
length
!==
-
1
?
name
.
substr
(
0
,
length
)
:
name
;
};
/// @returns overloaded part of function/event name
var
extractTypeName
=
function
(
name
)
{
/// TODO: make it invulnerable
var
length
=
name
.
indexOf
(
'
(
'
);
return
length
!==
-
1
?
name
.
substr
(
length
+
1
,
name
.
length
-
1
-
(
length
+
1
)).
replace
(
'
'
,
''
)
:
""
;
};
/// Filters all function from input abi
/// @returns abi array with filtered objects of type 'function'
var
filterFunctions
=
function
(
json
)
{
return
json
.
filter
(
function
(
current
)
{
return
current
.
type
===
'
function
'
;
});
};
/// Filters all events form input abi
/// @returns abi array with filtered objects of type 'event'
var
filterEvents
=
function
(
json
)
{
return
json
.
filter
(
function
(
current
)
{
return
current
.
type
===
'
event
'
;
});
};
/// used to transform value/string to eth string
/// TODO: use BigNumber.js to parse int
/// TODO: add tests for it!
var
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
=
c
.
ETH_UNITS
;
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
];
};
module
.
exports
=
{
findIndex
:
findIndex
,
toAscii
:
toAscii
,
fromAscii
:
fromAscii
,
extractDisplayName
:
extractDisplayName
,
extractTypeName
:
extractTypeName
,
filterFunctions
:
filterFunctions
,
filterEvents
:
filterEvents
,
toEth
:
toEth
};
cmd/mist/assets/ext/ethereum.js/lib/web3.js
浏览文件 @
292f7ada
...
...
@@ -27,27 +27,7 @@ if (process.env.NODE_ENV !== 'build') {
var
BigNumber
=
require
(
'
bignumber.js
'
);
}
var
ETH_UNITS
=
[
'
wei
'
,
'
Kwei
'
,
'
Mwei
'
,
'
Gwei
'
,
'
szabo
'
,
'
finney
'
,
'
ether
'
,
'
grand
'
,
'
Mether
'
,
'
Gether
'
,
'
Tether
'
,
'
Pether
'
,
'
Eether
'
,
'
Zether
'
,
'
Yether
'
,
'
Nether
'
,
'
Dether
'
,
'
Vether
'
,
'
Uether
'
];
var
utils
=
require
(
'
./utils
'
);
/// @returns an array of objects describing web3 api methods
var
web3Methods
=
function
()
{
...
...
@@ -156,8 +136,8 @@ var setupMethods = function (obj, methods) {
var
args
=
Array
.
prototype
.
slice
.
call
(
arguments
);
var
call
=
typeof
method
.
call
===
'
function
'
?
method
.
call
(
args
)
:
method
.
call
;
return
web3
.
provider
.
send
({
call
:
call
,
arg
s
:
args
method
:
call
,
param
s
:
args
});
};
});
...
...
@@ -170,15 +150,15 @@ var setupProperties = function (obj, properties) {
var
proto
=
{};
proto
.
get
=
function
()
{
return
web3
.
provider
.
send
({
call
:
property
.
getter
method
:
property
.
getter
});
};
if
(
property
.
setter
)
{
proto
.
set
=
function
(
val
)
{
return
web3
.
provider
.
send
({
call
:
property
.
setter
,
arg
s
:
[
val
]
method
:
property
.
setter
,
param
s
:
[
val
]
});
};
}
...
...
@@ -192,43 +172,11 @@ var web3 = {
_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
;
},
/// @returns ascii string representation of hex value prefixed with 0x
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
=
parseInt
(
hex
.
substr
(
i
,
2
),
16
);
if
(
code
===
0
)
{
break
;
}
str
+=
String
.
fromCharCode
(
code
);
}
return
str
;
},
toAscii
:
utils
.
toAscii
,
/// @returns hex representation (prefixed by 0x) of ascii string
fromAscii
:
function
(
str
,
pad
)
{
pad
=
pad
===
undefined
?
0
:
pad
;
var
hex
=
this
.
toHex
(
str
);
while
(
hex
.
length
<
pad
*
2
)
hex
+=
"
00
"
;
return
"
0x
"
+
hex
;
},
fromAscii
:
utils
.
fromAscii
,
/// @returns decimal representaton of hex value prefixed by 0x
toDecimal
:
function
(
val
)
{
...
...
@@ -243,29 +191,7 @@ var web3 = {
},
/// used to transform value/string to eth string
/// TODO: use BigNumber.js to parse int
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
=
ETH_UNITS
;
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
];
},
toEth
:
utils
.
toEth
,
/// eth object prototype
eth
:
{
...
...
@@ -278,8 +204,15 @@ var web3 = {
return
ret
;
};
},
watch
:
function
(
params
)
{
return
new
web3
.
filter
(
params
,
ethWatch
);
/// @param filter may be a string, object or event
/// @param indexed is optional, this is an object with optional event indexed params
/// @param options is optional, this is an object with optional event options ('max'...)
watch
:
function
(
filter
,
indexed
,
options
)
{
if
(
filter
.
_isEvent
)
{
return
filter
(
indexed
,
options
);
}
return
new
web3
.
filter
(
filter
,
ethWatch
);
}
},
...
...
@@ -288,15 +221,12 @@ var web3 = {
/// shh object prototype
shh
:
{
watch
:
function
(
params
)
{
return
new
web3
.
filter
(
params
,
shhWatch
);
}
},
/// @returns true if provider is installed
haveProvider
:
function
(
)
{
return
!!
web3
.
provider
.
provider
;
/// @param filter may be a string, object or event
watch
:
function
(
filter
,
indexed
)
{
return
new
web3
.
filter
(
filter
,
shhWatch
)
;
}
},
};
/// setups all api methods
...
...
@@ -319,7 +249,6 @@ var shhWatch = {
setupMethods
(
shhWatch
,
shhWatchMethods
());
web3
.
setProvider
=
function
(
provider
)
{
//provider.onmessage = messageHandler; // there will be no async calls, to remove
web3
.
provider
.
set
(
provider
);
};
...
...
cmd/mist/assets/ext/ethereum.js/package.json
浏览文件 @
292f7ada
{
"name"
:
"ethereum.js"
,
"namespace"
:
"ethereum"
,
"version"
:
"0.0.1
0
"
,
"version"
:
"0.0.1
3
"
,
"description"
:
"Ethereum Compatible JavaScript API"
,
"main"
:
"./index.js"
,
"directories"
:
{
...
...
cmd/mist/assets/ext/ethereum.js/test/db.methods.js
浏览文件 @
292f7ada
var
assert
=
require
(
'
assert
'
);
var
web3
=
require
(
'
../index.js
'
);
var
u
=
require
(
'
./utils.js
'
);
var
u
=
require
(
'
./
test.
utils.js
'
);
describe
(
'
web3
'
,
function
()
{
describe
(
'
db
'
,
function
()
{
...
...
cmd/mist/assets/ext/ethereum.js/test/eth.methods.js
浏览文件 @
292f7ada
var
assert
=
require
(
'
assert
'
);
var
web3
=
require
(
'
../index.js
'
);
var
u
=
require
(
'
./utils.js
'
);
var
u
=
require
(
'
./
test.
utils.js
'
);
describe
(
'
web3
'
,
function
()
{
describe
(
'
eth
'
,
function
()
{
...
...
cmd/mist/assets/ext/ethereum.js/test/shh.methods.js
浏览文件 @
292f7ada
var
assert
=
require
(
'
assert
'
);
var
web3
=
require
(
'
../index.js
'
);
var
u
=
require
(
'
./utils.js
'
);
var
u
=
require
(
'
./
test.
utils.js
'
);
describe
(
'
web3
'
,
function
()
{
describe
(
'
shh
'
,
function
()
{
...
...
cmd/mist/assets/ext/ethereum.js/test/web3.methods.js
浏览文件 @
292f7ada
var
assert
=
require
(
'
assert
'
);
var
web3
=
require
(
'
../index.js
'
);
var
u
=
require
(
'
./utils.js
'
);
var
u
=
require
(
'
./
test.
utils.js
'
);
describe
(
'
web3
'
,
function
()
{
u
.
methodExists
(
web3
,
'
sha3
'
);
...
...
tests/files/BlockTests/badBlockChain.json
→
tests/files/Block
chain
Tests/badBlockChain.json
浏览文件 @
292f7ada
文件已移动
tests/files/BlockTests/basicBlockChain.json
→
tests/files/Block
chain
Tests/basicBlockChain.json
浏览文件 @
292f7ada
文件已移动
tests/files/StateTests/stRefundTest.json
浏览文件 @
292f7ada
{
"RefundOverflow"
:
{
"env"
:
{
"currentCoinbase"
:
"2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
,
"currentDifficulty"
:
"45678256"
,
"currentGasLimit"
:
"115792089237316195423570985008687907853269984665640564039457584007913129639935"
,
"currentNumber"
:
"0"
,
"currentTimestamp"
:
1
,
"previousHash"
:
"5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
},
"logs"
:
[
],
"out"
:
"0x"
,
"post"
:
{
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b"
:
{
"balance"
:
"400"
,
"code"
:
"0x"
,
"nonce"
:
"0"
,
"storage"
:
{
}
}
},
"pre"
:
{
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b"
:
{
"balance"
:
"400"
,
"code"
:
"0x"
,
"nonce"
:
"0"
,
"storage"
:
{
}
}
},
"transaction"
:
{
"data"
:
""
,
"gasLimit"
:
"5789604461865809771178549250434395392663499233282028201972879200395656482016"
,
"gasPrice"
:
"20"
,
"nonce"
:
"0"
,
"secretKey"
:
"45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8"
,
"to"
:
"b94f5374fce5edbc8e2a8697c15331677e6ebf0b"
,
"value"
:
""
}
},
"refund500"
:
{
"env"
:
{
"currentCoinbase"
:
"2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
,
...
...
tests/files/VMTests/RandomTests/201502031248CPPJIT.json
0 → 100644
浏览文件 @
292f7ada
{
"randomVMtest"
:
{
"env"
:
{
"currentCoinbase"
:
"2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
,
"currentDifficulty"
:
"115792089237316195423570985008687907853269984665640564039457584007913129639935"
,
"currentGasLimit"
:
"1000000"
,
"currentNumber"
:
"300"
,
"currentTimestamp"
:
"2"
,
"previousHash"
:
"5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
},
"exec"
:
{
"address"
:
"0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6"
,
"caller"
:
"cd1722f3947def4cf144679da39c4c32bdc35681"
,
"code"
:
"0x404544420855"
,
"data"
:
"0x"
,
"gas"
:
"10000"
,
"gasPrice"
:
"100000000000000"
,
"origin"
:
"cd1722f3947def4cf144679da39c4c32bdc35681"
,
"value"
:
"1000000000000000000"
},
"pre"
:
{
"0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6"
:
{
"balance"
:
"1000000000000000000"
,
"code"
:
"0x404544420855"
,
"nonce"
:
"0"
,
"storage"
:
{
}
}
}
}
}
tests/files/VMTests/RandomTests/201502032117GO.json
0 → 100644
浏览文件 @
292f7ada
{
"randomVMtest"
:
{
"callcreates"
:
[
{
"data"
:
"0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
,
"destination"
:
""
,
"gasLimit"
:
"9872"
,
"value"
:
"2"
},
{
"data"
:
"0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
,
"destination"
:
""
,
"gasLimit"
:
"9770"
,
"value"
:
"9870"
}
],
"env"
:
{
"currentCoinbase"
:
"2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
,
"currentDifficulty"
:
"115792089237316195423570985008687907853269984665640564039457584007913129639935"
,
"currentGasLimit"
:
"1000000"
,
"currentNumber"
:
"300"
,
"currentTimestamp"
:
"2"
,
"previousHash"
:
"5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
},
"exec"
:
{
"address"
:
"0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6"
,
"caller"
:
"cd1722f3947def4cf144679da39c4c32bdc35681"
,
"code"
:
"0x424443444243434383f0155af055"
,
"data"
:
"0x"
,
"gas"
:
"10000"
,
"gasPrice"
:
"100000000000000"
,
"origin"
:
"cd1722f3947def4cf144679da39c4c32bdc35681"
,
"value"
:
"1000000000000000000"
},
"gas"
:
"9470"
,
"logs"
:
[
],
"out"
:
"0x"
,
"post"
:
{
"0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6"
:
{
"balance"
:
"999999999999990128"
,
"code"
:
"0x424443444243434383f0155af055"
,
"nonce"
:
"0"
,
"storage"
:
{
"0x945304eb96065b2a98b57a48a06ae28d285a71b5"
:
"0x02"
}
}
},
"pre"
:
{
"0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6"
:
{
"balance"
:
"1000000000000000000"
,
"code"
:
"0x424443444243434383f0155af055"
,
"nonce"
:
"0"
,
"storage"
:
{
}
}
}
}
}
tests/files/index.js
浏览文件 @
292f7ada
var
tests
=
module
.
exports
=
{};
Object
.
defineProperties
(
tests
,
{
blockTests
:
{
get
:
require
(
'
require-all
'
).
bind
(
this
,
__dirname
+
'
/BlockTests
'
)
block
chain
Tests
:
{
get
:
require
(
'
require-all
'
).
bind
(
this
,
__dirname
+
'
/Block
chain
Tests
'
)
},
basicTests
:
{
get
:
require
(
'
require-all
'
).
bind
(
this
,
__dirname
+
'
/BasicTests/
'
)
...
...
tests/files/package.json
浏览文件 @
292f7ada
{
"name"
:
"ethereum-tests"
,
"version"
:
"0.0.
2
"
,
"version"
:
"0.0.
3
"
,
"description"
:
"tests for ethereum"
,
"main"
:
"index.js"
,
"scripts"
:
{
...
...
vm/vm.go
浏览文件 @
292f7ada
...
...
@@ -510,7 +510,7 @@ func (self *Vm) Run(me, caller ContextRef, code []byte, value, gas, price *big.I
case
GASPRICE
:
stack
.
Push
(
context
.
Price
)
self
.
Printf
(
" => %
v
"
,
context
.
Price
)
self
.
Printf
(
" => %
x
"
,
context
.
Price
)
// 0x40 range
case
BLOCKHASH
:
...
...
@@ -643,6 +643,8 @@ func (self *Vm) Run(me, caller ContextRef, code []byte, value, gas, price *big.I
stack
.
Push
(
big
.
NewInt
(
int64
(
mem
.
Len
())))
case
GAS
:
stack
.
Push
(
context
.
Gas
)
self
.
Printf
(
" => %x"
,
context
.
Gas
)
// 0x60 range
case
CREATE
:
...
...
@@ -653,6 +655,7 @@ func (self *Vm) Run(me, caller ContextRef, code []byte, value, gas, price *big.I
gas
=
new
(
big
.
Int
)
.
Set
(
context
.
Gas
)
addr
[]
byte
)
self
.
Endl
()
context
.
UseGas
(
context
.
Gas
)
ret
,
suberr
,
ref
:=
self
.
env
.
Create
(
context
,
nil
,
input
,
gas
,
price
,
value
)
...
...
@@ -673,7 +676,6 @@ func (self *Vm) Run(me, caller ContextRef, code []byte, value, gas, price *big.I
stack
.
Push
(
ethutil
.
BigD
(
addr
))
self
.
Printf
(
" (*) %x"
,
addr
)
}
// Debug hook
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录