UNPKG

xrpl

Version:

A TypeScript/JavaScript API for interacting with the XRP Ledger in Node.js and the browser

1,521 lines (1,333 loc) 1.17 MB
var xrpl; /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "../../node_modules/@xrplf/isomorphic/dist/internal/normalizeInput.js" /*!****************************************************************************!*\ !*** ../../node_modules/@xrplf/isomorphic/dist/internal/normalizeInput.js ***! \****************************************************************************/ (__unused_webpack_module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); const utils_js_1 = __webpack_require__(/*! @noble/hashes/utils.js */ "../../node_modules/@noble/hashes/utils.js"); /** * Normalize a string, number array, or Uint8Array to a Uint8Array. * Strings are converted to Uint8Array using UTF-8 encoding. * * @param input - value to normalize */ function normalizeInput(input) { if (Array.isArray(input)) { return new Uint8Array(input); } if (typeof input === 'string') { return (0, utils_js_1.utf8ToBytes)(input); } return input; } exports["default"] = normalizeInput; /***/ }, /***/ "../../node_modules/@xrplf/isomorphic/dist/internal/wrapNoble.js" /*!***********************************************************************!*\ !*** ../../node_modules/@xrplf/isomorphic/dist/internal/wrapNoble.js ***! \***********************************************************************/ (__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); const normalizeInput_1 = __importDefault(__webpack_require__(/*! ./normalizeInput */ "../../node_modules/@xrplf/isomorphic/dist/internal/normalizeInput.js")); /** * Wrap a CHash object from @noble/hashes to provide a interface that is isomorphic * * @param chash - {CHash} hash function to wrap */ function wrapNoble(chash) { function wrapped(input) { return chash((0, normalizeInput_1.default)(input)); } wrapped.create = () => { const hash = chash.create(); return { update(input) { hash.update((0, normalizeInput_1.default)(input)); return this; }, digest() { return hash.digest(); }, }; }; return wrapped; } exports["default"] = wrapNoble; /***/ }, /***/ "../../node_modules/@xrplf/isomorphic/dist/ripemd160/browser.js" /*!**********************************************************************!*\ !*** ../../node_modules/@xrplf/isomorphic/dist/ripemd160/browser.js ***! \**********************************************************************/ (__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ripemd160 = void 0; const legacy_js_1 = __webpack_require__(/*! @noble/hashes/legacy.js */ "../../node_modules/@noble/hashes/legacy.js"); const wrapNoble_1 = __importDefault(__webpack_require__(/*! ../internal/wrapNoble */ "../../node_modules/@xrplf/isomorphic/dist/internal/wrapNoble.js")); /** * Wrap noble-libs's ripemd160 implementation in HashFn */ exports.ripemd160 = (0, wrapNoble_1.default)(legacy_js_1.ripemd160); /***/ }, /***/ "../../node_modules/@xrplf/isomorphic/dist/sha256/browser.js" /*!*******************************************************************!*\ !*** ../../node_modules/@xrplf/isomorphic/dist/sha256/browser.js ***! \*******************************************************************/ (__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.sha256 = void 0; const sha2_js_1 = __webpack_require__(/*! @noble/hashes/sha2.js */ "../../node_modules/@noble/hashes/sha2.js"); const wrapNoble_1 = __importDefault(__webpack_require__(/*! ../internal/wrapNoble */ "../../node_modules/@xrplf/isomorphic/dist/internal/wrapNoble.js")); /** * Wrap noble-libs's sha256 implementation in HashFn */ exports.sha256 = (0, wrapNoble_1.default)(sha2_js_1.sha256); /***/ }, /***/ "../../node_modules/@xrplf/isomorphic/dist/sha512/browser.js" /*!*******************************************************************!*\ !*** ../../node_modules/@xrplf/isomorphic/dist/sha512/browser.js ***! \*******************************************************************/ (__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.sha512 = void 0; const sha2_js_1 = __webpack_require__(/*! @noble/hashes/sha2.js */ "../../node_modules/@noble/hashes/sha2.js"); const wrapNoble_1 = __importDefault(__webpack_require__(/*! ../internal/wrapNoble */ "../../node_modules/@xrplf/isomorphic/dist/internal/wrapNoble.js")); /** * Wrap noble-libs's sha512 implementation in HashFn */ exports.sha512 = (0, wrapNoble_1.default)(sha2_js_1.sha512); /***/ }, /***/ "../../node_modules/@xrplf/isomorphic/dist/utils/browser.js" /*!******************************************************************!*\ !*** ../../node_modules/@xrplf/isomorphic/dist/utils/browser.js ***! \******************************************************************/ (__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.randomBytes = exports.stringToHex = exports.hexToString = exports.hexToBytes = exports.bytesToHex = void 0; const utils_js_1 = __webpack_require__(/*! @noble/hashes/utils.js */ "../../node_modules/@noble/hashes/utils.js"); const shared_1 = __webpack_require__(/*! ./shared */ "../../node_modules/@xrplf/isomorphic/dist/utils/shared.js"); /* eslint-disable func-style -- Typed to ensure uniformity between node and browser implementations and docs */ const bytesToHex = (bytes) => { const hex = (0, utils_js_1.bytesToHex)(bytes instanceof Uint8Array ? bytes : Uint8Array.from(bytes)); return hex.toUpperCase(); }; exports.bytesToHex = bytesToHex; // A clone of hexToBytes from @noble/hashes without the length checks. This allows us to do our own checks. const hexToBytes = (hex) => { const len = hex.length; const array = new Uint8Array(len / 2); if (!shared_1.HEX_REGEX.test(hex)) { throw new Error('Invalid hex string'); } for (let i = 0; i < array.length; i++) { const j = i * 2; const hexByte = hex.slice(j, j + 2); const byte = Number.parseInt(hexByte, 16); if (Number.isNaN(byte) || byte < 0) { throw new Error('Invalid byte sequence'); } array[i] = byte; } return array; }; exports.hexToBytes = hexToBytes; const hexToString = (hex, encoding = 'utf8') => { return new TextDecoder(encoding).decode((0, exports.hexToBytes)(hex)); }; exports.hexToString = hexToString; const stringToHex = (string) => { return (0, exports.bytesToHex)(new TextEncoder().encode(string)); }; exports.stringToHex = stringToHex; /* eslint-enable func-style */ exports.randomBytes = utils_js_1.randomBytes; __exportStar(__webpack_require__(/*! ./shared */ "../../node_modules/@xrplf/isomorphic/dist/utils/shared.js"), exports); /***/ }, /***/ "../../node_modules/@xrplf/isomorphic/dist/utils/shared.js" /*!*****************************************************************!*\ !*** ../../node_modules/@xrplf/isomorphic/dist/utils/shared.js ***! \*****************************************************************/ (__unused_webpack_module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.equal = exports.concat = exports.HEX_REGEX = void 0; const utils_js_1 = __webpack_require__(/*! @noble/hashes/utils.js */ "../../node_modules/@noble/hashes/utils.js"); exports.HEX_REGEX = /^[A-F0-9]*$/iu; function concat(views) { return (0, utils_js_1.concatBytes)(...views); } exports.concat = concat; function equal(buf1, buf2) { if (buf1.byteLength !== buf2.byteLength) { return false; } const dv1 = new Int8Array(buf1); const dv2 = new Int8Array(buf2); for (let i = 0; i !== buf1.byteLength; i++) { if (dv1[i] !== dv2[i]) { return false; } } return true; } exports.equal = equal; /***/ }, /***/ "../../node_modules/@xrplf/isomorphic/dist/ws/browser.js" /*!***************************************************************!*\ !*** ../../node_modules/@xrplf/isomorphic/dist/ws/browser.js ***! \***************************************************************/ (__unused_webpack_module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); /* eslint-disable max-classes-per-file -- Needs to be a wrapper for ws */ const eventemitter3_1 = __webpack_require__(/*! eventemitter3 */ "../../node_modules/@xrplf/isomorphic/node_modules/eventemitter3/index.js"); /** * Provides `EventEmitter` interface for native browser `WebSocket`, * same, as `ws` package provides. */ class WSWrapper extends eventemitter3_1.EventEmitter { /** * Constructs a browser-safe websocket. * * @param url - URL to connect to. * @param _protocols - Not used. * @param _websocketOptions - Not used. */ constructor(url, _protocols, _websocketOptions) { super(); this.ws = new WebSocket(url); this.ws.onclose = (closeEvent) => { let reason; if (closeEvent.reason) { const enc = new TextEncoder(); reason = enc.encode(closeEvent.reason); } this.emit('close', closeEvent.code, reason); }; this.ws.onopen = () => { this.emit('open'); }; this.ws.onerror = (error) => { this.emit('error', error); }; this.ws.onmessage = (message) => { this.emit('message', message.data); }; } /** * Get the ready state of the websocket. * * @returns The Websocket's ready state. */ get readyState() { return this.ws.readyState; } /** * Closes the websocket. * * @param code - Close code. * @param reason - Close reason. */ close(code, reason) { if (this.readyState === 1) { this.ws.close(code, reason); } } /** * Sends a message over the Websocket connection. * * @param message - Message to send. */ send(message) { this.ws.send(message); } } WSWrapper.CONNECTING = 0; WSWrapper.OPEN = 1; WSWrapper.CLOSING = 2; WSWrapper.CLOSED = 3; exports["default"] = WSWrapper; /***/ }, /***/ "../../node_modules/@xrplf/isomorphic/node_modules/eventemitter3/index.js" /*!********************************************************************************!*\ !*** ../../node_modules/@xrplf/isomorphic/node_modules/eventemitter3/index.js ***! \********************************************************************************/ (module) { "use strict"; var has = Object.prototype.hasOwnProperty , prefix = '~'; /** * Constructor to create a storage for our `EE` objects. * An `Events` instance is a plain object whose properties are event names. * * @constructor * @private */ function Events() {} // // We try to not inherit from `Object.prototype`. In some engines creating an // instance in this way is faster than calling `Object.create(null)` directly. // If `Object.create(null)` is not supported we prefix the event names with a // character to make sure that the built-in object properties are not // overridden or used as an attack vector. // if (Object.create) { Events.prototype = Object.create(null); // // This hack is needed because the `__proto__` property is still inherited in // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5. // if (!new Events().__proto__) prefix = false; } /** * Representation of a single event listener. * * @param {Function} fn The listener function. * @param {*} context The context to invoke the listener with. * @param {Boolean} [once=false] Specify if the listener is a one-time listener. * @constructor * @private */ function EE(fn, context, once) { this.fn = fn; this.context = context; this.once = once || false; } /** * Add a listener for a given event. * * @param {EventEmitter} emitter Reference to the `EventEmitter` instance. * @param {(String|Symbol)} event The event name. * @param {Function} fn The listener function. * @param {*} context The context to invoke the listener with. * @param {Boolean} once Specify if the listener is a one-time listener. * @returns {EventEmitter} * @private */ function addListener(emitter, event, fn, context, once) { if (typeof fn !== 'function') { throw new TypeError('The listener must be a function'); } var listener = new EE(fn, context || emitter, once) , evt = prefix ? prefix + event : event; if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++; else if (!emitter._events[evt].fn) emitter._events[evt].push(listener); else emitter._events[evt] = [emitter._events[evt], listener]; return emitter; } /** * Clear event by name. * * @param {EventEmitter} emitter Reference to the `EventEmitter` instance. * @param {(String|Symbol)} evt The Event name. * @private */ function clearEvent(emitter, evt) { if (--emitter._eventsCount === 0) emitter._events = new Events(); else delete emitter._events[evt]; } /** * Minimal `EventEmitter` interface that is molded against the Node.js * `EventEmitter` interface. * * @constructor * @public */ function EventEmitter() { this._events = new Events(); this._eventsCount = 0; } /** * Return an array listing the events for which the emitter has registered * listeners. * * @returns {Array} * @public */ EventEmitter.prototype.eventNames = function eventNames() { var names = [] , events , name; if (this._eventsCount === 0) return names; for (name in (events = this._events)) { if (has.call(events, name)) names.push(prefix ? name.slice(1) : name); } if (Object.getOwnPropertySymbols) { return names.concat(Object.getOwnPropertySymbols(events)); } return names; }; /** * Return the listeners registered for a given event. * * @param {(String|Symbol)} event The event name. * @returns {Array} The registered listeners. * @public */ EventEmitter.prototype.listeners = function listeners(event) { var evt = prefix ? prefix + event : event , handlers = this._events[evt]; if (!handlers) return []; if (handlers.fn) return [handlers.fn]; for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) { ee[i] = handlers[i].fn; } return ee; }; /** * Return the number of listeners listening to a given event. * * @param {(String|Symbol)} event The event name. * @returns {Number} The number of listeners. * @public */ EventEmitter.prototype.listenerCount = function listenerCount(event) { var evt = prefix ? prefix + event : event , listeners = this._events[evt]; if (!listeners) return 0; if (listeners.fn) return 1; return listeners.length; }; /** * Calls each of the listeners registered for a given event. * * @param {(String|Symbol)} event The event name. * @returns {Boolean} `true` if the event had listeners, else `false`. * @public */ EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) { var evt = prefix ? prefix + event : event; if (!this._events[evt]) return false; var listeners = this._events[evt] , len = arguments.length , args , i; if (listeners.fn) { if (listeners.once) this.removeListener(event, listeners.fn, undefined, true); switch (len) { case 1: return listeners.fn.call(listeners.context), true; case 2: return listeners.fn.call(listeners.context, a1), true; case 3: return listeners.fn.call(listeners.context, a1, a2), true; case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true; case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true; case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true; } for (i = 1, args = new Array(len -1); i < len; i++) { args[i - 1] = arguments[i]; } listeners.fn.apply(listeners.context, args); } else { var length = listeners.length , j; for (i = 0; i < length; i++) { if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true); switch (len) { case 1: listeners[i].fn.call(listeners[i].context); break; case 2: listeners[i].fn.call(listeners[i].context, a1); break; case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break; case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break; default: if (!args) for (j = 1, args = new Array(len -1); j < len; j++) { args[j - 1] = arguments[j]; } listeners[i].fn.apply(listeners[i].context, args); } } } return true; }; /** * Add a listener for a given event. * * @param {(String|Symbol)} event The event name. * @param {Function} fn The listener function. * @param {*} [context=this] The context to invoke the listener with. * @returns {EventEmitter} `this`. * @public */ EventEmitter.prototype.on = function on(event, fn, context) { return addListener(this, event, fn, context, false); }; /** * Add a one-time listener for a given event. * * @param {(String|Symbol)} event The event name. * @param {Function} fn The listener function. * @param {*} [context=this] The context to invoke the listener with. * @returns {EventEmitter} `this`. * @public */ EventEmitter.prototype.once = function once(event, fn, context) { return addListener(this, event, fn, context, true); }; /** * Remove the listeners of a given event. * * @param {(String|Symbol)} event The event name. * @param {Function} fn Only remove the listeners that match this function. * @param {*} context Only remove the listeners that have this context. * @param {Boolean} once Only remove one-time listeners. * @returns {EventEmitter} `this`. * @public */ EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) { var evt = prefix ? prefix + event : event; if (!this._events[evt]) return this; if (!fn) { clearEvent(this, evt); return this; } var listeners = this._events[evt]; if (listeners.fn) { if ( listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context) ) { clearEvent(this, evt); } } else { for (var i = 0, events = [], length = listeners.length; i < length; i++) { if ( listeners[i].fn !== fn || (once && !listeners[i].once) || (context && listeners[i].context !== context) ) { events.push(listeners[i]); } } // // Reset the array, or remove it completely if we have no more listeners. // if (events.length) this._events[evt] = events.length === 1 ? events[0] : events; else clearEvent(this, evt); } return this; }; /** * Remove all listeners, or those of the specified event. * * @param {(String|Symbol)} [event] The event name. * @returns {EventEmitter} `this`. * @public */ EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) { var evt; if (event) { evt = prefix ? prefix + event : event; if (this._events[evt]) clearEvent(this, evt); } else { this._events = new Events(); this._eventsCount = 0; } return this; }; // // Alias methods names because people roll like that. // EventEmitter.prototype.off = EventEmitter.prototype.removeListener; EventEmitter.prototype.addListener = EventEmitter.prototype.on; // // Expose the prefix. // EventEmitter.prefixed = prefix; // // Allow `EventEmitter` to be imported as module namespace. // EventEmitter.EventEmitter = EventEmitter; // // Expose the module. // if (true) { module.exports = EventEmitter; } /***/ }, /***/ "../../node_modules/@xrplf/secret-numbers/dist/index.js" /*!**************************************************************!*\ !*** ../../node_modules/@xrplf/secret-numbers/dist/index.js ***! \**************************************************************/ (__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; Object.defineProperty(exports, "__esModule", ({ value: true })); __exportStar(__webpack_require__(/*! ./schema/Account */ "../../node_modules/@xrplf/secret-numbers/dist/schema/Account.js"), exports); __exportStar(__webpack_require__(/*! ./utils */ "../../node_modules/@xrplf/secret-numbers/dist/utils/index.js"), exports); /***/ }, /***/ "../../node_modules/@xrplf/secret-numbers/dist/schema/Account.js" /*!***********************************************************************!*\ !*** ../../node_modules/@xrplf/secret-numbers/dist/schema/Account.js ***! \***********************************************************************/ (__unused_webpack_module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Account = void 0; const ripple_keypairs_1 = __webpack_require__(/*! ripple-keypairs */ "../../node_modules/ripple-keypairs/dist/index.js"); const utils_1 = __webpack_require__(/*! ../utils */ "../../node_modules/@xrplf/secret-numbers/dist/utils/index.js"); class Account { constructor(secretNumbers, algorithm = 'ed25519') { this._account = { familySeed: '', address: '', keypair: { publicKey: '', privateKey: '', }, }; this._algorithm = algorithm; if (typeof secretNumbers === 'string') { this._secret = (0, utils_1.parseSecretString)(secretNumbers); } else if (Array.isArray(secretNumbers)) { this._secret = secretNumbers; } else if (secretNumbers instanceof Uint8Array) { this._secret = (0, utils_1.entropyToSecret)(secretNumbers); } else { this._secret = (0, utils_1.randomSecret)(); } validateLengths(this._secret); this.derive(); } getSecret() { return this._secret; } getSecretString() { return this._secret.join(' '); } getAddress() { return this._account.address; } getFamilySeed() { return this._account.familySeed; } getKeypair() { return this._account.keypair; } toString() { return this.getSecretString(); } derive() { try { const entropy = (0, utils_1.secretToEntropy)(this._secret); this._account.familySeed = (0, ripple_keypairs_1.generateSeed)({ entropy, algorithm: this._algorithm, }); this._account.keypair = (0, ripple_keypairs_1.deriveKeypair)(this._account.familySeed); this._account.address = (0, ripple_keypairs_1.deriveAddress)(this._account.keypair.publicKey); } catch (error) { let message = 'Unknown Error'; if (error instanceof Error) { message = error.message; } throw new Error(message); } } } exports.Account = Account; function validateLengths(secretNumbers) { if (secretNumbers.length !== 8) { throw new Error('Secret must have 8 numbers'); } secretNumbers.forEach((num) => { if (num.length !== 6) { throw new Error('Each secret number must be 6 digits'); } }); } /***/ }, /***/ "../../node_modules/@xrplf/secret-numbers/dist/utils/index.js" /*!********************************************************************!*\ !*** ../../node_modules/@xrplf/secret-numbers/dist/utils/index.js ***! \********************************************************************/ (__unused_webpack_module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.parseSecretString = exports.checkChecksum = exports.calculateChecksum = exports.secretToEntropy = exports.entropyToSecret = exports.randomSecret = exports.randomEntropy = void 0; const utils_1 = __webpack_require__(/*! @xrplf/isomorphic/utils */ "../../node_modules/@xrplf/isomorphic/dist/utils/browser.js"); function randomEntropy() { return (0, utils_1.randomBytes)(16); } exports.randomEntropy = randomEntropy; function calculateChecksum(position, value) { return (value * (position * 2 + 1)) % 9; } exports.calculateChecksum = calculateChecksum; function checkChecksum(position, value, checksum) { let normalizedChecksum; let normalizedValue; if (typeof value === 'string') { if (value.length !== 6) { throw new Error('value must have a length of 6'); } normalizedChecksum = parseInt(value.slice(5), 10); normalizedValue = parseInt(value.slice(0, 5), 10); } else { if (typeof checksum !== 'number') { throw new Error('checksum must be a number when value is a number'); } normalizedChecksum = checksum; normalizedValue = value; } return (normalizedValue * (position * 2 + 1)) % 9 === normalizedChecksum; } exports.checkChecksum = checkChecksum; function entropyToSecret(entropy) { const len = new Array(Math.ceil(entropy.length / 2)); const chunks = Array.from(len, (_a, chunk) => { const buffChunk = entropy.slice(chunk * 2, (chunk + 1) * 2); const no = parseInt((0, utils_1.bytesToHex)(buffChunk), 16); const fill = '0'.repeat(5 - String(no).length); return fill + String(no) + String(calculateChecksum(chunk, no)); }); if (chunks.length !== 8) { throw new Error('Chucks must have 8 digits'); } return chunks; } exports.entropyToSecret = entropyToSecret; function randomSecret() { return entropyToSecret(randomEntropy()); } exports.randomSecret = randomSecret; function secretToEntropy(secret) { return (0, utils_1.concat)(secret.map((chunk, i) => { const no = Number(chunk.slice(0, 5)); const checksum = Number(chunk.slice(5)); if (chunk.length !== 6) { throw new Error('Invalid secret: number invalid'); } if (!checkChecksum(i, no, checksum)) { throw new Error('Invalid secret part: checksum invalid'); } const hex = `0000${no.toString(16)}`.slice(-4); return (0, utils_1.hexToBytes)(hex); })); } exports.secretToEntropy = secretToEntropy; function parseSecretString(secret) { const normalizedSecret = secret.replace(/[^0-9]/gu, ''); if (normalizedSecret.length !== 48) { throw new Error('Invalid secret string (should contain 8 blocks of 6 digits'); } return Array.from(new Array(8), (_a, index) => { return normalizedSecret.slice(index * 6, (index + 1) * 6); }); } exports.parseSecretString = parseSecretString; /***/ }, /***/ "../../node_modules/eventemitter3/index.js" /*!*************************************************!*\ !*** ../../node_modules/eventemitter3/index.js ***! \*************************************************/ (module) { "use strict"; var has = Object.prototype.hasOwnProperty , prefix = '~'; /** * Constructor to create a storage for our `EE` objects. * An `Events` instance is a plain object whose properties are event names. * * @constructor * @private */ function Events() {} // // We try to not inherit from `Object.prototype`. In some engines creating an // instance in this way is faster than calling `Object.create(null)` directly. // If `Object.create(null)` is not supported we prefix the event names with a // character to make sure that the built-in object properties are not // overridden or used as an attack vector. // if (Object.create) { Events.prototype = Object.create(null); // // This hack is needed because the `__proto__` property is still inherited in // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5. // if (!new Events().__proto__) prefix = false; } /** * Representation of a single event listener. * * @param {Function} fn The listener function. * @param {*} context The context to invoke the listener with. * @param {Boolean} [once=false] Specify if the listener is a one-time listener. * @constructor * @private */ function EE(fn, context, once) { this.fn = fn; this.context = context; this.once = once || false; } /** * Add a listener for a given event. * * @param {EventEmitter} emitter Reference to the `EventEmitter` instance. * @param {(String|Symbol)} event The event name. * @param {Function} fn The listener function. * @param {*} context The context to invoke the listener with. * @param {Boolean} once Specify if the listener is a one-time listener. * @returns {EventEmitter} * @private */ function addListener(emitter, event, fn, context, once) { if (typeof fn !== 'function') { throw new TypeError('The listener must be a function'); } var listener = new EE(fn, context || emitter, once) , evt = prefix ? prefix + event : event; if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++; else if (!emitter._events[evt].fn) emitter._events[evt].push(listener); else emitter._events[evt] = [emitter._events[evt], listener]; return emitter; } /** * Clear event by name. * * @param {EventEmitter} emitter Reference to the `EventEmitter` instance. * @param {(String|Symbol)} evt The Event name. * @private */ function clearEvent(emitter, evt) { if (--emitter._eventsCount === 0) emitter._events = new Events(); else delete emitter._events[evt]; } /** * Minimal `EventEmitter` interface that is molded against the Node.js * `EventEmitter` interface. * * @constructor * @public */ function EventEmitter() { this._events = new Events(); this._eventsCount = 0; } /** * Return an array listing the events for which the emitter has registered * listeners. * * @returns {Array} * @public */ EventEmitter.prototype.eventNames = function eventNames() { var names = [] , events , name; if (this._eventsCount === 0) return names; for (name in (events = this._events)) { if (has.call(events, name)) names.push(prefix ? name.slice(1) : name); } if (Object.getOwnPropertySymbols) { return names.concat(Object.getOwnPropertySymbols(events)); } return names; }; /** * Return the listeners registered for a given event. * * @param {(String|Symbol)} event The event name. * @returns {Array} The registered listeners. * @public */ EventEmitter.prototype.listeners = function listeners(event) { var evt = prefix ? prefix + event : event , handlers = this._events[evt]; if (!handlers) return []; if (handlers.fn) return [handlers.fn]; for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) { ee[i] = handlers[i].fn; } return ee; }; /** * Return the number of listeners listening to a given event. * * @param {(String|Symbol)} event The event name. * @returns {Number} The number of listeners. * @public */ EventEmitter.prototype.listenerCount = function listenerCount(event) { var evt = prefix ? prefix + event : event , listeners = this._events[evt]; if (!listeners) return 0; if (listeners.fn) return 1; return listeners.length; }; /** * Calls each of the listeners registered for a given event. * * @param {(String|Symbol)} event The event name. * @returns {Boolean} `true` if the event had listeners, else `false`. * @public */ EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) { var evt = prefix ? prefix + event : event; if (!this._events[evt]) return false; var listeners = this._events[evt] , len = arguments.length , args , i; if (listeners.fn) { if (listeners.once) this.removeListener(event, listeners.fn, undefined, true); switch (len) { case 1: return listeners.fn.call(listeners.context), true; case 2: return listeners.fn.call(listeners.context, a1), true; case 3: return listeners.fn.call(listeners.context, a1, a2), true; case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true; case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true; case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true; } for (i = 1, args = new Array(len -1); i < len; i++) { args[i - 1] = arguments[i]; } listeners.fn.apply(listeners.context, args); } else { var length = listeners.length , j; for (i = 0; i < length; i++) { if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true); switch (len) { case 1: listeners[i].fn.call(listeners[i].context); break; case 2: listeners[i].fn.call(listeners[i].context, a1); break; case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break; case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break; default: if (!args) for (j = 1, args = new Array(len -1); j < len; j++) { args[j - 1] = arguments[j]; } listeners[i].fn.apply(listeners[i].context, args); } } } return true; }; /** * Add a listener for a given event. * * @param {(String|Symbol)} event The event name. * @param {Function} fn The listener function. * @param {*} [context=this] The context to invoke the listener with. * @returns {EventEmitter} `this`. * @public */ EventEmitter.prototype.on = function on(event, fn, context) { return addListener(this, event, fn, context, false); }; /** * Add a one-time listener for a given event. * * @param {(String|Symbol)} event The event name. * @param {Function} fn The listener function. * @param {*} [context=this] The context to invoke the listener with. * @returns {EventEmitter} `this`. * @public */ EventEmitter.prototype.once = function once(event, fn, context) { return addListener(this, event, fn, context, true); }; /** * Remove the listeners of a given event. * * @param {(String|Symbol)} event The event name. * @param {Function} fn Only remove the listeners that match this function. * @param {*} context Only remove the listeners that have this context. * @param {Boolean} once Only remove one-time listeners. * @returns {EventEmitter} `this`. * @public */ EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) { var evt = prefix ? prefix + event : event; if (!this._events[evt]) return this; if (!fn) { clearEvent(this, evt); return this; } var listeners = this._events[evt]; if (listeners.fn) { if ( listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context) ) { clearEvent(this, evt); } } else { for (var i = 0, events = [], length = listeners.length; i < length; i++) { if ( listeners[i].fn !== fn || (once && !listeners[i].once) || (context && listeners[i].context !== context) ) { events.push(listeners[i]); } } // // Reset the array, or remove it completely if we have no more listeners. // if (events.length) this._events[evt] = events.length === 1 ? events[0] : events; else clearEvent(this, evt); } return this; }; /** * Remove all listeners, or those of the specified event. * * @param {(String|Symbol)} [event] The event name. * @returns {EventEmitter} `this`. * @public */ EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) { var evt; if (event) { evt = prefix ? prefix + event : event; if (this._events[evt]) clearEvent(this, evt); } else { this._events = new Events(); this._eventsCount = 0; } return this; }; // // Alias methods names because people roll like that. // EventEmitter.prototype.off = EventEmitter.prototype.removeListener; EventEmitter.prototype.addListener = EventEmitter.prototype.on; // // Expose the prefix. // EventEmitter.prefixed = prefix; // // Allow `EventEmitter` to be imported as module namespace. // EventEmitter.EventEmitter = EventEmitter; // // Expose the module. // if (true) { module.exports = EventEmitter; } /***/ }, /***/ "../../node_modules/fast-json-stable-stringify/index.js" /*!**************************************************************!*\ !*** ../../node_modules/fast-json-stable-stringify/index.js ***! \**************************************************************/ (module) { "use strict"; module.exports = function (data, opts) { if (!opts) opts = {}; if (typeof opts === 'function') opts = { cmp: opts }; var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false; var cmp = opts.cmp && (function (f) { return function (node) { return function (a, b) { var aobj = { key: a, value: node[a] }; var bobj = { key: b, value: node[b] }; return f(aobj, bobj); }; }; })(opts.cmp); var seen = []; return (function stringify (node) { if (node && node.toJSON && typeof node.toJSON === 'function') { node = node.toJSON(); } if (node === undefined) return; if (typeof node == 'number') return isFinite(node) ? '' + node : 'null'; if (typeof node !== 'object') return JSON.stringify(node); var i, out; if (Array.isArray(node)) { out = '['; for (i = 0; i < node.length; i++) { if (i) out += ','; out += stringify(node[i]) || 'null'; } return out + ']'; } if (node === null) return 'null'; if (seen.indexOf(node) !== -1) { if (cycles) return JSON.stringify('__cycle__'); throw new TypeError('Converting circular structure to JSON'); } var seenIndex = seen.push(node) - 1; var keys = Object.keys(node).sort(cmp && cmp(node)); out = ''; for (i = 0; i < keys.length; i++) { var key = keys[i]; var value = stringify(node[key]); if (!value) continue; if (out) out += ','; out += JSON.stringify(key) + ':' + value; } seen.splice(seenIndex, 1); return '{' + out + '}'; })(data); }; /***/ }, /***/ "../../node_modules/ripple-address-codec/dist/index.js" /*!*************************************************************!*\ !*** ../../node_modules/ripple-address-codec/dist/index.js ***! \*************************************************************/ (__unused_webpack_module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.isValidXAddress = exports.decodeXAddress = exports.xAddressToClassicAddress = exports.encodeXAddress = exports.classicAddressToXAddress = exports.isValidClassicAddress = exports.decodeAccountPublic = exports.encodeAccountPublic = exports.decodeNodePublic = exports.encodeNodePublic = exports.decodeAccountID = exports.encodeAccountID = exports.decodeSeed = exports.encodeSeed = exports.codec = void 0; const utils_1 = __webpack_require__(/*! @xrplf/isomorphic/utils */ "../../node_modules/@xrplf/isomorphic/dist/utils/browser.js"); const xrp_codec_1 = __webpack_require__(/*! ./xrp-codec */ "../../node_modules/ripple-address-codec/dist/xrp-codec.js"); Object.defineProperty(exports, "codec", ({ enumerable: true, get: function () { return xrp_codec_1.codec; } })); Object.defineProperty(exports, "encodeSeed", ({ enumerable: true, get: function () { return xrp_codec_1.encodeSeed; } })); Object.defineProperty(exports, "decodeSeed", ({ enumerable: true, get: function () { return xrp_codec_1.decodeSeed; } })); Object.defineProperty(exports, "encodeAccountID", ({ enumerable: true, get: function () { return xrp_codec_1.encodeAccountID; } })); Object.defineProperty(exports, "decodeAccountID", ({ enumerable: true, get: function () { return xrp_codec_1.decodeAccountID; } })); Object.defineProperty(exports, "encodeNodePublic", ({ enumerable: true, get: function () { return xrp_codec_1.encodeNodePublic; } })); Object.defineProperty(exports, "decodeNodePublic", ({ enumerable: true, get: function () { return xrp_codec_1.decodeNodePublic; } })); Object.defineProperty(exports, "encodeAccountPublic", ({ enumerable: true, get: function () { return xrp_codec_1.encodeAccountPublic; } })); Object.defineProperty(exports, "decodeAccountPublic", ({ enumerable: true, get: function () { return xrp_codec_1.decodeAccountPublic; } })); Object.defineProperty(exports, "isValidClassicAddress", ({ enumerable: true, get: function () { return xrp_codec_1.isValidClassicAddress; } })); const PREFIX_BYTES = { // 5, 68 main: Uint8Array.from([0x05, 0x44]), // 4, 147 test: Uint8Array.from([0x04, 0x93]), }; const MAX_32_BIT_UNSIGNED_INT = 4294967295; function classicAddressToXAddress(classicAddress, tag, test) { const accountId = (0, xrp_codec_1.decodeAccountID)(classicAddress); return encodeXAddress(accountId, tag, test); } exports.classicAddressToXAddress = classicAddressToXAddress; function encodeXAddress(accountId, tag, test) { if (accountId.length !== 20) { // RIPEMD160 is 160 bits = 20 bytes throw new Error('Account ID must be 20 bytes'); } if (tag !== false && tag > MAX_32_BIT_UNSIGNED_INT) { throw new Error('Invalid tag'); } const theTag = tag || 0; // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Passing null is a common js mistake const flag = tag === false || tag == null ? 0 : 1; /* eslint-disable no-bitwise --- * need to use bitwise operations here */ const bytes = (0, utils_1.concat)([ test ? PREFIX_BYTES.test : PREFIX_BYTES.main, accountId, Uint8Array.from([ // 0x00 if no tag, 0x01 if 32-bit tag flag, // first byte theTag & 0xff, // second byte (theTag >> 8) & 0xff, // third byte (theTag >> 16) & 0xff, // fourth byte (theTag >> 24) & 0xff, 0, 0, 0, // four zero bytes (reserved for 64-bit tags) 0, ]), ]); /* eslint-enable no-bitwise */ return xrp_codec_1.codec.encodeChecked(bytes); } exports.encodeXAddress = encodeXAddress; function xAddressToClassicAddress(xAddress) { /* eslint-disable @typescript-eslint/naming-convention -- * TODO 'test' should be something like 'isTest', do this later */ const { accountId, tag, test } = decodeXAddress(xAddress); /* eslint-enable @typescript-eslint/naming-convention */ const classicAddress = (0, xrp_codec_1.encodeAccountID)(accountId); return { classicAddress, tag, test, }; } exports.xAddressToClassicAddress = xAddressToClassicAddress; function decodeXAddress(xAddress) { const decoded = xrp_codec_1.codec.decodeChecked(xAddress); /* eslint-disable @typescript-eslint/naming-convention -- * TODO 'test' should be something like 'isTest', do this later */ const test = isUint8ArrayForTestAddress(decoded); /* eslint-enable @typescript-eslint/naming-convention */ const accountId = decoded.slice(2, 22); const tag = tagFromUint8Array(decoded); return { accountId, tag, test, }; } exports.decodeXAddress = decodeXAddress; function isUint8ArrayForTestAddress(buf) { const decodedPrefix = buf.slice(0, 2); if ((0, utils_1.equal)(PREFIX_BYTES.main, decodedPrefix)) { return false; } if ((0, utils_1.equal)(PREFIX_BYTES.test, decodedPrefix)) { return true; } throw new Error('Invalid X-address: bad prefix'); } function tagFromUint8Array(buf) { const flag = buf[22]; if (flag >= 2) { // No support for 64-bit tags at this time throw new Error('Unsupported X-address'); } if (flag === 1) { // Little-endian to big-endian return buf[23] + buf[24] * 0x100 + buf[25] * 0x10000 + buf[26] * 0x1000000; } if (flag !== 0) { throw new Error('flag must be zero to indicate no tag'); } if (!(0, utils_1.equal)((0, utils_1.hexToBytes)('0000000000000000'), buf.slice(23, 23 + 8))) { throw new Error('remaining bytes must be zero'); } return false; } function isValidXAddress(xAddress) { try { decodeXAddress(xAddress); } catch (_error) { return false; } return true; } exports.isValidXAddress = isValidXAddress; /***/ }, /***/ "../../node_modules/ripple-address-codec/dist/utils.js" /*!*************************************************************!*\ !*** ../../node_modules/ripple-address-codec/dist/utils.js ***! \*************************************************************/ (__unused_webpack_module, exports) { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.concatArgs = exports.arrayEqual = void 0; /** * Check whether two sequences (e.g. Arrays of numbers) are equal. * * @param arr1 - One of the arrays to compare. * @param arr2 - The other array to compare. */ function arrayEqual(arr1, arr2) { if (arr1.length !== arr2.length) { return false; } let result = 0; for (let i = 0; i < arr1.length; i++) { // eslint-disable-next-line no-bitwise -- bitwise ops are required to avoid side-channel timing attacks result |= arr1[i] ^ arr2[i]; } return result === 0; } exports.arrayEqual = arrayEqual; /** * Check whether a value is a scalar * * @param val - The value to check. */ function isScalar(val) { return typeof val === 'number'; } /** * Concatenate all `arguments` into a single array. Each argument can be either * a single element or a sequence, which has a `length` property and supports * element retrieval via sequence[ix]. * * > concatArgs(1, [2, 3], Uint8Array.from([4,5]), new Uint8Array([6, 7])); * [1,2,3,4,5,6,7] * * @param args - Concatenate of these args into a single array. * @returns Array of concatenated arguments */ function concatArgs(...args) { return args.flatMap((arg) => { return isScalar(arg) ? [arg] : Array.from(arg); }); } exports.concatArgs = concatArgs; /***/ }, /***/ "../../node_modules/ripple-address-codec/dist/xrp-codec.js" /*!*****************************************************************!*\ !*** ../../node_modules/ripple-address-codec/dist/xrp-codec.js ***! \*****************************************************************/ (__unused_webpack_module, exports, __webpack_require__) { "use strict"; /** * Codec class */ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.isValidClassicAddress = exports.decodeAccountPublic = exports.encodeAccountPublic = exports.encodeNodePublic = exports.decodeNodePublic = exports.decodeAddress = exports.decodeAccountID = exports.encodeAddress = exports.encodeAccountID = exports.decodeSeed = exports.encodeSeed = exports.codec = void 0; const base_1 = __webpack_require__(/*! @scure/base */ "../../node_modules/@scure/base/index.js"); const sha256_1 = __webpack_require__(/*! @xrplf/isomorphic/sha256 */ "../../node_modules/@xrplf/isomorphic/dist/sha256/browser.js"); const utils_1 = __webpack_require__(/*! ./utils */ "../../node_modules/ripple-address-codec/dist/utils.js"); class Codec { constructor(options) { this._sha256 = options.sha256; this._codec = base_1.base58xrp; } /** * Encoder. * * @param bytes - Uint8Array of data to encode. * @param opts - Options object including the version bytes and the expected length of the dat