diff --git a/dist/cli.js b/dist/cli.js index 2b1b4f3..0276b53 100644 --- a/dist/cli.js +++ b/dist/cli.js @@ -16222,160 +16222,160 @@ function escapeJsonPtr(str) { /***/ ((__unused_webpack_module, exports) => { "use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.BaseTree = void 0; -class BaseTree { - get capacity() { - return 2 ** this.levels; - } - get layers() { - return this._layers.slice(); - } - get zeros() { - return this._zeros.slice(); - } - get elements() { - return this._layers[0].slice(); - } - get root() { - var _a; - return (_a = this._layers[this.levels][0]) !== null && _a !== void 0 ? _a : this._zeros[this.levels]; - } - /** - * Find an element in the tree - * @param elements elements of tree - * @param element An element to find - * @param comparator A function that checks leaf value equality - * @param fromIndex The index to start the search at. If the index is greater than or equal to the array's length, -1 is returned - * @returns {number} Index if element is found, otherwise -1 - */ - static indexOf(elements, element, fromIndex, comparator) { - if (comparator) { - return elements.findIndex((el) => comparator(element, el)); - } - else { - return elements.indexOf(element, fromIndex); - } - } - /** - * Insert new element into the tree - * @param element Element to insert - */ - insert(element) { - if (this._layers[0].length >= this.capacity) { - throw new Error('Tree is full'); - } - this.update(this._layers[0].length, element); - } - /* - * Insert multiple elements into the tree. - * @param {Array} elements Elements to insert - */ - bulkInsert(elements) { - if (!elements.length) { - return; - } - if (this._layers[0].length + elements.length > this.capacity) { - throw new Error('Tree is full'); - } - // First we insert all elements except the last one - // updating only full subtree hashes (all layers where inserted element has odd index) - // the last element will update the full path to the root making the tree consistent again - for (let i = 0; i < elements.length - 1; i++) { - this._layers[0].push(elements[i]); - let level = 0; - let index = this._layers[0].length - 1; - while (index % 2 === 1) { - level++; - index >>= 1; - const left = this._layers[level - 1][index * 2]; - const right = this._layers[level - 1][index * 2 + 1]; - this._layers[level][index] = this._hashFn(left, right); - } - } - this.insert(elements[elements.length - 1]); - } - /** - * Change an element in the tree - * @param {number} index Index of element to change - * @param element Updated element value - */ - update(index, element) { - if (isNaN(Number(index)) || index < 0 || index > this._layers[0].length || index >= this.capacity) { - throw new Error('Insert index out of bounds: ' + index); - } - this._layers[0][index] = element; - this._processUpdate(index); - } - /** - * Get merkle path to a leaf - * @param {number} index Leaf index to generate path for - * @returns {{pathElements: Object[], pathIndex: number[]}} An object containing adjacent elements and left-right index - */ - path(index) { - if (isNaN(Number(index)) || index < 0 || index >= this._layers[0].length) { - throw new Error('Index out of bounds: ' + index); - } - let elIndex = +index; - const pathElements = []; - const pathIndices = []; - const pathPositions = []; - for (let level = 0; level < this.levels; level++) { - pathIndices[level] = elIndex % 2; - const leafIndex = elIndex ^ 1; - if (leafIndex < this._layers[level].length) { - pathElements[level] = this._layers[level][leafIndex]; - pathPositions[level] = leafIndex; - } - else { - pathElements[level] = this._zeros[level]; - pathPositions[level] = 0; - } - elIndex >>= 1; - } - return { - pathElements, - pathIndices, - pathPositions, - pathRoot: this.root, - }; - } - _buildZeros() { - this._zeros = [this.zeroElement]; - for (let i = 1; i <= this.levels; i++) { - this._zeros[i] = this._hashFn(this._zeros[i - 1], this._zeros[i - 1]); - } - } - _processNodes(nodes, layerIndex) { - const length = nodes.length; - let currentLength = Math.ceil(length / 2); - const currentLayer = new Array(currentLength); - currentLength--; - const starFrom = length - ((length % 2) ^ 1); - let j = 0; - for (let i = starFrom; i >= 0; i -= 2) { - if (nodes[i - 1] === undefined) - break; - const left = nodes[i - 1]; - const right = (i === starFrom && length % 2 === 1) ? this._zeros[layerIndex - 1] : nodes[i]; - currentLayer[currentLength - j] = this._hashFn(left, right); - j++; - } - return currentLayer; - } - _processUpdate(index) { - for (let level = 1; level <= this.levels; level++) { - index >>= 1; - const left = this._layers[level - 1][index * 2]; - const right = index * 2 + 1 < this._layers[level - 1].length - ? this._layers[level - 1][index * 2 + 1] - : this._zeros[level - 1]; - this._layers[level][index] = this._hashFn(left, right); - } - } -} -exports.BaseTree = BaseTree; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.BaseTree = void 0; +class BaseTree { + get capacity() { + return 2 ** this.levels; + } + get layers() { + return this._layers.slice(); + } + get zeros() { + return this._zeros.slice(); + } + get elements() { + return this._layers[0].slice(); + } + get root() { + var _a; + return (_a = this._layers[this.levels][0]) !== null && _a !== void 0 ? _a : this._zeros[this.levels]; + } + /** + * Find an element in the tree + * @param elements elements of tree + * @param element An element to find + * @param comparator A function that checks leaf value equality + * @param fromIndex The index to start the search at. If the index is greater than or equal to the array's length, -1 is returned + * @returns {number} Index if element is found, otherwise -1 + */ + static indexOf(elements, element, fromIndex, comparator) { + if (comparator) { + return elements.findIndex((el) => comparator(element, el)); + } + else { + return elements.indexOf(element, fromIndex); + } + } + /** + * Insert new element into the tree + * @param element Element to insert + */ + insert(element) { + if (this._layers[0].length >= this.capacity) { + throw new Error('Tree is full'); + } + this.update(this._layers[0].length, element); + } + /* + * Insert multiple elements into the tree. + * @param {Array} elements Elements to insert + */ + bulkInsert(elements) { + if (!elements.length) { + return; + } + if (this._layers[0].length + elements.length > this.capacity) { + throw new Error('Tree is full'); + } + // First we insert all elements except the last one + // updating only full subtree hashes (all layers where inserted element has odd index) + // the last element will update the full path to the root making the tree consistent again + for (let i = 0; i < elements.length - 1; i++) { + this._layers[0].push(elements[i]); + let level = 0; + let index = this._layers[0].length - 1; + while (index % 2 === 1) { + level++; + index >>= 1; + const left = this._layers[level - 1][index * 2]; + const right = this._layers[level - 1][index * 2 + 1]; + this._layers[level][index] = this._hashFn(left, right); + } + } + this.insert(elements[elements.length - 1]); + } + /** + * Change an element in the tree + * @param {number} index Index of element to change + * @param element Updated element value + */ + update(index, element) { + if (isNaN(Number(index)) || index < 0 || index > this._layers[0].length || index >= this.capacity) { + throw new Error('Insert index out of bounds: ' + index); + } + this._layers[0][index] = element; + this._processUpdate(index); + } + /** + * Get merkle path to a leaf + * @param {number} index Leaf index to generate path for + * @returns {{pathElements: Object[], pathIndex: number[]}} An object containing adjacent elements and left-right index + */ + path(index) { + if (isNaN(Number(index)) || index < 0 || index >= this._layers[0].length) { + throw new Error('Index out of bounds: ' + index); + } + let elIndex = +index; + const pathElements = []; + const pathIndices = []; + const pathPositions = []; + for (let level = 0; level < this.levels; level++) { + pathIndices[level] = elIndex % 2; + const leafIndex = elIndex ^ 1; + if (leafIndex < this._layers[level].length) { + pathElements[level] = this._layers[level][leafIndex]; + pathPositions[level] = leafIndex; + } + else { + pathElements[level] = this._zeros[level]; + pathPositions[level] = 0; + } + elIndex >>= 1; + } + return { + pathElements, + pathIndices, + pathPositions, + pathRoot: this.root, + }; + } + _buildZeros() { + this._zeros = [this.zeroElement]; + for (let i = 1; i <= this.levels; i++) { + this._zeros[i] = this._hashFn(this._zeros[i - 1], this._zeros[i - 1]); + } + } + _processNodes(nodes, layerIndex) { + const length = nodes.length; + let currentLength = Math.ceil(length / 2); + const currentLayer = new Array(currentLength); + currentLength--; + const starFrom = length - ((length % 2) ^ 1); + let j = 0; + for (let i = starFrom; i >= 0; i -= 2) { + if (nodes[i - 1] === undefined) + break; + const left = nodes[i - 1]; + const right = (i === starFrom && length % 2 === 1) ? this._zeros[layerIndex - 1] : nodes[i]; + currentLayer[currentLength - j] = this._hashFn(left, right); + j++; + } + return currentLayer; + } + _processUpdate(index) { + for (let level = 1; level <= this.levels; level++) { + index >>= 1; + const left = this._layers[level - 1][index * 2]; + const right = index * 2 + 1 < this._layers[level - 1].length + ? this._layers[level - 1][index * 2 + 1] + : this._zeros[level - 1]; + this._layers[level][index] = this._hashFn(left, right); + } + } +} +exports.BaseTree = BaseTree; /***/ }), @@ -16384,120 +16384,120 @@ exports.BaseTree = BaseTree; /***/ (function(__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 simpleHash_1 = __importDefault(__webpack_require__(5319)); -const BaseTree_1 = __webpack_require__(7736); -class MerkleTree extends BaseTree_1.BaseTree { - constructor(levels, elements = [], { hashFunction = simpleHash_1.default, zeroElement = 0, } = {}) { - super(); - this.levels = levels; - if (elements.length > this.capacity) { - throw new Error('Tree is full'); - } - this._hashFn = hashFunction; - this.zeroElement = zeroElement; - this._layers = []; - const leaves = elements.slice(); - this._layers = [leaves]; - this._buildZeros(); - this._buildHashes(); - } - _buildHashes() { - for (let layerIndex = 1; layerIndex <= this.levels; layerIndex++) { - const nodes = this._layers[layerIndex - 1]; - this._layers[layerIndex] = this._processNodes(nodes, layerIndex); - } - } - /** - * Insert multiple elements into the tree. - * @param {Array} elements Elements to insert - */ - bulkInsert(elements) { - if (!elements.length) { - return; - } - if (this._layers[0].length + elements.length > this.capacity) { - throw new Error('Tree is full'); - } - // First we insert all elements except the last one - // updating only full subtree hashes (all layers where inserted element has odd index) - // the last element will update the full path to the root making the tree consistent again - for (let i = 0; i < elements.length - 1; i++) { - this._layers[0].push(elements[i]); - let level = 0; - let index = this._layers[0].length - 1; - while (index % 2 === 1) { - level++; - index >>= 1; - this._layers[level][index] = this._hashFn(this._layers[level - 1][index * 2], this._layers[level - 1][index * 2 + 1]); - } - } - this.insert(elements[elements.length - 1]); - } - indexOf(element, comparator) { - return BaseTree_1.BaseTree.indexOf(this._layers[0], element, 0, comparator); - } - proof(element) { - const index = this.indexOf(element); - return this.path(index); - } - getTreeEdge(edgeIndex) { - const edgeElement = this._layers[0][edgeIndex]; - if (edgeElement === undefined) { - throw new Error('Element not found'); - } - const edgePath = this.path(edgeIndex); - return { edgePath, edgeElement, edgeIndex, edgeElementsCount: this._layers[0].length }; - } - /** - * 🪓 - * @param count - */ - getTreeSlices(count = 4) { - const length = this._layers[0].length; - let size = Math.ceil(length / count); - if (size % 2) - size++; - const slices = []; - for (let i = 0; i < length; i += size) { - const edgeLeft = i; - const edgeRight = i + size; - slices.push({ edge: this.getTreeEdge(edgeLeft), elements: this.elements.slice(edgeLeft, edgeRight) }); - } - return slices; - } - /** - * Serialize entire tree state including intermediate layers into a plain object - * Deserializing it back will not require to recompute any hashes - * Elements are not converted to a plain type, this is responsibility of the caller - */ - serialize() { - return { - levels: this.levels, - _zeros: this._zeros, - _layers: this._layers, - }; - } - /** - * Deserialize data into a MerkleTree instance - * Make sure to provide the same hashFunction as was used in the source tree, - * otherwise the tree state will be invalid - */ - static deserialize(data, hashFunction) { - const instance = Object.assign(Object.create(this.prototype), data); - instance._hashFn = hashFunction || simpleHash_1.default; - instance.zeroElement = instance._zeros[0]; - return instance; - } - toString() { - return JSON.stringify(this.serialize()); - } -} -exports["default"] = MerkleTree; + +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +const simpleHash_1 = __importDefault(__webpack_require__(5319)); +const BaseTree_1 = __webpack_require__(7736); +class MerkleTree extends BaseTree_1.BaseTree { + constructor(levels, elements = [], { hashFunction = simpleHash_1.default, zeroElement = 0, } = {}) { + super(); + this.levels = levels; + if (elements.length > this.capacity) { + throw new Error('Tree is full'); + } + this._hashFn = hashFunction; + this.zeroElement = zeroElement; + this._layers = []; + const leaves = elements.slice(); + this._layers = [leaves]; + this._buildZeros(); + this._buildHashes(); + } + _buildHashes() { + for (let layerIndex = 1; layerIndex <= this.levels; layerIndex++) { + const nodes = this._layers[layerIndex - 1]; + this._layers[layerIndex] = this._processNodes(nodes, layerIndex); + } + } + /** + * Insert multiple elements into the tree. + * @param {Array} elements Elements to insert + */ + bulkInsert(elements) { + if (!elements.length) { + return; + } + if (this._layers[0].length + elements.length > this.capacity) { + throw new Error('Tree is full'); + } + // First we insert all elements except the last one + // updating only full subtree hashes (all layers where inserted element has odd index) + // the last element will update the full path to the root making the tree consistent again + for (let i = 0; i < elements.length - 1; i++) { + this._layers[0].push(elements[i]); + let level = 0; + let index = this._layers[0].length - 1; + while (index % 2 === 1) { + level++; + index >>= 1; + this._layers[level][index] = this._hashFn(this._layers[level - 1][index * 2], this._layers[level - 1][index * 2 + 1]); + } + } + this.insert(elements[elements.length - 1]); + } + indexOf(element, comparator) { + return BaseTree_1.BaseTree.indexOf(this._layers[0], element, 0, comparator); + } + proof(element) { + const index = this.indexOf(element); + return this.path(index); + } + getTreeEdge(edgeIndex) { + const edgeElement = this._layers[0][edgeIndex]; + if (edgeElement === undefined) { + throw new Error('Element not found'); + } + const edgePath = this.path(edgeIndex); + return { edgePath, edgeElement, edgeIndex, edgeElementsCount: this._layers[0].length }; + } + /** + * 🪓 + * @param count + */ + getTreeSlices(count = 4) { + const length = this._layers[0].length; + let size = Math.ceil(length / count); + if (size % 2) + size++; + const slices = []; + for (let i = 0; i < length; i += size) { + const edgeLeft = i; + const edgeRight = i + size; + slices.push({ edge: this.getTreeEdge(edgeLeft), elements: this.elements.slice(edgeLeft, edgeRight) }); + } + return slices; + } + /** + * Serialize entire tree state including intermediate layers into a plain object + * Deserializing it back will not require to recompute any hashes + * Elements are not converted to a plain type, this is responsibility of the caller + */ + serialize() { + return { + levels: this.levels, + _zeros: this._zeros, + _layers: this._layers, + }; + } + /** + * Deserialize data into a MerkleTree instance + * Make sure to provide the same hashFunction as was used in the source tree, + * otherwise the tree state will be invalid + */ + static deserialize(data, hashFunction) { + const instance = Object.assign(Object.create(this.prototype), data); + instance._hashFn = hashFunction || simpleHash_1.default; + instance.zeroElement = instance._zeros[0]; + return instance; + } + toString() { + return JSON.stringify(this.serialize()); + } +} +exports["default"] = MerkleTree; /***/ }), @@ -16506,165 +16506,165 @@ exports["default"] = MerkleTree; /***/ (function(__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.PartialMerkleTree = void 0; -const simpleHash_1 = __importDefault(__webpack_require__(5319)); -const BaseTree_1 = __webpack_require__(7736); -class PartialMerkleTree extends BaseTree_1.BaseTree { - constructor(levels, { edgePath, edgeElement, edgeIndex, edgeElementsCount, }, leaves, { hashFunction, zeroElement } = {}) { - super(); - if (edgeIndex + leaves.length !== edgeElementsCount) - throw new Error('Invalid number of elements'); - this._edgeLeafProof = edgePath; - this._initialRoot = edgePath.pathRoot; - this.zeroElement = zeroElement !== null && zeroElement !== void 0 ? zeroElement : 0; - this._edgeLeaf = { data: edgeElement, index: edgeIndex }; - this._leavesAfterEdge = leaves; - this.levels = levels; - this._hashFn = hashFunction || simpleHash_1.default; - this._createProofMap(); - this._buildTree(); - } - get edgeIndex() { - return this._edgeLeaf.index; - } - get edgeElement() { - return this._edgeLeaf.data; - } - get edgeLeafProof() { - return this._edgeLeafProof; - } - _createProofMap() { - this._proofMap = this.edgeLeafProof.pathPositions.reduce((p, c, i) => { - p.set(i, [c, this.edgeLeafProof.pathElements[i]]); - return p; - }, new Map()); - this._proofMap.set(this.levels, [0, this.edgeLeafProof.pathRoot]); - } - _buildTree() { - const edgeLeafIndex = this._edgeLeaf.index; - this._leaves = Array(edgeLeafIndex).concat(this._leavesAfterEdge); - if (this._proofMap.has(0)) { - const [proofPos, proofEl] = this._proofMap.get(0); - this._leaves[proofPos] = proofEl; - } - this._layers = [this._leaves]; - this._buildZeros(); - this._buildHashes(); - } - _buildHashes() { - for (let layerIndex = 1; layerIndex <= this.levels; layerIndex++) { - const nodes = this._layers[layerIndex - 1]; - const currentLayer = this._processNodes(nodes, layerIndex); - if (this._proofMap.has(layerIndex)) { - const [proofPos, proofEl] = this._proofMap.get(layerIndex); - if (!currentLayer[proofPos]) - currentLayer[proofPos] = proofEl; - } - this._layers[layerIndex] = currentLayer; - } - } - /** - * Change an element in the tree - * @param {number} index Index of element to change - * @param element Updated element value - */ - update(index, element) { - if (isNaN(Number(index)) || index < 0 || index > this._layers[0].length || index >= this.capacity) { - throw new Error('Insert index out of bounds: ' + index); - } - if (index < this._edgeLeaf.index) { - throw new Error(`Index ${index} is below the edge: ${this._edgeLeaf.index}`); - } - this._layers[0][index] = element; - this._processUpdate(index); - } - path(index) { - var _a; - if (isNaN(Number(index)) || index < 0 || index >= this._layers[0].length) { - throw new Error('Index out of bounds: ' + index); - } - if (index < this._edgeLeaf.index) { - throw new Error(`Index ${index} is below the edge: ${this._edgeLeaf.index}`); - } - let elIndex = Number(index); - const pathElements = []; - const pathIndices = []; - const pathPositions = []; - for (let level = 0; level < this.levels; level++) { - pathIndices[level] = elIndex % 2; - const leafIndex = elIndex ^ 1; - if (leafIndex < this._layers[level].length) { - pathElements[level] = this._layers[level][leafIndex]; - pathPositions[level] = leafIndex; - } - else { - pathElements[level] = this._zeros[level]; - pathPositions[level] = 0; - } - const [proofPos, proofEl] = this._proofMap.get(level); - pathElements[level] = (_a = pathElements[level]) !== null && _a !== void 0 ? _a : (proofPos === leafIndex ? proofEl : this._zeros[level]); - elIndex >>= 1; - } - return { - pathElements, - pathIndices, - pathPositions, - pathRoot: this.root, - }; - } - indexOf(element, comparator) { - return BaseTree_1.BaseTree.indexOf(this._layers[0], element, this.edgeIndex, comparator); - } - proof(element) { - const index = this.indexOf(element); - return this.path(index); - } - /** - * Shifts edge of tree to left - * @param edge new TreeEdge below current edge - * @param elements leaves between old and new edge - */ - shiftEdge(edge, elements) { - if (this._edgeLeaf.index <= edge.edgeIndex) { - throw new Error(`New edgeIndex should be smaller then ${this._edgeLeaf.index}`); - } - if (elements.length !== (this._edgeLeaf.index - edge.edgeIndex)) { - throw new Error(`Elements length should be ${this._edgeLeaf.index - edge.edgeIndex}`); - } - this._edgeLeafProof = edge.edgePath; - this._edgeLeaf = { index: edge.edgeIndex, data: edge.edgeElement }; - this._leavesAfterEdge = [...elements, ...this._leavesAfterEdge]; - this._createProofMap(); - this._buildTree(); - } - serialize() { - return { - _edgeLeafProof: this._edgeLeafProof, - _edgeLeaf: this._edgeLeaf, - _layers: this._layers, - _zeros: this._zeros, - levels: this.levels, - }; - } - static deserialize(data, hashFunction) { - const instance = Object.assign(Object.create(this.prototype), data); - instance._hashFn = hashFunction || simpleHash_1.default; - instance._initialRoot = data._edgeLeafProof.pathRoot; - instance.zeroElement = instance._zeros[0]; - instance._leavesAfterEdge = instance._layers[0].slice(data._edgeLeaf.index); - instance._createProofMap(); - return instance; - } - toString() { - return JSON.stringify(this.serialize()); - } -} -exports.PartialMerkleTree = PartialMerkleTree; + +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.PartialMerkleTree = void 0; +const simpleHash_1 = __importDefault(__webpack_require__(5319)); +const BaseTree_1 = __webpack_require__(7736); +class PartialMerkleTree extends BaseTree_1.BaseTree { + constructor(levels, { edgePath, edgeElement, edgeIndex, edgeElementsCount, }, leaves, { hashFunction, zeroElement } = {}) { + super(); + if (edgeIndex + leaves.length !== edgeElementsCount) + throw new Error('Invalid number of elements'); + this._edgeLeafProof = edgePath; + this._initialRoot = edgePath.pathRoot; + this.zeroElement = zeroElement !== null && zeroElement !== void 0 ? zeroElement : 0; + this._edgeLeaf = { data: edgeElement, index: edgeIndex }; + this._leavesAfterEdge = leaves; + this.levels = levels; + this._hashFn = hashFunction || simpleHash_1.default; + this._createProofMap(); + this._buildTree(); + } + get edgeIndex() { + return this._edgeLeaf.index; + } + get edgeElement() { + return this._edgeLeaf.data; + } + get edgeLeafProof() { + return this._edgeLeafProof; + } + _createProofMap() { + this._proofMap = this.edgeLeafProof.pathPositions.reduce((p, c, i) => { + p.set(i, [c, this.edgeLeafProof.pathElements[i]]); + return p; + }, new Map()); + this._proofMap.set(this.levels, [0, this.edgeLeafProof.pathRoot]); + } + _buildTree() { + const edgeLeafIndex = this._edgeLeaf.index; + this._leaves = Array(edgeLeafIndex).concat(this._leavesAfterEdge); + if (this._proofMap.has(0)) { + const [proofPos, proofEl] = this._proofMap.get(0); + this._leaves[proofPos] = proofEl; + } + this._layers = [this._leaves]; + this._buildZeros(); + this._buildHashes(); + } + _buildHashes() { + for (let layerIndex = 1; layerIndex <= this.levels; layerIndex++) { + const nodes = this._layers[layerIndex - 1]; + const currentLayer = this._processNodes(nodes, layerIndex); + if (this._proofMap.has(layerIndex)) { + const [proofPos, proofEl] = this._proofMap.get(layerIndex); + if (!currentLayer[proofPos]) + currentLayer[proofPos] = proofEl; + } + this._layers[layerIndex] = currentLayer; + } + } + /** + * Change an element in the tree + * @param {number} index Index of element to change + * @param element Updated element value + */ + update(index, element) { + if (isNaN(Number(index)) || index < 0 || index > this._layers[0].length || index >= this.capacity) { + throw new Error('Insert index out of bounds: ' + index); + } + if (index < this._edgeLeaf.index) { + throw new Error(`Index ${index} is below the edge: ${this._edgeLeaf.index}`); + } + this._layers[0][index] = element; + this._processUpdate(index); + } + path(index) { + var _a; + if (isNaN(Number(index)) || index < 0 || index >= this._layers[0].length) { + throw new Error('Index out of bounds: ' + index); + } + if (index < this._edgeLeaf.index) { + throw new Error(`Index ${index} is below the edge: ${this._edgeLeaf.index}`); + } + let elIndex = Number(index); + const pathElements = []; + const pathIndices = []; + const pathPositions = []; + for (let level = 0; level < this.levels; level++) { + pathIndices[level] = elIndex % 2; + const leafIndex = elIndex ^ 1; + if (leafIndex < this._layers[level].length) { + pathElements[level] = this._layers[level][leafIndex]; + pathPositions[level] = leafIndex; + } + else { + pathElements[level] = this._zeros[level]; + pathPositions[level] = 0; + } + const [proofPos, proofEl] = this._proofMap.get(level); + pathElements[level] = (_a = pathElements[level]) !== null && _a !== void 0 ? _a : (proofPos === leafIndex ? proofEl : this._zeros[level]); + elIndex >>= 1; + } + return { + pathElements, + pathIndices, + pathPositions, + pathRoot: this.root, + }; + } + indexOf(element, comparator) { + return BaseTree_1.BaseTree.indexOf(this._layers[0], element, this.edgeIndex, comparator); + } + proof(element) { + const index = this.indexOf(element); + return this.path(index); + } + /** + * Shifts edge of tree to left + * @param edge new TreeEdge below current edge + * @param elements leaves between old and new edge + */ + shiftEdge(edge, elements) { + if (this._edgeLeaf.index <= edge.edgeIndex) { + throw new Error(`New edgeIndex should be smaller then ${this._edgeLeaf.index}`); + } + if (elements.length !== (this._edgeLeaf.index - edge.edgeIndex)) { + throw new Error(`Elements length should be ${this._edgeLeaf.index - edge.edgeIndex}`); + } + this._edgeLeafProof = edge.edgePath; + this._edgeLeaf = { index: edge.edgeIndex, data: edge.edgeElement }; + this._leavesAfterEdge = [...elements, ...this._leavesAfterEdge]; + this._createProofMap(); + this._buildTree(); + } + serialize() { + return { + _edgeLeafProof: this._edgeLeafProof, + _edgeLeaf: this._edgeLeaf, + _layers: this._layers, + _zeros: this._zeros, + levels: this.levels, + }; + } + static deserialize(data, hashFunction) { + const instance = Object.assign(Object.create(this.prototype), data); + instance._hashFn = hashFunction || simpleHash_1.default; + instance._initialRoot = data._edgeLeafProof.pathRoot; + instance.zeroElement = instance._zeros[0]; + instance._leavesAfterEdge = instance._layers[0].slice(data._edgeLeaf.index); + instance._createProofMap(); + return instance; + } + toString() { + return JSON.stringify(this.serialize()); + } +} +exports.PartialMerkleTree = PartialMerkleTree; /***/ }), @@ -16673,19 +16673,19 @@ exports.PartialMerkleTree = PartialMerkleTree; /***/ (function(__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.MerkleTree = exports.simpleHash = exports.PartialMerkleTree = void 0; -const FixedMerkleTree_1 = __importDefault(__webpack_require__(9093)); -Object.defineProperty(exports, "MerkleTree", ({ enumerable: true, get: function () { return FixedMerkleTree_1.default; } })); -var PartialMerkleTree_1 = __webpack_require__(91230); -Object.defineProperty(exports, "PartialMerkleTree", ({ enumerable: true, get: function () { return PartialMerkleTree_1.PartialMerkleTree; } })); -var simpleHash_1 = __webpack_require__(5319); -Object.defineProperty(exports, "simpleHash", ({ enumerable: true, get: function () { return simpleHash_1.simpleHash; } })); -exports["default"] = FixedMerkleTree_1.default; + +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.MerkleTree = exports.simpleHash = exports.PartialMerkleTree = void 0; +const FixedMerkleTree_1 = __importDefault(__webpack_require__(9093)); +Object.defineProperty(exports, "MerkleTree", ({ enumerable: true, get: function () { return FixedMerkleTree_1.default; } })); +var PartialMerkleTree_1 = __webpack_require__(91230); +Object.defineProperty(exports, "PartialMerkleTree", ({ enumerable: true, get: function () { return PartialMerkleTree_1.PartialMerkleTree; } })); +var simpleHash_1 = __webpack_require__(5319); +Object.defineProperty(exports, "simpleHash", ({ enumerable: true, get: function () { return simpleHash_1.simpleHash; } })); +exports["default"] = FixedMerkleTree_1.default; /***/ }), @@ -16694,27 +16694,27 @@ exports["default"] = FixedMerkleTree_1.default; /***/ ((__unused_webpack_module, exports) => { "use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.simpleHash = void 0; -/*** - * This is insecure hash function, just for example only - * @param data - * @param seed - * @param hashLength - */ -function simpleHash(data, seed, hashLength = 40) { - const str = data.join(''); - let i, l, hval = seed !== null && seed !== void 0 ? seed : 0x811c9dcc5; - for (i = 0, l = str.length; i < l; i++) { - hval ^= str.charCodeAt(i); - hval += (hval << 1) + (hval << 4) + (hval << 6) + (hval << 8) + (hval << 24); - } - const hash = (hval >>> 0).toString(16); - return BigInt('0x' + hash.padEnd(hashLength - (hash.length - 1), '0')).toString(10); -} -exports.simpleHash = simpleHash; -exports["default"] = (left, right) => simpleHash([left, right]); + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.simpleHash = void 0; +/*** + * This is insecure hash function, just for example only + * @param data + * @param seed + * @param hashLength + */ +function simpleHash(data, seed, hashLength = 40) { + const str = data.join(''); + let i, l, hval = seed !== null && seed !== void 0 ? seed : 0x811c9dcc5; + for (i = 0, l = str.length; i < l; i++) { + hval ^= str.charCodeAt(i); + hval += (hval << 1) + (hval << 4) + (hval << 6) + (hval << 8) + (hval << 24); + } + const hash = (hval >>> 0).toString(16); + return BigInt('0x' + hash.padEnd(hashLength - (hash.length - 1), '0')).toString(10); +} +exports.simpleHash = simpleHash; +exports["default"] = (left, right) => simpleHash([left, right]); /***/ }), @@ -176778,8 +176778,8 @@ function getSubdomains() { } function getRelayerEnsSubdomains() { const allConfig = getNetworkConfig(); - return Object.keys(allConfig).reduce((acc, chain) => { - acc[Number(chain)] = allConfig[Number(chain)].relayerEnsSubdomain; + return enabledChains.reduce((acc, chain) => { + acc[chain] = allConfig[chain].relayerEnsSubdomain; return acc; }, {}); } @@ -177333,12 +177333,6 @@ class BaseEventsService { const events = yield this.formatEvents( yield this.batchEventsService.getBatchEvents({ fromBlock, toBlock, type: this.getType() }) ); - if (!events.length) { - return { - events, - lastBlock: toBlock - }; - } return { events, lastBlock: toBlock @@ -177354,16 +177348,12 @@ class BaseEventsService { } getLatestEvents(_0) { return __async$8(this, arguments, function* ({ fromBlock }) { - const allEvents = []; const graphEvents = yield this.getEventsFromGraph({ fromBlock }); const lastSyncBlock = graphEvents.lastBlock && graphEvents.lastBlock >= fromBlock ? graphEvents.lastBlock : fromBlock; const rpcEvents = yield this.getEventsFromRpc({ fromBlock: lastSyncBlock }); - allEvents.push(...graphEvents.events); - allEvents.push(...rpcEvents.events); - const lastBlock = rpcEvents ? rpcEvents.lastBlock : allEvents[allEvents.length - 1] ? allEvents[allEvents.length - 1].blockNumber : fromBlock; return { - events: allEvents, - lastBlock + events: [...graphEvents.events, ...rpcEvents.events], + lastBlock: rpcEvents.lastBlock }; }); } @@ -177383,6 +177373,7 @@ class BaseEventsService { */ updateEvents() { return __async$8(this, null, function* () { + var _a; const savedEvents = yield this.getSavedEvents(); let fromBlock = this.deployedBlock; if (savedEvents && savedEvents.lastBlock) { @@ -177390,10 +177381,7 @@ class BaseEventsService { } const newEvents = yield this.getLatestEvents({ fromBlock }); const eventSet = /* @__PURE__ */ new Set(); - let allEvents = []; - allEvents.push(...savedEvents.events); - allEvents.push(...newEvents.events); - allEvents = allEvents.sort((a, b) => { + const allEvents = [...savedEvents.events, ...newEvents.events].sort((a, b) => { if (a.blockNumber === b.blockNumber) { return a.logIndex - b.logIndex; } @@ -177404,7 +177392,7 @@ class BaseEventsService { eventSet.add(eventKey); return !hasEvent; }); - const lastBlock = newEvents ? newEvents.lastBlock : allEvents[allEvents.length - 1] ? allEvents[allEvents.length - 1].blockNumber : null; + const lastBlock = newEvents.lastBlock || ((_a = allEvents[allEvents.length - 1]) == null ? void 0 : _a.blockNumber); this.validateEvents({ events: allEvents, lastBlock }); if (savedEvents.fromCache || newEvents.events.length) { yield this.saveEvents({ events: allEvents, lastBlock }); @@ -177789,7 +177777,7 @@ class BaseRegistryService extends BaseEventsService { const registerEvents = (yield this.updateEvents()).events; const subdomains = Object.values(this.relayerEnsSubdomains); const registerSet = /* @__PURE__ */ new Set(); - const uniqueRegisters = registerEvents.reverse().filter(({ ensName }) => { + const uniqueRegisters = registerEvents.filter(({ ensName }) => { if (!registerSet.has(ensName)) { registerSet.add(ensName); return true; @@ -177803,12 +177791,12 @@ class BaseRegistryService extends BaseEventsService { ]); const relayers = relayersData.map(({ owner, balance: stakeBalance, records, isRegistered }, index) => { const { ensName, relayerAddress } = uniqueRegisters[index]; - const hostnames = {}; - records.forEach((record, recordIndex) => { + const hostnames = records.reduce((acc, record, recordIndex) => { if (record) { - hostnames[Number(Object.keys(this.relayerEnsSubdomains)[recordIndex])] = record; + acc[Number(Object.keys(this.relayerEnsSubdomains)[recordIndex])] = record; } - }); + return acc; + }, {}); const isOwner = !relayerAddress || relayerAddress === owner; const hasMinBalance = stakeBalance >= MIN_STAKE_BALANCE; const preCondition = Object.keys(hostnames).length && isOwner && isRegistered && hasMinBalance; @@ -181064,7 +181052,7 @@ function calculateSnarkProof(input, circuit, provingKey) { ;// CONCATENATED MODULE: ./package.json -const package_namespaceObject = /*#__PURE__*/JSON.parse('{"rE":"1.0.4-alpha","h_":"Modern Toolsets for Privacy Pools on Ethereum"}'); +const package_namespaceObject = /*#__PURE__*/JSON.parse('{"rE":"1.0.5-alpha","h_":"Modern Toolsets for Privacy Pools on Ethereum"}'); var package_namespaceObject_0 = /*#__PURE__*/__webpack_require__.t(package_namespaceObject, 2); ;// CONCATENATED MODULE: external "module" const external_module_namespaceObject = require("module"); @@ -185538,18 +185526,7 @@ function tornadoProgram() { merkleWorkerPath: MERKLE_WORKER_PATH }); const depositEvents = (yield depositsService.updateEvents()).events; - const depositTreeInitiator = yield (() => program_async(this, null, function* () { - if (MERKLE_WORKER_PATH) { - return () => merkleTreeService.verifyTree(depositEvents); - } - return yield merkleTreeService.verifyTree(depositEvents); - }))(); - let depositTreePromise; - if (typeof depositTreeInitiator === "function") { - depositTreePromise = depositTreeInitiator(); - } else { - depositTreePromise = depositTreeInitiator; - } + const depositTreePromise = MERKLE_WORKER_PATH ? merkleTreeService.verifyTree(depositEvents) : yield merkleTreeService.verifyTree(depositEvents); const withdrawalEvents = (yield withdrawalsService.updateEvents()).events; const depositEvent = depositEvents.find(({ commitment }) => commitment === commitmentHex); const withdrawalEvent = withdrawalEvents.find(({ nullifierHash }) => nullifierHash === nullifierHex); @@ -185782,15 +185759,10 @@ function tornadoProgram() { merkleWorkerPath: MERKLE_WORKER_PATH }); const depositEvents = (yield depositsService.updateEvents()).events; - const depositTreePromise = yield (() => program_async(this, null, function* () { - if (MERKLE_WORKER_PATH) { - return () => merkleTreeService.verifyTree(depositEvents); - } - return yield merkleTreeService.verifyTree(depositEvents); - }))(); + const depositTreePromise = MERKLE_WORKER_PATH ? merkleTreeService.verifyTree(depositEvents) : yield merkleTreeService.verifyTree(depositEvents); const [withdrawalEvents] = yield Promise.all([ withdrawalsService.updateEvents().then(({ events }) => events), - typeof depositTreePromise === "function" ? depositTreePromise() : depositTreePromise + depositTreePromise ]); const depositEvent = depositEvents.find(({ commitment }) => commitment === commitmentHex); const withdrawalEvent = withdrawalEvents.find(({ nullifierHash }) => nullifierHash === nullifierHex); @@ -185949,16 +185921,8 @@ function tornadoProgram() { userDirectory: SAVED_TREE_DIR }); const depositEvents = (yield depositsService.updateEvents()).events; - const depositTreePromise = yield (() => program_async(this, null, function* () { - if (MERKLE_WORKER_PATH) { - return () => merkleTreeService.verifyTree(depositEvents); - } - return yield merkleTreeService.verifyTree(depositEvents); - }))(); - const [tree] = yield Promise.all([ - typeof depositTreePromise === "function" ? depositTreePromise() : depositTreePromise, - withdrawalsService.updateEvents() - ]); + const depositTreePromise = MERKLE_WORKER_PATH ? merkleTreeService.verifyTree(depositEvents) : yield merkleTreeService.verifyTree(depositEvents); + const [tree] = yield Promise.all([depositTreePromise, withdrawalsService.updateEvents()]); if (nativeCurrency === currency) { yield treeCache.createTree(depositEvents, tree); } diff --git a/package.json b/package.json index 2e029a1..dfac75e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@tornado/cli", - "version": "1.0.5-alpha", + "version": "1.0.6-alpha", "description": "Modern Toolsets for Privacy Pools on Ethereum", "main": "./dist/cli.js", "types": "./dist/cli.d.ts", @@ -51,7 +51,7 @@ "optionalDependencies": {}, "devDependencies": { "@colors/colors": "1.5.0", - "@tornado/core": "git+https://git.tornado.ws/tornadocontrib/tornado-core.git#700426acb7a7de16884cb314c3a0220a51682d18", + "@tornado/core": "git+https://git.tornado.ws/tornadocontrib/tornado-core.git#d6cfea1d1990f07a8faca2e876c0a6ccea4f603f", "@typechain/ethers-v6": "^0.5.1", "@types/figlet": "^1.5.8", "@typescript-eslint/eslint-plugin": "^8.6.0", diff --git a/src/program.ts b/src/program.ts index 558bd9d..4b60d63 100644 --- a/src/program.ts +++ b/src/program.ts @@ -30,7 +30,6 @@ import { Transaction, getAddress, } from 'ethers'; -import type MerkleTree from '@tornado/fixed-merkle-tree'; import { ERC20, ERC20__factory, @@ -892,20 +891,9 @@ export function tornadoProgram() { const depositEvents = (await depositsService.updateEvents()).events as DepositsEvents[]; // If we have MERKLE_WORKER_PATH run worker at background otherwise resolve it here - const depositTreeInitiator = await (async () => { - if (MERKLE_WORKER_PATH) { - return () => merkleTreeService.verifyTree(depositEvents) as Promise; - } - return (await merkleTreeService.verifyTree(depositEvents)) as MerkleTree; - })(); - - let depositTreePromise: Promise | MerkleTree; - - if (typeof depositTreeInitiator === 'function') { - depositTreePromise = depositTreeInitiator(); - } else { - depositTreePromise = depositTreeInitiator; - } + const depositTreePromise = MERKLE_WORKER_PATH + ? merkleTreeService.verifyTree(depositEvents) + : await merkleTreeService.verifyTree(depositEvents); const withdrawalEvents = (await withdrawalsService.updateEvents()).events as WithdrawalsEvents[]; @@ -1223,16 +1211,13 @@ export function tornadoProgram() { const depositEvents = (await depositsService.updateEvents()).events as DepositsEvents[]; // If we have MERKLE_WORKER_PATH run worker at background otherwise resolve it here - const depositTreePromise = await (async () => { - if (MERKLE_WORKER_PATH) { - return () => merkleTreeService.verifyTree(depositEvents) as Promise; - } - return (await merkleTreeService.verifyTree(depositEvents)) as MerkleTree; - })(); + const depositTreePromise = MERKLE_WORKER_PATH + ? merkleTreeService.verifyTree(depositEvents) + : await merkleTreeService.verifyTree(depositEvents); const [withdrawalEvents] = await Promise.all([ withdrawalsService.updateEvents().then(({ events }) => events as WithdrawalsEvents[]), - typeof depositTreePromise === 'function' ? depositTreePromise() : depositTreePromise, + depositTreePromise, ]); const depositEvent = depositEvents.find(({ commitment }) => commitment === commitmentHex); @@ -1435,17 +1420,11 @@ export function tornadoProgram() { const depositEvents = (await depositsService.updateEvents()).events as DepositsEvents[]; // If we have MERKLE_WORKER_PATH run worker at background otherwise resolve it here - const depositTreePromise = await (async () => { - if (MERKLE_WORKER_PATH) { - return () => merkleTreeService.verifyTree(depositEvents) as Promise; - } - return (await merkleTreeService.verifyTree(depositEvents)) as MerkleTree; - })(); + const depositTreePromise = MERKLE_WORKER_PATH + ? merkleTreeService.verifyTree(depositEvents) + : await merkleTreeService.verifyTree(depositEvents); - const [tree] = await Promise.all([ - typeof depositTreePromise === 'function' ? depositTreePromise() : depositTreePromise, - withdrawalsService.updateEvents(), - ]); + const [tree] = await Promise.all([depositTreePromise, withdrawalsService.updateEvents()]); if (nativeCurrency === currency) { await treeCache.createTree(depositEvents, tree); diff --git a/static/events/relayers.json b/static/events/relayers.json index e2afe4b..cbd3bae 100644 --- a/static/events/relayers.json +++ b/static/events/relayers.json @@ -1,277 +1,68 @@ { - "timestamp": 1726890359, + "timestamp": 1726984895, "relayers": [ { - "ensName": "okrelayer.eth", - "relayerAddress": "0x0e9D9a828247F5eed7f6D31D213A39805De52441", + "ensName": "therelayer.eth", + "relayerAddress": "0xA0F0287683E820FF4211e67C03cf46a87431f4E1", "isRegistered": true, - "owner": "0x0e9D9a828247F5eed7f6D31D213A39805De52441", - "stakeBalance": "4666.679387946529032297", + "owner": "0xA0F0287683E820FF4211e67C03cf46a87431f4E1", + "stakeBalance": "1335.888771359625809238", "hostnames": { - "1": "okrelayer.xyz", - "56": "binance.okrelayer.xyz", - "137": "polygon.okrelayer.xyz", - "42161": "arb.okrelayer.xyz" + "1": "mainnet.therelayer.xyz", + "10": "optimism.therelayer.xyz", + "56": "bsc.therelayer.xyz", + "100": "xdai.therelayer.xyz", + "137": "polygon.therelayer.xyz", + "42161": "arbitrum.therelayer.xyz", + "43114": "avalanche.therelayer.xyz" } }, { - "ensName": "quick-relayer.eth", - "relayerAddress": "0x187541D7D312F742040f270d0221B4Fe577934B0", + "ensName": "cheap-relayer.eth", + "relayerAddress": "0x076D4E32C6A5D888fC4658281539c94E778C796d", "isRegistered": true, - "owner": "0x187541D7D312F742040f270d0221B4Fe577934B0", - "stakeBalance": "2931.033250737658918569", + "owner": "0x076D4E32C6A5D888fC4658281539c94E778C796d", + "stakeBalance": "500.878420081833044818", "hostnames": { - "1": "quick-relayer.xyz" + "1": "mainnet-tornado.cheap-relayer.xyz", + "56": "bsc-tornado.cheap-relayer.xyz", + "137": "polygon-tornado.cheap-relayer.xyz", + "43114": "avalanche-tornado.cheap-relayer.xyz" } }, { - "ensName": "safety-relayer.eth", - "relayerAddress": "0xF1F4F76c9969eFbFB5C9A90a6E44c0E3696D3EF8", + "ensName": "lowcost.eth", + "relayerAddress": "0x28907F21F43B419F34226d6f10aCbCf1832b1D4d", "isRegistered": true, - "owner": "0xF1F4F76c9969eFbFB5C9A90a6E44c0E3696D3EF8", - "stakeBalance": "500.879215977529089999", + "owner": "0x28907F21F43B419F34226d6f10aCbCf1832b1D4d", + "stakeBalance": "500.279638085962965981", "hostnames": { - "1": "a-relayer.top", - "56": "bsc.a-relayer.top", - "137": "polygon.a-relayer.top" + "1": "mainnet-tornado.low-fee.xyz", + "56": "bsc-tornado.low-fee.xyz", + "137": "polygon-tornado.low-fee.xyz", + "43114": "avalanche-tornado.low-fee.xyz" } }, { - "ensName": "k-relayer.eth", - "relayerAddress": "0xC49415493eB3Ec64a0F13D8AA5056f1CfC4ce35c", + "ensName": "relayernews.eth", + "relayerAddress": "0x6289C8a70EE2Ed6914834CaEa431F9a82c7eAf70", "isRegistered": true, - "owner": "0xC49415493eB3Ec64a0F13D8AA5056f1CfC4ce35c", - "stakeBalance": "2194.529689989084430299", + "owner": "0x6289C8a70EE2Ed6914834CaEa431F9a82c7eAf70", + "stakeBalance": "1661.181918638614466424", "hostnames": { - "1": "black-hardy.com", - "56": "bsc.black-hardy.com" + "1": "mainnet-tornado.relayernews.xyz", + "56": "bsc-tornado.relayernews.xyz" } }, { - "ensName": "relayer007.eth", - "relayerAddress": "0xa0109274F53609f6Be97ec5f3052C659AB80f012", + "ensName": "on-sale.eth", + "relayerAddress": "0x63606C4011e97a73BCd844Cde6a38D45a728BC0E", "isRegistered": true, - "owner": "0xa0109274F53609f6Be97ec5f3052C659AB80f012", - "stakeBalance": "4989.637826137906607638", + "owner": "0x63606C4011e97a73BCd844Cde6a38D45a728BC0E", + "stakeBalance": "4476.543684932880020592", "hostnames": { - "1": "torn.relayersdao.finance", - "56": "bsc.relayersdao.finance", - "137": "matic.relayersdao.finance" - } - }, - { - "ensName": "reltor.eth", - "relayerAddress": "0x4750BCfcC340AA4B31be7e71fa072716d28c29C5", - "isRegistered": true, - "owner": "0x4750BCfcC340AA4B31be7e71fa072716d28c29C5", - "stakeBalance": "19999.983956326624881327", - "hostnames": { - "1": "eth.reltor.su", - "56": "binance.reltor.su", - "137": "polygon.reltor.su" - } - }, - { - "ensName": "best-relay.eth", - "relayerAddress": "0xe5A4c70113b90566BC5f80a3866935d0d52F990E", - "isRegistered": true, - "owner": "0xe5A4c70113b90566BC5f80a3866935d0d52F990E", - "stakeBalance": "2002.0", - "hostnames": { - "1": "best-relay.gato-miaouw.xyz", - "56": "bsc.gato-miaouw.xyz" - } - }, - { - "ensName": "crelayer.eth", - "relayerAddress": "0x180c58B7305152357142b33Eea94cBB152058B61", - "isRegistered": true, - "owner": "0x180c58B7305152357142b33Eea94cBB152058B61", - "stakeBalance": "1460.389956347917729137", - "hostnames": { - "1": "eth.crelayer.xyz", - "56": "bsc.crelayer.xyz" - } - }, - { - "ensName": "torn-city.eth", - "relayerAddress": "0xd04e9f0945DEA8373D882C730e2c93a74B591796", - "isRegistered": true, - "owner": "0xd04e9f0945DEA8373D882C730e2c93a74B591796", - "stakeBalance": "6715.49550101901162633", - "hostnames": { - "1": "torn-city.com", - "56": "bsc.torn-city.com" - } - }, - { - "ensName": "torrelayer.eth", - "relayerAddress": "0x2Ee39Ff05643bC7cc9ed31B71e142429044A425C", - "isRegistered": true, - "owner": "0x2Ee39Ff05643bC7cc9ed31B71e142429044A425C", - "stakeBalance": "3734.220945056618867324", - "hostnames": { - "1": "tornima.xyz", - "56": "binance.tornima.xyz" - } - }, - { - "ensName": "tornxdo.eth", - "relayerAddress": "0xB399aa4c2F1678f72529Cd125F82cEA2c2a823eD", - "isRegistered": true, - "owner": "0xB399aa4c2F1678f72529Cd125F82cEA2c2a823eD", - "stakeBalance": "983.310689667160962345", - "hostnames": { - "1": "tornado.evmjunkie.xyz" - } - }, - { - "ensName": "0xgm777.eth", - "relayerAddress": "0x94596B6A626392F5D972D6CC4D929a42c2f0008c", - "isRegistered": true, - "owner": "0x94596B6A626392F5D972D6CC4D929a42c2f0008c", - "stakeBalance": "1979.261700994868938309", - "hostnames": { - "1": "main.gm777.xyz", - "56": "bsc.gm777.xyz", - "42161": "arb.gm777.xyz" - } - }, - { - "ensName": "relayer-secure.eth", - "relayerAddress": "0xCEdac436cEA98E93F471331eCC693fF41D730921", - "isRegistered": true, - "owner": "0xCEdac436cEA98E93F471331eCC693fF41D730921", - "stakeBalance": "548.198082306127582623", - "hostnames": { - "1": "relsecc-mainnet.moon-relayer.app" - } - }, - { - "ensName": "default-relayer.eth", - "relayerAddress": "0x5555555731006f71f121144534Ca7C8799F66AA3", - "isRegistered": true, - "owner": "0x5555555731006f71f121144534Ca7C8799F66AA3", - "stakeBalance": "5011.216884015043970278", - "hostnames": { - "1": "eth.default-relayer.com", - "56": "bsc.default-relayer.com" - } - }, - { - "ensName": "t-relayer.eth", - "relayerAddress": "0x000000Cd6521Ed1a65FAe0678eA15aF4EEAD74fe", - "isRegistered": true, - "owner": "0x000000Cd6521Ed1a65FAe0678eA15aF4EEAD74fe", - "stakeBalance": "6079.008889316501226288", - "hostnames": { - "1": "eth.t-relayer.com", - "56": "bsc.t-relayer.com" - } - }, - { - "ensName": "secure-relay.eth", - "relayerAddress": "0x1036AF02bCDb2e3A4db2d3D40b29e5054EDc79BA", - "isRegistered": true, - "owner": "0x1036AF02bCDb2e3A4db2d3D40b29e5054EDc79BA", - "stakeBalance": "6751.661507930994067422", - "hostnames": { - "1": "torn-relayer.duckdns.org" - } - }, - { - "ensName": "torntorn.eth", - "relayerAddress": "0x1247749d7E28D357B4279110af0802603AC526cE", - "isRegistered": true, - "owner": "0x1247749d7E28D357B4279110af0802603AC526cE", - "stakeBalance": "5535.435044583932530913", - "hostnames": { - "1": "eth.fsdhreu39jfk.com", - "56": "bsc.fsdhreu39jfk.com", - "100": "gnosis.tornad0.com", - "137": "polygon.tornad0.com" - } - }, - { - "ensName": "bitah.eth", - "relayerAddress": "0x7E3893725d4e238B4c8c83375bBAd024a66Ffa42", - "isRegistered": true, - "owner": "0x7E3893725d4e238B4c8c83375bBAd024a66Ffa42", - "stakeBalance": "503.237718892072788154", - "hostnames": { - "1": "tornado.bitah.link", - "56": "bsc-tornado.bitah.link", - "137": "polygon-tornado.bitah.link" - } - }, - { - "ensName": "shadow-out.eth", - "relayerAddress": "0x9Ee26a4bFd731E8e742B65bF955814EADdd7F151", - "isRegistered": true, - "owner": "0x9Ee26a4bFd731E8e742B65bF955814EADdd7F151", - "stakeBalance": "3571.639136672079169166", - "hostnames": { - "1": "livetobecomeavillain", - "56": "justarandomdude", - "100": "everythingisburning" - } - }, - { - "ensName": "torn-eth.eth", - "relayerAddress": "0x42FecB4137aFF76E0E85702ff4F339DbFe6D859E", - "isRegistered": true, - "owner": "0x42FecB4137aFF76E0E85702ff4F339DbFe6D859E", - "stakeBalance": "978.62598484549460861", - "hostnames": { - "1": "mainnet-tornado.50swap.com" - } - }, - { - "ensName": "0xproxy.eth", - "relayerAddress": "0x08657a1f4C1F06d657F31767831421EE7FaDf549", - "isRegistered": true, - "owner": "0x08657a1f4C1F06d657F31767831421EE7FaDf549", - "stakeBalance": "705.605817336537209483", - "hostnames": { - "1": "mainnet.0x0relayer.xyz", - "56": "bsc.0x0relayer.xyz", - "137": "polygon.0x0relayer.xyz" - } - }, - { - "ensName": "wetez.eth", - "relayerAddress": "0xe6184DA55174Cc0263a17eA2fc24E48511766505", - "isRegistered": true, - "owner": "0xe6184DA55174Cc0263a17eA2fc24E48511766505", - "stakeBalance": "567.980734786905511868", - "hostnames": { - "1": "tornado-1.wetez.io" - } - }, - { - "ensName": "0xtorn.eth", - "relayerAddress": "0x9Ffbd3f9eE795A4fDa880ED553A2A4BD6D45CE5B", - "isRegistered": true, - "owner": "0x9Ffbd3f9eE795A4fDa880ED553A2A4BD6D45CE5B", - "stakeBalance": "4627.036617270139345308", - "hostnames": { - "1": "mainnet.al1n.cc", - "56": "bsc-tornado.al1n.cc" - } - }, - { - "ensName": "reslayer.eth", - "relayerAddress": "0x7Ba6781620c91676B070D319E7E894BFd4A9eC81", - "isRegistered": true, - "owner": "0x7Ba6781620c91676B070D319E7E894BFd4A9eC81", - "stakeBalance": "879.305690438201312145", - "hostnames": { - "1": "mainnet-tornado.reslayer.xyz", - "56": "bsc-tornado.reslayer.xyz", - "100": "gnosis-tornado.reslayer.xyz", - "137": "polygon-tornado.reslayer.xyz", - "42161": "arbitrum-tornado.reslayer.xyz", - "43114": "avalanche-tornado.reslayer.xyz" + "1": "mainnet-tornado.appleworld.club", + "56": "bsc-tornado.appleworld.club" } }, { @@ -290,67 +81,276 @@ } }, { - "ensName": "on-sale.eth", - "relayerAddress": "0x63606C4011e97a73BCd844Cde6a38D45a728BC0E", + "ensName": "reslayer.eth", + "relayerAddress": "0x7Ba6781620c91676B070D319E7E894BFd4A9eC81", "isRegistered": true, - "owner": "0x63606C4011e97a73BCd844Cde6a38D45a728BC0E", - "stakeBalance": "4476.543684932880020592", + "owner": "0x7Ba6781620c91676B070D319E7E894BFd4A9eC81", + "stakeBalance": "879.305690438201312145", "hostnames": { - "1": "mainnet-tornado.appleworld.club", - "56": "bsc-tornado.appleworld.club" + "1": "mainnet-tornado.reslayer.xyz", + "56": "bsc-tornado.reslayer.xyz", + "100": "gnosis-tornado.reslayer.xyz", + "137": "polygon-tornado.reslayer.xyz", + "42161": "arbitrum-tornado.reslayer.xyz", + "43114": "avalanche-tornado.reslayer.xyz" } }, { - "ensName": "relayernews.eth", - "relayerAddress": "0x6289C8a70EE2Ed6914834CaEa431F9a82c7eAf70", + "ensName": "0xtorn.eth", + "relayerAddress": "0x9Ffbd3f9eE795A4fDa880ED553A2A4BD6D45CE5B", "isRegistered": true, - "owner": "0x6289C8a70EE2Ed6914834CaEa431F9a82c7eAf70", - "stakeBalance": "1661.181918638614466424", + "owner": "0x9Ffbd3f9eE795A4fDa880ED553A2A4BD6D45CE5B", + "stakeBalance": "4627.036617270139345308", "hostnames": { - "1": "mainnet-tornado.relayernews.xyz", - "56": "bsc-tornado.relayernews.xyz" + "1": "mainnet.al1n.cc", + "56": "bsc-tornado.al1n.cc" } }, { - "ensName": "lowcost.eth", - "relayerAddress": "0x28907F21F43B419F34226d6f10aCbCf1832b1D4d", + "ensName": "wetez.eth", + "relayerAddress": "0xe6184DA55174Cc0263a17eA2fc24E48511766505", "isRegistered": true, - "owner": "0x28907F21F43B419F34226d6f10aCbCf1832b1D4d", - "stakeBalance": "500.279638085962965981", + "owner": "0xe6184DA55174Cc0263a17eA2fc24E48511766505", + "stakeBalance": "567.980734786905511868", "hostnames": { - "1": "mainnet-tornado.low-fee.xyz", - "56": "bsc-tornado.low-fee.xyz", - "137": "polygon-tornado.low-fee.xyz", - "43114": "avalanche-tornado.low-fee.xyz" + "1": "tornado-1.wetez.io" } }, { - "ensName": "cheap-relayer.eth", - "relayerAddress": "0x076D4E32C6A5D888fC4658281539c94E778C796d", + "ensName": "0xproxy.eth", + "relayerAddress": "0x08657a1f4C1F06d657F31767831421EE7FaDf549", "isRegistered": true, - "owner": "0x076D4E32C6A5D888fC4658281539c94E778C796d", - "stakeBalance": "500.878420081833044818", + "owner": "0x08657a1f4C1F06d657F31767831421EE7FaDf549", + "stakeBalance": "705.605817336537209483", "hostnames": { - "1": "mainnet-tornado.cheap-relayer.xyz", - "56": "bsc-tornado.cheap-relayer.xyz", - "137": "polygon-tornado.cheap-relayer.xyz", - "43114": "avalanche-tornado.cheap-relayer.xyz" + "1": "mainnet.0x0relayer.xyz", + "56": "bsc.0x0relayer.xyz", + "137": "polygon.0x0relayer.xyz" } }, { - "ensName": "therelayer.eth", - "relayerAddress": "0xA0F0287683E820FF4211e67C03cf46a87431f4E1", + "ensName": "torn-eth.eth", + "relayerAddress": "0x42FecB4137aFF76E0E85702ff4F339DbFe6D859E", "isRegistered": true, - "owner": "0xA0F0287683E820FF4211e67C03cf46a87431f4E1", - "stakeBalance": "1335.888771359625809238", + "owner": "0x42FecB4137aFF76E0E85702ff4F339DbFe6D859E", + "stakeBalance": "978.62598484549460861", "hostnames": { - "1": "mainnet.therelayer.xyz", - "10": "optimism.therelayer.xyz", - "56": "bsc.therelayer.xyz", - "100": "xdai.therelayer.xyz", - "137": "polygon.therelayer.xyz", - "42161": "arbitrum.therelayer.xyz", - "43114": "avalanche.therelayer.xyz" + "1": "mainnet-tornado.50swap.com" + } + }, + { + "ensName": "shadow-out.eth", + "relayerAddress": "0x9Ee26a4bFd731E8e742B65bF955814EADdd7F151", + "isRegistered": true, + "owner": "0x9Ee26a4bFd731E8e742B65bF955814EADdd7F151", + "stakeBalance": "3571.639136672079169166", + "hostnames": { + "1": "livetobecomeavillain", + "56": "justarandomdude", + "100": "everythingisburning" + } + }, + { + "ensName": "bitah.eth", + "relayerAddress": "0x7E3893725d4e238B4c8c83375bBAd024a66Ffa42", + "isRegistered": true, + "owner": "0x7E3893725d4e238B4c8c83375bBAd024a66Ffa42", + "stakeBalance": "503.237718892072788154", + "hostnames": { + "1": "tornado.bitah.link", + "56": "bsc-tornado.bitah.link", + "137": "polygon-tornado.bitah.link" + } + }, + { + "ensName": "torntorn.eth", + "relayerAddress": "0x1247749d7E28D357B4279110af0802603AC526cE", + "isRegistered": true, + "owner": "0x1247749d7E28D357B4279110af0802603AC526cE", + "stakeBalance": "5535.435044583932530913", + "hostnames": { + "1": "eth.fsdhreu39jfk.com", + "56": "bsc.fsdhreu39jfk.com", + "100": "gnosis.tornad0.com", + "137": "polygon.tornad0.com" + } + }, + { + "ensName": "secure-relay.eth", + "relayerAddress": "0x1036AF02bCDb2e3A4db2d3D40b29e5054EDc79BA", + "isRegistered": true, + "owner": "0x1036AF02bCDb2e3A4db2d3D40b29e5054EDc79BA", + "stakeBalance": "6751.661507930994067422", + "hostnames": { + "1": "torn-relayer.duckdns.org" + } + }, + { + "ensName": "relayer007.eth", + "relayerAddress": "0xa0109274F53609f6Be97ec5f3052C659AB80f012", + "isRegistered": true, + "owner": "0xa0109274F53609f6Be97ec5f3052C659AB80f012", + "stakeBalance": "2378.32581329697947104", + "hostnames": { + "1": "torn.relayersdao.finance", + "56": "bsc.relayersdao.finance", + "137": "matic.relayersdao.finance" + } + }, + { + "ensName": "reltor.eth", + "relayerAddress": "0x4750BCfcC340AA4B31be7e71fa072716d28c29C5", + "isRegistered": true, + "owner": "0x4750BCfcC340AA4B31be7e71fa072716d28c29C5", + "stakeBalance": "19959.537563477506888659", + "hostnames": { + "1": "eth.reltor.su", + "56": "binance.reltor.su", + "137": "polygon.reltor.su" + } + }, + { + "ensName": "t-relayer.eth", + "relayerAddress": "0x000000Cd6521Ed1a65FAe0678eA15aF4EEAD74fe", + "isRegistered": true, + "owner": "0x000000Cd6521Ed1a65FAe0678eA15aF4EEAD74fe", + "stakeBalance": "6379.466188010824508431", + "hostnames": { + "1": "eth.t-relayer.com", + "56": "bsc.t-relayer.com" + } + }, + { + "ensName": "default-relayer.eth", + "relayerAddress": "0x5555555731006f71f121144534Ca7C8799F66AA3", + "isRegistered": true, + "owner": "0x5555555731006f71f121144534Ca7C8799F66AA3", + "stakeBalance": "5611.417537369167166026", + "hostnames": { + "1": "eth.default-relayer.com", + "56": "bsc.default-relayer.com" + } + }, + { + "ensName": "relayer-secure.eth", + "relayerAddress": "0xCEdac436cEA98E93F471331eCC693fF41D730921", + "isRegistered": true, + "owner": "0xCEdac436cEA98E93F471331eCC693fF41D730921", + "stakeBalance": "548.198082306127582623", + "hostnames": { + "1": "relsecc-mainnet.moon-relayer.app" + } + }, + { + "ensName": "0xgm777.eth", + "relayerAddress": "0x94596B6A626392F5D972D6CC4D929a42c2f0008c", + "isRegistered": true, + "owner": "0x94596B6A626392F5D972D6CC4D929a42c2f0008c", + "stakeBalance": "1979.261700994868938309", + "hostnames": { + "1": "main.gm777.xyz", + "56": "bsc.gm777.xyz", + "42161": "arb.gm777.xyz" + } + }, + { + "ensName": "k-relayer.eth", + "relayerAddress": "0xC49415493eB3Ec64a0F13D8AA5056f1CfC4ce35c", + "isRegistered": true, + "owner": "0xC49415493eB3Ec64a0F13D8AA5056f1CfC4ce35c", + "stakeBalance": "2743.886989359646966334", + "hostnames": { + "1": "black-hardy.com", + "56": "bsc.black-hardy.com" + } + }, + { + "ensName": "tornxdo.eth", + "relayerAddress": "0xB399aa4c2F1678f72529Cd125F82cEA2c2a823eD", + "isRegistered": true, + "owner": "0xB399aa4c2F1678f72529Cd125F82cEA2c2a823eD", + "stakeBalance": "983.310689667160962345", + "hostnames": { + "1": "tornado.evmjunkie.xyz" + } + }, + { + "ensName": "torrelayer.eth", + "relayerAddress": "0x2Ee39Ff05643bC7cc9ed31B71e142429044A425C", + "isRegistered": true, + "owner": "0x2Ee39Ff05643bC7cc9ed31B71e142429044A425C", + "stakeBalance": "1697.363238361952542846", + "hostnames": { + "1": "tornima.xyz", + "56": "binance.tornima.xyz" + } + }, + { + "ensName": "torn-city.eth", + "relayerAddress": "0xd04e9f0945DEA8373D882C730e2c93a74B591796", + "isRegistered": true, + "owner": "0xd04e9f0945DEA8373D882C730e2c93a74B591796", + "stakeBalance": "6683.804986564144794348", + "hostnames": { + "1": "torn-city.com", + "56": "bsc.torn-city.com" + } + }, + { + "ensName": "crelayer.eth", + "relayerAddress": "0x180c58B7305152357142b33Eea94cBB152058B61", + "isRegistered": true, + "owner": "0x180c58B7305152357142b33Eea94cBB152058B61", + "stakeBalance": "1460.389956347917729137", + "hostnames": { + "1": "eth.crelayer.xyz", + "56": "bsc.crelayer.xyz" + } + }, + { + "ensName": "best-relay.eth", + "relayerAddress": "0xe5A4c70113b90566BC5f80a3866935d0d52F990E", + "isRegistered": true, + "owner": "0xe5A4c70113b90566BC5f80a3866935d0d52F990E", + "stakeBalance": "2002.0", + "hostnames": { + "1": "best-relay.gato-miaouw.xyz", + "56": "bsc.gato-miaouw.xyz" + } + }, + { + "ensName": "safety-relayer.eth", + "relayerAddress": "0xF1F4F76c9969eFbFB5C9A90a6E44c0E3696D3EF8", + "isRegistered": true, + "owner": "0xF1F4F76c9969eFbFB5C9A90a6E44c0E3696D3EF8", + "stakeBalance": "500.879215977529089999", + "hostnames": { + "1": "a-relayer.top", + "56": "bsc.a-relayer.top", + "137": "polygon.a-relayer.top" + } + }, + { + "ensName": "quick-relayer.eth", + "relayerAddress": "0x187541D7D312F742040f270d0221B4Fe577934B0", + "isRegistered": true, + "owner": "0x187541D7D312F742040f270d0221B4Fe577934B0", + "stakeBalance": "2931.033250737658918569", + "hostnames": { + "1": "quick-relayer.xyz" + } + }, + { + "ensName": "okrelayer.eth", + "relayerAddress": "0x0e9D9a828247F5eed7f6D31D213A39805De52441", + "isRegistered": true, + "owner": "0x0e9D9a828247F5eed7f6D31D213A39805De52441", + "stakeBalance": "4086.387829537434113053", + "hostnames": { + "1": "okrelayer.xyz", + "56": "binance.okrelayer.xyz", + "137": "polygon.okrelayer.xyz", + "42161": "arb.okrelayer.xyz" } } ] diff --git a/yarn.lock b/yarn.lock index ea4270d..c50b3f3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -781,9 +781,9 @@ "@openzeppelin/contracts-v3" "npm:@openzeppelin/contracts@3.2.0-rc.0" ethers "^6.4.0" -"@tornado/core@git+https://git.tornado.ws/tornadocontrib/tornado-core.git#700426acb7a7de16884cb314c3a0220a51682d18": - version "1.0.7" - resolved "git+https://git.tornado.ws/tornadocontrib/tornado-core.git#700426acb7a7de16884cb314c3a0220a51682d18" +"@tornado/core@git+https://git.tornado.ws/tornadocontrib/tornado-core.git#d6cfea1d1990f07a8faca2e876c0a6ccea4f603f": + version "1.0.10" + resolved "git+https://git.tornado.ws/tornadocontrib/tornado-core.git#d6cfea1d1990f07a8faca2e876c0a6ccea4f603f" dependencies: "@metamask/eth-sig-util" "^7.0.3" "@tornado/contracts" "^1.0.0"