aboutsummaryrefslogtreecommitdiffstats
path: root/lib/abi.js
blob: 3082b823221b28642e57be3cb67e65d94d7f09cf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

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 padLeft = function (number, n) {
    return (new Array(n - number.toString.length + 1)).join("0") + number;
};

var setupTypes = 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) {
        return function (type, value) {
            if (type !== name) {
                return false; 
            }

            return padLeft(value, padding);
        };
    };

    return [
        prefixedType('uint'),
        prefixedType('int'),
        namedType('address', 20),
        namedType('bool', 1),
    ];
};

var types = setupTypes();

var toBytes = function (json, methodName, params) {
    var bytes = "";
    var index = findIndex(json, function (method) {
        return method.name === methodName;
    });

    if (index === -1) {
        return;
    }

    bytes = bytes + index + 'x';
    var method = json[index];
    
    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]);
        }
        if (!found) {
            console.error('unsupported json type: ' + method.inputs[i].type);
        }
        bytes += found;
    }
    return bytes;
};

module.exports = {
    toBytes: toBytes
};