Commit 8b7e5972 authored by Marian OANCΞA's avatar Marian OANCΞA

Merge pull request #10 from debris/abi

Abi
parents dc100f85 8aaec1d9
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -4,41 +4,38 @@ ...@@ -4,41 +4,38 @@
<head> <head>
<script type="text/javascript" src="js/es6-promise/promise.min.js"></script> <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" src="../dist/ethereum.js"></script>
<script type="text/javascript"> <script type="text/javascript">
if (window.Promise === undefined) {
window.Promise = ES6Promise.Promise; var web3 = require('web3');
} web3.setProvider(new web3.providers.AutoProvider());
var web3 = require('web3'); function watchBalance() {
var coinbase = web3.eth.coinbase;
var originalBalance = 0;
//web3.setProvider(new web3.providers.QtProvider()); web3.eth.balanceAt(coinbase).then(function (balance) {
//web3.setProvider(new web3.providers.HttpRpcProvider("http://localhost:8080")); originalBalance = web3.toDecimal(balance);
// web3.setProvider(new web3.providers.WebSocketProvider("ws://localhost:40404/eth")); document.getElementById('original').innerText = 'original balance: ' + originalBalance + ' watching...';
web3.setProvider(new web3.providers.AutoProvider()); });
function testSnippet() { web3.eth.watch({altered: coinbase}).changed(function() {
web3.eth.watch({altered: web3.eth.coinbase}).changed(function() { web3.eth.balanceAt(coinbase).then(function (balance) {
web3.eth.balanceAt(web3.eth.coinbase).then(function (balance) { var currentBalance = web3.toDecimal(balance);
console.log(parseInt(balance,16)); document.getElementById("current").innerText = 'current: ' + currentBalance;
console.log(typeof balance); document.getElementById("diff").innerText = 'diff: ' + (currentBalance - originalBalance);
document.getElementById("result").innerText = +balance; });
}); });
}); }
}
</script> </script>
</head> </head>
<body> <body>
<h1>balance</h1>
<h1>std::name_reg</h1> <button type="button" onClick="watchBalance();">watch balance</button>
<input type="text" id="name"></input> <div></div>
<button type="button" onClick="testSnippet();">test snippet</button> <div id="original"></div>
<div id="current"></div>
<div></div> <div id="diff"></div>
result: <div id="result"></div>
</body> </body>
</html> </html>
...@@ -3,5 +3,6 @@ web3.providers.WebSocketProvider = require('./lib/websocket'); ...@@ -3,5 +3,6 @@ web3.providers.WebSocketProvider = require('./lib/websocket');
web3.providers.HttpRpcProvider = require('./lib/httprpc'); web3.providers.HttpRpcProvider = require('./lib/httprpc');
web3.providers.QtProvider = require('./lib/qt'); web3.providers.QtProvider = require('./lib/qt');
web3.providers.AutoProvider = require('./lib/autoprovider'); web3.providers.AutoProvider = require('./lib/autoprovider');
web3.contract = require('./lib/abi');
module.exports = web3; module.exports = web3;
var web3 = require('./lib/main'); var web3 = require('./lib/main');
web3.providers.QtProvider = require('./lib/qt'); web3.providers.QtProvider = require('./lib/qt');
web3.abi = require('./lib/abi');
module.exports = web3; module.exports = web3;
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 (number, n) {
return (new Array(n * 2 - number.toString().length + 1)).join("0") + number;
};
var setupInputTypes = function () {
var prefixedType = function (prefix) {
return function (type, value) {
var expected = prefix;
if (type.indexOf(expected) !== 0) {
return false;
}
var padding = parseInt(type.slice(expected.length)) / 8;
return padLeft(value, padding);
};
};
var namedType = function (name, padding, formatter) {
return function (type, value) {
if (type !== name) {
return false;
}
return padLeft(formatter ? value : formatter(value), padding);
};
};
var formatBool = function (value) {
return value ? '1' : '0';
};
return [
prefixedType('uint'),
prefixedType('int'),
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;
}
// it needs to be checked in WebThreeStubServer
// something wrong might be with this additional zero
bytes = bytes + index + 'x' + '0';
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) {
return function (type) {
var expected = prefix;
if (type.indexOf(expected) !== 0) {
return -1;
}
var padding = parseInt(type.slice(expected.length)) / 8;
return padding * 2;
};
};
var namedType = function (name, padding) {
return function (type) {
return name === type ? padding * 2: -1;
};
};
var formatInt = function (value) {
return parseInt(value, 16);
};
var formatBool = function (value) {
return value === '1' ? true : false;
};
return [
{ padding: prefixedType('uint'), format: formatInt },
{ padding: prefixedType('int'), 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): res);
output = output.slice(padding);
}
return result;
};
var load = function (json) {
var contract = {};
json.forEach(function (method) {
contract[method.name] = function () {
var params = Array.prototype.slice.call(arguments);
return toAbiInput(json, method.name, params);
};
});
return contract;
};
module.exports = load;
...@@ -77,6 +77,7 @@ var ethMethods = function () { ...@@ -77,6 +77,7 @@ var ethMethods = function () {
var methods = [ var methods = [
{ name: 'balanceAt', call: 'eth_balanceAt' }, { name: 'balanceAt', call: 'eth_balanceAt' },
{ name: 'stateAt', call: 'eth_stateAt' }, { name: 'stateAt', call: 'eth_stateAt' },
{ name: 'storageAt', call: 'eth_storageAt' },
{ name: 'countAt', call: 'eth_countAt'}, { name: 'countAt', call: 'eth_countAt'},
{ name: 'codeAt', call: 'eth_codeAt' }, { name: 'codeAt', call: 'eth_codeAt' },
{ name: 'transact', call: 'eth_transact' }, { name: 'transact', call: 'eth_transact' },
...@@ -84,8 +85,9 @@ var ethMethods = function () { ...@@ -84,8 +85,9 @@ var ethMethods = function () {
{ name: 'block', call: blockCall }, { name: 'block', call: blockCall },
{ name: 'transaction', call: transactionCall }, { name: 'transaction', call: transactionCall },
{ name: 'uncle', call: uncleCall }, { name: 'uncle', call: uncleCall },
{ name: 'compile', call: 'eth_compile' }, { name: 'compilers', call: 'eth_compilers' },
{ name: 'lll', call: 'eth_lll' } { name: 'lll', call: 'eth_lll' },
{ name: 'solidity', call: 'eth_solidity' }
]; ];
return methods; return methods;
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment