abi-coder.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.defaultAbiCoder = exports.AbiCoder = void 0;
  4. // See: https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI
  5. var bytes_1 = require("@ethersproject/bytes");
  6. var properties_1 = require("@ethersproject/properties");
  7. var logger_1 = require("@ethersproject/logger");
  8. var _version_1 = require("./_version");
  9. var logger = new logger_1.Logger(_version_1.version);
  10. var abstract_coder_1 = require("./coders/abstract-coder");
  11. var address_1 = require("./coders/address");
  12. var array_1 = require("./coders/array");
  13. var boolean_1 = require("./coders/boolean");
  14. var bytes_2 = require("./coders/bytes");
  15. var fixed_bytes_1 = require("./coders/fixed-bytes");
  16. var null_1 = require("./coders/null");
  17. var number_1 = require("./coders/number");
  18. var string_1 = require("./coders/string");
  19. var tuple_1 = require("./coders/tuple");
  20. var fragments_1 = require("./fragments");
  21. var paramTypeBytes = new RegExp(/^bytes([0-9]*)$/);
  22. var paramTypeNumber = new RegExp(/^(u?int)([0-9]*)$/);
  23. var AbiCoder = /** @class */ (function () {
  24. function AbiCoder(coerceFunc) {
  25. (0, properties_1.defineReadOnly)(this, "coerceFunc", coerceFunc || null);
  26. }
  27. AbiCoder.prototype._getCoder = function (param) {
  28. var _this = this;
  29. switch (param.baseType) {
  30. case "address":
  31. return new address_1.AddressCoder(param.name);
  32. case "bool":
  33. return new boolean_1.BooleanCoder(param.name);
  34. case "string":
  35. return new string_1.StringCoder(param.name);
  36. case "bytes":
  37. return new bytes_2.BytesCoder(param.name);
  38. case "array":
  39. return new array_1.ArrayCoder(this._getCoder(param.arrayChildren), param.arrayLength, param.name);
  40. case "tuple":
  41. return new tuple_1.TupleCoder((param.components || []).map(function (component) {
  42. return _this._getCoder(component);
  43. }), param.name);
  44. case "":
  45. return new null_1.NullCoder(param.name);
  46. }
  47. // u?int[0-9]*
  48. var match = param.type.match(paramTypeNumber);
  49. if (match) {
  50. var size = parseInt(match[2] || "256");
  51. if (size === 0 || size > 256 || (size % 8) !== 0) {
  52. logger.throwArgumentError("invalid " + match[1] + " bit length", "param", param);
  53. }
  54. return new number_1.NumberCoder(size / 8, (match[1] === "int"), param.name);
  55. }
  56. // bytes[0-9]+
  57. match = param.type.match(paramTypeBytes);
  58. if (match) {
  59. var size = parseInt(match[1]);
  60. if (size === 0 || size > 32) {
  61. logger.throwArgumentError("invalid bytes length", "param", param);
  62. }
  63. return new fixed_bytes_1.FixedBytesCoder(size, param.name);
  64. }
  65. return logger.throwArgumentError("invalid type", "type", param.type);
  66. };
  67. AbiCoder.prototype._getWordSize = function () { return 32; };
  68. AbiCoder.prototype._getReader = function (data, allowLoose) {
  69. return new abstract_coder_1.Reader(data, this._getWordSize(), this.coerceFunc, allowLoose);
  70. };
  71. AbiCoder.prototype._getWriter = function () {
  72. return new abstract_coder_1.Writer(this._getWordSize());
  73. };
  74. AbiCoder.prototype.getDefaultValue = function (types) {
  75. var _this = this;
  76. var coders = types.map(function (type) { return _this._getCoder(fragments_1.ParamType.from(type)); });
  77. var coder = new tuple_1.TupleCoder(coders, "_");
  78. return coder.defaultValue();
  79. };
  80. AbiCoder.prototype.encode = function (types, values) {
  81. var _this = this;
  82. if (types.length !== values.length) {
  83. logger.throwError("types/values length mismatch", logger_1.Logger.errors.INVALID_ARGUMENT, {
  84. count: { types: types.length, values: values.length },
  85. value: { types: types, values: values }
  86. });
  87. }
  88. var coders = types.map(function (type) { return _this._getCoder(fragments_1.ParamType.from(type)); });
  89. var coder = (new tuple_1.TupleCoder(coders, "_"));
  90. var writer = this._getWriter();
  91. coder.encode(writer, values);
  92. return writer.data;
  93. };
  94. AbiCoder.prototype.decode = function (types, data, loose) {
  95. var _this = this;
  96. var coders = types.map(function (type) { return _this._getCoder(fragments_1.ParamType.from(type)); });
  97. var coder = new tuple_1.TupleCoder(coders, "_");
  98. return coder.decode(this._getReader((0, bytes_1.arrayify)(data), loose));
  99. };
  100. return AbiCoder;
  101. }());
  102. exports.AbiCoder = AbiCoder;
  103. exports.defaultAbiCoder = new AbiCoder();
  104. //# sourceMappingURL=abi-coder.js.map