abi output formatting

This commit is contained in:
Marek Kotewicz 2014-11-13 04:21:51 +01:00
parent 7ce63d32b2
commit d99fea2db6
5 changed files with 114 additions and 45 deletions

2
dist/ethereum.js vendored
View File

@ -1,5 +1,5 @@
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){
var findIndex=function(array,callback){for(var end=!1,i=0;i<array.length&&!end;i++)end=callback(array[i]);return end?i-1:-1},padLeft=function(number,n){return new Array(2*n-number.toString().length+1).join("0")+number},setupTypes=function(){var prefixedType=function(prefix){return function(type,value){var padding,expected=prefix;return 0!==type.indexOf(expected)?!1:(padding=parseInt(type.slice(expected.length))/8,padLeft(value,padding))}},namedType=function(name,padding){return function(type,value){return type!==name?!1:padLeft(value,padding)}};return[prefixedType("uint"),prefixedType("int"),namedType("address",20),namedType("bool",1)]},types=setupTypes(),toBytes=function(json,methodName,params){var method,i,found,j,bytes="",index=findIndex(json,function(method){return method.name===methodName});if(-1!==index){for(bytes=bytes+index+"x0",method=json[index],i=0;i<method.inputs.length;i++){for(found=!1,j=0;j<types.length&&!found;j++)found=types[j](method.inputs[i].type,params[i]);found||console.error("unsupported json type: "+method.inputs[i].type),bytes+=found}return bytes}};module.exports={toBytes:toBytes};
var findIndex=function(array,callback){for(var end=!1,i=0;i<array.length&&!end;i++)end=callback(array[i]);return end?i-1:-1},findMethodIndex=function(json,methodName){return findIndex(json,function(method){return method.name===methodName})},padLeft=function(number,n){return new Array(2*n-number.toString().length+1).join("0")+number},setupInputTypes=function(){var prefixedType=function(prefix){return function(type,value){var padding,expected=prefix;return 0!==type.indexOf(expected)?!1:(padding=parseInt(type.slice(expected.length))/8,padLeft(value,padding))}},namedType=function(name,padding,formatter){return function(type,value){return type!==name?!1:padLeft(formatter?value:formatter(value),padding)}},formatBool=function(value){return value?"1":"0"};return[prefixedType("uint"),prefixedType("int"),namedType("address",20),namedType("bool",1,formatBool)]},inputTypes=setupInputTypes(),toAbiInput=function(json,methodName,params){var method,i,found,j,bytes="",index=findMethodIndex(json,methodName);if(-1!==index){for(bytes=bytes+index+"x0",method=json[index],i=0;i<method.inputs.length;i++){for(found=!1,j=0;j<inputTypes.length&&!found;j++)found=inputTypes[j](method.inputs[i].type,params[i]);found||console.error("unsupported json type: "+method.inputs[i].type),bytes+=found}return bytes}},setupOutputTypes=function(){var prefixedType=function(prefix){return function(type){var padding,expected=prefix;return 0!==type.indexOf(expected)?-1:(padding=parseInt(type.slice(expected.length))/8,2*padding)}},namedType=function(name,padding){return function(type){return name===type?2*padding:-1}},formatInt=function(value){return parseInt(value,16)},formatBool=function(value){return"1"===value?!0:!1};return[{padding:prefixedType("uint"),format:formatInt},{padding:prefixedType("int"),format:formatInt},{padding:namedType("address",20)},{padding:namedType("bool",1),format:formatBool}]},outputTypes=setupOutputTypes(),fromAbiOutput=function(json,methodName,output){var result,method,i,padding,j,res,formatter,index=findMethodIndex(json,methodName);if(-1!==index){for(output=output.slice(2),result=[],method=json[index],i=0;i<method.outputs.length;i++){for(padding=-1,j=0;j<outputTypes.length&&-1===padding;j++)padding=outputTypes[j].padding(method.outputs[i].type);-1!==padding&&(res=output.slice(0,padding),formatter=outputTypes[j-1].format,result.push(formatter?formatter(res):res),output=output.slice(padding))}return result}};module.exports={toAbiInput:toAbiInput,fromAbiOutput:fromAbiOutput};
},{}],2:[function(require,module,exports){
var AutoProvider=function(userOptions){var options,self,closeWithSuccess,ws;if(!web3.haveProvider()){if(this.sendQueue=[],this.onmessageQueue=[],navigator.qt)return void(this.provider=new web3.providers.QtProvider);userOptions=userOptions||{},options={httprpc:userOptions.httprpc||"http://localhost:8080",websockets:userOptions.websockets||"ws://localhost:40404/eth"},self=this,closeWithSuccess=function(success){ws.close(),success?self.provider=new web3.providers.WebSocketProvider(options.websockets):(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})},ws=new WebSocket(options.websockets),ws.onopen=function(){closeWithSuccess(!0)},ws.onerror=function(){closeWithSuccess(!1)}}};AutoProvider.prototype.send=function(payload){return this.provider?void this.provider.send(payload):void this.sendQueue.push(payload)},Object.defineProperty(AutoProvider.prototype,"onmessage",{set:function(handler){return this.provider?void(this.provider.onmessage=handler):void this.onmessageQueue.push(handler)}}),module.exports=AutoProvider;
},{}],3:[function(require,module,exports){

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -6,18 +6,14 @@
<script type="text/javascript" src="../dist/ethereum.js"></script>
<script type="text/javascript">
if (window.Promise === undefined) {
if (window.Promise === undefined) {
window.Promise = ES6Promise.Promise;
}
}
var web3 = require('web3');
var web3 = require('web3');
web3.setProvider(new web3.providers.AutoProvider());
//web3.setProvider(new web3.providers.QtProvider());
//web3.setProvider(new web3.providers.HttpRpcProvider("http://localhost:8080"));
// web3.setProvider(new web3.providers.WebSocketProvider("ws://localhost:40404/eth"));
web3.setProvider(new web3.providers.AutoProvider());
function testSnippet() {
function testSnippet() {
web3.eth.watch({altered: web3.eth.coinbase}).changed(function() {
web3.eth.balanceAt(web3.eth.coinbase).then(function (balance) {
console.log(parseInt(balance,16));
@ -25,20 +21,17 @@ function testSnippet() {
document.getElementById("result").innerText = +balance;
});
});
}
</script>
}
</script>
</head>
<body>
<h1>std::name_reg</h1>
<input type="text" id="name"></input>
<button type="button" onClick="testSnippet();">test snippet</button>
<div></div>
result: <div id="result"></div>
<h1>std::name_reg</h1>
<input type="text" id="name"></input>
<button type="button" onClick="testSnippet();">test snippet</button>
<div></div>
result:
<div id="result"></div>
</body>
</html>

View File

@ -8,11 +8,17 @@ var findIndex = function (array, callback) {
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 setupTypes = function () {
var setupInputTypes = function () {
var prefixedType = function (prefix) {
return function (type, value) {
var expected = prefix;
@ -25,31 +31,33 @@ var setupTypes = function () {
};
};
var namedType = function (name, padding) {
var namedType = function (name, padding, formatter) {
return function (type, value) {
if (type !== name) {
return false;
}
return padLeft(value, padding);
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),
namedType('bool', 1, formatBool),
];
};
var types = setupTypes();
var inputTypes = setupInputTypes();
var toBytes = function (json, methodName, params) {
var toAbiInput = function (json, methodName, params) {
var bytes = "";
var index = findIndex(json, function (method) {
return method.name === methodName;
});
var index = findMethodIndex(json, methodName);
if (index === -1) {
return;
@ -62,8 +70,8 @@ var toBytes = function (json, methodName, params) {
for (var i = 0; i < method.inputs.length; i++) {
var found = false;
for (var j = 0; j < types.length && !found; j++) {
found = types[j](method.inputs[i].type, params[i]);
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);
@ -73,7 +81,75 @@ var toBytes = function (json, methodName, params) {
return bytes;
};
module.exports = {
toBytes: toBytes
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;
};
module.exports = {
toAbiInput: toAbiInput,
fromAbiOutput: fromAbiOutput
};