diff --git a/.changeset/eleven-carpets-mix.md b/.changeset/eleven-carpets-mix.md new file mode 100644 index 00000000..a845151c --- /dev/null +++ b/.changeset/eleven-carpets-mix.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/package-lock.json b/package-lock.json index ea52dc2c..573a3be5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,19 +27,19 @@ "@multiformats/multiaddr": "^11.0.3", "@rosen-bridge/health-check": "^3.0.1", "@rosen-bridge/minimum-fee": "^0.1.13", - "@rosen-bridge/rosen-extractor": "^3.0.0", - "@rosen-bridge/scanner": "^3.0.0", - "@rosen-bridge/tokens": "^1.0.0", + "@rosen-bridge/rosen-extractor": "^3.4.0", + "@rosen-bridge/scanner": "^3.2.6", + "@rosen-bridge/tokens": "^1.1.0", "@rosen-bridge/tss": "^1.2.0", - "@rosen-bridge/watcher-data-extractor": "^4.0.0", + "@rosen-bridge/watcher-data-extractor": "^5.0.1", "@rosen-bridge/winston-logger": "0.2.1", - "@rosen-chains/abstract-chain": "^3.2.2", - "@rosen-chains/cardano": "^3.2.4", - "@rosen-chains/cardano-blockfrost-network": "^1.2.4", - "@rosen-chains/cardano-koios-network": "^4.2.5", - "@rosen-chains/ergo": "^3.2.4", - "@rosen-chains/ergo-explorer-network": "^3.2.4", - "@rosen-chains/ergo-node-network": "^3.2.4", + "@rosen-chains/abstract-chain": "^5.0.0", + "@rosen-chains/cardano": "^5.0.0", + "@rosen-chains/cardano-blockfrost-network": "^3.0.0", + "@rosen-chains/cardano-koios-network": "^6.0.0", + "@rosen-chains/ergo": "^5.0.0", + "@rosen-chains/ergo-explorer-network": "^5.0.0", + "@rosen-chains/ergo-node-network": "^5.0.0", "@sinclair/typebox": "^0.30.4", "await-semaphore": "^0.1.3", "axios": "^0.27.2", @@ -158,6 +158,11 @@ "npm": ">=7.0.0" } }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" + }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", @@ -171,6 +176,48 @@ "node": ">=6.0.0" } }, + "node_modules/@apollo/client": { + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.9.7.tgz", + "integrity": "sha512-OEEwt55bkFhqihCT5d75KUxZt50JZ9MuIYwG7VZlyPPIAb9K+qzVWlXWlf3tB5DaV43yXkUSLQfNpdIBFOB55Q==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@wry/caches": "^1.0.0", + "@wry/equality": "^0.5.6", + "@wry/trie": "^0.5.0", + "graphql-tag": "^2.12.6", + "hoist-non-react-statics": "^3.3.2", + "optimism": "^0.18.0", + "prop-types": "^15.7.2", + "rehackt": "0.0.6", + "response-iterator": "^0.2.6", + "symbol-observable": "^4.0.0", + "ts-invariant": "^0.10.3", + "tslib": "^2.3.0", + "zen-observable-ts": "^1.2.5" + }, + "peerDependencies": { + "graphql": "^15.0.0 || ^16.0.0", + "graphql-ws": "^5.5.5", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" + }, + "peerDependenciesMeta": { + "graphql-ws": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "subscriptions-transport-ws": { + "optional": true + } + } + }, "node_modules/@babel/code-frame": { "version": "7.22.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", @@ -708,11 +755,11 @@ } }, "node_modules/@cardano-ogmios/client": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@cardano-ogmios/client/-/client-6.0.0.tgz", - "integrity": "sha512-XxPzuqIS0ArvcwgSCvnKqZvCIQZQuhJztbWE5mWdDtIwOJAAr2XQp7sD7DSTg0IU3EmEIRjYnr6BuxRQ+fHLbg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@cardano-ogmios/client/-/client-6.1.0.tgz", + "integrity": "sha512-LADrJtN484jBoKIh2KSslBsusNdfU+A/X0XIazYCu/dXXkIGvNtz7Z8/wZesvkFghzBLQFMj/UdCLv5y8JVhhg==", "dependencies": { - "@cardano-ogmios/schema": "6.0.0", + "@cardano-ogmios/schema": "6.1.0", "@cardanosolutions/json-bigint": "^1.0.1", "@types/json-bigint": "^1.0.1", "bech32": "^2.0.0", @@ -728,9 +775,9 @@ } }, "node_modules/@cardano-ogmios/schema": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@cardano-ogmios/schema/-/schema-6.0.0.tgz", - "integrity": "sha512-Q1L7/M9HJB580iLp6813iJFgvdvNlliPqotZkOK8tbUrilKppFtti+PUz/PffIqZ6wbyrg1fHCgGQQvvWHEM0A==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@cardano-ogmios/schema/-/schema-6.1.0.tgz", + "integrity": "sha512-rwNlU51CYgbJJYueM5E76G1OhfrR4GXLvaEis1446/HATJdFJQNc4P/RiEHauEgBOqArI7oFTuTSgJLahQ8/Zw==", "engines": { "node": ">=14" } @@ -1729,9 +1776,9 @@ } }, "node_modules/@emurgo/cardano-serialization-lib-nodejs": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-11.4.0.tgz", - "integrity": "sha512-dMiofDcqv+IrAITCgWBZmsMLqwv2xImDsJDSrKiYYG1zRKaL8XfMOxx6S0WEnKVj5/343Q5FFURYcSu3iBRNMQ==" + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-11.5.0.tgz", + "integrity": "sha512-IlVABlRgo9XaTR1NunwZpWcxnfEv04ba2l1vkUz4S1W7Jt36F4CtffP+jPeqBZGnAe+fnUwo0XjIJC3ZTNToNQ==" }, "node_modules/@emurgo/cip14-js": { "version": "3.0.1", @@ -1742,22 +1789,6 @@ "blake2b": "2.1.3" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.17.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.14.tgz", - "integrity": "sha512-8KHF17OstlK4DuzeF/KmSgzrTWQrkWj5boluiiq7kvJCiQVzUrmSkaBvcLB2UgHpKENO2i6BthPkmUhNDaJsVw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@eslint/eslintrc": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", @@ -1990,6 +2021,14 @@ "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "optional": true }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -2023,6 +2062,74 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -2959,25 +3066,6 @@ "node": ">= 4.0.0" } }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, "node_modules/@multiformats/mafmt": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/@multiformats/mafmt/-/mafmt-11.0.3.tgz", @@ -3031,36 +3119,6 @@ "npm": ">=7.0.0" } }, - "node_modules/@napi-rs/snappy-android-arm-eabi": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-android-arm-eabi/-/snappy-android-arm-eabi-7.2.2.tgz", - "integrity": "sha512-H7DuVkPCK5BlAr1NfSU8bDEN7gYs+R78pSHhDng83QxRnCLmVIZk33ymmIwurmoA1HrdTxbkbuNl+lMvNqnytw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/snappy-android-arm64": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-android-arm64/-/snappy-android-arm64-7.2.2.tgz", - "integrity": "sha512-2R/A3qok+nGtpVK8oUMcrIi5OMDckGYNoBLFyli3zp8w6IArPRfg1yOfVUcHvpUDTo9T7LOS1fXgMOoC796eQw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@napi-rs/snappy-darwin-arm64": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/@napi-rs/snappy-darwin-arm64/-/snappy-darwin-arm64-7.2.2.tgz", @@ -3076,154 +3134,15 @@ "node": ">= 10" } }, - "node_modules/@napi-rs/snappy-darwin-x64": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-darwin-x64/-/snappy-darwin-x64-7.2.2.tgz", - "integrity": "sha512-0APDu8iO5iT0IJKblk2lH0VpWSl9zOZndZKnBYIc+ei1npw2L5QvuErFOTeTdHBtzvUHASB+9bvgaWnQo4PvTQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/snappy-freebsd-x64": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-freebsd-x64/-/snappy-freebsd-x64-7.2.2.tgz", - "integrity": "sha512-mRTCJsuzy0o/B0Hnp9CwNB5V6cOJ4wedDTWEthsdKHSsQlO7WU9W1yP7H3Qv3Ccp/ZfMyrmG98Ad7u7lG58WXA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/snappy-linux-arm-gnueabihf": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm-gnueabihf/-/snappy-linux-arm-gnueabihf-7.2.2.tgz", - "integrity": "sha512-v1uzm8+6uYjasBPcFkv90VLZ+WhLzr/tnfkZ/iD9mHYiULqkqpRuC8zvc3FZaJy5wLQE9zTDkTJN1IvUcZ+Vcg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/snappy-linux-arm64-gnu": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm64-gnu/-/snappy-linux-arm64-gnu-7.2.2.tgz", - "integrity": "sha512-LrEMa5pBScs4GXWOn6ZYXfQ72IzoolZw5txqUHVGs8eK4g1HR9HTHhb2oY5ySNaKakG5sOgMsb1rwaEnjhChmQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/snappy-linux-arm64-musl": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm64-musl/-/snappy-linux-arm64-musl-7.2.2.tgz", - "integrity": "sha512-3orWZo9hUpGQcB+3aTLW7UFDqNCQfbr0+MvV67x8nMNYj5eAeUtMmUE/HxLznHO4eZ1qSqiTwLbVx05/Socdlw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/snappy-linux-x64-gnu": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-x64-gnu/-/snappy-linux-x64-gnu-7.2.2.tgz", - "integrity": "sha512-jZt8Jit/HHDcavt80zxEkDpH+R1Ic0ssiVCoueASzMXa7vwPJeF4ZxZyqUw4qeSy7n8UUExomu8G8ZbP6VKhgw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/snappy-linux-x64-musl": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-x64-musl/-/snappy-linux-x64-musl-7.2.2.tgz", - "integrity": "sha512-Dh96IXgcZrV39a+Tej/owcd9vr5ihiZ3KRix11rr1v0MWtVb61+H1GXXlz6+Zcx9y8jM1NmOuiIuJwkV4vZ4WA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/snappy-win32-arm64-msvc": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-arm64-msvc/-/snappy-win32-arm64-msvc-7.2.2.tgz", - "integrity": "sha512-9No0b3xGbHSWv2wtLEn3MO76Yopn1U2TdemZpCaEgOGccz1V+a/1d16Piz3ofSmnA13HGFz3h9NwZH9EOaIgYA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/snappy-win32-ia32-msvc": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-ia32-msvc/-/snappy-win32-ia32-msvc-7.2.2.tgz", - "integrity": "sha512-QiGe+0G86J74Qz1JcHtBwM3OYdTni1hX1PFyLRo3HhQUSpmi13Bzc1En7APn+6Pvo7gkrcy81dObGLDSxFAkQQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/snappy-win32-x64-msvc": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-x64-msvc/-/snappy-win32-x64-msvc-7.2.2.tgz", - "integrity": "sha512-a43cyx1nK0daw6BZxVcvDEXxKMFLSBSDTAhsFD0VqSKcC7MGUBMaqyoWUcMiI7LBSz4bxUmxDWKfCYzpEmeb3w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/ed25519": { @@ -3238,9 +3157,9 @@ ] }, "node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", "engines": { "node": ">= 16" }, @@ -3330,6 +3249,15 @@ "node": ">=10" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -3406,6 +3334,24 @@ "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-0.3.0.tgz", "integrity": "sha512-7le4cm1ycCSeBAYH5HQ2KW4K9jJCcDvWrpdVFsC99YiWeRWPriH66FB99iV5INQNlkL+VMyafcn3TiESAy1EXw==" }, + "node_modules/@rosen-bridge/address-codec": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-0.2.0.tgz", + "integrity": "sha512-buBNGO/CWjZy07UJgigz6tuO17q/ljNSh+f0N5GT3Q0BGM4yR0y6v8AJsLNWCLeZif2OGPw9XxeeAZdwEWOlJQ==", + "dependencies": { + "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", + "bitcoinjs-lib": "^6.1.5", + "ergo-lib-wasm-nodejs": "^0.26.0" + }, + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rosen-bridge/address-codec/node_modules/ergo-lib-wasm-nodejs": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/ergo-lib-wasm-nodejs/-/ergo-lib-wasm-nodejs-0.26.0.tgz", + "integrity": "sha512-sG+MOwYKrCgcUbCHwnCOvHHS5wxEkaO/G8zUxlMiX6cSAdN06ddVIGflyqzebKe3z6OO1cN9tfMX0W7fJnzKHg==" + }, "node_modules/@rosen-bridge/changeset-formatter": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@rosen-bridge/changeset-formatter/-/changeset-formatter-0.1.0.tgz", @@ -3415,6 +3361,18 @@ "node": ">=20.11.0" } }, + "node_modules/@rosen-bridge/extended-typeorm": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@rosen-bridge/extended-typeorm/-/extended-typeorm-0.0.2.tgz", + "integrity": "sha512-OCRPOxU8LyWAcfjFY/P4os0E5bqpeHTrzdpE4vnaY/nebwuoMpCc2+LwJfvYwRItJydLlvvKAQd0P1xcr92cPg==", + "dependencies": { + "async-mutex": "^0.4.0", + "typeorm": "^0.3.12" + }, + "peerDependencies": { + "sqlite3": "^5.1.6" + } + }, "node_modules/@rosen-bridge/health-check": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@rosen-bridge/health-check/-/health-check-3.0.1.tgz", @@ -3446,11 +3404,6 @@ "node": ">=18.12.0" } }, - "node_modules/@rosen-bridge/logger-interface": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/logger-interface/-/logger-interface-0.1.0.tgz", - "integrity": "sha512-kl6FkiDE8d9SwR+mPml1aIRWYuTlqZxq9RlsdnH9P9wHwl/uGfYqGVrWlnmtRvOhUWE9Wv7tZaTBcRnVy2x2CA==" - }, "node_modules/@rosen-bridge/minimum-fee": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/@rosen-bridge/minimum-fee/-/minimum-fee-0.1.13.tgz", @@ -3462,40 +3415,66 @@ } }, "node_modules/@rosen-bridge/rosen-extractor": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/rosen-extractor/-/rosen-extractor-3.0.0.tgz", - "integrity": "sha512-28qrYOd3IrO24JjIdO/TGWv6vOTtFWWOQ3EZvozrOVIAAVyHdMK2NUYxqvJxbvL8P3hTEOIcd+PTvq9SZRi5IA==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/rosen-extractor/-/rosen-extractor-3.5.0.tgz", + "integrity": "sha512-nBhA9HP9X/zgbq4j/ycR8XeJ4aEfiIgMKVBvr2bSJ6YoZ9e2oJngJyIPP1BQtc5lKl+Otjb+5nJa8joC3Oe6/w==", "dependencies": { - "@cardano-ogmios/schema": "^6.0.0", - "@rosen-bridge/abstract-logger": "^0.3.0", + "@blockfrost/blockfrost-js": "^5.4.0", + "@cardano-ogmios/schema": "^6.0.3", + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/address-codec": "^0.2.0", "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/tokens": "^1.0.0", + "bitcoinjs-lib": "^6.1.5", "ergo-lib-wasm-nodejs": "^0.24.1", + "ethers": "^6.11.1", "json-bigint": "^1.0.0", "lodash-es": "^4.17.21" } }, + "node_modules/@rosen-bridge/rosen-extractor/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + }, "node_modules/@rosen-bridge/scanner": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/scanner/-/scanner-3.0.0.tgz", - "integrity": "sha512-09F9szF+BKneopejMbp7zuJUr5KOZQNluPMi7KpGcbZV/jW7K2XTBtFXWZzxzIpWkzKaUs7K0k7APkzapQJqeA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@rosen-bridge/scanner/-/scanner-3.2.6.tgz", + "integrity": "sha512-/TB9YzXNRpD3+OQdijGGkUqzyOrZRM+2b0K8ZgsuhxYoTW96ZJAtPL+uqbmPoexeG6wL8EjkdKSAQ3u0Fyq1ew==", "dependencies": { - "@cardano-ogmios/client": "^6.0.0", - "@cardano-ogmios/schema": "^6.0.0", - "@rosen-bridge/logger-interface": "^0.1.0", + "@apollo/client": "^3.8.7", + "@blockfrost/blockfrost-js": "^5.4.0", + "@cardano-ogmios/client": "^6.0.3", + "@cardano-ogmios/schema": "^6.0.3", + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-clients/ergo-explorer": "^1.0.3", "@rosen-clients/ergo-node": "^1.0.4", "await-semaphore": "^0.1.3", "axios": "^0.27.2", + "cross-fetch": "^4.0.0", "reflect-metadata": "^0.1.13", "sqlite3": "^5.0.9", "typeorm": "^0.3.7" } }, - "node_modules/@rosen-bridge/tokens": { + "node_modules/@rosen-bridge/scanner/node_modules/@rosen-bridge/abstract-logger": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/tokens/-/tokens-1.0.0.tgz", - "integrity": "sha512-sPlXesKNqTwJICAcqEAvg9DSWjGLST7NlZ1i8Gh/4MmfefDNlzscg1CywSikOmpTOhBH4xEzWdrgHGf7UDgeWg==" + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + }, + "node_modules/@rosen-bridge/scanner/node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/@rosen-bridge/tokens": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/tokens/-/tokens-1.1.0.tgz", + "integrity": "sha512-Ott48bFRKoK4h+ePUuPmWFUtOCGcuWiAbPrZ7h9BgX6GRj3/NTpzPFQgnaXk62oyJrZgWubgpcuQTf1yieTS+Q==" }, "node_modules/@rosen-bridge/tss": { "version": "1.2.0", @@ -3533,12 +3512,14 @@ } }, "node_modules/@rosen-bridge/watcher-data-extractor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/watcher-data-extractor/-/watcher-data-extractor-4.0.0.tgz", - "integrity": "sha512-4qhnUA/fx7IcqblwVA7abRYEVXeIjTYtfoiPQEg9hkvFWEc3vKSrionUgz1AfcKpXHrsI+ThVjXYJ8emh3phBA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/watcher-data-extractor/-/watcher-data-extractor-5.1.0.tgz", + "integrity": "sha512-Ha0UzlPV/creLQjxVsOCA76Q/TYw/SIaRs60bXb9+j1dgpCsjyNagXhA12iyYLz7lfxEHZJ4tMRCm8+90bvBow==", "dependencies": { - "@rosen-bridge/logger-interface": "^0.1.0", - "@rosen-bridge/scanner": "^3.0.0", + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/extended-typeorm": "^0.0.2", + "@rosen-bridge/json-bigint": "^0.1.0", + "@rosen-bridge/scanner": "^3.2.6", "@rosen-clients/ergo-explorer": "^1.0.3", "@types/lodash-es": "^4.17.6", "blakejs": "^1.2.1", @@ -3551,6 +3532,11 @@ "typeorm": "^0.3.7" } }, + "node_modules/@rosen-bridge/watcher-data-extractor/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + }, "node_modules/@rosen-bridge/winston-logger": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@rosen-bridge/winston-logger/-/winston-logger-0.2.1.tgz", @@ -3572,44 +3558,53 @@ "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" }, "node_modules/@rosen-chains/abstract-chain": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@rosen-chains/abstract-chain/-/abstract-chain-3.2.2.tgz", - "integrity": "sha512-DDzSlNBE1WIfl9yJNjsuHSEvITP7vqFYLN6VNc70fwLksAzb3OGioFaxDgkAd7Zaaa9IMmtav5LG8ExS4mQ7CQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@rosen-chains/abstract-chain/-/abstract-chain-5.0.0.tgz", + "integrity": "sha512-crv1bMgcs9Re5kbCxLew42Gl+ElokIrNdSKPTns1f2P8iI2sX2SmeWgqbWDKPDsTlaJN7kWuyiVXCzVjKTN9kA==", "dependencies": { + "@rosen-bridge/abstract-logger": "^1.0.0", "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-bridge/logger-interface": "^0.1.0", "@rosen-bridge/minimum-fee": "^0.1.13", - "@rosen-bridge/rosen-extractor": "^3.0.0" + "@rosen-bridge/rosen-extractor": "^3.4.0" } }, + "node_modules/@rosen-chains/abstract-chain/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + }, "node_modules/@rosen-chains/cardano": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@rosen-chains/cardano/-/cardano-3.2.4.tgz", - "integrity": "sha512-I1Cd8R67Xvgmy91hbIJWdJQIh45HUUtQuIXKfzWeaAemM69n4l42vx3Fu2AhjfdsVYw28bdgOkmZorubkXJXdw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@rosen-chains/cardano/-/cardano-5.0.0.tgz", + "integrity": "sha512-UouBGGZofDtN8soolUKAp+ne+ORD+sWamC9Tj9XHeG+2p383bcAvS9kTt1PIB26QBiBMiMtOeBNqs7Gv1H9P5w==", "dependencies": { "@emurgo/cardano-serialization-lib-nodejs": "^11.3.1", + "@rosen-bridge/abstract-logger": "^1.0.0", "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-bridge/logger-interface": "^0.1.0", - "@rosen-bridge/rosen-extractor": "^3.0.0", - "@rosen-chains/abstract-chain": "^3.2.2", + "@rosen-bridge/rosen-extractor": "^3.4.0", "bech32": "^2.0.0", "blake2b": "^2.1.3" + }, + "peerDependencies": { + "@rosen-chains/abstract-chain": "^5.0.0" } }, "node_modules/@rosen-chains/cardano-blockfrost-network": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@rosen-chains/cardano-blockfrost-network/-/cardano-blockfrost-network-1.2.4.tgz", - "integrity": "sha512-wtRYFjJ/G/HvJHyJccUW70aIaMiPAIEI8MEdH6swOJ6GjE4GCP7RnGMvZsYBg3O90d0v0ZfdYtV9HYHGTdJIvQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@rosen-chains/cardano-blockfrost-network/-/cardano-blockfrost-network-3.0.0.tgz", + "integrity": "sha512-OLSLq77ExPFD86gJrI/HQYn6m5IDmauGn3T3aG0c39Wh370c1XZULW8czsAnkY8SG6gldn6s5i/Zyf0UkGypyQ==", "dependencies": { "@blockfrost/blockfrost-js": "^5.4.0", "@emurgo/cardano-serialization-lib-nodejs": "^11.3.1", "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/rosen-extractor": "^3.0.0", - "@rosen-chains/abstract-chain": "^3.2.2", - "@rosen-chains/cardano": "^3.2.4" + "@rosen-bridge/rosen-extractor": "^3.4.0" }, "engines": { "node": ">=18.12.0" + }, + "peerDependencies": { + "@rosen-chains/abstract-chain": "^5.0.0", + "@rosen-chains/cardano": "^5.0.0" } }, "node_modules/@rosen-chains/cardano-blockfrost-network/node_modules/@rosen-bridge/abstract-logger": { @@ -3618,49 +3613,70 @@ "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" }, "node_modules/@rosen-chains/cardano-koios-network": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@rosen-chains/cardano-koios-network/-/cardano-koios-network-4.2.5.tgz", - "integrity": "sha512-bgzv9J6jLPDXCFdcU1vnUTerVN50qHKB+842tqwVOQUfITFH3a0deyaAopG3eN27bVtmQ/F3CVYYG5BxHMLLrw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@rosen-chains/cardano-koios-network/-/cardano-koios-network-6.0.0.tgz", + "integrity": "sha512-K321y2nJp6OiVkYUpCUK1MErnIm/X/tdR4iYhli8B3f13dVqBTwTLpyvG5pg/8knhqeVn7O4mYf17+HNbgUa/Q==", "dependencies": { "@emurgo/cardano-serialization-lib-nodejs": "^11.3.1", + "@rosen-bridge/abstract-logger": "^1.0.0", "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-bridge/logger-interface": "^0.1.0", - "@rosen-bridge/rosen-extractor": "^3.0.0", + "@rosen-bridge/rosen-extractor": "^3.4.0", "@rosen-bridge/tokens": "^1.0.0", - "@rosen-chains/abstract-chain": "^3.2.2", - "@rosen-chains/cardano": "^3.2.4", "@rosen-clients/cardano-koios": "^2.0.1" + }, + "peerDependencies": { + "@rosen-chains/abstract-chain": "^5.0.0", + "@rosen-chains/cardano": "^5.0.0" } }, + "node_modules/@rosen-chains/cardano-koios-network/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + }, + "node_modules/@rosen-chains/cardano/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + }, "node_modules/@rosen-chains/ergo": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@rosen-chains/ergo/-/ergo-3.2.4.tgz", - "integrity": "sha512-cts2NOYNV5d+sLOKZn3nRhcwZBOsafpYMOS4K0flNdbEC/0X0kfrp0HaVSSMaJ9Vce6vX3NIkXJtkIbXHd7B1A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@rosen-chains/ergo/-/ergo-5.0.0.tgz", + "integrity": "sha512-EIq3pkkINfJ2S+suRtGXxSA7wli0cw/55zTaout8mlxXRDIwyRCP+f2LHJlydJqTBlYopchguPk4lIl1iaM5yQ==", "dependencies": { "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/minimum-fee": "^0.1.13", - "@rosen-bridge/rosen-extractor": "^3.0.0", - "@rosen-chains/abstract-chain": "^3.2.2", + "@rosen-bridge/rosen-extractor": "^3.4.0", "blakejs": "^1.2.1", "ergo-lib-wasm-nodejs": "^0.24.1" + }, + "peerDependencies": { + "@rosen-chains/abstract-chain": "^5.0.0" } }, "node_modules/@rosen-chains/ergo-explorer-network": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@rosen-chains/ergo-explorer-network/-/ergo-explorer-network-3.2.4.tgz", - "integrity": "sha512-rkfXYnId+PHXwfV01i8OwJv1uHo41w5ukHuHvBABm83UdC9p08fHNgHuxFuT5gc2EWOEsZOXtH2OVzgYqE+D3A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@rosen-chains/ergo-explorer-network/-/ergo-explorer-network-5.0.0.tgz", + "integrity": "sha512-JFP0d4CN/vj6fgoOhZ2DsazaDhTi41kBCQbQRoOm4dbZZSc8P2IOCwbnswb4ORZg5FXq4BQqM3j8Cv1fnwObwg==", "dependencies": { + "@rosen-bridge/abstract-logger": "^1.0.0", "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-bridge/logger-interface": "^0.1.0", - "@rosen-bridge/rosen-extractor": "^3.0.0", + "@rosen-bridge/rosen-extractor": "^3.4.0", "@rosen-bridge/tokens": "^1.0.0", - "@rosen-chains/abstract-chain": "^3.2.2", - "@rosen-chains/ergo": "^3.2.4", "@rosen-clients/ergo-explorer": "^1.0.3", "ergo-lib-wasm-nodejs": "^0.24.1", "it-all": "^3.0.1" + }, + "peerDependencies": { + "@rosen-chains/abstract-chain": "^5.0.0", + "@rosen-chains/ergo": "^5.0.0" } }, + "node_modules/@rosen-chains/ergo-explorer-network/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + }, "node_modules/@rosen-chains/ergo-explorer-network/node_modules/it-all": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.2.tgz", @@ -3671,21 +3687,28 @@ } }, "node_modules/@rosen-chains/ergo-node-network": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@rosen-chains/ergo-node-network/-/ergo-node-network-3.2.4.tgz", - "integrity": "sha512-hXc2y9mzMcr47s+VvP4kUmxvkrYP4Y7+zf/WTxxtT4kOSN171wKUpT9XVqSfCNF8LmxBISOUg7YYADpKUT1wlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@rosen-chains/ergo-node-network/-/ergo-node-network-5.0.0.tgz", + "integrity": "sha512-ysf88A+q50V4xOTFZe225wmwGNgs45AkN0KN+peN7cRjJlhgBztAVcg2k2qUKPFu044zx3joLQxBL4b1kU7q1w==", "dependencies": { + "@rosen-bridge/abstract-logger": "^1.0.0", "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-bridge/logger-interface": "^0.1.0", - "@rosen-bridge/rosen-extractor": "^3.0.0", + "@rosen-bridge/rosen-extractor": "^3.4.0", "@rosen-bridge/tokens": "^1.0.0", - "@rosen-chains/abstract-chain": "^3.2.2", - "@rosen-chains/ergo": "^3.2.4", "@rosen-clients/ergo-node": "^1.0.4", "ergo-lib-wasm-nodejs": "^0.24.1", "it-all": "^3.0.1" + }, + "peerDependencies": { + "@rosen-chains/abstract-chain": "^5.0.0", + "@rosen-chains/ergo": "^5.0.0" } }, + "node_modules/@rosen-chains/ergo-node-network/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + }, "node_modules/@rosen-chains/ergo-node-network/node_modules/it-all": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.2.tgz", @@ -3959,38 +3982,6 @@ "@swc/core-win32-x64-msvc": "1.3.44" } }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.3.44", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.44.tgz", - "integrity": "sha512-xV4pDxJM06g0yUDTA22ZHgonzGqf/poIlgADRmEkx9cWWm5qLRhmWrrkVX1xZVvdlcXj1ERnia/UkvrDux96lg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.3.44", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.44.tgz", - "integrity": "sha512-NJnnlE8vCkKHoo/wIaoywNN/01vNsvhKUjBgUx865sUM/XWAIanpbV41yfdEkC+Iwd+/zB3ZZnOYql3b+Nn8aQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", @@ -4481,6 +4472,50 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@wry/caches": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@wry/caches/-/caches-1.0.1.tgz", + "integrity": "sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wry/context": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.7.4.tgz", + "integrity": "sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wry/equality": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.5.7.tgz", + "integrity": "sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wry/trie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.5.0.tgz", + "integrity": "sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", @@ -4489,7 +4524,8 @@ "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "devOptional": true }, "node_modules/abort-controller": { "version": "3.0.0", @@ -4546,10 +4582,16 @@ "node": ">=0.4.0" } }, + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, "dependencies": { "debug": "4" }, @@ -4744,24 +4786,13 @@ "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "optional": true }, "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" }, "node_modules/arg": { "version": "4.1.3", @@ -4772,7 +4803,8 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", @@ -4883,6 +4915,14 @@ "node": ">=0.12.0" } }, + "node_modules/async-mutex": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.1.tgz", + "integrity": "sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -4948,6 +4988,11 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/base-x": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -5018,11 +5063,42 @@ "node": ">=8" } }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bip174": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bip174/-/bip174-2.1.1.tgz", + "integrity": "sha512-mdFV5+/v0XyNYXjBS6CQPLo9ekCx4gtKZFnJm5PMto7Fs9hTTDpkkzOB7/FtluRI6JbUUAu+snTYfJRgHLZbZQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/bitcoinjs-lib": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.1.5.tgz", + "integrity": "sha512-yuf6xs9QX/E8LWE2aMJPNd0IxGofwfuVOiYdNUESkc+2bHHVKjhJd8qewqapeoolh9fihzHGoDCB5Vkr57RZCQ==", + "dependencies": { + "@noble/hashes": "^1.2.0", + "bech32": "^2.0.0", + "bip174": "^2.1.1", + "bs58check": "^3.0.1", + "typeforce": "^1.11.3", + "varuint-bitcoin": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -5127,6 +5203,23 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bs58": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "dependencies": { + "base-x": "^4.0.0" + } + }, + "node_modules/bs58check": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-3.0.1.tgz", + "integrity": "sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==", + "dependencies": { + "@noble/hashes": "^1.2.0", + "bs58": "^5.0.0" + } + }, "node_modules/btoa": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", @@ -5142,7 +5235,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "funding": [ { "type": "github", @@ -5659,6 +5751,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "optional": true, "bin": { "color-support": "bin.js" } @@ -5730,7 +5823,8 @@ "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "optional": true }, "node_modules/content-disposition": { "version": "0.5.4", @@ -5874,17 +5968,10 @@ "npm": ">=7.0.0" } }, - "node_modules/date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" }, "node_modules/debug": { "version": "4.3.4", @@ -5977,7 +6064,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, "engines": { "node": ">=4.0.0" } @@ -6064,7 +6150,8 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "optional": true }, "node_modules/denque": { "version": "1.5.1", @@ -6130,9 +6217,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", "engines": { "node": ">=8" } @@ -6446,8 +6533,7 @@ "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/electron-to-chromium": { "version": "1.4.540", @@ -6472,8 +6558,7 @@ "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/enabled": { "version": "2.0.0", @@ -7070,6 +7155,63 @@ "node": ">=0.10.0" } }, + "node_modules/ethers": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.11.1.tgz", + "integrity": "sha512-mxTAE6wqJQAbp5QAe/+o+rXOID7Nw91OZXvgpjDa1r4fAbq2Nu314oEZSbjoRLacuCzs7kUC3clEvkCQowffGg==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + }, + "node_modules/ethers/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/ethers/node_modules/ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/event-iterator": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/event-iterator/-/event-iterator-2.0.0.tgz", @@ -7129,6 +7271,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, "node_modules/extendable-error": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", @@ -7323,6 +7473,11 @@ "url": "https://github.com/sindresorhus/file-type?sponsor=1" } }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, "node_modules/filing-cabinet": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-3.3.0.tgz", @@ -7486,6 +7641,32 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -7516,6 +7697,11 @@ "npm": ">=7.0.0" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -7582,51 +7768,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gauge/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -7727,6 +7868,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -7870,6 +8016,29 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "node_modules/graphql": { + "version": "16.8.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.8.1.tgz", + "integrity": "sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/graphql-tag": { + "version": "2.12.6", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", + "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, "node_modules/graphviz": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/graphviz/-/graphviz-0.0.9.tgz", @@ -7974,7 +8143,8 @@ "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "optional": true }, "node_modules/hash.js": { "version": "1.1.7", @@ -8020,6 +8190,19 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -8082,6 +8265,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "optional": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -8237,8 +8421,7 @@ "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/interface-datastore": { "version": "7.0.1", @@ -9123,6 +9306,23 @@ } } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/js-sdsl": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", @@ -9136,13 +9336,13 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -9950,6 +10150,17 @@ "npm": ">=7.0.0" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/loupe": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", @@ -10052,28 +10263,6 @@ "node": ">=12" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -10399,6 +10588,25 @@ "node": ">= 8.0.0" } }, + "node_modules/mkdirp": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", + "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, "node_modules/mlly": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", @@ -10534,6 +10742,11 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, "node_modules/native-fetch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-4.0.2.tgz", @@ -10576,6 +10789,17 @@ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, + "node_modules/node-abi": { + "version": "3.56.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.56.0.tgz", + "integrity": "sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", @@ -10815,6 +11039,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, "dependencies": { "abbrev": "1" }, @@ -10877,17 +11102,6 @@ "node": ">=8" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -11009,6 +11223,28 @@ "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==" }, + "node_modules/optimism": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.18.0.tgz", + "integrity": "sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ==", + "dependencies": { + "@wry/caches": "^1.0.0", + "@wry/context": "^0.7.0", + "@wry/trie": "^0.4.3", + "tslib": "^2.3.0" + } + }, + "node_modules/optimism/node_modules/@wry/trie": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.4.3.tgz", + "integrity": "sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -11471,19 +11707,50 @@ "node": ">=0.10.0" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "engines": { - "node": ">=8" + "node": "14 || >=16.14" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" + } }, "node_modules/path-type": { "version": "4.0.0", @@ -11888,6 +12155,31 @@ "node": ">=0.10.0" } }, + "node_modules/prebuild-install": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/precinct": { "version": "8.3.1", "resolved": "https://registry.npmjs.org/precinct/-/precinct-8.3.1.tgz", @@ -12091,6 +12383,21 @@ "node": ">= 4" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/protobufjs": { "version": "6.11.3", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", @@ -12265,7 +12572,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -12280,7 +12586,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -12546,6 +12851,23 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "node_modules/rehackt": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/rehackt/-/rehackt-0.0.6.tgz", + "integrity": "sha512-l3WEzkt4ntlEc/IB3/mF6SRgNHA6zfQR7BlGOgBTOmx7IJJXojDASav+NsgXHFjHn+6RmwqsGPFgZpabWpeOdw==", + "peerDependencies": { + "@types/react": "*", + "react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + } + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -12634,6 +12956,14 @@ "node": ">=4" } }, + "node_modules/response-iterator": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/response-iterator/-/response-iterator-0.2.6.tgz", + "integrity": "sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", @@ -12697,6 +13027,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "devOptional": true, "dependencies": { "glob": "^7.1.3" }, @@ -12901,7 +13232,8 @@ "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "devOptional": true }, "node_modules/set-cookie-parser": { "version": "2.6.0", @@ -13010,6 +13342,49 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -13451,13 +13826,14 @@ "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" }, "node_modules/sqlite3": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.4.tgz", - "integrity": "sha512-i0UlWAzPlzX3B5XP2cYuhWQJsTtlMD6obOa1PgeEQ4DHEXUuyJkgv50I3isqZAP5oFc2T8OFvakmDh2W6I+YpA==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", + "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", "hasInstallScript": true, "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.0", - "node-addon-api": "^4.2.0", + "bindings": "^1.5.0", + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.1", "tar": "^6.1.11" }, "optionalDependencies": { @@ -13473,9 +13849,12 @@ } }, "node_modules/sqlite3/node_modules/node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", + "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==", + "engines": { + "node": "^16 || ^18 || >= 20" + } }, "node_modules/ssri": { "version": "8.0.1", @@ -13555,7 +13934,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -13568,11 +13946,37 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, "engines": { "node": ">=12" }, @@ -13584,7 +13988,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -13665,6 +14068,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -13779,6 +14194,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -13804,6 +14227,37 @@ "node": ">=10" } }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tar/node_modules/minipass": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", @@ -14065,6 +14519,17 @@ "node": ">=14.0.0" } }, + "node_modules/ts-invariant": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz", + "integrity": "sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ts-mixer": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.2.tgz", @@ -14147,9 +14612,9 @@ } }, "node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -14193,6 +14658,17 @@ "node": ">=8.0.0" } }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -14299,28 +14775,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typeforce": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", + "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" + }, "node_modules/typeorm": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.11.tgz", - "integrity": "sha512-pzdOyWbVuz/z8Ww6gqvBW4nylsM0KLdUCDExr2gR20/x1khGSVxQkjNV/3YqliG90jrWzrknYbYscpk8yxFJVg==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.20.tgz", + "integrity": "sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q==", "dependencies": { - "@sqltools/formatter": "^1.2.2", - "app-root-path": "^3.0.0", + "@sqltools/formatter": "^1.2.5", + "app-root-path": "^3.1.0", "buffer": "^6.0.3", - "chalk": "^4.1.0", + "chalk": "^4.1.2", "cli-highlight": "^2.1.11", - "date-fns": "^2.28.0", - "debug": "^4.3.3", - "dotenv": "^16.0.0", - "glob": "^7.2.0", - "js-yaml": "^4.1.0", - "mkdirp": "^1.0.4", - "reflect-metadata": "^0.1.13", + "dayjs": "^1.11.9", + "debug": "^4.3.4", + "dotenv": "^16.0.3", + "glob": "^10.3.10", + "mkdirp": "^2.1.3", + "reflect-metadata": "^0.2.1", "sha.js": "^2.4.11", - "tslib": "^2.3.1", - "uuid": "^8.3.2", - "xml2js": "^0.4.23", - "yargs": "^17.3.1" + "tslib": "^2.5.0", + "uuid": "^9.0.0", + "yargs": "^17.6.2" }, "bin": { "typeorm": "cli.js", @@ -14328,7 +14807,7 @@ "typeorm-ts-node-esm": "cli-ts-node-esm.js" }, "engines": { - "node": ">= 12.9.0" + "node": ">=16.13.0" }, "funding": { "url": "https://opencollective.com/typeorm" @@ -14336,13 +14815,13 @@ "peerDependencies": { "@google-cloud/spanner": "^5.18.0", "@sap/hana-client": "^2.12.25", - "better-sqlite3": "^7.1.2 || ^8.0.0", + "better-sqlite3": "^7.1.2 || ^8.0.0 || ^9.0.0", "hdb-pool": "^0.1.6", "ioredis": "^5.0.4", - "mongodb": "^3.6.0", - "mssql": "^7.3.0", - "mysql2": "^2.2.5", - "oracledb": "^5.1.0", + "mongodb": "^5.8.0", + "mssql": "^9.1.1 || ^10.0.1", + "mysql2": "^2.2.5 || ^3.0.1", + "oracledb": "^6.3.0", "pg": "^8.5.1", "pg-native": "^3.0.0", "pg-query-stream": "^4.0.0", @@ -14406,6 +14885,14 @@ } } }, + "node_modules/typeorm/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/typeorm/node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -14429,15 +14916,64 @@ "ieee754": "^1.2.1" } }, - "node_modules/typeorm/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/typeorm/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, "bin": { - "mkdirp": "bin/cmd.js" + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typeorm/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typeorm/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/typeorm/node_modules/reflect-metadata": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", + "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==" + }, + "node_modules/typeorm/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" } }, "node_modules/typescript": { @@ -14669,6 +15205,14 @@ "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" }, + "node_modules/varuint-bitcoin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz", + "integrity": "sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==", + "dependencies": { + "safe-buffer": "^5.1.1" + } + }, "node_modules/vite": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz", @@ -14982,6 +15526,7 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "optional": true, "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } @@ -14989,12 +15534,14 @@ "node_modules/wide-align/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "optional": true }, "node_modules/wide-align/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "optional": true, "engines": { "node": ">=8" } @@ -15003,6 +15550,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "optional": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15136,6 +15684,49 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -15332,6 +15923,19 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zen-observable": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" + }, + "node_modules/zen-observable-ts": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz", + "integrity": "sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==", + "dependencies": { + "zen-observable": "0.8.15" + } } } } diff --git a/package.json b/package.json index e41df955..66e8f30f 100644 --- a/package.json +++ b/package.json @@ -41,19 +41,19 @@ "@multiformats/multiaddr": "^11.0.3", "@rosen-bridge/health-check": "^3.0.1", "@rosen-bridge/minimum-fee": "^0.1.13", - "@rosen-bridge/rosen-extractor": "^3.0.0", - "@rosen-bridge/scanner": "^3.0.0", - "@rosen-bridge/tokens": "^1.0.0", + "@rosen-bridge/rosen-extractor": "^3.4.0", + "@rosen-bridge/scanner": "^3.2.6", + "@rosen-bridge/tokens": "^1.1.0", "@rosen-bridge/tss": "^1.2.0", - "@rosen-bridge/watcher-data-extractor": "^4.0.0", + "@rosen-bridge/watcher-data-extractor": "^5.0.1", "@rosen-bridge/winston-logger": "0.2.1", - "@rosen-chains/abstract-chain": "^3.2.2", - "@rosen-chains/cardano": "^3.2.4", - "@rosen-chains/cardano-blockfrost-network": "^1.2.4", - "@rosen-chains/cardano-koios-network": "^4.2.5", - "@rosen-chains/ergo": "^3.2.4", - "@rosen-chains/ergo-explorer-network": "^3.2.4", - "@rosen-chains/ergo-node-network": "^3.2.4", + "@rosen-chains/abstract-chain": "^5.0.0", + "@rosen-chains/cardano": "^5.0.0", + "@rosen-chains/cardano-blockfrost-network": "^3.0.0", + "@rosen-chains/cardano-koios-network": "^6.0.0", + "@rosen-chains/ergo": "^5.0.0", + "@rosen-chains/ergo-explorer-network": "^5.0.0", + "@rosen-chains/ergo-node-network": "^5.0.0", "@sinclair/typebox": "^0.30.4", "await-semaphore": "^0.1.3", "axios": "^0.27.2", diff --git a/src/db/DatabaseAction.ts b/src/db/DatabaseAction.ts index f1dec9bf..fca3a281 100644 --- a/src/db/DatabaseAction.ts +++ b/src/db/DatabaseAction.ts @@ -748,6 +748,24 @@ class DatabaseAction { }, }); }; + + /** + * @param eventId + * @return commitments that are merged into event trigger + */ + getEventCommitments = (eventId: string): Promise => { + return this.CommitmentRepository.createQueryBuilder('commitment') + .leftJoin( + 'confirmed_event_entity', + 'cee', + 'commitment."eventId" = cee."id"' + ) + .leftJoin('event_trigger_entity', 'ete', 'ete."id" = cee."eventDataId"') + .where(`commitment."eventId"='${eventId}'`) + .andWhere(`commitment."spendTxId"=ete."txId"`) + .orderBy('commitment."spendIndex"', 'ASC') + .getMany(); + }; } export { DatabaseAction }; diff --git a/src/db/migrations/index.ts b/src/db/migrations/index.ts index 0b6a3f77..d1da623e 100644 --- a/src/db/migrations/index.ts +++ b/src/db/migrations/index.ts @@ -4,16 +4,24 @@ import { migration1702281574324 } from './postgres/1702281574324-migration'; import { migration1702281318566 } from './sqlite/1702281318566-migration'; import { migration1703834034720 } from './postgres/1703834034720-migration'; import { migration1703833812339 } from './sqlite/1703833812339-migration'; +import { migration1706610773000 } from './sqlite/1706610773000-migration'; +import { migration1708090570000 } from './sqlite/1708090570000-migration'; +import { migration1706610773001 } from './postgres/1706610773001-migration'; +import { migration1708090570001 } from './postgres/1708090570001-migration'; export default { sqlite: [ migration1700755909353, migration1702281318566, migration1703833812339, + migration1706610773000, + migration1708090570000, ], postgres: [ migration1700756107393, migration1702281574324, migration1703834034720, + migration1706610773001, + migration1708090570001, ], }; diff --git a/src/db/migrations/postgres/1706610773001-migration.ts b/src/db/migrations/postgres/1706610773001-migration.ts new file mode 100644 index 00000000..a37a74a0 --- /dev/null +++ b/src/db/migrations/postgres/1706610773001-migration.ts @@ -0,0 +1,190 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +// manually generated +export class migration1706610773001 implements MigrationInterface { + name = 'migration1706610773001'; + + public async up(queryRunner: QueryRunner): Promise { + // remove EventView + await queryRunner.query( + ` + DELETE FROM "typeorm_metadata" + WHERE "type" = $1 + AND "name" = $2 + AND "schema" = $3 + `, + ['VIEW', 'event', 'public'] + ); + await queryRunner.query(` + DROP VIEW "event" + `); + // remove revenueView + await queryRunner.query( + ` + DELETE FROM "typeorm_metadata" + WHERE "type" = $1 + AND "name" = $2 + AND "schema" = $3 + `, + ['VIEW', 'revenue_view', 'public'] + ); + await queryRunner.query(` + DROP VIEW "revenue_view" + `); + // remove revenueChartView + await queryRunner.query( + ` + DELETE FROM "typeorm_metadata" + WHERE "type" = $1 + AND "name" = $2 + AND "schema" = $3 + `, + ['VIEW', 'revenue_chart', 'public'] + ); + await queryRunner.query(` + DROP VIEW "revenue_chart" + `); + // remove revenue_entity FK + await queryRunner.query(` + ALTER TABLE "revenue_entity" + DROP CONSTRAINT "FK_7eec37fb51bb953bcf777474875" + `); + // remove ConfirmedEventEntity FK + await queryRunner.query(` + ALTER TABLE "confirmed_event_entity" + DROP CONSTRAINT "FK_fada7feaf4c23ad7c0c2cf58ffd" + `); + } + + public async down(queryRunner: QueryRunner): Promise { + // add ConfirmedEventEntity FK + await queryRunner.query(` + ALTER TABLE "confirmed_event_entity" + ADD CONSTRAINT "FK_fada7feaf4c23ad7c0c2cf58ffd" FOREIGN KEY ("eventDataId") REFERENCES "event_trigger_entity"("id") ON DELETE NO ACTION ON UPDATE NO ACTION + `); + // add revenue_entity FK + await queryRunner.query(` + ALTER TABLE "revenue_entity" + ADD CONSTRAINT "FK_7eec37fb51bb953bcf777474875" FOREIGN KEY ("eventDataId") REFERENCES "event_trigger_entity"("id") ON DELETE NO ACTION ON UPDATE NO ACTION + `); + // add revenueChartView + await queryRunner.query(` + CREATE VIEW "revenue_chart" AS + SELECT re."tokenId" AS "tokenId", + re."amount" AS "amount", + re."revenueType" AS "revenueType", + be."timestamp" AS "timestamp", + be."timestamp" / 604800 AS "week_number", + be."month" AS "month", + be."year" AS "year" + FROM "revenue_entity" "re" + INNER JOIN "event_trigger_entity" "ete" ON "ete"."id" = "re"."eventDataId" + INNER JOIN "block_entity" "be" ON "ete"."spendBlock" = "be"."hash" + `); + await queryRunner.query( + ` + INSERT INTO "typeorm_metadata"( + "database", + "schema", + "table", + "type", + "name", + "value" + ) + VALUES (DEFAULT, $1, DEFAULT, $2, $3, $4) + `, + [ + 'public', + 'VIEW', + 'revenue_chart', + 'SELECT re."tokenId" AS "tokenId", re."amount" AS "amount", re."revenueType" AS "revenueType", be."timestamp" AS "timestamp", be."timestamp"/604800 AS "week_number", be."month" AS "month", be."year" AS "year" FROM "revenue_entity" "re" INNER JOIN "event_trigger_entity" "ete" ON "ete"."id" = "re"."eventDataId" INNER JOIN "block_entity" "be" ON "ete"."spendBlock" = "be"."hash"', + ] + ); + // add revenueView + await queryRunner.query(` + CREATE VIEW "revenue_view" AS + SELECT ete."id" AS "id", + ete."spendTxId" AS "rewardTxId", + ete."eventId" AS "eventId", + ete."height" AS "lockHeight", + ete."fromChain" AS "fromChain", + ete."toChain" AS "toChain", + ete."fromAddress" AS "fromAddress", + ete."toAddress" AS "toAddress", + ete."amount" AS "amount", + ete."bridgeFee" AS "bridgeFee", + ete."networkFee" AS "networkFee", + ete."sourceChainTokenId" AS "lockTokenId", + ete."sourceTxId" AS "lockTxId", + be."height" AS "height", + be."timestamp" AS "timestamp" + FROM "event_trigger_entity" "ete" + INNER JOIN "block_entity" "be" ON ete."spendBlock" = be."hash" + `); + await queryRunner.query( + ` + INSERT INTO "typeorm_metadata"( + "database", + "schema", + "table", + "type", + "name", + "value" + ) + VALUES (DEFAULT, $1, DEFAULT, $2, $3, $4) + `, + [ + 'public', + 'VIEW', + 'revenue_view', + 'SELECT ete."id" AS "id", ete."spendTxId" AS "rewardTxId", ete."eventId" AS "eventId", ete."height" AS "lockHeight", ete."fromChain" AS "fromChain", ete."toChain" AS "toChain", ete."fromAddress" AS "fromAddress", ete."toAddress" AS "toAddress", ete."amount" AS "amount", ete."bridgeFee" AS "bridgeFee", ete."networkFee" AS "networkFee", ete."sourceChainTokenId" AS "lockTokenId", ete."sourceTxId" AS "lockTxId", be."height" AS "height", be."timestamp" AS "timestamp" FROM "event_trigger_entity" "ete" INNER JOIN "block_entity" "be" ON ete."spendBlock" = be."hash"', + ] + ); + // add EventView + await queryRunner.query(` + CREATE VIEW "event" AS + SELECT ete."id" AS "id", + ete."eventId" AS "eventId", + ete."txId" AS "txId", + ete."boxId" AS "boxId", + ete."block" AS "block", + ete."height" AS "height", + ete."fromChain" AS "fromChain", + ete."toChain" AS "toChain", + ete."fromAddress" AS "fromAddress", + ete."toAddress" AS "toAddress", + ete."amount" AS "amount", + ete."bridgeFee" AS "bridgeFee", + ete."networkFee" AS "networkFee", + ete."sourceChainTokenId" AS "sourceChainTokenId", + ete."sourceChainHeight" AS "sourceChainHeight", + ete."targetChainTokenId" AS "targetChainTokenId", + ete."sourceTxId" AS "sourceTxId", + ete."spendTxId" AS "spendTxId", + ete."result" AS "result", + ete."paymentTxId" AS "paymentTxId", + cee."status" AS "status" + FROM "event_trigger_entity" "ete" + LEFT JOIN "confirmed_event_entity" "cee" ON ete."id" = cee."eventDataId" + `); + await queryRunner.query( + ` + INSERT INTO "typeorm_metadata"( + "database", + "schema", + "table", + "type", + "name", + "value" + ) + VALUES (DEFAULT, $1, DEFAULT, $2, $3, $4) + `, + [ + 'public', + 'VIEW', + 'event', + 'SELECT ete."id" AS "id", ete."eventId" AS "eventId", ete."txId" AS "txId", ete."boxId" AS "boxId", ete."block" AS "block", ete."height" AS "height", ete."fromChain" AS "fromChain", ete."toChain" AS "toChain", ete."fromAddress" AS "fromAddress", ete."toAddress" AS "toAddress", ete."amount" AS "amount", ete."bridgeFee" AS "bridgeFee", ete."networkFee" AS "networkFee", ete."sourceChainTokenId" AS "sourceChainTokenId", ete."sourceChainHeight" AS "sourceChainHeight", ete."targetChainTokenId" AS "targetChainTokenId", ete."sourceTxId" AS "sourceTxId", ete."spendTxId" AS "spendTxId", ete."result" AS "result", ete."paymentTxId" AS "paymentTxId", cee."status" AS "status" FROM "event_trigger_entity" "ete" LEFT JOIN "confirmed_event_entity" "cee" ON ete."id" = cee."eventDataId"', + ] + ); + } +} diff --git a/src/db/migrations/postgres/1708090570001-migration.ts b/src/db/migrations/postgres/1708090570001-migration.ts new file mode 100644 index 00000000..b08a033e --- /dev/null +++ b/src/db/migrations/postgres/1708090570001-migration.ts @@ -0,0 +1,190 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +// manually generated +export class migration1708090570001 implements MigrationInterface { + name = 'migration1708090570001'; + + public async up(queryRunner: QueryRunner): Promise { + // add ConfirmedEventEntity FK + await queryRunner.query(` + ALTER TABLE "confirmed_event_entity" + ADD CONSTRAINT "FK_fada7feaf4c23ad7c0c2cf58ffd" FOREIGN KEY ("eventDataId") REFERENCES "event_trigger_entity"("id") ON DELETE NO ACTION ON UPDATE NO ACTION + `); + // add revenue_entity FK + await queryRunner.query(` + ALTER TABLE "revenue_entity" + ADD CONSTRAINT "FK_7eec37fb51bb953bcf777474875" FOREIGN KEY ("eventDataId") REFERENCES "event_trigger_entity"("id") ON DELETE NO ACTION ON UPDATE NO ACTION + `); + // add revenueChartView + await queryRunner.query(` + CREATE VIEW "revenue_chart" AS + SELECT re."tokenId" AS "tokenId", + re."amount" AS "amount", + re."revenueType" AS "revenueType", + be."timestamp" AS "timestamp", + be."timestamp" / 604800 AS "week_number", + be."month" AS "month", + be."year" AS "year" + FROM "revenue_entity" "re" + INNER JOIN "event_trigger_entity" "ete" ON "ete"."id" = "re"."eventDataId" + INNER JOIN "block_entity" "be" ON "ete"."spendBlock" = "be"."hash" + `); + await queryRunner.query( + ` + INSERT INTO "typeorm_metadata"( + "database", + "schema", + "table", + "type", + "name", + "value" + ) + VALUES (DEFAULT, $1, DEFAULT, $2, $3, $4) + `, + [ + 'public', + 'VIEW', + 'revenue_chart', + 'SELECT re."tokenId" AS "tokenId", re."amount" AS "amount", re."revenueType" AS "revenueType", be."timestamp" AS "timestamp", be."timestamp"/604800 AS "week_number", be."month" AS "month", be."year" AS "year" FROM "revenue_entity" "re" INNER JOIN "event_trigger_entity" "ete" ON "ete"."id" = "re"."eventDataId" INNER JOIN "block_entity" "be" ON "ete"."spendBlock" = "be"."hash"', + ] + ); + // add revenueView + await queryRunner.query(` + CREATE VIEW "revenue_view" AS + SELECT ete."id" AS "id", + ete."spendTxId" AS "rewardTxId", + ete."eventId" AS "eventId", + ete."height" AS "lockHeight", + ete."fromChain" AS "fromChain", + ete."toChain" AS "toChain", + ete."fromAddress" AS "fromAddress", + ete."toAddress" AS "toAddress", + ete."amount" AS "amount", + ete."bridgeFee" AS "bridgeFee", + ete."networkFee" AS "networkFee", + ete."sourceChainTokenId" AS "lockTokenId", + ete."sourceTxId" AS "lockTxId", + be."height" AS "height", + be."timestamp" AS "timestamp" + FROM "event_trigger_entity" "ete" + INNER JOIN "block_entity" "be" ON ete."spendBlock" = be."hash" + `); + await queryRunner.query( + ` + INSERT INTO "typeorm_metadata"( + "database", + "schema", + "table", + "type", + "name", + "value" + ) + VALUES (DEFAULT, $1, DEFAULT, $2, $3, $4) + `, + [ + 'public', + 'VIEW', + 'revenue_view', + 'SELECT ete."id" AS "id", ete."spendTxId" AS "rewardTxId", ete."eventId" AS "eventId", ete."height" AS "lockHeight", ete."fromChain" AS "fromChain", ete."toChain" AS "toChain", ete."fromAddress" AS "fromAddress", ete."toAddress" AS "toAddress", ete."amount" AS "amount", ete."bridgeFee" AS "bridgeFee", ete."networkFee" AS "networkFee", ete."sourceChainTokenId" AS "lockTokenId", ete."sourceTxId" AS "lockTxId", be."height" AS "height", be."timestamp" AS "timestamp" FROM "event_trigger_entity" "ete" INNER JOIN "block_entity" "be" ON ete."spendBlock" = be."hash"', + ] + ); + // add EventView + await queryRunner.query(` + CREATE VIEW "event" AS + SELECT ete."id" AS "id", + ete."eventId" AS "eventId", + ete."txId" AS "txId", + ete."boxId" AS "boxId", + ete."block" AS "block", + ete."height" AS "height", + ete."fromChain" AS "fromChain", + ete."toChain" AS "toChain", + ete."fromAddress" AS "fromAddress", + ete."toAddress" AS "toAddress", + ete."amount" AS "amount", + ete."bridgeFee" AS "bridgeFee", + ete."networkFee" AS "networkFee", + ete."sourceChainTokenId" AS "sourceChainTokenId", + ete."sourceChainHeight" AS "sourceChainHeight", + ete."targetChainTokenId" AS "targetChainTokenId", + ete."sourceTxId" AS "sourceTxId", + ete."spendTxId" AS "spendTxId", + ete."result" AS "result", + ete."paymentTxId" AS "paymentTxId", + cee."status" AS "status" + FROM "event_trigger_entity" "ete" + LEFT JOIN "confirmed_event_entity" "cee" ON ete."id" = cee."eventDataId" + `); + await queryRunner.query( + ` + INSERT INTO "typeorm_metadata"( + "database", + "schema", + "table", + "type", + "name", + "value" + ) + VALUES (DEFAULT, $1, DEFAULT, $2, $3, $4) + `, + [ + 'public', + 'VIEW', + 'event', + 'SELECT ete."id" AS "id", ete."eventId" AS "eventId", ete."txId" AS "txId", ete."boxId" AS "boxId", ete."block" AS "block", ete."height" AS "height", ete."fromChain" AS "fromChain", ete."toChain" AS "toChain", ete."fromAddress" AS "fromAddress", ete."toAddress" AS "toAddress", ete."amount" AS "amount", ete."bridgeFee" AS "bridgeFee", ete."networkFee" AS "networkFee", ete."sourceChainTokenId" AS "sourceChainTokenId", ete."sourceChainHeight" AS "sourceChainHeight", ete."targetChainTokenId" AS "targetChainTokenId", ete."sourceTxId" AS "sourceTxId", ete."spendTxId" AS "spendTxId", ete."result" AS "result", ete."paymentTxId" AS "paymentTxId", cee."status" AS "status" FROM "event_trigger_entity" "ete" LEFT JOIN "confirmed_event_entity" "cee" ON ete."id" = cee."eventDataId"', + ] + ); + } + + public async down(queryRunner: QueryRunner): Promise { + // remove EventView + await queryRunner.query( + ` + DELETE FROM "typeorm_metadata" + WHERE "type" = $1 + AND "name" = $2 + AND "schema" = $3 + `, + ['VIEW', 'event', 'public'] + ); + await queryRunner.query(` + DROP VIEW "event" + `); + // remove revenueView + await queryRunner.query( + ` + DELETE FROM "typeorm_metadata" + WHERE "type" = $1 + AND "name" = $2 + AND "schema" = $3 + `, + ['VIEW', 'revenue_view', 'public'] + ); + await queryRunner.query(` + DROP VIEW "revenue_view" + `); + // remove revenueChartView + await queryRunner.query( + ` + DELETE FROM "typeorm_metadata" + WHERE "type" = $1 + AND "name" = $2 + AND "schema" = $3 + `, + ['VIEW', 'revenue_chart', 'public'] + ); + await queryRunner.query(` + DROP VIEW "revenue_chart" + `); + // remove revenue_entity FK + await queryRunner.query(` + ALTER TABLE "revenue_entity" + DROP CONSTRAINT "FK_7eec37fb51bb953bcf777474875" + `); + // remove ConfirmedEventEntity FK + await queryRunner.query(` + ALTER TABLE "confirmed_event_entity" + DROP CONSTRAINT "FK_fada7feaf4c23ad7c0c2cf58ffd" + `); + } +} diff --git a/src/db/migrations/sqlite/1706610773000-migration.ts b/src/db/migrations/sqlite/1706610773000-migration.ts new file mode 100644 index 00000000..c63dc764 --- /dev/null +++ b/src/db/migrations/sqlite/1706610773000-migration.ts @@ -0,0 +1,397 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +// manually generated +export class migration1706610773000 implements MigrationInterface { + name = 'migration1706610773000'; + + public async up(queryRunner: QueryRunner): Promise { + // remove EventView + await queryRunner.query( + ` + DELETE FROM "typeorm_metadata" + WHERE "type" = ? + AND "name" = ? + `, + ['VIEW', 'event'] + ); + await queryRunner.query(` + DROP VIEW "event" + `); + // remove revenueView + await queryRunner.query( + ` + DELETE FROM "typeorm_metadata" + WHERE "type" = ? + AND "name" = ? + `, + ['VIEW', 'revenue_view'] + ); + await queryRunner.query(` + DROP VIEW "revenue_view" + `); + // remove revenueChartView + await queryRunner.query( + ` + DELETE FROM "typeorm_metadata" + WHERE "type" = ? + AND "name" = ? + `, + ['VIEW', 'revenue_chart'] + ); + await queryRunner.query(` + DROP VIEW "revenue_chart" + `); + // remove revenue_entity FK + await queryRunner.query(` + CREATE TABLE "temporary_revenue_entity" ( + "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, + "tokenId" varchar NOT NULL, + "amount" bigint NOT NULL, + "txId" varchar NOT NULL, + "revenueType" varchar NOT NULL, + "eventDataId" integer + ) + `); + await queryRunner.query(` + INSERT INTO "temporary_revenue_entity"( + "id", + "tokenId", + "amount", + "txId", + "revenueType", + "eventDataId" + ) + SELECT "id", + "tokenId", + "amount", + "txId", + "revenueType", + "eventDataId" + FROM "revenue_entity" + `); + await queryRunner.query(` + DROP TABLE "revenue_entity" + `); + await queryRunner.query(` + ALTER TABLE "temporary_revenue_entity" + RENAME TO "revenue_entity" + `); + // remove TransactionEntity FK + await queryRunner.query(` + CREATE TABLE "temporary_transaction_entity" ( + "txId" varchar PRIMARY KEY NOT NULL, + "txJson" varchar NOT NULL, + "type" varchar NOT NULL, + "chain" varchar NOT NULL, + "status" varchar NOT NULL, + "lastCheck" integer NOT NULL, + "lastStatusUpdate" varchar, + "failedInSign" boolean NOT NULL, + "signFailedCount" integer NOT NULL, + "eventId" varchar, + "requiredSign" integer NOT NULL + ) + `); + await queryRunner.query(` + INSERT INTO "temporary_transaction_entity"( + "txId", + "txJson", + "type", + "chain", + "status", + "lastCheck", + "lastStatusUpdate", + "failedInSign", + "signFailedCount", + "requiredSign", + "eventId" + ) + SELECT "txId", + "txJson", + "type", + "chain", + "status", + "lastCheck", + "lastStatusUpdate", + "failedInSign", + "signFailedCount", + "requiredSign", + "eventId" + FROM "transaction_entity" + `); + await queryRunner.query(` + DROP TABLE "transaction_entity" + `); + await queryRunner.query(` + ALTER TABLE "temporary_transaction_entity" + RENAME TO "transaction_entity" + `); + // remove ConfirmedEventEntity FK + await queryRunner.query(` + CREATE TABLE "temporary_confirmed_event_entity" ( + "id" varchar PRIMARY KEY NOT NULL, + "status" varchar NOT NULL, + "firstTry" varchar, + "eventDataId" integer, + CONSTRAINT "REL_fada7feaf4c23ad7c0c2cf58ff" UNIQUE ("eventDataId") + ) + `); + await queryRunner.query(` + INSERT INTO "temporary_confirmed_event_entity"( + "id", + "status", + "firstTry", + "eventDataId" + ) + SELECT "id", + "status", + "firstTry", + "eventDataId" + FROM "confirmed_event_entity" + `); + await queryRunner.query(` + DROP TABLE "confirmed_event_entity" + `); + await queryRunner.query(` + ALTER TABLE "temporary_confirmed_event_entity" + RENAME TO "confirmed_event_entity" + `); + } + + public async down(queryRunner: QueryRunner): Promise { + // add ConfirmedEventEntity FK + await queryRunner.query(` + CREATE TABLE "temporary_confirmed_event_entity" ( + "id" varchar PRIMARY KEY NOT NULL, + "status" varchar NOT NULL, + "firstTry" varchar, + "eventDataId" integer, + CONSTRAINT "REL_fada7feaf4c23ad7c0c2cf58ff" UNIQUE ("eventDataId"), + CONSTRAINT "FK_fada7feaf4c23ad7c0c2cf58ffd" FOREIGN KEY ("eventDataId") REFERENCES "event_trigger_entity" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION + ) + `); + await queryRunner.query(` + INSERT INTO "temporary_confirmed_event_entity"( + "id", + "status", + "firstTry", + "eventDataId" + ) + SELECT "id", + "status", + "firstTry", + "eventDataId" + FROM "confirmed_event_entity" + `); + await queryRunner.query(` + DROP TABLE "confirmed_event_entity" + `); + await queryRunner.query(` + ALTER TABLE "temporary_confirmed_event_entity" + RENAME TO "confirmed_event_entity" + `); + // add TransactionEntity FK + await queryRunner.query(` + CREATE TABLE "temporary_transaction_entity" ( + "txId" varchar PRIMARY KEY NOT NULL, + "txJson" varchar NOT NULL, + "type" varchar NOT NULL, + "chain" varchar NOT NULL, + "status" varchar NOT NULL, + "lastCheck" integer NOT NULL, + "lastStatusUpdate" varchar, + "failedInSign" boolean NOT NULL, + "signFailedCount" integer NOT NULL, + "eventId" varchar, + "requiredSign" integer NOT NULL, + CONSTRAINT "FK_392573e185afb94149a20cf87df" FOREIGN KEY ("eventId") REFERENCES "confirmed_event_entity" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION + ) + `); + await queryRunner.query(` + INSERT INTO "temporary_transaction_entity"( + "txId", + "txJson", + "type", + "chain", + "status", + "lastCheck", + "lastStatusUpdate", + "failedInSign", + "signFailedCount", + "requiredSign", + "eventId" + ) + SELECT "txId", + "txJson", + "type", + "chain", + "status", + "lastCheck", + "lastStatusUpdate", + "failedInSign", + "signFailedCount", + "requiredSign", + "eventId" + FROM "transaction_entity" + `); + await queryRunner.query(` + DROP TABLE "transaction_entity" + `); + await queryRunner.query(` + ALTER TABLE "temporary_transaction_entity" + RENAME TO "transaction_entity" + `); + // add revenue_entity FK + await queryRunner.query(` + CREATE TABLE "temporary_revenue_entity" ( + "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, + "tokenId" varchar NOT NULL, + "amount" bigint NOT NULL, + "txId" varchar NOT NULL, + "revenueType" varchar NOT NULL, + "eventDataId" integer, + CONSTRAINT "FK_7eec37fb51bb953bcf777474875" FOREIGN KEY ("eventDataId") REFERENCES "event_trigger_entity" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION + ) + `); + await queryRunner.query(` + INSERT INTO "temporary_revenue_entity"( + "id", + "tokenId", + "amount", + "txId", + "revenueType", + "eventDataId" + ) + SELECT "id", + "tokenId", + "amount", + "txId", + "revenueType", + "eventDataId" + FROM "revenue_entity" + `); + await queryRunner.query(` + DROP TABLE "revenue_entity" + `); + await queryRunner.query(` + ALTER TABLE "temporary_revenue_entity" + RENAME TO "revenue_entity" + `); + // add revenueChartView + await queryRunner.query(` + CREATE VIEW "revenue_chart" AS + SELECT re."tokenId" AS "tokenId", + re."amount" AS "amount", + re."revenueType" AS "revenueType", + be."timestamp" AS "timestamp", + be."timestamp" / 604800 AS "week_number", + be."month" AS "month", + be."year" AS "year" + FROM "revenue_entity" "re" + INNER JOIN "event_trigger_entity" "ete" ON "ete"."id" = "re"."eventDataId" + INNER JOIN "block_entity" "be" ON "ete"."spendBlock" = "be"."hash" + `); + await queryRunner.query( + ` + INSERT INTO "typeorm_metadata"( + "database", + "schema", + "table", + "type", + "name", + "value" + ) + VALUES (NULL, NULL, NULL, ?, ?, ?) + `, + [ + 'VIEW', + 'revenue_chart', + 'SELECT re."tokenId" AS "tokenId", re."amount" AS "amount", re."revenueType" AS "revenueType", be."timestamp" AS "timestamp", be."timestamp"/604800 AS "week_number", be."month" AS "month", be."year" AS "year" FROM "revenue_entity" "re" INNER JOIN "event_trigger_entity" "ete" ON "ete"."id" = "re"."eventDataId" INNER JOIN "block_entity" "be" ON "ete"."spendBlock" = "be"."hash"', + ] + ); + // add revenueView + await queryRunner.query(` + CREATE VIEW "revenue_view" AS + SELECT ete."id" AS "id", + ete."spendTxId" AS "rewardTxId", + ete."eventId" AS "eventId", + ete."height" AS "lockHeight", + ete."fromChain" AS "fromChain", + ete."toChain" AS "toChain", + ete."fromAddress" AS "fromAddress", + ete."toAddress" AS "toAddress", + ete."amount" AS "amount", + ete."bridgeFee" AS "bridgeFee", + ete."networkFee" AS "networkFee", + ete."sourceChainTokenId" AS "lockTokenId", + ete."sourceTxId" AS "lockTxId", + be."height" AS "height", + be."timestamp" AS "timestamp" + FROM "event_trigger_entity" "ete" + INNER JOIN "block_entity" "be" ON ete."spendBlock" = be."hash" + `); + await queryRunner.query( + ` + INSERT INTO "typeorm_metadata"( + "database", + "schema", + "table", + "type", + "name", + "value" + ) + VALUES (NULL, NULL, NULL, ?, ?, ?) + `, + [ + 'VIEW', + 'revenue_view', + 'SELECT ete."id" AS "id", ete."spendTxId" AS "rewardTxId", ete."eventId" AS "eventId", ete."height" AS "lockHeight", ete."fromChain" AS "fromChain", ete."toChain" AS "toChain", ete."fromAddress" AS "fromAddress", ete."toAddress" AS "toAddress", ete."amount" AS "amount", ete."bridgeFee" AS "bridgeFee", ete."networkFee" AS "networkFee", ete."sourceChainTokenId" AS "lockTokenId", ete."sourceTxId" AS "lockTxId", be."height" AS "height", be."timestamp" AS "timestamp" FROM "event_trigger_entity" "ete" INNER JOIN "block_entity" "be" ON ete."spendBlock" = be."hash"', + ] + ); + // add EventView + await queryRunner.query(` + CREATE VIEW "event" AS + SELECT ete."id" AS "id", + ete."eventId" AS "eventId", + ete."txId" AS "txId", + ete."boxId" AS "boxId", + ete."block" AS "block", + ete."height" AS "height", + ete."fromChain" AS "fromChain", + ete."toChain" AS "toChain", + ete."fromAddress" AS "fromAddress", + ete."toAddress" AS "toAddress", + ete."amount" AS "amount", + ete."bridgeFee" AS "bridgeFee", + ete."networkFee" AS "networkFee", + ete."sourceChainTokenId" AS "sourceChainTokenId", + ete."sourceChainHeight" AS "sourceChainHeight", + ete."targetChainTokenId" AS "targetChainTokenId", + ete."sourceTxId" AS "sourceTxId", + ete."spendTxId" AS "spendTxId", + ete."result" AS "result", + ete."paymentTxId" AS "paymentTxId", + cee."status" AS "status" + FROM "event_trigger_entity" "ete" + LEFT JOIN "confirmed_event_entity" "cee" ON ete."id" = cee."eventDataId" + `); + await queryRunner.query( + ` + INSERT INTO "typeorm_metadata"( + "database", + "schema", + "table", + "type", + "name", + "value" + ) + VALUES (NULL, NULL, NULL, ?, ?, ?) + `, + [ + 'VIEW', + 'event', + 'SELECT ete."id" AS "id", ete."eventId" AS "eventId", ete."txId" AS "txId", ete."boxId" AS "boxId", ete."block" AS "block", ete."height" AS "height", ete."fromChain" AS "fromChain", ete."toChain" AS "toChain", ete."fromAddress" AS "fromAddress", ete."toAddress" AS "toAddress", ete."amount" AS "amount", ete."bridgeFee" AS "bridgeFee", ete."networkFee" AS "networkFee", ete."sourceChainTokenId" AS "sourceChainTokenId", ete."sourceChainHeight" AS "sourceChainHeight", ete."targetChainTokenId" AS "targetChainTokenId", ete."sourceTxId" AS "sourceTxId", ete."spendTxId" AS "spendTxId", ete."result" AS "result", ete."paymentTxId" AS "paymentTxId", cee."status" AS "status" FROM "event_trigger_entity" "ete" LEFT JOIN "confirmed_event_entity" "cee" ON ete."id" = cee."eventDataId"', + ] + ); + } +} diff --git a/src/db/migrations/sqlite/1708090570000-migration.ts b/src/db/migrations/sqlite/1708090570000-migration.ts new file mode 100644 index 00000000..fa238886 --- /dev/null +++ b/src/db/migrations/sqlite/1708090570000-migration.ts @@ -0,0 +1,397 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +// manually generated +export class migration1708090570000 implements MigrationInterface { + name = 'migration1708090570000'; + + public async up(queryRunner: QueryRunner): Promise { + // add ConfirmedEventEntity FK + await queryRunner.query(` + CREATE TABLE "temporary_confirmed_event_entity" ( + "id" varchar PRIMARY KEY NOT NULL, + "status" varchar NOT NULL, + "firstTry" varchar, + "eventDataId" integer, + CONSTRAINT "REL_fada7feaf4c23ad7c0c2cf58ff" UNIQUE ("eventDataId"), + CONSTRAINT "FK_fada7feaf4c23ad7c0c2cf58ffd" FOREIGN KEY ("eventDataId") REFERENCES "event_trigger_entity" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION + ) + `); + await queryRunner.query(` + INSERT INTO "temporary_confirmed_event_entity"( + "id", + "status", + "firstTry", + "eventDataId" + ) + SELECT "id", + "status", + "firstTry", + "eventDataId" + FROM "confirmed_event_entity" + `); + await queryRunner.query(` + DROP TABLE "confirmed_event_entity" + `); + await queryRunner.query(` + ALTER TABLE "temporary_confirmed_event_entity" + RENAME TO "confirmed_event_entity" + `); + // add TransactionEntity FK + await queryRunner.query(` + CREATE TABLE "temporary_transaction_entity" ( + "txId" varchar PRIMARY KEY NOT NULL, + "txJson" varchar NOT NULL, + "type" varchar NOT NULL, + "chain" varchar NOT NULL, + "status" varchar NOT NULL, + "lastCheck" integer NOT NULL, + "lastStatusUpdate" varchar, + "failedInSign" boolean NOT NULL, + "signFailedCount" integer NOT NULL, + "eventId" varchar, + "requiredSign" integer NOT NULL, + CONSTRAINT "FK_392573e185afb94149a20cf87df" FOREIGN KEY ("eventId") REFERENCES "confirmed_event_entity" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION + ) + `); + await queryRunner.query(` + INSERT INTO "temporary_transaction_entity"( + "txId", + "txJson", + "type", + "chain", + "status", + "lastCheck", + "lastStatusUpdate", + "failedInSign", + "signFailedCount", + "requiredSign", + "eventId" + ) + SELECT "txId", + "txJson", + "type", + "chain", + "status", + "lastCheck", + "lastStatusUpdate", + "failedInSign", + "signFailedCount", + "requiredSign", + "eventId" + FROM "transaction_entity" + `); + await queryRunner.query(` + DROP TABLE "transaction_entity" + `); + await queryRunner.query(` + ALTER TABLE "temporary_transaction_entity" + RENAME TO "transaction_entity" + `); + // add revenue_entity FK + await queryRunner.query(` + CREATE TABLE "temporary_revenue_entity" ( + "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, + "tokenId" varchar NOT NULL, + "amount" bigint NOT NULL, + "txId" varchar NOT NULL, + "revenueType" varchar NOT NULL, + "eventDataId" integer, + CONSTRAINT "FK_7eec37fb51bb953bcf777474875" FOREIGN KEY ("eventDataId") REFERENCES "event_trigger_entity" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION + ) + `); + await queryRunner.query(` + INSERT INTO "temporary_revenue_entity"( + "id", + "tokenId", + "amount", + "txId", + "revenueType", + "eventDataId" + ) + SELECT "id", + "tokenId", + "amount", + "txId", + "revenueType", + "eventDataId" + FROM "revenue_entity" + `); + await queryRunner.query(` + DROP TABLE "revenue_entity" + `); + await queryRunner.query(` + ALTER TABLE "temporary_revenue_entity" + RENAME TO "revenue_entity" + `); + // add revenueChartView + await queryRunner.query(` + CREATE VIEW "revenue_chart" AS + SELECT re."tokenId" AS "tokenId", + re."amount" AS "amount", + re."revenueType" AS "revenueType", + be."timestamp" AS "timestamp", + be."timestamp" / 604800 AS "week_number", + be."month" AS "month", + be."year" AS "year" + FROM "revenue_entity" "re" + INNER JOIN "event_trigger_entity" "ete" ON "ete"."id" = "re"."eventDataId" + INNER JOIN "block_entity" "be" ON "ete"."spendBlock" = "be"."hash" + `); + await queryRunner.query( + ` + INSERT INTO "typeorm_metadata"( + "database", + "schema", + "table", + "type", + "name", + "value" + ) + VALUES (NULL, NULL, NULL, ?, ?, ?) + `, + [ + 'VIEW', + 'revenue_chart', + 'SELECT re."tokenId" AS "tokenId", re."amount" AS "amount", re."revenueType" AS "revenueType", be."timestamp" AS "timestamp", be."timestamp"/604800 AS "week_number", be."month" AS "month", be."year" AS "year" FROM "revenue_entity" "re" INNER JOIN "event_trigger_entity" "ete" ON "ete"."id" = "re"."eventDataId" INNER JOIN "block_entity" "be" ON "ete"."spendBlock" = "be"."hash"', + ] + ); + // add revenueView + await queryRunner.query(` + CREATE VIEW "revenue_view" AS + SELECT ete."id" AS "id", + ete."spendTxId" AS "rewardTxId", + ete."eventId" AS "eventId", + ete."height" AS "lockHeight", + ete."fromChain" AS "fromChain", + ete."toChain" AS "toChain", + ete."fromAddress" AS "fromAddress", + ete."toAddress" AS "toAddress", + ete."amount" AS "amount", + ete."bridgeFee" AS "bridgeFee", + ete."networkFee" AS "networkFee", + ete."sourceChainTokenId" AS "lockTokenId", + ete."sourceTxId" AS "lockTxId", + be."height" AS "height", + be."timestamp" AS "timestamp" + FROM "event_trigger_entity" "ete" + INNER JOIN "block_entity" "be" ON ete."spendBlock" = be."hash" + `); + await queryRunner.query( + ` + INSERT INTO "typeorm_metadata"( + "database", + "schema", + "table", + "type", + "name", + "value" + ) + VALUES (NULL, NULL, NULL, ?, ?, ?) + `, + [ + 'VIEW', + 'revenue_view', + 'SELECT ete."id" AS "id", ete."spendTxId" AS "rewardTxId", ete."eventId" AS "eventId", ete."height" AS "lockHeight", ete."fromChain" AS "fromChain", ete."toChain" AS "toChain", ete."fromAddress" AS "fromAddress", ete."toAddress" AS "toAddress", ete."amount" AS "amount", ete."bridgeFee" AS "bridgeFee", ete."networkFee" AS "networkFee", ete."sourceChainTokenId" AS "lockTokenId", ete."sourceTxId" AS "lockTxId", be."height" AS "height", be."timestamp" AS "timestamp" FROM "event_trigger_entity" "ete" INNER JOIN "block_entity" "be" ON ete."spendBlock" = be."hash"', + ] + ); + // add EventView + await queryRunner.query(` + CREATE VIEW "event" AS + SELECT ete."id" AS "id", + ete."eventId" AS "eventId", + ete."txId" AS "txId", + ete."boxId" AS "boxId", + ete."block" AS "block", + ete."height" AS "height", + ete."fromChain" AS "fromChain", + ete."toChain" AS "toChain", + ete."fromAddress" AS "fromAddress", + ete."toAddress" AS "toAddress", + ete."amount" AS "amount", + ete."bridgeFee" AS "bridgeFee", + ete."networkFee" AS "networkFee", + ete."sourceChainTokenId" AS "sourceChainTokenId", + ete."sourceChainHeight" AS "sourceChainHeight", + ete."targetChainTokenId" AS "targetChainTokenId", + ete."sourceTxId" AS "sourceTxId", + ete."spendTxId" AS "spendTxId", + ete."result" AS "result", + ete."paymentTxId" AS "paymentTxId", + cee."status" AS "status" + FROM "event_trigger_entity" "ete" + LEFT JOIN "confirmed_event_entity" "cee" ON ete."id" = cee."eventDataId" + `); + await queryRunner.query( + ` + INSERT INTO "typeorm_metadata"( + "database", + "schema", + "table", + "type", + "name", + "value" + ) + VALUES (NULL, NULL, NULL, ?, ?, ?) + `, + [ + 'VIEW', + 'event', + 'SELECT ete."id" AS "id", ete."eventId" AS "eventId", ete."txId" AS "txId", ete."boxId" AS "boxId", ete."block" AS "block", ete."height" AS "height", ete."fromChain" AS "fromChain", ete."toChain" AS "toChain", ete."fromAddress" AS "fromAddress", ete."toAddress" AS "toAddress", ete."amount" AS "amount", ete."bridgeFee" AS "bridgeFee", ete."networkFee" AS "networkFee", ete."sourceChainTokenId" AS "sourceChainTokenId", ete."sourceChainHeight" AS "sourceChainHeight", ete."targetChainTokenId" AS "targetChainTokenId", ete."sourceTxId" AS "sourceTxId", ete."spendTxId" AS "spendTxId", ete."result" AS "result", ete."paymentTxId" AS "paymentTxId", cee."status" AS "status" FROM "event_trigger_entity" "ete" LEFT JOIN "confirmed_event_entity" "cee" ON ete."id" = cee."eventDataId"', + ] + ); + } + + public async down(queryRunner: QueryRunner): Promise { + // remove EventView + await queryRunner.query( + ` + DELETE FROM "typeorm_metadata" + WHERE "type" = ? + AND "name" = ? + `, + ['VIEW', 'event'] + ); + await queryRunner.query(` + DROP VIEW "event" + `); + // remove revenueView + await queryRunner.query( + ` + DELETE FROM "typeorm_metadata" + WHERE "type" = ? + AND "name" = ? + `, + ['VIEW', 'revenue_view'] + ); + await queryRunner.query(` + DROP VIEW "revenue_view" + `); + // remove revenueChartView + await queryRunner.query( + ` + DELETE FROM "typeorm_metadata" + WHERE "type" = ? + AND "name" = ? + `, + ['VIEW', 'revenue_chart'] + ); + await queryRunner.query(` + DROP VIEW "revenue_chart" + `); + // remove revenue_entity FK + await queryRunner.query(` + CREATE TABLE "temporary_revenue_entity" ( + "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, + "tokenId" varchar NOT NULL, + "amount" bigint NOT NULL, + "txId" varchar NOT NULL, + "revenueType" varchar NOT NULL, + "eventDataId" integer + ) + `); + await queryRunner.query(` + INSERT INTO "temporary_revenue_entity"( + "id", + "tokenId", + "amount", + "txId", + "revenueType", + "eventDataId" + ) + SELECT "id", + "tokenId", + "amount", + "txId", + "revenueType", + "eventDataId" + FROM "revenue_entity" + `); + await queryRunner.query(` + DROP TABLE "revenue_entity" + `); + await queryRunner.query(` + ALTER TABLE "temporary_revenue_entity" + RENAME TO "revenue_entity" + `); + // remove TransactionEntity FK + await queryRunner.query(` + CREATE TABLE "temporary_transaction_entity" ( + "txId" varchar PRIMARY KEY NOT NULL, + "txJson" varchar NOT NULL, + "type" varchar NOT NULL, + "chain" varchar NOT NULL, + "status" varchar NOT NULL, + "lastCheck" integer NOT NULL, + "lastStatusUpdate" varchar, + "failedInSign" boolean NOT NULL, + "signFailedCount" integer NOT NULL, + "eventId" varchar, + "requiredSign" integer NOT NULL + ) + `); + await queryRunner.query(` + INSERT INTO "temporary_transaction_entity"( + "txId", + "txJson", + "type", + "chain", + "status", + "lastCheck", + "lastStatusUpdate", + "failedInSign", + "signFailedCount", + "requiredSign", + "eventId" + ) + SELECT "txId", + "txJson", + "type", + "chain", + "status", + "lastCheck", + "lastStatusUpdate", + "failedInSign", + "signFailedCount", + "requiredSign", + "eventId" + FROM "transaction_entity" + `); + await queryRunner.query(` + DROP TABLE "transaction_entity" + `); + await queryRunner.query(` + ALTER TABLE "temporary_transaction_entity" + RENAME TO "transaction_entity" + `); + // remove ConfirmedEventEntity FK + await queryRunner.query(` + CREATE TABLE "temporary_confirmed_event_entity" ( + "id" varchar PRIMARY KEY NOT NULL, + "status" varchar NOT NULL, + "firstTry" varchar, + "eventDataId" integer, + CONSTRAINT "REL_fada7feaf4c23ad7c0c2cf58ff" UNIQUE ("eventDataId") + ) + `); + await queryRunner.query(` + INSERT INTO "temporary_confirmed_event_entity"( + "id", + "status", + "firstTry", + "eventDataId" + ) + SELECT "id", + "status", + "firstTry", + "eventDataId" + FROM "confirmed_event_entity" + `); + await queryRunner.query(` + DROP TABLE "confirmed_event_entity" + `); + await queryRunner.query(` + ALTER TABLE "temporary_confirmed_event_entity" + RENAME TO "confirmed_event_entity" + `); + } +} diff --git a/src/event/EventBoxes.ts b/src/event/EventBoxes.ts index 60ca82bb..e80ef0af 100644 --- a/src/event/EventBoxes.ts +++ b/src/event/EventBoxes.ts @@ -3,6 +3,7 @@ import { CommitmentEntity } from '@rosen-bridge/watcher-data-extractor'; import EventSerializer from './EventSerializer'; import { uniqBy } from 'lodash-es'; import { DatabaseAction } from '../db/DatabaseAction'; +import { blake2b } from 'blakejs'; class EventBoxes { /** @@ -24,11 +25,13 @@ class EventBoxes { * aren't merged into it, while omitting any duplicate commitments * @param event the event trigger model * @param eventRwtCount amount RWT token per watcher for the event + * @param eventWIDs WID of commitments that are merged into the event trigger * @returns the serialized string (hex format) of valid commitment boxes */ static getEventValidCommitments = async ( event: EventTrigger, - eventRwtCount: bigint + eventRwtCount: bigint, + eventWIDs: string[] ): Promise => { const eventId = EventSerializer.getId(event); const eventData = (await DatabaseAction.getInstance().getEventById(eventId)) @@ -45,7 +48,7 @@ class EventBoxes { return uniqBy(commitments, 'WID') .filter( (commitment: CommitmentEntity) => - !event.WIDs.includes(commitment.WID) && + !eventWIDs.includes(commitment.WID) && commitment.rwtCount && BigInt(commitment.rwtCount) === eventRwtCount ) @@ -53,6 +56,25 @@ class EventBoxes { Buffer.from(commitment.boxSerialized, 'base64').toString('hex') ); }; + + /** + * gets WID of commitment boxes that are merged into the event trigger + * @param event + * @returns + */ + static getEventWIDs = async (event: EventTrigger): Promise => { + const eventId = EventSerializer.getId(event); + const eventWIDs = ( + await DatabaseAction.getInstance().getEventCommitments(eventId) + ).map((commitment) => commitment.WID); + const WIDsHash = Buffer.from( + blake2b(Buffer.from(eventWIDs.join(''), 'hex'), undefined, 32) + ).toString('hex'); + + if (WIDsHash !== event.WIDsHash || eventWIDs.length !== event.WIDsCount) + throw Error(`Failed to fetch event [${eventId}] WIDs info`); + return eventWIDs; + }; } export default EventBoxes; diff --git a/src/event/EventOrder.ts b/src/event/EventOrder.ts index 0fbbb579..27fd4a9b 100644 --- a/src/event/EventOrder.ts +++ b/src/event/EventOrder.ts @@ -21,10 +21,12 @@ class EventOrder { * generates user payment order for an event * @param event the event trigger * @param feeConfig minimum fee and rsn ratio config for the event + * @param eventWIDs WID of commitments that are merged into the event trigger */ static createEventPaymentOrder = async ( event: EventTrigger, - feeConfig: Fee + feeConfig: Fee, + eventWIDs: string[] ): Promise => { const targetChain = ChainHandler.getInstance().getChain(event.toChain); const chainMinTransfer = targetChain.getMinimumNativeToken(); @@ -37,15 +39,15 @@ class EventOrder { // get event and commitment boxes const eventBox = await EventBoxes.getEventBox(event); - const rwtCount = - ergoChain.getBoxRWT(eventBox) / BigInt(event.WIDs.length); + const rwtCount = ergoChain.getBoxRWT(eventBox) / BigInt(event.WIDsCount); const permitValue = ergoChain.getSerializedBoxInfo(eventBox).assets.nativeToken / - BigInt(event.WIDs.length); + BigInt(event.WIDsCount); const commitmentBoxes = await EventBoxes.getEventValidCommitments( event, - rwtCount + rwtCount, + eventWIDs ); // generate reward order @@ -60,7 +62,8 @@ class EventOrder { '', ChainHandler.getInstance().getChain(event.fromChain).getRWTToken(), rwtCount, - permitValue + permitValue, + eventWIDs ); order.push(...rewardOrder); } @@ -81,24 +84,27 @@ class EventOrder { * @param event the event trigger * @param feeConfig minimum fee and rsn ratio config for the event * @param paymentTxId the payment transaction of the event + * @param eventWIDs WID of commitments that are merged into the event trigger */ static createEventRewardOrder = async ( event: EventTrigger, feeConfig: Fee, - paymentTxId: string + paymentTxId: string, + eventWIDs: string[] ): Promise => { const ergoChain = ChainHandler.getInstance().getErgoChain(); // get event and commitment boxes const eventBox = await EventBoxes.getEventBox(event); - const rwtCount = ergoChain.getBoxRWT(eventBox) / BigInt(event.WIDs.length); + const rwtCount = ergoChain.getBoxRWT(eventBox) / BigInt(event.WIDsCount); const permitValue = ergoChain.getSerializedBoxInfo(eventBox).assets.nativeToken / - BigInt(event.WIDs.length); + BigInt(event.WIDsCount); const commitmentBoxes = await EventBoxes.getEventValidCommitments( event, - rwtCount + rwtCount, + eventWIDs ); // generate reward order @@ -112,7 +118,8 @@ class EventOrder { paymentTxId, ChainHandler.getInstance().getChain(event.fromChain).getRWTToken(), rwtCount, - permitValue + permitValue, + eventWIDs ); }; @@ -176,6 +183,7 @@ class EventOrder { * @param rwtTokenId RWT token id of fromChain * @param rwtCount amount RWT token per watcher * @param permitValue erg amount to use in permit box per watcher + * @param eventWIDs WID of commitments that are merged into the event trigger */ static eventRewardOrder = ( event: EventTrigger, @@ -184,10 +192,11 @@ class EventOrder { paymentTxId: string, rwtTokenId: string, rwtCount: bigint, - permitValue: bigint + permitValue: bigint, + eventWIDs: string[] ): PaymentOrder => { const outPermits: PermitBoxValue[] = [ - ...event.WIDs.map((wid) => ({ wid, boxValue: permitValue })), + ...eventWIDs.map((wid) => ({ wid, boxValue: permitValue })), ...unmergedWIDs, ]; const bridgeFee = Utils.maxBigint( diff --git a/src/event/EventProcessor.ts b/src/event/EventProcessor.ts index f85eb2d2..2348d3f5 100644 --- a/src/event/EventProcessor.ts +++ b/src/event/EventProcessor.ts @@ -172,6 +172,7 @@ class EventProcessor { const targetChain = ChainHandler.getInstance().getChain(event.toChain); const extra: any[] = []; + const eventWIDs: string[] = []; // add reward order if target chain is ergo if (event.toChain === ERGO_CHAIN) { @@ -179,12 +180,13 @@ class EventProcessor { // get event and commitment boxes const eventBox = await EventBoxes.getEventBox(event); - const rwtCount = - ergoChain.getBoxRWT(eventBox) / BigInt(event.WIDs.length); + const rwtCount = ergoChain.getBoxRWT(eventBox) / BigInt(event.WIDsCount); + eventWIDs.push(...(await EventBoxes.getEventWIDs(event))); const commitmentBoxes = await EventBoxes.getEventValidCommitments( event, - rwtCount + rwtCount, + eventWIDs ); const guardsConfigBox = await ergoChain.getGuardsConfigBox( rosenConfig.guardNFT, @@ -196,7 +198,11 @@ class EventProcessor { } // add payment order - const order = await EventOrder.createEventPaymentOrder(event, feeConfig); + const order = await EventOrder.createEventPaymentOrder( + event, + feeConfig, + eventWIDs + ); // get unsigned transactions in target chain const unsignedAgreementTransactions = ( @@ -301,11 +307,13 @@ class EventProcessor { // get event and commitment boxes const eventBox = await EventBoxes.getEventBox(event); - const rwtCount = ergoChain.getBoxRWT(eventBox) / BigInt(event.WIDs.length); + const rwtCount = ergoChain.getBoxRWT(eventBox) / BigInt(event.WIDsCount); + const eventWIDs = await EventBoxes.getEventWIDs(event); const commitmentBoxes = await EventBoxes.getEventValidCommitments( event, - rwtCount + rwtCount, + eventWIDs ); const guardsConfigBox = await ergoChain.getGuardsConfigBox( rosenConfig.guardNFT, @@ -316,7 +324,8 @@ class EventProcessor { const order = await EventOrder.createEventRewardOrder( event, feeConfig, - paymentTxId + paymentTxId, + eventWIDs ); // get unsigned transactions in target chain diff --git a/src/event/EventSerializer.ts b/src/event/EventSerializer.ts index 766d4cc8..50619071 100644 --- a/src/event/EventSerializer.ts +++ b/src/event/EventSerializer.ts @@ -34,7 +34,8 @@ class EventSerializer { sourceTxId: eventEntity.sourceTxId, sourceChainHeight: eventEntity.sourceChainHeight, sourceBlockId: eventEntity.sourceBlockId, - WIDs: eventEntity.WIDs.split(',').filter((wid) => wid !== ''), + WIDsHash: eventEntity.WIDsHash, + WIDsCount: eventEntity.WIDsCount, }; }; diff --git a/src/verification/TransactionVerifier.ts b/src/verification/TransactionVerifier.ts index 296c6732..842a62dc 100644 --- a/src/verification/TransactionVerifier.ts +++ b/src/verification/TransactionVerifier.ts @@ -69,23 +69,27 @@ class TransactionVerifier { event: EventTrigger ): Promise => { const chain = ChainHandler.getInstance().getChain(tx.network); + const dbAction = DatabaseAction.getInstance(); // verify tx order const feeConfig = await MinimumFee.getEventFeeConfig(event); const txOrder = chain.extractTransactionOrder(tx); + const eventWIDs = (await dbAction.getEventCommitments(tx.eventId)).map( + (commitment) => commitment.WID + ); let expectedOrder: PaymentOrder = []; if (tx.txType === TransactionType.payment) expectedOrder = await EventOrder.createEventPaymentOrder( event, - feeConfig + feeConfig, + eventWIDs ); else { // get event payment transaction - const eventTxs = - await DatabaseAction.getInstance().getEventValidTxsByType( - tx.eventId, - TransactionType.payment - ); + const eventTxs = await dbAction.getEventValidTxsByType( + tx.eventId, + TransactionType.payment + ); if (eventTxs.length !== 1) throw new ImpossibleBehavior( `Received tx [${tx.txId}] for reward distribution of event [${tx.eventId}] but no payment tx found for the event in database` @@ -94,7 +98,8 @@ class TransactionVerifier { expectedOrder = await EventOrder.createEventRewardOrder( event, feeConfig, - paymentTxId + paymentTxId, + eventWIDs ); } if (!isEqual(txOrder, expectedOrder)) { diff --git a/tests/agreement/TxAgreement.spec.ts b/tests/agreement/TxAgreement.spec.ts index 20123994..2bdefa93 100644 --- a/tests/agreement/TxAgreement.spec.ts +++ b/tests/agreement/TxAgreement.spec.ts @@ -1102,7 +1102,7 @@ describe('TxAgreement', () => { it('should broadcast approval message for payment tx when sufficient number of guards agreed', async () => { // mock testdata const type = AgreementMessageTypes.response; - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const paymentTx = mockPaymentTransaction( TransactionType.payment, @@ -1316,7 +1316,7 @@ describe('TxAgreement', () => { it("should do nothing when a signature doesn't verify", async () => { // mock testdata const type = AgreementMessageTypes.approval; - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const paymentTx = mockPaymentTransaction( TransactionType.payment, @@ -1388,7 +1388,7 @@ describe('TxAgreement', () => { it("should do nothing when number of signsatures doesn't meet required value", async () => { // mock testdata const type = AgreementMessageTypes.approval; - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const paymentTx = mockPaymentTransaction( TransactionType.payment, @@ -1458,7 +1458,7 @@ describe('TxAgreement', () => { it('should set tx as approved when required number of signs met for a payment tx', async () => { // mock testdata const type = AgreementMessageTypes.approval; - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const paymentTx = mockPaymentTransaction( TransactionType.payment, @@ -1621,7 +1621,7 @@ describe('TxAgreement', () => { it('should set tx as approved when transaction not found but verified', async () => { // mock testdata const type = AgreementMessageTypes.approval; - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const paymentTx = mockPaymentTransaction( TransactionType.payment, @@ -1705,7 +1705,7 @@ describe('TxAgreement', () => { it("should do nothing when transaction not found and doesn't verified", async () => { // mock testdata const type = AgreementMessageTypes.approval; - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const paymentTx = mockPaymentTransaction( TransactionType.payment, @@ -1780,7 +1780,7 @@ describe('TxAgreement', () => { it('should do nothing when another tx is in memory for the event', async () => { // mock testdata const type = AgreementMessageTypes.approval; - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const paymentTx = mockPaymentTransaction( TransactionType.payment, @@ -1865,7 +1865,7 @@ describe('TxAgreement', () => { */ it('should NOT update event status when tx is already in database', async () => { // mock testdata - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const paymentTx = mockPaymentTransaction( TransactionType.payment, @@ -1916,7 +1916,7 @@ describe('TxAgreement', () => { */ it('should update event status from pending-payment to in-payment', async () => { // mock testdata - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const paymentTx = mockPaymentTransaction( TransactionType.payment, @@ -1957,7 +1957,7 @@ describe('TxAgreement', () => { */ it('should update event status from pending-reward to in-reward', async () => { // mock testdata - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const paymentTx = mockPaymentTransaction( TransactionType.reward, diff --git a/tests/coldStorage/ColdStorage.spec.ts b/tests/coldStorage/ColdStorage.spec.ts index 085e947c..92abe51f 100644 --- a/tests/coldStorage/ColdStorage.spec.ts +++ b/tests/coldStorage/ColdStorage.spec.ts @@ -323,7 +323,7 @@ describe('ColdStorage', () => { */ it(`should not generate transaction when token is required in some waiting events`, async () => { // mock an event and insert mocked event into db as paymentWaiting - const event = mockTokenPaymentFromErgoEvent(); + const event = mockTokenPaymentFromErgoEvent().event; await DatabaseActionMock.insertEventRecord( event, EventStatus.paymentWaiting @@ -395,7 +395,7 @@ describe('ColdStorage', () => { */ it(`should ignore waiting events required tokens when processing tokens`, async () => { // mock an event and insert mocked event into db as paymentWaiting - const event = mockTokenPaymentFromErgoEvent(); + const event = mockTokenPaymentFromErgoEvent().event; await DatabaseActionMock.insertEventRecord( event, EventStatus.paymentWaiting diff --git a/tests/db/DatabaseAction.spec.ts b/tests/db/DatabaseAction.spec.ts index 59443815..b1b7c2d9 100644 --- a/tests/db/DatabaseAction.spec.ts +++ b/tests/db/DatabaseAction.spec.ts @@ -53,7 +53,7 @@ describe('DatabaseActions', () => { it('should return completed events successfully', async () => { // insert 6 mocked events // completed event - const completedEvent = EventTestData.mockEventTrigger(); + const completedEvent = EventTestData.mockEventTrigger().event; await DatabaseHandlerMock.insertEventRecord( completedEvent, EventStatus.completed, @@ -68,19 +68,19 @@ describe('DatabaseActions', () => { 'paymentTxId' ); // unspent event with timeout status - const timeoutEvent = EventTestData.mockEventTrigger(); + const timeoutEvent = EventTestData.mockEventTrigger().event; await DatabaseHandlerMock.insertEventRecord( timeoutEvent, EventStatus.timeout ); // rejected event - const rejectedEvent = EventTestData.mockEventTrigger(); + const rejectedEvent = EventTestData.mockEventTrigger().event; await DatabaseHandlerMock.insertEventRecord( rejectedEvent, EventStatus.rejected ); // timeout event with spendTxId - const spentTimeoutEvent = EventTestData.mockEventTrigger(); + const spentTimeoutEvent = EventTestData.mockEventTrigger().event; await DatabaseHandlerMock.insertEventRecord( spentTimeoutEvent, EventStatus.timeout, @@ -95,13 +95,13 @@ describe('DatabaseActions', () => { 'paymentTxId' ); // unspent event with pending-payment status - const unspentEvent = EventTestData.mockEventTrigger(); + const unspentEvent = EventTestData.mockEventTrigger().event; await DatabaseHandlerMock.insertEventRecord( unspentEvent, EventStatus.pendingPayment ); // unconfirmed event - const unconfirmedEvent = EventTestData.mockEventTrigger(); + const unconfirmedEvent = EventTestData.mockEventTrigger().event; await DatabaseHandlerMock.insertOnlyEventDataRecord(unconfirmedEvent); // run test @@ -144,7 +144,7 @@ describe('DatabaseActions', () => { it('should return ongoing events successfully', async () => { // insert 6 mocked events // completed event - const completedEvent = EventTestData.mockEventTrigger(); + const completedEvent = EventTestData.mockEventTrigger().event; await DatabaseHandlerMock.insertEventRecord( completedEvent, EventStatus.completed, @@ -159,19 +159,19 @@ describe('DatabaseActions', () => { 'paymentTxId' ); // unspent event with timeout status - const timeoutEvent = EventTestData.mockEventTrigger(); + const timeoutEvent = EventTestData.mockEventTrigger().event; await DatabaseHandlerMock.insertEventRecord( timeoutEvent, EventStatus.timeout ); // rejected event - const rejectedEvent = EventTestData.mockEventTrigger(); + const rejectedEvent = EventTestData.mockEventTrigger().event; await DatabaseHandlerMock.insertEventRecord( rejectedEvent, EventStatus.rejected ); // timeout event with spendTxId - const spentTimeoutEvent = EventTestData.mockEventTrigger(); + const spentTimeoutEvent = EventTestData.mockEventTrigger().event; await DatabaseHandlerMock.insertEventRecord( spentTimeoutEvent, EventStatus.timeout, @@ -186,13 +186,13 @@ describe('DatabaseActions', () => { 'paymentTxId' ); // unspent event with pending-payment status - const unspentEvent = EventTestData.mockEventTrigger(); + const unspentEvent = EventTestData.mockEventTrigger().event; await DatabaseHandlerMock.insertEventRecord( unspentEvent, EventStatus.pendingPayment ); // unconfirmed event - const unconfirmedEvent = EventTestData.mockEventTrigger(); + const unconfirmedEvent = EventTestData.mockEventTrigger().event; await DatabaseHandlerMock.insertOnlyEventDataRecord(unconfirmedEvent); // run test @@ -282,10 +282,10 @@ describe('DatabaseActions', () => { it('should return events that are transferring assets to ergo network', async () => { for (let index = 0; index < 10; index++) { // insert 10 mocked events into db - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; await insertCompletedEvent(mockedEvent); // insert 10 mocked events to ergo network into db - const mockedErgoEvent = EventTestData.mockToErgoEventTrigger(); + const mockedErgoEvent = EventTestData.mockToErgoEventTrigger().event; await insertCompletedEvent(mockedErgoEvent); } @@ -317,11 +317,11 @@ describe('DatabaseActions', () => { it('should return events that are transferring assets from ergo network', async () => { for (let index = 0; index < 10; index++) { // insert 10 mocked events into db - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; await insertCompletedEvent(mockedEvent); // insert 10 mocked events from ergo network into db - const mockedEvent2 = EventTestData.mockFromErgoEventTrigger(); + const mockedEvent2 = EventTestData.mockFromErgoEventTrigger().event; await insertCompletedEvent(mockedEvent2); } @@ -415,13 +415,13 @@ describe('DatabaseActions', () => { // insert 3 events const boxSerialized = 'boxSerialized'; // one without spendTxId - const mockedEvent1 = EventTestData.mockEventTrigger(); + const mockedEvent1 = EventTestData.mockEventTrigger().event; await DatabaseActionMock.insertOnlyEventDataRecord( mockedEvent1, boxSerialized ); // one with spendTxId but without revenue - const mockedEvent2 = EventTestData.mockEventTrigger(); + const mockedEvent2 = EventTestData.mockEventTrigger().event; const spendTxId2 = TestUtils.generateRandomId(); await DatabaseActionMock.insertOnlyEventDataRecord( mockedEvent2, @@ -431,7 +431,7 @@ describe('DatabaseActions', () => { TestUtils.generateRandomId() ); // one with spendTxId and revenue - const mockedEvent3 = EventTestData.mockEventTrigger(); + const mockedEvent3 = EventTestData.mockEventTrigger().event; const spendTxId3 = TestUtils.generateRandomId(); await DatabaseActionMock.insertOnlyEventDataRecord( mockedEvent3, diff --git a/tests/db/DatabaseHandler.spec.ts b/tests/db/DatabaseHandler.spec.ts index 188511c0..9fba2a7e 100644 --- a/tests/db/DatabaseHandler.spec.ts +++ b/tests/db/DatabaseHandler.spec.ts @@ -57,7 +57,7 @@ describe('DatabaseHandler', () => { */ it('should insert tx when there is no other tx for the event', async () => { // mock event and transaction - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const tx = TxTestData.mockPaymentTransaction( TransactionType.payment, @@ -98,7 +98,7 @@ describe('DatabaseHandler', () => { */ it('should NOT insert tx when there is already an advanced tx for the event', async () => { // mock event and two transactions - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const tx1 = TxTestData.mockPaymentTransaction( TransactionType.payment, @@ -146,7 +146,7 @@ describe('DatabaseHandler', () => { */ it('should insert tx when txId is lower than existing approved tx', async () => { // mock event and two transactions - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const txs = [ TxTestData.mockPaymentTransaction( @@ -208,7 +208,7 @@ describe('DatabaseHandler', () => { */ it('should NOT insert tx when txId is higher than existing approved tx', async () => { // mock event and two transactions - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const txs = [ TxTestData.mockPaymentTransaction( @@ -269,7 +269,7 @@ describe('DatabaseHandler', () => { */ it('should update failedInSign when tx is already in database', async () => { // mock event and transaction - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const tx = TxTestData.mockPaymentTransaction( TransactionType.payment, @@ -530,7 +530,7 @@ describe('DatabaseHandler', () => { * - returned list should only have event targetChainTokenId */ it('should return correct list for `paymentWaiting` events on non-Ergo chains', async () => { - const event = EventTestData.mockEventTrigger(); + const event = EventTestData.mockEventTrigger().event; await DatabaseActionMock.insertEventRecord( event, EventStatus.paymentWaiting @@ -554,7 +554,7 @@ describe('DatabaseHandler', () => { * - returned list should have event targetChainTokenId and RSN */ it('should return correct list for `paymentWaiting` events on Ergo', async () => { - const event = EventTestData.mockToErgoEventTrigger(); + const event = EventTestData.mockToErgoEventTrigger().event; await DatabaseActionMock.insertEventRecord( event, EventStatus.paymentWaiting @@ -578,7 +578,7 @@ describe('DatabaseHandler', () => { * - returned list should have event targetChainTokenId and RSN */ it('should return correct list for `rewardWaiting` events', async () => { - const event = EventTestData.mockTokenPaymentFromErgoEvent(); + const event = EventTestData.mockTokenPaymentFromErgoEvent().event; await DatabaseActionMock.insertEventRecord( event, EventStatus.rewardWaiting diff --git a/tests/db/databaseTestUtils.ts b/tests/db/databaseTestUtils.ts index a9f54442..f9bc9bb9 100644 --- a/tests/db/databaseTestUtils.ts +++ b/tests/db/databaseTestUtils.ts @@ -19,7 +19,7 @@ const insertEventsWithHeight = async ( status = EventStatus.completed ) => { for (let index = 0; index < count; index++) { - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; await DatabaseHandlerMock.insertEventRecord( mockedEvent, status, @@ -65,7 +65,7 @@ const insertEventsWithAmount = async (count: number) => { for (let index = 0; index < count; index++) { const mockedEvent = EventTestData.mockEventWithAmount( (1000 * index + 10000).toString() - ); + ).event; await insertCompletedEvent(mockedEvent); } }; @@ -96,9 +96,9 @@ const insertRevenueDataWithDifferentNetworks = async ( ) => { for (let index = 0; index < count; index++) { const timestamp = 1664229200000 + timeStep * index; - const mockedEvent = EventTestData.mockFromErgoEventTrigger(); + const mockedEvent = EventTestData.mockFromErgoEventTrigger().event; await insertRevenue(timestamp, 2000 + index, mockedEvent); - const mockedEvent2 = EventTestData.mockToErgoEventTrigger(); + const mockedEvent2 = EventTestData.mockToErgoEventTrigger().event; await insertRevenue(timestamp, 3000 + index, mockedEvent2); } }; @@ -114,7 +114,7 @@ const insertRevenueDataWithDifferentTokenId = async ( ) => { for (let index = 0; index < count; index++) { const timestamp = 1664229200000 + timeStep * index; - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; await insertRevenue(timestamp, 1000 + index); await insertRevenue(timestamp, 2000 + index, mockedEvent, 'revenueToken'); } @@ -135,7 +135,7 @@ const insertRevenueDataWithDifferentTokenId = async ( const insertRevenue = async ( timestamp: number, height = 1000, - mockedEvent: EventTrigger = EventTestData.mockEventTrigger(), + mockedEvent: EventTrigger = EventTestData.mockEventTrigger().event, revenueToken = 'tokenId', revenueType: RevenueType = RevenueType.fraud ) => { diff --git a/tests/db/mocked/DatabaseAction.mock.ts b/tests/db/mocked/DatabaseAction.mock.ts index a0ffca4a..83e0bd6c 100644 --- a/tests/db/mocked/DatabaseAction.mock.ts +++ b/tests/db/mocked/DatabaseAction.mock.ts @@ -1,4 +1,3 @@ -import '../../../src/bootstrap'; import { DataSource } from 'typeorm'; import { BlockEntity, @@ -124,7 +123,8 @@ class DatabaseActionMock { targetChainTokenId: event.targetChainTokenId, sourceTxId: event.sourceTxId, sourceBlockId: event.sourceBlockId, - WIDs: event.WIDs.join(','), + WIDsHash: event.WIDsHash, + WIDsCount: event.WIDsCount, sourceChainHeight: sourceChainHeight, spendHeight: spendHeight, spendBlock: spendBlockId, @@ -196,7 +196,8 @@ class DatabaseActionMock { result: result, paymentTxId: paymentTxId, spendBlock: spendBlock, - WIDs: event.WIDs.join(','), + WIDsHash: event.WIDsHash, + WIDsCount: event.WIDsCount, txId: 'event-creation-tx-id', }) .execute(); @@ -252,7 +253,9 @@ class DatabaseActionMock { boxSerialized: string, wid: string, height: number, - rwtCount: string + rwtCount: string, + spendTxId?: string, + spendIndex?: number ) => { await this.testDatabase.CommitmentRepository.createQueryBuilder() .insert() @@ -267,6 +270,9 @@ class DatabaseActionMock { height: height, rwtCount: rwtCount, txId: 'txId', + spendBlock: spendTxId ? TestUtils.generateRandomId() : undefined, + spendTxId: spendTxId, + spendIndex: spendIndex, }) .execute(); }; diff --git a/tests/event/EventBoxes.spec.ts b/tests/event/EventBoxes.spec.ts index cadee681..48ff6f75 100644 --- a/tests/event/EventBoxes.spec.ts +++ b/tests/event/EventBoxes.spec.ts @@ -25,7 +25,7 @@ describe('EventBoxes', () => { */ it('should return serialized box successfully', async () => { // insert a mocked event into db - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; const boxSerialized = Buffer.from('boxSerialized'); await DatabaseActionMock.insertEventRecord( mockedEvent, @@ -53,7 +53,7 @@ describe('EventBoxes', () => { */ it('should throw error when event is not found in database', async () => { // mock an event - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; // run test and expect exception thrown await expect(async () => { @@ -76,6 +76,7 @@ describe('EventBoxes', () => { * - database * @scenario * - insert a mocked event into db + * - insert event commitment boxes into db * - insert two valid commitment boxes into db * - insert an invalid commitment box into db * - run test @@ -86,44 +87,59 @@ describe('EventBoxes', () => { it('should return serialized boxes successfully', async () => { // insert a mocked event into db const mockedEvent = mockEventTrigger(); + const eventId = EventSerializer.getId(mockedEvent.event); const boxSerialized = Buffer.from('boxSerialized'); await DatabaseActionMock.insertEventRecord( - mockedEvent, + mockedEvent.event, boxSerialized.toString('base64') ); + // insert event commitment boxes into db + for (let i = 0; i < mockedEvent.WIDs.length; i++) { + await DatabaseActionMock.insertCommitmentBoxRecord( + eventId, + Buffer.from(`event-serialized-box-${i}`).toString('base64'), + mockedEvent.WIDs[i], + mockedEvent.event.height - 4, + rwtCount.toString(), + 'event-creation-tx-id', + i + ); + } + // insert two valid commitment boxes into db const validCommitment1 = Buffer.from('serialized-box-1'); await DatabaseActionMock.insertCommitmentBoxRecord( - EventSerializer.getId(mockedEvent), + eventId, validCommitment1.toString('base64'), TestUtils.generateRandomId(), - mockedEvent.height - 1, + mockedEvent.event.height - 1, rwtCount.toString() ); const validCommitment2 = Buffer.from('serialized-box-2'); await DatabaseActionMock.insertCommitmentBoxRecord( - EventSerializer.getId(mockedEvent), + eventId, validCommitment2.toString('base64'), TestUtils.generateRandomId(), - mockedEvent.height - 2, + mockedEvent.event.height - 2, rwtCount.toString() ); // insert an invalid commitment box into db const invalidCommitment = Buffer.from('serialized-box-3'); await DatabaseActionMock.insertCommitmentBoxRecord( - EventSerializer.getId(mockedEvent), + eventId, invalidCommitment.toString('base64'), TestUtils.generateRandomId(), - mockedEvent.height, + mockedEvent.event.height, rwtCount.toString() ); // run test const result = await EventBoxes.getEventValidCommitments( - mockedEvent, - rwtCount + mockedEvent.event, + rwtCount, + mockedEvent.WIDs ); // verify returned value @@ -139,6 +155,7 @@ describe('EventBoxes', () => { * - database * @scenario * - insert a mocked event into db + * - insert event commitment boxes into db * - insert two valid commitment boxes into db * - insert a commitment box with a WID of event box into db * - run test @@ -149,43 +166,58 @@ describe('EventBoxes', () => { it('should filter commitments that their WID are already in event trigger', async () => { // insert a mocked event into db const mockedEvent = mockEventTrigger(); + const eventId = EventSerializer.getId(mockedEvent.event); const boxSerialized = Buffer.from('boxSerialized'); await DatabaseActionMock.insertEventRecord( - mockedEvent, + mockedEvent.event, boxSerialized.toString('base64') ); + // insert event commitment boxes into db + for (let i = 0; i < mockedEvent.WIDs.length; i++) { + await DatabaseActionMock.insertCommitmentBoxRecord( + eventId, + Buffer.from(`event-serialized-box-${i}`).toString('base64'), + mockedEvent.WIDs[i], + mockedEvent.event.height - 4, + rwtCount.toString(), + 'event-creation-tx-id', + i + ); + } + // insert two valid commitment boxes into db const validCommitment1 = Buffer.from('serialized-box-1'); await DatabaseActionMock.insertCommitmentBoxRecord( - EventSerializer.getId(mockedEvent), + eventId, validCommitment1.toString('base64'), TestUtils.generateRandomId(), - mockedEvent.height - 1, + mockedEvent.event.height - 1, rwtCount.toString() ); const validCommitment2 = Buffer.from('serialized-box-2'); await DatabaseActionMock.insertCommitmentBoxRecord( - EventSerializer.getId(mockedEvent), + eventId, validCommitment2.toString('base64'), TestUtils.generateRandomId(), - mockedEvent.height - 2, + mockedEvent.event.height - 2, rwtCount.toString() ); // insert a commitment box with a WID of event box into db await DatabaseActionMock.insertCommitmentBoxRecord( - EventSerializer.getId(mockedEvent), + eventId, 'serialized-box-3', mockedEvent.WIDs[1], - mockedEvent.height, + mockedEvent.event.height, rwtCount.toString() ); // run test const result = await EventBoxes.getEventValidCommitments( - mockedEvent, - rwtCount + mockedEvent.event, + rwtCount, + mockedEvent.WIDs ); // verify returned value @@ -201,6 +233,7 @@ describe('EventBoxes', () => { * - database * @scenario * - insert a mocked event into db + * - insert event commitment boxes into db * - insert two valid commitment boxes into db * - insert a commitment box with duplicate WID into db * - run test @@ -213,45 +246,60 @@ describe('EventBoxes', () => { it('should return one commitment per WID', async () => { // insert a mocked event into db const mockedEvent = mockEventTrigger(); + const eventId = EventSerializer.getId(mockedEvent.event); const originalMockedEvent = cloneDeep(mockedEvent); const boxSerialized = Buffer.from('boxSerialized'); await DatabaseActionMock.insertEventRecord( - mockedEvent, + mockedEvent.event, boxSerialized.toString('base64') ); + // insert event commitment boxes into db + for (let i = 0; i < mockedEvent.WIDs.length; i++) { + await DatabaseActionMock.insertCommitmentBoxRecord( + eventId, + Buffer.from(`event-serialized-box-${i}`).toString('base64'), + mockedEvent.WIDs[i], + mockedEvent.event.height - 4, + rwtCount.toString(), + 'event-creation-tx-id', + i + ); + } + // insert two valid commitment boxes into db const validCommitment1 = Buffer.from('serialized-box-1'); await DatabaseActionMock.insertCommitmentBoxRecord( - EventSerializer.getId(mockedEvent), + eventId, validCommitment1.toString('base64'), TestUtils.generateRandomId(), - mockedEvent.height - 1, + mockedEvent.event.height - 1, rwtCount.toString() ); const validCommitment2 = Buffer.from('serialized-box-2'); const duplicateWID = TestUtils.generateRandomId(); await DatabaseActionMock.insertCommitmentBoxRecord( - EventSerializer.getId(mockedEvent), + eventId, validCommitment2.toString('base64'), duplicateWID, - mockedEvent.height - 2, + mockedEvent.event.height - 2, rwtCount.toString() ); // insert a commitment box with duplicate WID into db await DatabaseActionMock.insertCommitmentBoxRecord( - EventSerializer.getId(mockedEvent), + eventId, 'serialized-box-3', duplicateWID, - mockedEvent.height, + mockedEvent.event.height, rwtCount.toString() ); // run test const result = await EventBoxes.getEventValidCommitments( - mockedEvent, - rwtCount + mockedEvent.event, + rwtCount, + mockedEvent.WIDs ); // verify returned value @@ -270,6 +318,7 @@ describe('EventBoxes', () => { * - database * @scenario * - insert a mocked event into db + * - insert event commitment boxes into db * - insert two valid commitment boxes into db * - insert a commitment box with wrong RWT count * - run test @@ -280,43 +329,58 @@ describe('EventBoxes', () => { it('should filter commitments with wrong RWT count', async () => { // insert a mocked event into db const mockedEvent = mockEventTrigger(); + const eventId = EventSerializer.getId(mockedEvent.event); const boxSerialized = Buffer.from('boxSerialized'); await DatabaseActionMock.insertEventRecord( - mockedEvent, + mockedEvent.event, boxSerialized.toString('base64') ); + // insert event commitment boxes into db + for (let i = 0; i < mockedEvent.WIDs.length; i++) { + await DatabaseActionMock.insertCommitmentBoxRecord( + eventId, + Buffer.from(`event-serialized-box-${i}`).toString('base64'), + mockedEvent.WIDs[i], + mockedEvent.event.height - 4, + rwtCount.toString(), + 'event-creation-tx-id', + i + ); + } + // insert two valid commitment boxes into db const validCommitment1 = Buffer.from('serialized-box-1'); await DatabaseActionMock.insertCommitmentBoxRecord( - EventSerializer.getId(mockedEvent), + eventId, validCommitment1.toString('base64'), TestUtils.generateRandomId(), - mockedEvent.height - 1, + mockedEvent.event.height - 1, rwtCount.toString() ); const validCommitment2 = Buffer.from('serialized-box-2'); await DatabaseActionMock.insertCommitmentBoxRecord( - EventSerializer.getId(mockedEvent), + eventId, validCommitment2.toString('base64'), TestUtils.generateRandomId(), - mockedEvent.height - 2, + mockedEvent.event.height - 2, rwtCount.toString() ); // insert a commitment box with wrong RWT count await DatabaseActionMock.insertCommitmentBoxRecord( - EventSerializer.getId(mockedEvent), + eventId, 'serialized-box-3', TestUtils.generateRandomId(), - mockedEvent.height, + mockedEvent.event.height, (rwtCount + 1n).toString() ); // run test const result = await EventBoxes.getEventValidCommitments( - mockedEvent, - rwtCount + mockedEvent.event, + rwtCount, + mockedEvent.WIDs ); // verify returned value @@ -342,7 +406,144 @@ describe('EventBoxes', () => { // run test and expect exception thrown await expect(async () => { - await EventBoxes.getEventValidCommitments(mockedEvent, rwtCount); + await EventBoxes.getEventValidCommitments( + mockedEvent.event, + rwtCount, + mockedEvent.WIDs + ); + }).rejects.toThrow(Error); + }); + }); + + describe('getEventWIDs', () => { + const rwtCount = 2n; + + beforeEach(async () => { + await DatabaseActionMock.clearTables(); + }); + + /** + * @target EventBoxes.getEventWIDs should return event commitments successfully + * @dependencies + * - database + * @scenario + * - insert a mocked event into db + * - insert event commitment boxes into db + * - insert two commitments for the event into db + * - run test + * - verify returned value + * @expected + * - it should return serialized string of the box + */ + it('should return event commitments successfully', async () => { + // insert a mocked event into db + const mockedEvent = mockEventTrigger(); + const eventId = EventSerializer.getId(mockedEvent.event); + const boxSerialized = Buffer.from('boxSerialized'); + await DatabaseActionMock.insertEventRecord( + mockedEvent.event, + boxSerialized.toString('base64') + ); + + // insert event commitment boxes into db + for (let i = mockedEvent.WIDs.length - 1; i >= 0; i--) { + await DatabaseActionMock.insertCommitmentBoxRecord( + eventId, + Buffer.from(`event-serialized-box-${i}`).toString('base64'), + mockedEvent.WIDs[i], + mockedEvent.event.height - 4, + rwtCount.toString(), + 'event-creation-tx-id', + i + ); + } + + // insert two commitments for the event into db + const commitment = Buffer.from('serialized-box-1'); + await DatabaseActionMock.insertCommitmentBoxRecord( + eventId, + commitment.toString('base64'), + TestUtils.generateRandomId(), + mockedEvent.event.height - 1, + rwtCount.toString() + ); + const spentCommitment = Buffer.from('serialized-box-2'); + await DatabaseActionMock.insertCommitmentBoxRecord( + eventId, + spentCommitment.toString('base64'), + TestUtils.generateRandomId(), + mockedEvent.event.height - 2, + rwtCount.toString(), + TestUtils.generateRandomId(), + 0 + ); + + // run test + const result = await EventBoxes.getEventWIDs(mockedEvent.event); + + // verify returned value + expect(result).toEqual(mockedEvent.WIDs); + }); + + /** + * @target EventBoxes.getEventWIDs should throw error when hash of fetched WIDs + * does not match with WIDsHash in event + * @dependencies + * - database + * @scenario + * - insert a mocked event into db + * - insert event commitment boxes into db (not all) + * - insert two commitments for the event into db + * - run test and expect exception thrown + * @expected + * - it should throw error + */ + it('should throw error when hash of fetched WIDs does not match with WIDsHash in event', async () => { + // insert a mocked event into db + const mockedEvent = mockEventTrigger(); + const eventId = EventSerializer.getId(mockedEvent.event); + const boxSerialized = Buffer.from('boxSerialized'); + await DatabaseActionMock.insertEventRecord( + mockedEvent.event, + boxSerialized.toString('base64') + ); + + // insert event commitment boxes into db (not all) + for (let i = 1; i < mockedEvent.WIDs.length; i++) { + await DatabaseActionMock.insertCommitmentBoxRecord( + eventId, + Buffer.from(`event-serialized-box-${i}`).toString('base64'), + mockedEvent.WIDs[i], + mockedEvent.event.height - 4, + rwtCount.toString(), + 'event-creation-tx-id', + i + ); + } + + // insert two commitments for the event into db + const commitment = Buffer.from('serialized-box-1'); + await DatabaseActionMock.insertCommitmentBoxRecord( + eventId, + commitment.toString('base64'), + TestUtils.generateRandomId(), + mockedEvent.event.height - 1, + rwtCount.toString() + ); + const spentCommitment = Buffer.from('serialized-box-2'); + await DatabaseActionMock.insertCommitmentBoxRecord( + eventId, + spentCommitment.toString('base64'), + TestUtils.generateRandomId(), + mockedEvent.event.height - 2, + rwtCount.toString(), + TestUtils.generateRandomId(), + 0 + ); + + // run test and expect exception thrown + await expect(async () => { + await EventBoxes.getEventWIDs(mockedEvent.event); }).rejects.toThrow(Error); }); }); diff --git a/tests/event/EventOrder.spec.ts b/tests/event/EventOrder.spec.ts index d4f9a347..21e7dee5 100644 --- a/tests/event/EventOrder.spec.ts +++ b/tests/event/EventOrder.spec.ts @@ -30,7 +30,7 @@ describe('EventOrder', () => { * - should not contain any tokens * - should not have extra */ - it('should generate native token payment successfully', async () => { + it('should generate native token payment successfully', () => { // mock function arguments const chainMinTransfer = 100n; const fee: Fee = { @@ -39,10 +39,10 @@ describe('EventOrder', () => { rsnRatio: 0n, feeRatio: 0n, }; - const mockedEvent = mockNativeTokenPaymentEvent(); + const mockedEvent = mockNativeTokenPaymentEvent().event; // run test - const result = await EventOrder.eventSinglePayment( + const result = EventOrder.eventSinglePayment( mockedEvent, chainMinTransfer, fee @@ -77,7 +77,7 @@ describe('EventOrder', () => { * with value event.amount - event.bridgeFee - event.networkFee + * - should not have extra */ - it('should generate token payment successfully', async () => { + it('should generate token payment successfully', () => { // mock function arguments const chainMinTransfer = 100n; const fee: Fee = { @@ -86,10 +86,10 @@ describe('EventOrder', () => { rsnRatio: 0n, feeRatio: 0n, }; - const mockedEvent = mockTokenPaymentFromErgoEvent(); + const mockedEvent = mockTokenPaymentFromErgoEvent().event; // run test - const result = await EventOrder.eventSinglePayment( + const result = EventOrder.eventSinglePayment( mockedEvent, chainMinTransfer, fee @@ -126,7 +126,7 @@ describe('EventOrder', () => { * with value event.amount - fee.bridgeFee - fee.networkFee + * - should not have extra */ - it('should replace fees on token payment when they are less than minimum config', async () => { + it('should replace fees on token payment when they are less than minimum config', () => { // mock function arguments const chainMinTransfer = 100n; const fee: Fee = { @@ -135,10 +135,10 @@ describe('EventOrder', () => { rsnRatio: 0n, feeRatio: 0n, }; - const mockedEvent = mockTokenPaymentEvent(); + const mockedEvent = mockTokenPaymentEvent().event; // run test - const result = await EventOrder.eventSinglePayment( + const result = EventOrder.eventSinglePayment( mockedEvent, chainMinTransfer, fee @@ -177,7 +177,7 @@ describe('EventOrder', () => { * - should not contain any tokens * - should not have extra */ - it('should replace bridgeFee on native token payment when it is less than expected value', async () => { + it('should replace bridgeFee on native token payment when it is less than expected value', () => { // mock function arguments const chainMinTransfer = 100n; const fee: Fee = { @@ -186,10 +186,10 @@ describe('EventOrder', () => { rsnRatio: 0n, feeRatio: 1000n, }; - const mockedEvent = mockNativeTokenPaymentEvent(); + const mockedEvent = mockNativeTokenPaymentEvent().event; // run test - const result = await EventOrder.eventSinglePayment( + const result = EventOrder.eventSinglePayment( mockedEvent, chainMinTransfer, fee @@ -214,7 +214,7 @@ describe('EventOrder', () => { const fromChainRwt = 'fromChainRwt'; const rwtCount = 2n; - beforeEach(async () => { + beforeEach(() => { ChainHandlerMock.resetMock(); }); @@ -233,7 +233,7 @@ describe('EventOrder', () => { * @expected * - first 5 orders must have cardano permit address */ - it('should set cardano permit address for each watcher when source chain of event is cardano', async () => { + it('should set cardano permit address for each watcher when source chain of event is cardano', () => { const fee: Fee = { bridgeFee: 0n, networkFee: 0n, @@ -243,7 +243,7 @@ describe('EventOrder', () => { const mockedEvent = mockNativeTokenPaymentEvent(); // mock ChainHandler - ChainHandlerMock.mockChainName(mockedEvent.fromChain, true); + ChainHandlerMock.mockChainName(mockedEvent.event.fromChain, true); // mock `getChainConfigs` ChainHandlerMock.mockFromChainFunction( 'getChainConfigs', @@ -251,13 +251,14 @@ describe('EventOrder', () => { ); const result = EventOrder.eventRewardOrder( - mockedEvent, + mockedEvent.event, [], fee, '', fromChainRwt, rwtCount, - 100000000n + 100000000n, + mockedEvent.WIDs ); for (let index = 0; index < mockedEvent.WIDs.length; index++) { expect( @@ -303,7 +304,7 @@ describe('EventOrder', () => { * - should have no token * - should have no extra */ - it('should generate native token reward distribution successfully', async () => { + it('should generate native token reward distribution successfully', () => { // mock function arguments const fee: Fee = { bridgeFee: 0n, @@ -319,7 +320,7 @@ describe('EventOrder', () => { }; // mock ChainHandler - ChainHandlerMock.mockChainName(mockedEvent.fromChain, true); + ChainHandlerMock.mockChainName(mockedEvent.event.fromChain, true); // mock `getChainConfigs` ChainHandlerMock.mockFromChainFunction( 'getChainConfigs', @@ -328,13 +329,14 @@ describe('EventOrder', () => { // run test const result = EventOrder.eventRewardOrder( - mockedEvent, + mockedEvent.event, [unmergedWID], fee, paymentTxId, fromChainRwt, rwtCount, - 100000000n + 100000000n, + mockedEvent.WIDs ); // verify returned value @@ -431,7 +433,7 @@ describe('EventOrder', () => { * - should have no token * - should have no extra */ - it('should generate token reward distribution successfully', async () => { + it('should generate token reward distribution successfully', () => { // mock function arguments const fee: Fee = { bridgeFee: 0n, @@ -447,7 +449,7 @@ describe('EventOrder', () => { }; // mock ChainHandler - ChainHandlerMock.mockChainName(mockedEvent.fromChain, true); + ChainHandlerMock.mockChainName(mockedEvent.event.fromChain, true); // mock `getChainConfigs` ChainHandlerMock.mockFromChainFunction( 'getChainConfigs', @@ -456,13 +458,14 @@ describe('EventOrder', () => { // run test const result = EventOrder.eventRewardOrder( - mockedEvent, + mockedEvent.event, [unmergedWID], fee, paymentTxId, fromChainRwt, rwtCount, - 10000000n + 10000000n, + mockedEvent.WIDs ); // verify returned value @@ -477,7 +480,7 @@ describe('EventOrder', () => { expect(watcherOrder.assets.tokens[0].id).toEqual(fromChainRwt); expect(watcherOrder.assets.tokens[0].value).toEqual(rwtCount); expect(watcherOrder.assets.tokens[1].id).toEqual( - mockedEvent.targetChainTokenId + mockedEvent.event.targetChainTokenId ); expect(watcherOrder.assets.tokens[1].value).toEqual(833333n); expect(watcherOrder.assets.tokens[2].id).toEqual(rosenConfig.RSN); @@ -494,7 +497,7 @@ describe('EventOrder', () => { expect(unmergedWatcherOrder.assets.tokens[0].id).toEqual(fromChainRwt); expect(unmergedWatcherOrder.assets.tokens[0].value).toEqual(rwtCount); expect(unmergedWatcherOrder.assets.tokens[1].id).toEqual( - mockedEvent.targetChainTokenId + mockedEvent.event.targetChainTokenId ); expect(unmergedWatcherOrder.assets.tokens[1].value).toEqual(833333n); expect(unmergedWatcherOrder.assets.tokens[2].id).toEqual(rosenConfig.RSN); @@ -508,7 +511,7 @@ describe('EventOrder', () => { expect(bridgeFeeOrder.assets.nativeToken).toEqual(100000n); expect(bridgeFeeOrder.assets.tokens.length).toEqual(1); expect(bridgeFeeOrder.assets.tokens[0].id).toEqual( - mockedEvent.targetChainTokenId + mockedEvent.event.targetChainTokenId ); expect(bridgeFeeOrder.assets.tokens[0].value).toEqual(5000002n); expect(bridgeFeeOrder.extra).toEqual(paymentTxId); @@ -530,7 +533,7 @@ describe('EventOrder', () => { expect(networkFeeOrder.assets.nativeToken).toEqual(100000n); expect(networkFeeOrder.assets.tokens.length).toEqual(1); expect(networkFeeOrder.assets.tokens[0].id).toEqual( - mockedEvent.targetChainTokenId + mockedEvent.event.targetChainTokenId ); expect(networkFeeOrder.assets.tokens[0].value).toEqual(15000n); expect(networkFeeOrder.extra).toBeUndefined(); @@ -572,7 +575,7 @@ describe('EventOrder', () => { * - should have no token * - should have no extra */ - it('should replace fees on token payment when they are less than minimum config', async () => { + it('should replace fees on token payment when they are less than minimum config', () => { // mock function arguments const fee: Fee = { bridgeFee: 20000000n, @@ -588,7 +591,7 @@ describe('EventOrder', () => { }; // mock ChainHandler - ChainHandlerMock.mockChainName(mockedEvent.fromChain, true); + ChainHandlerMock.mockChainName(mockedEvent.event.fromChain, true); // mock `getChainConfigs` ChainHandlerMock.mockFromChainFunction( 'getChainConfigs', @@ -597,13 +600,14 @@ describe('EventOrder', () => { // run test const result = EventOrder.eventRewardOrder( - mockedEvent, + mockedEvent.event, [unmergedWID], fee, paymentTxId, fromChainRwt, rwtCount, - 10000000n + 10000000n, + mockedEvent.WIDs ); // verify returned value @@ -618,7 +622,7 @@ describe('EventOrder', () => { expect(watcherOrder.assets.tokens[0].id).toEqual(fromChainRwt); expect(watcherOrder.assets.tokens[0].value).toEqual(rwtCount); expect(watcherOrder.assets.tokens[1].id).toEqual( - mockedEvent.targetChainTokenId + mockedEvent.event.targetChainTokenId ); expect(watcherOrder.assets.tokens[1].value).toEqual(1666666n); expect(watcherOrder.assets.tokens[2].id).toEqual(rosenConfig.RSN); @@ -635,7 +639,7 @@ describe('EventOrder', () => { expect(unmergedWatcherOrder.assets.tokens[0].id).toEqual(fromChainRwt); expect(unmergedWatcherOrder.assets.tokens[0].value).toEqual(rwtCount); expect(unmergedWatcherOrder.assets.tokens[1].id).toEqual( - mockedEvent.targetChainTokenId + mockedEvent.event.targetChainTokenId ); expect(unmergedWatcherOrder.assets.tokens[1].value).toEqual(1666666n); expect(unmergedWatcherOrder.assets.tokens[2].id).toEqual(rosenConfig.RSN); @@ -649,7 +653,7 @@ describe('EventOrder', () => { expect(bridgeFeeOrder.assets.nativeToken).toEqual(100000n); expect(bridgeFeeOrder.assets.tokens.length).toEqual(1); expect(bridgeFeeOrder.assets.tokens[0].id).toEqual( - mockedEvent.targetChainTokenId + mockedEvent.event.targetChainTokenId ); expect(bridgeFeeOrder.assets.tokens[0].value).toEqual(10000004n); expect(bridgeFeeOrder.extra).toEqual(paymentTxId); @@ -671,7 +675,7 @@ describe('EventOrder', () => { expect(networkFeeOrder.assets.nativeToken).toEqual(100000n); expect(networkFeeOrder.assets.tokens.length).toEqual(1); expect(networkFeeOrder.assets.tokens[0].id).toEqual( - mockedEvent.targetChainTokenId + mockedEvent.event.targetChainTokenId ); expect(networkFeeOrder.assets.tokens[0].value).toEqual(30000n); expect(networkFeeOrder.extra).toBeUndefined(); @@ -713,7 +717,7 @@ describe('EventOrder', () => { * - should have no token * - should have no extra */ - it('should replace bridgeFee on native token payment when it is less than expected value', async () => { + it('should replace bridgeFee on native token payment when it is less than expected value', () => { // mock function arguments const fee: Fee = { bridgeFee: 0n, @@ -729,7 +733,7 @@ describe('EventOrder', () => { }; // mock ChainHandler - ChainHandlerMock.mockChainName(mockedEvent.fromChain, true); + ChainHandlerMock.mockChainName(mockedEvent.event.fromChain, true); // mock `getChainConfigs` ChainHandlerMock.mockFromChainFunction( 'getChainConfigs', @@ -738,13 +742,14 @@ describe('EventOrder', () => { // run test const result = EventOrder.eventRewardOrder( - mockedEvent, + mockedEvent.event, [unmergedWID], fee, paymentTxId, fromChainRwt, rwtCount, - 10000000n + 10000000n, + mockedEvent.WIDs ); // verify returned value @@ -835,7 +840,7 @@ describe('EventOrder', () => { * - should have no token * - should have no extra */ - it('should not create RSN emission box when no RSN emitted', async () => { + it('should not create RSN emission box when no RSN emitted', () => { // mock function arguments const fee: Fee = { bridgeFee: 0n, @@ -851,7 +856,7 @@ describe('EventOrder', () => { }; // mock ChainHandler - ChainHandlerMock.mockChainName(mockedEvent.fromChain, true); + ChainHandlerMock.mockChainName(mockedEvent.event.fromChain, true); // mock `getChainConfigs` ChainHandlerMock.mockFromChainFunction( 'getChainConfigs', @@ -860,13 +865,14 @@ describe('EventOrder', () => { // run test const result = EventOrder.eventRewardOrder( - mockedEvent, + mockedEvent.event, [unmergedWID], fee, paymentTxId, fromChainRwt, rwtCount, - 10000000n + 10000000n, + mockedEvent.WIDs ); // verify returned value @@ -881,7 +887,7 @@ describe('EventOrder', () => { expect(watcherOrder.assets.tokens[0].id).toEqual(fromChainRwt); expect(watcherOrder.assets.tokens[0].value).toEqual(rwtCount); expect(watcherOrder.assets.tokens[1].id).toEqual( - mockedEvent.targetChainTokenId + mockedEvent.event.targetChainTokenId ); expect(watcherOrder.assets.tokens[1].value).toEqual(833333n); expect(watcherOrder.extra).toEqual(mockedEvent.WIDs[index]); @@ -896,7 +902,7 @@ describe('EventOrder', () => { expect(unmergedWatcherOrder.assets.tokens[0].id).toEqual(fromChainRwt); expect(unmergedWatcherOrder.assets.tokens[0].value).toEqual(rwtCount); expect(unmergedWatcherOrder.assets.tokens[1].id).toEqual( - mockedEvent.targetChainTokenId + mockedEvent.event.targetChainTokenId ); expect(unmergedWatcherOrder.assets.tokens[1].value).toEqual(833333n); expect(unmergedWatcherOrder.extra).toEqual(unmergedWID.wid); @@ -908,7 +914,7 @@ describe('EventOrder', () => { expect(bridgeFeeOrder.assets.nativeToken).toEqual(100000n); expect(bridgeFeeOrder.assets.tokens.length).toEqual(1); expect(bridgeFeeOrder.assets.tokens[0].id).toEqual( - mockedEvent.targetChainTokenId + mockedEvent.event.targetChainTokenId ); expect(bridgeFeeOrder.assets.tokens[0].value).toEqual(5000002n); expect(bridgeFeeOrder.extra).toEqual(paymentTxId); @@ -920,7 +926,7 @@ describe('EventOrder', () => { expect(networkFeeOrder.assets.nativeToken).toEqual(100000n); expect(networkFeeOrder.assets.tokens.length).toEqual(1); expect(networkFeeOrder.assets.tokens[0].id).toEqual( - mockedEvent.targetChainTokenId + mockedEvent.event.targetChainTokenId ); expect(networkFeeOrder.assets.tokens[0].value).toEqual(15000n); expect(networkFeeOrder.extra).toBeUndefined(); diff --git a/tests/event/EventProcessor.spec.ts b/tests/event/EventProcessor.spec.ts index 18505f0e..eb921db9 100644 --- a/tests/event/EventProcessor.spec.ts +++ b/tests/event/EventProcessor.spec.ts @@ -19,6 +19,7 @@ import ChainHandlerMock from '../handlers/ChainHandler.mock'; import { mockGetEventBox, mockGetEventValidCommitments, + mockGetEventWIDs, } from './mocked/EventBoxes.mock'; import { mockEventRewardOrder, @@ -54,7 +55,7 @@ describe('EventProcessor', () => { */ it('should insert confirmed events into ConfirmedEvent table', async () => { // insert a mocked event into db - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; const boxSerialized = 'boxSerialized'; await DatabaseActionMock.insertOnlyEventDataRecord( mockedEvent, @@ -89,7 +90,7 @@ describe('EventProcessor', () => { */ it('should NOT insert unconfirmed events into ConfirmedEvent table', async () => { // insert a mocked event into db - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; const boxSerialized = 'boxSerialized'; await DatabaseActionMock.insertOnlyEventDataRecord( mockedEvent, @@ -123,7 +124,7 @@ describe('EventProcessor', () => { */ it('should only inserts one event per sourceTxId into ConfirmedEvent table', async () => { // insert a mocked event into db twice - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; const boxSerialized = 'boxSerialized'; await DatabaseActionMock.insertOnlyEventDataRecord( mockedEvent, @@ -172,7 +173,7 @@ describe('EventProcessor', () => { */ it('should update event status to spent when event box is spent', async () => { // mock a pending payment event and insert into db - const mockedEvent: EventTrigger = mockEventTrigger(); + const mockedEvent: EventTrigger = mockEventTrigger().event; await DatabaseActionMock.insertEventRecord( mockedEvent, EventStatus.pendingPayment, @@ -232,7 +233,7 @@ describe('EventProcessor', () => { */ it('should send event to payment processor when event is pending payment', async () => { // mock a pending payment event and insert into db - const mockedEvent: EventTrigger = mockEventTrigger(); + const mockedEvent: EventTrigger = mockEventTrigger().event; await DatabaseActionMock.insertEventRecord( mockedEvent, EventStatus.pendingPayment @@ -278,7 +279,7 @@ describe('EventProcessor', () => { */ it('should send event to reward processor when event is pending reward distribution', async () => { // mock a pending reward event and insert into db - const mockedEvent: EventTrigger = mockEventTrigger(); + const mockedEvent: EventTrigger = mockEventTrigger().event; await DatabaseActionMock.insertEventRecord( mockedEvent, EventStatus.pendingReward @@ -324,7 +325,7 @@ describe('EventProcessor', () => { */ it('should do nothing when turn is over', async () => { // mock a pending payment event and insert into db - const mockedEvent: EventTrigger = mockEventTrigger(); + const mockedEvent: EventTrigger = mockEventTrigger().event; await DatabaseActionMock.insertEventRecord( mockedEvent, EventStatus.pendingPayment @@ -387,7 +388,7 @@ describe('EventProcessor', () => { * - mock `getRWTToken` of `fromChain` * - mock `getBoxRWT` of Ergo * - mock `getSerializedBoxInfo` of Ergo - * - mock event box and valid commitments + * - mock event box and commitments * - mock event payment and reward order generations * - mock txAgreement * - mock `getChainPendingTransactions` to return empty list @@ -409,7 +410,7 @@ describe('EventProcessor', () => { mockGetEventFeeConfig(fee); // mock event as verified - const mockedEvent: EventTrigger = mockToErgoEventTrigger(); + const { event: mockedEvent, WIDs: eventWIDs } = mockToErgoEventTrigger(); mockVerifyEvent(true); // mock ChainHandler `getChain` and `getErgoChain` @@ -449,7 +450,7 @@ describe('EventProcessor', () => { // mock `getBoxRWT` of Ergo ChainHandlerMock.mockErgoFunctionReturnValue( 'getBoxRWT', - 2n * BigInt(mockedEvent.WIDs.length) + 2n * BigInt(mockedEvent.WIDsCount) ); // mock `getSerializedBoxInfo` of Ergo ChainHandlerMock.mockErgoFunctionReturnValue('getSerializedBoxInfo', { @@ -458,9 +459,10 @@ describe('EventProcessor', () => { }, }); - // mock event box and valid commitments + // mock event box and commitments mockGetEventBox('serialized-event-box'); mockGetEventValidCommitments(['serialized-commitment-box']); + mockGetEventWIDs(eventWIDs); // mock event payment and reward order generations mockEventSinglePayment({ @@ -529,7 +531,7 @@ describe('EventProcessor', () => { mockGetEventFeeConfig(fee); // mock event as verified - const mockedEvent: EventTrigger = mockEventTrigger(); + const { event: mockedEvent, WIDs: eventWIDs } = mockEventTrigger(); mockVerifyEvent(true); // mock ChainHandler `getChain` @@ -561,7 +563,7 @@ describe('EventProcessor', () => { // mock `getBoxRWT` of Ergo ChainHandlerMock.mockErgoFunctionReturnValue( 'getBoxRWT', - 2n * BigInt(mockedEvent.WIDs.length) + 2n * BigInt(mockedEvent.WIDsCount) ); // mock event payment order generations @@ -616,7 +618,7 @@ describe('EventProcessor', () => { mockGetEventFeeConfig(fee); // insert a mocked event into db - const mockedEvent: EventTrigger = mockEventTrigger(); + const { event: mockedEvent, WIDs: eventWIDs } = mockEventTrigger(); await DatabaseActionMock.insertEventRecord( mockedEvent, EventStatus.pendingPayment @@ -662,7 +664,7 @@ describe('EventProcessor', () => { * - mock `getRWTToken` of `fromChain` * - mock `getBoxRWT` of Ergo * - mock `getSerializedBoxInfo` of Ergo - * - mock event box and valid commitments + * - mock event box and commitments * - mock event payment and reward order generations * - mock txAgreement `getChainPendingTransactions` to return empty list * - mock Notification @@ -684,7 +686,7 @@ describe('EventProcessor', () => { mockGetEventFeeConfig(fee); // insert a mocked event into db - const mockedEvent: EventTrigger = mockToErgoEventTrigger(); + const { event: mockedEvent, WIDs: eventWIDs } = mockToErgoEventTrigger(); await DatabaseActionMock.insertEventRecord( mockedEvent, EventStatus.pendingPayment @@ -719,7 +721,7 @@ describe('EventProcessor', () => { // mock `getBoxRWT` of Ergo ChainHandlerMock.mockErgoFunctionReturnValue( 'getBoxRWT', - 2n * BigInt(mockedEvent.WIDs.length) + 2n * BigInt(mockedEvent.WIDsCount) ); // mock `getSerializedBoxInfo` of Ergo ChainHandlerMock.mockErgoFunctionReturnValue('getSerializedBoxInfo', { @@ -728,9 +730,10 @@ describe('EventProcessor', () => { }, }); - // mock event box and valid commitments + // mock event box and commitments mockGetEventBox('serialized-event-box'); mockGetEventValidCommitments([]); + mockGetEventWIDs(eventWIDs); // mock event payment and reward order generations mockEventSinglePayment({ @@ -789,7 +792,7 @@ describe('EventProcessor', () => { * - mock `getRWTToken` of `fromChain` * - mock `getBoxRWT` of Ergo * - mock `getSerializedBoxInfo` of Ergo - * - mock event box and valid commitments + * - mock event box and commitments * - mock event payment and reward order generations * - mock txAgreement * - mock `getChainPendingTransactions` to return empty list @@ -811,7 +814,7 @@ describe('EventProcessor', () => { mockGetEventFeeConfig(fee); // mock event as verified - const mockedEvent: EventTrigger = mockToErgoEventTrigger(); + const { event: mockedEvent, WIDs: eventWIDs } = mockToErgoEventTrigger(); mockVerifyEvent(true); // mock ChainHandler `getChain` and `getErgoChain` @@ -851,7 +854,7 @@ describe('EventProcessor', () => { // mock `getBoxRWT` of Ergo ChainHandlerMock.mockErgoFunctionReturnValue( 'getBoxRWT', - 2n * BigInt(mockedEvent.WIDs.length) + 2n * BigInt(mockedEvent.WIDsCount) ); // mock `getSerializedBoxInfo` of Ergo ChainHandlerMock.mockErgoFunctionReturnValue('getSerializedBoxInfo', { @@ -860,9 +863,10 @@ describe('EventProcessor', () => { }, }); - // mock event box and valid commitments + // mock event box and commitments mockGetEventBox('serialized-event-box'); mockGetEventValidCommitments(['serialized-commitment-box']); + mockGetEventWIDs(eventWIDs); // mock event payment and reward order generations mockEventSinglePayment({ @@ -924,7 +928,7 @@ describe('EventProcessor', () => { * - mock `getRWTToken` of Ergo * - mock `getBoxRWT` of Ergo * - mock `getSerializedBoxInfo` of Ergo - * - mock event box and valid commitments + * - mock event box and commitments * - mock event payment and reward order generations * - mock txAgreement * - mock `getChainPendingTransactions` to return empty list @@ -946,7 +950,7 @@ describe('EventProcessor', () => { mockGetEventFeeConfig(fee); // mock event and insert a mocked payment transaction for it into database - const mockedEvent: EventTrigger = mockEventTrigger(); + const { event: mockedEvent, WIDs: eventWIDs } = mockEventTrigger(); const paymentTx = mockPaymentTransaction( TransactionType.payment, mockedEvent.toChain, @@ -994,7 +998,7 @@ describe('EventProcessor', () => { // mock `getBoxRWT` of Ergo ChainHandlerMock.mockErgoFunctionReturnValue( 'getBoxRWT', - 2n * BigInt(mockedEvent.WIDs.length) + 2n * BigInt(mockedEvent.WIDsCount) ); // mock `getSerializedBoxInfo` of Ergo ChainHandlerMock.mockErgoFunctionReturnValue('getSerializedBoxInfo', { @@ -1003,9 +1007,10 @@ describe('EventProcessor', () => { }, }); - // mock event box and valid commitments + // mock event box and commitments mockGetEventBox('serialized-event-box'); mockGetEventValidCommitments(['serialized-commitment-box']); + mockGetEventWIDs(eventWIDs); // mock event payment and reward order generations mockEventSinglePayment({ @@ -1054,7 +1059,7 @@ describe('EventProcessor', () => { * - mock `getRWTToken` of Ergo * - mock `getBoxRWT` of Ergo * - mock `getSerializedBoxInfo` of Ergo - * - mock event box and valid commitments + * - mock event box and commitments * - mock event payment and reward order generations * - mock txAgreement `getChainPendingTransactions` to return empty list * - mock Notification @@ -1077,7 +1082,7 @@ describe('EventProcessor', () => { mockGetEventFeeConfig(fee); // mock event and insert a mocked payment transaction for it into database - const mockedEvent: EventTrigger = mockEventTrigger(); + const { event: mockedEvent, WIDs: eventWIDs } = mockEventTrigger(); const paymentTx = mockPaymentTransaction( TransactionType.payment, mockedEvent.toChain, @@ -1114,7 +1119,7 @@ describe('EventProcessor', () => { // mock `getBoxRWT` of Ergo ChainHandlerMock.mockErgoFunctionReturnValue( 'getBoxRWT', - 2n * BigInt(mockedEvent.WIDs.length) + 2n * BigInt(mockedEvent.WIDsCount) ); // mock `getSerializedBoxInfo` of Ergo ChainHandlerMock.mockErgoFunctionReturnValue('getSerializedBoxInfo', { @@ -1123,9 +1128,10 @@ describe('EventProcessor', () => { }, }); - // mock event box and valid commitments + // mock event box and commitments mockGetEventBox('serialized-event-box'); mockGetEventValidCommitments([]); + mockGetEventWIDs(eventWIDs); // mock event payment and reward order generations mockEventSinglePayment({ @@ -1186,7 +1192,7 @@ describe('EventProcessor', () => { * - mock `getRWTToken` of Ergo * - mock `getBoxRWT` of Ergo * - mock `getSerializedBoxInfo` of Ergo - * - mock event box and valid commitments + * - mock event box and commitments * - mock event payment and reward order generations * - mock txAgreement * - mock `getChainPendingTransactions` to return empty list @@ -1208,7 +1214,7 @@ describe('EventProcessor', () => { mockGetEventFeeConfig(fee); // mock event and insert a mocked payment transaction for it into database - const mockedEvent: EventTrigger = mockEventTrigger(); + const { event: mockedEvent, WIDs: eventWIDs } = mockEventTrigger(); const paymentTx = mockPaymentTransaction( TransactionType.payment, mockedEvent.toChain, @@ -1256,7 +1262,7 @@ describe('EventProcessor', () => { // mock `getBoxRWT` of Ergo ChainHandlerMock.mockErgoFunctionReturnValue( 'getBoxRWT', - 2n * BigInt(mockedEvent.WIDs.length) + 2n * BigInt(mockedEvent.WIDsCount) ); // mock `getSerializedBoxInfo` of Ergo ChainHandlerMock.mockErgoFunctionReturnValue('getSerializedBoxInfo', { @@ -1265,9 +1271,10 @@ describe('EventProcessor', () => { }, }); - // mock event box and valid commitments + // mock event box and commitments mockGetEventBox('serialized-event-box'); mockGetEventValidCommitments(['serialized-commitment-box']); + mockGetEventWIDs(eventWIDs); // mock event payment and reward order generations mockEventSinglePayment({ @@ -1325,16 +1332,16 @@ describe('EventProcessor', () => { // mock four events and insert into db (different in firstTry column and type (payment, reward)) const firstTry1 = Math.round(currentTimeStamp / 1000) - Configs.eventTimeout - 100; - const mockedEvent1: EventTrigger = mockEventTrigger(); + const mockedEvent1: EventTrigger = mockEventTrigger().event; const firstTry2 = Math.round(currentTimeStamp / 1000) - Configs.eventTimeout + 100; - const mockedEvent2: EventTrigger = mockEventTrigger(); + const mockedEvent2: EventTrigger = mockEventTrigger().event; const firstTry3 = Math.round(currentTimeStamp / 1000) - Configs.eventTimeout + 100; - const mockedEvent3: EventTrigger = mockEventTrigger(); + const mockedEvent3: EventTrigger = mockEventTrigger().event; const firstTry4 = Math.round(currentTimeStamp / 1000) - Configs.eventTimeout - 100; - const mockedEvent4: EventTrigger = mockEventTrigger(); + const mockedEvent4: EventTrigger = mockEventTrigger().event; await DatabaseActionMock.insertEventRecord( mockedEvent1, EventStatus.pendingReward, @@ -1412,8 +1419,8 @@ describe('EventProcessor', () => { */ it('should mark timeout events as pending', async () => { // mock events - const mockedEvent1: EventTrigger = mockEventTrigger(); - const mockedEvent2: EventTrigger = mockEventTrigger(); + const mockedEvent1: EventTrigger = mockEventTrigger().event; + const mockedEvent2: EventTrigger = mockEventTrigger().event; await DatabaseActionMock.insertEventRecord( mockedEvent1, EventStatus.rewardWaiting diff --git a/tests/event/eventTestUtils.ts b/tests/event/eventTestUtils.ts index 1ac3a9bb..2bfb7f78 100644 --- a/tests/event/eventTestUtils.ts +++ b/tests/event/eventTestUtils.ts @@ -1,4 +1,11 @@ import { EventTrigger } from '@rosen-chains/abstract-chain'; +import TestUtils from '../testUtils/TestUtils'; +import { blake2b } from 'blakejs'; + +export type TestEventTrigger = { + event: EventTrigger; + WIDs: string[]; +}; /** * creates EventTrigger object @@ -17,9 +24,19 @@ export const createEventTrigger = ( sourceTxId: string, sourceBlockId: string, sourceChainHeight: number, - WIDs: string[] -): EventTrigger => { - return { + WIDsCount = 5, + WIDs?: string[] +): TestEventTrigger => { + const eventWIDs = WIDs + ? WIDs + : Array(WIDsCount) + .fill(0) + .map(() => TestUtils.generateRandomId()); + const WIDsHash = Buffer.from( + blake2b(Buffer.from(eventWIDs.join(''), 'hex'), undefined, 32) + ).toString('hex'); + + const event: EventTrigger = { height: height, fromChain: fromChain, toChain: toChain, @@ -33,6 +50,11 @@ export const createEventTrigger = ( sourceTxId: sourceTxId, sourceBlockId: sourceBlockId, sourceChainHeight: sourceChainHeight, - WIDs: WIDs, + WIDsHash: WIDsHash, + WIDsCount: WIDsCount, + }; + return { + event: event, + WIDs: eventWIDs, }; }; diff --git a/tests/event/mocked/EventBoxes.mock.ts b/tests/event/mocked/EventBoxes.mock.ts index 095d990e..65f8f9d8 100644 --- a/tests/event/mocked/EventBoxes.mock.ts +++ b/tests/event/mocked/EventBoxes.mock.ts @@ -18,4 +18,13 @@ const mockGetEventValidCommitments = (result: string[]) => { functionSpy.mockResolvedValue(result); }; -export { mockGetEventBox, mockGetEventValidCommitments }; +/** + * mocks EventBoxes.getEventWIDs to return `result` + * @param result + */ +const mockGetEventWIDs = (result: string[]) => { + const functionSpy = vi.spyOn(EventBoxes, 'getEventWIDs'); + functionSpy.mockResolvedValue(result); +}; + +export { mockGetEventBox, mockGetEventValidCommitments, mockGetEventWIDs }; diff --git a/tests/event/testData.ts b/tests/event/testData.ts index da36e94b..d3f3a229 100644 --- a/tests/event/testData.ts +++ b/tests/event/testData.ts @@ -1,8 +1,7 @@ import TestUtils from '../testUtils/TestUtils'; -import { EventTrigger } from '@rosen-chains/abstract-chain'; -import { createEventTrigger } from './eventTestUtils'; +import { TestEventTrigger, createEventTrigger } from './eventTestUtils'; -export const mockEventTrigger = (): EventTrigger => +export const mockEventTrigger = (): TestEventTrigger => createEventTrigger( 200, 'fromChain', @@ -16,13 +15,10 @@ export const mockEventTrigger = (): EventTrigger => 'targetToken', TestUtils.generateRandomId(), '', - 10000, - Array(5) - .fill(0) - .map(() => TestUtils.generateRandomId()) + 10000 ); -export const mockToErgoEventTrigger = (): EventTrigger => +export const mockToErgoEventTrigger = (): TestEventTrigger => createEventTrigger( 200, 'fromChain', @@ -36,13 +32,10 @@ export const mockToErgoEventTrigger = (): EventTrigger => 'targetToken', TestUtils.generateRandomId(), '', - 10000, - Array(5) - .fill(0) - .map(() => TestUtils.generateRandomId()) + 10000 ); -export const mockFromErgoEventTrigger = (): EventTrigger => +export const mockFromErgoEventTrigger = (): TestEventTrigger => createEventTrigger( 200, 'ergo', @@ -56,13 +49,10 @@ export const mockFromErgoEventTrigger = (): EventTrigger => 'targetToken', TestUtils.generateRandomId(), '', - 10000, - Array(5) - .fill(0) - .map(() => TestUtils.generateRandomId()) + 10000 ); -export const mockEventWithAmount = (amount: string): EventTrigger => +export const mockEventWithAmount = (amount: string): TestEventTrigger => createEventTrigger( 200, 'ergo', @@ -76,13 +66,10 @@ export const mockEventWithAmount = (amount: string): EventTrigger => 'targetToken', TestUtils.generateRandomId(), '', - 10000, - Array(5) - .fill(0) - .map(() => TestUtils.generateRandomId()) + 10000 ); -export const mockNativeTokenPaymentEvent = (): EventTrigger => +export const mockNativeTokenPaymentEvent = (): TestEventTrigger => createEventTrigger( 200, 'cardano', @@ -96,13 +83,10 @@ export const mockNativeTokenPaymentEvent = (): EventTrigger => 'erg', TestUtils.generateRandomId(), '', - 10000, - Array(5) - .fill(0) - .map(() => TestUtils.generateRandomId()) + 10000 ); -export const mockTokenPaymentEvent = (): EventTrigger => +export const mockTokenPaymentEvent = (): TestEventTrigger => createEventTrigger( 200, 'cardano', @@ -116,13 +100,10 @@ export const mockTokenPaymentEvent = (): EventTrigger => 'b37bfa41c2d9e61b4e478ddfc459a03d25b658a2305ffb428fbc47ad6abbeeaa', TestUtils.generateRandomId(), '', - 10000, - Array(5) - .fill(0) - .map(() => TestUtils.generateRandomId()) + 10000 ); -export const mockTokenPaymentFromErgoEvent = (): EventTrigger => +export const mockTokenPaymentFromErgoEvent = (): TestEventTrigger => createEventTrigger( 200, 'ergo', @@ -136,8 +117,5 @@ export const mockTokenPaymentFromErgoEvent = (): EventTrigger => 'bb2250e4c589539fd141fbbd2c322d380f1ce2aaef812cd87110d61b.527374434f4d4554565465737432', TestUtils.generateRandomId(), '', - 10000, - Array(5) - .fill(0) - .map(() => TestUtils.generateRandomId()) + 10000 ); diff --git a/tests/jobs/revenue.spec.ts b/tests/jobs/revenue.spec.ts index f72cbe0d..93c4823a 100644 --- a/tests/jobs/revenue.spec.ts +++ b/tests/jobs/revenue.spec.ts @@ -3,7 +3,6 @@ import { revenueJobFunction } from '../../src/jobs/revenue'; import ChainHandlerMock from '../handlers/ChainHandler.mock'; import { mockTokenPaymentEvent } from '../event/testData'; import TestUtils from '../testUtils/TestUtils'; -import { ConfirmationStatus } from '@rosen-chains/abstract-chain'; import { RevenueType } from '../../src/utils/constants'; import * as testData from './testData'; import { ERG } from '@rosen-chains/ergo'; @@ -41,7 +40,7 @@ describe('revenueJobFunction', () => { */ it('should store fraud revenues successfully', async () => { // mock event with spendTxId and spendBlockId - const mockedEvent = mockTokenPaymentEvent(); + const mockedEvent = mockTokenPaymentEvent().event; const spendTxId = TestUtils.generateRandomId(); const spendBlockId = TestUtils.generateRandomId(); const boxSerialized = 'boxSerialized'; @@ -120,7 +119,7 @@ describe('revenueJobFunction', () => { */ it('should store bridge-fee, emission and network-fee revenues successfully', async () => { // mock event with spendTxId and spendBlockId - const mockedEvent = mockTokenPaymentEvent(); + const mockedEvent = mockTokenPaymentEvent().event; const spendTxId = TestUtils.generateRandomId(); const spendBlockId = TestUtils.generateRandomId(); const boxSerialized = 'boxSerialized'; @@ -222,7 +221,7 @@ describe('revenueJobFunction', () => { */ it('should skip revenues of unconfirmed transactions', async () => { // mock event with spendTxId and spendBlockId - const mockedEvent = mockTokenPaymentEvent(); + const mockedEvent = mockTokenPaymentEvent().event; const spendTxId = TestUtils.generateRandomId(); const spendBlockId = TestUtils.generateRandomId(); const boxSerialized = 'boxSerialized'; diff --git a/tests/setup/setupTests.ts b/tests/setup/setupTests.ts index 0680a37c..4b32d3ad 100644 --- a/tests/setup/setupTests.ts +++ b/tests/setup/setupTests.ts @@ -1,3 +1,4 @@ +import '../../src/bootstrap'; import DatabaseActionMock from '../db/mocked/DatabaseAction.mock'; import TestConfigs from '../testUtils/TestConfigs'; import * as TestTransactionSerializer from '../../tests/transaction/TestTransactionSerializer'; diff --git a/tests/transaction/TransactionProcessor.spec.ts b/tests/transaction/TransactionProcessor.spec.ts index 88a1e2c8..6170b9f1 100644 --- a/tests/transaction/TransactionProcessor.spec.ts +++ b/tests/transaction/TransactionProcessor.spec.ts @@ -707,7 +707,7 @@ describe('TransactionProcessor', () => { */ it('should update tx status to completed and event status to pending-reward when payment tx is confirmed enough', async () => { // mock event and transaction and insert into db - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const tx = mockPaymentTransaction( TransactionType.payment, @@ -777,7 +777,7 @@ describe('TransactionProcessor', () => { */ it('should update tx status and event status to completed when Ergo payment tx is confirmed enough', async () => { // mock event and transaction and insert into db - const mockedEvent = EventTestData.mockToErgoEventTrigger(); + const mockedEvent = EventTestData.mockToErgoEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const tx = mockErgoPaymentTransaction(TransactionType.payment, eventId); await DatabaseActionMock.insertEventRecord( @@ -837,7 +837,7 @@ describe('TransactionProcessor', () => { */ it('should update tx status and event status to completed when reward distribution tx is confirmed enough', async () => { // mock event and transaction and insert into db - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const tx = mockErgoPaymentTransaction(TransactionType.reward, eventId); await DatabaseActionMock.insertEventRecord( @@ -948,7 +948,7 @@ describe('TransactionProcessor', () => { */ it('should update last check when transaction is not confirmed enough', async () => { // mock event and transaction and insert into db - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const tx = mockPaymentTransaction( TransactionType.payment, @@ -1010,7 +1010,7 @@ describe('TransactionProcessor', () => { */ it('should update last check when transaction is in mempool', async () => { // mock event and transaction and insert into db - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const tx = mockPaymentTransaction( TransactionType.payment, @@ -1076,7 +1076,7 @@ describe('TransactionProcessor', () => { */ it('should resubmit the transaction when not found but still valid', async () => { // mock event and transaction and insert into db - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const tx = mockPaymentTransaction( TransactionType.payment, @@ -1133,7 +1133,7 @@ describe('TransactionProcessor', () => { */ it('should update status to invalid when tx is not valid anymore', async () => { // mock event and transaction and insert into db - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const tx = mockPaymentTransaction( TransactionType.payment, @@ -1199,7 +1199,7 @@ describe('TransactionProcessor', () => { */ it('should update tx status to invalid and event status to pending-payment when payment tx is invalid', async () => { // mock event and transaction and insert into db - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const tx = mockPaymentTransaction( TransactionType.payment, @@ -1276,7 +1276,7 @@ describe('TransactionProcessor', () => { */ it('should update tx status to invalid and event status to pending-reward when reward distribution tx is invalid', async () => { // mock event and transaction and insert into db - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const tx = mockPaymentTransaction( TransactionType.reward, @@ -1463,7 +1463,7 @@ describe('TransactionProcessor', () => { */ it('should do nothing when there is not enough confirmation for invalid state', async () => { // mock event and transaction and insert into db - const mockedEvent = EventTestData.mockEventTrigger(); + const mockedEvent = EventTestData.mockEventTrigger().event; const eventId = EventSerializer.getId(mockedEvent); const tx = mockPaymentTransaction( TransactionType.reward, diff --git a/tests/utils/testData.ts b/tests/utils/testData.ts index 9cd8f15e..1f20047c 100644 --- a/tests/utils/testData.ts +++ b/tests/utils/testData.ts @@ -50,7 +50,8 @@ export const eventData = { sourceTxId: '2d564e25a63a01f5e25f4221f1f6b589f012bac8a5d8670271adcc51176cd602', sourceBlockId: '', - WIDs: '450c09eefeff63085416785a2b6e09ca7564d5a9802e138bc091009bfa8652dc,7ea5f96bc984ca1e90267b9b43933eedcf4b7af6c948155eef0baec6d7e91259,9d08b450337912e5be52cfa9ed72ecc64bd7ee8772292a252cf7db4b00398dbf,b97ed0d596bf00b34c3ac7d57bf979b1bffec2c240b03e05beccb4105cca16fd,5afb7f7c97a5d878ed6a9acd92c7ed5caecda2f0a2241d8e81315576c767e6f1', + WIDsHash: '02020aa2c82582685925e47d6a274c317694bd17ea33a8c7834241a8ce3f0505', + WIDsCount: 5, spendBlock: 'e2d9d21074da79af6cc0097f7ad1bc11f81f574c0c5da7f58602821f71868cd1', spendHeight: 13000, diff --git a/tests/verification/EventVerifier.spec.ts b/tests/verification/EventVerifier.spec.ts index f78e5dce..aadc6350 100644 --- a/tests/verification/EventVerifier.spec.ts +++ b/tests/verification/EventVerifier.spec.ts @@ -32,7 +32,7 @@ describe('EventVerifier', () => { * - returned value should be true */ it('should return true when event box and source tx are both confirmed', async () => { - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; // mock ChainHandler // mock Ergo `getHeight` such that event box is confirmed @@ -68,7 +68,7 @@ describe('EventVerifier', () => { * - returned value should be false */ it('should return true when event box is unconfirmed', async () => { - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; // mock Ergo `getHeight` such that event box is confirmed ChainHandlerMock.mockErgoFunctionReturnValue( @@ -99,7 +99,7 @@ describe('EventVerifier', () => { * - returned value should be false */ it('should return false when source tx is unconfirmed', async () => { - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; // mock ChainHandler // mock Ergo `getHeight` such that event box is confirmed @@ -154,7 +154,7 @@ describe('EventVerifier', () => { */ it('should verify event successfully', async () => { // insert a mocked event into db - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; const boxSerialized = 'boxSerialized'; await DatabaseActionMock.insertEventRecord(mockedEvent, boxSerialized); @@ -191,7 +191,7 @@ describe('EventVerifier', () => { */ it('should return false when event does not verify', async () => { // insert a mocked event into db - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; const boxSerialized = 'boxSerialized'; await DatabaseActionMock.insertEventRecord(mockedEvent, boxSerialized); @@ -228,7 +228,7 @@ describe('EventVerifier', () => { */ it('should return false when event RWT is wrong', async () => { // insert a mocked event into db - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; const boxSerialized = 'boxSerialized'; await DatabaseActionMock.insertEventRecord(mockedEvent, boxSerialized); diff --git a/tests/verification/RequestVerifier.spec.ts b/tests/verification/RequestVerifier.spec.ts index 315adb08..cffe8d5e 100644 --- a/tests/verification/RequestVerifier.spec.ts +++ b/tests/verification/RequestVerifier.spec.ts @@ -48,7 +48,7 @@ describe('RequestVerifier', () => { */ it('should return true when all conditions for payment tx are met', async () => { // mock event and transaction - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; const paymentTx = mockPaymentTransaction( TransactionType.payment, mockedEvent.toChain, @@ -102,7 +102,7 @@ describe('RequestVerifier', () => { */ it('should return false when event is not found', async () => { // mock event and transaction - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; const paymentTx = mockPaymentTransaction( TransactionType.payment, mockedEvent.toChain, @@ -151,7 +151,7 @@ describe('RequestVerifier', () => { */ it('should return false when event is not confirmed enough', async () => { // mock event and transaction - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; const paymentTx = mockPaymentTransaction( TransactionType.payment, mockedEvent.toChain, @@ -206,7 +206,7 @@ describe('RequestVerifier', () => { */ it('should return false when event is not verified', async () => { // mock event and transaction - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; const paymentTx = mockPaymentTransaction( TransactionType.payment, mockedEvent.toChain, @@ -261,7 +261,7 @@ describe('RequestVerifier', () => { */ it('should return false when event has already payment tx and pending reward', async () => { // mock event and transaction - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; const paymentTx = mockPaymentTransaction( TransactionType.payment, mockedEvent.toChain, @@ -316,7 +316,7 @@ describe('RequestVerifier', () => { */ it('should return false when event has already active tx', async () => { // mock event and two transactions - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; const paymentTx = mockPaymentTransaction( TransactionType.payment, mockedEvent.toChain, @@ -380,7 +380,7 @@ describe('RequestVerifier', () => { */ it("should return false when transaction doesn't satisfy the event", async () => { // mock event and transaction - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; const paymentTx = mockPaymentTransaction( TransactionType.payment, mockedEvent.toChain, diff --git a/tests/verification/TransactionVerifier.spec.ts b/tests/verification/TransactionVerifier.spec.ts index c318620b..ba9fdaff 100644 --- a/tests/verification/TransactionVerifier.spec.ts +++ b/tests/verification/TransactionVerifier.spec.ts @@ -221,7 +221,7 @@ describe('TransactionVerifier', () => { */ it('should return true when all conditions for payment tx are met', async () => { // mock event and transaction - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; const paymentTx = mockPaymentTransaction( TransactionType.payment, mockedEvent.toChain, @@ -269,6 +269,7 @@ describe('TransactionVerifier', () => { * @scenario * - mock event and two transactions * - insert event and payment transaction into database + * - insert event commitment boxes into db * - mock a PaymentOrder * - mock ChainHandler * - mock `extractTransactionOrder` to return mocked order @@ -281,20 +282,21 @@ describe('TransactionVerifier', () => { it('should return true when all conditions for reward distribution tx are met', async () => { // mock event and transaction const mockedEvent = mockEventTrigger(); + const eventId = EventSerializer.getId(mockedEvent.event); const paymentTx = mockPaymentTransaction( TransactionType.payment, - mockedEvent.toChain, - EventSerializer.getId(mockedEvent) + mockedEvent.event.toChain, + eventId ); const rewardTx = mockPaymentTransaction( TransactionType.reward, ERGO_CHAIN, - EventSerializer.getId(mockedEvent) + eventId ); // insert payment transaction into database await DatabaseActionMock.insertEventRecord( - mockedEvent, + mockedEvent.event, EventStatus.pendingReward ); await DatabaseActionMock.insertTxRecord( @@ -302,6 +304,19 @@ describe('TransactionVerifier', () => { TransactionStatus.completed ); + // insert event commitment boxes into db + for (let i = 1; i < mockedEvent.WIDs.length; i++) { + await DatabaseActionMock.insertCommitmentBoxRecord( + eventId, + Buffer.from(`event-serialized-box-${i}`).toString('base64'), + mockedEvent.WIDs[i], + mockedEvent.event.height - 4, + '1', + 'event-creation-tx-id', + i + ); + } + // mock a PaymentOrder const mockedOrder: PaymentOrder = [ { @@ -326,7 +341,7 @@ describe('TransactionVerifier', () => { // run test const result = await TransactionVerifier.verifyEventTransaction( rewardTx, - mockedEvent + mockedEvent.event ); // verify returned value @@ -352,7 +367,7 @@ describe('TransactionVerifier', () => { */ it('should return false when tx order is different from expected one', async () => { // mock event and transaction - const mockedEvent = mockEventTrigger(); + const mockedEvent = mockEventTrigger().event; const paymentTx = mockPaymentTransaction( TransactionType.payment, mockedEvent.toChain, @@ -989,7 +1004,7 @@ describe('TransactionVerifier', () => { */ it('should return false when one of transferring tokens is forbidden', async () => { // mock an event and insert mocked event into db as paymentWaiting - const event = mockTokenPaymentFromErgoEvent(); + const event = mockTokenPaymentFromErgoEvent().event; await DatabaseActionMock.insertEventRecord( event, EventStatus.paymentWaiting @@ -1067,7 +1082,7 @@ describe('TransactionVerifier', () => { */ it('should return true when only forbidden tokens remain more than high threshold', async () => { // mock an event and insert mocked event into db as paymentWaiting - const event = mockTokenPaymentFromErgoEvent(); + const event = mockTokenPaymentFromErgoEvent().event; await DatabaseActionMock.insertEventRecord( event, EventStatus.paymentWaiting