UNPKG

3.68 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.sha256 = exports.keccak256 = exports.pack = void 0;
4var bignumber_1 = require("@ethersproject/bignumber");
5var bytes_1 = require("@ethersproject/bytes");
6var keccak256_1 = require("@ethersproject/keccak256");
7var sha2_1 = require("@ethersproject/sha2");
8var strings_1 = require("@ethersproject/strings");
9var regexBytes = new RegExp("^bytes([0-9]+)$");
10var regexNumber = new RegExp("^(u?int)([0-9]*)$");
11var regexArray = new RegExp("^(.*)\\[([0-9]*)\\]$");
12var Zeros = "0000000000000000000000000000000000000000000000000000000000000000";
13var logger_1 = require("@ethersproject/logger");
14var _version_1 = require("./_version");
15var logger = new logger_1.Logger(_version_1.version);
16function _pack(type, value, isArray) {
17 switch (type) {
18 case "address":
19 if (isArray) {
20 return (0, bytes_1.zeroPad)(value, 32);
21 }
22 return (0, bytes_1.arrayify)(value);
23 case "string":
24 return (0, strings_1.toUtf8Bytes)(value);
25 case "bytes":
26 return (0, bytes_1.arrayify)(value);
27 case "bool":
28 value = (value ? "0x01" : "0x00");
29 if (isArray) {
30 return (0, bytes_1.zeroPad)(value, 32);
31 }
32 return (0, bytes_1.arrayify)(value);
33 }
34 var match = type.match(regexNumber);
35 if (match) {
36 //let signed = (match[1] === "int")
37 var size = parseInt(match[2] || "256");
38 if ((match[2] && String(size) !== match[2]) || (size % 8 !== 0) || size === 0 || size > 256) {
39 logger.throwArgumentError("invalid number type", "type", type);
40 }
41 if (isArray) {
42 size = 256;
43 }
44 value = bignumber_1.BigNumber.from(value).toTwos(size);
45 return (0, bytes_1.zeroPad)(value, size / 8);
46 }
47 match = type.match(regexBytes);
48 if (match) {
49 var size = parseInt(match[1]);
50 if (String(size) !== match[1] || size === 0 || size > 32) {
51 logger.throwArgumentError("invalid bytes type", "type", type);
52 }
53 if ((0, bytes_1.arrayify)(value).byteLength !== size) {
54 logger.throwArgumentError("invalid value for " + type, "value", value);
55 }
56 if (isArray) {
57 return (0, bytes_1.arrayify)((value + Zeros).substring(0, 66));
58 }
59 return value;
60 }
61 match = type.match(regexArray);
62 if (match && Array.isArray(value)) {
63 var baseType_1 = match[1];
64 var count = parseInt(match[2] || String(value.length));
65 if (count != value.length) {
66 logger.throwArgumentError("invalid array length for " + type, "value", value);
67 }
68 var result_1 = [];
69 value.forEach(function (value) {
70 result_1.push(_pack(baseType_1, value, true));
71 });
72 return (0, bytes_1.concat)(result_1);
73 }
74 return logger.throwArgumentError("invalid type", "type", type);
75}
76// @TODO: Array Enum
77function pack(types, values) {
78 if (types.length != values.length) {
79 logger.throwArgumentError("wrong number of values; expected ${ types.length }", "values", values);
80 }
81 var tight = [];
82 types.forEach(function (type, index) {
83 tight.push(_pack(type, values[index]));
84 });
85 return (0, bytes_1.hexlify)((0, bytes_1.concat)(tight));
86}
87exports.pack = pack;
88function keccak256(types, values) {
89 return (0, keccak256_1.keccak256)(pack(types, values));
90}
91exports.keccak256 = keccak256;
92function sha256(types, values) {
93 return (0, sha2_1.sha256)(pack(types, values));
94}
95exports.sha256 = sha256;
96//# sourceMappingURL=index.js.map
\No newline at end of file