index.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.sha256 = exports.keccak256 = exports.pack = void 0;
  4. var bignumber_1 = require("@ethersproject/bignumber");
  5. var bytes_1 = require("@ethersproject/bytes");
  6. var keccak256_1 = require("@ethersproject/keccak256");
  7. var sha2_1 = require("@ethersproject/sha2");
  8. var strings_1 = require("@ethersproject/strings");
  9. var regexBytes = new RegExp("^bytes([0-9]+)$");
  10. var regexNumber = new RegExp("^(u?int)([0-9]*)$");
  11. var regexArray = new RegExp("^(.*)\\[([0-9]*)\\]$");
  12. var Zeros = "0000000000000000000000000000000000000000000000000000000000000000";
  13. var logger_1 = require("@ethersproject/logger");
  14. var _version_1 = require("./_version");
  15. var logger = new logger_1.Logger(_version_1.version);
  16. function _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
  77. function 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. }
  87. exports.pack = pack;
  88. function keccak256(types, values) {
  89. return (0, keccak256_1.keccak256)(pack(types, values));
  90. }
  91. exports.keccak256 = keccak256;
  92. function sha256(types, values) {
  93. return (0, sha2_1.sha256)(pack(types, values));
  94. }
  95. exports.sha256 = sha256;
  96. //# sourceMappingURL=index.js.map