init
This commit is contained in:
+12
@@ -0,0 +1,12 @@
|
||||
declare enum HashPrefix {
|
||||
TRANSACTION_ID = 1415073280,
|
||||
TRANSACTION_NODE = 1397638144,
|
||||
INNER_NODE = 1296649728,
|
||||
LEAF_NODE = 1296846336,
|
||||
TRANSACTION_SIGN = 1398036480,
|
||||
TRANSACTION_SIGN_TESTNET = 1937012736,
|
||||
TRANSACTION_MULTISIGN = 1397576704,
|
||||
LEDGER = 1280791040
|
||||
}
|
||||
export default HashPrefix;
|
||||
//# sourceMappingURL=HashPrefix.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"HashPrefix.d.ts","sourceRoot":"","sources":["../../../../src/utils/hashes/HashPrefix.ts"],"names":[],"mappings":"AAaA,aAAK,UAAU;IAEb,cAAc,aAAa;IAG3B,gBAAgB,aAAa;IAG7B,UAAU,aAAa;IAGvB,SAAS,aAAa;IAGtB,gBAAgB,aAAa;IAG7B,wBAAwB,aAAa;IAGrC,qBAAqB,aAAa;IAGlC,MAAM,aAAa;CACpB;AAED,eAAe,UAAU,CAAA"}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
var HashPrefix;
|
||||
(function (HashPrefix) {
|
||||
HashPrefix[HashPrefix["TRANSACTION_ID"] = 1415073280] = "TRANSACTION_ID";
|
||||
HashPrefix[HashPrefix["TRANSACTION_NODE"] = 1397638144] = "TRANSACTION_NODE";
|
||||
HashPrefix[HashPrefix["INNER_NODE"] = 1296649728] = "INNER_NODE";
|
||||
HashPrefix[HashPrefix["LEAF_NODE"] = 1296846336] = "LEAF_NODE";
|
||||
HashPrefix[HashPrefix["TRANSACTION_SIGN"] = 1398036480] = "TRANSACTION_SIGN";
|
||||
HashPrefix[HashPrefix["TRANSACTION_SIGN_TESTNET"] = 1937012736] = "TRANSACTION_SIGN_TESTNET";
|
||||
HashPrefix[HashPrefix["TRANSACTION_MULTISIGN"] = 1397576704] = "TRANSACTION_MULTISIGN";
|
||||
HashPrefix[HashPrefix["LEDGER"] = 1280791040] = "LEDGER";
|
||||
})(HashPrefix || (HashPrefix = {}));
|
||||
exports.default = HashPrefix;
|
||||
//# sourceMappingURL=HashPrefix.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"HashPrefix.js","sourceRoot":"","sources":["../../../../src/utils/hashes/HashPrefix.ts"],"names":[],"mappings":";;AAaA,IAAK,UAwBJ;AAxBD,WAAK,UAAU;IAEb,wEAA2B,CAAA;IAG3B,4EAA6B,CAAA;IAG7B,gEAAuB,CAAA;IAGvB,8DAAsB,CAAA;IAGtB,4EAA6B,CAAA;IAG7B,4FAAqC,CAAA;IAGrC,sFAAkC,CAAA;IAGlC,wDAAmB,CAAA;AACrB,CAAC,EAxBI,UAAU,KAAV,UAAU,QAwBd;AAED,kBAAe,UAAU,CAAA"}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
import { NodeType, Node } from './node';
|
||||
declare class InnerNode extends Node {
|
||||
leaves: {
|
||||
[slot: number]: Node | undefined;
|
||||
};
|
||||
type: NodeType;
|
||||
depth: number;
|
||||
empty: boolean;
|
||||
constructor(depth?: number);
|
||||
get hash(): string;
|
||||
addItem(tag: string, node: Node): void;
|
||||
setNode(slot: number, node: Node): void;
|
||||
getNode(slot: number): Node | undefined;
|
||||
}
|
||||
export default InnerNode;
|
||||
//# sourceMappingURL=InnerNode.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"InnerNode.d.ts","sourceRoot":"","sources":["../../../../../src/utils/hashes/SHAMap/InnerNode.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAWvC,cAAM,SAAU,SAAQ,IAAI;IACnB,MAAM,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;KAAE,CAAA;IAC5C,IAAI,EAAE,QAAQ,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,CAAA;gBAOF,KAAK,SAAI;IAa5B,IAAW,IAAI,IAAI,MAAM,CAaxB;IASM,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IAsCtC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IAevC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;CAM/C;AAED,eAAe,SAAS,CAAA"}
|
||||
+71
@@ -0,0 +1,71 @@
|
||||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const errors_1 = require("../../../errors");
|
||||
const HashPrefix_1 = __importDefault(require("../HashPrefix"));
|
||||
const sha512Half_1 = __importDefault(require("../sha512Half"));
|
||||
const LeafNode_1 = __importDefault(require("./LeafNode"));
|
||||
const node_1 = require("./node");
|
||||
const HEX_ZERO = '0000000000000000000000000000000000000000000000000000000000000000';
|
||||
const SLOT_MAX = 15;
|
||||
const HEX = 16;
|
||||
class InnerNode extends node_1.Node {
|
||||
constructor(depth = 0) {
|
||||
super();
|
||||
this.leaves = {};
|
||||
this.type = node_1.NodeType.INNER;
|
||||
this.depth = depth;
|
||||
this.empty = true;
|
||||
}
|
||||
get hash() {
|
||||
if (this.empty) {
|
||||
return HEX_ZERO;
|
||||
}
|
||||
let hex = '';
|
||||
for (let iter = 0; iter <= SLOT_MAX; iter++) {
|
||||
const child = this.leaves[iter];
|
||||
const hash = child == null ? HEX_ZERO : child.hash;
|
||||
hex += hash;
|
||||
}
|
||||
const prefix = HashPrefix_1.default.INNER_NODE.toString(HEX);
|
||||
return (0, sha512Half_1.default)(prefix + hex);
|
||||
}
|
||||
addItem(tag, node) {
|
||||
const existingNode = this.getNode(parseInt(tag[this.depth], HEX));
|
||||
if (existingNode === undefined) {
|
||||
this.setNode(parseInt(tag[this.depth], HEX), node);
|
||||
return;
|
||||
}
|
||||
if (existingNode instanceof InnerNode) {
|
||||
existingNode.addItem(tag, node);
|
||||
}
|
||||
else if (existingNode instanceof LeafNode_1.default) {
|
||||
if (existingNode.tag === tag) {
|
||||
throw new errors_1.XrplError('Tried to add a node to a SHAMap that was already in there.');
|
||||
}
|
||||
else {
|
||||
const newInnerNode = new InnerNode(this.depth + 1);
|
||||
newInnerNode.addItem(existingNode.tag, existingNode);
|
||||
newInnerNode.addItem(tag, node);
|
||||
this.setNode(parseInt(tag[this.depth], HEX), newInnerNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
setNode(slot, node) {
|
||||
if (slot < 0 || slot > SLOT_MAX) {
|
||||
throw new errors_1.XrplError('Invalid slot: slot must be between 0-15.');
|
||||
}
|
||||
this.leaves[slot] = node;
|
||||
this.empty = false;
|
||||
}
|
||||
getNode(slot) {
|
||||
if (slot < 0 || slot > SLOT_MAX) {
|
||||
throw new errors_1.XrplError('Invalid slot: slot must be between 0-15.');
|
||||
}
|
||||
return this.leaves[slot];
|
||||
}
|
||||
}
|
||||
exports.default = InnerNode;
|
||||
//# sourceMappingURL=InnerNode.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"InnerNode.js","sourceRoot":"","sources":["../../../../../src/utils/hashes/SHAMap/InnerNode.ts"],"names":[],"mappings":"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"}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
import { NodeType, Node } from './node';
|
||||
declare class LeafNode extends Node {
|
||||
tag: string;
|
||||
type: NodeType;
|
||||
data: string;
|
||||
constructor(tag: string, data: string, type: NodeType);
|
||||
get hash(): string;
|
||||
addItem(tag: string, node: Node): void;
|
||||
}
|
||||
export default LeafNode;
|
||||
//# sourceMappingURL=LeafNode.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"LeafNode.d.ts","sourceRoot":"","sources":["../../../../../src/utils/hashes/SHAMap/LeafNode.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAOvC,cAAM,QAAS,SAAQ,IAAI;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;gBASA,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ;IAa5D,IAAW,IAAI,IAAI,MAAM,CAiBxB;IASM,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI;CAI9C;AAED,eAAe,QAAQ,CAAA"}
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const errors_1 = require("../../../errors");
|
||||
const HashPrefix_1 = __importDefault(require("../HashPrefix"));
|
||||
const sha512Half_1 = __importDefault(require("../sha512Half"));
|
||||
const node_1 = require("./node");
|
||||
const HEX = 16;
|
||||
class LeafNode extends node_1.Node {
|
||||
constructor(tag, data, type) {
|
||||
super();
|
||||
this.tag = tag;
|
||||
this.type = type;
|
||||
this.data = data;
|
||||
}
|
||||
get hash() {
|
||||
switch (this.type) {
|
||||
case node_1.NodeType.ACCOUNT_STATE: {
|
||||
const leafPrefix = HashPrefix_1.default.LEAF_NODE.toString(HEX);
|
||||
return (0, sha512Half_1.default)(leafPrefix + this.data + this.tag);
|
||||
}
|
||||
case node_1.NodeType.TRANSACTION_NO_METADATA: {
|
||||
const txIDPrefix = HashPrefix_1.default.TRANSACTION_ID.toString(HEX);
|
||||
return (0, sha512Half_1.default)(txIDPrefix + this.data);
|
||||
}
|
||||
case node_1.NodeType.TRANSACTION_METADATA: {
|
||||
const txNodePrefix = HashPrefix_1.default.TRANSACTION_NODE.toString(HEX);
|
||||
return (0, sha512Half_1.default)(txNodePrefix + this.data + this.tag);
|
||||
}
|
||||
default:
|
||||
throw new errors_1.XrplError('Tried to hash a SHAMap node of unknown type.');
|
||||
}
|
||||
}
|
||||
addItem(tag, node) {
|
||||
throw new errors_1.XrplError('Cannot call addItem on a LeafNode');
|
||||
this.addItem(tag, node);
|
||||
}
|
||||
}
|
||||
exports.default = LeafNode;
|
||||
//# sourceMappingURL=LeafNode.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"LeafNode.js","sourceRoot":"","sources":["../../../../../src/utils/hashes/SHAMap/LeafNode.ts"],"names":[],"mappings":";;;;;AAAA,4CAA2C;AAC3C,+DAAsC;AACtC,+DAAsC;AAEtC,iCAAuC;AAEvC,MAAM,GAAG,GAAG,EAAE,CAAA;AAKd,MAAM,QAAS,SAAQ,WAAI;IAYzB,YAAmB,GAAW,EAAE,IAAY,EAAE,IAAc;QAC1D,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAQD,IAAW,IAAI;QACb,QAAQ,IAAI,CAAC,IAAI,EAAE;YACjB,KAAK,eAAQ,CAAC,aAAa,CAAC,CAAC;gBAC3B,MAAM,UAAU,GAAG,oBAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;gBACrD,OAAO,IAAA,oBAAU,EAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;aACrD;YACD,KAAK,eAAQ,CAAC,uBAAuB,CAAC,CAAC;gBACrC,MAAM,UAAU,GAAG,oBAAU,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;gBAC1D,OAAO,IAAA,oBAAU,EAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;aAC1C;YACD,KAAK,eAAQ,CAAC,oBAAoB,CAAC,CAAC;gBAClC,MAAM,YAAY,GAAG,oBAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;gBAC9D,OAAO,IAAA,oBAAU,EAAC,YAAY,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;aACvD;YACD;gBACE,MAAM,IAAI,kBAAS,CAAC,8CAA8C,CAAC,CAAA;SACtE;IACH,CAAC;IASM,OAAO,CAAC,GAAW,EAAE,IAAU;QACpC,MAAM,IAAI,kBAAS,CAAC,mCAAmC,CAAC,CAAA;QACxD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IACzB,CAAC;CACF;AAED,kBAAe,QAAQ,CAAA"}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
import InnerNode from './InnerNode';
|
||||
import { NodeType } from './node';
|
||||
declare class SHAMap {
|
||||
root: InnerNode;
|
||||
constructor();
|
||||
get hash(): string;
|
||||
addItem(tag: string, data: string, type: NodeType): void;
|
||||
}
|
||||
export * from './node';
|
||||
export default SHAMap;
|
||||
//# sourceMappingURL=index.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/utils/hashes/SHAMap/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,aAAa,CAAA;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAMjC,cAAM,MAAM;IACH,IAAI,EAAE,SAAS,CAAA;;IActB,IAAW,IAAI,IAAI,MAAM,CAExB;IASM,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI;CAGhE;AAED,cAAc,QAAQ,CAAA;AACtB,eAAe,MAAM,CAAA"}
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
"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);
|
||||
};
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const InnerNode_1 = __importDefault(require("./InnerNode"));
|
||||
const LeafNode_1 = __importDefault(require("./LeafNode"));
|
||||
class SHAMap {
|
||||
constructor() {
|
||||
this.root = new InnerNode_1.default(0);
|
||||
}
|
||||
get hash() {
|
||||
return this.root.hash;
|
||||
}
|
||||
addItem(tag, data, type) {
|
||||
this.root.addItem(tag, new LeafNode_1.default(tag, data, type));
|
||||
}
|
||||
}
|
||||
__exportStar(require("./node"), exports);
|
||||
exports.default = SHAMap;
|
||||
//# sourceMappingURL=index.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/utils/hashes/SHAMap/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,4DAAmC;AACnC,0DAAiC;AAOjC,MAAM,MAAM;IAMV;QACE,IAAI,CAAC,IAAI,GAAG,IAAI,mBAAS,CAAC,CAAC,CAAC,CAAA;IAC9B,CAAC;IAOD,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;IACvB,CAAC;IASM,OAAO,CAAC,GAAW,EAAE,IAAY,EAAE,IAAc;QACtD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,kBAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IACvD,CAAC;CACF;AAED,yCAAsB;AACtB,kBAAe,MAAM,CAAA"}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
export declare enum NodeType {
|
||||
INNER = 1,
|
||||
TRANSACTION_NO_METADATA = 2,
|
||||
TRANSACTION_METADATA = 3,
|
||||
ACCOUNT_STATE = 4
|
||||
}
|
||||
export declare abstract class Node {
|
||||
abstract get hash(): string;
|
||||
abstract addItem(_tag: string, _node: Node): void;
|
||||
}
|
||||
//# sourceMappingURL=node.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../../../src/utils/hashes/SHAMap/node.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,uBAAuB,IAAI;IAC3B,oBAAoB,IAAI;IACxB,aAAa,IAAI;CAClB;AAKD,8BAAsB,IAAI;IACxB,aAAoB,IAAI,IAAI,MAAM,CAAA;aAClB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,IAAI;CACzD"}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Node = exports.NodeType = void 0;
|
||||
var NodeType;
|
||||
(function (NodeType) {
|
||||
NodeType[NodeType["INNER"] = 1] = "INNER";
|
||||
NodeType[NodeType["TRANSACTION_NO_METADATA"] = 2] = "TRANSACTION_NO_METADATA";
|
||||
NodeType[NodeType["TRANSACTION_METADATA"] = 3] = "TRANSACTION_METADATA";
|
||||
NodeType[NodeType["ACCOUNT_STATE"] = 4] = "ACCOUNT_STATE";
|
||||
})(NodeType = exports.NodeType || (exports.NodeType = {}));
|
||||
class Node {
|
||||
}
|
||||
exports.Node = Node;
|
||||
//# sourceMappingURL=node.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../../../../src/utils/hashes/SHAMap/node.ts"],"names":[],"mappings":";;;AAAA,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,yCAAS,CAAA;IACT,6EAA2B,CAAA;IAC3B,uEAAwB,CAAA;IACxB,yDAAiB,CAAA;AACnB,CAAC,EALW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QAKnB;AAKD,MAAsB,IAAI;CAGzB;AAHD,oBAGC"}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
import type { Ledger } from '../../models/ledger';
|
||||
import { LedgerEntry } from '../../models/ledger';
|
||||
import { Transaction, TransactionMetadata } from '../../models/transactions';
|
||||
export declare function hashSignedTx(tx: Transaction | string): string;
|
||||
export declare function hashLedgerHeader(ledgerHeader: Ledger): string;
|
||||
export declare function hashTxTree(transactions: Array<Transaction & {
|
||||
metaData?: TransactionMetadata;
|
||||
}>): string;
|
||||
export declare function hashStateTree(entries: LedgerEntry[]): string;
|
||||
declare function hashLedger(ledger: Ledger, options?: {
|
||||
computeTreeHashes?: boolean;
|
||||
}): string;
|
||||
export default hashLedger;
|
||||
//# sourceMappingURL=hashLedger.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"hashLedger.d.ts","sourceRoot":"","sources":["../../../../src/utils/hashes/hashLedger.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AA8D5E,wBAAgB,YAAY,CAAC,EAAE,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CAkB7D;AASD,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAgB7D;AASD,wBAAgB,UAAU,CACxB,YAAY,EAAE,KAAK,CAAC,WAAW,GAAG;IAAE,QAAQ,CAAC,EAAE,mBAAmB,CAAA;CAAE,CAAC,GACpE,MAAM,CAWR;AASD,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAS5D;AAkED,iBAAS,UAAU,CACjB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IACP,iBAAiB,CAAC,EAAE,OAAO,CAAA;CACvB,GACL,MAAM,CAMR;AAED,eAAe,UAAU,CAAA"}
|
||||
+164
@@ -0,0 +1,164 @@
|
||||
"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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.hashStateTree = exports.hashTxTree = exports.hashLedgerHeader = exports.hashSignedTx = void 0;
|
||||
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
||||
const ripple_binary_codec_1 = require("ripple-binary-codec");
|
||||
const errors_1 = require("../../errors");
|
||||
const HashPrefix_1 = __importDefault(require("./HashPrefix"));
|
||||
const sha512Half_1 = __importDefault(require("./sha512Half"));
|
||||
const SHAMap_1 = __importStar(require("./SHAMap"));
|
||||
const HEX = 16;
|
||||
function intToHex(integer, byteLength) {
|
||||
const foo = Number(integer)
|
||||
.toString(HEX)
|
||||
.padStart(byteLength * 2, '0');
|
||||
return foo;
|
||||
}
|
||||
function bytesToHex(bytes) {
|
||||
return Buffer.from(bytes).toString('hex');
|
||||
}
|
||||
function bigintToHex(integerString, byteLength) {
|
||||
const hex = new bignumber_js_1.default(integerString).toString(HEX);
|
||||
return hex.padStart(byteLength * 2, '0');
|
||||
}
|
||||
function addLengthPrefix(hex) {
|
||||
const length = hex.length / 2;
|
||||
if (length <= 192) {
|
||||
return bytesToHex([length]) + hex;
|
||||
}
|
||||
if (length <= 12480) {
|
||||
const prefix = length - 193;
|
||||
return bytesToHex([193 + (prefix >>> 8), prefix & 0xff]) + hex;
|
||||
}
|
||||
if (length <= 918744) {
|
||||
const prefix = length - 12481;
|
||||
return (bytesToHex([
|
||||
241 + (prefix >>> 16),
|
||||
(prefix >>> 8) & 0xff,
|
||||
prefix & 0xff,
|
||||
]) + hex);
|
||||
}
|
||||
throw new errors_1.XrplError('Variable integer overflow.');
|
||||
}
|
||||
function hashSignedTx(tx) {
|
||||
let txBlob;
|
||||
let txObject;
|
||||
if (typeof tx === 'string') {
|
||||
txBlob = tx;
|
||||
txObject = (0, ripple_binary_codec_1.decode)(tx);
|
||||
}
|
||||
else {
|
||||
txBlob = (0, ripple_binary_codec_1.encode)(tx);
|
||||
txObject = tx;
|
||||
}
|
||||
if (txObject.TxnSignature === undefined && txObject.Signers === undefined) {
|
||||
throw new errors_1.ValidationError('The transaction must be signed to hash it.');
|
||||
}
|
||||
const prefix = HashPrefix_1.default.TRANSACTION_ID.toString(16).toUpperCase();
|
||||
return (0, sha512Half_1.default)(prefix.concat(txBlob));
|
||||
}
|
||||
exports.hashSignedTx = hashSignedTx;
|
||||
function hashLedgerHeader(ledgerHeader) {
|
||||
const prefix = HashPrefix_1.default.LEDGER.toString(HEX).toUpperCase();
|
||||
const ledger = prefix +
|
||||
intToHex(Number(ledgerHeader.ledger_index), 4) +
|
||||
bigintToHex(ledgerHeader.total_coins, 8) +
|
||||
ledgerHeader.parent_hash +
|
||||
ledgerHeader.transaction_hash +
|
||||
ledgerHeader.account_hash +
|
||||
intToHex(ledgerHeader.parent_close_time, 4) +
|
||||
intToHex(ledgerHeader.close_time, 4) +
|
||||
intToHex(ledgerHeader.close_time_resolution, 1) +
|
||||
intToHex(ledgerHeader.close_flags, 1);
|
||||
return (0, sha512Half_1.default)(ledger);
|
||||
}
|
||||
exports.hashLedgerHeader = hashLedgerHeader;
|
||||
function hashTxTree(transactions) {
|
||||
var _a;
|
||||
const shamap = new SHAMap_1.default();
|
||||
for (const txJSON of transactions) {
|
||||
const txBlobHex = (0, ripple_binary_codec_1.encode)(txJSON);
|
||||
const metaHex = (0, ripple_binary_codec_1.encode)((_a = txJSON.metaData) !== null && _a !== void 0 ? _a : {});
|
||||
const txHash = hashSignedTx(txBlobHex);
|
||||
const data = addLengthPrefix(txBlobHex) + addLengthPrefix(metaHex);
|
||||
shamap.addItem(txHash, data, SHAMap_1.NodeType.TRANSACTION_METADATA);
|
||||
}
|
||||
return shamap.hash;
|
||||
}
|
||||
exports.hashTxTree = hashTxTree;
|
||||
function hashStateTree(entries) {
|
||||
const shamap = new SHAMap_1.default();
|
||||
entries.forEach((ledgerEntry) => {
|
||||
const data = (0, ripple_binary_codec_1.encode)(ledgerEntry);
|
||||
shamap.addItem(ledgerEntry.index, data, SHAMap_1.NodeType.ACCOUNT_STATE);
|
||||
});
|
||||
return shamap.hash;
|
||||
}
|
||||
exports.hashStateTree = hashStateTree;
|
||||
function computeTransactionHash(ledger, options) {
|
||||
const { transaction_hash } = ledger;
|
||||
if (!options.computeTreeHashes) {
|
||||
return transaction_hash;
|
||||
}
|
||||
if (ledger.transactions == null) {
|
||||
throw new errors_1.ValidationError('transactions is missing from the ledger');
|
||||
}
|
||||
const transactionHash = hashTxTree(ledger.transactions);
|
||||
if (transaction_hash !== transactionHash) {
|
||||
throw new errors_1.ValidationError('transactionHash in header' +
|
||||
' does not match computed hash of transactions', {
|
||||
transactionHashInHeader: transaction_hash,
|
||||
computedHashOfTransactions: transactionHash,
|
||||
});
|
||||
}
|
||||
return transactionHash;
|
||||
}
|
||||
function computeStateHash(ledger, options) {
|
||||
const { account_hash } = ledger;
|
||||
if (!options.computeTreeHashes) {
|
||||
return account_hash;
|
||||
}
|
||||
if (ledger.accountState == null) {
|
||||
throw new errors_1.ValidationError('accountState is missing from the ledger');
|
||||
}
|
||||
const stateHash = hashStateTree(ledger.accountState);
|
||||
if (account_hash !== stateHash) {
|
||||
throw new errors_1.ValidationError('stateHash in header does not match computed hash of state');
|
||||
}
|
||||
return stateHash;
|
||||
}
|
||||
function hashLedger(ledger, options = {}) {
|
||||
const subhashes = {
|
||||
transaction_hash: computeTransactionHash(ledger, options),
|
||||
account_hash: computeStateHash(ledger, options),
|
||||
};
|
||||
return hashLedgerHeader(Object.assign(Object.assign({}, ledger), subhashes));
|
||||
}
|
||||
exports.default = hashLedger;
|
||||
//# sourceMappingURL=hashLedger.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"hashLedger.js","sourceRoot":"","sources":["../../../../src/utils/hashes/hashLedger.ts"],"names":[],"mappings":"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"}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
import hashLedger, { hashLedgerHeader, hashSignedTx, hashTxTree, hashStateTree } from './hashLedger';
|
||||
export declare function hashTx(txBlobHex: string): string;
|
||||
export declare function hashAccountRoot(address: string): string;
|
||||
export declare function hashSignerListId(address: string): string;
|
||||
export declare function hashOfferId(address: string, sequence: number): string;
|
||||
export declare function hashTrustline(address1: string, address2: string, currency: string): string;
|
||||
export declare function hashEscrow(address: string, sequence: number): string;
|
||||
export declare function hashPaymentChannel(address: string, dstAddress: string, sequence: number): string;
|
||||
export { hashLedgerHeader, hashSignedTx, hashLedger, hashStateTree, hashTxTree };
|
||||
//# sourceMappingURL=index.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/hashes/index.ts"],"names":[],"mappings":"AAQA,OAAO,UAAU,EAAE,EACjB,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,aAAa,EACd,MAAM,cAAc,CAAA;AAsCrB,wBAAgB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGhD;AAgBD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAgBD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIxD;AAiBD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQrE;AAWD,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,MAAM,CAcR;AAUD,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMpE;AAWD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,CAOR;AAED,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,CAAA"}
|
||||
+106
@@ -0,0 +1,106 @@
|
||||
"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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.hashTxTree = exports.hashStateTree = exports.hashLedger = exports.hashSignedTx = exports.hashLedgerHeader = exports.hashPaymentChannel = exports.hashEscrow = exports.hashTrustline = exports.hashOfferId = exports.hashSignerListId = exports.hashAccountRoot = exports.hashTx = void 0;
|
||||
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
||||
const ripple_address_codec_1 = require("ripple-address-codec");
|
||||
const hashLedger_1 = __importStar(require("./hashLedger"));
|
||||
exports.hashLedger = hashLedger_1.default;
|
||||
Object.defineProperty(exports, "hashLedgerHeader", { enumerable: true, get: function () { return hashLedger_1.hashLedgerHeader; } });
|
||||
Object.defineProperty(exports, "hashSignedTx", { enumerable: true, get: function () { return hashLedger_1.hashSignedTx; } });
|
||||
Object.defineProperty(exports, "hashTxTree", { enumerable: true, get: function () { return hashLedger_1.hashTxTree; } });
|
||||
Object.defineProperty(exports, "hashStateTree", { enumerable: true, get: function () { return hashLedger_1.hashStateTree; } });
|
||||
const HashPrefix_1 = __importDefault(require("./HashPrefix"));
|
||||
const ledgerSpaces_1 = __importDefault(require("./ledgerSpaces"));
|
||||
const sha512Half_1 = __importDefault(require("./sha512Half"));
|
||||
const HEX = 16;
|
||||
const BYTE_LENGTH = 4;
|
||||
function addressToHex(address) {
|
||||
return Buffer.from((0, ripple_address_codec_1.decodeAccountID)(address)).toString('hex');
|
||||
}
|
||||
function ledgerSpaceHex(name) {
|
||||
return ledgerSpaces_1.default[name].charCodeAt(0).toString(HEX).padStart(4, '0');
|
||||
}
|
||||
const MASK = 0xff;
|
||||
function currencyToHex(currency) {
|
||||
if (currency.length !== 3) {
|
||||
return currency;
|
||||
}
|
||||
const bytes = Array(20).fill(0);
|
||||
bytes[12] = currency.charCodeAt(0) & MASK;
|
||||
bytes[13] = currency.charCodeAt(1) & MASK;
|
||||
bytes[14] = currency.charCodeAt(2) & MASK;
|
||||
return Buffer.from(bytes).toString('hex');
|
||||
}
|
||||
function hashTx(txBlobHex) {
|
||||
const prefix = HashPrefix_1.default.TRANSACTION_SIGN.toString(HEX).toUpperCase();
|
||||
return (0, sha512Half_1.default)(prefix + txBlobHex);
|
||||
}
|
||||
exports.hashTx = hashTx;
|
||||
function hashAccountRoot(address) {
|
||||
return (0, sha512Half_1.default)(ledgerSpaceHex('account') + addressToHex(address));
|
||||
}
|
||||
exports.hashAccountRoot = hashAccountRoot;
|
||||
function hashSignerListId(address) {
|
||||
return (0, sha512Half_1.default)(`${ledgerSpaceHex('signerList') + addressToHex(address)}00000000`);
|
||||
}
|
||||
exports.hashSignerListId = hashSignerListId;
|
||||
function hashOfferId(address, sequence) {
|
||||
const hexPrefix = ledgerSpaces_1.default.offer
|
||||
.charCodeAt(0)
|
||||
.toString(HEX)
|
||||
.padStart(2, '0');
|
||||
const hexSequence = sequence.toString(HEX).padStart(8, '0');
|
||||
const prefix = `00${hexPrefix}`;
|
||||
return (0, sha512Half_1.default)(prefix + addressToHex(address) + hexSequence);
|
||||
}
|
||||
exports.hashOfferId = hashOfferId;
|
||||
function hashTrustline(address1, address2, currency) {
|
||||
const address1Hex = addressToHex(address1);
|
||||
const address2Hex = addressToHex(address2);
|
||||
const swap = new bignumber_js_1.default(address1Hex, 16).isGreaterThan(new bignumber_js_1.default(address2Hex, 16));
|
||||
const lowAddressHex = swap ? address2Hex : address1Hex;
|
||||
const highAddressHex = swap ? address1Hex : address2Hex;
|
||||
const prefix = ledgerSpaceHex('rippleState');
|
||||
return (0, sha512Half_1.default)(prefix + lowAddressHex + highAddressHex + currencyToHex(currency));
|
||||
}
|
||||
exports.hashTrustline = hashTrustline;
|
||||
function hashEscrow(address, sequence) {
|
||||
return (0, sha512Half_1.default)(ledgerSpaceHex('escrow') +
|
||||
addressToHex(address) +
|
||||
sequence.toString(HEX).padStart(BYTE_LENGTH * 2, '0'));
|
||||
}
|
||||
exports.hashEscrow = hashEscrow;
|
||||
function hashPaymentChannel(address, dstAddress, sequence) {
|
||||
return (0, sha512Half_1.default)(ledgerSpaceHex('paychan') +
|
||||
addressToHex(address) +
|
||||
addressToHex(dstAddress) +
|
||||
sequence.toString(HEX).padStart(BYTE_LENGTH * 2, '0'));
|
||||
}
|
||||
exports.hashPaymentChannel = hashPaymentChannel;
|
||||
//# sourceMappingURL=index.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/hashes/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,gEAAoC;AACpC,+DAAsD;AAEtD,2DAKqB;AA6KoB,qBAlLlC,oBAAU,CAkLkC;AAA1C,iGAjLP,6BAAgB,OAiLO;AAAE,6FAhLzB,yBAAY,OAgLyB;AAA6B,2FA/KlE,uBAAU,OA+KkE;AAAzB,8FA9KnD,0BAAa,OA8KmD;AA5KlE,8DAAqC;AACrC,kEAAyC;AACzC,8DAAqC;AAErC,MAAM,GAAG,GAAG,EAAE,CAAA;AACd,MAAM,WAAW,GAAG,CAAC,CAAA;AAErB,SAAS,YAAY,CAAC,OAAe;IACnC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAA,sCAAe,EAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAC9D,CAAC;AAED,SAAS,cAAc,CAAC,IAA+B;IACrD,OAAO,sBAAY,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,IAAI,GAAG,IAAI,CAAA;AACjB,SAAS,aAAa,CAAC,QAAgB;IACrC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QACzB,OAAO,QAAQ,CAAA;KAChB;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC/B,KAAK,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IACzC,KAAK,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IACzC,KAAK,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IACzC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAC3C,CAAC;AAWD,SAAgB,MAAM,CAAC,SAAiB;IACtC,MAAM,MAAM,GAAG,oBAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;IACtE,OAAO,IAAA,oBAAU,EAAC,MAAM,GAAG,SAAS,CAAC,CAAA;AACvC,CAAC;AAHD,wBAGC;AAgBD,SAAgB,eAAe,CAAC,OAAe;IAC7C,OAAO,IAAA,oBAAU,EAAC,cAAc,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAA;AACtE,CAAC;AAFD,0CAEC;AAgBD,SAAgB,gBAAgB,CAAC,OAAe;IAC9C,OAAO,IAAA,oBAAU,EACf,GAAG,cAAc,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAClE,CAAA;AACH,CAAC;AAJD,4CAIC;AAiBD,SAAgB,WAAW,CAAC,OAAe,EAAE,QAAgB;IAC3D,MAAM,SAAS,GAAG,sBAAY,CAAC,KAAK;SACjC,UAAU,CAAC,CAAC,CAAC;SACb,QAAQ,CAAC,GAAG,CAAC;SACb,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACnB,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC3D,MAAM,MAAM,GAAG,KAAK,SAAS,EAAE,CAAA;IAC/B,OAAO,IAAA,oBAAU,EAAC,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,CAAA;AACjE,CAAC;AARD,kCAQC;AAWD,SAAgB,aAAa,CAC3B,QAAgB,EAChB,QAAgB,EAChB,QAAgB;IAEhB,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IAC1C,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IAE1C,MAAM,IAAI,GAAG,IAAI,sBAAS,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,aAAa,CACvD,IAAI,sBAAS,CAAC,WAAW,EAAE,EAAE,CAAC,CAC/B,CAAA;IACD,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAA;IACtD,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAA;IAEvD,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,CAAC,CAAA;IAC5C,OAAO,IAAA,oBAAU,EACf,MAAM,GAAG,aAAa,GAAG,cAAc,GAAG,aAAa,CAAC,QAAQ,CAAC,CAClE,CAAA;AACH,CAAC;AAlBD,sCAkBC;AAUD,SAAgB,UAAU,CAAC,OAAe,EAAE,QAAgB;IAC1D,OAAO,IAAA,oBAAU,EACf,cAAc,CAAC,QAAQ,CAAC;QACtB,YAAY,CAAC,OAAO,CAAC;QACrB,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,EAAE,GAAG,CAAC,CACxD,CAAA;AACH,CAAC;AAND,gCAMC;AAWD,SAAgB,kBAAkB,CAChC,OAAe,EACf,UAAkB,EAClB,QAAgB;IAEhB,OAAO,IAAA,oBAAU,EACf,cAAc,CAAC,SAAS,CAAC;QACvB,YAAY,CAAC,OAAO,CAAC;QACrB,YAAY,CAAC,UAAU,CAAC;QACxB,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,EAAE,GAAG,CAAC,CACxD,CAAA;AACH,CAAC;AAXD,gDAWC"}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
declare const ledgerSpaces: {
|
||||
account: string;
|
||||
dirNode: string;
|
||||
generatorMap: string;
|
||||
rippleState: string;
|
||||
offer: string;
|
||||
ownerDir: string;
|
||||
bookDir: string;
|
||||
contract: string;
|
||||
skipList: string;
|
||||
escrow: string;
|
||||
amendment: string;
|
||||
feeSettings: string;
|
||||
ticket: string;
|
||||
signerList: string;
|
||||
paychan: string;
|
||||
check: string;
|
||||
depositPreauth: string;
|
||||
};
|
||||
export default ledgerSpaces;
|
||||
//# sourceMappingURL=ledgerSpaces.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ledgerSpaces.d.ts","sourceRoot":"","sources":["../../../../src/utils/hashes/ledgerSpaces.ts"],"names":[],"mappings":"AAUA,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;CAqBjB,CAAA;AAED,eAAe,YAAY,CAAA"}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const ledgerSpaces = {
|
||||
account: 'a',
|
||||
dirNode: 'd',
|
||||
generatorMap: 'g',
|
||||
rippleState: 'r',
|
||||
offer: 'o',
|
||||
ownerDir: 'O',
|
||||
bookDir: 'B',
|
||||
contract: 'c',
|
||||
skipList: 's',
|
||||
escrow: 'u',
|
||||
amendment: 'f',
|
||||
feeSettings: 'e',
|
||||
ticket: 'T',
|
||||
signerList: 'S',
|
||||
paychan: 'x',
|
||||
check: 'C',
|
||||
depositPreauth: 'p',
|
||||
};
|
||||
exports.default = ledgerSpaces;
|
||||
//# sourceMappingURL=ledgerSpaces.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ledgerSpaces.js","sourceRoot":"","sources":["../../../../src/utils/hashes/ledgerSpaces.ts"],"names":[],"mappings":";;AAUA,MAAM,YAAY,GAAG;IACnB,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,GAAG;IACZ,YAAY,EAAE,GAAG;IACjB,WAAW,EAAE,GAAG;IAEhB,KAAK,EAAE,GAAG;IAEV,QAAQ,EAAE,GAAG;IAEb,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,GAAG;IACb,MAAM,EAAE,GAAG;IACX,SAAS,EAAE,GAAG;IACd,WAAW,EAAE,GAAG;IAChB,MAAM,EAAE,GAAG;IACX,UAAU,EAAE,GAAG;IACf,OAAO,EAAE,GAAG;IACZ,KAAK,EAAE,GAAG;IACV,cAAc,EAAE,GAAG;CACpB,CAAA;AAED,kBAAe,YAAY,CAAA"}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
declare function sha512Half(hex: string): string;
|
||||
export default sha512Half;
|
||||
//# sourceMappingURL=sha512Half.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"sha512Half.d.ts","sourceRoot":"","sources":["../../../../src/utils/hashes/sha512Half.ts"],"names":[],"mappings":"AAUA,iBAAS,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMvC;AAED,eAAe,UAAU,CAAA"}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const crypto_1 = require("crypto");
|
||||
const HASH_SIZE = 64;
|
||||
function sha512Half(hex) {
|
||||
return (0, crypto_1.createHash)('sha512')
|
||||
.update(Buffer.from(hex, 'hex'))
|
||||
.digest('hex')
|
||||
.toUpperCase()
|
||||
.slice(0, HASH_SIZE);
|
||||
}
|
||||
exports.default = sha512Half;
|
||||
//# sourceMappingURL=sha512Half.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"sha512Half.js","sourceRoot":"","sources":["../../../../src/utils/hashes/sha512Half.ts"],"names":[],"mappings":";;AAAA,mCAAmC;AAEnC,MAAM,SAAS,GAAG,EAAE,CAAA;AAQpB,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SAC/B,MAAM,CAAC,KAAK,CAAC;SACb,WAAW,EAAE;SACb,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;AACxB,CAAC;AAED,kBAAe,UAAU,CAAA"}
|
||||
Reference in New Issue
Block a user