abi output formatting
This commit is contained in:
parent
7ce63d32b2
commit
d99fea2db6
2
dist/ethereum.js
vendored
2
dist/ethereum.js
vendored
@ -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){
|
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){
|
},{}],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;
|
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){
|
},{}],3:[function(require,module,exports){
|
||||||
|
2
dist/ethereum.js.map
vendored
2
dist/ethereum.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/ethereum.min.js
vendored
2
dist/ethereum.min.js
vendored
File diff suppressed because one or more lines are too long
@ -11,10 +11,6 @@ if (window.Promise === undefined) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var web3 = require('web3');
|
var web3 = require('web3');
|
||||||
|
|
||||||
//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());
|
web3.setProvider(new web3.providers.AutoProvider());
|
||||||
|
|
||||||
function testSnippet() {
|
function testSnippet() {
|
||||||
@ -26,19 +22,16 @@ function testSnippet() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<h1>std::name_reg</h1>
|
<h1>std::name_reg</h1>
|
||||||
<input type="text" id="name"></input>
|
<input type="text" id="name"></input>
|
||||||
<button type="button" onClick="testSnippet();">test snippet</button>
|
<button type="button" onClick="testSnippet();">test snippet</button>
|
||||||
|
|
||||||
<div></div>
|
<div></div>
|
||||||
result: <div id="result"></div>
|
result:
|
||||||
|
<div id="result"></div>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
102
lib/abi.js
102
lib/abi.js
@ -8,11 +8,17 @@ var findIndex = function (array, callback) {
|
|||||||
return end ? i - 1 : -1;
|
return end ? i - 1 : -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var findMethodIndex = function (json, methodName) {
|
||||||
|
return findIndex(json, function (method) {
|
||||||
|
return method.name === methodName;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
var padLeft = function (number, n) {
|
var padLeft = function (number, n) {
|
||||||
return (new Array(n * 2 - number.toString().length + 1)).join("0") + number;
|
return (new Array(n * 2 - number.toString().length + 1)).join("0") + number;
|
||||||
};
|
};
|
||||||
|
|
||||||
var setupTypes = function () {
|
var setupInputTypes = function () {
|
||||||
var prefixedType = function (prefix) {
|
var prefixedType = function (prefix) {
|
||||||
return function (type, value) {
|
return function (type, value) {
|
||||||
var expected = prefix;
|
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) {
|
return function (type, value) {
|
||||||
if (type !== name) {
|
if (type !== name) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return padLeft(value, padding);
|
return padLeft(formatter ? value : formatter(value), padding);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var formatBool = function (value) {
|
||||||
|
return value ? '1' : '0';
|
||||||
|
};
|
||||||
|
|
||||||
return [
|
return [
|
||||||
prefixedType('uint'),
|
prefixedType('uint'),
|
||||||
prefixedType('int'),
|
prefixedType('int'),
|
||||||
namedType('address', 20),
|
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 bytes = "";
|
||||||
var index = findIndex(json, function (method) {
|
var index = findMethodIndex(json, methodName);
|
||||||
return method.name === methodName;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (index === -1) {
|
if (index === -1) {
|
||||||
return;
|
return;
|
||||||
@ -62,8 +70,8 @@ var toBytes = function (json, methodName, params) {
|
|||||||
|
|
||||||
for (var i = 0; i < method.inputs.length; i++) {
|
for (var i = 0; i < method.inputs.length; i++) {
|
||||||
var found = false;
|
var found = false;
|
||||||
for (var j = 0; j < types.length && !found; j++) {
|
for (var j = 0; j < inputTypes.length && !found; j++) {
|
||||||
found = types[j](method.inputs[i].type, params[i]);
|
found = inputTypes[j](method.inputs[i].type, params[i]);
|
||||||
}
|
}
|
||||||
if (!found) {
|
if (!found) {
|
||||||
console.error('unsupported json type: ' + method.inputs[i].type);
|
console.error('unsupported json type: ' + method.inputs[i].type);
|
||||||
@ -73,7 +81,75 @@ var toBytes = function (json, methodName, params) {
|
|||||||
return bytes;
|
return bytes;
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = {
|
var setupOutputTypes = function () {
|
||||||
toBytes: toBytes
|
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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user