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
JavaScript
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