diff --git a/.eslintrc.js b/.eslintrc.js index bbc47fd2b..f5700ffbd 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -28,6 +28,7 @@ module.exports = { "semi": ["error"], "comma-dangle": ["error", "always-multiline"], "eol-last": ["error"], + "@typescript-eslint/await-thenable": "error", }, ignorePatterns: ['.eslintrc.js'], }; \ No newline at end of file diff --git a/.gitignore b/.gitignore index 0bee3489d..76a89ff85 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,5 @@ lerna-debug.log* # CS Environment variables src/test/chain-simulator/config/.env + +/load-tests \ No newline at end of file diff --git a/config/config.devnet.yaml b/config/config.devnet.yaml index 48ee28c9e..c00ca7f39 100644 --- a/config/config.devnet.yaml +++ b/config/config.devnet.yaml @@ -52,6 +52,10 @@ features: assetsFetch: enabled: true assetesUrl: 'https://tools.multiversx.com/assets-cdn' + mediaRedirect: + enabled: false + storageUrls: + - 'https://s3.amazonaws.com/devnet-media.elrond.com' auth: enabled: false maxExpirySeconds: 86400 @@ -64,6 +68,9 @@ features: enabled: false cronExpression: '*/5 * * * * *' activationEpoch: 1043 + chainAndromeda: + enabled: false + activationEpoch: 4 nodeEpochsLeft: enabled: false transactionProcessor: diff --git a/config/config.e2e.mainnet.yaml b/config/config.e2e.mainnet.yaml index ffccff8cb..57b050a6e 100644 --- a/config/config.e2e.mainnet.yaml +++ b/config/config.e2e.mainnet.yaml @@ -62,6 +62,9 @@ features: enabled: false cronExpression: '*/5 * * * * *' activationEpoch: 1391 + chainAndromeda: + enabled: false + activationEpoch: 4 nodeEpochsLeft: enabled: false transactionProcessor: diff --git a/config/config.mainnet.yaml b/config/config.mainnet.yaml index 0cd7f9202..d0b9035d0 100644 --- a/config/config.mainnet.yaml +++ b/config/config.mainnet.yaml @@ -62,6 +62,9 @@ features: enabled: false cronExpression: '*/5 * * * * *' activationEpoch: 1391 + chainAndromeda: + enabled: false + activationEpoch: 4 nodeEpochsLeft: enabled: false transactionProcessor: @@ -109,6 +112,10 @@ features: assetsFetch: enabled: true assetesUrl: 'https://tools.multiversx.com/assets-cdn' + mediaRedirect: + enabled: false + storageUrls: + - 'https://s3.amazonaws.com/media.elrond.com' image: width: 600 height: 600 diff --git a/config/config.testnet.yaml b/config/config.testnet.yaml index 13f244dc4..eaf43d498 100644 --- a/config/config.testnet.yaml +++ b/config/config.testnet.yaml @@ -61,6 +61,9 @@ features: enabled: false cronExpression: '*/5 * * * * *' activationEpoch: 1043 + chainAndromeda: + enabled: false + activationEpoch: 4 nodeEpochsLeft: enabled: false transactionProcessor: @@ -108,6 +111,10 @@ features: assetsFetch: enabled: true assetesUrl: 'https://tools.multiversx.com/assets-cdn' + mediaRedirect: + enabled: false + storageUrls: + - 'https://s3.amazonaws.com/testnet-media.elrond.com' image: width: 600 height: 600 diff --git a/package-lock.json b/package-lock.json index 47018a3ed..956c7e19e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,21 +10,19 @@ "license": "UNLICENSED", "dependencies": { "@aws-sdk/client-s3": "^3.54.0", - "@elrondnetwork/erdjs-dex": "^0.2.12-alpha", - "@elrondnetwork/native-auth": "^0.1.19", - "@elrondnetwork/transaction-processor": "^0.1.26", "@golevelup/nestjs-rabbitmq": "^4.0.0", "@multiversx/sdk-core": "^13.2.2", "@multiversx/sdk-data-api-client": "^0.7.0", - "@multiversx/sdk-nestjs-auth": "4.0.1", - "@multiversx/sdk-nestjs-cache": "4.0.1", - "@multiversx/sdk-nestjs-common": "4.0.1", - "@multiversx/sdk-nestjs-elastic": "^4.0.1", - "@multiversx/sdk-nestjs-http": "4.0.1", - "@multiversx/sdk-nestjs-monitoring": "4.0.1", - "@multiversx/sdk-nestjs-rabbitmq": "4.0.1", - "@multiversx/sdk-nestjs-redis": "4.0.1", - "@multiversx/sdk-wallet": "^4.0.0", + "@multiversx/sdk-exchange": "^0.2.21", + "@multiversx/sdk-nestjs-auth": "5.0.0", + "@multiversx/sdk-nestjs-cache": "5.0.0", + "@multiversx/sdk-nestjs-common": "5.0.0", + "@multiversx/sdk-nestjs-elastic": "5.0.0", + "@multiversx/sdk-nestjs-http": "5.0.0", + "@multiversx/sdk-nestjs-monitoring": "5.0.0", + "@multiversx/sdk-nestjs-rabbitmq": "5.0.0", + "@multiversx/sdk-nestjs-redis": "5.0.0", + "@multiversx/sdk-transaction-processor": "^0.1.35", "@nestjs/apollo": "12.0.11", "@nestjs/common": "10.2.0", "@nestjs/config": "3.0.1", @@ -32,6 +30,7 @@ "@nestjs/event-emitter": "^2.0.3", "@nestjs/graphql": "^12.0.11", "@nestjs/microservices": "10.2.4", + "@nestjs/mongoose": "^11.0.3", "@nestjs/platform-express": "10.2.4", "@nestjs/platform-socket.io": "10.2.4", "@nestjs/schedule": "3.0.3", @@ -132,9 +131,9 @@ } }, "node_modules/@adobe/css-tools": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", - "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.2.tgz", + "integrity": "sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A==", "dev": true }, "node_modules/@ampproject/remapping": { @@ -176,6 +175,15 @@ } } }, + "node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@angular-devkit/schematics": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.0.tgz", @@ -259,6 +267,15 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@apollo/cache-control-types": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@apollo/cache-control-types/-/cache-control-types-1.0.3.tgz", @@ -293,15 +310,15 @@ } }, "node_modules/@apollo/server": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@apollo/server/-/server-4.11.0.tgz", - "integrity": "sha512-SWDvbbs0wl2zYhKG6aGLxwTJ72xpqp0awb2lotNpfezd9VcAvzaUizzKQqocephin2uMoaA8MguoyBmgtPzNWw==", + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@apollo/server/-/server-4.11.3.tgz", + "integrity": "sha512-mW8idE2q0/BN14mimfJU5DAnoPHZRrAWgwsVLBEdACds+mxapIYxIbI6AH4AsOpxfrpvHts3PCYDbopy1XPW1g==", "peer": true, "dependencies": { "@apollo/cache-control-types": "^1.0.3", "@apollo/server-gateway-interface": "^1.1.1", "@apollo/usage-reporting-protobuf": "^4.1.1", - "@apollo/utils.createhash": "^2.0.0", + "@apollo/utils.createhash": "^2.0.2", "@apollo/utils.fetcher": "^2.0.0", "@apollo/utils.isnodelike": "^2.0.0", "@apollo/utils.keyvaluecache": "^2.1.0", @@ -314,7 +331,7 @@ "@types/node-fetch": "^2.6.1", "async-retry": "^1.2.1", "cors": "^2.8.5", - "express": "^4.17.1", + "express": "^4.21.1", "loglevel": "^1.6.8", "lru-cache": "^7.10.1", "negotiator": "^0.6.3", @@ -369,9 +386,9 @@ } }, "node_modules/@apollo/utils.createhash": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@apollo/utils.createhash/-/utils.createhash-2.0.1.tgz", - "integrity": "sha512-fQO4/ZOP8LcXWvMNhKiee+2KuKyqIcfHrICA+M4lj/h/Lh1H10ICcUtk6N/chnEo5HXu0yejg64wshdaiFitJg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@apollo/utils.createhash/-/utils.createhash-2.0.2.tgz", + "integrity": "sha512-UkS3xqnVFLZ3JFpEmU/2cM2iKJotQXMoSTgxXsfQgXLC5gR1WaepoXagmYnPSA7Q/2cmnyTYK5OgAgoC4RULPg==", "peer": true, "dependencies": { "@apollo/utils.isnodelike": "^2.0.1", @@ -783,660 +800,600 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.679.0.tgz", - "integrity": "sha512-P93tUbJXiDtSPgBfFpnjaijLV38hyPlE3g0XybsPTmSYNV6A9Jt1TUIF6vX+o6LdFuq3FerCiagUjhfDANWkAw==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.775.0.tgz", + "integrity": "sha512-Z/BeVmYc3nj4FNE46MtvBYeCVvBZwlujMEvr5UOChP14899QWkBfOvf74RwQY9qy5/DvhVFkHlA8en1L6+0NrA==", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.679.0", - "@aws-sdk/client-sts": "3.679.0", - "@aws-sdk/core": "3.679.0", - "@aws-sdk/credential-provider-node": "3.679.0", - "@aws-sdk/middleware-bucket-endpoint": "3.679.0", - "@aws-sdk/middleware-expect-continue": "3.679.0", - "@aws-sdk/middleware-flexible-checksums": "3.679.0", - "@aws-sdk/middleware-host-header": "3.679.0", - "@aws-sdk/middleware-location-constraint": "3.679.0", - "@aws-sdk/middleware-logger": "3.679.0", - "@aws-sdk/middleware-recursion-detection": "3.679.0", - "@aws-sdk/middleware-sdk-s3": "3.679.0", - "@aws-sdk/middleware-ssec": "3.679.0", - "@aws-sdk/middleware-user-agent": "3.679.0", - "@aws-sdk/region-config-resolver": "3.679.0", - "@aws-sdk/signature-v4-multi-region": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@aws-sdk/util-endpoints": "3.679.0", - "@aws-sdk/util-user-agent-browser": "3.679.0", - "@aws-sdk/util-user-agent-node": "3.679.0", - "@aws-sdk/xml-builder": "3.679.0", - "@smithy/config-resolver": "^3.0.9", - "@smithy/core": "^2.4.8", - "@smithy/eventstream-serde-browser": "^3.0.10", - "@smithy/eventstream-serde-config-resolver": "^3.0.7", - "@smithy/eventstream-serde-node": "^3.0.9", - "@smithy/fetch-http-handler": "^3.2.9", - "@smithy/hash-blob-browser": "^3.1.6", - "@smithy/hash-node": "^3.0.7", - "@smithy/hash-stream-node": "^3.1.6", - "@smithy/invalid-dependency": "^3.0.7", - "@smithy/md5-js": "^3.0.7", - "@smithy/middleware-content-length": "^3.0.9", - "@smithy/middleware-endpoint": "^3.1.4", - "@smithy/middleware-retry": "^3.0.23", - "@smithy/middleware-serde": "^3.0.7", - "@smithy/middleware-stack": "^3.0.7", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/node-http-handler": "^3.2.4", - "@smithy/protocol-http": "^4.1.4", - "@smithy/smithy-client": "^3.4.0", - "@smithy/types": "^3.5.0", - "@smithy/url-parser": "^3.0.7", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.23", - "@smithy/util-defaults-mode-node": "^3.0.23", - "@smithy/util-endpoints": "^2.1.3", - "@smithy/util-middleware": "^3.0.7", - "@smithy/util-retry": "^3.0.7", - "@smithy/util-stream": "^3.1.9", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.6", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/credential-provider-node": "3.775.0", + "@aws-sdk/middleware-bucket-endpoint": "3.775.0", + "@aws-sdk/middleware-expect-continue": "3.775.0", + "@aws-sdk/middleware-flexible-checksums": "3.775.0", + "@aws-sdk/middleware-host-header": "3.775.0", + "@aws-sdk/middleware-location-constraint": "3.775.0", + "@aws-sdk/middleware-logger": "3.775.0", + "@aws-sdk/middleware-recursion-detection": "3.775.0", + "@aws-sdk/middleware-sdk-s3": "3.775.0", + "@aws-sdk/middleware-ssec": "3.775.0", + "@aws-sdk/middleware-user-agent": "3.775.0", + "@aws-sdk/region-config-resolver": "3.775.0", + "@aws-sdk/signature-v4-multi-region": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@aws-sdk/util-endpoints": "3.775.0", + "@aws-sdk/util-user-agent-browser": "3.775.0", + "@aws-sdk/util-user-agent-node": "3.775.0", + "@aws-sdk/xml-builder": "3.775.0", + "@smithy/config-resolver": "^4.1.0", + "@smithy/core": "^3.2.0", + "@smithy/eventstream-serde-browser": "^4.0.2", + "@smithy/eventstream-serde-config-resolver": "^4.1.0", + "@smithy/eventstream-serde-node": "^4.0.2", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/hash-blob-browser": "^4.0.2", + "@smithy/hash-node": "^4.0.2", + "@smithy/hash-stream-node": "^4.0.2", + "@smithy/invalid-dependency": "^4.0.2", + "@smithy/md5-js": "^4.0.2", + "@smithy/middleware-content-length": "^4.0.2", + "@smithy/middleware-endpoint": "^4.1.0", + "@smithy/middleware-retry": "^4.1.0", + "@smithy/middleware-serde": "^4.0.3", + "@smithy/middleware-stack": "^4.0.2", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", + "@smithy/url-parser": "^4.0.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.8", + "@smithy/util-defaults-mode-node": "^4.0.8", + "@smithy/util-endpoints": "^3.0.2", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-retry": "^4.0.2", + "@smithy/util-stream": "^4.2.0", + "@smithy/util-utf8": "^4.0.0", + "@smithy/util-waiter": "^4.0.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.679.0.tgz", - "integrity": "sha512-/0cAvYnpOZTo/Y961F1kx2fhDDLUYZ0SQQ5/75gh3xVImLj7Zw+vp74ieqFbqWLYGMaq8z1Arr9A8zG95mbLdg==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.679.0", - "@aws-sdk/middleware-host-header": "3.679.0", - "@aws-sdk/middleware-logger": "3.679.0", - "@aws-sdk/middleware-recursion-detection": "3.679.0", - "@aws-sdk/middleware-user-agent": "3.679.0", - "@aws-sdk/region-config-resolver": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@aws-sdk/util-endpoints": "3.679.0", - "@aws-sdk/util-user-agent-browser": "3.679.0", - "@aws-sdk/util-user-agent-node": "3.679.0", - "@smithy/config-resolver": "^3.0.9", - "@smithy/core": "^2.4.8", - "@smithy/fetch-http-handler": "^3.2.9", - "@smithy/hash-node": "^3.0.7", - "@smithy/invalid-dependency": "^3.0.7", - "@smithy/middleware-content-length": "^3.0.9", - "@smithy/middleware-endpoint": "^3.1.4", - "@smithy/middleware-retry": "^3.0.23", - "@smithy/middleware-serde": "^3.0.7", - "@smithy/middleware-stack": "^3.0.7", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/node-http-handler": "^3.2.4", - "@smithy/protocol-http": "^4.1.4", - "@smithy/smithy-client": "^3.4.0", - "@smithy/types": "^3.5.0", - "@smithy/url-parser": "^3.0.7", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.23", - "@smithy/util-defaults-mode-node": "^3.0.23", - "@smithy/util-endpoints": "^2.1.3", - "@smithy/util-middleware": "^3.0.7", - "@smithy/util-retry": "^3.0.7", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.679.0.tgz", - "integrity": "sha512-/dBYWcCwbA/id4sFCIVZvf0UsvzHCC68SryxeNQk/PDkY9N4n5yRcMUkZDaEyQCjowc3kY4JOXp2AdUP037nhA==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.679.0", - "@aws-sdk/credential-provider-node": "3.679.0", - "@aws-sdk/middleware-host-header": "3.679.0", - "@aws-sdk/middleware-logger": "3.679.0", - "@aws-sdk/middleware-recursion-detection": "3.679.0", - "@aws-sdk/middleware-user-agent": "3.679.0", - "@aws-sdk/region-config-resolver": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@aws-sdk/util-endpoints": "3.679.0", - "@aws-sdk/util-user-agent-browser": "3.679.0", - "@aws-sdk/util-user-agent-node": "3.679.0", - "@smithy/config-resolver": "^3.0.9", - "@smithy/core": "^2.4.8", - "@smithy/fetch-http-handler": "^3.2.9", - "@smithy/hash-node": "^3.0.7", - "@smithy/invalid-dependency": "^3.0.7", - "@smithy/middleware-content-length": "^3.0.9", - "@smithy/middleware-endpoint": "^3.1.4", - "@smithy/middleware-retry": "^3.0.23", - "@smithy/middleware-serde": "^3.0.7", - "@smithy/middleware-stack": "^3.0.7", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/node-http-handler": "^3.2.4", - "@smithy/protocol-http": "^4.1.4", - "@smithy/smithy-client": "^3.4.0", - "@smithy/types": "^3.5.0", - "@smithy/url-parser": "^3.0.7", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.23", - "@smithy/util-defaults-mode-node": "^3.0.23", - "@smithy/util-endpoints": "^2.1.3", - "@smithy/util-middleware": "^3.0.7", - "@smithy/util-retry": "^3.0.7", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.679.0" - } - }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.679.0.tgz", - "integrity": "sha512-3CvrT8w1RjFu1g8vKA5Azfr5V83r2/b68Ock43WE003Bq/5Y38mwmYX7vk0fPHzC3qejt4YMAWk/C3fSKOy25g==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.775.0.tgz", + "integrity": "sha512-vqG1S2ap77WP4D5qt4bEPE0duQ4myN+cDr1NeP8QpSTajetbkDGVo7h1VViYMcUoFUVWBj6Qf1X1VfOq+uaxbA==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.679.0", - "@aws-sdk/core": "3.679.0", - "@aws-sdk/credential-provider-node": "3.679.0", - "@aws-sdk/middleware-host-header": "3.679.0", - "@aws-sdk/middleware-logger": "3.679.0", - "@aws-sdk/middleware-recursion-detection": "3.679.0", - "@aws-sdk/middleware-user-agent": "3.679.0", - "@aws-sdk/region-config-resolver": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@aws-sdk/util-endpoints": "3.679.0", - "@aws-sdk/util-user-agent-browser": "3.679.0", - "@aws-sdk/util-user-agent-node": "3.679.0", - "@smithy/config-resolver": "^3.0.9", - "@smithy/core": "^2.4.8", - "@smithy/fetch-http-handler": "^3.2.9", - "@smithy/hash-node": "^3.0.7", - "@smithy/invalid-dependency": "^3.0.7", - "@smithy/middleware-content-length": "^3.0.9", - "@smithy/middleware-endpoint": "^3.1.4", - "@smithy/middleware-retry": "^3.0.23", - "@smithy/middleware-serde": "^3.0.7", - "@smithy/middleware-stack": "^3.0.7", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/node-http-handler": "^3.2.4", - "@smithy/protocol-http": "^4.1.4", - "@smithy/smithy-client": "^3.4.0", - "@smithy/types": "^3.5.0", - "@smithy/url-parser": "^3.0.7", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.23", - "@smithy/util-defaults-mode-node": "^3.0.23", - "@smithy/util-endpoints": "^2.1.3", - "@smithy/util-middleware": "^3.0.7", - "@smithy/util-retry": "^3.0.7", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/middleware-host-header": "3.775.0", + "@aws-sdk/middleware-logger": "3.775.0", + "@aws-sdk/middleware-recursion-detection": "3.775.0", + "@aws-sdk/middleware-user-agent": "3.775.0", + "@aws-sdk/region-config-resolver": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@aws-sdk/util-endpoints": "3.775.0", + "@aws-sdk/util-user-agent-browser": "3.775.0", + "@aws-sdk/util-user-agent-node": "3.775.0", + "@smithy/config-resolver": "^4.1.0", + "@smithy/core": "^3.2.0", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/hash-node": "^4.0.2", + "@smithy/invalid-dependency": "^4.0.2", + "@smithy/middleware-content-length": "^4.0.2", + "@smithy/middleware-endpoint": "^4.1.0", + "@smithy/middleware-retry": "^4.1.0", + "@smithy/middleware-serde": "^4.0.3", + "@smithy/middleware-stack": "^4.0.2", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", + "@smithy/url-parser": "^4.0.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.8", + "@smithy/util-defaults-mode-node": "^4.0.8", + "@smithy/util-endpoints": "^3.0.2", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-retry": "^4.0.2", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/core": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.679.0.tgz", - "integrity": "sha512-CS6PWGX8l4v/xyvX8RtXnBisdCa5+URzKd0L6GvHChype9qKUVxO/Gg6N/y43Hvg7MNWJt9FBPNWIxUB+byJwg==", - "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/core": "^2.4.8", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/property-provider": "^3.1.7", - "@smithy/protocol-http": "^4.1.4", - "@smithy/signature-v4": "^4.2.0", - "@smithy/smithy-client": "^3.4.0", - "@smithy/types": "^3.5.0", - "@smithy/util-middleware": "^3.0.7", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.775.0.tgz", + "integrity": "sha512-8vpW4WihVfz0DX+7WnnLGm3GuQER++b0IwQG35JlQMlgqnc44M//KbJPsIHA0aJUJVwJAEShgfr5dUbY8WUzaA==", + "dependencies": { + "@aws-sdk/types": "3.775.0", + "@smithy/core": "^3.2.0", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/property-provider": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/signature-v4": "^5.0.2", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", + "@smithy/util-middleware": "^4.0.2", "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.679.0.tgz", - "integrity": "sha512-EdlTYbzMm3G7VUNAMxr9S1nC1qUNqhKlAxFU8E7cKsAe8Bp29CD5HAs3POc56AVo9GC4yRIS+/mtlZSmrckzUA==", - "dependencies": { - "@aws-sdk/core": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/property-provider": "^3.1.7", - "@smithy/types": "^3.5.0", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.775.0.tgz", + "integrity": "sha512-6ESVxwCbGm7WZ17kY1fjmxQud43vzJFoLd4bmlR+idQSWdqlzGDYdcfzpjDKTcivdtNrVYmFvcH1JBUwCRAZhw==", + "dependencies": { + "@aws-sdk/core": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.679.0.tgz", - "integrity": "sha512-ZoKLubW5DqqV1/2a3TSn+9sSKg0T8SsYMt1JeirnuLJF0mCoYFUaWMyvxxKuxPoqvUsaycxKru4GkpJ10ltNBw==", - "dependencies": { - "@aws-sdk/core": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/fetch-http-handler": "^3.2.9", - "@smithy/node-http-handler": "^3.2.4", - "@smithy/property-provider": "^3.1.7", - "@smithy/protocol-http": "^4.1.4", - "@smithy/smithy-client": "^3.4.0", - "@smithy/types": "^3.5.0", - "@smithy/util-stream": "^3.1.9", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.775.0.tgz", + "integrity": "sha512-PjDQeDH/J1S0yWV32wCj2k5liRo0ssXMseCBEkCsD3SqsU8o5cU82b0hMX4sAib/RkglCSZqGO0xMiN0/7ndww==", + "dependencies": { + "@aws-sdk/core": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/property-provider": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", + "@smithy/util-stream": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.679.0.tgz", - "integrity": "sha512-Rg7t8RwUzKcumpipG4neZqaeJ6DF+Bco1+FHn5BZB68jpvwvjBjcQUuWkxj18B6ctYHr1fkunnzeKEn/+vy7+w==", - "dependencies": { - "@aws-sdk/core": "3.679.0", - "@aws-sdk/credential-provider-env": "3.679.0", - "@aws-sdk/credential-provider-http": "3.679.0", - "@aws-sdk/credential-provider-process": "3.679.0", - "@aws-sdk/credential-provider-sso": "3.679.0", - "@aws-sdk/credential-provider-web-identity": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/credential-provider-imds": "^3.2.4", - "@smithy/property-provider": "^3.1.7", - "@smithy/shared-ini-file-loader": "^3.1.8", - "@smithy/types": "^3.5.0", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.775.0.tgz", + "integrity": "sha512-0gJc6cALsgrjeC5U3qDjbz4myIC/j49+gPz9nkvY+C0OYWt1KH1tyfiZUuCRGfuFHhQ+3KMMDSL229TkBP3E7g==", + "dependencies": { + "@aws-sdk/core": "3.775.0", + "@aws-sdk/credential-provider-env": "3.775.0", + "@aws-sdk/credential-provider-http": "3.775.0", + "@aws-sdk/credential-provider-process": "3.775.0", + "@aws-sdk/credential-provider-sso": "3.775.0", + "@aws-sdk/credential-provider-web-identity": "3.775.0", + "@aws-sdk/nested-clients": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@smithy/credential-provider-imds": "^4.0.2", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.679.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.679.0.tgz", - "integrity": "sha512-E3lBtaqCte8tWs6Rkssc8sLzvGoJ10TLGvpkijOlz43wPd6xCRh1YLwg6zolf9fVFtEyUs/GsgymiASOyxhFtw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.679.0", - "@aws-sdk/credential-provider-http": "3.679.0", - "@aws-sdk/credential-provider-ini": "3.679.0", - "@aws-sdk/credential-provider-process": "3.679.0", - "@aws-sdk/credential-provider-sso": "3.679.0", - "@aws-sdk/credential-provider-web-identity": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/credential-provider-imds": "^3.2.4", - "@smithy/property-provider": "^3.1.7", - "@smithy/shared-ini-file-loader": "^3.1.8", - "@smithy/types": "^3.5.0", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.775.0.tgz", + "integrity": "sha512-D8Zre5W2sXC/ANPqCWPqwYpU1cKY9DF6ckFZyDrqlcBC0gANgpY6fLrBtYo2fwJsbj+1A24iIpBINV7erdprgA==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.775.0", + "@aws-sdk/credential-provider-http": "3.775.0", + "@aws-sdk/credential-provider-ini": "3.775.0", + "@aws-sdk/credential-provider-process": "3.775.0", + "@aws-sdk/credential-provider-sso": "3.775.0", + "@aws-sdk/credential-provider-web-identity": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@smithy/credential-provider-imds": "^4.0.2", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.679.0.tgz", - "integrity": "sha512-u/p4TV8kQ0zJWDdZD4+vdQFTMhkDEJFws040Gm113VHa/Xo1SYOjbpvqeuFoz6VmM0bLvoOWjxB9MxnSQbwKpQ==", - "dependencies": { - "@aws-sdk/core": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/property-provider": "^3.1.7", - "@smithy/shared-ini-file-loader": "^3.1.8", - "@smithy/types": "^3.5.0", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.775.0.tgz", + "integrity": "sha512-A6k68H9rQp+2+7P7SGO90Csw6nrUEm0Qfjpn9Etc4EboZhhCLs9b66umUsTsSBHus4FDIe5JQxfCUyt1wgNogg==", + "dependencies": { + "@aws-sdk/core": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.679.0.tgz", - "integrity": "sha512-SAtWonhi9asxn0ukEbcE81jkyanKgqpsrtskvYPpO9Z9KOednM4Cqt6h1bfcS9zaHjN2zu815Gv8O7WiV+F/DQ==", - "dependencies": { - "@aws-sdk/client-sso": "3.679.0", - "@aws-sdk/core": "3.679.0", - "@aws-sdk/token-providers": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/property-provider": "^3.1.7", - "@smithy/shared-ini-file-loader": "^3.1.8", - "@smithy/types": "^3.5.0", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.775.0.tgz", + "integrity": "sha512-du06V7u9HDmRuwZnRjf85shO3dffeKOkQplV5/2vf3LgTPNEI9caNomi/cCGyxKGOeSUHAKrQ1HvpPfOaI6t5Q==", + "dependencies": { + "@aws-sdk/client-sso": "3.775.0", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/token-providers": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.679.0.tgz", - "integrity": "sha512-a74tLccVznXCaBefWPSysUcLXYJiSkeUmQGtalNgJ1vGkE36W5l/8czFiiowdWdKWz7+x6xf0w+Kjkjlj42Ung==", - "dependencies": { - "@aws-sdk/core": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/property-provider": "^3.1.7", - "@smithy/types": "^3.5.0", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.775.0.tgz", + "integrity": "sha512-z4XLYui5aHsr78mbd5BtZfm55OM5V55qK/X17OPrEqjYDDk3GlI8Oe2ZjTmOVrKwMpmzXKhsakeFHKfDyOvv1A==", + "dependencies": { + "@aws-sdk/core": "3.775.0", + "@aws-sdk/nested-clients": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.679.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.679.0.tgz", - "integrity": "sha512-5EpiPhhGgnF+uJR4DzWUk6Lx3pOn9oM6JGXxeHsiynfoBfq7vHMleq+uABHHSQS+y7XzbyZ7x8tXNQlliMwOsg==", - "dependencies": { - "@aws-sdk/types": "3.679.0", - "@aws-sdk/util-arn-parser": "3.679.0", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/protocol-http": "^4.1.4", - "@smithy/types": "^3.5.0", - "@smithy/util-config-provider": "^3.0.0", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.775.0.tgz", + "integrity": "sha512-qogMIpVChDYr4xiUNC19/RDSw/sKoHkAhouS6Skxiy6s27HBhow1L3Z1qVYXuBmOZGSWPU0xiyZCvOyWrv9s+Q==", + "dependencies": { + "@aws-sdk/types": "3.775.0", + "@aws-sdk/util-arn-parser": "3.723.0", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", + "@smithy/util-config-provider": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.679.0.tgz", - "integrity": "sha512-nYsh9PdWrF4EahTRdXHGlNud82RPc508CNGdh1lAGfPU3tNveGfMBX3PcGBtPOse3p9ebNKRWVmUc9eXSjGvHA==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.775.0.tgz", + "integrity": "sha512-Apd3owkIeUW5dnk3au9np2IdW2N0zc9NjTjHiH+Mx3zqwSrc+m+ANgJVgk9mnQjMzU/vb7VuxJ0eqdEbp5gYsg==", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/protocol-http": "^4.1.4", - "@smithy/types": "^3.5.0", + "@aws-sdk/types": "3.775.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.679.0.tgz", - "integrity": "sha512-2Nf3rnrcog3GRRdXxc623wkQPH3WXhz8oZ+KHuXBeBKX01zbp7bz22QAZKqw3Oo2lv+LQNEDzIfQYn7leXLZGQ==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.775.0.tgz", + "integrity": "sha512-OmHLfRIb7IIXsf9/X/pMOlcSV3gzW/MmtPSZTkrz5jCTKzWXd7eRoyOJqewjsaC6KMAxIpNU77FoAd16jOZ21A==", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", - "@aws-sdk/core": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/protocol-http": "^4.1.4", - "@smithy/types": "^3.5.0", - "@smithy/util-middleware": "^3.0.7", - "@smithy/util-utf8": "^3.0.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-stream": "^4.2.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.679.0.tgz", - "integrity": "sha512-y176HuQ8JRY3hGX8rQzHDSbCl9P5Ny9l16z4xmaiLo+Qfte7ee4Yr3yaAKd7GFoJ3/Mhud2XZ37fR015MfYl2w==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.775.0.tgz", + "integrity": "sha512-tkSegM0Z6WMXpLB8oPys/d+umYIocvO298mGvcMCncpRl77L9XkvSLJIFzaHes+o7djAgIduYw8wKIMStFss2w==", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/protocol-http": "^4.1.4", - "@smithy/types": "^3.5.0", + "@aws-sdk/types": "3.775.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.679.0.tgz", - "integrity": "sha512-SA1C1D3XgoKTGxyNsOqd016ONpk46xJLWDgJUd00Zb21Ox5wYCoY6aDRKiaMRW+1VfCJdezs1Do3XLyIU9KxyA==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.775.0.tgz", + "integrity": "sha512-8TMXEHZXZTFTckQLyBT5aEI8fX11HZcwZseRifvBKKpj0RZDk4F0EEYGxeNSPpUQ7n+PRWyfAEnnZNRdAj/1NQ==", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/types": "^3.5.0", + "@aws-sdk/types": "3.775.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.679.0.tgz", - "integrity": "sha512-0vet8InEj7nvIvGKk+ch7bEF5SyZ7Us9U7YTEgXPrBNStKeRUsgwRm0ijPWWd0a3oz2okaEwXsFl7G/vI0XiEA==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.775.0.tgz", + "integrity": "sha512-FaxO1xom4MAoUJsldmR92nT1G6uZxTdNYOFYtdHfd6N2wcNaTuxgjIvqzg5y7QIH9kn58XX/dzf1iTjgqUStZw==", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/types": "^3.5.0", + "@aws-sdk/types": "3.775.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.679.0.tgz", - "integrity": "sha512-sQoAZFsQiW/LL3DfKMYwBoGjYDEnMbA9WslWN8xneCmBAwKo6IcSksvYs23PP8XMIoBGe2I2J9BSr654XWygTQ==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.775.0.tgz", + "integrity": "sha512-GLCzC8D0A0YDG5u3F5U03Vb9j5tcOEFhr8oc6PDk0k0vm5VwtZOE6LvK7hcCSoAB4HXyOUM0sQuXrbaAh9OwXA==", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/protocol-http": "^4.1.4", - "@smithy/types": "^3.5.0", + "@aws-sdk/types": "3.775.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.679.0.tgz", - "integrity": "sha512-4zcT193F7RkEfqlS6ZdwyNQ0UUp9s66msNXgItugasTbjf7oqfWDas7N+BG8ADB/Ql3wvRUh9I+zdrVkxxw3BQ==", - "dependencies": { - "@aws-sdk/core": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@aws-sdk/util-arn-parser": "3.679.0", - "@smithy/core": "^2.4.8", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/protocol-http": "^4.1.4", - "@smithy/signature-v4": "^4.2.0", - "@smithy/smithy-client": "^3.4.0", - "@smithy/types": "^3.5.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.7", - "@smithy/util-stream": "^3.1.9", - "@smithy/util-utf8": "^3.0.0", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.775.0.tgz", + "integrity": "sha512-zsvcu7cWB28JJ60gVvjxPCI7ZU7jWGcpNACPiZGyVtjYXwcxyhXbYEVDSWKsSA6ERpz9XrpLYod8INQWfW3ECg==", + "dependencies": { + "@aws-sdk/core": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@aws-sdk/util-arn-parser": "3.723.0", + "@smithy/core": "^3.2.0", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/signature-v4": "^5.0.2", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-stream": "^4.2.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.679.0.tgz", - "integrity": "sha512-4GNUxXbs1M71uFHRiCAZtN0/g23ogI9YjMe5isAuYMHXwDB3MhqF7usKf954mBP6tplvN44vYlbJ84faaLrTtg==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.775.0.tgz", + "integrity": "sha512-Iw1RHD8vfAWWPzBBIKaojO4GAvQkHOYIpKdAfis/EUSUmSa79QsnXnRqsdcE0mCB0Ylj23yi+ah4/0wh9FsekA==", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/types": "^3.5.0", + "@aws-sdk/types": "3.775.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.679.0.tgz", - "integrity": "sha512-4hdeXhPDURPqQLPd9jCpUEo9fQITXl3NM3W1MwcJpE0gdUM36uXkQOYsTPeeU/IRCLVjK8Htlh2oCaM9iJrLCA==", - "dependencies": { - "@aws-sdk/core": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@aws-sdk/util-endpoints": "3.679.0", - "@smithy/core": "^2.4.8", - "@smithy/protocol-http": "^4.1.4", - "@smithy/types": "^3.5.0", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.775.0.tgz", + "integrity": "sha512-7Lffpr1ptOEDE1ZYH1T78pheEY1YmeXWBfFt/amZ6AGsKSLG+JPXvof3ltporTGR2bhH/eJPo7UHCglIuXfzYg==", + "dependencies": { + "@aws-sdk/core": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@aws-sdk/util-endpoints": "3.775.0", + "@smithy/core": "^3.2.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.775.0.tgz", + "integrity": "sha512-f37jmAzkuIhKyhtA6s0LGpqQvm218vq+RNMUDkGm1Zz2fxJ5pBIUTDtygiI3vXTcmt9DTIB8S6JQhjrgtboktw==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/middleware-host-header": "3.775.0", + "@aws-sdk/middleware-logger": "3.775.0", + "@aws-sdk/middleware-recursion-detection": "3.775.0", + "@aws-sdk/middleware-user-agent": "3.775.0", + "@aws-sdk/region-config-resolver": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@aws-sdk/util-endpoints": "3.775.0", + "@aws-sdk/util-user-agent-browser": "3.775.0", + "@aws-sdk/util-user-agent-node": "3.775.0", + "@smithy/config-resolver": "^4.1.0", + "@smithy/core": "^3.2.0", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/hash-node": "^4.0.2", + "@smithy/invalid-dependency": "^4.0.2", + "@smithy/middleware-content-length": "^4.0.2", + "@smithy/middleware-endpoint": "^4.1.0", + "@smithy/middleware-retry": "^4.1.0", + "@smithy/middleware-serde": "^4.0.3", + "@smithy/middleware-stack": "^4.0.2", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", + "@smithy/url-parser": "^4.0.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.8", + "@smithy/util-defaults-mode-node": "^4.0.8", + "@smithy/util-endpoints": "^3.0.2", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-retry": "^4.0.2", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.679.0.tgz", - "integrity": "sha512-Ybx54P8Tg6KKq5ck7uwdjiKif7n/8g1x+V0V9uTjBjRWqaIgiqzXwKWoPj6NCNkE7tJNtqI4JrNxp/3S3HvmRw==", - "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/types": "^3.5.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.7", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.775.0.tgz", + "integrity": "sha512-40iH3LJjrQS3LKUJAl7Wj0bln7RFPEvUYKFxtP8a+oKFDO0F65F52xZxIJbPn6sHkxWDAnZlGgdjZXM3p2g5wQ==", + "dependencies": { + "@aws-sdk/types": "3.775.0", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/types": "^4.2.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.679.0.tgz", - "integrity": "sha512-g1D57e7YBhgXihCWIRBcTUvKquS3FS27xuA24EynY9teiTIq7vHkASxxDnMMMcmKHnCKLI5pkznjk0PuDJ4uJw==", - "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/protocol-http": "^4.1.4", - "@smithy/signature-v4": "^4.2.0", - "@smithy/types": "^3.5.0", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.775.0.tgz", + "integrity": "sha512-cnGk8GDfTMJ8p7+qSk92QlIk2bmTmFJqhYxcXZ9PysjZtx0xmfCMxnG3Hjy1oU2mt5boPCVSOptqtWixayM17g==", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/signature-v4": "^5.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.679.0.tgz", - "integrity": "sha512-1/+Zso/x2jqgutKixYFQEGli0FELTgah6bm7aB+m2FAWH4Hz7+iMUsazg6nSWm714sG9G3h5u42Dmpvi9X6/hA==", - "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/property-provider": "^3.1.7", - "@smithy/shared-ini-file-loader": "^3.1.8", - "@smithy/types": "^3.5.0", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.775.0.tgz", + "integrity": "sha512-Q6MtbEhkOggVSz/dN89rIY/ry80U3v89o0Lrrc+Rpvaiaaz8pEN0DsfEcg0IjpzBQ8Owoa6lNWyglHbzPhaJpA==", + "dependencies": { + "@aws-sdk/nested-clients": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.679.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/types": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.679.0.tgz", - "integrity": "sha512-NwVq8YvInxQdJ47+zz4fH3BRRLC6lL+WLkvr242PVBbUOLRyK/lkwHlfiKUoeVIMyK5NF+up6TRg71t/8Bny6Q==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.775.0.tgz", + "integrity": "sha512-ZoGKwa4C9fC9Av6bdfqcW6Ix5ot05F/S4VxWR2nHuMv7hzfmAjTOcUiWT7UR4hM/U0whf84VhDtXN/DWAk52KA==", "dependencies": { - "@smithy/types": "^3.5.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.679.0.tgz", - "integrity": "sha512-CwzEbU8R8rq9bqUFryO50RFBlkfufV9UfMArHPWlo+lmsC+NlSluHQALoj6Jkq3zf5ppn1CN0c1DDLrEqdQUXg==", + "version": "3.723.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.723.0.tgz", + "integrity": "sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.679.0.tgz", - "integrity": "sha512-YL6s4Y/1zC45OvddvgE139fjeWSKKPgLlnfrvhVL7alNyY9n7beR4uhoDpNrt5mI6sn9qiBF17790o+xLAXjjg==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.775.0.tgz", + "integrity": "sha512-yjWmUgZC9tUxAo8Uaplqmq0eUh0zrbZJdwxGRKdYxfm4RG6fMw1tj52+KkatH7o+mNZvg1GDcVp/INktxonJLw==", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/types": "^3.5.0", - "@smithy/util-endpoints": "^2.1.3", + "@aws-sdk/types": "3.775.0", + "@smithy/types": "^4.2.0", + "@smithy/util-endpoints": "^3.0.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.679.0.tgz", - "integrity": "sha512-zKTd48/ZWrCplkXpYDABI74rQlbR0DNHs8nH95htfSLj9/mWRSwaGptoxwcihaq/77vi/fl2X3y0a1Bo8bt7RA==", + "version": "3.723.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.723.0.tgz", + "integrity": "sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.679.0.tgz", - "integrity": "sha512-CusSm2bTBG1kFypcsqU8COhnYc6zltobsqs3nRrvYqYaOqtMnuE46K4XTWpnzKgwDejgZGOE+WYyprtAxrPvmQ==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.775.0.tgz", + "integrity": "sha512-txw2wkiJmZKVdDbscK7VBK+u+TJnRtlUjRTLei+elZg2ADhpQxfVAQl436FUeIv6AhB/oRHW6/K/EAGXUSWi0A==", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/types": "^3.5.0", + "@aws-sdk/types": "3.775.0", + "@smithy/types": "^4.2.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.679.0.tgz", - "integrity": "sha512-Bw4uXZ+NU5ed6TNfo4tBbhBSW+2eQxXYjYBGl5gLUNUpg2pDFToQAP6rXBFiwcG52V2ny5oLGiD82SoYuYkAVg==", - "dependencies": { - "@aws-sdk/middleware-user-agent": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/types": "^3.5.0", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.775.0.tgz", + "integrity": "sha512-N9yhTevbizTOMo3drH7Eoy6OkJ3iVPxhV7dwb6CMAObbLneS36CSfA6xQXupmHWcRvZPTz8rd1JGG3HzFOau+g==", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { "aws-crt": ">=1.0.0" @@ -1448,21 +1405,21 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.679.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.679.0.tgz", - "integrity": "sha512-nPmhVZb39ty5bcQ7mAwtjezBcsBqTYZ9A2D9v/lE92KCLdu5RhSkPH7O71ZqbZx1mUSg9fAOxHPiG79U5VlpLQ==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.775.0.tgz", + "integrity": "sha512-b9NGO6FKJeLGYnV7Z1yvcP1TNU4dkD5jNsLWOF1/sygZoASaQhNOlaiJ/1OH331YQ1R1oWk38nBb0frsYkDsOQ==", "dependencies": { - "@smithy/types": "^3.5.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.0.tgz", - "integrity": "sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", @@ -1474,30 +1431,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.0.tgz", - "integrity": "sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -1522,13 +1479,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.0.tgz", - "integrity": "sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", "dev": true, "dependencies": { - "@babel/parser": "^7.26.0", - "@babel/types": "^7.26.0", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -1538,12 +1495,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.8", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -1602,9 +1559,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1638,25 +1595,25 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", "dev": true, "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.1.tgz", - "integrity": "sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", "dev": true, "dependencies": { - "@babel/types": "^7.26.0" + "@babel/types": "^7.27.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -1888,9 +1845,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1899,30 +1856,30 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", - "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1940,9 +1897,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", - "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -2091,369 +2048,120 @@ "pbts": "bin/pbts" } }, - "node_modules/@elrondnetwork/bls-wasm": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@elrondnetwork/bls-wasm/-/bls-wasm-0.3.3.tgz", - "integrity": "sha512-neCzWRk8pZsOBeAI3+t8jgiSkqj/y4IJPOMKG4ebL1+MiOFayygmfDvfZrK57RSoMWvDfXHlhTL25DrI+EtH+w==", - "deprecated": "WARNING: This project has been moved to @multiversx/sdk-bls-wasm. Use @multiversx/sdk-bls-wasm instead.", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "dev": true, "dependencies": { - "assert": "^2.0.0", - "perf_hooks": "0.0.1" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/@elrondnetwork/erdjs": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@elrondnetwork/erdjs/-/erdjs-11.1.2.tgz", - "integrity": "sha512-KHjN2nma0j29hWCJRJO6MlZG2GqH+cebqFmR3exkeHOYINAZbTvf1AVyHjQoo8UQvWBJDz0vejffc1BiaQYjrA==", - "deprecated": "WARNING: This project has been moved to @multiversx/sdk-core. Use @multiversx/sdk-core instead.", - "dependencies": { - "@elrondnetwork/transaction-decoder": "1.0.0", - "bech32": "1.1.4", - "bignumber.js": "9.0.1", - "blake2b": "2.1.3", - "buffer": "6.0.3", - "json-duplicate-key-handle": "1.0.0", - "keccak": "3.0.2", - "protobufjs": "6.11.3" - } - }, - "node_modules/@elrondnetwork/erdjs-dex": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/@elrondnetwork/erdjs-dex/-/erdjs-dex-0.2.14.tgz", - "integrity": "sha512-g7H/PhXCy2pVHPXQ1giB1+p3gB1YlQIFxhWMYMm8tuYQ2vgQj6+6pPhBoS4WYUGagwntZyz97AI5OzBJOt1V2w==", - "deprecated": "WARNING: This project has been moved to @multiversx/sdk-exchange. Use @multiversx/sdk-exchange instead.", - "dependencies": { - "@elrondnetwork/erdjs": "^11.1.0", - "bignumber.js": "9.0.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@elrondnetwork/erdjs-dex/node_modules/bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, "engines": { - "node": "*" - } - }, - "node_modules/@elrondnetwork/erdjs-walletcore": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@elrondnetwork/erdjs-walletcore/-/erdjs-walletcore-1.0.0.tgz", - "integrity": "sha512-I+N7rwBs4p9bX6d2Rd9Ck6uwCOsgafDzL9aAaFqwh3NnmEI7JGrXPvFoZxDTOQ9pyd2J9jk4dXS6GAImjd3R8g==", - "deprecated": "WARNING: This project has been moved to @multiversx/sdk-wallet. Use @multiversx/sdk-wallet instead.", - "dependencies": { - "@elrondnetwork/bls-wasm": "0.3.3", - "bech32": "1.1.4", - "bip39": "3.0.2", - "blake2b": "2.1.3", - "ed25519-hd-key": "1.1.2", - "keccak": "3.0.1", - "scryptsy": "2.1.0", - "tweetnacl": "1.0.3", - "uuid": "8.3.2" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@elrondnetwork/erdjs-walletcore/node_modules/keccak": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", - "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", - "hasInstallScript": true, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=10.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@elrondnetwork/erdjs-walletcore/node_modules/node-gyp-build": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", - "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@elrondnetwork/erdjs-walletcore/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, - "node_modules/@elrondnetwork/erdjs/node_modules/bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, "engines": { - "node": "*" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@elrondnetwork/erdjs/node_modules/protobufjs": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", - "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", - "hasInstallScript": true, + "node_modules/@golevelup/nestjs-common": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@golevelup/nestjs-common/-/nestjs-common-2.0.2.tgz", + "integrity": "sha512-e5pV5MtFDkTNRxWn1+JTh6SUiI0Sld1++yfwcx3k3MHv7iT3AocvjizTcxnKVPb9BHJjZ68jjPxSND3/zi2FSw==", "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" + "lodash": "^4.17.21" }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" + "peerDependencies": { + "@nestjs/common": "^10.x || ^11.0.0" } }, - "node_modules/@elrondnetwork/native-auth": { - "version": "0.1.22", - "resolved": "https://registry.npmjs.org/@elrondnetwork/native-auth/-/native-auth-0.1.22.tgz", - "integrity": "sha512-MtQyYaxrkjsxVEIiLC9Hp4/F4PCc3lPmnUWm4aLDYv/coPBoLO4St2J36SvhOiXNzdnTkRaSOpmGYFopJiydkQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/@golevelup/nestjs-discovery": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@golevelup/nestjs-discovery/-/nestjs-discovery-4.0.3.tgz", + "integrity": "sha512-8w3CsXHN7+7Sn2i419Eal1Iw/kOjAd6Kb55M/ZqKBBwACCMn4WiEuzssC71LpBMI1090CiDxuelfPRwwIrQK+A==", "dependencies": { - "@elrondnetwork/erdjs": "^10.2.7", - "@elrondnetwork/erdjs-walletcore": "^1.0.0", - "axios": "^0.27.2", - "bech32": "^2.0.0" + "lodash": "^4.17.21" + }, + "peerDependencies": { + "@nestjs/common": "^10.x || ^11.0.0", + "@nestjs/core": "^10.x || ^11.0.0" } }, - "node_modules/@elrondnetwork/native-auth/node_modules/@elrondnetwork/erdjs": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/@elrondnetwork/erdjs/-/erdjs-10.2.8.tgz", - "integrity": "sha512-WOT8J8jhodIiDcjnQjrzsB/2cCq1qigoGp+CloYqOeweL50SWMNN+9QTB2GzoqwAPRBGuZONSs7SYBVNElnhTA==", - "deprecated": "WARNING: This project has been moved to @multiversx/sdk-core. Use @multiversx/sdk-core instead.", + "node_modules/@golevelup/nestjs-modules": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@golevelup/nestjs-modules/-/nestjs-modules-0.7.2.tgz", + "integrity": "sha512-0u5wNm+jxOmRFHHKNbJci180zhCvGsp0ZW3tJt5m2ZMvFhfYjJiVozF5M3chHxqd3q7hH4cNLSE3/78uhjyaxg==", "dependencies": { - "@elrondnetwork/transaction-decoder": "0.1.0", - "bech32": "1.1.4", - "bignumber.js": "9.0.1", - "blake2b": "2.1.3", - "buffer": "6.0.3", - "json-duplicate-key-handle": "1.0.0", - "keccak": "3.0.2", - "protobufjs": "6.11.3" - } - }, - "node_modules/@elrondnetwork/native-auth/node_modules/@elrondnetwork/erdjs/node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - }, - "node_modules/@elrondnetwork/native-auth/node_modules/@elrondnetwork/transaction-decoder": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@elrondnetwork/transaction-decoder/-/transaction-decoder-0.1.0.tgz", - "integrity": "sha512-R9YSiJCAgdlSzTKBy7/KjohFghmUhZIGDqWt6NGXrf33EN24QB15Q0LgHEW7lXsqsDSF5GpRYetsS7V3jYZQOg==", - "deprecated": "WARNING: This project has been moved to @multiversx/sdk-transaction-decoder. Use @multiversx/sdk-transaction-decoder instead.", - "dependencies": { - "bech32": "^2.0.0" - } - }, - "node_modules/@elrondnetwork/native-auth/node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "node_modules/@elrondnetwork/native-auth/node_modules/bech32": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" - }, - "node_modules/@elrondnetwork/native-auth/node_modules/bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "engines": { - "node": "*" - } - }, - "node_modules/@elrondnetwork/native-auth/node_modules/protobufjs": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", - "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } - }, - "node_modules/@elrondnetwork/transaction-decoder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@elrondnetwork/transaction-decoder/-/transaction-decoder-1.0.0.tgz", - "integrity": "sha512-FFUDXffwDNwo4V6Co+S9ur3OPYyAEzwgen7gh7LtQrG7SNPELFHjl+YssABXI8v1+SWmqcrSxervMggAiDDXkg==", - "deprecated": "WARNING: This project has been moved to @multiversx/sdk-transaction-decoder. Use @multiversx/sdk-transaction-decoder instead.", - "dependencies": { - "bech32": "^2.0.0" - } - }, - "node_modules/@elrondnetwork/transaction-decoder/node_modules/bech32": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" - }, - "node_modules/@elrondnetwork/transaction-processor": { - "version": "0.1.26", - "resolved": "https://registry.npmjs.org/@elrondnetwork/transaction-processor/-/transaction-processor-0.1.26.tgz", - "integrity": "sha512-IBqPaB6mzBok26kYFKF6r017MMPKYJ9u5ayNqzJ+BqKtx+91op92wNwKkJJ6ZuKuV2ertRdtzna8FrSZOEPtYg==", - "deprecated": "WARNING: This project has been moved to @multiversx/sdk-transaction-processor. Use @multiversx/sdk-transaction-processor instead.", - "dependencies": { - "axios": "^0.21.1" - } - }, - "node_modules/@elrondnetwork/transaction-processor/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@golevelup/nestjs-common": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@golevelup/nestjs-common/-/nestjs-common-2.0.0.tgz", - "integrity": "sha512-D9RLXgkqn9SDLnZ2VoMER9l/+g5CM9Z7sZXa+10+0rZs6yevMepoiWmMVsFoUXLzYG2GwfixHLExwUr3XBCHFw==", - "dependencies": { - "lodash": "^4.17.21", - "nanoid": "^3.3.6" - }, - "peerDependencies": { - "@nestjs/common": "^10.x" - } - }, - "node_modules/@golevelup/nestjs-discovery": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@golevelup/nestjs-discovery/-/nestjs-discovery-4.0.1.tgz", - "integrity": "sha512-HFXBJayEkYcU/bbxOztozONdWaZR34ZeJ2zRbZIWY8d5K26oPZQTvJ4L0STW3XVRGWtoE0WBpmx2YPNgYvcmJQ==", - "dependencies": { - "lodash": "^4.17.21" - }, - "peerDependencies": { - "@nestjs/common": "^10.x", - "@nestjs/core": "^10.x" - } - }, - "node_modules/@golevelup/nestjs-modules": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@golevelup/nestjs-modules/-/nestjs-modules-0.7.1.tgz", - "integrity": "sha512-L5hBuU57ujl73IAyyZYkT+41tbo+9BggLzze7AMSWJhNUJBhvifFvtfSNRy2aTTPsLYuHLH2tmerjjOQkEdgDg==", - "dependencies": { - "lodash": "^4.17.21" - }, - "peerDependencies": { - "@nestjs/common": "^10.x", - "rxjs": "^7.x" + "lodash": "^4.17.21" + }, + "peerDependencies": { + "@nestjs/common": "^10.x || ^11.0.0", + "rxjs": "^7.x" } }, "node_modules/@golevelup/nestjs-rabbitmq": { @@ -2511,6 +2219,17 @@ "resolved": "https://registry.npmjs.org/promise-breaker/-/promise-breaker-5.0.0.tgz", "integrity": "sha512-mgsWQuG4kJ1dtO6e/QlNDLFtMkMzzecsC69aI5hlLEjGHFNpHrvGhFi4LiK5jg2SMQj74/diH+wZliL9LpGsyA==" }, + "node_modules/@golevelup/nestjs-rabbitmq/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, "node_modules/@golevelup/nestjs-rabbitmq/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -2530,6 +2249,11 @@ } ] }, + "node_modules/@golevelup/nestjs-rabbitmq/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, "node_modules/@graphql-tools/merge": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.4.2.tgz", @@ -3022,9 +2746,9 @@ "integrity": "sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==" }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -3100,6 +2824,16 @@ "node": ">=8" } }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.2.0.tgz", + "integrity": "sha512-+ywrb0AqkfaYuhHs6LxKWgqbh3I72EpEgESCw37o+9qPx9WTCkgDm2B+eMrwehGtHBWHFU4GXvnSCNiFhhausg==", + "license": "MIT", + "peer": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, "node_modules/@multiversx/sdk-bls-wasm": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@multiversx/sdk-bls-wasm/-/sdk-bls-wasm-0.3.5.tgz", @@ -3109,23 +2843,42 @@ } }, "node_modules/@multiversx/sdk-core": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/@multiversx/sdk-core/-/sdk-core-13.11.0.tgz", - "integrity": "sha512-/ds0V/pwnppqPyl7HmIGIp4BdIKExDecvncRLvWd+xYaxXOLJ1R4opSXPAV1fpneoeX3lg8903mw2x5dBrHJ+A==", + "version": "13.17.2", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-core/-/sdk-core-13.17.2.tgz", + "integrity": "sha512-X/Ga66Ubx8IpHPM7pk3gl52KxVR0tbxlN2Zhjz7fg4Xxe0fzWAux5lEuDV8sN3SqD55uyz/l2CkstKgoZWpKWg==", "dependencies": { "@multiversx/sdk-transaction-decoder": "1.0.2", + "@noble/ed25519": "1.7.3", + "@noble/hashes": "1.3.0", "bech32": "1.1.4", "blake2b": "2.1.3", "buffer": "6.0.3", + "ed25519-hd-key": "1.1.2", + "ed2curve": "0.3.0", "json-bigint": "1.0.0", - "keccak": "3.0.2" + "keccak": "3.0.2", + "scryptsy": "2.1.0", + "tweetnacl": "1.0.3", + "uuid": "8.3.2" }, - "peerDependencies": { + "optionalDependencies": { + "@multiversx/sdk-bls-wasm": "0.3.5", "axios": "^1.7.4", + "bip39": "3.1.0" + }, + "peerDependencies": { "bignumber.js": "^9.0.1", "protobufjs": "^7.2.6" } }, + "node_modules/@multiversx/sdk-core/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@multiversx/sdk-data-api-client": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/@multiversx/sdk-data-api-client/-/sdk-data-api-client-0.7.0.tgz", @@ -3164,46 +2917,6 @@ "node": "*" } }, - "node_modules/@multiversx/sdk-data-api-client/node_modules/@multiversx/sdk-wallet": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@multiversx/sdk-wallet/-/sdk-wallet-3.0.0.tgz", - "integrity": "sha512-nDVBtva1mpfutXA8TfUnpdeFqhY9O+deNU3U/Z41yPBcju1trHDC9gcKPyQqcQ3qjG/6LwEXmIm7Dc5fIsvVjg==", - "dependencies": { - "@multiversx/sdk-bls-wasm": "0.3.5", - "bech32": "1.1.4", - "bip39": "3.0.2", - "blake2b": "2.1.3", - "ed25519-hd-key": "1.1.2", - "ed2curve": "0.3.0", - "keccak": "3.0.1", - "scryptsy": "2.1.0", - "tweetnacl": "1.0.3", - "uuid": "8.3.2" - } - }, - "node_modules/@multiversx/sdk-data-api-client/node_modules/@multiversx/sdk-wallet/node_modules/keccak": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", - "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@multiversx/sdk-data-api-client/node_modules/node-gyp-build": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", - "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, "node_modules/@multiversx/sdk-data-api-client/node_modules/protobufjs": { "version": "6.11.3", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", @@ -3229,12 +2942,21 @@ "pbts": "bin/pbts" } }, - "node_modules/@multiversx/sdk-data-api-client/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/@multiversx/sdk-exchange": { + "version": "0.2.21", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-exchange/-/sdk-exchange-0.2.21.tgz", + "integrity": "sha512-ZjaOrpgzF9v504awOC8T+b3lGp4FvHKcIxmA6yuugGcdr45f/hZXd8v6HlZhpR/mRp494zLaPyzgrzkWvJ41wQ==", + "dependencies": { + "@multiversx/sdk-core": "^13.6.3", + "bignumber.js": "9.0.1" + } + }, + "node_modules/@multiversx/sdk-exchange/node_modules/bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", + "engines": { + "node": "*" } }, "node_modules/@multiversx/sdk-native-auth-client": { @@ -3245,41 +2967,68 @@ "axios": "^1.7.4" } }, - "node_modules/@multiversx/sdk-native-auth-server": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/@multiversx/sdk-native-auth-server/-/sdk-native-auth-server-1.0.20.tgz", - "integrity": "sha512-1rfPzYmmsUVmt+9jdY5TG3LQVth1o/KH1zR2g8ZqDQqZV7B6W504CX3XKZbIpkJoSk3XdlsDezX+OdD/emtC5g==", + "node_modules/@multiversx/sdk-nestjs-auth": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-nestjs-auth/-/sdk-nestjs-auth-5.0.0.tgz", + "integrity": "sha512-sBwZWE2vpce8TGTWEqHI28HWTAXQVxAH79dI1SfskcwYxoKRUMrpFOrg3yh8y0YoYCZxU7xnquGb/gZ1lMPnSQ==", "dependencies": { - "@multiversx/sdk-wallet": "^4.5.0", + "@multiversx/sdk-core": "^14.0.0", + "@multiversx/sdk-native-auth-server": "^2.0.0", + "jsonwebtoken": "^9.0.0" + }, + "peerDependencies": { + "@multiversx/sdk-nestjs-cache": "^5.0.0", + "@multiversx/sdk-nestjs-common": "^5.0.0", + "@multiversx/sdk-nestjs-monitoring": "^5.0.0", + "@nestjs/common": "^10.x" + } + }, + "node_modules/@multiversx/sdk-nestjs-auth/node_modules/@multiversx/sdk-core": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-core/-/sdk-core-14.0.1.tgz", + "integrity": "sha512-50BinNuAg/JkJC+H3s/IfgliB1o+/XhuPB+B83fdV3z4VMxO0s+1JKDACDrr4lJ0uYT1O6Gb+eToHxZr7kGQEw==", + "dependencies": { + "@multiversx/sdk-transaction-decoder": "1.0.2", + "@noble/ed25519": "1.7.3", + "@noble/hashes": "1.3.0", + "bech32": "1.1.4", + "blake2b": "2.1.3", + "buffer": "6.0.3", + "ed25519-hd-key": "1.1.2", + "ed2curve": "0.3.0", + "json-bigint": "1.0.0", + "keccak": "3.0.2", + "scryptsy": "2.1.0", + "tweetnacl": "1.0.3", + "uuid": "8.3.2" + }, + "optionalDependencies": { + "@multiversx/sdk-bls-wasm": "0.3.5", "axios": "^1.7.4", - "bech32": "^2.0.0" + "bip39": "3.1.0" }, "peerDependencies": { - "@multiversx/sdk-core": "^13.x" + "bignumber.js": "^9.0.1", + "protobufjs": "^7.2.6" } }, - "node_modules/@multiversx/sdk-native-auth-server/node_modules/bech32": { + "node_modules/@multiversx/sdk-nestjs-auth/node_modules/@multiversx/sdk-native-auth-server": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" - }, - "node_modules/@multiversx/sdk-nestjs-auth": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@multiversx/sdk-nestjs-auth/-/sdk-nestjs-auth-4.0.1.tgz", - "integrity": "sha512-sPZeaoN/dT8v0Dj7ZPocjqOuoXD0CqD1VQnA5MNZvubuUZ9iMb65zpaQvyh+hhwUth4hST6IkT49K7zyf6G3gg==", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-native-auth-server/-/sdk-native-auth-server-2.0.0.tgz", + "integrity": "sha512-DdjWyt60Chk6unMVprBV/5zA8rEXjufYdE67UG6XP8RRZiGU1+k6UU14E0TU/iii8K+/5Tj/zfrIrPfbDiASoA==", "dependencies": { - "@multiversx/sdk-core": "^13.4.1", - "@multiversx/sdk-native-auth-server": "^1.0.19", - "@multiversx/sdk-wallet": "^4.5.0", - "jsonwebtoken": "^9.0.0" + "axios": "^1.7.4", + "bech32": "^2.0.0" }, "peerDependencies": { - "@multiversx/sdk-nestjs-cache": "^4.0.0", - "@multiversx/sdk-nestjs-common": "^4.0.0", - "@multiversx/sdk-nestjs-monitoring": "^4.0.0", - "@nestjs/common": "^10.x" + "@multiversx/sdk-core": "^14.x" } }, + "node_modules/@multiversx/sdk-nestjs-auth/node_modules/@multiversx/sdk-native-auth-server/node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" + }, "node_modules/@multiversx/sdk-nestjs-auth/node_modules/jsonwebtoken": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", @@ -3301,10 +3050,18 @@ "npm": ">=6" } }, + "node_modules/@multiversx/sdk-nestjs-auth/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@multiversx/sdk-nestjs-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@multiversx/sdk-nestjs-cache/-/sdk-nestjs-cache-4.0.1.tgz", - "integrity": "sha512-k4mmz8+zD/G2AvxGsZFkclywGL2laXaeUlyzVvWh/OcfAMZ4Mwf7ToSq18aOaT5p7m6nv3Q7s4kar4aRaNTCHg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-nestjs-cache/-/sdk-nestjs-cache-5.0.0.tgz", + "integrity": "sha512-+ZviVaTAXqPUoBax1XrInrEtDamm694ned7AqfmaOcW0qv4Y7Dw62/tJa87cKfgL9vbcX6LQNST8OdNRTDQdOQ==", "dependencies": { "lru-cache": "^8.0.4", "moment": "^2.29.4", @@ -3313,9 +3070,9 @@ "uuid": "^8.3.2" }, "peerDependencies": { - "@multiversx/sdk-nestjs-common": "^4.0.0", - "@multiversx/sdk-nestjs-monitoring": "^4.0.0", - "@multiversx/sdk-nestjs-redis": "^4.0.0", + "@multiversx/sdk-nestjs-common": "^5.0.0", + "@multiversx/sdk-nestjs-monitoring": "^5.0.0", + "@multiversx/sdk-nestjs-redis": "^5.0.0", "@nestjs/common": "^10.x", "@nestjs/core": "^10.x" } @@ -3337,24 +3094,52 @@ } }, "node_modules/@multiversx/sdk-nestjs-common": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@multiversx/sdk-nestjs-common/-/sdk-nestjs-common-4.0.1.tgz", - "integrity": "sha512-vhSM6aClBJ7WxUQPCTjqjwmvLU4i6/BjjGglTuF+yABiuu2UjL5brqcdrkHLh9aCeJwzH85wsRD78CEiOjVgcg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-nestjs-common/-/sdk-nestjs-common-5.0.0.tgz", + "integrity": "sha512-LVJa7wq4nxAP2v/6HCrVQxGQ0Lao55jjzzra7lNIgSWDApBOlvgkdX9QbYbzTRToBB6hTx0JiGr0a8wdzmrR8A==", "dependencies": { - "@multiversx/sdk-core": "^13.4.1", - "@multiversx/sdk-network-providers": "^2.6.0", + "@multiversx/sdk-core": "^14.0.0", "nest-winston": "^1.6.2", "uuid": "^8.3.2", "winston": "^3.7.2" }, "peerDependencies": { - "@multiversx/sdk-nestjs-monitoring": "^4.0.0", + "@multiversx/sdk-nestjs-monitoring": "^5.0.0", "@nestjs/common": "^10.x", "@nestjs/config": "^3.x", "@nestjs/core": "^10.x", "@nestjs/swagger": "^7.x" } }, + "node_modules/@multiversx/sdk-nestjs-common/node_modules/@multiversx/sdk-core": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-core/-/sdk-core-14.0.1.tgz", + "integrity": "sha512-50BinNuAg/JkJC+H3s/IfgliB1o+/XhuPB+B83fdV3z4VMxO0s+1JKDACDrr4lJ0uYT1O6Gb+eToHxZr7kGQEw==", + "dependencies": { + "@multiversx/sdk-transaction-decoder": "1.0.2", + "@noble/ed25519": "1.7.3", + "@noble/hashes": "1.3.0", + "bech32": "1.1.4", + "blake2b": "2.1.3", + "buffer": "6.0.3", + "ed25519-hd-key": "1.1.2", + "ed2curve": "0.3.0", + "json-bigint": "1.0.0", + "keccak": "3.0.2", + "scryptsy": "2.1.0", + "tweetnacl": "1.0.3", + "uuid": "8.3.2" + }, + "optionalDependencies": { + "@multiversx/sdk-bls-wasm": "0.3.5", + "axios": "^1.7.4", + "bip39": "3.1.0" + }, + "peerDependencies": { + "bignumber.js": "^9.0.1", + "protobufjs": "^7.2.6" + } + }, "node_modules/@multiversx/sdk-nestjs-common/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -3364,34 +3149,72 @@ } }, "node_modules/@multiversx/sdk-nestjs-elastic": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@multiversx/sdk-nestjs-elastic/-/sdk-nestjs-elastic-4.0.1.tgz", - "integrity": "sha512-Ol/65Q1FzbZCLuGFgW5v3Q9Xy0ftpwKnCjP0iz3bIlxO5rEbWwLaUe5qvH5vKSi10FQ0QrcJXA0DmYM7nKmF4A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-nestjs-elastic/-/sdk-nestjs-elastic-5.0.0.tgz", + "integrity": "sha512-QP2mq/iwZHF+YOTXkFoUYhTp+t+QjDILCpJs+0NFmzw3VfXN9HuDu+QO7qVdsDQ3A/akWn/b2xMnLyxB5WEJ1w==", "peerDependencies": { - "@multiversx/sdk-nestjs-http": "^4.0.0", + "@multiversx/sdk-nestjs-http": "^5.0.0", "@nestjs/common": "^10.x" } }, "node_modules/@multiversx/sdk-nestjs-http": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@multiversx/sdk-nestjs-http/-/sdk-nestjs-http-4.0.1.tgz", - "integrity": "sha512-2cq9Jmgihf6+UQ1sa7SYSCzca+PhFuxfuXJgRs/UKr11OPe11g2XNkFunTHHFTzbbmsQMVSpvdYW0i6auJQCUQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-nestjs-http/-/sdk-nestjs-http-5.0.0.tgz", + "integrity": "sha512-EN10lyLcgdabXJIJ87h3907CffjgHHasjvGNNp0bKnx30AbzQRiGZ67OflxmTygRx4nkROocmPmBJElR0tSETQ==", "dependencies": { + "@multiversx/sdk-core": "^14.0.0", "@multiversx/sdk-native-auth-client": "^1.0.9", "agentkeepalive": "^4.3.0", "axios": "^1.7.4" }, "peerDependencies": { - "@multiversx/sdk-nestjs-common": "^4.0.0", - "@multiversx/sdk-nestjs-monitoring": "^4.0.0", + "@multiversx/sdk-nestjs-common": "^5.0.0", + "@multiversx/sdk-nestjs-monitoring": "^5.0.0", "@nestjs/common": "^10.x", "@nestjs/core": "^10.x" } }, + "node_modules/@multiversx/sdk-nestjs-http/node_modules/@multiversx/sdk-core": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-core/-/sdk-core-14.0.1.tgz", + "integrity": "sha512-50BinNuAg/JkJC+H3s/IfgliB1o+/XhuPB+B83fdV3z4VMxO0s+1JKDACDrr4lJ0uYT1O6Gb+eToHxZr7kGQEw==", + "dependencies": { + "@multiversx/sdk-transaction-decoder": "1.0.2", + "@noble/ed25519": "1.7.3", + "@noble/hashes": "1.3.0", + "bech32": "1.1.4", + "blake2b": "2.1.3", + "buffer": "6.0.3", + "ed25519-hd-key": "1.1.2", + "ed2curve": "0.3.0", + "json-bigint": "1.0.0", + "keccak": "3.0.2", + "scryptsy": "2.1.0", + "tweetnacl": "1.0.3", + "uuid": "8.3.2" + }, + "optionalDependencies": { + "@multiversx/sdk-bls-wasm": "0.3.5", + "axios": "^1.7.4", + "bip39": "3.1.0" + }, + "peerDependencies": { + "bignumber.js": "^9.0.1", + "protobufjs": "^7.2.6" + } + }, + "node_modules/@multiversx/sdk-nestjs-http/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@multiversx/sdk-nestjs-monitoring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@multiversx/sdk-nestjs-monitoring/-/sdk-nestjs-monitoring-4.0.1.tgz", - "integrity": "sha512-TfWFrD0crVgWQ3lUhBNzwi/h1I8PiOjsCUyhyqg6amzCQiAMO1AuIKeLkfnaN8VyQb8x/OxMnhFrosaDGpp9Wg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-nestjs-monitoring/-/sdk-nestjs-monitoring-5.0.0.tgz", + "integrity": "sha512-cQwENKnvImo+K9F3Mf0B8Sl7BNbbhaRWLXtmWIwjBy2HEDFWXKrF+fiMUanHf3Xpdr5cyWye0Dlps5aWEH59FA==", "dependencies": { "prom-client": "^14.0.1", "winston": "^3.7.2", @@ -3402,15 +3225,15 @@ } }, "node_modules/@multiversx/sdk-nestjs-rabbitmq": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@multiversx/sdk-nestjs-rabbitmq/-/sdk-nestjs-rabbitmq-4.0.1.tgz", - "integrity": "sha512-NvAixK0idJn3WNlSBQMTsaKz/n64zbME0z0sLnI1OEUV1j25GQwaHRElnrv7TcduJtz9mwieIcC75+fp5Tedxg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-nestjs-rabbitmq/-/sdk-nestjs-rabbitmq-5.0.0.tgz", + "integrity": "sha512-0gwdj6JdxX7J40J3iNjammrzwyDb0vYRl4oT4kaw9D31DOgvrrT9lxjeHhAIGRV5KUoYyLpVAKoeWaDAXvGZTA==", "dependencies": { "@golevelup/nestjs-rabbitmq": "4.0.0", "uuid": "^8.3.2" }, "peerDependencies": { - "@multiversx/sdk-nestjs-common": "^4.0.0", + "@multiversx/sdk-nestjs-common": "^5.0.0", "@nestjs/common": "^10.x" } }, @@ -3469,6 +3292,17 @@ "resolved": "https://registry.npmjs.org/promise-breaker/-/promise-breaker-5.0.0.tgz", "integrity": "sha512-mgsWQuG4kJ1dtO6e/QlNDLFtMkMzzecsC69aI5hlLEjGHFNpHrvGhFi4LiK5jg2SMQj74/diH+wZliL9LpGsyA==" }, + "node_modules/@multiversx/sdk-nestjs-rabbitmq/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, "node_modules/@multiversx/sdk-nestjs-rabbitmq/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3488,6 +3322,11 @@ } ] }, + "node_modules/@multiversx/sdk-nestjs-rabbitmq/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, "node_modules/@multiversx/sdk-nestjs-rabbitmq/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -3497,36 +3336,14 @@ } }, "node_modules/@multiversx/sdk-nestjs-redis": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@multiversx/sdk-nestjs-redis/-/sdk-nestjs-redis-4.0.1.tgz", - "integrity": "sha512-Gq4DNnB3AIWCLDyBhmeKZS4notwjcLmiOvU8mNek3/FLrZgo8+DIOuIsMhuxp4GrzivpOj3eiza29RgvcGe+PA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-nestjs-redis/-/sdk-nestjs-redis-5.0.0.tgz", + "integrity": "sha512-3Jd9P18EZDerikK/4sSE4+3ujWqdM9arIYABzY3lAEAtpFHwxJXE7zCI87gSCflFH+fLhzyRocErv+mBj/XuFQ==", "dependencies": { "ioredis": "^5.2.3" - }, - "peerDependencies": { - "@nestjs/common": "^10.x" - } - }, - "node_modules/@multiversx/sdk-network-providers": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@multiversx/sdk-network-providers/-/sdk-network-providers-2.9.0.tgz", - "integrity": "sha512-K1aolRg8xCDH/E0bPSIdXZbprKf3fxkEfmxhXN+pYXd2LXoXLdIQazo16b1kraxsRsyDDv8Ovc5oWg32/+Vtcg==", - "dependencies": { - "bech32": "1.1.4", - "bignumber.js": "9.0.1", - "buffer": "6.0.3", - "json-bigint": "1.0.0" - }, - "peerDependencies": { - "axios": "^1.7.4" - } - }, - "node_modules/@multiversx/sdk-network-providers/node_modules/bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "engines": { - "node": "*" + }, + "peerDependencies": { + "@nestjs/common": "^10.x" } }, "node_modules/@multiversx/sdk-transaction-decoder": { @@ -3542,16 +3359,22 @@ "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" }, + "node_modules/@multiversx/sdk-transaction-processor": { + "version": "0.1.35", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-transaction-processor/-/sdk-transaction-processor-0.1.35.tgz", + "integrity": "sha512-zbj4zNYhIxjlnxy7/p7so4IroOd+Z3QtIvFkKJEg8HMGSAuF6dObmrmc4dsx8nzG97rFpOLJ7iSyE8Xk9sCvrQ==", + "dependencies": { + "axios": "^1.7.4" + } + }, "node_modules/@multiversx/sdk-wallet": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@multiversx/sdk-wallet/-/sdk-wallet-4.6.0.tgz", - "integrity": "sha512-SxO/hBTnAB+uWH4MJdwKLvfRk8cxdA8zi6JC4I9j1+V+XQJpfs2YHCvMmaVyIAqjmSg9i7Uk61exrDkR3bjPAw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-wallet/-/sdk-wallet-3.0.0.tgz", + "integrity": "sha512-nDVBtva1mpfutXA8TfUnpdeFqhY9O+deNU3U/Z41yPBcju1trHDC9gcKPyQqcQ3qjG/6LwEXmIm7Dc5fIsvVjg==", "dependencies": { "@multiversx/sdk-bls-wasm": "0.3.5", - "@noble/ed25519": "1.7.3", - "@noble/hashes": "1.3.0", "bech32": "1.1.4", - "bip39": "3.1.0", + "bip39": "3.0.2", "blake2b": "2.1.3", "ed25519-hd-key": "1.1.2", "ed2curve": "0.3.0", @@ -3561,12 +3384,20 @@ "uuid": "8.3.2" } }, + "node_modules/@multiversx/sdk-wallet/node_modules/@types/node": { + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" + }, "node_modules/@multiversx/sdk-wallet/node_modules/bip39": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", - "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.2.tgz", + "integrity": "sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ==", "dependencies": { - "@noble/hashes": "^1.2.0" + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" } }, "node_modules/@multiversx/sdk-wallet/node_modules/keccak": { @@ -3583,9 +3414,9 @@ } }, "node_modules/@multiversx/sdk-wallet/node_modules/node-gyp-build": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", - "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -3916,14 +3747,14 @@ } }, "node_modules/@nestjs/graphql": { - "version": "12.2.1", - "resolved": "https://registry.npmjs.org/@nestjs/graphql/-/graphql-12.2.1.tgz", - "integrity": "sha512-eXbme7RcecXaz6pZOc3uR9gR7AEAS20BTkzToWab4ExdDJRLhd7ua4C/uNEPUK+82HbNfd3h3z4Mes29N2R+/w==", - "dependencies": { - "@graphql-tools/merge": "9.0.8", - "@graphql-tools/schema": "10.0.7", - "@graphql-tools/utils": "10.5.5", - "@nestjs/mapped-types": "2.0.5", + "version": "12.2.2", + "resolved": "https://registry.npmjs.org/@nestjs/graphql/-/graphql-12.2.2.tgz", + "integrity": "sha512-lUDy/1uqbRA1kBKpXcmY0aHhcPbfeG52Wg5+9Jzd1d57dwSjCAmuO+mWy5jz9ugopVCZeK0S/kdAMvA+r9fNdA==", + "dependencies": { + "@graphql-tools/merge": "9.0.11", + "@graphql-tools/schema": "10.0.10", + "@graphql-tools/utils": "10.6.1", + "@nestjs/mapped-types": "2.0.6", "chokidar": "4.0.1", "fast-glob": "3.3.2", "graphql-tag": "2.12.6", @@ -3931,8 +3762,8 @@ "lodash": "4.17.21", "normalize-path": "3.0.0", "subscriptions-transport-ws": "0.11.0", - "tslib": "2.8.0", - "uuid": "10.0.0", + "tslib": "2.8.1", + "uuid": "11.0.3", "ws": "8.18.0" }, "peerDependencies": { @@ -3961,11 +3792,11 @@ } }, "node_modules/@nestjs/graphql/node_modules/@graphql-tools/merge": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.8.tgz", - "integrity": "sha512-RG9NEp4fi0MoFi0te4ahqTMYuavQnXlpEZxxMomdCa6CI5tfekcVm/rsLF5Zt8O4HY+esDt9+4dCL+aOKvG79w==", + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.11.tgz", + "integrity": "sha512-AJL0XTozn31HoZN8tULzEkbDXyETA5vAFu4Q65kxJDu027p+auaNFYj/y51HP4BhMR4wykoteWyO7/VxKfdpiw==", "dependencies": { - "@graphql-tools/utils": "^10.5.5", + "@graphql-tools/utils": "^10.6.1", "tslib": "^2.4.0" }, "engines": { @@ -3976,12 +3807,12 @@ } }, "node_modules/@nestjs/graphql/node_modules/@graphql-tools/schema": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.7.tgz", - "integrity": "sha512-Cz1o+rf9cd3uMgG+zI9HlM5mPlnHQUlk/UQRZyUlPDfT+944taLaokjvj7AI6GcOFVf4f2D11XthQp+0GY31jQ==", + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.10.tgz", + "integrity": "sha512-TSdDvwgk1Fq3URDuZBMCPXlWLpRpxwaQ+0KqvycVwoHozYnBRZ2Ql9HVgDKnebkGQKmIk2enSeku+ERKxxSG0g==", "dependencies": { - "@graphql-tools/merge": "^9.0.8", - "@graphql-tools/utils": "^10.5.5", + "@graphql-tools/merge": "^9.0.11", + "@graphql-tools/utils": "^10.6.1", "tslib": "^2.4.0", "value-or-promise": "^1.0.12" }, @@ -3993,9 +3824,9 @@ } }, "node_modules/@nestjs/graphql/node_modules/@graphql-tools/utils": { - "version": "10.5.5", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.5.5.tgz", - "integrity": "sha512-LF/UDWmMT0mnobL2UZETwYghV7HYBzNaGj0SAkCYOMy/C3+6sQdbcTksnoFaKR9XIVD78jNXEGfivbB8Zd+cwA==", + "version": "10.6.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.6.1.tgz", + "integrity": "sha512-XHl0/DWkMf/8Dmw1F3RRoMPt6ZwU4J707YWcbPjS+49WZNoTVz6f+prQ4GuwZT8RqTPtrRawnGU93AV73ZLTfQ==", "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "cross-inspect": "1.0.1", @@ -4024,11 +3855,11 @@ } }, "node_modules/@nestjs/graphql/node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "engines": { - "node": ">= 14.16.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -4036,21 +3867,21 @@ } }, "node_modules/@nestjs/graphql/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.3.tgz", + "integrity": "sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, "node_modules/@nestjs/mapped-types": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.5.tgz", - "integrity": "sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.6.tgz", + "integrity": "sha512-84ze+CPfp1OWdpRi1/lOu59hOhTz38eVzJvRKrg9ykRFwDz+XleKfMsG0gUqNZYFa6v53XYzeD+xItt8uDW7NQ==", "peerDependencies": { "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", "class-transformer": "^0.4.0 || ^0.5.0", @@ -4128,6 +3959,18 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/@nestjs/mongoose": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@nestjs/mongoose/-/mongoose-11.0.3.tgz", + "integrity": "sha512-tg7bbKD4MnNMPaiDLXK/JUyTNQxIn3rNnI+oYU1HorLpNiR2E8vPraWVvfptpIj+zferpT6LkrHMvtqvuIKNPw==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "@nestjs/core": "^10.0.0 || ^11.0.0", + "mongoose": "^7.0.0 || ^8.0.0", + "rxjs": "^7.0.0" + } + }, "node_modules/@nestjs/platform-express": { "version": "10.2.4", "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.2.4.tgz", @@ -4460,6 +4303,15 @@ "node": ">=12" } }, + "node_modules/@nestjs/schematics/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@nestjs/swagger": { "version": "7.1.16", "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.1.16.tgz", @@ -4567,13 +4419,13 @@ } }, "node_modules/@nestjs/websockets": { - "version": "10.4.6", - "resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-10.4.6.tgz", - "integrity": "sha512-53YqDQylPAOudNFiiBvrN8QrRl/sZ9oEjKbD3wBVgrFREbaiuTySoyyy6HwVs60HW29uQwck+Bp7qkKGjhtQKg==", + "version": "10.4.15", + "resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-10.4.15.tgz", + "integrity": "sha512-OmCUJwvtagzXfMVko595O98UI3M9zg+URL+/HV7vd3QPMCZ3uGCKSq15YYJ99LHJn9NyK4e4Szm2KnHtUg2QzA==", "dependencies": { "iterare": "1.2.1", "object-hash": "3.0.0", - "tslib": "2.7.0" + "tslib": "2.8.1" }, "peerDependencies": { "@nestjs/common": "^10.0.0", @@ -4588,11 +4440,6 @@ } } }, - "node_modules/@nestjs/websockets/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" - }, "node_modules/@noble/ed25519": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.3.tgz", @@ -4786,655 +4633,670 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.6.tgz", - "integrity": "sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.2.tgz", + "integrity": "sha512-Sl/78VDtgqKxN2+1qduaVE140XF+Xg+TafkncspwM4jFP/LHr76ZHmIY/y3V1M0mMLNk+Je6IGbzxy23RSToMw==", "dependencies": { - "@smithy/types": "^3.6.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/chunked-blob-reader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-4.0.0.tgz", - "integrity": "sha512-jSqRnZvkT4egkq/7b6/QRCNXmmYVcHwnJldqJ3IhVpQE2atObVJ137xmGeuGFhjFUr8gCEVAOKwSY79OvpbDaQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.0.0.tgz", + "integrity": "sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==", "dependencies": { "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/chunked-blob-reader-native": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-3.0.1.tgz", - "integrity": "sha512-VEYtPvh5rs/xlyqpm5NRnfYLZn+q0SRPELbvBV+C/G7IQ+ouTuo+NKKa3ShG5OaFR8NYVMXls9hPYLTvIKKDrQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz", + "integrity": "sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==", "dependencies": { - "@smithy/util-base64": "^3.0.0", + "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/config-resolver": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.10.tgz", - "integrity": "sha512-Uh0Sz9gdUuz538nvkPiyv1DZRX9+D15EKDtnQP5rYVAzM/dnYk3P8cg73jcxyOitPgT3mE3OVj7ky7sibzHWkw==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.9", - "@smithy/types": "^3.6.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.8", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.0.tgz", + "integrity": "sha512-8smPlwhga22pwl23fM5ew4T9vfLUCeFXlcqNOCD5M5h8VmNPNUE9j6bQSuRXpDSV11L/E/SwEBQuW8hr6+nS1A==", + "dependencies": { + "@smithy/node-config-provider": "^4.0.2", + "@smithy/types": "^4.2.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/core": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.1.tgz", - "integrity": "sha512-DujtuDA7BGEKExJ05W5OdxCoyekcKT3Rhg1ZGeiUWaz2BJIWXjZmsG/DIP4W48GHno7AQwRsaCb8NcBgH3QZpg==", - "dependencies": { - "@smithy/middleware-serde": "^3.0.8", - "@smithy/protocol-http": "^4.1.5", - "@smithy/types": "^3.6.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-middleware": "^3.0.8", - "@smithy/util-stream": "^3.2.1", - "@smithy/util-utf8": "^3.0.0", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.2.0.tgz", + "integrity": "sha512-k17bgQhVZ7YmUvA8at4af1TDpl0NDMBuBKJl8Yg0nrefwmValU+CnA5l/AriVdQNthU/33H3nK71HrLgqOPr1Q==", + "dependencies": { + "@smithy/middleware-serde": "^4.0.3", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-stream": "^4.2.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/credential-provider-imds": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.5.tgz", - "integrity": "sha512-4FTQGAsuwqTzVMmiRVTn0RR9GrbRfkP0wfu/tXWVHd2LgNpTY0uglQpIScXK4NaEyXbB3JmZt8gfVqO50lP8wg==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.9", - "@smithy/property-provider": "^3.1.8", - "@smithy/types": "^3.6.0", - "@smithy/url-parser": "^3.0.8", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.2.tgz", + "integrity": "sha512-32lVig6jCaWBHnY+OEQ6e6Vnt5vDHaLiydGrwYMW9tPqO688hPGTYRamYJ1EptxEC2rAwJrHWmPoKRBl4iTa8w==", + "dependencies": { + "@smithy/node-config-provider": "^4.0.2", + "@smithy/property-provider": "^4.0.2", + "@smithy/types": "^4.2.0", + "@smithy/url-parser": "^4.0.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-codec": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.7.tgz", - "integrity": "sha512-kVSXScIiRN7q+s1x7BrQtZ1Aa9hvvP9FeCqCdBxv37GimIHgBCOnZ5Ip80HLt0DhnAKpiobFdGqTFgbaJNrazA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.2.tgz", + "integrity": "sha512-p+f2kLSK7ZrXVfskU/f5dzksKTewZk8pJLPvER3aFHPt76C2MxD9vNatSfLzzQSQB4FNO96RK4PSXfhD1TTeMQ==", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^3.6.0", - "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/types": "^4.2.0", + "@smithy/util-hex-encoding": "^4.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.11.tgz", - "integrity": "sha512-Pd1Wnq3CQ/v2SxRifDUihvpXzirJYbbtXfEnnLV/z0OGCTx/btVX74P86IgrZkjOydOASBGXdPpupYQI+iO/6A==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.2.tgz", + "integrity": "sha512-CepZCDs2xgVUtH7ZZ7oDdZFH8e6Y2zOv8iiX6RhndH69nlojCALSKK+OXwZUgOtUZEUaZ5e1hULVCHYbCn7pug==", "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.10", - "@smithy/types": "^3.6.0", + "@smithy/eventstream-serde-universal": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.8.tgz", - "integrity": "sha512-zkFIG2i1BLbfoGQnf1qEeMqX0h5qAznzaZmMVNnvPZz9J5AWBPkOMckZWPedGUPcVITacwIdQXoPcdIQq5FRcg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.0.tgz", + "integrity": "sha512-1PI+WPZ5TWXrfj3CIoKyUycYynYJgZjuQo8U+sphneOtjsgrttYybdqESFReQrdWJ+LKt6NEdbYzmmfDBmjX2A==", "dependencies": { - "@smithy/types": "^3.6.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.10.tgz", - "integrity": "sha512-hjpU1tIsJ9qpcoZq9zGHBJPBOeBGYt+n8vfhDwnITPhEre6APrvqq/y3XMDEGUT2cWQ4ramNqBPRbx3qn55rhw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.2.tgz", + "integrity": "sha512-C5bJ/C6x9ENPMx2cFOirspnF9ZsBVnBMtP6BdPl/qYSuUawdGQ34Lq0dMcf42QTjUZgWGbUIZnz6+zLxJlb9aw==", "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.10", - "@smithy/types": "^3.6.0", + "@smithy/eventstream-serde-universal": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.10.tgz", - "integrity": "sha512-ewG1GHbbqsFZ4asaq40KmxCmXO+AFSM1b+DcO2C03dyJj/ZH71CiTg853FSE/3SHK9q3jiYQIFjlGSwfxQ9kww==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.2.tgz", + "integrity": "sha512-St8h9JqzvnbB52FtckiHPN4U/cnXcarMniXRXTKn0r4b4XesZOGiAyUdj1aXbqqn1icSqBlzzUsCl6nPB018ng==", "dependencies": { - "@smithy/eventstream-codec": "^3.1.7", - "@smithy/types": "^3.6.0", + "@smithy/eventstream-codec": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.9.tgz", - "integrity": "sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A==", - "dependencies": { - "@smithy/protocol-http": "^4.1.4", - "@smithy/querystring-builder": "^3.0.7", - "@smithy/types": "^3.5.0", - "@smithy/util-base64": "^3.0.0", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.2.tgz", + "integrity": "sha512-+9Dz8sakS9pe7f2cBocpJXdeVjMopUDLgZs1yWeu7h++WqSbjUYv/JAJwKwXw1HV6gq1jyWjxuyn24E2GhoEcQ==", + "dependencies": { + "@smithy/protocol-http": "^5.1.0", + "@smithy/querystring-builder": "^4.0.2", + "@smithy/types": "^4.2.0", + "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/hash-blob-browser": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.7.tgz", - "integrity": "sha512-4yNlxVNJifPM5ThaA5HKnHkn7JhctFUHvcaz6YXxHlYOSIrzI6VKQPTN8Gs1iN5nqq9iFcwIR9THqchUCouIfg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.2.tgz", + "integrity": "sha512-3g188Z3DyhtzfBRxpZjU8R9PpOQuYsbNnyStc/ZVS+9nVX1f6XeNOa9IrAh35HwwIZg+XWk8bFVtNINVscBP+g==", "dependencies": { - "@smithy/chunked-blob-reader": "^4.0.0", - "@smithy/chunked-blob-reader-native": "^3.0.1", - "@smithy/types": "^3.6.0", + "@smithy/chunked-blob-reader": "^5.0.0", + "@smithy/chunked-blob-reader-native": "^4.0.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/hash-node": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.8.tgz", - "integrity": "sha512-tlNQYbfpWXHimHqrvgo14DrMAgUBua/cNoz9fMYcDmYej7MAmUcjav/QKQbFc3NrcPxeJ7QClER4tWZmfwoPng==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.2.tgz", + "integrity": "sha512-VnTpYPnRUE7yVhWozFdlxcYknv9UN7CeOqSrMH+V877v4oqtVYuoqhIhtSjmGPvYrYnAkaM61sLMKHvxL138yg==", "dependencies": { - "@smithy/types": "^3.6.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.2.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/hash-stream-node": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-3.1.7.tgz", - "integrity": "sha512-xMAsvJ3hLG63lsBVi1Hl6BBSfhd8/Qnp8fC06kjOpJvyyCEXdwHITa5Kvdsk6gaAXLhbZMhQMIGvgUbfnJDP6Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.2.tgz", + "integrity": "sha512-POWDuTznzbIwlEXEvvXoPMS10y0WKXK790soe57tFRfvf4zBHyzE529HpZMqmDdwG9MfFflnyzndUQ8j78ZdSg==", "dependencies": { - "@smithy/types": "^3.6.0", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.2.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/invalid-dependency": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.8.tgz", - "integrity": "sha512-7Qynk6NWtTQhnGTTZwks++nJhQ1O54Mzi7fz4PqZOiYXb4Z1Flpb2yRvdALoggTS8xjtohWUM+RygOtB30YL3Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.2.tgz", + "integrity": "sha512-GatB4+2DTpgWPday+mnUkoumP54u/MDM/5u44KF9hIu8jF0uafZtQLcdfIKkIcUNuF/fBojpLEHZS/56JqPeXQ==", "dependencies": { - "@smithy/types": "^3.6.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/md5-js": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-3.0.8.tgz", - "integrity": "sha512-LwApfTK0OJ/tCyNUXqnWCKoE2b4rDSr4BJlDAVCkiWYeHESr+y+d5zlAanuLW6fnitVJRD/7d9/kN/ZM9Su4mA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.2.tgz", + "integrity": "sha512-Hc0R8EiuVunUewCse2syVgA2AfSRco3LyAv07B/zCOMa+jpXI9ll+Q21Nc6FAlYPcpNcAXqBzMhNs1CD/pP2bA==", "dependencies": { - "@smithy/types": "^3.6.0", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.2.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-content-length": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.10.tgz", - "integrity": "sha512-T4dIdCs1d/+/qMpwhJ1DzOhxCZjZHbHazEPJWdB4GDi2HjIZllVzeBEcdJUN0fomV8DURsgOyrbEUzg3vzTaOg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.2.tgz", + "integrity": "sha512-hAfEXm1zU+ELvucxqQ7I8SszwQ4znWMbNv6PLMndN83JJN41EPuS93AIyh2N+gJ6x8QFhzSO6b7q2e6oClDI8A==", "dependencies": { - "@smithy/protocol-http": "^4.1.5", - "@smithy/types": "^3.6.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-endpoint": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.1.tgz", - "integrity": "sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==", - "dependencies": { - "@smithy/core": "^2.5.1", - "@smithy/middleware-serde": "^3.0.8", - "@smithy/node-config-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.9", - "@smithy/types": "^3.6.0", - "@smithy/url-parser": "^3.0.8", - "@smithy/util-middleware": "^3.0.8", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.0.tgz", + "integrity": "sha512-xhLimgNCbCzsUppRTGXWkZywksuTThxaIB0HwbpsVLY5sceac4e1TZ/WKYqufQLaUy+gUSJGNdwD2jo3cXL0iA==", + "dependencies": { + "@smithy/core": "^3.2.0", + "@smithy/middleware-serde": "^4.0.3", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", + "@smithy/url-parser": "^4.0.2", + "@smithy/util-middleware": "^4.0.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-retry": { - "version": "3.0.25", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.25.tgz", - "integrity": "sha512-m1F70cPaMBML4HiTgCw5I+jFNtjgz5z5UdGnUbG37vw6kh4UvizFYjqJGHvicfgKMkDL6mXwyPp5mhZg02g5sg==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.5", - "@smithy/service-error-classification": "^3.0.8", - "@smithy/smithy-client": "^3.4.2", - "@smithy/types": "^3.6.0", - "@smithy/util-middleware": "^3.0.8", - "@smithy/util-retry": "^3.0.8", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.0.tgz", + "integrity": "sha512-2zAagd1s6hAaI/ap6SXi5T3dDwBOczOMCSkkYzktqN1+tzbk1GAsHNAdo/1uzxz3Ky02jvZQwbi/vmDA6z4Oyg==", + "dependencies": { + "@smithy/node-config-provider": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/service-error-classification": "^4.0.2", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-retry": "^4.0.2", "tslib": "^2.6.2", "uuid": "^9.0.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-serde": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.8.tgz", - "integrity": "sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.3.tgz", + "integrity": "sha512-rfgDVrgLEVMmMn0BI8O+8OVr6vXzjV7HZj57l0QxslhzbvVfikZbVfBVthjLHqib4BW44QhcIgJpvebHlRaC9A==", "dependencies": { - "@smithy/types": "^3.6.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-stack": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.8.tgz", - "integrity": "sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.2.tgz", + "integrity": "sha512-eSPVcuJJGVYrFYu2hEq8g8WWdJav3sdrI4o2c6z/rjnYDd3xH9j9E7deZQCzFn4QvGPouLngH3dQ+QVTxv5bOQ==", "dependencies": { - "@smithy/types": "^3.6.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/node-config-provider": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz", - "integrity": "sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.0.2.tgz", + "integrity": "sha512-WgCkILRZfJwJ4Da92a6t3ozN/zcvYyJGUTmfGbgS/FkCcoCjl7G4FJaCDN1ySdvLvemnQeo25FdkyMSTSwulsw==", "dependencies": { - "@smithy/property-provider": "^3.1.8", - "@smithy/shared-ini-file-loader": "^3.1.9", - "@smithy/types": "^3.6.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/node-http-handler": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.5.tgz", - "integrity": "sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==", - "dependencies": { - "@smithy/abort-controller": "^3.1.6", - "@smithy/protocol-http": "^4.1.5", - "@smithy/querystring-builder": "^3.0.8", - "@smithy/types": "^3.6.0", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.4.tgz", + "integrity": "sha512-/mdqabuAT3o/ihBGjL94PUbTSPSRJ0eeVTdgADzow0wRJ0rN4A27EOrtlK56MYiO1fDvlO3jVTCxQtQmK9dZ1g==", + "dependencies": { + "@smithy/abort-controller": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/querystring-builder": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/property-provider": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.8.tgz", - "integrity": "sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.2.tgz", + "integrity": "sha512-wNRoQC1uISOuNc2s4hkOYwYllmiyrvVXWMtq+TysNRVQaHm4yoafYQyjN/goYZS+QbYlPIbb/QRjaUZMuzwQ7A==", "dependencies": { - "@smithy/types": "^3.6.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/protocol-http": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz", - "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.0.tgz", + "integrity": "sha512-KxAOL1nUNw2JTYrtviRRjEnykIDhxc84qMBzxvu1MUfQfHTuBlCG7PA6EdVwqpJjH7glw7FqQoFxUJSyBQgu7g==", "dependencies": { - "@smithy/types": "^3.6.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/querystring-builder": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.8.tgz", - "integrity": "sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.2.tgz", + "integrity": "sha512-NTOs0FwHw1vimmQM4ebh+wFQvOwkEf/kQL6bSM1Lock+Bv4I89B3hGYoUEPkmvYPkDKyp5UdXJYu+PoTQ3T31Q==", "dependencies": { - "@smithy/types": "^3.6.0", - "@smithy/util-uri-escape": "^3.0.0", + "@smithy/types": "^4.2.0", + "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/querystring-parser": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.8.tgz", - "integrity": "sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.2.tgz", + "integrity": "sha512-v6w8wnmZcVXjfVLjxw8qF7OwESD9wnpjp0Dqry/Pod0/5vcEA3qxCr+BhbOHlxS8O+29eLpT3aagxXGwIoEk7Q==", "dependencies": { - "@smithy/types": "^3.6.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/service-error-classification": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.8.tgz", - "integrity": "sha512-uEC/kCCFto83bz5ZzapcrgGqHOh/0r69sZ2ZuHlgoD5kYgXJEThCoTuw/y1Ub3cE7aaKdznb+jD9xRPIfIwD7g==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.2.tgz", + "integrity": "sha512-LA86xeFpTKn270Hbkixqs5n73S+LVM0/VZco8dqd+JT75Dyx3Lcw/MraL7ybjmz786+160K8rPOmhsq0SocoJQ==", "dependencies": { - "@smithy/types": "^3.6.0" + "@smithy/types": "^4.2.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz", - "integrity": "sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.2.tgz", + "integrity": "sha512-J9/gTWBGVuFZ01oVA6vdb4DAjf1XbDhK6sLsu3OS9qmLrS6KB5ygpeHiM3miIbj1qgSJ96GYszXFWv6ErJ8QEw==", "dependencies": { - "@smithy/types": "^3.6.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/signature-v4": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.1.tgz", - "integrity": "sha512-NsV1jF4EvmO5wqmaSzlnTVetemBS3FZHdyc5CExbDljcyJCEEkJr8ANu2JvtNbVg/9MvKAWV44kTrGS+Pi4INg==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.5", - "@smithy/types": "^3.6.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.8", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.0.2.tgz", + "integrity": "sha512-Mz+mc7okA73Lyz8zQKJNyr7lIcHLiPYp0+oiqiMNc/t7/Kf2BENs5d63pEj7oPqdjaum6g0Fc8wC78dY1TgtXw==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/smithy-client": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.2.tgz", - "integrity": "sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==", - "dependencies": { - "@smithy/core": "^2.5.1", - "@smithy/middleware-endpoint": "^3.2.1", - "@smithy/middleware-stack": "^3.0.8", - "@smithy/protocol-http": "^4.1.5", - "@smithy/types": "^3.6.0", - "@smithy/util-stream": "^3.2.1", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.2.0.tgz", + "integrity": "sha512-Qs65/w30pWV7LSFAez9DKy0Koaoh3iHhpcpCCJ4waj/iqwsuSzJna2+vYwq46yBaqO5ZbP9TjUsATUNxrKeBdw==", + "dependencies": { + "@smithy/core": "^3.2.0", + "@smithy/middleware-endpoint": "^4.1.0", + "@smithy/middleware-stack": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", + "@smithy/util-stream": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/types": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", - "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.2.0.tgz", + "integrity": "sha512-7eMk09zQKCO+E/ivsjQv+fDlOupcFUCSC/L2YUPgwhvowVGWbPQHjEFcmjt7QQ4ra5lyowS92SV53Zc6XD4+fg==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/url-parser": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.8.tgz", - "integrity": "sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.2.tgz", + "integrity": "sha512-Bm8n3j2ScqnT+kJaClSVCMeiSenK6jVAzZCNewsYWuZtnBehEz4r2qP0riZySZVfzB+03XZHJeqfmJDkeeSLiQ==", "dependencies": { - "@smithy/querystring-parser": "^3.0.8", - "@smithy/types": "^3.6.0", + "@smithy/querystring-parser": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/util-base64": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", - "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", - "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", "dependencies": { "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", - "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", - "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.25", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.25.tgz", - "integrity": "sha512-fRw7zymjIDt6XxIsLwfJfYUfbGoO9CmCJk6rjJ/X5cd20+d2Is7xjU5Kt/AiDt6hX8DAf5dztmfP5O82gR9emA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.8.tgz", + "integrity": "sha512-ZTypzBra+lI/LfTYZeop9UjoJhhGRTg3pxrNpfSTQLd3AJ37r2z4AXTKpq1rFXiiUIJsYyFgNJdjWRGP/cbBaQ==", "dependencies": { - "@smithy/property-provider": "^3.1.8", - "@smithy/smithy-client": "^3.4.2", - "@smithy/types": "^3.6.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", "bowser": "^2.11.0", "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.25", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.25.tgz", - "integrity": "sha512-H3BSZdBDiVZGzt8TG51Pd2FvFO0PAx/A0mJ0EH8a13KJ6iUCdYnw/Dk/MdC1kTd0eUuUGisDFaxXVXo4HHFL1g==", - "dependencies": { - "@smithy/config-resolver": "^3.0.10", - "@smithy/credential-provider-imds": "^3.2.5", - "@smithy/node-config-provider": "^3.1.9", - "@smithy/property-provider": "^3.1.8", - "@smithy/smithy-client": "^3.4.2", - "@smithy/types": "^3.6.0", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.8.tgz", + "integrity": "sha512-Rgk0Jc/UDfRTzVthye/k2dDsz5Xxs9LZaKCNPgJTRyoyBoeiNCnHsYGOyu1PKN+sDyPnJzMOz22JbwxzBp9NNA==", + "dependencies": { + "@smithy/config-resolver": "^4.1.0", + "@smithy/credential-provider-imds": "^4.0.2", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/property-provider": "^4.0.2", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-endpoints": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.4.tgz", - "integrity": "sha512-kPt8j4emm7rdMWQyL0F89o92q10gvCUa6sBkBtDJ7nV2+P7wpXczzOfoDJ49CKXe5CCqb8dc1W+ZdLlrKzSAnQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.2.tgz", + "integrity": "sha512-6QSutU5ZyrpNbnd51zRTL7goojlcnuOB55+F9VBD+j8JpRY50IGamsjlycrmpn8PQkmJucFW8A0LSfXj7jjtLQ==", "dependencies": { - "@smithy/node-config-provider": "^3.1.9", - "@smithy/types": "^3.6.0", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", - "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-middleware": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.8.tgz", - "integrity": "sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.2.tgz", + "integrity": "sha512-6GDamTGLuBQVAEuQ4yDQ+ti/YINf/MEmIegrEeg7DdB/sld8BX1lqt9RRuIcABOhAGTA50bRbPzErez7SlDtDQ==", "dependencies": { - "@smithy/types": "^3.6.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-retry": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.8.tgz", - "integrity": "sha512-TCEhLnY581YJ+g1x0hapPz13JFqzmh/pMWL2KEFASC51qCfw3+Y47MrTmea4bUE5vsdxQ4F6/KFbUeSz22Q1ow==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.2.tgz", + "integrity": "sha512-Qryc+QG+7BCpvjloFLQrmlSd0RsVRHejRXd78jNO3+oREueCjwG1CCEH1vduw/ZkM1U9TztwIKVIi3+8MJScGg==", "dependencies": { - "@smithy/service-error-classification": "^3.0.8", - "@smithy/types": "^3.6.0", + "@smithy/service-error-classification": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-stream": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.2.1.tgz", - "integrity": "sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==", - "dependencies": { - "@smithy/fetch-http-handler": "^4.0.0", - "@smithy/node-http-handler": "^3.2.5", - "@smithy/types": "^3.6.0", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.0.tgz", + "integrity": "sha512-Vj1TtwWnuWqdgQI6YTUF5hQ/0jmFiOYsc51CSMgj7QfyO+RF4EnT2HNjoviNlOOmgzgvf3f5yno+EiC4vrnaWQ==", + "dependencies": { + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/types": "^4.2.0", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-stream/node_modules/@smithy/fetch-http-handler": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.0.0.tgz", - "integrity": "sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==", - "dependencies": { - "@smithy/protocol-http": "^4.1.5", - "@smithy/querystring-builder": "^3.0.8", - "@smithy/types": "^3.6.0", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-uri-escape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", - "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-waiter": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.7.tgz", - "integrity": "sha512-d5yGlQtmN/z5eoTtIYgkvOw27US2Ous4VycnXatyoImIF9tzlcpnKqQ/V7qhvJmb2p6xZne1NopCLakdTnkBBQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.3.tgz", + "integrity": "sha512-JtaY3FxmD+te+KSI2FJuEcfNC9T/DGGVf551babM7fAaXhjJUt7oSYurH1Devxd2+BOSUACCgt3buinx4UnmEA==", "dependencies": { - "@smithy/abort-controller": "^3.1.6", - "@smithy/types": "^3.6.0", + "@smithy/abort-controller": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@socket.io/component-emitter": { @@ -5566,9 +5428,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" @@ -5644,9 +5506,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "dev": true }, "node_modules/@types/express": { @@ -5719,9 +5581,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -5756,9 +5618,9 @@ } }, "node_modules/@types/lodash": { - "version": "4.17.12", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.12.tgz", - "integrity": "sha512-sviUmCE8AYdaF/KIHLDJBQgeYzPBI0vf/17NaYehBJfYD1j6/L95Slh07NlyK2iNyBNaEkb3En2jRt+a8y3xZQ==" + "version": "4.17.16", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz", + "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==" }, "node_modules/@types/long": { "version": "4.0.2", @@ -5782,9 +5644,9 @@ "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" }, "node_modules/@types/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", "peer": true, "dependencies": { "@types/node": "*", @@ -5798,9 +5660,9 @@ "dev": true }, "node_modules/@types/qs": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", - "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==" + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==" }, "node_modules/@types/range-parser": { "version": "1.2.7", @@ -5826,9 +5688,9 @@ } }, "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", "dev": true }, "node_modules/@types/send": { @@ -5897,6 +5759,23 @@ "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/webidl-conversions": "*" + } + }, "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", @@ -6101,154 +5980,154 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true }, "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -6264,17 +6143,6 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -6296,9 +6164,9 @@ } }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "bin": { "acorn": "bin/acorn" }, @@ -6310,6 +6178,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "deprecated": "package has been renamed to acorn-import-attributes", "dev": true, "peerDependencies": { "acorn": "^8" @@ -6345,9 +6214,9 @@ } }, "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "dependencies": { "humanize-ms": "^1.2.1" }, @@ -6388,6 +6257,18 @@ } } }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, "node_modules/amqp-connection-manager": { "version": "4.1.14", "resolved": "https://registry.npmjs.org/amqp-connection-manager/-/amqp-connection-manager-4.1.14.tgz", @@ -6404,13 +6285,12 @@ } }, "node_modules/amqplib": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.4.tgz", - "integrity": "sha512-DMZ4eCEjAVdX1II2TfIUpJhfKAuoCeDIo/YyETbfAqehHTXxxs7WOOd+N1Xxr4cKhx12y23zk8/os98FxlZHrw==", + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.5.tgz", + "integrity": "sha512-Dx5zmy0Ur+Q7LPPdhz+jx5IzmJBoHd15tOeAfQ8SuvEtyPJ20hBemhOBA4b1WeORCRa0ENM/kHCzmem1w/zHvQ==", "dependencies": { "@acuminous/bitsyntax": "^0.1.2", "buffer-more-ints": "~1.0.0", - "readable-stream": "1.x >=1.1.9", "url-parse": "~1.5.10" }, "engines": { @@ -6963,18 +6843,6 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, - "node_modules/assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", - "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" - } - }, "node_modules/async": { "version": "0.2.10", "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", @@ -7004,24 +6872,10 @@ "node": ">= 4.5.0" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -7168,44 +7022,70 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/bare-events": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", - "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", "optional": true }, "node_modules/bare-fs": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", - "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.0.2.tgz", + "integrity": "sha512-S5mmkMesiduMqnz51Bfh0Et9EX0aTCJxhsI4bvzFFLs8Z1AV8RDHadfY5CyLwdoLHgXbNBEN1gQcbEtGwuvixw==", "optional": true, "dependencies": { - "bare-events": "^2.0.0", - "bare-path": "^2.0.0", - "bare-stream": "^2.0.0" + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } } }, "node_modules/bare-os": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", - "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", - "optional": true + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", + "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } }, "node_modules/bare-path": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", - "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", "optional": true, "dependencies": { - "bare-os": "^2.1.0" + "bare-os": "^3.0.1" } }, "node_modules/bare-stream": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.2.tgz", - "integrity": "sha512-EFZHSIBkDgSHIwj2l2QZfP4U5OcD4xFAOwhSb/vlr9PIqyGJGvB/nfClJbcnh3EY4jtPE4zsb5ztae96bVF79A==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", + "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", "optional": true, "dependencies": { - "streamx": "^2.20.0" + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } } }, "node_modules/base64-js": { @@ -7266,21 +7146,14 @@ "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==" }, "node_modules/bip39": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.2.tgz", - "integrity": "sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "optional": true, "dependencies": { - "@types/node": "11.11.6", - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" + "@noble/hashes": "^1.2.0" } }, - "node_modules/bip39/node_modules/@types/node": { - "version": "11.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", - "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" - }, "node_modules/bitsyntax": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.1.0.tgz", @@ -7427,9 +7300,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -7446,9 +7319,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { @@ -7544,16 +7417,25 @@ "node": ">= 0.8" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dependencies": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -7581,9 +7463,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001673", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001673.tgz", - "integrity": "sha512-WTrjUCSMp3LYX0nE12ECkV0a+e6LC85E0Auz75555/qr78Oc8YWhEPNfDd6SHdtlCMSzqtuXY0uyEMNRcsKpKw==", + "version": "1.0.30001707", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz", + "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==", "dev": true, "funding": [ { @@ -7687,18 +7569,40 @@ } }, "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" } }, + "node_modules/cipher-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==" + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==" }, "node_modules/cli-color": { "version": "2.0.4", @@ -8218,11 +8122,11 @@ } }, "node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", "dependencies": { - "node-fetch": "^2.6.12" + "node-fetch": "^2.7.0" } }, "node_modules/cross-inspect": { @@ -8237,9 +8141,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "dependencies": { "path-key": "^3.1.0", @@ -8284,9 +8188,9 @@ } }, "node_modules/dataloader": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.2.tgz", - "integrity": "sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==" + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.3.tgz", + "integrity": "sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==" }, "node_modules/date-fns": { "version": "2.30.0", @@ -8351,13 +8255,14 @@ } }, "node_modules/dd-trace/node_modules/form-data": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.2.tgz", - "integrity": "sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.3.tgz", + "integrity": "sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -8383,9 +8288,20 @@ } }, "node_modules/dd-trace/node_modules/path-to-regexp": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.11.tgz", - "integrity": "sha512-c0t+KCuUkO/YDLPG4WWzEwx3J5F/GHXsD1h/SNZfySqAIKe/BaP95x8fWtOfRJokpS5yYHRJjMtYlXD8jxnpbw==" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" + }, + "node_modules/dd-trace/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } }, "node_modules/dd-trace/node_modules/retry": { "version": "0.10.1", @@ -8403,10 +8319,15 @@ "semver": "bin/semver" } }, + "node_modules/dd-trace/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dependencies": { "ms": "^2.1.3" }, @@ -8489,38 +8410,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/delay": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", @@ -8604,6 +8493,17 @@ "node": ">=0.8.0" } }, + "node_modules/dicer/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, "node_modules/dicer/node_modules/streamsearch": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", @@ -8612,6 +8512,11 @@ "node": ">=0.8.0" } }, + "node_modules/dicer/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -8709,6 +8614,19 @@ "node": ">=4" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -8727,6 +8645,22 @@ "tweetnacl": "1.0.3" } }, + "node_modules/ed25519-hd-key/node_modules/@types/node": { + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" + }, + "node_modules/ed25519-hd-key/node_modules/bip39": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.2.tgz", + "integrity": "sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ==", + "dependencies": { + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" + } + }, "node_modules/ed2curve": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/ed2curve/-/ed2curve-0.3.0.tgz", @@ -8740,10 +8674,25 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { - "version": "1.5.47", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.47.tgz", - "integrity": "sha512-zS5Yer0MOYw4rtK2iq43cJagHZ8sXN0jDHDKzB+86gSBSAI4v07S97mcq+Gs2vclAxSh1j7vOAHxSVgduiiuVQ==", + "version": "1.5.124", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.124.tgz", + "integrity": "sha512-riELkpDUqBi00gqreV3RIGoowxGrfueEKBd6zPdOk/I8lvuFpBGNkYoHof3zUHbiTBsIU8oxdIIL/WNrAG1/7A==", "dev": true }, "node_modules/emittery": { @@ -8821,6 +8770,22 @@ "node": ">= 0.6" } }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/engine.io/node_modules/ws": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", @@ -8842,9 +8807,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -8864,12 +8829,9 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "engines": { "node": ">= 0.4" } @@ -8883,11 +8845,36 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es5-ext": { "version": "0.10.64", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", @@ -9255,14 +9242,6 @@ "es5-ext": "~0.10.14" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, "node_modules/eventemitter2": { "version": "6.4.9", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", @@ -9277,6 +9256,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, "engines": { "node": ">=0.8.x" } @@ -9338,9 +9318,9 @@ } }, "node_modules/express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "peer": true, "dependencies": { "accepts": "~1.3.8", @@ -9362,7 +9342,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -9377,6 +9357,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/body-parser": { @@ -9419,9 +9403,9 @@ "peer": true }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "peer": true }, "node_modules/express/node_modules/qs": { @@ -9562,9 +9546,9 @@ } }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dependencies": { "reusify": "^1.0.4" } @@ -9627,6 +9611,36 @@ "moment": "^2.29.1" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -9710,9 +9724,9 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true }, "node_modules/fluent-ffmpeg": { @@ -9762,14 +9776,6 @@ } } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", @@ -9799,12 +9805,13 @@ } }, "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" }, "engines": { @@ -9920,15 +9927,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9946,6 +9958,18 @@ "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -10036,11 +10060,11 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10059,17 +10083,17 @@ "dev": true }, "node_modules/graphql": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", - "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", + "version": "16.10.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.10.0.tgz", + "integrity": "sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } }, "node_modules/graphql-fields-list": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/graphql-fields-list/-/graphql-fields-list-2.2.4.tgz", - "integrity": "sha512-dhsMajI/7FMeZ8UWJDiw7iZlwacW5eBM02IVJ6IldFNgmVSDeuS+0+wF3ZOB0zcpYl3Q1spuegPLAFKcriPOCw==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/graphql-fields-list/-/graphql-fields-list-2.3.0.tgz", + "integrity": "sha512-psnXCYTjZH46FAvIw0MelMwQg1IFI2uEl8rYAGXxTjFPLxd1UW0W5eaQb4kuNBh7Hh4FzQQ+I/TYtjLIPtXI1A==" }, "node_modules/graphql-request": { "version": "4.3.0", @@ -10085,13 +10109,14 @@ } }, "node_modules/graphql-request/node_modules/form-data": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.2.tgz", - "integrity": "sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.3.tgz", + "integrity": "sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -10123,6 +10148,9 @@ "version": "5.16.0", "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.16.0.tgz", "integrity": "sha512-Ju2RCU2dQMgSKtArPbEtsK5gNLnsQyTNIo/T7cZNp96niC1x0KdJNZV0TIoilceBPQwfb5itrGl8pkFeOUMl4A==", + "workspaces": [ + "website" + ], "engines": { "node": ">=10" }, @@ -10147,32 +10175,10 @@ "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -10207,19 +10213,6 @@ "node": ">=4" } }, - "node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/hash-base/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -10239,14 +10232,6 @@ } ] }, - "node_modules/hash-base/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -10358,9 +10343,9 @@ } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "dependencies": { "parent-module": "^1.0.0", @@ -10374,11 +10359,11 @@ } }, "node_modules/import-in-the-middle": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.11.2.tgz", - "integrity": "sha512-gK6Rr6EykBcc6cVWRSBR5TWf8nn6hZMYSRYqCcHa0l0d1fPK7JSYo6+Mlmck76jIX9aL/IZ71c06U2VpFwl1zA==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.13.1.tgz", + "integrity": "sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==", "dependencies": { - "acorn": "^8.8.2", + "acorn": "^8.14.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" @@ -10477,9 +10462,9 @@ } }, "node_modules/ioredis": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.4.1.tgz", - "integrity": "sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.0.tgz", + "integrity": "sha512-tBZlIIWbndeWBWCXWZiqtOF/yxf6yZX3tAlTJ7nfo5jhd6dctNxF7QnYlZLZ1a0o0pDoen7CgZqO+zjNaFbJAg==", "dependencies": { "@ioredis/commands": "^1.1.1", "cluster-key-slot": "^1.1.0", @@ -10512,21 +10497,6 @@ "resolved": "https://registry.npmjs.org/is_js/-/is_js-0.9.0.tgz", "integrity": "sha512-8Y5EHSH+TonfUHX2g3pMJljdbGavg55q4jmHzghJCdqYDbdNROC8uw/YFQwIRCRqRJT1EY3pJefz+kglw+o7sg==" }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -10545,21 +10515,10 @@ "node": ">=8" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "dependencies": { "hasown": "^2.0.2" @@ -10596,20 +10555,6 @@ "node": ">=6" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -10630,21 +10575,6 @@ "node": ">=8" } }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -10683,20 +10613,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -10807,6 +10723,30 @@ "node": ">=6" } }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true + }, "node_modules/jest": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", @@ -11399,9 +11339,9 @@ } }, "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "bin": { "jsesc": "bin/jsesc" @@ -11544,6 +11484,16 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/kareem": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/keccak": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", @@ -11559,55 +11509,15 @@ } }, "node_modules/keccak/node_modules/node-gyp-build": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", - "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, - "node_modules/keccak/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/keccak/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/keccak/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -11730,6 +11640,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", "dev": true }, "node_modules/lodash.isinteger": { @@ -11772,7 +11683,8 @@ "node_modules/lodash.omit": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", - "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==" + "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==", + "deprecated": "This package is deprecated. Use destructuring assignment syntax instead." }, "node_modules/lodash.once": { "version": "4.1.1", @@ -11782,7 +11694,8 @@ "node_modules/lodash.pick": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==" + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", + "deprecated": "This package is deprecated. Use destructuring assignment syntax instead." }, "node_modules/lodash.sortby": { "version": "4.7.0", @@ -11811,9 +11724,9 @@ } }, "node_modules/logform": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.1.tgz", - "integrity": "sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", @@ -11868,9 +11781,9 @@ } }, "node_modules/luxon": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", - "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.0.tgz", + "integrity": "sha512-WE7p0p7W1xji9qxkLYsvcIxZyfP48GuFrWIBQZIsbjCyf65dG1rv4n83HcOyEyhvzxJCrUoObCRNFgRNIQ5KNA==", "engines": { "node": ">=12" } @@ -11929,6 +11842,14 @@ "tmpl": "1.0.5" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -11980,8 +11901,7 @@ "node_modules/memory-pager": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" }, "node_modules/merge-descriptors": { "version": "1.0.3", @@ -12104,66 +12024,202 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true, + "node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "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/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/mongodb": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", + "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", + "dependencies": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.1.8", + "safe-buffer": "^5.1.2" + }, + "engines": { + "node": ">=4" + }, + "optionalDependencies": { + "saslprep": "^1.0.0" + }, + "peerDependenciesMeta": { + "aws4": { + "optional": true + }, + "bson-ext": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "mongodb-extjson": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz", + "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^14.1.0 || ^13.0.0" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/tr46": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.0.tgz", + "integrity": "sha512-IUWnUK7ADYR5Sl1fZlO1INDUhVhatWl7BtJWsIhwJ0UAK7ilzzIa8uIqOO/aYVWHZPJkKbEL+362wrzoeRF7bw==", + "license": "MIT", + "peer": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "license": "MIT", + "peer": true, + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/mongodb/node_modules/denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", "engines": { - "node": ">=8" + "node": ">=0.10" } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/mongoose": { + "version": "8.13.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.13.1.tgz", + "integrity": "sha512-sRqlXI+6jhr9/KicCOjet1VVPONFsOxTrh14tfueX5y3GJ2ihswc5ewUUojuwdSS/5koGXLIPmGivDSApVXflA==", + "license": "MIT", + "peer": true, "dependencies": { - "minimist": "^1.2.6" + "bson": "^6.10.3", + "kareem": "2.6.3", + "mongodb": "~6.15.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "17.1.3" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" } }, - "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/module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" - }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "node_modules/mongoose/node_modules/bson": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.3.tgz", + "integrity": "sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==", + "license": "Apache-2.0", + "peer": true, "engines": { - "node": "*" + "node": ">=16.20.1" } }, - "node_modules/mongodb": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", - "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", + "node_modules/mongoose/node_modules/mongodb": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.15.0.tgz", + "integrity": "sha512-ifBhQ0rRzHDzqp9jAQP6OwHSH7dbYIQjD3SbJs9YYk9AikKEettW/9s/tbSFDTpXcRbF+u1aLrhHxDFaYtZpFQ==", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "optional-require": "^1.1.8", - "safe-buffer": "^5.1.2" + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.3", + "mongodb-connection-string-url": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=16.20.1" }, - "optionalDependencies": { - "saslprep": "^1.0.0" + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" }, "peerDependenciesMeta": { - "aws4": { + "@aws-sdk/credential-providers": { "optional": true }, - "bson-ext": { + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { "optional": true }, "kerberos": { @@ -12172,20 +12228,35 @@ "mongodb-client-encryption": { "optional": true }, - "mongodb-extjson": { + "snappy": { "optional": true }, - "snappy": { + "socks": { "optional": true } } }, - "node_modules/mongodb/node_modules/denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "license": "MIT", + "peer": true, "engines": { - "node": ">=0.10" + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/ms": { @@ -12283,9 +12354,9 @@ } }, "node_modules/nan": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", - "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==" + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", + "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==" }, "node_modules/nanoassert": { "version": "1.1.0", @@ -12297,27 +12368,10 @@ "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==" }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "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==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==" }, "node_modules/natural-compare": { "version": "1.4.0", @@ -12347,14 +12401,14 @@ "dev": true }, "node_modules/nest-winston": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/nest-winston/-/nest-winston-1.9.7.tgz", - "integrity": "sha512-pTTgImRgv7urojsDvaTlenAjyJNLj7ywamfjzrhWKhLhp80AKLYNwf103dVHeqZWe+nzp/vd9DGRs/UN/YadOQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/nest-winston/-/nest-winston-1.10.2.tgz", + "integrity": "sha512-Z9IzL/nekBOF/TEwBHUJDiDPMaXUcFquUQOFavIRet6xF0EbuWnOzslyN/ksgzG+fITNgXhMdrL/POp9SdaFxA==", "dependencies": { "fast-safe-stringify": "^2.1.1" }, "peerDependencies": { - "@nestjs/common": "^5.0.0 || ^6.6.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/common": "^5.0.0 || ^6.6.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", "winston": "^3.0.0" } }, @@ -12364,9 +12418,9 @@ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, "node_modules/node-abi": { - "version": "3.71.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", - "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", + "version": "3.74.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz", + "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==", "dependencies": { "semver": "^7.3.5" }, @@ -12437,9 +12491,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, "node_modules/normalize-path": { @@ -12479,49 +12533,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "engines": { "node": ">= 0.4" }, @@ -12665,49 +12679,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/ora/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ora/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "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/ora/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/os-name": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", @@ -12919,24 +12890,19 @@ "node": ">=0.12" } }, - "node_modules/perf_hooks": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/perf_hooks/-/perf_hooks-0.0.1.tgz", - "integrity": "sha512-qG/D9iA4KDme+KF4vCObJy6Bouu3BlQnmJ8jPydVPm32NJBD9ZK1ZNgXSYaZKHkVC1sKSqUiLgFvAZPUiIEnBw==" - }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/pg": { - "version": "8.13.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz", - "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.14.1.tgz", + "integrity": "sha512-0TdbqfjwIun9Fm/r89oB7RFQ0bLgduAhiIqIXOsyKoiC/L54DbuAAzIEN/9Op0f1Po9X7iCPXGoa/Ah+2aI8Xw==", "dependencies": { "pg-connection-string": "^2.7.0", - "pg-pool": "^3.7.0", - "pg-protocol": "^1.7.0", + "pg-pool": "^3.8.0", + "pg-protocol": "^1.8.0", "pg-types": "^2.1.0", "pgpass": "1.x" }, @@ -12975,17 +12941,17 @@ } }, "node_modules/pg-pool": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz", - "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.8.0.tgz", + "integrity": "sha512-VBw3jiVm6ZOdLBTIcXLNdSotb6Iy3uOCwDGFAksZCXmi10nyRvnP2v3jl4d+IsLYRyXf6o9hIm/ZtUzlByNUdw==", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", - "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.8.0.tgz", + "integrity": "sha512-jvuYlEkL03NRvOoyoRktBK7+qU5kOvlAwvmrH8sr3wbLrOdVWsRxQfz8mMy9sZFsqJ1hEWNfdWKI4SAmoL+j7g==" }, "node_modules/pg-types": { "version": "2.2.0", @@ -13120,14 +13086,6 @@ "node": ">=4" } }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -13164,16 +13122,16 @@ } }, "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==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", "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", + "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", @@ -13221,50 +13179,10 @@ "ieee754": "^1.1.13" } }, - "node_modules/prebuild-install/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prebuild-install/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/prebuild-install/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/prebuild-install/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==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", + "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -13348,14 +13266,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -13420,9 +13330,9 @@ } }, "node_modules/protobufjs/node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz", + "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==", "peer": true }, "node_modules/proxy-addr": { @@ -13455,7 +13365,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "engines": { "node": ">=6" } @@ -13514,11 +13423,6 @@ } ] }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -13578,14 +13482,16 @@ "dev": true }, "node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/readdirp": { @@ -13733,18 +13639,21 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13780,9 +13689,9 @@ } }, "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "engines": { "node": ">=10" @@ -13810,9 +13719,9 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -13884,9 +13793,9 @@ } }, "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dependencies": { "tslib": "^2.1.0" } @@ -13981,9 +13890,9 @@ "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "bin": { "semver": "bin/semver.js" }, @@ -14061,27 +13970,11 @@ "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "parseurl": "~1.3.3", + "send": "0.19.0" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.8.0" } }, "node_modules/setprototypeof": { @@ -14167,14 +14060,65 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -14183,6 +14127,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sift": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", + "license": "MIT", + "peer": true + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -14300,6 +14251,22 @@ "ws": "~8.17.1" } }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/socket.io-adapter/node_modules/ws": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", @@ -14332,6 +14299,38 @@ "node": ">=10.0.0" } }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -14373,7 +14372,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "optional": true, "dependencies": { "memory-pager": "^1.0.2" } @@ -14462,12 +14460,11 @@ } }, "node_modules/streamx": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz", - "integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", "dependencies": { "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", "text-decoder": "^1.1.0" }, "optionalDependencies": { @@ -14475,9 +14472,31 @@ } }, "node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/string-length": { "version": "4.0.2", @@ -14559,9 +14578,15 @@ } }, "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", + "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ] }, "node_modules/subscriptions-transport-ws": { "version": "0.11.0", @@ -14715,16 +14740,16 @@ } }, "node_modules/tar-fs": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", - "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", + "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" } }, "node_modules/tar-stream": { @@ -14746,9 +14771,9 @@ } }, "node_modules/terser": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", - "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -14764,16 +14789,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -14811,6 +14836,25 @@ "node": ">= 10.13.0" } }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -14847,9 +14891,12 @@ } }, "node_modules/text-decoder": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz", - "integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dependencies": { + "b4a": "^1.6.4" + } }, "node_modules/text-hex": { "version": "1.0.0", @@ -14979,37 +15026,43 @@ } }, "node_modules/ts-jest": { - "version": "29.0.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz", - "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", + "version": "29.3.0", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.3.0.tgz", + "integrity": "sha512-4bfGBX7Gd1Aqz3SyeDS9O276wEU/BInZxskPrbhZLyv+c1wskDCqDFMJQJLWrIr/fKoAH4GE5dKUlrdyvo+39A==", "dev": true, "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", "jest-util": "^29.0.0", "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "^21.0.1" + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.1", + "type-fest": "^4.37.0", + "yargs-parser": "^21.1.1" }, "bin": { "ts-jest": "cli.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", "@jest/types": "^29.0.0", "babel-jest": "^29.0.0", "jest": "^29.0.0", - "typescript": ">=4.3" + "typescript": ">=4.3 <6" }, "peerDependenciesMeta": { "@babel/core": { "optional": true }, + "@jest/transform": { + "optional": true + }, "@jest/types": { "optional": true }, @@ -15021,6 +15074,18 @@ } } }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.38.0.tgz", + "integrity": "sha512-2dBz5D5ycHIoliLYLi0Q2V7KRaDlH0uWIvmk7TYlAg5slqwiPv1ezJdZm1QEM0xgk29oYWMCbIG7E6gHpvChlg==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ts-loader": { "version": "9.4.2", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", @@ -15121,9 +15186,9 @@ } }, "node_modules/tslib": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", - "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -15385,9 +15450,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -15405,7 +15470,7 @@ ], "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -15432,18 +15497,6 @@ "requires-port": "^1.0.0" } }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -15542,18 +15595,18 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.95.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", - "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", + "version": "5.98.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", + "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", "dev": true, "dependencies": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", @@ -15565,9 +15618,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", + "schema-utils": "^4.3.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", + "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, @@ -15605,6 +15658,25 @@ "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/whatwg-mimetype": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", @@ -15637,24 +15709,6 @@ "node": ">= 8" } }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/windows-release": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", @@ -15718,21 +15772,21 @@ } }, "node_modules/winston": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.15.0.tgz", - "integrity": "sha512-RhruH2Cj0bV0WgNL+lOfoUBI4DVfdUNjVnJGVovWZmrcKtrFTTRzgXYK2O9cymSGjrERCtaAeHwMNnUWXlwZow==", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", + "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", - "logform": "^2.6.0", + "logform": "^2.7.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.7.0" + "winston-transport": "^4.9.0" }, "engines": { "node": ">= 12.0.0" @@ -15764,60 +15818,18 @@ } }, "node_modules/winston-transport": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.8.0.tgz", - "integrity": "sha512-qxSTKswC6llEMZKgCQdaWgDuMJQnhuvF5f2Nk3SNXc4byfQ+voo2mX1Px9dkNOuR8p0KAjfPG29PuYUSIb+vSA==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", "dependencies": { - "logform": "^2.6.1", - "readable-stream": "^4.5.2", + "logform": "^2.7.0", + "readable-stream": "^3.6.2", "triple-beam": "^1.3.0" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/winston-transport/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/winston-transport/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/winston-transport/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/winston/node_modules/@colors/colors": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", @@ -15831,46 +15843,6 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" }, - "node_modules/winston/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/winston/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/winston/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", diff --git a/package.json b/package.json index 3a1cb20ad..70471be3f 100644 --- a/package.json +++ b/package.json @@ -80,25 +80,24 @@ "copy-e2e-mocked-mainnet-config:windows": "copy .\\config\\config.e2e-mocked.mainnet.yaml .\\config\\config.yaml", "start-chain-simulator": "docker compose -f \"src/test/chain-simulator/docker/docker-compose.yml\" up -d --build", "stop-chain-simulator": "docker compose -f \"src/test/chain-simulator/docker/docker-compose.yml\" down", - "prepare:test-data": "ts-node src/test/chain-simulator/utils/prepare-test-data.ts" + "prepare:test-data": "ts-node src/test/chain-simulator/utils/prepare-test-data.ts", + "test:ppu": "ts-node src/test/chain-simulator/utils/test-ppu-calculation.ts" }, "dependencies": { "@aws-sdk/client-s3": "^3.54.0", - "@elrondnetwork/erdjs-dex": "^0.2.12-alpha", - "@elrondnetwork/native-auth": "^0.1.19", - "@elrondnetwork/transaction-processor": "^0.1.26", "@golevelup/nestjs-rabbitmq": "^4.0.0", "@multiversx/sdk-core": "^13.2.2", "@multiversx/sdk-data-api-client": "^0.7.0", - "@multiversx/sdk-nestjs-auth": "4.0.1", - "@multiversx/sdk-nestjs-cache": "4.0.1", - "@multiversx/sdk-nestjs-common": "4.0.1", - "@multiversx/sdk-nestjs-elastic": "^4.0.1", - "@multiversx/sdk-nestjs-http": "4.0.1", - "@multiversx/sdk-nestjs-monitoring": "4.0.1", - "@multiversx/sdk-nestjs-rabbitmq": "4.0.1", - "@multiversx/sdk-nestjs-redis": "4.0.1", - "@multiversx/sdk-wallet": "^4.0.0", + "@multiversx/sdk-exchange": "^0.2.21", + "@multiversx/sdk-nestjs-auth": "5.0.0", + "@multiversx/sdk-nestjs-cache": "5.0.0", + "@multiversx/sdk-nestjs-common": "5.0.0", + "@multiversx/sdk-nestjs-elastic": "5.0.0", + "@multiversx/sdk-nestjs-http": "5.0.0", + "@multiversx/sdk-nestjs-monitoring": "5.0.0", + "@multiversx/sdk-nestjs-rabbitmq": "5.0.0", + "@multiversx/sdk-nestjs-redis": "5.0.0", + "@multiversx/sdk-transaction-processor": "^0.1.35", "@nestjs/apollo": "12.0.11", "@nestjs/common": "10.2.0", "@nestjs/config": "3.0.1", @@ -106,6 +105,7 @@ "@nestjs/event-emitter": "^2.0.3", "@nestjs/graphql": "^12.0.11", "@nestjs/microservices": "10.2.4", + "@nestjs/mongoose": "^11.0.3", "@nestjs/platform-express": "10.2.4", "@nestjs/platform-socket.io": "10.2.4", "@nestjs/schedule": "3.0.3", @@ -217,4 +217,4 @@ "node_modules" ] } -} \ No newline at end of file +} diff --git a/scripts/populateAccountDetailsDb.ts b/scripts/populateAccountDetailsDb.ts new file mode 100644 index 000000000..181498e96 --- /dev/null +++ b/scripts/populateAccountDetailsDb.ts @@ -0,0 +1,107 @@ +const { MongoClient } = require("mongodb"); +import scAddressData from "./scAddressTemplate.json"; +import walletAddressData from "./walletAddressTemplate.json"; +import axios from "axios"; +import { AddressUtils } from '@multiversx/sdk-nestjs-common'; +const fs = require('fs'); + +const MONGO_URI = "mongodb://root:secret@localhost:27017"; // Replace with your MongoDB URI +const DATABASE_NAME = "api"; // Replace with your database name +const COLLECTION_NAME = "account-details"; +const ELASTICSEARCH_URL = "https://index.multiversx.com"; + +async function fetchFirstPageFromElastic(url: string, size: number) { + let addresses: any[] = []; + let scrollId = null; + + try { + // First request to initialize sc + const body = { + size, + query: { match_all: {} }, + } + let response: any = await axios.post(`${url}/accounts/_search?scroll=5m`, body); + scrollId = response.data._scroll_id; + addresses = response.data.hits.hits.map((hit: any) => hit._source.address); + // Fetch next batches + + return { addresses, scrollId }; + } catch (error) { + console.error("Error fetching accounts from ElasticSearch:", error); + return { addresses: [], scrollId: null }; + } +} + +async function scroll(url: string, scrollId: string) { + try { + let response = await axios.post(`${url}/_search/scroll`, { + scroll: '20m', + scroll_id: scrollId, + }); + + scrollId = response.data._scroll_id; + + const addresses: any[] = response.data.hits.hits.map((hit: any) => hit._source.address); + return { addresses, scrollId }; + } catch (error) { + console.error(error); + return { addresses: [], scrollId: null }; + } +} +async function populateAccountDetailsDb() { + const client = new MongoClient(MONGO_URI, { + tls: true, + tlsAllowInvalidHostnames: true, + tlsAllowInvalidCertificates: true, + }); + const iterations = 100; + try { + await client.connect(); + console.log("Connected to MongoDB"); + const db = client.db(DATABASE_NAME); + const collection = db.collection(COLLECTION_NAME); + await collection.createIndex({ address: 1 }, { unique: true }); + const scrollSize = 1000; + let addresses: any[] = []; + let scrollId: any = null; + for (let i = 1; i <= iterations; i++) { + ({ addresses, scrollId } = i === 1 + ? await fetchFirstPageFromElastic(ELASTICSEARCH_URL, scrollSize) + : await scroll(ELASTICSEARCH_URL, scrollId)); + + console.log(`Fetched ${addresses.length} addresses from ElasticSearch`); + const scAddressDocuments: any[] = []; + const walletAddressDocuments: any[] = []; + // console.log(addresses) + for (const address of addresses) { + if (AddressUtils.isSmartContractAddress(address)) { + scAddressDocuments.push({ + ...scAddressData, + address + }); + } else { + walletAddressDocuments.push({ + ...walletAddressData, + address + }); + } + } + const filePath = './addresses.txt'; + await fs.promises.appendFile(filePath, addresses.join('\n') + '\n', 'utf8'); + console.log(`Wrote ${addresses.length} addresses to ${filePath}`); + + const result = await collection.insertMany(scAddressDocuments.concat(walletAddressDocuments)); + console.log(`Inserted ${result.insertedCount} documents into the collection`); + console.log(`${iterations - i} iterations left`); + await new Promise(resolve => setTimeout(resolve, 1000)); + + } + } catch (error) { + console.error("Error populating account-details collection:", error); + } finally { + await client.close(); + console.log("MongoDB connection closed"); + } +} + +populateAccountDetailsDb(); \ No newline at end of file diff --git a/scripts/scAddressTemplate.json b/scripts/scAddressTemplate.json new file mode 100644 index 000000000..c57ac26f6 --- /dev/null +++ b/scripts/scAddressTemplate.json @@ -0,0 +1,6172 @@ +{ + "address": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "balance": "0", + "code": "0061736d0100000001d2011f60027f7f0060017f017f60000060027f7f017f60017f0060037f7f7f006000017f60037f7f7f017f60047f7f7f7f0060047f7f7f7f017f60057f7f7f7f7f0060027f7e0060037f7f7e0060047f7f7e7f006000017e60017f017e60057f7f7e7f7f017f60027f7f017e60027e7f0060057f7f7f7e7f0060037f7e7f0060017e017f600b7f7f7e7f7f7f7f7f7f7f7f0060067e7f7f7f7f7f017f60037f7f7f017e60077f7f7f7f7f7f7f017e60037e7f7f017f60057e7f7f7f7f017f60017e017e60067f7f7f7f7f7f0060057f7f7f7e7e0002b6082c03656e760e626967496e74536574496e743634000b03656e7609626967496e74416464000503656e760b7369676e616c4572726f72000003656e760a6d4275666665724e6577000603656e760d6d427566666572417070656e64000303656e76096d4275666665724571000303656e76126d427566666572417070656e644279746573000703656e760a6765744761734c656674000e03656e76106d616e61676564534341646472657373000403656e760f636c65616e52657475726e44617461000203656e760d6d616e6167656443616c6c6572000403656e760f6d4275666665724765744279746573000303656e760f6973536d617274436f6e7472616374000103656e76136d616e616765644f776e657241646472657373000403656e7612626967496e7447657443616c6c56616c7565000403656e76106d4275666665724765744c656e677468000103656e761c6d616e616765644765744d756c74694553445443616c6c56616c7565000403656e76126d427566666572476574417267756d656e74000303656e76126d616e616765645369676e616c4572726f72000403656e76136765744e756d455344545472616e7366657273000603656e7611676574417267756d656e744c656e677468000103656e761b736d616c6c496e74476574556e7369676e6564417267756d656e74000f03656e7619626967496e74476574556e7369676e6564417267756d656e74000003656e760f6765744e756d417267756d656e7473000603656e760d6d42756666657246696e697368000103656e7609626967496e744e6577001503656e760f6d4275666665725365744279746573000703656e76136d42756666657253746f7261676553746f7265000303656e76186d616e616765644765744f726967696e616c547848617368000403656e760a626967496e745369676e000103656e76146d427566666572436f707942797465536c696365000903656e7609626967496e74537562000503656e76196d42756666657246726f6d426967496e74556e7369676e6564000303656e76176d427566666572546f426967496e74556e7369676e6564000303656e761776616c6964617465546f6b656e4964656e746966696572000103656e76126d42756666657253746f726167654c6f6164000303656e76176d616e6167656447657445534454546f6b656e44617461001603656e760d676574426c6f636b45706f6368000e03656e76106d616e616765644173796e6343616c6c000803656e761b6d616e616765645472616e7366657256616c756545786563757465001003656e76226d616e616765644d756c74695472616e73666572455344544e465445786563757465001003656e761b6d616e61676564457865637574654f6e44657374436f6e74657874001703656e760e636865636b4e6f5061796d656e74000203656e76136d42756666657247657442797465536c696365000903d501d30101060a0200090311010300000a0707180108001906000000001200010004031a05000d061b0d08060601020604060102010802080707010101030107030106010400040402000100010003040404040000051200000605000b040604030a000000030b00011c13000100010709000801051108070501090003030001080809000504010f0001010004000b0300030303050303000d0c0a000c0c0c1d1314030300010405051e040003060005000a1401050100000504040403040002020202020202020202020202020202020202020202020705030100110619037f01418080c0000b7f0041d5dfc0000b7f0041e0dfc0000b07880419066d656d6f7279020004696e697400e7010863616c6c4261636b00e801126164644661726d546f57686974656c69737400e901176164644c69717569646974794c6f636b6564546f6b656e00ea01106164644c70546f57686974656c69737400eb0114656e7465724661726d4c6f636b6564546f6b656e00ec0113657869744661726d4c6f636b6564546f6b656e00ed011b6661726d436c61696d526577617264734c6f636b6564546f6b656e00ee01136765744661726d50726f7879546f6b656e496400ef010d6765744b6e6f776e4661726d7300f001166765744b6e6f776e4c6971756964697479506f6f6c7300f101106765744c6f636b6564546f6b656e496400f201116765744c7050726f7879546f6b656e496400f3011369737375654661726d50726f7879546f6b656e00f4011069737375654c6f636b6564546f6b656e00f5011169737375654c7050726f7879546f6b656e00f6010a6c6f636b546f6b656e7300f7011772656d6f76654661726d46726f6d57686974656c69737400f8011a72656d6f76654c69717569646974794c6f636b6564546f6b656e00f9011572656d6f76654c7046726f6d57686974656c69737400fa011d7365745472616e73666572526f6c6550726f78794661726d546f6b656e00fb010c756e6c6f636b546f6b656e7300fc010a5f5f646174615f656e6403010b5f5f686561705f6261736503020aaaab01d3011601017f102d220142001000200120012000100120010b1b01017f419091c000419091c00028020041016b220036020020000b2e000240200120024d0440200220044d0d01102f000b102f000b2000200220016b3602042000200120036a3602000b0500105b000bc10102057f017e230041206b2202240020002001280204220341106a220520012802084d047e200241106a42003703002002420037030820012802002802002003200241086a2204411010311a2002410036021c20042002411c6a2206103221032004200610332107200241086a2002411c6a10322104200120053602042000411c6a2004360200200041186a2003360200200041106a20073703002000200128020c22033602082001200341016a36020c42010542000b370300200241206a24000b0d00200020012002200310a2010b7401017f230041106b220224002002410036020c2002200020012802002200200041046a220010a8012002410c6a41042002280200200228020410a90120012000360200200228020c2100200241106a24002000410874418080fc077120004118747220004108764180fe0371200041187672720bb10102017e017f230041106b22032400200342003703082003200020012802002200200041086a220010a801200341086a41082003280200200328020410a9012001200036020020032903082102200341106a2400200242288642808080808080c0ff00832002423886842002421886428080808080e03f8320024208864280808080f01f838484200242088842808080f80f832002421888428080fc07838420024228884280fe038320024238888484840b0f01017f10032201200010041a20010b0b0020002001100541004a0be00102027f017e230041206b22022400200241086a22032001103410372002410036021c20032002411c6a4104418e80c00041191038024020022d001f044020022d001c450d010b200241086a418e80c000411910391a0b200241086a2203418e80c0004119103a21012003418e80c0004119103b2104200241086a418e80c0004119103a103c21032002280218200228021446044020022d00100440419491c000410036020041a8dfc00041003a00000b2000200336020c2000200136020820002004370300200241206a24000f0b418e80c0004119418080c000410e103d000b2b01017f20002001100f22023602102000410036020c200041003a000820002002360204200020013602000b21002000200028020c2001200210aa01044020032004419483c000410f103d000b0b3001017f230041106b22032400200341003a000f20002003410f6a41012001200210d90120032d000f200341106a24000b5d01037f230041106b22032400200020012002109f012104200341086a2000280200200028020c22052004109e012003280208410147044020012002419483c000410f103d000b200328020c2000200420056a36020c200341106a24000b3602017f017e230041106b22032400200342003703082000200341086a220041082001200210d90120004108109d01200341106a24000b0d002000102d220010211a20000b160020002001104a22002002200310061a20001012000b0900200020011002000b8d0202027f017e230041306b22072400104022082000104120082001104220082002104120082003104220082004104110401034210002402005280210220141feffffff074704402001200010430c010b410420001044200041ed83c000410410061a0b200529030020001045200529030820001045200820001046024020062802002200104745044020072000100f36022820074100360224200720063602200340200741186a200741206a10482007280218450d022008200728021c10410c000b000b200810490b200741106a100741de80c000410d104a2008104b4100104c2007280210410146044020072007280214104d2007290308420020072802001b21090b200741306a240020090b1401017f102d220041c88cc0004100101a1a20000b0d0010401a20002001103410460b0e0010401a2000200110900110460b5201027f230041106b2202240020022000100f22034118742003410874418080fc07717220034108764180fe03712003411876727236020c20012002410c6a410410a0012001200010a301200241106a24000b4701017f230041106b2202240020022000410874418080fc077120004118747220004108764180fe03712000411876727236020c20012002410c6a410410a001200241106a24000b820101017f230041106b220224002002200042288642808080808080c0ff00832000423886842000421886428080808080e03f8320004208864280808080f01f838484200042088842808080f80f832000421888428080fc07838420004228884280fe038320004238888484843703082001200241086a410810a001200241106a24000b4701017f230041106b2202240020022001410874418080fc077120014118747220014108764180fe03712001411876727236020c20002002410c6a410410061a200241106a24000b07002000100f450b8b0101037f230041106b220324002001280204220241046a220420012802084b047f4100052003410036020c200128020028020020022003410c6a410410311a200328020c2102200120043602042002410874418080fc077120024118747220024108764180fe037120024118767272210241010b21012000200236020420002001360200200341106a24000b1801017f1040220141c88cc0004100101a1a2000200110460b1101017f102d220220002001101a1a20020b14004167100820004167104f20012002105010090b6501017f230041106b220324002003410036020c200120024102742003410c6a410410312102200328020c21012000200241017336020020002001410874418080fc077120014118747220014108764180fe037120014118767272360204200341106a24000bb40102027e027f230041106b2204240002402001100f220541084b0d002004420037030820014100200420056b41106a200510a2010d0020042903082202423886200242288642808080808080c0ff0083842002421886428080808080e03f8320024208864280808080f01f838484200242088842808080f80f832002421888428080fc07838420024228884280fe038320024238888484842102420121030b2000200237030820002003370300200441106a24000b5101047f1040210610402107230041106b220424001040210520011034210120042003102c36020c2004200237030020042001360208200520041093012000200542002006200710281a200441106a24000b0e01017f102d22004200100020000b150020002001200220032004102d220110291a20010b2300200141feffffff074704402000200120022003104e0f0b200020031040104010520b0f002000200142002002200310271a0b0c01017f102d2200100a20000b0c01017f102d2200100820000b1600200041b5dfc000100b1a41b5dfc000100c41004a0b1e01017f102d2200100d20001053103504400f0b41c88cc00041241002000b2d01017f41b0dfc0002d000022000440417541ffffffff0720001b0f0b41b0dfc00041013a00004175100e41750bbd0101037f230041d0006b2201240020011059220236020c02402002105a41014604402002100f21022001410036022c200120023602282001410036022420012001410c6a360220200141406b21020340200141306a200141206a10302001290330500d0220012802382203450440200141186a200241086a290300370300200120022903003703100c010b0b105b000b41eb80c00041221002000b20002001290310370300200041086a200141186a290300370300200141d0006a24000b2d01017f41b4dfc0002d000022000440416b41ffffffff0720001b0f0b41b4dfc00041013a0000416b1010416b0b09002000100f4104760b060010fd01000b0d002000102d220010111a20000b3001017f418d81c0004117104a22042000200110061a200441a481c000410310061a20042002200310061a20041012000b130010134504400f0b41a781c00041251002000b3c01017f0240200128020041acdfc0002802004e0440410121040c010b200120022003106020022003106121010b20002001360204200020043602000b3101017f2000280200220341acdfc0002802004e04402001200241cc81c0004111105d000b2000200341016a36020020030b20002000105c2200100f41204704402001200241c28ac0004110105d000b20000b3101017e200041f68ac00041061060101522014280808080105a044041f68ac0004106418080c000410e105d000b2001a70b0f00200041f68ac00041061060105c0b0b00200041fc8ac00010650b0c0020002001410b106710340b2c00200041878bc000410e106710342200100f412047044041878bc000410e41c28ac0004110105d000b20000b5201027f230041106b22032400200341086a200028020020002802082204104c20032802084101460440200328020c2000200441016a3602081034200341106a24000f0b2001200241cc81c0004111105d000b0a0041002000200110610b5a02017f017e0240024020001014450d002000101522024280025a0d01024002402002a741ff01710e020201000b418686c000410941b98cc000410d105d000b410121010b20010f0b418686c0004109418080c000410e105d000b2801017e4102101522004280808080105a0440419b86c000410c418080c000410e105d000b2000a70b0c002000102d2200101620000b1a00200041acdfc00028020048044041dd81c00041121002000b0b1400200020014b044041dd81c00041121002000b0b1500101720004604400f0b41ef81c00041191002000b1b00200041acdfc0002802004c04400f0b41cc81c00041111002000b0c0041acdfc00010173602000b1f01017f2001107221022000410036020820002002360204200020013602000b09002000100f4102760b1800027f20001074450440200110340c010b10400b10181a0b0e002000416710231a4167100f450b2c01017f200110ae012102410121010340200120024d044020002001107610181a200141016a21010c010b0b0b0c002000200110b70110b1010b0d0020001078200041106a10780b5901027f230041106b220124002001107a200120012d00043a000c200120012802003602082000280208200141086a2202107b20002903002002107e200028020c2002107f200128020820012d000c108001200141106a24000b850101027f230041106b220124002001107a200120012d00043a000c2001200128020036020802402000280208220241feffffff074704402002200141086a107b0c010b4104200141086a2202107c200241ed83c0004104107d0b2000290300200141086a2202107e200028020c2002107f200128020820012d000c108001200141106a24000b3701027f230041106b22012400200141086a10870120012802082102200020012d000c4101713a000420002002360200200141106a24000bf60101047f230041106b2203240020032000100f22024118742002410874418080fc07717220024108764180fe03712002411876727236020c20012003410c6a4104107d20012d00042102200141003a00040240024002402002410171220204402000100f22054190ce00419491c00028020022046b4b0d0220032004200420056a220410dc01200041002003280200200328020410311a419491c00020043602000c010b2001280200200010a3010b200120023a00040c010b200110ad012001280200200010a30120012d0004200120023a0004410171450d00419491c000410036020041a8dfc00041003a00000b200341106a24000b4601017f230041106b2202240020022000410874418080fc077120004118747220004108764180fe03712000411876727236020c20012002410c6a4104107d200241106a24000b830101027f230041106b220324000240024020002d000404404190ce00419491c00028020022046b2002490d01200341086a2004200220046a220010dc012003280208200328020c2001200210a901419491c00020003602000c020b20002802002001200210061a0c010b200010ad0120002802002001200210061a0b200341106a24000b810101017f230041106b220224002002200042288642808080808080c0ff00832000423886842000421886428080808080e03f8320004208864280808080f01f838484200042088842808080f80f832000421888428080fc07838420004228884280fe038320004238888484843703082001200241086a4108107d200241106a24000b0b0020001090012001107b0b0c002000200110880110181a0b0b00419682c0004120104a0b6c01037f1040210310402104104f21052000200236021c2000200336021820002005360214200020013602102000427f370300200041086a427f370300200041306a4100360200200041c88cc00036022c200041286a4100360200200041c88cc000360224200020043602200b0d0010401a20012000103410460b3601017f230041106b220224002002420037030820022001200241086a10da01200020022802002002280204101a1a200241106a24000bc00101057f230041306b2201240020002802104101460440108601200141106a10870120012001280210360218200120012d00144101713a001c200041146a280200200141186a2203107b200041186a2204280200220510722003107c20012005100f36022820014100360224200120043602200340200141086a200141206a104820012802080440200128020c200141186a107b0c010b0b200128021820012d001c108801101b1a0b200028020020002802042000280208200028020c1026000b1c01027f102d2200101c418a83c000410a104a2201200010041a20010b7301027f230041106b220124002000027f41a8dfc0002d0000220245044041a8dfc00041013a0000419491c0004100360200200141086a410010ab012001280208200128020c41c88cc000410010a90110400c010b41c88cc0004100104a0b360200200020024101733a0004200141106a24000b4b01017f230041106b22022400200220013a000c20022000360208200241086a10ad01200228020820022d000c0440419491c000410036020041a8dfc00041003a00000b200241106a24000b7001017f20022003104a210210402103104f21052000200236021c2000200436021820002005360214200020013602102000427f370300200041086a427f370300200041306a4100360200200041c88cc00036022c200041286a4100360200200041c88cc000360224200020033602200bfc04020c7f037e230041e0006b2206240020012802302109200128022c210a2001280228210b2001280224210c20012802202103200128021c210420012802142105200128021021072001290308210e2001290300210f02400240024020012802182208105a0e020201000b20062001413810fe012102104021081040220320022802101041200320022802182204105a108b0120022004100f3602402002410036023c2002200241186a3602380340200241c8006a200241386a108c012002290348500440200228021c10474504402003200228021c10410b10542107104f210541db82c0004114104a21042002290300210f2002290308210e20032002280220108d012103200241306a2802002109200241286a280200210b200228022c210a2002280224210c0c0305200228025c21042002290350210e2003200228025810412003200e108e012003200410420c010b000b000b20062008108f0120062903004201520d00200641146a2802002105200641106a280200210d200629030821101040210810402202200d1041027f024002400240201050044020022005104220041047450d010c030b20022010108e01200220051042200220071041200410470d012002200410410c010b2002200410410c010b10542107104f210541ef82c000410f104a0c010b104f210541fe82c000410c104a0b210420022003108d0121030b200120093602302001200a36022c2001200b3602282001200c360224200120033602202001200436021c2001200836021820012005360214200120073602102001200e3703082001200f370300200041003602102000200336020c200020043602082000200536020420002007360200200641e0006a24000b1401017f104022022001ad1084012000200210460ba40102057f017e230041206b2202240020002001280204220341106a220520012802084d047e200241106a42003703002002420037030820012802002802002003200241086a2204411010311a2002410036021c20042002411c6a2206103221032004200610332107200041146a200241086a2002411c6a1032360200200041106a2003360200200020073703082001200536020442010542000b370300200241206a24000b0b002000200110041a20000b1301017f1040220220011084012000200210460b8c0102047f027e230041206b22022400200241106a42003703002002420037030820014100200241086a22034110103121012002410036021c20032002411c6a2204103221052003200410332107200241086a2002411c6a1032210320002001047e42000520002007370308200041146a2003360200200041106a200536020042010b370300200241206a24000b0f01017f102d2201200010201a20010b0f002000427f51047e10070520000b0b3d01017f230041106b220524002005200436020c20052003370300200520023602082001280218200510930120002001413810fe011a200541106a24000bde0102027f017e230041106b220324002003200128020822024118742002410874418080fc07717220024108764180fe0371200241187672723602002003200128020c22024118742002410874418080fc07717220024108764180fe03712002411876727236020c200320012903002204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe0383200442388884848437020420002003411010061a200341106a24000b5a01027f230041406a22022400200241086a22012000413810fe011a20002001109501200041086a29030010910120002802102000280214200028021c20002802201050210010092001200010712001109601200241406b24000be405020b7f037e230041e0006b22042400024002400240024020012802182203105a0e020201000b20042001413810fe012101104021051040220220012802101041200220012802182203105a108b0120012003100f3602402001410036023c2001200141186a3602380340200141c8006a200141386a108c012001290348500440200128021c10474504402002200128021c10410b10542103104f210641db82c0004114104a21072001290300210d2001290308210e20022001280220108d0121022000200736021c200020053602182000200636021420002003360210200020023602202000200e3703082000200d3703002000200129022c37022c200020012902243702240c0405200128025c21032001290350210d2002200128025810412002200d108e012002200310420c010b000b000b2001280234210820012802302106200128022c21072001280228210a2001280224210b2001280220210c200128021c210220012802142109200128021021052001290308210e2001290300210f20042003108f010240027f0240024020042903004201510440200441146a2802002103200441106a28020021082004290308210d1040210910402201200810410240200d50044020012003104220021047450d010c040b2001200d108e01200120031042200120051041200210470d022001200210410c020b2001200210410c020b20002008360234200020063602302000200736022c2000200a3602282000200b3602242000200c3602202000200236021c2000200336021820002009360214200020053602100c030b10542105104f210241ef82c000410f104a0c010b104f210241fe82c000410c104a0b21032001200c108d0121012000200336021c200020093602182000200236021420002005360210200041306a20063602002000200736022c200041286a200a3602002000200b360224200020013602200b2000200e3703082000200f3703000c010b20002001413810fe011a0b200441e0006a24000b2b01017f10402101037f200028020820002802044f047f2001052001200041d082c000106510460c010b0b0b4601027f230041106b2203240020022000280200460440200341086a41002002200041046a4120102e2003280208200328020c2001200210980121040b200341106a240020040b5301027f2001200346047f4100210302402001450d00034020002d0000220420022d00002205460440200041016a2100200241016a2102200141016b22010d010c020b0b200420056b21030b20030541010b450b9d0101057f230041306b22022400200241286a22034200370300200241206a22044200370300200241186a2205420037030020024200370310200241086a200241106a41202001100f2206109a01200141002002280208200228020c10311a200020063602002000411c6a2003290300370000200041146a20042903003700002000410c6a200529030037000020002002290310370004200241306a24000b3b01017f230041106b22042400200441086a4100200320012002102e200428020c21012000200428020836020020002001360204200441106a24000b6f01047f230041106b220124002001410036020c20002001410c6a22024104109c0120012000280200200028020c220320024104109d01a72202109e012001280200410147044041d082c000410b419483c000410f105d000b20012802042000200220036a36020c200141106a24000b180020002001200210e0012000200028020c20026a36020c0b3401017e02402001450d0003402001450d01200141016b210120003100002002420886842102200041016a21000c000b000b20020b1f0020012002200310032201101e21022000200136020420002002453602000b3702017f017e230041106b220324002003410036020c20002003410c6a220041042001200210d90120004104109d01200341106a2400a70b0b0020002001200210061a0b1300417f2000101d220041004720004100481b0b0f002000200120032002102b4100470b09002000200110041a0b2401017f102d220220002001101f2002101d410048044041808ec00041301002000b20020b3701017f230041106b22022400200241086a20002001104c200228020845044041a383c000411d1002000b200228020c200241106a24000b4b01017f230041206b22022400200241086a2001108f01200229030850044041a383c000411d1002000b20002002290310370300200041086a200241186a290300370300200241206a24000b0900200010224100470b3b01017f230041106b22042400200441086a2002200320014110102e200428020c21012000200428020836020020002001360204200441106a24000b18002001200346044020002002200110fe011a0f0b105b000bba0101037f230041106b22042400027f024020002d000845044020002802002206100f210541a8dfc0002d000020054190ce004b720d01419491c000200536020041a8dfc00041013a0000200441086a200510ab01200641002004280208200428020c10311a200041013a00080b4101200120036a2200419491c0002802004b0d011a20042001200010ac01200220032004280200200428020410a90141000c010b200041003a0008200620012002200310310b200441106a24000b3f01017f230041106b22022400200241086a419891c0004190ce002001109a01200228020c21012000200228020836020020002001360204200241106a24000b33000240200120024d044020024190ce004d0d01102f000b102f000b2000200220016b36020420002001419891c0006a3602000b5e01027f230041106b2201240020002d0004200041003a00044101710440200141086a4100419491c00028020010ac0120002802002001280208200128020c10061a419491c000410036020041a8dfc00041003a00000b200141106a24000b2301017e200010af0122014280808080105a0440418080c000410e10b001000b2001a70b6402027f017e230041106b2201240020014200370308200010b2012200100f220241094f0440418080c000410e10b001000b2001200141086a41082002109a0120004100200128020022002001280204220210a2011a20002002109d01200141106a24000b1b01017f41ac8ac0004116104a22022000200110061a20021012000b1e00200010b2012200100f412047044041c28ac000411010b001000b20000b0d002000102d220010231a20000b090020002001101b1a0b1200416c41004100101a1a2000416c101b1a0b0a0020002001ad10b6010b3801017f230041106b220224002002420037030820022001200241086a10da01200020022802002002280204104a101b1a200241106a24000b1a00200010342200418384c000410510061a20012000104420000b18002000200110b9014504400f0b418884c00041151002000b0b002000200110354101730bb40101077f024020002802002205200110bb012202044002402002200041086a280200220410ae0122034d0440200220034622070d01200410ae012003490d0320002802042208200310762106200410ae012002490d032008200210b701200610b3010c010b0c020b200410ae012003490d012000280204200310b70110b4012004200341016b10b501200745044020052006200210bc010b2005200110bd0110b4010b20024100470f0b41f183c00041121002000b0c002000200110bd0110ae010b0f002000200110bd012002ad10b6010b1b0020001034220041bd84c000410610061a2000200110a30120000b5201047f20002802002203200110bb012204450440200041086a280200220210ae012105200041046a280200200541016a220010b701200110b3012002200010b50120032001200210ae0110bc010b2004450b1500200020012802082001290300200128020c104e0b6001037f2001103421041040220120041041027f2002500440410d210541d180c0000c010b20012002108e014112210541bf80c0000b2106200120031042100720062005104a2001104b1a2000200336020c20002002370300200020043602080bb20101087f230041106b2203240010542001200242001019220410032205100322061003220710032208100322014200101922091003220a10242001100f450440200141d68ac0004120101a1a0b200341003b010e200541002003410e6a410210a2011a200020024200523a001c200020043602002000200a36021820002009360214200020013602102000200836020c2000200736020820002006360204200020032d000e4100473a001d200341106a24000bad0202057f017e230041406a2205240020011034210810402106104f210920051040220736022c104022012008104120012003104220012006104120012009104220012007104110401034210620042d0018200610c30120042802102006104320042903002006104520042802142006104320042903082006104520012006104602402007104745044020052007100f3602382005410036023420052005412c6a3602300340200541206a200541306a10482005280220450d022001200528022410410c000b000b200110490b200541186a100741de80c000410d104a2001104b4100104c20052802184101460440200541086a200528021c104d2005290310420020052802081b210a0b2000200336020c2000200a370300200020083602082002200010bf01200541406b24000b2e01017f230041106b220224002002200041ff01714100473a000f20012002410f6a410110a001200241106a24000b860202037f017e230041406a22032400200341086a2001200210c101200341286a220420032802141034103741002101024002400240200441c083c0004120103941ff01710e020201000b41c083c000412041b98cc000410d103d000b410121010b200341286a220441c083c0004120103a2105200441c083c0004120103b2102200341286a41c083c0004120103a2104200341286a41c083c0004120103b21062003280238200328023446044020032d00300440419491c000410036020041a8dfc00041003a00000b200020013a001820002004360214200020053602102000200637030820002002370300200341406b24000f0b41c083c0004120418080c000410e103d000bdb0102037f017e230041406a22032400200341086a2001200210c101200341286a2204200328021410341037200441c083c0004120103a2101200341286a41c083c0004120103a2105200441c083c0004120103b2102200341286a41c083c0004120103a2104200341286a41c083c0004120103b21062003280238200328023446044020032d00300440419491c000410036020041a8dfc00041003a00000b2000200436021820002005360214200020013602102000200637030820002002370300200341406b24000f0b41c083c0004120418080c000410e103d000be90102027f017e230041406a22032400200341086a2001200210c101200341286a2201200328021410341037200141c083c0004120103a2201100f41044604402003410036023c200141002003413c6a2204410410a2011a41feffffff0720012004410441ed83c00041041098011b21010b200341286a41c083c0004120103b2102200341286a41c083c0004120103b21052003280238200328023446044020032d00300440419491c000410036020041a8dfc00041003a00000b200020013602102000200537030820002002370300200341406b24000f0b41c083c0004120418080c000410e103d000b9b0201037f23004180016b2206240020001074044002402005280200450440105341d784c0004110104a210510402207108301200020071083010c010b200541086a2802002107200528020421050b230041406a22002400200041086a220810810141b682c0004116104a108201200028022041c88cc0004100101a1a2000200136021c2002200641c8006a22022008413810fe012802202201108301200320011083011040220341cc82c0004104101a1a200120031046104022032004ad108401200120031046200041406b2400200641286a2002108a01200641206a20073602002006411c6a2005360200200641013602182006200629032837030820062006290330370310200641086a108501000b41c384c00041141002000b1400200020012003200410c0012002200010bf010b4501027f1040220320001041027f2001500440410d210441b280c0000c010b20032001108e01410b210441a780c0000b2100200320021042100720002004104a2003104b1a0b21002000200110cb0122001074450440200010b1010f0b41e784c0004135103e000b2101017f41818cc0004113104a21022000280200200210432001200210c30120020b5c02037f017e230041106b22022400200128020c220410cd010440200241086a10ce01200228020c2203200128020810b801200020032001290300220510c40120032005200410c901200241106a24000f0b41be8ec000410a103e000b0e00200010a10141ff01714101460b3d01027f230041106b22012400200141086a41f18bc0004110104a10df01200128020c21022000200128020836020020002002360204200141106a24000b6802017f017e230041406a22032400200341086a200110990102402003280208450440200041003602000c010b200341306a2001200210d0012003280230450440200041003602000c010b2003290234210420004101360200200020043702040b200341406b24000b8f0501057f230041e0006b22032400200341086a2001109901024002402003280208450d000240200341086a41d784c0004110109701450440200341086a41958bc000411c1097010d012000200136020420004101360200200041086a20023602000c030b10704100106f20034100360240200341d0006a2105230041106b22012400027f200341406b220722041062220645200641ebde014672450440027f200428020041acdfc0002802004e044010400c010b200410630b2104200120063602042001410136020041080c010b200441f68ac00041061060105c21042001410036020041040b20016a200436020020052001290300370200200541086a200141086a280200360200200141106a24002003280240106c200328025020032802542104200341306a200210711070200341c8006a2202200341386a28020036020020032003290330370340200710662106200341d8006a220720022802003602002003200329034037035020051064210220032802542007280200106d4504402002200410b3010c020b200610e1010c010b10704100106f20034100360240200341d0006a2101027f4100200341406b22051062220645200641ebde0146720d001a200528020041acdfc0002802004e04401040210441010c010b20051063210441010b21072001200436020820012006360204200120073602002003280240106c2003280250200341306a200210711070200341c8006a2202200341386a28020036020020032003290330370340200510662105200341d8006a220620022802003602002003200329034037035020011064210120032802542006280200106d450440200341d0006a10582001200328025810b3010c010b200510e1010b200041003602000b200341e0006a24000b940201087f230041306b220524000240200228020c220710a10141ff0171044002402003a74101470d00200510d201200541086a20052802042208200410c601102520052903105a0d002005200810342209360224200510402206360228200541086a200610d301200541246a200541286a10d401220610af01220350044010d501210a104f210b1040210c2005104036022c20062009200a2002280208200b200c200541086a2005412c6a103f220310b6010b2000200820012003200710c8010c020b2001200241086a220128020020022903002007104e200041086a2001290300370300200020022903003703000c010b20002002290300370300200041086a200241086a2903003703000b200541306a24000b3d01027f230041106b22012400200141086a41948cc000410d104a10df01200128020c21022000200128020836020020002002360204200141106a24000b4401017f02402000280210220241feffffff07460440410420011044200141ed83c000410410a0010c010b2002200110430b2000290300200110452000290308200110450b2301017f41a18cc0004118104a210220002802002002104320012802002002104320020b0e01017f102d22004201100020000bbf0102037f017e230041206b22022400200210d2012002280204220310342104024002402001280208200410354504402000420037031020002001290300370300200041086a200141086a2903003703000c010b200241086a20032001290300220510c60120032005200128020c220110c9012002280218220341feffffff07460d01200042013703102000200136020c2000200336020820002002290308370300200041186a20053703000b200241206a24000f0b41e083c000410d1002000b8e0102017f017e230041406a22032400200341086a2001109901024020032802080440200341306a2001200210cf012003280230450440200041003602000c020b200341306a2003280234200341386a28020010d0012003280230450440200041003602000c020b2003290234210420004101360200200020043702040c010b200041003602000b200341406b24000b3002017f017e200128020810342102200129030021032000200128020c102c36020c20002003370300200020023602080b1b002000200120022003200410382000200028020c20026a36020c0bc50101027f2002200142288642808080808080c0ff00832001423886842001421886428080808080e03f8320014208864280808080f01f838484200142088842808080f80f832001421888428080fc07838420014228884280fe038320014238888484843700000240200150044041c88cc00021040c010b03400240024020034108470440200220036a22042d0000450d02200341094f0d01410820036b21030c040b105b000b10fd01000b200341016a21030c000b000b20002003360204200020043602000b2e01017f20002802002101200041feffffff07360200200141feffffff0746044041938ac00041191002000b20010b4001017f230041106b22032400200341086a20012002419891c0004190ce00102e200328020c21012000200328020836020020002001360204200341106a24000b2301017f41feffffff072101200041feffffff0747047f200010340541feffffff070b0b3201027f20011034210220011034220341d28ac000410410061a200041086a200336020020002001360204200020023602000b13002000200110b201360204200020013602000b24002000200028020c2001200210aa01044041d082c000410b419483c000410f105d000b0b1f01017f1057220110a10141ff01714101460440200020011040104010520b0b3d01027f230041106b22012400200141086a41b18bc000410e104a10df01200128020c21022000200128020836020020002002360204200141106a24000b1000200041bf8bc0004113104a10de010b2301017f41d28bc0004115104a210220002802002002104320012802002002104320020b1000200041e78bc000410a104a10de010bdd0102027f017e230041206b220224002002200141d082c000410b10671037200241003602142002200241146a410410e001024020022d0017044020022d0014450d010b200241003a00182002200241186a4101109c010b2002109b012101200242003703182002200241186a22034108109c0120034108109d0121042002109b01103c21032002280210200228020c4604402000200336020c200020013602082000200437030020022d00080440419491c000410036020041a8dfc00041003a00000b200241206a24000f0b41d082c000410b418080c000410e105d000b0800102a4100106e0be10301057f230041e0006b22002400024002400240108601220410b201220110470d00200041286a22022001103410372002418e80c0004119103a21012002418e80c0004119109f012102104021030340200204402003200041286a418e80c0004119103a1046200241016b21020c010b0b20002802382000280234470d0120002d00300440419491c000410036020041a8dfc00041003a00000b200410b401200020011099012000280200450d00200041286a20011099012000280228450d00200041d0006a2001200310cf012000280250450d00200041d0006a2000280254200041d8006a220128020010d0012000280250450d00200041286a2000280254200128020010cf012000280228450d00200041286a200028022c200041306a220128020010d0012000280228450d00200041286a200028022c200128020010d7012000280228450d00200041306a2802002101200041286a200028022c22021099012000280228450d00200041d0006a2002200110cf012000280250450d00200041d0006a2000280254200041d8006a220128020010d7012000280250450d00200041d0006a2000280254200128020010d00120002802500d020b200041e0006a24000f0b418e80c0004119418080c000410e103d000b41dc86c00041361002000b7c01047f230041206b22002400102a10564103106e418f86c000410c106821014101105c21024102106921032000200236020c02402001105504402000410c6a200310cb01200110b301200041106a220210e5012002200110be01450d01200041206a24000f0b41fd8fc0004112103e000b419c85c000411a103e000b9911020f7f047e230041d0026b220024004102106e4100106b21064101106b21072000105922013602980202402001105a41024604402001100f2101200041003602840120002001360280012000410036027c200020004198026a360278200041c8016a21010340200041b8016a200041f8006a103020002903b801500d0220002802c001220241014d0440200041286a20024104746a22022001290300370300200241086a200141086a2903003703000c010b0b105b000b41eb80c00041221002000b200041a0016a2201200041306a2202290300220f370300200041a8016a2203200041386a22042903002211370300200041b0016a2205200041406b2208290300221237030020002000290328221037039801200041e0006a200f37030020002010370358200041f0006a2209201237030020002011370368200041c0016a220a200f370300200020103703b801200041286a200041b8016a10d601200120092903003703002000200029036837039801200041d8016a20004198016a10d601200041d0016a2008290300220f370300200041c8016a20042903002210370300200a200229030022113703002000200029032822123703b80120004190016a200f37030020004188016a201037030020004180016a22022011370300200020123703782005200041f0016a2903003703002003200041e8016a2903003703002001200041e0016a290300370300200020002903d80137039801024002400240024002402002200110e4012203107404402001200210e401220310740d0120004180016a2201290300210f2001200041a0016a220129030037030020004188016a220229030021102002200041a8016a220229030037030020004190016a220429030021112004200041b0016a22042903003703002001200f37030020022010370300200420113703002000290378210f20002000290398013703782000200f370398010b200310b1012101200029038801221142015220002903a801221042015271450440200029037820002903980184500440200028028001220820002802a001220910b901450d0310402102200041b8016a2203200041f8006a10d80120022003109301200320004198016a10d80120022003109301200020013602880220004188026a10db01210410401a41b286c000410c104a210110402103104f210520032006104220032007104202402002105a0e020605000b200041c0016a427f3703002000427f3703b801200041003602e801200041c88cc0003602e401200041003602e001200041c88cc0003602dc01200020033602d801200020013602d401200020023602d001200020053602cc01200020043602c80110401a104022032004104120032002105a108b0120002002100f3602a0022000410036029c022000200041d0016a360298020340200041286a20004198026a108c01200029032850044020002802d4011047450440200320002802d40110410b10542104104f210541db82c0004114104a210120002903c001210f200320002802d801108d012103200f427f520d080c0705200028023c21012000290330210f2003200028023810412003200f108e012003200110420c010b000b000b41e98ec0004138103e000b41ba89c0004133103e000b41ed89c000411c103e000b41e58fc0004118103e000b200041b8016a2002108f0120002903b8014201520d00200041cc016a2802002105200041c8016a280200210620002903c001210f10401a1040220220061041027f024002400240200f50044020022005104220011047450d010c030b2002200f108e01200220051042200220041041200110470d012002200110410c010b2002200110410c010b10542104104f210541ef82c000410f104a0c010b104f210541fe82c000410c104a0b210120022003108d0121030b1007210f0b200f2004200520012003105021011009200041286a220220011071200041b8016a200210e601200041c8016a200210e601200041d8016a200210e601200041e4016a2802002103200041e0016a2802002101200041d4016a280200210420002802c401210520002802c001210202402008200041d0016a2802002206103504402009200110350d010b41a18fc0004121103e000b200028028401200410a401210420002802a401200310a401210710532103200020043602c401200020063602c001200042003703b801200041f8016a2003200041b8016a2204201120004190016a290300220f10d101200020073602c401200020013602c001200042003703b80120004188026a200320042010200041b0016a290300221210d101200210342106200041206a10e2012000200028022422071034220a3602cc02200010402201360298022002200110432008200110434200200f2011501b221120011045200920011043420020122010501b221020011045200041cc026a20004198026a10d401220b10af01220f50044010d501210c104f210d1040210e20001040220436022810402201200a10412001200c10422001200610412001200d10422001200e10412002104010342202104320082002104320112002104520092002104320102002104520012002104602402004104745044020002004100f3602c001200041003602bc012000200041286a3602b8010340200041186a200041b8016a10482000280218450d022001200028021c10410c000b000b200110490b200041106a100741de80c000410d104a2001104b4100104c4200210f2000280210410146044020002000280214104d2000290308420020002802001b210f0b200b200f10b6010b20004198026a20072003200f200510c801200041c0016a20004180026a290300370300200041d0016a20004190026a290300370300200041e0016a200041a0026a290300370300200020002903f8013703b80120002000290388023703c80120002000290398023703d801200041286a2201200041b8016a413010fe011a20011078200041386a1078200041c8006a1078200041d0026a24000bd70101047f230041206b22002400102a10564103106e41898ac000410a106821024101105c210120004102105c220336020c2000200136020802400240024002402002105504402001200310b901450d01200110a701450d02200310a701450d022000410c6a200041086a10e4011074450d03200041086a2000410c6a10e401200210b301200041106a220110e3012001200210be01450d04200041206a24000f0b41fd8fc0004112103e000b41e58fc0004118103e000b41b188c0004119103e000b41ca88c000412e103e000b41f888c0004123103e000b9a0a020c7f037e230041f0016b220024004101106e4100106921060240024010592201100f0440200041206a200110a601200041186a10e201200028021c2202200028022810b801200041306a20022000290320220d10c501200041106a10ce0120002802142107200041086a200141102001105a41047441106b109e012000027f20002802080440200028020c0c010b10400b22013602501040210220002001100f3602d001200041003602cc012000200041d0006a3602c801200041406b2103200028024021080340200041d8006a200041c8016a108c0120002903585004402003200610ca012101200810342103200028022c210520002002360254200020013602d801200041d8016a10db01210110402104419287c0004109104a21091040210a104f210b20004198016a427f370300200041c0016a4100360200200041b8016a4100360200200020093602ac01200020043602a8012000200b3602a401200020013602a0012000427f37039001200041c88cc0003602bc01200041c88cc0003602b4012000200a3602b001200041d8006a20004190016a20034200200510920120002002100f3602d001200041003602cc012000200041d4006a3602c8010340200041d8016a200041c8016a108c0120002903d8015004402000290360210c20002802682105200028026c21042000280274210220002802782101024020002802702203105a0e020706000b20004190016a200041d8006a413810fe011a10401a1040220120002802a0011041200120002802a8012202105a108b0120002002100f3602d001200041003602cc012000200041a8016a3602c8010340200041d8016a200041c8016a108c0120002903d80150044020002802ac011047450440200120002802ac0110410b10542105104f210441db82c0004114104a2102200029039801210c200120002802b001108d0121010c080520002802ec01210220002903e001210c200120002802e80110412001200c108e012001200210420c010b000b000520002802ec01210120002802e801210220002903e001210c20004190016a2203200041d8006a2204413810fe011a200420032002200c20011092010c010b000b000b200028026c210120004190016a20072000290360220c10c401024020002802a40120081035450d00200029039801200d520d0020002d00a8012006470d002007200c200110c901200020002802a0013602e001200020013602e40120002000290390013703d8012002200041d8016a1093010c010b0b41c88ec0004110103e000b41be8ec000410a103e000b20004190016a2003108f012000290390014201520d00200041a4016a2802002104200041a0016a2802002109200029039801210e10401a1040220320091041027f024002400240200e50044020032004104220021047450d010c030b2003200e108e01200320041042200320051041200210470d012003200210410c010b2003200210410c010b10542105104f210441ef82c000410f104a0c010b104f210441fe82c000410c104a0b210220032001108d0121010b200c427f51047e100705200c0b200520042002200110502101100920004190016a220220011071200210960122011047044041d887c000412b103e000b200041d8016a20012001107241016b10a501103620002802e401210120002903d801210c200020002802e0013602a001200020063a00a801200020083602a4012000200c370390012000200d37039801200041d8006a220220071053200120004190016a10c20120021078200041f0016a24000b850302067f017e230041b0016b220024004100106e200041086a22011058200041186a200110cc012000412c6a20002d003010ca012101200028022821022000290318210620002802142103200020013602ac01200041f0006a2201200041ac016a10db0141a787c00041081040108901200041386a22042001200220062003109201024020041094012201107241014b0440200041386a20012001107241026b10a501103620004180016a220220012001107241016b10a5011036200041f8006a200041406b2903002206370300200020002903383703702006a7200028022c1035450d0110532101200010e201200120002802041034220320002903202206200028027c2204104e2000418c016a280200220510cd010440200120004188016a2802002000290380012005104e0b200041d0006a200241086a29030037030020002004360244200020033602402000200637033820002002290300370348200041386a1077200041b0016a24000f0b41af87c0004129103e000b41c28fc0004123103e000ba10302067f017e230041e0016b220024004100106e200041106a22011058200041206a200110cc01200041346a20002d003810ca0121012000280230220310342102200028021c21042000290320210620002001360240200041a8016a2201200041406b10db01419b87c000410c1040108901200041f0006a22052001200220062004109201024020051094012201107241014b0440200041f0006a20012001107241026b10a5011036200041b8016a220220012001107241016b10a5011036200041b0016a200041f8006a2903002206370300200020002903703703a8012006a720031035450d01200020002903a80137032010532101200041086a10ce01200041406b200028020c200120002802b401200041206a10c201200041c4016a280200220310cd0104402001200041c0016a28020020002903b8012003104e0b20004180016a2002290300370300200041f8006a200041c8006a29030037030020004188016a200241086a29030037030020002000290340370370200041f0006a1077200041e0016a24000f0b418388c000412e103e000b41c28fc0004123103e000b2e01017f230041106b22002400102a4100106e200041086a10ce012000280208200028020c1073200041106a24000b2b01017f230041106b22002400102a4100106e200010e501200028020420002802081075200041106a24000b2b01017f230041106b22002400102a4100106e200010e301200028020420002802081075200041106a24000b2e01017f230041106b22002400102a4100106e200041086a10d2012000280208200028020c1073200041106a24000b2e01017f230041106b22002400102a4100106e200041086a10e2012000280208200028020c1073200041106a24000b4e01067f230041206b22002400105e10564103106e4100105c21014101105c2102106a210310572104200041086a10ce012000280208200041003602102004200120022003200041106a10c701000b4e01067f230041206b22002400105e10564103106e4100105c21014101105c2102106a210310572104200041086a10d2012000280208200041003602102004200120022003200041106a10c701000b4e01067f230041206b22002400105e10564103106e4100105c21014101105c2102106a210310572104200041086a10e2012000280208200041003602102004200120022003200041106a10c701000bc003020a7f027e230041d0006b2200240010704101106f41001015210b20004101360228200041106a200041286a41cd86c000410f105f2000280214210420002802102000280228106c027e02400240024010592201105a0e020102000b41eb80c00041221002000b41feffffff0721011057210342000c010b200041286a200110a601200028023421032000280230210120002903280b210a0440105321040b200310cd01044002401025200b540440200110dd0121022000200b3703302000200a37032820002002360238200041086a10d201200028020c2106200141feffffff0746044041ed83c0004104104a21010b200610342107200041286a1040220510d301200741a18cc0004118104a22021043200520021043200210af01220a50044010d5012105104f21081040210920001040360240200220072005200120082009200041286a200041406b103f220a10b6010b200041406b2006200a200310c0012000200028024822013602202000200028024c22033602242000290340210a0c010b20002003360224200020013602200b2000200a37031820042001200a20031051200041186a1079200041d0006a24000f0b41be8ec000410a103e000b810101047f230041206b22012400102a10564103106e418f86c000410c106821024101105c21004102106921032001200036020c200141106a220010e50102402000200210ba0104402001410c6a200310cb01220010b10120021035450d01200010b401200141206a24000f0b41b685c0004116103e000b41cc85c0004139103e000ba60402077f027e230041f0016b220024004102106e4100106b21034101106b2105200041106a1058200041086a10e201200028020c2202200028021810b801200041206a20022000290310220710c50120022007200028021c220210c901200041346a200041386a10e40110b10121012000280230210620002001360240200041b8016a2204200041406b10db0141be86c000410f104010890120002802d80122012003104220012005104220004180016a2201200420064200200210920120042001413810fe011a20012004109501200029038801109101200028029001200028029401200028029c0120002802a001105021021009200041d0006a2201200210712004200110e601200041c8016a200110e601200041d4016a2802002105200041d0016a280200210220002903c801210720002802c401210120002903b8012108024020002802c00122062000280234103504402002200028023810350d010b41a18fc0004121103e000b10532103200020013602c401200020063602c001200020083703b801200041406b2003200041b8016a220120002903202208420052ad200810d1012000200536028c0120002002360288012000200737038001200041d0006a200320004180016a20002903282207420052ad200710d101200041c0016a200041c8006a290300370300200041c8016a2000290350370300200041d0016a200041d8006a290300370300200020002903403703b80120011077200041f0016a24000bbb0101057f230041206b22012400102a10564103106e41898ac000410a106821034101105c210020014102105c36020c20012000360208200141106a220010e30102402000200310ba010440200141086a22022001410c6a220410e40121002004200210e40121020240024020001074044020021074450d010c040b200010b101200310350d010c030b2002220010b10120031035450d020b200010b401200141206a24000f0b419b89c000411f103e000b418f90c0004139103e000bb30201057f230041206b22002400102a105610704100106f20004100360210200041086a200041106a41a786c000410b105f200028020c210120002802082000280210106c0440105421010b200010ce01200028020421032000280200210220004100360210200041106a2104230041e0006b22002400024020021074450440200041286a108101418882c000410e104a10820110401a200310342102200028024822032002104620012003108301417f210103402001450d022001418686c0006a2d00002202044020032002410274220241ec90c0006a280200200241c890c0006a280200104a10460b200141016a21010c000b000b419d84c00041201002000b200041086a200041286a108a0120042802004101460440200041013602182000200429020437021c0b200041086a108501000bf30102057f017e230041d0006b2200240010704100106f20004100360238200041106a200041386a41cd86c000410f105f2000280214210320002802102000280238106c200041286a10580440105321030b200028023421012000290328210520002802302104200041086a10d201200028020c2202200410b801200041386a2002200510c6010240102520002903405a044020022005200110c901200110cd010d0141be8ec000410a103e000b41d88ec0004111103e000b2000200028024810dd0122023602202000200136022420002000290338220537031820032002200520011051200041186a1079200041d0006a24000b0c0041b08ec000410e1002000bb30201077f024020022204410f4d0440200021020c010b2000410020006b41037122036a21052003044020002102200121060340200220062d00003a0000200641016a2106200241016a22022005490d000b0b2005200420036b2208417c7122076a21020240200120036a220341037122040440200741004c0d012003417c71220641046a21014100200441037422096b4118712104200628020021060340200520062009762001280200220620047472360200200141046a2101200541046a22052002490d000b0c010b200741004c0d0020032101034020052001280200360200200141046a2101200541046a22052002490d000b0b20084103712104200320076a21010b20040440200220046a21030340200220012d00003a0000200141016a2101200241016a22022003490d000b0b20000b0b83110500418080c0000b9602696e70757420746f6f206c6f6e6773657269616c697a6572206465636f6465206572726f723a20455344544e46544275726e455344544c6f63616c4275726e455344544e46544164645175616e74697479455344544c6f63616c4d696e74455344544e4654437265617465696e636f7272656374206e756d626572206f662045534454207472616e7366657273617267756d656e74206465636f6465206572726f722028293a2066756e6374696f6e20646f6573206e6f74206163636570742045534454207061796d656e74746f6f2066657720617267756d656e7473746f6f206d616e7920617267756d656e747377726f6e67206e756d626572206f6620617267756d656e74737365745370656369616c526f6c6500419f82c0000b01010041b382c0000ba30802ffff7265676973746572416e64536574416c6c526f6c65734d45544173796e6320726573756c744d756c7469455344544e46545472616e73666572455344544e46545472616e73666572455344545472616e7366657243425f434c4f53555245696e70757420746f6f2073686f72744d616e6167656456656320696e646578206f7574206f662072616e67656572726f72206465636f64696e67204553445420617474726962757465733a204553445420657870656374656445474c44696e646578206f7574206f662072616e67652e6974656d496e76616c6964207061796d656e7420746f6b656e4d757374206973737565206f722073657420746f6b656e2049442066697273742e696e646578546f6b656e20494420616c72656164792073657464656661756c745f69737375655f63624e6f206661726d206164647265737320666f72207468652073706563696669656420746f6b656e20616e64207479706520706169724661726d206164647265737320616c7265616479206b6e6f776e4661726d2061646472657373206e6f77206b6e6f776e4661726d206164647265737320646f6573206e6f74206d617463682074686520676976656e20746f6b656e20616e64206661726d2074797065086661726d5f747970656661726d5f616464726573736e756d5f646563696d616c736f70745f616464726573736164644c697175696469747972656d6f76654c69717569646974796f70745f64657374696e6174696f6e6e6f2063616c6c6261636b2066756e6374696f6e20776974682074686174206e616d652065786973747320696e20636f6e7472616374656e7465724661726d636c61696d52657761726473657869744661726d6174206c65617374203220726573756c74732065787065637465642066726f6d20657869744661726d6174206c65617374206f6e6520726573756c742065787065637465642066726f6d20656e7465724661726d6174206c65617374203220726573756c74732065787065637465642066726f6d20636c61696d20726577617264734f6e6c79204553445420746f6b656e732061636365707465644164647265737320616c72656164792073657420666f7220746865207265766572736520746f6b656e20706169724c6971756964747920506f6f6c206164647265737320616c7265616479206b6e6f776e4c6971756964747920506f6f6c2061646472657373206e6f77206b6e6f776e4174206c65617374206f6e65206f6620746865207061796d656e7473206d7573742062652061206c6f636b656420746f6b656e4e6f204c50206164647265737320666f7220746f6b656e20706169726c705f61646472657373726563697069656e742061646472657373206e6f742073657473746f72616765206465636f6465206572726f723a20626164206172726179206c656e6774682e6c656e0041f68ac0000b9906726573756c7473746f726167655f6b6579696e697469616c5f63616c6c657264656661756c745f69737375655f696e69745f737570706c795f63626c7050726f7879546f6b656e49646b6e6f776e4c6971756964697479506f6f6c736c7041646472657373466f72546f6b656e506169726b6e6f776e4661726d736661726d50726f7879546f6b656e49646661726d41646472657373466f72546f6b656e6c6f636b6564546f6b656e496461747472696275746573546f4e6f6e63654d617070696e67696e76616c69642076616c75650000456e64706f696e742063616e206f6e6c792062652063616c6c6564206279206f776e657245534454526f6c654c6f63616c4d696e7445534454526f6c654c6f63616c4275726e45534454526f6c654e465443726561746545534454526f6c654e46544164645175616e7469747945534454526f6c654e46544275726e45534454526f6c654e465441646455524945534454526f6c654e465455706461746541747472696275746573455344545472616e73666572526f6c6563616e6e6f74207375627472616374206265636175736520726573756c7420776f756c64206265206e6567617469766570616e6963206f636375727265644e6f207061796d656e74496e76616c6964207061796d656e747343616e6e6f7420756e6c6f636b207965744f6e6c79206c6f636b656420746f6b656e7320776974682066756e6769626c65206f726967696e616c20746f6b656e7320616c6c6f776564496e76616c6964207061796d656e74732072656365697665642066726f6d204c50496e76616c6964207061796d656e74732072656365697665642066726f6d204661726d546f6b656e73206d75737420626520646966666572656e74496e76616c696420534320616464726573734c6971756964747920506f6f6c206164647265737320646f6573206e6f74206d617463682074686520676976656e20746f6b656e207061697200000000110000001100000011000000160000000f000000110000001b00000010000000480610006c0610007d0610008e0610009f061000b5061000c4061000d5061000f0061000419091c0000b049cffffff", + "codeHash": "kNcga6OGbS4XQz+urVt200XWDEsxH3wDDr3cD9VnegA=", + "deployTxHash": "ed9d9a6003e8bc700c9935335df92089db82d1bd6319547b7eae75d6b6ad5798", + "deployedAt": 1695039734, + "developerReward": "42910646583000000", + "isGuarded": false, + "isPayable": true, + "isPayableBySmartContract": false, + "isReadable": true, + "isUpgradeable": true, + "nfts": [ + { + "identifier": "LKTK-4de4a1-f1", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1742724542, + "attributes": "AAAADkVEVVVTREMtN2U1NzBjAAAAAAAAAAAAAAAAAAANIQ==", + "nonce": 241, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "EDUUSDC-7e570c", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-f0", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1741762490, + "attributes": "AAAAEFBFTExXRUdMRC1jN2NiZGYAAAAAAAAAAAAAAAAAAAze", + "nonce": 240, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "PELLWEGLD-c7cbdf", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-ef", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1741593662, + "attributes": "AAAAEUtFVklOV0VHTEQtNDRlOWNlAAAAAAAAAAAAAAAAAAAM0w==", + "nonce": 239, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "KEVINWEGLD-44e9ce", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-ee", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1741385654, + "attributes": "AAAAEU1FR0FXV0VHTEQtM2ViZDc1AAAAAAAAAAAAAAAAAAAMxA==", + "nonce": 238, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "MEGAWWEGLD-3ebd75", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-ed", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1740725336, + "attributes": "AAAAEFRCREJXRUdMRC00YjkwYjAAAAAAAAAAAAAAAAAAAAyW", + "nonce": 237, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "TBDBWEGLD-4b90b0", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-ec", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1740597608, + "attributes": "AAAADUFTSFVTSC02Y2JjZmUAAAAAAAAAAAAAAAAAAAy2", + "nonce": 236, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "ASHUSH-6cbcfe", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-eb", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1740597500, + "attributes": "AAAADVVUS1VTSC1jOGQ2Y2UAAAAAAAAAAAAAAAAAAAy2", + "nonce": 235, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "UTKUSH-c8d6ce", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-ea", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1740597398, + "attributes": "AAAADU1FWFVTSC0wODk3OWIAAAAAAAAAAAAAAAAAAAy2", + "nonce": 234, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "MEXUSH-08979b", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-e9", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1740597296, + "attributes": "AAAADUhUTVVTSC00ZGU3M2MAAAAAAAAAAAAAAAAAAAy2", + "nonce": 233, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "HTMUSH-4de73c", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-e8", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1740479870, + "attributes": "AAAAD1hUUldFR0xELTgzMGQzNAAAAAAAAAAAAAAAAAAADIU=", + "nonce": 232, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "XTRWEGLD-830d34", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-e7", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1740468932, + "attributes": "AAAADlhUUlVTREMtMWQxMzY3AAAAAAAAAAAAAAAAAAAMhQ==", + "nonce": 231, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "XTRUSDC-1d1367", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-e6", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1740338510, + "attributes": "AAAADUFTSFVTSC0wOWJkOTAAAAAAAAAAAAAAAAAAAAyk", + "nonce": 230, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "ASHUSH-09bd90", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-e5", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1740338126, + "attributes": "AAAADVVUS1VTSC1mMGVlZjcAAAAAAAAAAAAAAAAAAAyk", + "nonce": 229, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "UTKUSH-f0eef7", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-e4", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1740337934, + "attributes": "AAAADU1FWFVTSC1hOGViZjAAAAAAAAAAAAAAAAAAAAyk", + "nonce": 228, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "MEXUSH-a8ebf0", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-e3", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1740329414, + "attributes": "AAAADUhUTVVTSC1kNWIyNzIAAAAAAAAAAAAAAAAAAAyk", + "nonce": 227, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "HTMUSH-d5b272", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-e2", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1740326558, + "attributes": "AAAAD1VTSFdFR0xELTZkYzQyZgAAAAAAAAAAAAAAAAAADKQ=", + "nonce": 226, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "USHWEGLD-6dc42f", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-e1", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1740060026, + "attributes": "AAAAEUFOVEhPV0VHTEQtNjJmZjUzAAAAAAAAAAAAAAAAAAAMaA==", + "nonce": 225, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "ANTHOWEGLD-62ff53", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-e0", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1740050972, + "attributes": "AAAAEFRPVE9XRUdMRC1kMTVhMzYAAAAAAAAAAAAAAAAAAAxo", + "nonce": 224, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "TOTOWEGLD-d15a36", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-df", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1739889734, + "attributes": "AAAAD1VTSFdFR0xELWZjM2MxZQAAAAAAAAAAAAAAAAAADIU=", + "nonce": 223, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "USHWEGLD-fc3c1e", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-de", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1739704148, + "attributes": "AAAAEUZSQUc2V0VHTEQtM2E0YTFjAAAAAAAAAAAAAAAAAAAMTw==", + "nonce": 222, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "FRAG6WEGLD-3a4a1c", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-dd", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1739392604, + "attributes": "AAAAD05PVFdFR0xELTA2MzljZgAAAAAAAAAAAAAAAAAADDo=", + "nonce": 221, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "NOTWEGLD-0639cf", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-dc", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1739282582, + "attributes": "AAAADUhMVE1FWC0yZGRiODQAAAAAAAAAAAAAAAAAAAwy", + "nonce": 220, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "HLTMEX-2ddb84", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-db", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1738991474, + "attributes": "AAAAD0tKS1dFR0xELWI3YzkxZgAAAAAAAAAAAAAAAABya1o=", + "nonce": 219, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "KJKWEGLD-b7c91f", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-da", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1738989080, + "attributes": "AAAAD1NGU1dFR0xELTczZjkxMgAAAAAAAAAAAAAAAAByacs=", + "nonce": 218, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "SFSWEGLD-73f912", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-d9", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1738607288, + "attributes": "AAAAEFFXSVFXRUdMRC0zMzMxNDcAAAAAAAAAAAAAAAAAAAwD", + "nonce": 217, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "QWIQWEGLD-333147", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-d8", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1738527074, + "attributes": "AAAAEVRFU1RLV0VHTEQtNTE2YzQ0AAAAAAAAAAAAAAAAAAAL/g==", + "nonce": 216, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "TESTKWEGLD-516c44", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-d7", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1738502534, + "attributes": "AAAAEERGR0ZXRUdMRC1jMzE4YTcAAAAAAAAAAAAAAAAAAAv8", + "nonce": 215, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "DFGFWEGLD-c318a7", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-d6", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1738498064, + "attributes": "AAAAD0tPS1dFR0xELWI5Yzk5ZgAAAAAAAAAAAAAAAAAAC/w=", + "nonce": 214, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "KOKWEGLD-b9c99f", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-d5", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1738231010, + "attributes": "AAAAEExJU1RXRUdMRC0yNDEyOTgAAAAAAAAAAAAAAAAAAAvp", + "nonce": 213, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "LISTWEGLD-241298", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-d4", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1738173296, + "attributes": "AAAAEERGR0ZXRUdMRC1jMzE4YTcAAAAAAAAAAAAAAAAAAAvl", + "nonce": 212, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "DFGFWEGLD-c318a7", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-d3", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1737983246, + "attributes": "AAAADk9QVFVTREMtY2ExMGE3AAAAAAAAAAAAAAAAAAAL2A==", + "nonce": 211, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "OPTUSDC-ca10a7", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-d2", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1737861986, + "attributes": "AAAAEFBPUktXRUdMRC1jYmI2ZjYAAAAAAAAAAAAAAAAAb4wC", + "nonce": 210, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "PORKWEGLD-cbb6f6", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-d1", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1737844658, + "attributes": "AAAAEUZST05BV0VHTEQtZDdlMTdiAAAAAAAAAAAAAAAAAG+Aug==", + "nonce": 209, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "FRONAWEGLD-d7e17b", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-d0", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1737842618, + "attributes": "AAAAEFBDT1JXRUdMRC1mYWJmMTkAAAAAAAAAAAAAAAAAb39m", + "nonce": 208, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "PCORWEGLD-fabf19", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-cf", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1737832616, + "attributes": "AAAAD0ZJUldFR0xELWY0ZTE3MgAAAAAAAAAAAAAAAABveOM=", + "nonce": 207, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "FIRWEGLD-f4e172", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-ce", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1737573428, + "attributes": "AAAAEEtXQUtXRUdMRC1hMjdiODMAAAAAAAAAAAAAAAAAAAu8", + "nonce": 206, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "KWAKWEGLD-a27b83", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-cd", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1737569342, + "attributes": "AAAAEEJPT01XRUdMRC0zNDZmMDQAAAAAAAAAAAAAAAAAAAu7", + "nonce": 205, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "BOOMWEGLD-346f04", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-cc", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1737568940, + "attributes": "AAAADlNQS1VTREMtZjAzNTE5AAAAAAAAAAAAAAAAAAALuw==", + "nonce": 204, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "SPKUSDC-f03519", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-cb", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1737487820, + "attributes": "AAAAEVRFU1RCV0VHTEQtNTU0YjlhAAAAAAAAAAAAAAAAAAALtg==", + "nonce": 203, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "TESTBWEGLD-554b9a", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-ca", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1737485522, + "attributes": "AAAAEU9ORURPTFVTRFQtNWNmODk5AAAAAAAAAAAAAAAAAAALtQ==", + "nonce": 202, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "ONEDOLUSDT-5cf899", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-c9", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1737398096, + "attributes": "AAAAD1RLSVdFR0xELTExNDYyYQAAAAAAAAAAAAAAAAAAC68=", + "nonce": 201, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "TKIWEGLD-11462a", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-c8", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1737130736, + "attributes": "AAAAEUUyRVRLN0hNRVgtN2U4OGRiAAAAAAAAAAAAAAAAAAALnQ==", + "nonce": 200, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "E2ETK7HMEX-7e88db", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-c7", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1737121652, + "attributes": "AAAAD1RQVFdFR0xELWI3Mzg2ZAAAAAAAAAAAAAAAAAAAC5w=", + "nonce": 199, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "TPTWEGLD-b7386d", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-c6", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1737041816, + "attributes": "AAAAD09QVFdFR0xELWM2ZWJjNwAAAAAAAAAAAAAAAAAAC5c=", + "nonce": 198, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "OPTWEGLD-c6ebc7", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-c5", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1736978930, + "attributes": "AAAAEFRFU1RXRUdMRC02NDBjMWMAAAAAAAAAAAAAAAAAAAuS", + "nonce": 197, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "TESTWEGLD-640c1c", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-c4", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1736520824, + "attributes": "AAAAEDA0SUFOVVNEQy0yZmEzNTAAAAAAAAAAAAAAAAAAAAty", + "nonce": 196, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "04IANUSDC-2fa350", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-c3", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1736507288, + "attributes": "AAAAETAzSUFOV0VHTEQtMTlmOTRmAAAAAAAAAAAAAAAAAAALcg==", + "nonce": 195, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "03IANWEGLD-19f94f", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-c2", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1736493818, + "attributes": "AAAAETAySUFOV0VHTEQtN2QxMGVjAAAAAAAAAAAAAAAAAAALcQ==", + "nonce": 194, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "02IANWEGLD-7d10ec", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-c1", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1736492210, + "attributes": "AAAAETAxSUFOV0VHTEQtY2UyZTUyAAAAAAAAAAAAAAAAAAALcA==", + "nonce": 193, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "01IANWEGLD-ce2e52", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-c0", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1736444714, + "attributes": "AAAAEEZJUkVXRUdMRC04Mzk5ZjcAAAAAAAAAAAAAAAAAa/FO", + "nonce": 192, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "FIREWEGLD-8399f7", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-bf", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1736339360, + "attributes": "AAAAD0ZJUldFR0xELWExNTA0MwAAAAAAAAAAAAAAAABrrLc=", + "nonce": 191, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "FIRWEGLD-a15043", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-be", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1736272952, + "attributes": "AAAAEVhFR0xEV0VHTEQtY2MyZGQ5AAAAAAAAAAAAAAAAAAALYw==", + "nonce": 190, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "XEGLDWEGLD-cc2dd9", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-bd", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1736271950, + "attributes": "AAAAEVhFR0xEV0VHTEQtY2MyZGQ5AAAAAAAAAAAAAAAAAAALXg==", + "nonce": 189, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "XEGLDWEGLD-cc2dd9", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-bc", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1736269280, + "attributes": "AAAADk1NV0VHTEQtMmJlMDM5AAAAAAAAAAAAAAAAAGt/Fw==", + "nonce": 188, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "MMWEGLD-2be039", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-bb", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1736268356, + "attributes": "AAAAD05PUldFR0xELWU4M2M5NAAAAAAAAAAAAAAAAABrfn0=", + "nonce": 187, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "NORWEGLD-e83c94", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-ba", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1736011904, + "attributes": "AAAADk1UV0VHTEQtZGFmNTY3AAAAAAAAAAAAAAAAAGrXhw==", + "nonce": 186, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "MTWEGLD-daf567", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-b9", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1736010248, + "attributes": "AAAAEVNPT01JV0VHTEQtMzA4MDlmAAAAAAAAAAAAAAAAAGrWcw==", + "nonce": 185, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "SOOMIWEGLD-30809f", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-b8", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1736009552, + "attributes": "AAAADk1MV0VHTEQtZWY1N2M2AAAAAAAAAAAAAAAAAGrV/w==", + "nonce": 184, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "MLWEGLD-ef57c6", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-b7", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1735987556, + "attributes": "AAAAEVRXRUdMV0VHTEQtYjc0ODAxAAAAAAAAAAAAAAAAAAALTQ==", + "nonce": 183, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "TWEGLWEGLD-b74801", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-b6", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1735987250, + "attributes": "AAAAEVRXRUdMV0VHTEQtMDRmNzIzAAAAAAAAAAAAAAAAAAALTQ==", + "nonce": 182, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "TWEGLWEGLD-04f723", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-b5", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1735986638, + "attributes": "AAAAEVRXRUdMV0VHTEQtYWM2MGEzAAAAAAAAAAAAAAAAAAALTQ==", + "nonce": 181, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "TWEGLWEGLD-ac60a3", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-b4", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1735986008, + "attributes": "AAAAEVRVU0RDV0VHTEQtNzMxZGIzAAAAAAAAAAAAAAAAAAALTQ==", + "nonce": 180, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "TUSDCWEGLD-731db3", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-b3", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1735984826, + "attributes": "AAAAEVRXRUdMRFVTREMtYTVhZDY1AAAAAAAAAAAAAAAAAAALTQ==", + "nonce": 179, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "TWEGLDUSDC-a5ad65", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-b2", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1735751630, + "attributes": "AAAAD0RMR1dFR0xELTg2OWQzNgAAAAAAAAAAAAAAAABqLhQ=", + "nonce": 178, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "DLGWEGLD-869d36", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-b1", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1735748774, + "attributes": "AAAAEUJUQ0dSV0VHTEQtMTVhODFjAAAAAAAAAAAAAAAAAAALPQ==", + "nonce": 177, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "BTCGRWEGLD-15a81c", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-b0", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1735667042, + "attributes": "AAAAEVJFREVFV0VHTEQtYjNkMDAxAAAAAAAAAAAAAAAAAGn3Ag==", + "nonce": 176, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "REDEEWEGLD-b3d001", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-af", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1735557038, + "attributes": "AAAAEUxVRDA1V0VHTEQtN2Y1OGE3AAAAAAAAAAAAAAAAAAALMA==", + "nonce": 175, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "LUD05WEGLD-7f58a7", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-ae", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1735555208, + "attributes": "AAAAEUxVRDA0V0VHTEQtNjgwZmE1AAAAAAAAAAAAAAAAAAALLw==", + "nonce": 174, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "LUD04WEGLD-680fa5", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-ad", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1735554782, + "attributes": "AAAAEUxVRDAzV0VHTEQtNzgzYzdlAAAAAAAAAAAAAAAAAAALLw==", + "nonce": 173, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "LUD03WEGLD-783c7e", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-ac", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1735554152, + "attributes": "AAAAEExVRDJXRUdMRC02YmVhNDcAAAAAAAAAAAAAAAAAAAsv", + "nonce": 172, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "LUD2WEGLD-6bea47", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-ab", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1735553336, + "attributes": "AAAAEUxVRDAxV0VHTEQtOWE2MTc0AAAAAAAAAAAAAAAAAAALLw==", + "nonce": 171, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "LUD01WEGLD-9a6174", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-aa", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1735551944, + "attributes": "AAAAEUxNQTMwV0VHTEQtNTE2YWRlAAAAAAAAAAAAAAAAAAALLw==", + "nonce": 170, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "LMA30WEGLD-516ade", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-a9", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1734965816, + "attributes": "AAAAD0hZVFdFR0xELWM2ZTdhYQAAAAAAAAAAAAAAAAAACwc=", + "nonce": 169, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "HYTWEGLD-c6e7aa", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-a8", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1734965018, + "attributes": "AAAAD0RPM1dFR0xELWVjMmEyNwAAAAAAAAAAAAAAAAAACwY=", + "nonce": 168, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "DO3WEGLD-ec2a27", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-a7", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1734963434, + "attributes": "AAAAD0RJV1dFR0xELTg2M2ZlNQAAAAAAAAAAAAAAAAAACwY=", + "nonce": 167, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "DIWWEGLD-863fe5", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-a6", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1734955958, + "attributes": "AAAAD0QyNFdFR0xELWRjYTA1MQAAAAAAAAAAAAAAAAAACwY=", + "nonce": 166, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "D24WEGLD-dca051", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-a5", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1734955382, + "attributes": "AAAAD0QyM1dFR0xELTM0ZWEyZQAAAAAAAAAAAAAAAAAACwY=", + "nonce": 165, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "D23WEGLD-34ea2e", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-a4", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1734952886, + "attributes": "AAAADFJORDA0LTA4ZmFiNQAAAAAAAAAAAAAAAAAACyo=", + "nonce": 164, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "RND04-08fab5", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-a3", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1734950186, + "attributes": "AAAAD0lTMldFR0xELTNjNzI5NwAAAAAAAAAAAAAAAAAACwU=", + "nonce": 163, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "IS2WEGLD-3c7297", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-a2", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1734690974, + "attributes": "AAAADExQVFNULWViNDQ4NgAAAAAAAAAAAAAAAAAACxc=", + "nonce": 162, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "LPTST-eb4486", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-a1", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1734668006, + "attributes": "AAAADkhVV0VHTEQtNmVjNDdhAAAAAAAAAAAAAAAAAGdsmA==", + "nonce": 161, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "HUWEGLD-6ec47a", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-a0", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1734652334, + "attributes": "AAAAEUFTREFTV0VHTEQtMzY0NjRlAAAAAAAAAAAAAAAAAAAK8Q==", + "nonce": 160, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "ASDASWEGLD-36464e", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-9f", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1734285452, + "attributes": "AAAAD0JMRFdFR0xELWY2MzAzMgAAAAAAAAAAAAAAAAAACtc=", + "nonce": 159, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "BLDWEGLD-f63032", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-9e", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1734281402, + "attributes": "AAAAEUtJTExZV0VHTEQtYTc4M2JiAAAAAAAAAAAAAAAAAAAK1w==", + "nonce": 158, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "KILLYWEGLD-a783bb", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-9d", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1734122102, + "attributes": "AAAAD0NDQ1dFR0xELTc1NGRiZAAAAAAAAAAAAAAAAAAACsw=", + "nonce": 157, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "CCCWEGLD-754dbd", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-9c", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1734025016, + "attributes": "AAAAD0xBVFdFR0xELWNjNzY0ZgAAAAAAAAAAAAAAAAAACsU=", + "nonce": 156, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "LATWEGLD-cc764f", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-9b", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1734011540, + "attributes": "AAAAEVRFU1RUV0VHTEQtZjNkZDM4AAAAAAAAAAAAAAAAAAAKxA==", + "nonce": 155, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "TESTTWEGLD-f3dd38", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-5c", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1733951366, + "attributes": "AAAAEVhPWE5PV0VHTEQtMjMyMzA4AAAAAAAAAAAAAAAAAAAGnA==", + "nonce": 92, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "XOXNOWEGLD-232308", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-9a", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1733905118, + "attributes": "AAAAEE1PT1RXRUdMRC1jNDljYmIAAAAAAAAAAAAAAAAAAAq9", + "nonce": 154, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "MOOTWEGLD-c49cbb", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-99", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1733844776, + "attributes": "AAAAD0FBQVdFR0xELWMzMmY2MgAAAAAAAAAAAAAAAAAACrk=", + "nonce": 153, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "AAAWEGLD-c32f62", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-98", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1733841626, + "attributes": "AAAAD01PVFdFR0xELWUxMjBkZQAAAAAAAAAAAAAAAAAACrI=", + "nonce": 152, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "MOTWEGLD-e120de", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-97", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1733841374, + "attributes": "AAAAEFRFU1RXRUdMRC1lZGM3MmUAAAAAAAAAAAAAAAAAAAqy", + "nonce": 151, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "TESTWEGLD-edc72e", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-96", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1733732636, + "attributes": "AAAADERFTU8wLTA0NjhhYgAAAAAAAAAAAAAAAAAACtU=", + "nonce": 150, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "DEMO0-0468ab", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-95", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1733413016, + "attributes": "AAAAEExJUUxLVVNEQy03MzUyNWIAAAAAAAAAAAAAAAAAAAqb", + "nonce": 149, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "LIQLKUSDC-73525b", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-94", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1733404424, + "attributes": "AAAADFJORDAwLTJiNGMxYwAAAAAAAAAAAAAAAAAACr4=", + "nonce": 148, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "RND00-2b4c1c", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-93", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1733352038, + "attributes": "AAAADlRUTFVTREMtZmYxM2JmAAAAAAAAAAAAAAAAAAAKlw==", + "nonce": 147, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "TTLUSDC-ff13bf", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-92", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1733135732, + "attributes": "AAAAEFRFU1RXRUdMRC1lMTEwZjAAAAAAAAAAAAAAAAAAAAqH", + "nonce": 146, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "TESTWEGLD-e110f0", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-91", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1732905338, + "attributes": "AAAADExQVFNULTFkOGVlYwAAAAAAAAAAAAAAAAAACpw=", + "nonce": 145, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "LPTST-1d8eec", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-90", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1732716362, + "attributes": "AAAADExQVFNULTM3NjFjNgAAAAAAAAAAAAAAAAAACo4=", + "nonce": 144, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "LPTST-3761c6", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LKTK-4de4a1-8f", + "collection": "LKTK-4de4a1", + "hash": "", + "timestamp": 1732352066, + "attributes": "AAAADERFTU8wLTVjODlhZgAAAAAAAAAAAAAAAAAACnU=", + "nonce": 143, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "DEMO0-5c89af", + "creator": "erd1qqqqqqqqqqqqqpgq2l97gw2j4wnlem4y2rx7dudqlssjtwpu0n4sd0u3w2", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": 18, + "ticker": "LKTK-4de4a1", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + } + ], + "nonce": 0, + "ownerAddress": "erd1x39tc3q3nn72ecjnmcz7x0qp09kp97t080x99dgyhx7zh95j0n4szskhlv", + "rootHash": "bf1rOWzZVvuasegXtjHmsylZBf0BwPNX2pbxUdRAO/Q=", + "scrCount": 1293, + "shard": 1, + "timestamp": 1743430598, + "tokens": [ + { + "type": "FungibleESDT", + "identifier": "USHUSDC-e10ae0", + "name": "USHUSDCLP", + "ticker": "USHUSDC-e10ae0", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 3, + "transactionsLastUpdatedAt": 1743427942, + "transfers": 11, + "transfersLastUpdatedAt": 1743428068, + "accounts": 7, + "accountsLastUpdatedAt": 1743426084, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "mexPairType": "experimental", + "balance": "799999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "HACUSDC-bdc1d9", + "name": "HACUSDCLP", + "ticker": "HACUSDC-bdc1d9", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 3, + "transactionsLastUpdatedAt": 1743428480, + "transfers": 14, + "transfersLastUpdatedAt": 1743427468, + "accounts": 4, + "accountsLastUpdatedAt": 1743427160, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "1144278517", + "circulatingSupply": "1144278517", + "mexPairType": "experimental", + "balance": "711697822", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "USHWEGLD-a7e358", + "name": "USHWEGLDLP", + "ticker": "USHWEGLD-a7e358", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743427697, + "transfers": 6, + "transfersLastUpdatedAt": 1743429268, + "accounts": 5, + "accountsLastUpdatedAt": 1743428000, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "mexPairType": "experimental", + "balance": "1999999990000000000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "USHWEGLD-0b8b66", + "name": "USHWEGLDLP", + "ticker": "USHWEGLD-0b8b66", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 3822, + "transactionsLastUpdatedAt": 1743428838, + "transfers": 9665, + "transfersLastUpdatedAt": 1743425550, + "accounts": 555, + "accountsLastUpdatedAt": 1743426082, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "4645681090517641435481", + "circulatingSupply": "4645681090517641435481", + "mexPairType": "experimental", + "balance": "19999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "SUPERWEGLD-4c7ca4", + "name": "SUPERWEGLDLP", + "ticker": "SUPERWEGLD-4c7ca4", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743429197, + "transfers": 4, + "transfersLastUpdatedAt": 1743426209, + "accounts": 4, + "accountsLastUpdatedAt": 1743426680, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "103464472473145900493", + "circulatingSupply": "103464472473145900493", + "mexPairType": "experimental", + "balance": "49999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "FIRSTWEGLD-7dee28", + "name": "FIRSTWEGLDLP", + "ticker": "FIRSTWEGLD-7dee28", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743427222, + "transfers": 5, + "transfersLastUpdatedAt": 1743428008, + "accounts": 3, + "accountsLastUpdatedAt": 1743427161, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "20000000000000001000", + "circulatingSupply": "20000000000000001000", + "mexPairType": "experimental", + "balance": "19999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TEISTWEGLD-1701e5", + "name": "TEISTWEGLDLP", + "ticker": "TEISTWEGLD-1701e5", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743426141, + "transfers": 3, + "transfersLastUpdatedAt": 1743425728, + "accounts": 3, + "accountsLastUpdatedAt": 1743427343, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "20000000000000001000", + "circulatingSupply": "20000000000000001000", + "mexPairType": "experimental", + "balance": "19999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "WTAOWEGLD-03b84d", + "name": "WTAOWEGLDLP", + "ticker": "WTAOWEGLD-03b84d", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 2, + "transactionsLastUpdatedAt": 1743427220, + "transfers": 10, + "transfersLastUpdatedAt": 1743428317, + "accounts": 7, + "accountsLastUpdatedAt": 1743427341, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "113404968610", + "circulatingSupply": "113404968610", + "mexPairType": "experimental", + "balance": "1999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "OXSYWEGLD-2574dd", + "name": "OXSYWEGLDLP", + "ticker": "OXSYWEGLD-2574dd", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 2, + "transactionsLastUpdatedAt": 1743427222, + "transfers": 5, + "transfersLastUpdatedAt": 1743428787, + "accounts": 3, + "accountsLastUpdatedAt": 1743428242, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "30000000000000001000", + "circulatingSupply": "30000000000000001000", + "mexPairType": "experimental", + "balance": "29999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "NEWWEGLD-c34f52", + "name": "NEWWEGLDLP", + "ticker": "NEWWEGLD-c34f52", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743425839, + "transfers": 3, + "transfersLastUpdatedAt": 1743425792, + "accounts": 3, + "accountsLastUpdatedAt": 1743426561, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "mexPairType": "experimental", + "balance": "14999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "PMSWEGLD-8245ef", + "name": "PMSWEGLDLP", + "ticker": "PMSWEGLD-8245ef", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743427941, + "transfers": 3, + "transfersLastUpdatedAt": 1743425308, + "accounts": 3, + "accountsLastUpdatedAt": 1743426799, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "20000000000000001000", + "circulatingSupply": "20000000000000001000", + "mexPairType": "experimental", + "balance": "19999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "FLIPWEGLD-a1d663", + "name": "FLIPWEGLDLP", + "ticker": "FLIPWEGLD-a1d663", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 3, + "transactionsLastUpdatedAt": 1743429138, + "transfers": 7, + "transfersLastUpdatedAt": 1743426569, + "accounts": 3, + "accountsLastUpdatedAt": 1743427760, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "23760632941423527861", + "circulatingSupply": "23760632941423527861", + "mexPairType": "experimental", + "balance": "23760632941423525861", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "JYMWEGLD-6138e2", + "name": "JYMWEGLDLP", + "ticker": "JYMWEGLD-6138e2", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 2, + "transactionsLastUpdatedAt": 1743426319, + "transfers": 5, + "transfersLastUpdatedAt": 1743426987, + "accounts": 3, + "accountsLastUpdatedAt": 1743426441, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "95000000000000001000", + "circulatingSupply": "95000000000000001000", + "mexPairType": "experimental", + "balance": "94999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "PTMX2WEGLD-675a0c", + "name": "PTMX2WEGLDLP", + "ticker": "PTMX2WEGLD-675a0c", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743429197, + "transfers": 3, + "transfersLastUpdatedAt": 1743426569, + "accounts": 3, + "accountsLastUpdatedAt": 1743428181, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "20000000000000001000", + "circulatingSupply": "20000000000000001000", + "mexPairType": "experimental", + "balance": "19999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "XMPHWEGLD-94cb29", + "name": "XMPHWEGLDLP", + "ticker": "XMPHWEGLD-94cb29", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 2, + "transactionsLastUpdatedAt": 1743428777, + "transfers": 6, + "transfersLastUpdatedAt": 1743426748, + "accounts": 3, + "accountsLastUpdatedAt": 1743427040, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "mexPairType": "experimental", + "balance": "815", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "ESJWEGLD-2acfdc", + "name": "ESJWEGLD", + "ticker": "ESJWEGLD-2acfdc", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743428718, + "transfers": 3, + "transfersLastUpdatedAt": 1743427708, + "accounts": 3, + "accountsLastUpdatedAt": 1743427586, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "24750000000000001000", + "circulatingSupply": "24750000000000001000", + "mexPairType": "experimental", + "balance": "24749999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "QUASAWEGLD-285641", + "name": "QUASARWEGLDLP", + "ticker": "QUASAWEGLD-285641", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 2, + "transactionsLastUpdatedAt": 1743427581, + "transfers": 5, + "transfersLastUpdatedAt": 1743429268, + "accounts": 3, + "accountsLastUpdatedAt": 1743428181, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "24068965517241380309", + "circulatingSupply": "24068965517241380309", + "mexPairType": "experimental", + "balance": "24068965517241378309", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TES23-5891e8", + "name": "TES23", + "ticker": "TES23-5891e8", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743427158, + "transfers": 3, + "transfersLastUpdatedAt": 1743429039, + "accounts": 3, + "accountsLastUpdatedAt": 1743428120, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "24948000000000001000", + "circulatingSupply": "24948000000000001000", + "mexPairType": "experimental", + "balance": "24947999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "AAAAA-83c357", + "name": "AAAAA", + "ticker": "AAAAA-83c357", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743427697, + "transfers": 3, + "transfersLastUpdatedAt": 1743425488, + "accounts": 3, + "accountsLastUpdatedAt": 1743427160, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "25740000000000001000", + "circulatingSupply": "25740000000000001000", + "mexPairType": "experimental", + "balance": "25739999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TMSOWEGLD-83c357", + "name": "TMSOWEGLD", + "ticker": "TMSOWEGLD-83c357", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743429197, + "transfers": 3, + "transfersLastUpdatedAt": 1743427407, + "accounts": 3, + "accountsLastUpdatedAt": 1743425842, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "24750000000000001000", + "circulatingSupply": "24750000000000001000", + "mexPairType": "experimental", + "balance": "24749999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TVXCWEGLD-83c357", + "name": "TVXCWEGLD", + "ticker": "TVXCWEGLD-83c357", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743428299, + "transfers": 3, + "transfersLastUpdatedAt": 1743427233, + "accounts": 3, + "accountsLastUpdatedAt": 1743428900, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "26730000000000001000", + "circulatingSupply": "26730000000000001000", + "mexPairType": "experimental", + "balance": "26729999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TOKENWEGLD-160668", + "name": "TOKEN2WEGLDLP", + "ticker": "TOKENWEGLD-160668", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743428420, + "transfers": 3, + "transfersLastUpdatedAt": 1743426032, + "accounts": 3, + "accountsLastUpdatedAt": 1743426978, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "20000000000000001000", + "circulatingSupply": "20000000000000001000", + "mexPairType": "experimental", + "balance": "19999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "FOXXWEGLD-8fa924", + "name": "FOXXWEGLDLP", + "ticker": "FOXXWEGLD-8fa924", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743429023, + "transfers": 3, + "transfersLastUpdatedAt": 1743426871, + "accounts": 3, + "accountsLastUpdatedAt": 1743428000, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "mexPairType": "experimental", + "balance": "9999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "WUDEMWEGLD-1f2d33", + "name": "WUDEMOWEGLDLP", + "ticker": "WUDEMWEGLD-1f2d33", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 3, + "transactionsLastUpdatedAt": 1743429023, + "transfers": 8, + "transfersLastUpdatedAt": 1743429207, + "accounts": 3, + "accountsLastUpdatedAt": 1743426022, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "20000000000000001000", + "circulatingSupply": "20000000000000001000", + "mexPairType": "experimental", + "balance": "19999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "SPKMEX-9adbaf", + "name": "SPKMEXLP", + "ticker": "SPKMEX-9adbaf", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743429258, + "transfers": 9, + "transfersLastUpdatedAt": 1743429268, + "accounts": 4, + "accountsLastUpdatedAt": 1743428541, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "14227511561496513490422454", + "circulatingSupply": "14227511561496513490422454", + "mexPairType": "experimental", + "balance": "150009999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "MOJOWEGLD-c3979c", + "name": "MOJOWEGLDLP", + "ticker": "MOJOWEGLD-c3979c", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743428959, + "transfers": 3, + "transfersLastUpdatedAt": 1743427529, + "accounts": 3, + "accountsLastUpdatedAt": 1743427102, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "mexPairType": "experimental", + "balance": "39999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "GHIWEGLD-492fa8", + "name": "GHIWEGLDLP", + "ticker": "GHIWEGLD-492fa8", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743427097, + "transfers": 3, + "transfersLastUpdatedAt": 1743426209, + "accounts": 3, + "accountsLastUpdatedAt": 1743426560, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "21000000000000001000", + "circulatingSupply": "21000000000000001000", + "mexPairType": "experimental", + "balance": "20999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "EMRWEGLD-48cbf9", + "name": "EMRWEGLDLP", + "ticker": "EMRWEGLD-48cbf9", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743426141, + "transfers": 3, + "transfersLastUpdatedAt": 1743426209, + "accounts": 3, + "accountsLastUpdatedAt": 1743428543, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "10000000000001000", + "circulatingSupply": "10000000000001000", + "mexPairType": "experimental", + "balance": "9999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "WOWWEGLD-c63545", + "name": "WOWWEGLDLP", + "ticker": "WOWWEGLD-c63545", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743427579, + "transfers": 3, + "transfersLastUpdatedAt": 1743426157, + "accounts": 3, + "accountsLastUpdatedAt": 1743428421, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "120000000000000001000", + "circulatingSupply": "120000000000000001000", + "mexPairType": "experimental", + "balance": "119999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "SLAPWEGLD-c564b4", + "name": "SLAPWEGLDLP", + "ticker": "SLAPWEGLD-c564b4", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743426377, + "transfers": 3, + "transfersLastUpdatedAt": 1743427830, + "accounts": 3, + "accountsLastUpdatedAt": 1743428482, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "40000001000", + "circulatingSupply": "40000001000", + "mexPairType": "experimental", + "balance": "39999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "ONEFIWEGLD-429a68", + "name": "ONEFINWEGLDLP", + "ticker": "ONEFIWEGLD-429a68", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743428058, + "transfers": 3, + "transfersLastUpdatedAt": 1743429329, + "accounts": 3, + "accountsLastUpdatedAt": 1743427585, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "21000000000000001000", + "circulatingSupply": "21000000000000001000", + "mexPairType": "experimental", + "balance": "20999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "ONEWEGLD-fbb0ee", + "name": "ONEWEGLDLP", + "ticker": "ONEWEGLD-fbb0ee", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743426918, + "transfers": 3, + "transfersLastUpdatedAt": 1743428972, + "accounts": 3, + "accountsLastUpdatedAt": 1743428961, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "21000000000000001000", + "circulatingSupply": "21000000000000001000", + "mexPairType": "experimental", + "balance": "20999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "ONEEVWEGLD-9a3ea8", + "name": "ONEEVMWEGLDLP", + "ticker": "ONEEVWEGLD-9a3ea8", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743426738, + "transfers": 3, + "transfersLastUpdatedAt": 1743429039, + "accounts": 3, + "accountsLastUpdatedAt": 1743426143, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "21000000000000001000", + "circulatingSupply": "21000000000000001000", + "mexPairType": "experimental", + "balance": "20999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TADAWEGLD-e427f1", + "name": "TADAWEGLDLP", + "ticker": "TADAWEGLD-e427f1", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743426198, + "transfers": 7, + "transfersLastUpdatedAt": 1743428675, + "accounts": 4, + "accountsLastUpdatedAt": 1743425783, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "23096192321160934826", + "circulatingSupply": "23096192321160934826", + "mexPairType": "experimental", + "balance": "23001969641429998998", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "FEZWEGLD-28c968", + "name": "FEZWEGLDLP", + "ticker": "FEZWEGLD-28c968", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743425839, + "transfers": 3, + "transfersLastUpdatedAt": 1743429329, + "accounts": 3, + "accountsLastUpdatedAt": 1743428121, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "25000000000000001000", + "circulatingSupply": "25000000000000001000", + "mexPairType": "experimental", + "balance": "24999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TEST2WEGLD-f9601e", + "name": "TEST2WEGLDLP", + "ticker": "TEST2WEGLD-f9601e", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743426377, + "transfers": 4, + "transfersLastUpdatedAt": 1743426871, + "accounts": 3, + "accountsLastUpdatedAt": 1743427699, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "21000000000000001000", + "circulatingSupply": "21000000000000001000", + "mexPairType": "experimental", + "balance": "20999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TESTWEGLD-e110f0", + "name": "TESTWEGLDLP", + "ticker": "TESTWEGLD-e110f0", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743426739, + "transfers": 4, + "transfersLastUpdatedAt": 1743425791, + "accounts": 3, + "accountsLastUpdatedAt": 1743426320, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "2000000000000001000", + "circulatingSupply": "2000000000000001000", + "mexPairType": "experimental", + "balance": "1999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "RND00-2b4c1c", + "name": "RND00", + "ticker": "RND00-2b4c1c", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743426797, + "transfers": 3, + "transfersLastUpdatedAt": 1743428128, + "accounts": 3, + "accountsLastUpdatedAt": 1743426262, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "1053002892684622861", + "circulatingSupply": "1053002892684622861", + "mexPairType": "experimental", + "balance": "1053002892684620861", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "RND00-686131", + "name": "RND00", + "ticker": "RND00-686131", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743427638, + "transfers": 3, + "transfersLastUpdatedAt": 1743429329, + "accounts": 3, + "accountsLastUpdatedAt": 1743426025, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "1053002892684622861", + "circulatingSupply": "1053002892684622861", + "mexPairType": "experimental", + "balance": "1053002892684620861", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "LPDGN-52293f", + "name": "LPDEGEN", + "ticker": "LPDGN-52293f", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743427879, + "transfers": 3, + "transfersLastUpdatedAt": 1743425608, + "accounts": 3, + "accountsLastUpdatedAt": 1743429200, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "1000000000000001000", + "circulatingSupply": "1000000000000001000", + "mexPairType": "experimental", + "balance": "999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "RND00-9b1be2", + "name": "RND00", + "ticker": "RND00-9b1be2", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743426679, + "transfers": 3, + "transfersLastUpdatedAt": 1743426032, + "accounts": 3, + "accountsLastUpdatedAt": 1743428061, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "1053002892684622861", + "circulatingSupply": "1053002892684622861", + "mexPairType": "experimental", + "balance": "1053002892684620861", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "LPTST-3761c6", + "name": "LPTEST", + "ticker": "LPTST-3761c6", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743427697, + "transfers": 3, + "transfersLastUpdatedAt": 1743428494, + "accounts": 3, + "accountsLastUpdatedAt": 1743428601, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "991839762611275965391", + "circulatingSupply": "991839762611275965391", + "mexPairType": "experimental", + "balance": "991839762611275963391", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "HUGSUSDT-def3ad", + "name": "HUGSUSDTLP", + "ticker": "HUGSUSDT-def3ad", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743426797, + "transfers": 4, + "transfersLastUpdatedAt": 1743427594, + "accounts": 3, + "accountsLastUpdatedAt": 1743428000, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "1101000", + "circulatingSupply": "1101000", + "mexPairType": "experimental", + "balance": "1099000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "DEMO0-0468ab", + "name": "DEMO0", + "ticker": "DEMO0-0468ab", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743428959, + "transfers": 3, + "transfersLastUpdatedAt": 1743427830, + "accounts": 3, + "accountsLastUpdatedAt": 1743428423, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "1053002892684622861", + "circulatingSupply": "1053002892684622861", + "mexPairType": "experimental", + "balance": "1053002892684620861", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "AAAWEGLD-c32f62", + "name": "AAAWEGLDLP", + "ticker": "AAAWEGLD-c32f62", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743428238, + "transfers": 5, + "transfersLastUpdatedAt": 1743426209, + "accounts": 3, + "accountsLastUpdatedAt": 1743426740, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "1060000000000000999", + "circulatingSupply": "1060000000000000999", + "mexPairType": "experimental", + "balance": "1059999999999998999", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "LATWEGLD-cc764f", + "name": "LATWEGLDLP", + "ticker": "LATWEGLD-cc764f", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743425478, + "transfers": 3, + "transfersLastUpdatedAt": 1743429091, + "accounts": 3, + "accountsLastUpdatedAt": 1743427640, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "6000000000000001000", + "circulatingSupply": "6000000000000001000", + "mexPairType": "experimental", + "balance": "5999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "FIRWEGLD-a15043", + "name": "FIREWEGLDLP", + "ticker": "FIRWEGLD-a15043", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743426021, + "transfers": 3, + "transfersLastUpdatedAt": 1743425968, + "accounts": 3, + "accountsLastUpdatedAt": 1743427701, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "2946705589181676000", + "circulatingSupply": "2946705589181676000", + "mexPairType": "experimental", + "balance": "2946705589181674000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TESTWEGLD-640c1c", + "name": "TESTWEGLDLP", + "ticker": "TESTWEGLD-640c1c", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743427819, + "transfers": 3, + "transfersLastUpdatedAt": 1743427956, + "accounts": 3, + "accountsLastUpdatedAt": 1743428362, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "3000000000000001000", + "circulatingSupply": "3000000000000001000", + "mexPairType": "experimental", + "balance": "2999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TKIWEGLD-11462a", + "name": "TKIWEGLDLP", + "ticker": "TKIWEGLD-11462a", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743425238, + "transfers": 3, + "transfersLastUpdatedAt": 1743425968, + "accounts": 4, + "accountsLastUpdatedAt": 1743428542, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "7859800000000001000", + "circulatingSupply": "7859800000000001000", + "mexPairType": "experimental", + "balance": "5894700000000000000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "USHWEGLD-6dc42f", + "name": "USHWEGLDLP", + "ticker": "USHWEGLD-6dc42f", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743427397, + "transfers": 4, + "transfersLastUpdatedAt": 1743427109, + "accounts": 3, + "accountsLastUpdatedAt": 1743427459, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "1000000000000001000", + "circulatingSupply": "1000000000000001000", + "mexPairType": "experimental", + "balance": "999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "MEXUSH-a8ebf0", + "name": "MEXUSHLP", + "ticker": "MEXUSH-a8ebf0", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 3, + "transactionsLastUpdatedAt": 1743425658, + "transfers": 8, + "transfersLastUpdatedAt": 1743428128, + "accounts": 4, + "accountsLastUpdatedAt": 1743428180, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "mexPairType": "experimental", + "balance": "999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "UTKUSH-f0eef7", + "name": "UTKUSHLP", + "ticker": "UTKUSH-f0eef7", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 3, + "transactionsLastUpdatedAt": 1743427941, + "transfers": 9, + "transfersLastUpdatedAt": 1743426387, + "accounts": 4, + "accountsLastUpdatedAt": 1743428900, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "mexPairType": "experimental", + "balance": "999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "ASHUSH-09bd90", + "name": "ASHUSHLP", + "ticker": "ASHUSH-09bd90", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 3, + "transactionsLastUpdatedAt": 1743426080, + "transfers": 6, + "transfersLastUpdatedAt": 1743426569, + "accounts": 3, + "accountsLastUpdatedAt": 1743428424, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "mexPairType": "experimental", + "balance": "999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "PELLWEGLD-c7cbdf", + "name": "PELLWEGLDLP", + "ticker": "PELLWEGLD-c7cbdf", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743428539, + "transfers": 5, + "transfersLastUpdatedAt": 1743428910, + "accounts": 4, + "accountsLastUpdatedAt": 1743428121, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "2500000000000001000", + "circulatingSupply": "2500000000000001000", + "mexPairType": "experimental", + "balance": "1499999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "SOOMIWEGLD-30809f", + "name": "SOOMIEWEGLDLP", + "ticker": "SOOMIWEGLD-30809f", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743429197, + "transfers": 3, + "transfersLastUpdatedAt": 1743427047, + "accounts": 3, + "accountsLastUpdatedAt": 1743427585, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "2890000000000001000", + "circulatingSupply": "2890000000000001000", + "mexPairType": "experimental", + "balance": "2889999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "DIWWEGLD-863fe5", + "name": "DIWWEGLDLP", + "ticker": "DIWWEGLD-863fe5", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743427941, + "transfers": 4, + "transfersLastUpdatedAt": 1743426569, + "accounts": 3, + "accountsLastUpdatedAt": 1743426920, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "2000000000000001000", + "circulatingSupply": "2000000000000001000", + "mexPairType": "experimental", + "balance": "1999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "NORWEGLD-e83c94", + "name": "NORKWEGLDLP", + "ticker": "NORWEGLD-e83c94", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743428598, + "transfers": 3, + "transfersLastUpdatedAt": 1743426807, + "accounts": 3, + "accountsLastUpdatedAt": 1743427880, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "2899800000000001000", + "circulatingSupply": "2899800000000001000", + "mexPairType": "experimental", + "balance": "2899799999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "XEGLDWEGLD-cc2dd9", + "name": "XEGLDWEGLDLP", + "ticker": "XEGLDWEGLD-cc2dd9", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 133, + "transactionsLastUpdatedAt": 1743426679, + "transfers": 443, + "transfersLastUpdatedAt": 1743429039, + "accounts": 50, + "accountsLastUpdatedAt": 1743428302, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "2351176342398577868607", + "circulatingSupply": "2351176342398577868607", + "mexPairType": "experimental", + "balance": "99999999999999998000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TESTBWEGLD-554b9a", + "name": "TESTBIDWEGLDLP", + "ticker": "TESTBWEGLD-554b9a", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743425117, + "transfers": 4, + "transfersLastUpdatedAt": 1743428495, + "accounts": 3, + "accountsLastUpdatedAt": 1743427883, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "11000000000000001000", + "circulatingSupply": "11000000000000001000", + "mexPairType": "experimental", + "balance": "10999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "BOOMWEGLD-346f04", + "name": "BOOMWEGLDLP", + "ticker": "BOOMWEGLD-346f04", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743427097, + "transfers": 4, + "transfersLastUpdatedAt": 1743427889, + "accounts": 3, + "accountsLastUpdatedAt": 1743425301, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "6000000000000001000", + "circulatingSupply": "6000000000000001000", + "mexPairType": "experimental", + "balance": "5999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "ONEDOLUSDT-5cf899", + "name": "ONEDOLLARUSDTLP", + "ticker": "ONEDOLUSDT-5cf899", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743427819, + "transfers": 4, + "transfersLastUpdatedAt": 1743426630, + "accounts": 3, + "accountsLastUpdatedAt": 1743428000, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "31001000", + "circulatingSupply": "31001000", + "mexPairType": "experimental", + "balance": "30999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "PORKWEGLD-cbb6f6", + "name": "PORKIWEGLDLP", + "ticker": "PORKWEGLD-cbb6f6", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743425658, + "transfers": 3, + "transfersLastUpdatedAt": 1743427768, + "accounts": 3, + "accountsLastUpdatedAt": 1743426441, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "34250000000000001000", + "circulatingSupply": "34250000000000001000", + "mexPairType": "experimental", + "balance": "34249999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "KOKWEGLD-b9c99f", + "name": "KOKWEGLDLP", + "ticker": "KOKWEGLD-b9c99f", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743426438, + "transfers": 3, + "transfersLastUpdatedAt": 1743429268, + "accounts": 3, + "accountsLastUpdatedAt": 1743426082, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "1000000000000001000", + "circulatingSupply": "1000000000000001000", + "mexPairType": "experimental", + "balance": "999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TESTKWEGLD-516c44", + "name": "TESTKWAK42WEGLDLP", + "ticker": "TESTKWEGLD-516c44", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743427518, + "transfers": 3, + "transfersLastUpdatedAt": 1743426630, + "accounts": 3, + "accountsLastUpdatedAt": 1743426082, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "1000000000000001000", + "circulatingSupply": "1000000000000001000", + "mexPairType": "experimental", + "balance": "999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "SFSWEGLD-73f912", + "name": "SFSDWEGLDLP", + "ticker": "SFSWEGLD-73f912", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743426859, + "transfers": 3, + "transfersLastUpdatedAt": 1743428550, + "accounts": 3, + "accountsLastUpdatedAt": 1743427582, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "23480000000000001000", + "circulatingSupply": "23480000000000001000", + "mexPairType": "experimental", + "balance": "23479999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "EDUUSDC-7e570c", + "name": "EDUUSDCLP", + "ticker": "EDUUSDC-7e570c", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743426620, + "transfers": 4, + "transfersLastUpdatedAt": 1743428550, + "accounts": 4, + "accountsLastUpdatedAt": 1743427160, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "60001000", + "circulatingSupply": "60001000", + "mexPairType": "experimental", + "balance": "14990000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "LPTUSDC-ebd878", + "name": "LPTUSDCLP", + "ticker": "LPTUSDC-ebd878", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743427037, + "transfers": 5, + "transfersLastUpdatedAt": 1743429150, + "accounts": 3, + "accountsLastUpdatedAt": 1743425720, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "601001000", + "circulatingSupply": "601001000", + "mexPairType": "experimental", + "balance": "600999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "USHWEGLD-5e303c", + "name": "USHWEGLDLP", + "ticker": "USHWEGLD-5e303c", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743428420, + "transfers": 4, + "transfersLastUpdatedAt": 1743428494, + "accounts": 3, + "accountsLastUpdatedAt": 1743429260, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "mexPairType": "experimental", + "balance": "19999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "USHWEGLD-a8be71", + "name": "USHWEGLDLP", + "ticker": "USHWEGLD-a8be71", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743427158, + "transfers": 4, + "transfersLastUpdatedAt": 1743426032, + "accounts": 3, + "accountsLastUpdatedAt": 1743426023, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "mexPairType": "experimental", + "balance": "19999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "HTMWEGLD-acd22a", + "name": "HTMWEGLDLP", + "ticker": "HTMWEGLD-acd22a", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 337, + "transactionsLastUpdatedAt": 1743428598, + "transfers": 1862, + "transfersLastUpdatedAt": 1743427047, + "accounts": 58, + "accountsLastUpdatedAt": 1743428600, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "8592541089803815037086", + "circulatingSupply": "8592541089803815037086", + "mexPairType": "experimental", + "balance": "7825999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "LEGLDWEGLD-113d74", + "name": "LEGLDWEGLDLP", + "ticker": "LEGLDWEGLD-113d74", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 4, + "transactionsLastUpdatedAt": 1743429258, + "transfers": 23, + "transfersLastUpdatedAt": 1743428068, + "accounts": 5, + "accountsLastUpdatedAt": 1743428482, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "1006771246982916313803", + "circulatingSupply": "1006771246982916313803", + "mexPairType": "experimental", + "balance": "19999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "DBAWEGLD-c2258d", + "name": "DBAWEGLDLP", + "ticker": "DBAWEGLD-c2258d", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743425478, + "transfers": 4, + "transfersLastUpdatedAt": 1743429268, + "accounts": 4, + "accountsLastUpdatedAt": 1743428180, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "22275535887", + "circulatingSupply": "22275535887", + "mexPairType": "experimental", + "balance": "20999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "PROTEWEGLD-d4ede1", + "name": "PROTEOWEGLDLP", + "ticker": "PROTEWEGLD-d4ede1", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743428420, + "transfers": 4, + "transfersLastUpdatedAt": 1743427109, + "accounts": 4, + "accountsLastUpdatedAt": 1743425958, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "1010000000000000001000", + "circulatingSupply": "1010000000000000001000", + "mexPairType": "experimental", + "balance": "999999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "ONEWEGLD-1258d9", + "name": "ONEWEGLDLP", + "ticker": "ONEWEGLD-1258d9", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743428420, + "transfers": 7, + "transfersLastUpdatedAt": 1743426748, + "accounts": 4, + "accountsLastUpdatedAt": 1743426622, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "2022889465931478581785", + "circulatingSupply": "2022889465931478581785", + "mexPairType": "experimental", + "balance": "22889465931478579854", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TEST0WEGLD-c33a0e", + "name": "TEST001WEGLDLP", + "ticker": "TEST0WEGLD-c33a0e", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743426977, + "transfers": 4, + "transfersLastUpdatedAt": 1743427594, + "accounts": 3, + "accountsLastUpdatedAt": 1743427520, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "21000000000000001000", + "circulatingSupply": "21000000000000001000", + "mexPairType": "experimental", + "balance": "20999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "SAYANWEGLD-aa1284", + "name": "SAYANUWEGLDLP", + "ticker": "SAYANWEGLD-aa1284", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743428358, + "transfers": 3, + "transfersLastUpdatedAt": 1743428910, + "accounts": 3, + "accountsLastUpdatedAt": 1743428362, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "40000000000000001000", + "circulatingSupply": "40000000000000001000", + "mexPairType": "experimental", + "balance": "39999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "WTAOWEGLD-5833e2", + "name": "WTAOWEGLDLP", + "ticker": "WTAOWEGLD-5833e2", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743426438, + "transfers": 4, + "transfersLastUpdatedAt": 1743428317, + "accounts": 4, + "accountsLastUpdatedAt": 1743427585, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "mexPairType": "experimental", + "balance": "5000000001", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "MYTKNWEGLD-ec078d", + "name": "MYTKNWEGLDLP", + "ticker": "MYTKNWEGLD-ec078d", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743426377, + "transfers": 3, + "transfersLastUpdatedAt": 1743426512, + "accounts": 3, + "accountsLastUpdatedAt": 1743427882, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "30000000000000001000", + "circulatingSupply": "30000000000000001000", + "mexPairType": "experimental", + "balance": "29999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "OLDWEGLD-9b99ce", + "name": "OLDWEGLDLP", + "ticker": "OLDWEGLD-9b99ce", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743427997, + "transfers": 4, + "transfersLastUpdatedAt": 1743429207, + "accounts": 4, + "accountsLastUpdatedAt": 1743428540, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "20465116279069768441", + "circulatingSupply": "20465116279069768441", + "mexPairType": "experimental", + "balance": "19999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "PLMWEGLD-745af7", + "name": "PLMWEGLDLP", + "ticker": "PLMWEGLD-745af7", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743429138, + "transfers": 4, + "transfersLastUpdatedAt": 1743428972, + "accounts": 3, + "accountsLastUpdatedAt": 1743429141, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "20000000000000001000", + "circulatingSupply": "20000000000000001000", + "mexPairType": "experimental", + "balance": "19999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TESTWEGLD-c4faa0", + "name": "TESTWEGLDLP", + "ticker": "TESTWEGLD-c4faa0", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743427638, + "transfers": 4, + "transfersLastUpdatedAt": 1743427647, + "accounts": 3, + "accountsLastUpdatedAt": 1743426440, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "20000000000000001000", + "circulatingSupply": "20000000000000001000", + "mexPairType": "experimental", + "balance": "19999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "FNTWEGLD-e11444", + "name": "FNTWEGLD", + "ticker": "FNTWEGLD-e11444", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743428778, + "transfers": 3, + "transfersLastUpdatedAt": 1743429207, + "accounts": 3, + "accountsLastUpdatedAt": 1743426980, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "22275000000000001000", + "circulatingSupply": "22275000000000001000", + "mexPairType": "experimental", + "balance": "22274999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TESTWEGLD-b3bb39", + "name": "TESTWEGLDLP", + "ticker": "TESTWEGLD-b3bb39", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743428058, + "transfers": 3, + "transfersLastUpdatedAt": 1743427288, + "accounts": 3, + "accountsLastUpdatedAt": 1743427280, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "20000000000000001000", + "circulatingSupply": "20000000000000001000", + "mexPairType": "experimental", + "balance": "19999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "XTESTWEGLD-621c7a", + "name": "XTESTWEGLDLP", + "ticker": "XTESTWEGLD-621c7a", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 3, + "transactionsLastUpdatedAt": 1743428539, + "transfers": 7, + "transfersLastUpdatedAt": 1743428249, + "accounts": 3, + "accountsLastUpdatedAt": 1743426681, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "23538200000000000999", + "circulatingSupply": "23538200000000000999", + "mexPairType": "experimental", + "balance": "23538199999999998999", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TETWEGLD-ec515f", + "name": "TETWEGLDLP", + "ticker": "TETWEGLD-ec515f", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743427097, + "transfers": 4, + "transfersLastUpdatedAt": 1743429039, + "accounts": 3, + "accountsLastUpdatedAt": 1743426504, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "25000000000000001000", + "circulatingSupply": "25000000000000001000", + "mexPairType": "experimental", + "balance": "24999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "BDDWEGLD-c1aeb2", + "name": "BDDWEGLD", + "ticker": "BDDWEGLD-c1aeb2", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743427278, + "transfers": 3, + "transfersLastUpdatedAt": 1743428249, + "accounts": 3, + "accountsLastUpdatedAt": 1743427584, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "24750000000000001000", + "circulatingSupply": "24750000000000001000", + "mexPairType": "experimental", + "balance": "24749999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TEST0WEGLD-71cab0", + "name": "TEST0329WEGLDLP", + "ticker": "TEST0WEGLD-71cab0", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743425957, + "transfers": 3, + "transfersLastUpdatedAt": 1743428849, + "accounts": 3, + "accountsLastUpdatedAt": 1743426980, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "20000000000000001000", + "circulatingSupply": "20000000000000001000", + "mexPairType": "experimental", + "balance": "19999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "MRSTK-ae9e80", + "name": "MRSTK", + "ticker": "MRSTK-ae9e80", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743429319, + "transfers": 3, + "transfersLastUpdatedAt": 1743429329, + "accounts": 3, + "accountsLastUpdatedAt": 1743429140, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "24750000000000001000", + "circulatingSupply": "24750000000000001000", + "mexPairType": "experimental", + "balance": "24749999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "CCCCCWEGLD-64e9e1", + "name": "CCCCCWEGLD", + "ticker": "CCCCCWEGLD-64e9e1", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 0, + "transactionsLastUpdatedAt": 1743425780, + "transfers": 3, + "transfersLastUpdatedAt": 1743426630, + "accounts": 3, + "accountsLastUpdatedAt": 1743425423, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "29700000000000001000", + "circulatingSupply": "29700000000000001000", + "mexPairType": "experimental", + "balance": "29699999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TESTWEGLD-efcdfe", + "name": "TESTWEGLDLP", + "ticker": "TESTWEGLD-efcdfe", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743427397, + "transfers": 3, + "transfersLastUpdatedAt": 1743427168, + "accounts": 3, + "accountsLastUpdatedAt": 1743426623, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "22000000000000001000", + "circulatingSupply": "22000000000000001000", + "mexPairType": "experimental", + "balance": "21999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "YYYWEGLD-1ba4be", + "name": "YYYWEGLDLP", + "ticker": "YYYWEGLD-1ba4be", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743428662, + "transfers": 3, + "transfersLastUpdatedAt": 1743426091, + "accounts": 3, + "accountsLastUpdatedAt": 1743426979, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "21000000000000001000", + "circulatingSupply": "21000000000000001000", + "mexPairType": "experimental", + "balance": "20999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TOKENWEGLD-fb49a7", + "name": "TOKEN1WEGLDLP", + "ticker": "TOKENWEGLD-fb49a7", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743426679, + "transfers": 3, + "transfersLastUpdatedAt": 1743429150, + "accounts": 3, + "accountsLastUpdatedAt": 1743427761, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "20000000000000001000", + "circulatingSupply": "20000000000000001000", + "mexPairType": "experimental", + "balance": "19999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "GHGHWEGLD-6f5910", + "name": "GHGHWEGLDLP", + "ticker": "GHGHWEGLD-6f5910", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743428358, + "transfers": 3, + "transfersLastUpdatedAt": 1743426690, + "accounts": 3, + "accountsLastUpdatedAt": 1743426147, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "20000000000000001000", + "circulatingSupply": "20000000000000001000", + "mexPairType": "experimental", + "balance": "19999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "FOXXXWEGLD-6dfab9", + "name": "FOXXXWEGLDLP", + "ticker": "FOXXXWEGLD-6dfab9", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743428899, + "transfers": 3, + "transfersLastUpdatedAt": 1743425968, + "accounts": 3, + "accountsLastUpdatedAt": 1743427946, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "20000000000000001000", + "circulatingSupply": "20000000000000001000", + "mexPairType": "experimental", + "balance": "19999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "FOXXXWEGLD-931afc", + "name": "FOXXXXXWEGLDLP", + "ticker": "FOXXXWEGLD-931afc", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743428117, + "transfers": 3, + "transfersLastUpdatedAt": 1743425968, + "accounts": 3, + "accountsLastUpdatedAt": 1743426439, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "20100000000000001000", + "circulatingSupply": "20100000000000001000", + "mexPairType": "experimental", + "balance": "20099999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "MEXUSDC-fe3eb4", + "name": "MEXUSDCLP", + "ticker": "MEXUSDC-fe3eb4", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 2, + "transactionsLastUpdatedAt": 1743427278, + "transfers": 8, + "transfersLastUpdatedAt": 1743426329, + "accounts": 5, + "accountsLastUpdatedAt": 1743428601, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "110000002017", + "circulatingSupply": "110000002017", + "mexPairType": "experimental", + "balance": "9999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "SPKWEGLD-9b7bec", + "name": "SPKWEGLDLP", + "ticker": "SPKWEGLD-9b7bec", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743428959, + "transfers": 5, + "transfersLastUpdatedAt": 1743425433, + "accounts": 4, + "accountsLastUpdatedAt": 1743427224, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "945568024419685614824", + "circulatingSupply": "945568024419685614824", + "mexPairType": "experimental", + "balance": "20999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "TSTWEGLD-ce80cc", + "name": "TSTWEGLDLP", + "ticker": "TSTWEGLD-ce80cc", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743426377, + "transfers": 3, + "transfersLastUpdatedAt": 1743425909, + "accounts": 3, + "accountsLastUpdatedAt": 1743426801, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "25000000000000001000", + "circulatingSupply": "25000000000000001000", + "mexPairType": "experimental", + "balance": "24999999999999999000", + "attributes": null, + "valueUsd": null + }, + { + "type": "FungibleESDT", + "identifier": "EMRUSDC-dcd5e6", + "name": "EMRUSDCLP", + "ticker": "EMRUSDC-dcd5e6", + "owner": "erd1qqqqqqqqqqqqqpgqa7hv0nahgsl8tz0psat46x0tchm0wuyc0n4s6q28ad", + "decimals": 18, + "isPaused": false, + "transactions": 1, + "transactionsLastUpdatedAt": 1743426438, + "transfers": 3, + "transfersLastUpdatedAt": 1743427233, + "accounts": 3, + "accountsLastUpdatedAt": 1743427583, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "supply": "66840001000", + "circulatingSupply": "66840001000", + "mexPairType": "experimental", + "balance": "66839999000", + "attributes": null, + "valueUsd": null + } + ], + "txCount": 602 +} \ No newline at end of file diff --git a/scripts/walletAddressTemplate.json b/scripts/walletAddressTemplate.json new file mode 100644 index 000000000..56acf3cb1 --- /dev/null +++ b/scripts/walletAddressTemplate.json @@ -0,0 +1,5022 @@ +{ + "address": "erd1pdv0h3ddqyzlraek02y5rhmjnwwapjyhqm983kfcdfzmr6axqhdsfg4akx", + "balance": "25933813793985000000000", + "code": "", + "developerReward": "0", + "isGuarded": false, + "nfts": [ + { + "identifier": "AAA-e06a2c-01", + "collection": "AAA-e06a2c", + "hash": "UW1OVWlvUGVGQzhleE1QMnVzanE5YUEyZXU2Q3IxcEYzMTFCb3dRV3FVSHV5WQ==", + "timestamp": null, + "attributes": "dGFnczo7bWV0YWRhdGE6UW1SY1A5NGtYcjV6WmpSR3ZpN21KNnVuN0xweFVoWVZSNFI0UnBpY3h6Z1lrdA==", + "nonce": 1, + "type": "NonFungibleESDT", + "subType": "NonFungibleESDTv2", + "name": "Joconde", + "creator": "erd1p0m0zlqm6ng2yzpmrlj9tswd42tngadsyu6vszgejpzwv7sfzx0qnghch2", + "royalties": 0.14, + "uris": [ + "aHR0cHM6Ly9pcGZzLmlvL2lwZnMvUW1OVWlvUGVGQzhleE1QMnVzanE5YUEyZXU2Q3IxcEYzMTFCb3dRV3FVSHV5WQ==" + ], + "url": "https://devnet-media.elrond.com/nfts/asset/QmNUioPeFC8exMP2usjq9aA2eu6Cr1pF311BowQWqUHuyY", + "media": [ + { + "url": "https://media.elrond.com/nfts/thumbnail/default.png", + "originalUrl": "https://media.elrond.com/nfts/thumbnail/default.png", + "thumbnailUrl": "https://media.elrond.com/nfts/thumbnail/default.png", + "fileType": "image/png", + "fileSize": 29512 + } + ], + "isWhitelistedStorage": true, + "thumbnailUrl": "", + "tags": [ + "" + ], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": null, + "ticker": "AAA-e06a2c", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "BPDA-6c0a5f-04", + "collection": "BPDA-6c0a5f", + "hash": "", + "timestamp": null, + "attributes": "Y2xhc3M6V2FycmlvcixyYXJpdHk6TGVnZW5kYXJ5LHBvd2VyOkhpZ2g=", + "nonce": 4, + "type": "NonFungibleESDT", + "subType": "NonFungibleESDTv2", + "name": "T12", + "creator": "erd14mkk6pqeuya6xdy442yv2najjry35jzje79s997dka7fesld7wcs7jqumx", + "royalties": 25, + "uris": [ + "aHR0cHM6Ly9pbWcuZnJlZXBpay5jb20vcGhvdG9zLWdyYXR1aXRlL2dyb3MtcGxhbi1pZ3VhbmUtZGFucy1uYXR1cmVfMjMtMjE1MTcxODc3NS5qcGc=" + ], + "url": "https://img.freepik.com/photos-gratuite/gros-plan-iguane-dans-nature_23-2151718775.jpg", + "media": [ + { + "url": "https://media.elrond.com/nfts/thumbnail/default.png", + "originalUrl": "https://media.elrond.com/nfts/thumbnail/default.png", + "thumbnailUrl": "https://media.elrond.com/nfts/thumbnail/default.png", + "fileType": "image/png", + "fileSize": 29512 + } + ], + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": null, + "ticker": "BPDA-6c0a5f", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "COL-806d46-01", + "collection": "COL-806d46", + "hash": "UW1lSlpLOG9mR1lNdFdpMjg0NnJ3cEx1cUpSdldqM3N6RnYyV2VaN1pONndiRg==", + "timestamp": null, + "attributes": "dGFnczo7bWV0YWRhdGE6UW1SY1A5NGtYcjV6WmpSR3ZpN21KNnVuN0xweFVoWVZSNFI0UnBpY3h6Z1lrdA==", + "nonce": 1, + "type": "NonFungibleESDT", + "subType": "NonFungibleESDT", + "name": "nftexten", + "creator": "erd1a5fznrhacfftqlvl98007q659jfdvkz79dan55h27m35yfgp0q5ssxq5uj", + "royalties": 25, + "uris": [ + "aHR0cHM6Ly9pcGZzLmlvL2lwZnMvUW1lSlpLOG9mR1lNdFdpMjg0NnJ3cEx1cUpSdldqM3N6RnYyV2VaN1pONndiRg==" + ], + "url": "https://devnet-media.elrond.com/nfts/asset/QmeJZK8ofGYMtWi2846rwpLuqJRvWj3szFv2WeZ7ZN6wbF", + "media": [ + { + "url": "https://media.elrond.com/nfts/thumbnail/default.png", + "originalUrl": "https://media.elrond.com/nfts/thumbnail/default.png", + "thumbnailUrl": "https://media.elrond.com/nfts/thumbnail/default.png", + "fileType": "image/png", + "fileSize": 29512 + } + ], + "isWhitelistedStorage": true, + "thumbnailUrl": "", + "tags": [ + "" + ], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": null, + "ticker": "COL-806d46", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "DUNE-d3c887-01", + "collection": "DUNE-d3c887", + "hash": "", + "timestamp": null, + "attributes": null, + "nonce": 1, + "type": "MetaESDT", + "subType": "MetaESDT", + "name": "DUNE", + "creator": "erd1utdaut4lqc7gxrzza443sws7tm35m68zurvm4jclghfx6dj46agqgk4zjc", + "url": "", + "media": null, + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "200", + "supply": null, + "decimals": 1, + "ticker": "DUNE-d3c887", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "HLSR-2096d3-0315", + "collection": "HLSR-2096d3", + "hash": "", + "timestamp": null, + "attributes": "AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAj///8AAAAIG8FtZ07H//8AAAAIGO35rfB2lIIAAAAAAAALugAAAAAAAAu7", + "nonce": 789, + "type": "NonFungibleESDT", + "subType": "NonFungibleESDTv2", + "name": "HatomLSReceipt", + "creator": "erd1qqqqqqqqqqqqqpgqvg8r5yavkyhu6rmmkgqzgsduzheg2fk7v5ysrypdex", + "royalties": 0, + "uris": [ + "aHR0cHM6Ly9hcndlYXZlLm5ldC9tZmpJSE82Y2tFOG0xY2tfYjQ2QmRWNFpGVkdFRUhKU25vMk1uRkt1emdrL3VuZGVsZWdhdGUtbmZ0LnBuZw==" + ], + "url": "https://arweave.net/mfjIHO6ckE8m1ck_b46BdV4ZFVGEEHJSno2MnFKuzgk/undelegate-nft.png", + "media": [ + { + "url": "https://media.elrond.com/nfts/thumbnail/default.png", + "originalUrl": "https://media.elrond.com/nfts/thumbnail/default.png", + "thumbnailUrl": "https://media.elrond.com/nfts/thumbnail/default.png", + "fileType": "image/png", + "fileSize": 29512 + } + ], + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": null, + "ticker": "HLSR-2096d3", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "LAPIN1-f455cf-01", + "collection": "LAPIN1-f455cf", + "hash": "2KJKaraRfJd2TMrisv1hN8QNhobHp09rSzzCqDAsKQo=", + "timestamp": null, + "attributes": "bWV0YWRhdGE6YmFma3JlaWd5dWpmZ3ZudXJwc2x4bXRnazRrenAyeWp4eXFneW5id2h1NWh3d3N6NHlrdWRhbGJqYmk=", + "nonce": 1, + "type": "SemiFungibleESDT", + "subType": "SemiFungibleESDT", + "name": "NFTlive for MultiversX", + "creator": "erd1z4pjcxsqag8hy3nwpxwmvmnqt82tanymh8hdzleahqtl9xs0cf4slszcku", + "royalties": 0, + "uris": [ + "aHR0cHM6Ly9iYWZrcmVpYmttemJ5MmtyZGNpNXR0NXFweG9oZWN2NnBkaXBrcDVnZnVqc3NpdnE1Z3NieTI0a3RmZS5pcGZzLm5mdHN0b3JhZ2UubGluaw==", + "aHR0cHM6Ly9iYWZrcmVpZ3l1amZndm51cnBzbHhtdGdrNGt6cDJ5anh5cWd5bmJ3aHU1aHd3c3o0eWt1ZGFsYmpiaS5pcGZzLm5mdHN0b3JhZ2UubGluaw==" + ], + "url": "https://bafkreibkmzby2krdci5tt5qpxohecv6pdipkp5gfujssivq5gsby24ktfe.ipfs.nftstorage.link", + "media": [ + { + "url": "https://media.elrond.com/nfts/thumbnail/default.png", + "originalUrl": "https://media.elrond.com/nfts/thumbnail/default.png", + "thumbnailUrl": "https://media.elrond.com/nfts/thumbnail/default.png", + "fileType": "image/png", + "fileSize": 29512 + } + ], + "isWhitelistedStorage": false, + "thumbnailUrl": "", + "tags": [], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": null, + "ticker": "LAPIN1-f455cf", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "NOBURN-c6dda0-01", + "collection": "NOBURN-c6dda0", + "hash": "UW1OYXJqRnNGdHYybXdBNmdvbjRLOWRRRXlmQW5FTmRTY1NyRnNkUTJyYkxTVQ==", + "timestamp": null, + "attributes": "dGFnczo7bWV0YWRhdGE6UW1SY1A5NGtYcjV6WmpSR3ZpN21KNnVuN0xweFVoWVZSNFI0UnBpY3h6Z1lrdA==", + "nonce": 1, + "type": "NonFungibleESDT", + "subType": "NonFungibleESDTv2", + "name": "NOBURN", + "creator": "erd1jrd4sm6mg5ggq0yl87jfs22hlnjn8aalx7fqx57q34jght264c2q335qcc", + "royalties": 25, + "uris": [ + "aHR0cHM6Ly9pcGZzLmlvL2lwZnMvUW1OYXJqRnNGdHYybXdBNmdvbjRLOWRRRXlmQW5FTmRTY1NyRnNkUTJyYkxTVQ==" + ], + "url": "https://devnet-media.elrond.com/nfts/asset/QmNarjFsFtv2mwA6gon4K9dQEyfAnENdScSrFsdQ2rbLSU", + "media": [ + { + "url": "https://media.elrond.com/nfts/thumbnail/default.png", + "originalUrl": "https://media.elrond.com/nfts/thumbnail/default.png", + "thumbnailUrl": "https://media.elrond.com/nfts/thumbnail/default.png", + "fileType": "image/png", + "fileSize": 29512 + } + ], + "isWhitelistedStorage": true, + "thumbnailUrl": "", + "tags": [ + "" + ], + "metadata": null, + "owner": null, + "balance": "1", + "supply": null, + "decimals": null, + "ticker": "NOBURN-c6dda0", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + }, + { + "identifier": "SFTCOL-bda5a9-02", + "collection": "SFTCOL-bda5a9", + "hash": "UW1TQzRuZnBFTXBhdGFwQVJLelJBRjZueGRqOUh5WEp4Qmd0Ym9Ebk1iQXpyZQ==", + "timestamp": null, + "attributes": "dGFnczo7bWV0YWRhdGE6UW1SY1A5NGtYcjV6WmpSR3ZpN21KNnVuN0xweFVoWVZSNFI0UnBpY3h6Z1lrdA==", + "nonce": 2, + "type": "SemiFungibleESDT", + "subType": "SemiFungibleESDT", + "name": "BIGSFT", + "creator": "erd1jrd4sm6mg5ggq0yl87jfs22hlnjn8aalx7fqx57q34jght264c2q335qcc", + "royalties": 25, + "uris": [ + "aHR0cHM6Ly9pcGZzLmlvL2lwZnMvUW1TQzRuZnBFTXBhdGFwQVJLelJBRjZueGRqOUh5WEp4Qmd0Ym9Ebk1iQXpyZQ==" + ], + "url": "https://devnet-media.elrond.com/nfts/asset/QmSC4nfpEMpatapARKzRAF6nxdj9HyXJxBgtboDnMbAzre", + "media": [ + { + "url": "https://media.elrond.com/nfts/thumbnail/default.png", + "originalUrl": "https://media.elrond.com/nfts/thumbnail/default.png", + "thumbnailUrl": "https://media.elrond.com/nfts/thumbnail/default.png", + "fileType": "image/png", + "fileSize": 29512 + } + ], + "isWhitelistedStorage": true, + "thumbnailUrl": "", + "tags": [ + "" + ], + "metadata": null, + "owner": null, + "balance": "2", + "supply": null, + "decimals": null, + "ticker": "SFTCOL-bda5a9", + "scamInfo": null, + "score": null, + "rank": null, + "rarities": null, + "isNsfw": null, + "unlockSchedule": null, + "unlockEpoch": null, + "price": null, + "valueUsd": null, + "assets": null + } + ], + "nonce": 14930, + "ownerAddress": "", + "rootHash": "w0crmfSOdITEyeYE3l9rP4jJQwshfthMgsvxGhfqyZk=", + "scrCount": 1, + "shard": 1, + "timestamp": 1743430172, + "tokens": [ + { + "type": "FungibleESDT", + "subType": "", + "identifier": "123-f54bfc", + "collection": null, + "nonce": null, + "name": "SFITTEST", + "ticker": "123-f54bfc", + "owner": "erd1q43lppdkyg7an6d8pd4lf0pnxz3h7h9ln8f24kdrk9r5dxdzz9fssn47ug", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 18, + "isPaused": false, + "assets": null, + "transactions": 1, + "transactionsLastUpdatedAt": 1743427758, + "transfers": 2, + "transfersLastUpdatedAt": 1743428550, + "accounts": 1, + "accountsLastUpdatedAt": 1743428664, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000000000000000000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "ANDY-0aff74", + "collection": null, + "nonce": null, + "name": "ANDYMVX12", + "ticker": "ANDY-0aff74", + "owner": "erd12ykrzk4l3ryymzlu48e8leu59gt9xddsh8w46k0va9rt0e7gfvgshrm4kv", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1012, + "transactionsLastUpdatedAt": 1743427942, + "transfers": 1015, + "transfersLastUpdatedAt": 1743427768, + "accounts": 998, + "accountsLastUpdatedAt": 1743427343, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "ANDY-1ec1d5", + "collection": null, + "nonce": null, + "name": "ANDYMVX11", + "ticker": "ANDY-1ec1d5", + "owner": "erd17knmtzd2cu8zut9xj6m6fr5zynvshfde3me5lnrn24h0wzxdk8es6at4xz", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1004, + "transactionsLastUpdatedAt": 1743429138, + "transfers": 1005, + "transfersLastUpdatedAt": 1743429207, + "accounts": 999, + "accountsLastUpdatedAt": 1743427698, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "ANDY-291a5b", + "collection": null, + "nonce": null, + "name": "ANDYMVX01", + "ticker": "ANDY-291a5b", + "owner": "erd1yaqvt5lgwkpy0u3g5y6q9l62qzp2vd93xsnge4v76h5vrn6c896qk4jcud", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1004, + "transactionsLastUpdatedAt": 1743425839, + "transfers": 1006, + "transfersLastUpdatedAt": 1743428550, + "accounts": 999, + "accountsLastUpdatedAt": 1743426504, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "ANDY-55c1f9", + "collection": null, + "nonce": null, + "name": "ANDYMVX13", + "ticker": "ANDY-55c1f9", + "owner": "erd1tdtmne98k5e4qkunfapy882xm2vzjwa6yqytl5h0z7cqe3j5j04sl5z3zl", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1004, + "transactionsLastUpdatedAt": 1743427997, + "transfers": 1006, + "transfersLastUpdatedAt": 1743429207, + "accounts": 999, + "accountsLastUpdatedAt": 1743427700, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "ANDY-74c39c", + "collection": null, + "nonce": null, + "name": "ANDYMVX21", + "ticker": "ANDY-74c39c", + "owner": "erd1nux08lqew7f3t8jz6ytapxxv3pgueqn4p24hrwdmhvlcwtvwed9qptvs34", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1004, + "transactionsLastUpdatedAt": 1743426020, + "transfers": 1006, + "transfersLastUpdatedAt": 1743426268, + "accounts": 999, + "accountsLastUpdatedAt": 1743426260, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "ANDY-9f21ad", + "collection": null, + "nonce": null, + "name": "ANDYMVX02", + "ticker": "ANDY-9f21ad", + "owner": "erd1q8w3ju88dxxaj82rzlj7wlak35xweegudvkuhrcskynd4elxclkqfhljqj", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1004, + "transactionsLastUpdatedAt": 1743427220, + "transfers": 1006, + "transfersLastUpdatedAt": 1743427407, + "accounts": 999, + "accountsLastUpdatedAt": 1743427699, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "ANDY-d579a5", + "collection": null, + "nonce": null, + "name": "ANDYMVX23", + "ticker": "ANDY-d579a5", + "owner": "erd14elcm7wlkhyz25yyly05wz2qx79u4vgvvhrv52grafhxsfmlhutqvq8snf", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1004, + "transactionsLastUpdatedAt": 1743429023, + "transfers": 1006, + "transfersLastUpdatedAt": 1743425791, + "accounts": 999, + "accountsLastUpdatedAt": 1743428665, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "ANDY-ee0ab6", + "collection": null, + "nonce": null, + "name": "ANDYMVX22", + "ticker": "ANDY-ee0ab6", + "owner": "erd16jetyr8eqgq2nydxlurh4hawzpc8rf7ts03nc6qym9x7wdhm9etqe7zr34", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1004, + "transactionsLastUpdatedAt": 1743428358, + "transfers": 1006, + "transfersLastUpdatedAt": 1743426569, + "accounts": 999, + "accountsLastUpdatedAt": 1743426799, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "ANDY-f64164", + "collection": null, + "nonce": null, + "name": "ANDYMVX03", + "ticker": "ANDY-f64164", + "owner": "erd1lhvunzll5dxxttlaprfafcjldxjngstmq04d7pkmckhtwh4rm7zq8l6xyh", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1004, + "transactionsLastUpdatedAt": 1743426620, + "transfers": 1006, + "transfersLastUpdatedAt": 1743427407, + "accounts": 999, + "accountsLastUpdatedAt": 1743426920, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "AP13-d25e7f", + "collection": null, + "nonce": null, + "name": "artespraticas", + "ticker": "AP13-d25e7f", + "owner": "erd1gj547p40nu0jkkjda2l7gql0g3cz3fegljmqez89fyfxuwaga7qs8mvq0e", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 1, + "isPaused": false, + "assets": null, + "transactions": 3, + "transactionsLastUpdatedAt": 1743426918, + "transfers": 4, + "transfersLastUpdatedAt": 1743429328, + "accounts": 2, + "accountsLastUpdatedAt": 1743426201, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "130", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "ATK-497888", + "collection": null, + "nonce": null, + "name": "AndreiToken", + "ticker": "ATK-497888", + "owner": "erd14veh4gvwtgxh4hwjklx7u9xwlwp5f3k7rjqtr9xwrw3l4c80qpfsn3tfmr", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 18, + "isPaused": false, + "assets": null, + "transactions": 4, + "transactionsLastUpdatedAt": 1743425957, + "transfers": 5, + "transfersLastUpdatedAt": 1743426808, + "accounts": 2, + "accountsLastUpdatedAt": 1743427882, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "20000000000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "BTB-6d74b7", + "collection": null, + "nonce": null, + "name": "BITBOAT", + "ticker": "BTB-6d74b7", + "owner": "erd1xnwpvnuk05fpmmyhdpjfhvcj7m8ryydxqpj4yrcdtnssscugwmsqu9ur5f", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 18, + "isPaused": false, + "assets": null, + "transactions": 7, + "transactionsLastUpdatedAt": 1743428238, + "transfers": 8, + "transfersLastUpdatedAt": 1743427350, + "accounts": 7, + "accountsLastUpdatedAt": 1743427760, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "250000000000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "BULL-1e36b4", + "collection": null, + "nonce": null, + "name": "BULL23", + "ticker": "BULL-1e36b4", + "owner": "erd1reug35u59kms4jmshrta2f3wedd8q4xt2q526f29ufzmtt205meq6cf49a", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 4760, + "transactionsLastUpdatedAt": 1743427518, + "transfers": 4762, + "transfersLastUpdatedAt": 1743425668, + "accounts": 999, + "accountsLastUpdatedAt": 1743428961, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "9000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "BULL-297824", + "collection": null, + "nonce": null, + "name": "BULL21", + "ticker": "BULL-297824", + "owner": "erd1ayl5wkpv2vqfg5jslnuw8trcvasvjtcqjau7gvcajawvxtsrfldqg0fax3", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 4965, + "transactionsLastUpdatedAt": 1743425658, + "transfers": 4967, + "transfersLastUpdatedAt": 1743429329, + "accounts": 1000, + "accountsLastUpdatedAt": 1743428241, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "9000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "BULL-2d20ca", + "collection": null, + "nonce": null, + "name": "BULL02", + "ticker": "BULL-2d20ca", + "owner": "erd177md8xekmp30xv9nda7mny7cw6etfkvgw7jvc99dqzwd5s5c86uqup2ksz", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 5709, + "transactionsLastUpdatedAt": 1743426620, + "transfers": 5711, + "transfersLastUpdatedAt": 1743427830, + "accounts": 999, + "accountsLastUpdatedAt": 1743426201, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "9000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "BULL-318e95", + "collection": null, + "nonce": null, + "name": "BULL13", + "ticker": "BULL-318e95", + "owner": "erd1l8pe4f5uuu3xwwgqpldju6umngsxtqmck4revuzwnzdznq0ahqeszzkjzp", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 5059, + "transactionsLastUpdatedAt": 1743428058, + "transfers": 5061, + "transfersLastUpdatedAt": 1743428068, + "accounts": 999, + "accountsLastUpdatedAt": 1743427399, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "8000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "BULL-74403a", + "collection": null, + "nonce": null, + "name": "BULL22", + "ticker": "BULL-74403a", + "owner": "erd1xav6y4p8u829qlgvvxylr7vk6s9v5z5m69uqr3a82qznw52j97fqecajse", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 5160, + "transactionsLastUpdatedAt": 1743426198, + "transfers": 5162, + "transfersLastUpdatedAt": 1743428128, + "accounts": 999, + "accountsLastUpdatedAt": 1743429199, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "9000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "BULL-ae5311", + "collection": null, + "nonce": null, + "name": "BULL01", + "ticker": "BULL-ae5311", + "owner": "erd1kp74lkl5ugg7v0jpke7nkjw05ffv5mg4423uw49zgv8sqdz74xgqnfzmln", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 6867, + "transactionsLastUpdatedAt": 1743427879, + "transfers": 6869, + "transfersLastUpdatedAt": 1743427407, + "accounts": 999, + "accountsLastUpdatedAt": 1743427224, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "11000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "BULL-b0e11c", + "collection": null, + "nonce": null, + "name": "BULL12", + "ticker": "BULL-b0e11c", + "owner": "erd1ckeqj00uzg8c5yhwasgqxwtf8xeu8expmhsjw70c6ql95yznnr8sxpj564", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 4909, + "transactionsLastUpdatedAt": 1743426977, + "transfers": 4911, + "transfersLastUpdatedAt": 1743426808, + "accounts": 999, + "accountsLastUpdatedAt": 1743426864, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "8000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "BULL-d72c94", + "collection": null, + "nonce": null, + "name": "BULL11", + "ticker": "BULL-d72c94", + "owner": "erd1lcksqedaz96v0fkzyyza3lndeu2apa38zh4azag6t0q2hwrd0e6s2mjejx", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 4959, + "transactionsLastUpdatedAt": 1743426198, + "transfers": 4961, + "transfersLastUpdatedAt": 1743426630, + "accounts": 999, + "accountsLastUpdatedAt": 1743427039, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "8000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "BULL-efaf88", + "collection": null, + "nonce": null, + "name": "BULL03", + "ticker": "BULL-efaf88", + "owner": "erd15c28dy5p42735ytrqdmn9x20ujynxywwexc7zw4x7cs7qamp502qtepcy8", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 5409, + "transactionsLastUpdatedAt": 1743426438, + "transfers": 5411, + "transfersLastUpdatedAt": 1743426807, + "accounts": 999, + "accountsLastUpdatedAt": 1743427820, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "8000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "DOC-1c6833", + "collection": null, + "nonce": null, + "name": "DOC02", + "ticker": "DOC-1c6833", + "owner": "erd177md8xekmp30xv9nda7mny7cw6etfkvgw7jvc99dqzwd5s5c86uqup2ksz", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743426141, + "transfers": 1007, + "transfersLastUpdatedAt": 1743427047, + "accounts": 999, + "accountsLastUpdatedAt": 1743427999, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "DOC-2c0153", + "collection": null, + "nonce": null, + "name": "DOC01", + "ticker": "DOC-2c0153", + "owner": "erd1kp74lkl5ugg7v0jpke7nkjw05ffv5mg4423uw49zgv8sqdz74xgqnfzmln", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 805, + "transactionsLastUpdatedAt": 1743425298, + "transfers": 807, + "transfersLastUpdatedAt": 1743427350, + "accounts": 799, + "accountsLastUpdatedAt": 1743428841, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "DOC-30f39c", + "collection": null, + "nonce": null, + "name": "DOC12", + "ticker": "DOC-30f39c", + "owner": "erd1ckeqj00uzg8c5yhwasgqxwtf8xeu8expmhsjw70c6ql95yznnr8sxpj564", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 805, + "transactionsLastUpdatedAt": 1743425780, + "transfers": 807, + "transfersLastUpdatedAt": 1743426268, + "accounts": 799, + "accountsLastUpdatedAt": 1743428963, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "DOC-4e9c44", + "collection": null, + "nonce": null, + "name": "DOC03", + "ticker": "DOC-4e9c44", + "owner": "erd15c28dy5p42735ytrqdmn9x20ujynxywwexc7zw4x7cs7qamp502qtepcy8", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1006, + "transactionsLastUpdatedAt": 1743427819, + "transfers": 1008, + "transfersLastUpdatedAt": 1743425728, + "accounts": 998, + "accountsLastUpdatedAt": 1743427160, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "DOC-a79180", + "collection": null, + "nonce": null, + "name": "DOC22", + "ticker": "DOC-a79180", + "owner": "erd1xav6y4p8u829qlgvvxylr7vk6s9v5z5m69uqr3a82qznw52j97fqecajse", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 743, + "transactionsLastUpdatedAt": 1743429258, + "transfers": 745, + "transfersLastUpdatedAt": 1743426268, + "accounts": 741, + "accountsLastUpdatedAt": 1743426503, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "DOC-b07801", + "collection": null, + "nonce": null, + "name": "DOC11", + "ticker": "DOC-b07801", + "owner": "erd1lcksqedaz96v0fkzyyza3lndeu2apa38zh4azag6t0q2hwrd0e6s2mjejx", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 905, + "transactionsLastUpdatedAt": 1743425718, + "transfers": 907, + "transfersLastUpdatedAt": 1743427708, + "accounts": 899, + "accountsLastUpdatedAt": 1743425785, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "DOC-b8d0ce", + "collection": null, + "nonce": null, + "name": "DOC23", + "ticker": "DOC-b8d0ce", + "owner": "erd1reug35u59kms4jmshrta2f3wedd8q4xt2q526f29ufzmtt205meq6cf49a", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 804, + "transactionsLastUpdatedAt": 1743428117, + "transfers": 805, + "transfersLastUpdatedAt": 1743427707, + "accounts": 800, + "accountsLastUpdatedAt": 1743427398, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "DOC-f78a26", + "collection": null, + "nonce": null, + "name": "DOC21", + "ticker": "DOC-f78a26", + "owner": "erd1ayl5wkpv2vqfg5jslnuw8trcvasvjtcqjau7gvcajawvxtsrfldqg0fax3", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 529, + "transactionsLastUpdatedAt": 1743429319, + "transfers": 530, + "transfersLastUpdatedAt": 1743426448, + "accounts": 529, + "accountsLastUpdatedAt": 1743426082, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "DOC-ff4d31", + "collection": null, + "nonce": null, + "name": "DOC13", + "ticker": "DOC-ff4d31", + "owner": "erd1l8pe4f5uuu3xwwgqpldju6umngsxtqmck4revuzwnzdznq0ahqeszzkjzp", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 705, + "transactionsLastUpdatedAt": 1743426501, + "transfers": 707, + "transfersLastUpdatedAt": 1743428068, + "accounts": 699, + "accountsLastUpdatedAt": 1743428305, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "ETH-9104ac", + "collection": null, + "nonce": null, + "name": "WrappedEthereum", + "ticker": "ETH-9104ac", + "owner": "erd1qqqqqqqqqqqqqpgqpef4qrunf6e0frrlahsy5cyjdchcpe3y8zds529s78", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 18, + "isPaused": false, + "assets": null, + "transactions": 564, + "transactionsLastUpdatedAt": 1743426198, + "transfers": 1689, + "transfersLastUpdatedAt": 1743427768, + "accounts": 174, + "accountsLastUpdatedAt": 1743427159, + "canUpgrade": true, + "canMint": true, + "canBurn": true, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": true, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "800000000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "ETKN-c0f9e8", + "collection": null, + "nonce": null, + "name": "EveToken", + "ticker": "ETKN", + "owner": "erd1gwtcel3yaaglf62qkl46gj2gqz7cde9ah0ljgc6qt7e8nc44juuqfxueh7", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 18, + "isPaused": false, + "assets": { + "website": "https://www.zzz.com", + "description": "ETKN is the new bitcoin", + "status": "active", + "pngUrl": "https://tools.multiversx.com/assets-cdn/devnet/tokens/ETKN-c0f9e8/icon.png", + "svgUrl": "https://tools.multiversx.com/assets-cdn/devnet/tokens/ETKN-c0f9e8/icon.svg", + "social": { + "email": "eveline.molnar@multiversx.com" + } + }, + "transactions": 4, + "transactionsLastUpdatedAt": 1743428058, + "transfers": 5, + "transfersLastUpdatedAt": 1743427168, + "accounts": 4, + "accountsLastUpdatedAt": 1743428361, + "canUpgrade": false, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "120000000000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "KIRI-12837d", + "collection": null, + "nonce": null, + "name": "KIRI12", + "ticker": "KIRI-12837d", + "owner": "erd1ckeqj00uzg8c5yhwasgqxwtf8xeu8expmhsjw70c6ql95yznnr8sxpj564", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 18, + "isPaused": false, + "assets": null, + "transactions": 506, + "transactionsLastUpdatedAt": 1743426021, + "transfers": 508, + "transfersLastUpdatedAt": 1743429039, + "accounts": 500, + "accountsLastUpdatedAt": 1743427460, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "KIRI-1e5fbe", + "collection": null, + "nonce": null, + "name": "KIRI11", + "ticker": "KIRI-1e5fbe", + "owner": "erd1lcksqedaz96v0fkzyyza3lndeu2apa38zh4azag6t0q2hwrd0e6s2mjejx", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 18, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743426797, + "transfers": 1007, + "transfersLastUpdatedAt": 1743427956, + "accounts": 999, + "accountsLastUpdatedAt": 1743426440, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "KIRI-2369d3", + "collection": null, + "nonce": null, + "name": "KIRI01", + "ticker": "KIRI-2369d3", + "owner": "erd1kp74lkl5ugg7v0jpke7nkjw05ffv5mg4423uw49zgv8sqdz74xgqnfzmln", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 18, + "isPaused": false, + "assets": null, + "transactions": 406, + "transactionsLastUpdatedAt": 1743426258, + "transfers": 408, + "transfersLastUpdatedAt": 1743429150, + "accounts": 400, + "accountsLastUpdatedAt": 1743428901, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "KIRI-7223d6", + "collection": null, + "nonce": null, + "name": "KIRI13", + "ticker": "KIRI-7223d6", + "owner": "erd1l8pe4f5uuu3xwwgqpldju6umngsxtqmck4revuzwnzdznq0ahqeszzkjzp", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 18, + "isPaused": false, + "assets": null, + "transactions": 805, + "transactionsLastUpdatedAt": 1743428899, + "transfers": 807, + "transfersLastUpdatedAt": 1743428787, + "accounts": 799, + "accountsLastUpdatedAt": 1743429200, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "KIRI-a92e7f", + "collection": null, + "nonce": null, + "name": "KIRI03", + "ticker": "KIRI-a92e7f", + "owner": "erd15c28dy5p42735ytrqdmn9x20ujynxywwexc7zw4x7cs7qamp502qtepcy8", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 18, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743428718, + "transfers": 1007, + "transfersLastUpdatedAt": 1743428730, + "accounts": 999, + "accountsLastUpdatedAt": 1743426561, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "KIRI-f6afad", + "collection": null, + "nonce": null, + "name": "KIRI02", + "ticker": "KIRI-f6afad", + "owner": "erd177md8xekmp30xv9nda7mny7cw6etfkvgw7jvc99dqzwd5s5c86uqup2ksz", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 18, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743426738, + "transfers": 1007, + "transfersLastUpdatedAt": 1743426448, + "accounts": 999, + "accountsLastUpdatedAt": 1743429320, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "MTKN-a21770", + "collection": null, + "nonce": null, + "name": "CTFtoken", + "ticker": "MTKN", + "owner": "erd10pyhpqvuz8mky6echqqf3wmpm34u53gwett9jv0tmppc5ettlc5sf4meka", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 18, + "isPaused": false, + "assets": { + "website": "https://www.multiversxtoken.com", + "description": "The EGLD token is the utility token of MultiversX Token", + "status": "active", + "pngUrl": "https://tools.multiversx.com/assets-cdn/devnet/tokens/MTKN-a21770/icon.png", + "svgUrl": "https://tools.multiversx.com/assets-cdn/devnet/tokens/MTKN-a21770/icon.svg", + "social": { + "blog": "https://www.multiversxtoken.com/EGLD-token-blog", + "twitter": "https://twitter.com/EGLD-token-twitter", + "whitepaper": "https://www.multiversxtoken.com/EGLD-token-whitepaper.pdf", + "coinmarketcap": "https://coinmarketcap.com/currencies/EGLD-token", + "coingecko": "https://www.coingecko.com/en/coins/EGLD-token" + } + }, + "transactions": 6, + "transactionsLastUpdatedAt": 1743428959, + "transfers": 7, + "transfersLastUpdatedAt": 1743427233, + "accounts": 5, + "accountsLastUpdatedAt": 1743426681, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "100000000000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "STOKEN-9ab531", + "collection": null, + "nonce": null, + "name": "MyFungibleToken", + "ticker": "STOKEN", + "owner": "erd1m8tzqzs20gjswwctq6hk4kxrgsdzvcuns5yhw6ffx3x3fxpru3yqrjmds9", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 18, + "isPaused": false, + "assets": { + "website": "https://www.multiversxtoken.com", + "description": "The STOKEN token is the utility token of MultiversX Token", + "status": "active", + "pngUrl": "https://tools.multiversx.com/assets-cdn/devnet/tokens/STOKEN-9ab531/icon.png", + "svgUrl": "https://tools.multiversx.com/assets-cdn/devnet/tokens/STOKEN-9ab531/icon.svg", + "social": { + "email": "stoken-token@multiversxtoken.com", + "blog": "https://www.multiversxtoken.com/STOKEN-token-blog", + "twitter": "https://twitter.com/STOKEN-token-twitter", + "whitepaper": "https://www.multiversxtoken.com/STOKEN-token-whitepaper.pdf", + "coinmarketcap": "https://coinmarketcap.com/currencies/STOKEN-token", + "coingecko": "https://www.coingecko.com/en/coins/STOKEN-token" + } + }, + "transactions": 5, + "transactionsLastUpdatedAt": 1743427278, + "transfers": 6, + "transfersLastUpdatedAt": 1743427168, + "accounts": 2, + "accountsLastUpdatedAt": 1743427226, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "SUPER-19c5c5", + "collection": null, + "nonce": null, + "name": "SUPER", + "ticker": "SUPER-19c5c5", + "owner": "erd1kc7v0lhqu0sclywkgeg4um8ea5nvch9psf2lf8t96j3w622qss8sav2zl8", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 18, + "isPaused": false, + "assets": null, + "transactions": 1064, + "transactionsLastUpdatedAt": 1743429080, + "transfers": 1638, + "transfersLastUpdatedAt": 1743427047, + "accounts": 219, + "accountsLastUpdatedAt": 1743429260, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": 0.013049185505658182, + "marketCap": 1304713.1789054081, + "supply": "99984261725735986730017632", + "circulatingSupply": "99984261725735986730017632", + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": 2568.92329734391, + "totalVolume24h": 0, + "isLowLiquidity": true, + "lowLiquidityThresholdPercent": 0.5, + "tradesCount": 198, + "ownersHistory": [], + "balance": "2000000000000000000000", + "valueUsd": 26.098371011316363, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "TADA-1e4ac8", + "collection": null, + "nonce": null, + "name": "Tada", + "ticker": "TADA", + "owner": "erd1ydsg2m9tg3sygwdk8p5q5jd537acdmq28jrweyn7jr2mvtmnd29qhkzhxc", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 18, + "isPaused": false, + "assets": { + "website": "https://ta-da.io/", + "description": "TADA is the utility token of Ta-da, a platform that organizes crowds of users around your needs, providing high-quality data at a fair price with ethical Human In The Loop processes.", + "status": "active", + "pngUrl": "https://tools.multiversx.com/assets-cdn/devnet/tokens/TADA-1e4ac8/icon.png", + "svgUrl": "https://tools.multiversx.com/assets-cdn/devnet/tokens/TADA-1e4ac8/icon.svg", + "social": { + "twitter": "https://twitter.com/Ta_da_io", + "whitepaper": "https://docs.ta-da.io/introduction/overview" + } + }, + "transactions": 35572, + "transactionsLastUpdatedAt": 1743428300, + "transfers": 56140, + "transfersLastUpdatedAt": 1743427047, + "accounts": 276, + "accountsLastUpdatedAt": 1743426084, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": 8.2623623077145, + "marketCap": 8237573148.744644, + "supply": "996999749218609034556977987", + "circulatingSupply": "996999749218609034556977987", + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": 4412.21462265453, + "totalVolume24h": 0, + "isLowLiquidity": true, + "lowLiquidityThresholdPercent": 0.5, + "tradesCount": 135, + "ownersHistory": [], + "balance": "20000000000000000000", + "valueUsd": 165.24724615429, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "TEST-cb9aa1", + "collection": null, + "nonce": null, + "name": "TEST", + "ticker": "TEST-cb9aa1", + "owner": "erd1l8pe4f5uuu3xwwgqpldju6umngsxtqmck4revuzwnzdznq0ahqeszzkjzp", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 18, + "isPaused": false, + "assets": null, + "transactions": 7620, + "transactionsLastUpdatedAt": 1743429023, + "transfers": 7623, + "transfersLastUpdatedAt": 1743427768, + "accounts": 1000, + "accountsLastUpdatedAt": 1743428781, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "22000000000000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "TST-4fe44c", + "collection": null, + "nonce": null, + "name": "TST01", + "ticker": "TST-4fe44c", + "owner": "erd1kp74lkl5ugg7v0jpke7nkjw05ffv5mg4423uw49zgv8sqdz74xgqnfzmln", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 3312, + "transactionsLastUpdatedAt": 1743428300, + "transfers": 3314, + "transfersLastUpdatedAt": 1743426329, + "accounts": 999, + "accountsLastUpdatedAt": 1743427821, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "10000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "TST-56610a", + "collection": null, + "nonce": null, + "name": "TST13", + "ticker": "TST-56610a", + "owner": "erd1l8pe4f5uuu3xwwgqpldju6umngsxtqmck4revuzwnzdznq0ahqeszzkjzp", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 506, + "transactionsLastUpdatedAt": 1743425839, + "transfers": 507, + "transfersLastUpdatedAt": 1743426269, + "accounts": 102, + "accountsLastUpdatedAt": 1743425901, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "5000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "TST-779837", + "collection": null, + "nonce": null, + "name": "TST11", + "ticker": "TST-779837", + "owner": "erd1lcksqedaz96v0fkzyyza3lndeu2apa38zh4azag6t0q2hwrd0e6s2mjejx", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1670, + "transactionsLastUpdatedAt": 1743425422, + "transfers": 1672, + "transfersLastUpdatedAt": 1743426449, + "accounts": 999, + "accountsLastUpdatedAt": 1743425842, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "7000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "TST-899919", + "collection": null, + "nonce": null, + "name": "TST12", + "ticker": "TST-899919", + "owner": "erd1ckeqj00uzg8c5yhwasgqxwtf8xeu8expmhsjw70c6ql95yznnr8sxpj564", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 911, + "transactionsLastUpdatedAt": 1743428480, + "transfers": 913, + "transfersLastUpdatedAt": 1743426448, + "accounts": 400, + "accountsLastUpdatedAt": 1743427159, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "6000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "TST-96f76d", + "collection": null, + "nonce": null, + "name": "TST23", + "ticker": "TST-96f76d", + "owner": "erd1reug35u59kms4jmshrta2f3wedd8q4xt2q526f29ufzmtt205meq6cf49a", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 506, + "transactionsLastUpdatedAt": 1743427457, + "transfers": 507, + "transfersLastUpdatedAt": 1743425792, + "accounts": 102, + "accountsLastUpdatedAt": 1743426864, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "5000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "TST-e5c39d", + "collection": null, + "nonce": null, + "name": "TST22", + "ticker": "TST-e5c39d", + "owner": "erd1xav6y4p8u829qlgvvxylr7vk6s9v5z5m69uqr3a82qznw52j97fqecajse", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 506, + "transactionsLastUpdatedAt": 1743426738, + "transfers": 507, + "transfersLastUpdatedAt": 1743426387, + "accounts": 102, + "accountsLastUpdatedAt": 1743426503, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "5000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "TST-e67a63", + "collection": null, + "nonce": null, + "name": "TST21", + "ticker": "TST-e67a63", + "owner": "erd1ayl5wkpv2vqfg5jslnuw8trcvasvjtcqjau7gvcajawvxtsrfldqg0fax3", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 506, + "transactionsLastUpdatedAt": 1743428718, + "transfers": 507, + "transfersLastUpdatedAt": 1743428128, + "accounts": 102, + "accountsLastUpdatedAt": 1743427640, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "5000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "TST-f2e0d4", + "collection": null, + "nonce": null, + "name": "TST02", + "ticker": "TST-f2e0d4", + "owner": "erd177md8xekmp30xv9nda7mny7cw6etfkvgw7jvc99dqzwd5s5c86uqup2ksz", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 3510, + "transactionsLastUpdatedAt": 1743427697, + "transfers": 3512, + "transfersLastUpdatedAt": 1743429207, + "accounts": 999, + "accountsLastUpdatedAt": 1743429139, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "8000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "TST-f83ed3", + "collection": null, + "nonce": null, + "name": "TST03", + "ticker": "TST-f83ed3", + "owner": "erd15c28dy5p42735ytrqdmn9x20ujynxywwexc7zw4x7cs7qamp502qtepcy8", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 2710, + "transactionsLastUpdatedAt": 1743428177, + "transfers": 2712, + "transfersLastUpdatedAt": 1743428972, + "accounts": 999, + "accountsLastUpdatedAt": 1743426439, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "8000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-02c741", + "collection": null, + "nonce": null, + "name": "WinterMVX023", + "ticker": "WINTER-02c741", + "owner": "erd1422hlml6w2t2lfvswgyv03de058kps3n4m8m0cnxgqdrh5m4egkq8zeya6", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 2005, + "transactionsLastUpdatedAt": 1743428299, + "transfers": 2007, + "transfersLastUpdatedAt": 1743426091, + "accounts": 999, + "accountsLastUpdatedAt": 1743428119, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "2000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-0387bf", + "collection": null, + "nonce": null, + "name": "WinterMVX232", + "ticker": "WINTER-0387bf", + "owner": "erd18tzn48u64jvlgcy8rcuzu4nhqez6xlwzqm4s0kj9qxjzep02klpquxlmtr", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 2005, + "transactionsLastUpdatedAt": 1743428838, + "transfers": 2007, + "transfersLastUpdatedAt": 1743429091, + "accounts": 999, + "accountsLastUpdatedAt": 1743428965, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "2000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-03c72f", + "collection": null, + "nonce": null, + "name": "WinterMVX112", + "ticker": "WINTER-03c72f", + "owner": "erd1ayrs3p7c4zv0fh75l34txswhgx7zuk5t067ykp6wwxz6a93stq8sjff4kt", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1705, + "transactionsLastUpdatedAt": 1743426438, + "transfers": 1707, + "transfersLastUpdatedAt": 1743428849, + "accounts": 999, + "accountsLastUpdatedAt": 1743426560, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "2000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-03ed8c", + "collection": null, + "nonce": null, + "name": "WINTER", + "ticker": "WINTER-03ed8c", + "owner": "erd1jvch655u7egt93vqj54ea2mxp4fsqr6v5gwftwg8qd06dwllq7vq2mkggc", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1278, + "transactionsLastUpdatedAt": 1743428598, + "transfers": 1280, + "transfersLastUpdatedAt": 1743428972, + "accounts": 999, + "accountsLastUpdatedAt": 1743427945, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "3000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-043b15", + "collection": null, + "nonce": null, + "name": "WINTER", + "ticker": "WINTER-043b15", + "owner": "erd1jvch655u7egt93vqj54ea2mxp4fsqr6v5gwftwg8qd06dwllq7vq2mkggc", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 489, + "transactionsLastUpdatedAt": 1743428058, + "transfers": 491, + "transfersLastUpdatedAt": 1743428068, + "accounts": 483, + "accountsLastUpdatedAt": 1743428600, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-0ea5ac", + "collection": null, + "nonce": null, + "name": "WinterX13", + "ticker": "WINTER-0ea5ac", + "owner": "erd12whgeerxcdt2y3ggzyfyjqjmxakqv4nxr4hj60gx5mx4r3mssy9s3vs2sg", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743428058, + "transfers": 1007, + "transfersLastUpdatedAt": 1743428431, + "accounts": 999, + "accountsLastUpdatedAt": 1743427821, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-0f7efe", + "collection": null, + "nonce": null, + "name": "WinterMVX223", + "ticker": "WINTER-0f7efe", + "owner": "erd16jetyr8eqgq2nydxlurh4hawzpc8rf7ts03nc6qym9x7wdhm9etqe7zr34", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743426501, + "transfers": 1007, + "transfersLastUpdatedAt": 1743428317, + "accounts": 999, + "accountsLastUpdatedAt": 1743428779, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-1075bd", + "collection": null, + "nonce": null, + "name": "WinterX21", + "ticker": "WINTER-1075bd", + "owner": "erd1twqsnsm6wqwge6sx8att7cxjsu6498yk7as97pcwee8wjs90n3lqqlr8hf", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743425957, + "transfers": 1007, + "transfersLastUpdatedAt": 1743429329, + "accounts": 999, + "accountsLastUpdatedAt": 1743427161, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-11739f", + "collection": null, + "nonce": null, + "name": "WINTER", + "ticker": "WINTER-11739f", + "owner": "erd1997sl2vw6t28d5ng8evul59cpwzahvl5r5wuaqmvsv57ppdgs0qq9gz4tv", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 198, + "transactionsLastUpdatedAt": 1743427277, + "transfers": 199, + "transfersLastUpdatedAt": 1743427407, + "accounts": 196, + "accountsLastUpdatedAt": 1743428119, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-13a45e", + "collection": null, + "nonce": null, + "name": "WinterMVX033", + "ticker": "WINTER-13a45e", + "owner": "erd1lhvunzll5dxxttlaprfafcjldxjngstmq04d7pkmckhtwh4rm7zq8l6xyh", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743429319, + "transfers": 1007, + "transfersLastUpdatedAt": 1743427168, + "accounts": 999, + "accountsLastUpdatedAt": 1743426922, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-163449", + "collection": null, + "nonce": null, + "name": "WinterMVX133", + "ticker": "WINTER-163449", + "owner": "erd1tdtmne98k5e4qkunfapy882xm2vzjwa6yqytl5h0z7cqe3j5j04sl5z3zl", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743428480, + "transfers": 1007, + "transfersLastUpdatedAt": 1743427288, + "accounts": 999, + "accountsLastUpdatedAt": 1743426504, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-187bd2", + "collection": null, + "nonce": null, + "name": "WinterMVX122", + "ticker": "WINTER-187bd2", + "owner": "erd1lj064fsgwcru0yr0rzlf02l9s7twtd7ef2v53l00hfcrk4hr7dfsglwy39", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 2005, + "transactionsLastUpdatedAt": 1743426501, + "transfers": 2007, + "transfersLastUpdatedAt": 1743428494, + "accounts": 999, + "accountsLastUpdatedAt": 1743426505, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "2000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-18b040", + "collection": null, + "nonce": null, + "name": "WinterMVX123", + "ticker": "WINTER-18b040", + "owner": "erd12ykrzk4l3ryymzlu48e8leu59gt9xddsh8w46k0va9rt0e7gfvgshrm4kv", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743427097, + "transfers": 1007, + "transfersLastUpdatedAt": 1743427350, + "accounts": 999, + "accountsLastUpdatedAt": 1743426741, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-19817c", + "collection": null, + "nonce": null, + "name": "WinterMVX213", + "ticker": "WINTER-19817c", + "owner": "erd1uwjda6nulq8fk8v6zfyl7nphqqq86sd0k63yfnctjppv6evn044qwhfq2k", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 2005, + "transactionsLastUpdatedAt": 1743427997, + "transfers": 2007, + "transfersLastUpdatedAt": 1743426329, + "accounts": 999, + "accountsLastUpdatedAt": 1743428483, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "2000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-1a96ee", + "collection": null, + "nonce": null, + "name": "WINTER22", + "ticker": "WINTER-1a96ee", + "owner": "erd1rxww6fdpg9mqtguyvnqujmmqf6w6asq58mkpxp9z730rqjef2gnqmxshw6", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1238, + "transactionsLastUpdatedAt": 1743428598, + "transfers": 1240, + "transfersLastUpdatedAt": 1743427047, + "accounts": 1136, + "accountsLastUpdatedAt": 1743427640, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-1e1a19", + "collection": null, + "nonce": null, + "name": "WinterMVX212", + "ticker": "WINTER-1e1a19", + "owner": "erd1nux08lqew7f3t8jz6ytapxxv3pgueqn4p24hrwdmhvlcwtvwed9qptvs34", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743428718, + "transfers": 1007, + "transfersLastUpdatedAt": 1743428368, + "accounts": 999, + "accountsLastUpdatedAt": 1743427699, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-203fa0", + "collection": null, + "nonce": null, + "name": "WINTERMVXCHALLENGE24", + "ticker": "WINTER-203fa0", + "owner": "erd1u8ux9htkjrdykx7evmqw94xt9mset0t9jly2pr6y3ty2k8yjn48qk2q7mp", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743429080, + "transfers": 1007, + "transfersLastUpdatedAt": 1743427707, + "accounts": 999, + "accountsLastUpdatedAt": 1743426862, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-24c02b", + "collection": null, + "nonce": null, + "name": "WINTER21", + "ticker": "WINTER-24c02b", + "owner": "erd17ka3st74ugcll89ql0pwkv0fnf55a88f90ut8vmvs3mgd47xuuhq5rg9fl", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1162, + "transactionsLastUpdatedAt": 1743427158, + "transfers": 1164, + "transfersLastUpdatedAt": 1743426569, + "accounts": 1135, + "accountsLastUpdatedAt": 1743426146, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-2f6bcd", + "collection": null, + "nonce": null, + "name": "WINTER01", + "ticker": "WINTER-2f6bcd", + "owner": "erd1x4j6e9nmdyhlev0lcufldmfdpyeaz5eav7thr0gsrqtuvkxs3yjqkx8nd2", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1162, + "transactionsLastUpdatedAt": 1743429319, + "transfers": 1164, + "transfersLastUpdatedAt": 1743426329, + "accounts": 1139, + "accountsLastUpdatedAt": 1743425300, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-3124ed", + "collection": null, + "nonce": null, + "name": "WinterMVX013", + "ticker": "WINTER-3124ed", + "owner": "erd1yaqvt5lgwkpy0u3g5y6q9l62qzp2vd93xsnge4v76h5vrn6c896qk4jcud", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743428718, + "transfers": 1007, + "transfersLastUpdatedAt": 1743427467, + "accounts": 999, + "accountsLastUpdatedAt": 1743428840, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-312d18", + "collection": null, + "nonce": null, + "name": "WinterMVX131", + "ticker": "WINTER-312d18", + "owner": "erd1gc5nat2py8qk0k63vnj7ets0pp37h0jenjttx4hqwdgvyqdrjawsz56l7n", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 2005, + "transactionsLastUpdatedAt": 1743426797, + "transfers": 2007, + "transfersLastUpdatedAt": 1743428188, + "accounts": 999, + "accountsLastUpdatedAt": 1743427099, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "2000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-44f2b5", + "collection": null, + "nonce": null, + "name": "WinterMVX022", + "ticker": "WINTER-44f2b5", + "owner": "erd1q8w3ju88dxxaj82rzlj7wlak35xweegudvkuhrcskynd4elxclkqfhljqj", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743428480, + "transfers": 1007, + "transfersLastUpdatedAt": 1743426929, + "accounts": 999, + "accountsLastUpdatedAt": 1743428181, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-450095", + "collection": null, + "nonce": null, + "name": "WinterMVX032", + "ticker": "WINTER-450095", + "owner": "erd1yrdtj8q2295xzm0a9q6ejug3dvlxg9v4srup8xuqnhg3yzm5hakq8m26vk", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 2005, + "transactionsLastUpdatedAt": 1743426797, + "transfers": 2007, + "transfersLastUpdatedAt": 1743429039, + "accounts": 999, + "accountsLastUpdatedAt": 1743426503, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "2000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-4b4989", + "collection": null, + "nonce": null, + "name": "WinterX01", + "ticker": "WINTER-4b4989", + "owner": "erd1qfvtyxee6dm3vw8t3atqxqjcn9vsz630agaydzue03vmphzw6dkqt03r2y", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1053, + "transactionsLastUpdatedAt": 1743426501, + "transfers": 1055, + "transfersLastUpdatedAt": 1743425792, + "accounts": 1015, + "accountsLastUpdatedAt": 1743427822, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-4b927e", + "collection": null, + "nonce": null, + "name": "WINTER", + "ticker": "WINTER-4b927e", + "owner": "erd19rcnsfx6dj3r3xngy2vly4ml37p57maa3v42nf4a6dfz86e2ytxqx8ary5", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 387, + "transactionsLastUpdatedAt": 1743428959, + "transfers": 389, + "transfersLastUpdatedAt": 1743427350, + "accounts": 381, + "accountsLastUpdatedAt": 1743427521, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-5062cc", + "collection": null, + "nonce": null, + "name": "WINTERMVXCHALLENGE24", + "ticker": "WINTER-5062cc", + "owner": "erd1kgarc3ppdn6y0llrkwly3jjg60qcsqaqm0ka0kmxey9txsp7y8aqj6muc4", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1006, + "transactionsLastUpdatedAt": 1743426679, + "transfers": 1008, + "transfersLastUpdatedAt": 1743426987, + "accounts": 999, + "accountsLastUpdatedAt": 1743427161, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-5320a8", + "collection": null, + "nonce": null, + "name": "WinterX23", + "ticker": "WINTER-5320a8", + "owner": "erd1k5m2nv508ekzkxt3kcnpy8fel50p2q9nvvtp50ey3lalc2mpnw0qsvw5q4", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743427518, + "transfers": 1007, + "transfersLastUpdatedAt": 1743427768, + "accounts": 999, + "accountsLastUpdatedAt": 1743427160, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-563357", + "collection": null, + "nonce": null, + "name": "WINTER20", + "ticker": "WINTER-563357", + "owner": "erd1vpk49clg8nwgkzteahhzm3nqxst69tqs0z4su5554qagwlmtm43qzntp4a", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1166, + "transactionsLastUpdatedAt": 1743428420, + "transfers": 1168, + "transfersLastUpdatedAt": 1743427350, + "accounts": 1134, + "accountsLastUpdatedAt": 1743426979, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-5bade0", + "collection": null, + "nonce": null, + "name": "WinterMVX221", + "ticker": "WINTER-5bade0", + "owner": "erd1c2x73evg5dq3f5n4n6dpw9nu4gycdg4empjphwn33g9akqalzk3qhagq53", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 2005, + "transactionsLastUpdatedAt": 1743427518, + "transfers": 2007, + "transfersLastUpdatedAt": 1743425909, + "accounts": 999, + "accountsLastUpdatedAt": 1743426084, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "2000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-5f1a87", + "collection": null, + "nonce": null, + "name": "WINTERMVXCHALLENGE24", + "ticker": "WINTER-5f1a87", + "owner": "erd1j0u5csyxmsd23mcx5rqyzlljc5pkr8uhaqa9ug5az0rsdgtnqxpssqucgm", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743427879, + "transfers": 1007, + "transfersLastUpdatedAt": 1743426328, + "accounts": 999, + "accountsLastUpdatedAt": 1743428600, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-638a11", + "collection": null, + "nonce": null, + "name": "WinterMVX013", + "ticker": "WINTER-638a11", + "owner": "erd1570n8uaczgf8adkp7weqsufs2phqndszz5nspzqq8dna06avlf2q034v6l", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 2005, + "transactionsLastUpdatedAt": 1743426141, + "transfers": 2007, + "transfersLastUpdatedAt": 1743427768, + "accounts": 999, + "accountsLastUpdatedAt": 1743425600, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "2000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-6aefc7", + "collection": null, + "nonce": null, + "name": "WINTER10", + "ticker": "WINTER-6aefc7", + "owner": "erd10xt8y56mvpge9gpn6skerdkfnhy507t9rvu9gqyqudx59jf7er3sqcf7gc", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1166, + "transactionsLastUpdatedAt": 1743428838, + "transfers": 1168, + "transfersLastUpdatedAt": 1743425909, + "accounts": 1141, + "accountsLastUpdatedAt": 1743428839, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-6ea24a", + "collection": null, + "nonce": null, + "name": "WinterX11", + "ticker": "WINTER-6ea24a", + "owner": "erd1t0qfwn2hjtwmty99qg5r2mnjwtky6zerrzswf72902ehymd9k05s02dyf4", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743426141, + "transfers": 1007, + "transfersLastUpdatedAt": 1743428972, + "accounts": 999, + "accountsLastUpdatedAt": 1743426863, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-72ce61", + "collection": null, + "nonce": null, + "name": "WinterMVX113", + "ticker": "WINTER-72ce61", + "owner": "erd17knmtzd2cu8zut9xj6m6fr5zynvshfde3me5lnrn24h0wzxdk8es6at4xz", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743427697, + "transfers": 1007, + "transfersLastUpdatedAt": 1743429268, + "accounts": 999, + "accountsLastUpdatedAt": 1743427400, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-73c4af", + "collection": null, + "nonce": null, + "name": "WINTERMVXCHALLENGE24", + "ticker": "WINTER-73c4af", + "owner": "erd1hf64gjf24ernlcxzyavrz8lajg6ef9chp3h8u4ytwzv4sz8xkjxq0q9va6", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1006, + "transactionsLastUpdatedAt": 1743427340, + "transfers": 1008, + "transfersLastUpdatedAt": 1743426387, + "accounts": 999, + "accountsLastUpdatedAt": 1743426260, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-7b5554", + "collection": null, + "nonce": null, + "name": "WINTERMVXCHALLENGE24", + "ticker": "WINTER-7b5554", + "owner": "erd19q586tm8k5vzjwsmmy7v85e2yc899wqulw5pur0k377ueylckzls0gaflu", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743428420, + "transfers": 1007, + "transfersLastUpdatedAt": 1743425909, + "accounts": 999, + "accountsLastUpdatedAt": 1743426083, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-8ecad8", + "collection": null, + "nonce": null, + "name": "WinterMVX232", + "ticker": "WINTER-8ecad8", + "owner": "erd14elcm7wlkhyz25yyly05wz2qx79u4vgvvhrv52grafhxsfmlhutqvq8snf", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743427518, + "transfers": 1007, + "transfersLastUpdatedAt": 1743426209, + "accounts": 999, + "accountsLastUpdatedAt": 1743427520, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-99e3bc", + "collection": null, + "nonce": null, + "name": "WINTER02", + "ticker": "WINTER-99e3bc", + "owner": "erd1d9u0zth0hr3yh9szhk0t969gkqnyjl0unkjwl4jmezllf8h78wqqjy9n5l", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1414, + "transactionsLastUpdatedAt": 1743425422, + "transfers": 1416, + "transfersLastUpdatedAt": 1743426387, + "accounts": 1137, + "accountsLastUpdatedAt": 1743427998, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "4000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-a02f86", + "collection": null, + "nonce": null, + "name": "WINTERMVXCHALLENGE24", + "ticker": "WINTER-a02f86", + "owner": "erd1ndlycc04p3s0m0susmqj0q6ex2c2f8f9jpgvret5ymdclsaxup6qzxue4e", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1003, + "transactionsLastUpdatedAt": 1743426919, + "transfers": 1005, + "transfersLastUpdatedAt": 1743428368, + "accounts": 999, + "accountsLastUpdatedAt": 1743427460, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-a26dfb", + "collection": null, + "nonce": null, + "name": "WINTERMVXCHALLENGE24", + "ticker": "WINTER-a26dfb", + "owner": "erd10jl8el930pu87jcflrwtsvr5qnynrh923wwyapdkevv92n88qeaqqdhdns", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743426919, + "transfers": 1007, + "transfersLastUpdatedAt": 1743427168, + "accounts": 999, + "accountsLastUpdatedAt": 1743429083, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-a4dec4", + "collection": null, + "nonce": null, + "name": "WINTER", + "ticker": "WINTER-a4dec4", + "owner": "erd1ce7dn300pefdh7ryk62prp3gwv49v2kck8kt52fxt5dr79xplh6qsem2lz", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 197, + "transactionsLastUpdatedAt": 1743425598, + "transfers": 199, + "transfersLastUpdatedAt": 1743426630, + "accounts": 191, + "accountsLastUpdatedAt": 1743425542, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-a513e7", + "collection": null, + "nonce": null, + "name": "WinterX02", + "ticker": "WINTER-a513e7", + "owner": "erd1m9qn7zf5m2a83nejv6fnmqlxan0ft9vlthqal8hzgxfdqcjz40vqj538hn", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743428118, + "transfers": 1007, + "transfersLastUpdatedAt": 1743429268, + "accounts": 999, + "accountsLastUpdatedAt": 1743428601, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-ab1c2a", + "collection": null, + "nonce": null, + "name": "WinterX03", + "ticker": "WINTER-ab1c2a", + "owner": "erd15kfg456kjzzdr83rca9kwhl5pmmxa5d0xqwp40tp5v4mapyyrccq2n4q55", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1003, + "transactionsLastUpdatedAt": 1743426977, + "transfers": 1005, + "transfersLastUpdatedAt": 1743426569, + "accounts": 999, + "accountsLastUpdatedAt": 1743428359, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-ce763d", + "collection": null, + "nonce": null, + "name": "WinterX22", + "ticker": "WINTER-ce763d", + "owner": "erd1z5cpd8vapfvescq576ptw2u9vhft574ggeglq5jx29kc4uk0zhdquvnac3", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743427997, + "transfers": 1007, + "transfersLastUpdatedAt": 1743427831, + "accounts": 999, + "accountsLastUpdatedAt": 1743427281, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-dfc9a0", + "collection": null, + "nonce": null, + "name": "WINTER11", + "ticker": "WINTER-dfc9a0", + "owner": "erd16tgcg48v3mj44myfy6msu0443fyrgw7epk6y5xevvj9c28nntu7svsl3hz", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1161, + "transactionsLastUpdatedAt": 1743426739, + "transfers": 1163, + "transfersLastUpdatedAt": 1743426032, + "accounts": 1139, + "accountsLastUpdatedAt": 1743427400, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-e0b173", + "collection": null, + "nonce": null, + "name": "WINTER12", + "ticker": "WINTER-e0b173", + "owner": "erd1wmqxvn2phpj02d3v2dgsrqvkutyh4ycxxa6nunylpjaeyvljfjxsqlxwc3", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1199, + "transactionsLastUpdatedAt": 1743425422, + "transfers": 1201, + "transfersLastUpdatedAt": 1743427168, + "accounts": 1136, + "accountsLastUpdatedAt": 1743425958, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": true, + "canAddSpecialRoles": true, + "canPause": true, + "canFreeze": true, + "canWipe": true, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + }, + { + "type": "FungibleESDT", + "subType": "", + "identifier": "WINTER-e5d2d8", + "collection": null, + "nonce": null, + "name": "WINTERMVXCHALLENGE24", + "ticker": "WINTER-e5d2d8", + "owner": "erd1w6d4rcfz2shzhnut372c6tvlf83p3cf0dsld9p900ftkggxsfess6nuk50", + "minted": "", + "burnt": "", + "initialMinted": "", + "decimals": 8, + "isPaused": false, + "assets": null, + "transactions": 1005, + "transactionsLastUpdatedAt": 1743426558, + "transfers": 1007, + "transfersLastUpdatedAt": 1743428368, + "accounts": 999, + "accountsLastUpdatedAt": 1743428303, + "canUpgrade": true, + "canMint": false, + "canBurn": false, + "canChangeOwner": false, + "canAddSpecialRoles": true, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canTransferNftCreateRole": null, + "price": null, + "marketCap": null, + "supply": null, + "circulatingSupply": null, + "timestamp": null, + "mexPairType": "experimental", + "totalLiquidity": null, + "totalVolume24h": null, + "isLowLiquidity": null, + "lowLiquidityThresholdPercent": null, + "tradesCount": null, + "ownersHistory": [], + "balance": "1000000000000", + "valueUsd": null, + "attributes": null + } + ], + "txCount": 15298, + "username": "" +} \ No newline at end of file diff --git a/src/common/api-config/api.config.service.ts b/src/common/api-config/api.config.service.ts index caa42d10b..07ba50c2a 100644 --- a/src/common/api-config/api.config.service.ts +++ b/src/common/api-config/api.config.service.ts @@ -2,8 +2,8 @@ import { Constants } from '@multiversx/sdk-nestjs-common'; import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { DatabaseConnectionOptions } from '../persistence/entities/connection.options'; -import { LogTopic } from '@elrondnetwork/transaction-processor'; import { StatusCheckerThresholds } from './entities/status-checker-thresholds'; +import { LogTopic } from '@multiversx/sdk-transaction-processor/lib/types/log-topic'; @Injectable() export class ApiConfigService { @@ -862,6 +862,14 @@ export class ApiConfigService { return deepHistoryUrl; } + isChainAndromedaEnabled(): boolean { + return this.configService.get('features.chainAndromeda.enabled') ?? false; + } + + getChainAndromedaActivationEpoch(): number { + return this.configService.get('features.chainAndromeda.activationEpoch') ?? 99999; + } + isAssetsCdnFeatureEnabled(): boolean { return this.configService.get('features.assetsFetch.enabled') ?? false; } @@ -912,4 +920,12 @@ export class ApiConfigService { getCacheDuration(): number { return this.configService.get('caching.cacheDuration') ?? 3; } + + isMediaRedirectFeatureEnabled(): boolean { + return this.configService.get('features.mediaRedirect.enabled') ?? false; + } + + getMediaRedirectFileStorageUrls(): string[] { + return this.configService.get('features.mediaRedirect.storageUrls') ?? []; + } } diff --git a/src/common/indexer/db/src/index.ts b/src/common/indexer/db/src/index.ts new file mode 100644 index 000000000..edbda0b95 --- /dev/null +++ b/src/common/indexer/db/src/index.ts @@ -0,0 +1,5 @@ +export * from './mongodb.module'; +export * from './mongodb.repositories.module'; +export * from './repositories'; +export * from './schemas'; +export * from './utils'; diff --git a/src/common/indexer/db/src/mongodb.module.ts b/src/common/indexer/db/src/mongodb.module.ts new file mode 100644 index 000000000..c740a963c --- /dev/null +++ b/src/common/indexer/db/src/mongodb.module.ts @@ -0,0 +1,32 @@ +import { Module } from "@nestjs/common"; +import { MongooseModule } from "@nestjs/mongoose"; +import { ApiConfigModule } from "src/common/api-config/api.config.module"; +import { ApiConfigService } from "src/common/api-config/api.config.service"; +import { AccountDetails, AccountDetailsSchema } from "./schemas"; +import { AccountDetailsRepository } from "./repositories"; + + +@Module({ + imports: [ + MongooseModule.forRootAsync({ + imports: [ApiConfigModule], + inject: [ApiConfigService], + useFactory: (apiConfigService: ApiConfigService) => ({ + uri: apiConfigService.getDatabaseUrl().replace(":27017", ''), // TODO: remove this hack + tls: true, + tlsAllowInvalidCertificates: true, + }), + }), + MongooseModule.forFeature([ + { name: AccountDetails.name, schema: AccountDetailsSchema }, + + ]), + ], + providers: [ + AccountDetailsRepository, + ], + exports: [ + AccountDetailsRepository, + ], +}) +export class MongoDbModule { } diff --git a/src/common/indexer/db/src/mongodb.repositories.module.ts b/src/common/indexer/db/src/mongodb.repositories.module.ts new file mode 100644 index 000000000..ba312b950 --- /dev/null +++ b/src/common/indexer/db/src/mongodb.repositories.module.ts @@ -0,0 +1,23 @@ +import { Global, Module, forwardRef } from "@nestjs/common"; +import { MongooseModule } from "@nestjs/mongoose"; +import { AccountDetails, AccountDetailsSchema } from "./schemas"; +import { ApiMetricsModule } from "src/common/metrics/api.metrics.module"; +import { AccountDetailsRepository } from "./repositories"; + + +@Global() +@Module({ + imports: [ + forwardRef(() => ApiMetricsModule), + MongooseModule.forFeature([ + { name: AccountDetails.name, schema: AccountDetailsSchema }, + ]), + ], + providers: [ + AccountDetailsRepository + ], + exports: [ + AccountDetailsRepository, + ], +}) +export class MongoDbRepositoriesModule { } diff --git a/src/common/indexer/db/src/repositories/account.details.repository.ts b/src/common/indexer/db/src/repositories/account.details.repository.ts new file mode 100644 index 000000000..5e2cf6cf0 --- /dev/null +++ b/src/common/indexer/db/src/repositories/account.details.repository.ts @@ -0,0 +1,297 @@ +import { Model } from 'mongoose'; +import { LogPerformanceAsync } from 'src/utils/log.performance.decorator'; +import { MetricsEvents } from 'src/utils/metrics-events.constants'; +import { AccountDetails } from '../schemas'; +import { InjectModel } from '@nestjs/mongoose'; +import { QueryPagination } from 'src/common/entities/query.pagination'; +import { TokenWithBalance } from 'src/endpoints/tokens/entities/token.with.balance'; +import { NftAccount } from 'src/endpoints/nfts/entities/nft.account'; + +export class AccountDetailsRepository { + static readonly exclusionFields = { + _id: 0, + __v: 0, + updatedAt: 0, + createdAt: 0, + address: 0, + balance: 0, + nonce: 0, + timestamp: 0, + shard: 0, + ownerAddress: 0, + assets: 0, + deployedAt: 0, + deployTxHash: 0, + ownerAssets: 0, + isVerified: 0, + txCount: 0, + scrCount: 0, + transfersLast24h: 0, + code: 0, + codeHash: 0, + rootHash: 0, + username: 0, + developerReward: 0, + isUpgradeable: 0, + isReadable: 0, isPayable: 0, + isPayableBySmartContract: 0, + scamInfo: 0, + nftCollections: 0, + activeGuardianActivationEpoch: 0, + activeGuardianAddress: 0, + activeGuardianServiceUid: 0, + pendingGuardianActivationEpoch: 0, + pendingGuardianAddress: 0, + pendingGuardianServiceUid: 0, + isGuarded: 0, + } + constructor( + @InjectModel(AccountDetails.name) + private readonly accountDetailsModel: Model + ) { } + + @LogPerformanceAsync(MetricsEvents.SetPersistenceDuration, 'account-tokens') + async getTokensForAddress(address: string, queryPagination: QueryPagination): Promise { + try { + // TODO: add more fields in project on demand + const result = await this.accountDetailsModel.aggregate([ + { $match: { address } }, + { + $project: { + _id: 0, + tokens: { + $slice: ["$tokens", queryPagination.from, queryPagination.size] + }, + } + }, + { + $project: { + "tokens.type": 1, + "tokens.subType": 1, + "tokens.identifier": 1, + "tokens.collection": 1, + "tokens.name": 1, + "tokens.nonce": 1, + "tokens.decimals": 1, + "tokens.balance": 1, + } + } + ]).exec(); + // const result = await this.accountDetailsModel.findOne( + // { address }, + // { + // tokens: { + // $slice: [queryPagination.from, queryPagination.size], + // }, + // "tokens.balance": 0, // Exclude direct balance + // ...AccountDetailsRepository.exclusionFields, + // } + // ).lean(); + //@ts-ignore + // console.log('result', result); + // console.log('result', result); + return result[0]?.tokens ?? []; + } catch (error) { + console.error(`Error fetching tokens for address: ${address}:`, error); + return []; + } + } + + @LogPerformanceAsync(MetricsEvents.SetPersistenceDuration, 'account-tokens') + async getTokenForAddress(address: string, identifier: string): Promise { + try { + // TODO: add more fields in project on demand + // TODO: search for token efficiently: return first occurence and use index on identifier + const result = await this.accountDetailsModel.aggregate([ + { $match: { address } }, + { + $project: { + _id: 0, + tokens: { + $filter: { + input: "$tokens", + as: "token", + cond: { $eq: ["$$token.identifier", identifier] } + } + } + } + }, + { + $project: { + "tokens.type": 1, + "tokens.subType": 1, + "tokens.identifier": 1, + "tokens.collection": 1, + "tokens.name": 1, + "tokens.nonce": 1, + "tokens.decimals": 1, + "tokens.balance": 1, + } + } + ]).exec(); + // console.log('result', result); + // const result = await this.accountDetailsModel.findOne( + // { address }, + // { + // tokens: { + // $slice: [queryPagination.from, queryPagination.size], + // }, + // "tokens.balance": 0, // Exclude direct balance + // ...AccountDetailsRepository.exclusionFields, + // } + // ).lean(); + //@ts-ignore + // console.log('result', result); + // console.log('result', result); + // console.log(result[0].tokens) + return result[0]?.tokens[0] ?? undefined; + } catch (error) { + console.error(`Error fetching token with identifier ${identifier} for address: ${address}:`, error); + return undefined; + } + } + + @LogPerformanceAsync(MetricsEvents.SetPersistenceDuration, 'account-nfts') + async getNftForAddress(address: string, identifier: string): Promise { + try { + // TODO: add more fields in project on demand + // TODO: search for nft efficiently: return first occurence and use index on identifier + const result = await this.accountDetailsModel.aggregate([ + { $match: { address } }, + { + $project: { + _id: 0, + nfts: { + $filter: { + input: "$nfts", + as: "nft", + cond: { $eq: ["$$nft.identifier", identifier] } + } + } + } + }, + { + $project: { + "nfts.identifier": 1, + "nfts.collection": 1, + "nfts.nonce": 1, + "nfts.type": 1, + "nfts.subType": 1, + "nfts.name": 1, + } + } + ]).exec(); + // const result = await this.accountDetailsModel.findOne( + // { address }, + // { + // nfts: { + // $slice: [queryPagination.from, queryPagination.size] + // }, + // tokens: 0, + // ...AccountDetailsRepository.exclusionFields, + // } + // ).lean(); + return result[0]?.nfts[0] ?? undefined; + } catch (error) { + console.error(`Error fetching nft with identifier ${identifier} for address: ${address}:`, error); + return undefined; + } + } + + @LogPerformanceAsync(MetricsEvents.SetPersistenceDuration, 'account-nfts') + async getNftsForAddress(address: string, queryPagination: QueryPagination): Promise { + try { + // TODO: add more fields in project on demand + const result = await this.accountDetailsModel.aggregate([ + { $match: { address } }, + { + $project: { + _id: 0, + nfts: { $slice: ["$nfts", queryPagination.from, queryPagination.size] } + } + }, + { + $project: { + "nfts.identifier": 1, + "nfts.collection": 1, + "nfts.nonce": 1, + "nfts.type": 1, + "nfts.subType": 1, + "nfts.name": 1, + } + } + ]).exec(); + // const result = await this.accountDetailsModel.findOne( + // { address }, + // { + // nfts: { + // $slice: [queryPagination.from, queryPagination.size] + // }, + // tokens: 0, + // ...AccountDetailsRepository.exclusionFields, + // } + // ).lean(); + + return result[0]?.nfts || []; + } catch (error) { + console.error(`Error fetching nfts for address: ${address}:`, error); + return []; + } + } + + @LogPerformanceAsync(MetricsEvents.SetPersistenceDuration, 'account-details') + async getAccount(address: string): Promise { + try { + const accountDb = await this.accountDetailsModel.findOne( + { address }, + { _id: 0, __v: 0, tokens: 0, nfts: 0, updatedAt: 0, createdAt: 0, code: 0 } + ).lean(); + if (!accountDb) { + return null; + } + return accountDb; + } catch (error) { + console.error('Error fetching account:', error); + return null; + } + } + + @LogPerformanceAsync(MetricsEvents.SetPersistenceDuration, 'account-details') + async updateAccount(accountDetailed: AccountDetails): Promise { + try { + // Create update object with all fields from accountDetailed + const updateFields: Partial = {}; + + // Helper function to check if a value is valid for update + const isValidValue = (value: any): boolean => { + return value !== undefined && value !== null; + }; + + // Build update object with all valid fields from accountDetailed + Object.entries(accountDetailed).forEach(([key, value]) => { + if (isValidValue(value)) { + updateFields[key as keyof AccountDetails] = value; + } + }); + // Use findOneAndUpdate with upsert option + const updatedAccount = await this.accountDetailsModel.findOneAndUpdate( + { address: accountDetailed.address }, + { $set: updateFields }, + { + new: true, // Return the updated document + upsert: true, // Create if doesn't exist + lean: true, // Return plain JavaScript object + projection: { __v: 0, __id: 0, updatedAt: 0 } // Exclude __v field + } + ); + // console.log('updatedAccount', updatedAccount); + return updatedAccount; + } catch (error: any) { + // Handle potential duplicate key errors + if (error.code !== 11000) { + throw error; + } + return null; + } + } +} \ No newline at end of file diff --git a/src/common/indexer/db/src/repositories/index.ts b/src/common/indexer/db/src/repositories/index.ts new file mode 100644 index 000000000..dc9908dae --- /dev/null +++ b/src/common/indexer/db/src/repositories/index.ts @@ -0,0 +1 @@ +export * from './account.details.repository'; \ No newline at end of file diff --git a/src/common/indexer/db/src/schemas/account.details.schema.ts b/src/common/indexer/db/src/schemas/account.details.schema.ts new file mode 100644 index 000000000..af8296855 --- /dev/null +++ b/src/common/indexer/db/src/schemas/account.details.schema.ts @@ -0,0 +1,121 @@ +import { Prop, SchemaFactory, Schema } from '@nestjs/mongoose'; +import mongoose, { HydratedDocument } from 'mongoose'; +import { AccountAssets } from 'src/common/assets/entities/account.assets'; +import { ScamInfo } from 'src/common/entities/scam-info.dto'; +import { NftCollectionAccount } from 'src/endpoints/collections/entities/nft.collection.account'; +import { NftAccount } from 'src/endpoints/nfts/entities/nft.account'; +import { TokenWithBalance } from 'src/endpoints/tokens/entities/token.with.balance'; + +export type AccountDetailsDocument = HydratedDocument; + +@Schema({ collection: 'account-details', timestamps: true }) +export class AccountDetails { + @Prop({ type: mongoose.Schema.Types.ObjectId, auto: true }) + _id!: string; + + @Prop({ required: true, type: String }) + address: string = ''; + + @Prop({ required: true, type: String }) + balance: string = ''; + + @Prop({ required: true, type: Number }) + nonce: number = 0; + + @Prop({ required: true, type: Number }) + timestamp: number = 0; + + @Prop({ required: true, type: Number }) + shard: number = 0; + + @Prop({ required: true, type: String }) + ownerAddress: string = ''; + + @Prop({ type: Object, required: false }) + assets?: AccountAssets; + + @Prop({ required: false, type: Number }) + deployedAt?: number | null; + + @Prop({ required: false, type: String }) + deployTxHash?: string | null; + + @Prop({ type: Object, required: false }) + ownerAssets?: AccountAssets; + + @Prop({ required: false, type: Boolean }) + isVerified?: boolean; + + @Prop({ required: false, type: Number }) + txCount?: number; + + @Prop({ required: false, type: Number }) + scrCount?: number; + + @Prop({ required: false, type: Number }) + transfersLast24h?: number; + + @Prop({ required: true, type: String }) + code: string = ''; + + @Prop({ required: true, type: String }) + codeHash: string = ''; + + @Prop({ required: true, type: String }) + rootHash: string = ''; + + @Prop({ required: false, type: String }) + username?: string; + + @Prop({ required: true, type: String }) + developerReward: string = ''; + + @Prop({ required: false, type: Boolean }) + isUpgradeable?: boolean; + + @Prop({ required: false, type: Boolean }) + isReadable?: boolean; + + @Prop({ required: false, type: Boolean }) + isPayable?: boolean; + + @Prop({ required: false, type: Boolean }) + isPayableBySmartContract?: boolean; + + @Prop({ type: Object, required: false }) + scamInfo?: ScamInfo; + + @Prop({ type: Array, required: false }) + nftCollections?: NftCollectionAccount[]; + + @Prop({ type: Array, required: false }) + nfts?: NftAccount[]; + + @Prop({ type: Array, required: false }) + tokens?: TokenWithBalance[]; + + @Prop({ required: false, type: Number }) + activeGuardianActivationEpoch?: number; + + @Prop({ required: false, type: String }) + activeGuardianAddress?: string; + + @Prop({ required: false, type: String }) + activeGuardianServiceUid?: string; + + @Prop({ required: false, type: Number }) + pendingGuardianActivationEpoch?: number; + + @Prop({ required: false, type: String }) + pendingGuardianAddress?: string; + + @Prop({ required: false, type: String }) + pendingGuardianServiceUid?: string; + + @Prop({ required: false, type: Boolean }) + isGuarded?: boolean; +} + +export const AccountDetailsSchema = SchemaFactory.createForClass(AccountDetails); + +AccountDetailsSchema.index({ address: 1 }, { unique: true }); \ No newline at end of file diff --git a/src/common/indexer/db/src/schemas/index.ts b/src/common/indexer/db/src/schemas/index.ts new file mode 100644 index 000000000..72b1aaabe --- /dev/null +++ b/src/common/indexer/db/src/schemas/index.ts @@ -0,0 +1 @@ +export * from './account.details.schema'; \ No newline at end of file diff --git a/src/common/indexer/db/src/utils/errors.ts b/src/common/indexer/db/src/utils/errors.ts new file mode 100644 index 000000000..4ca3757db --- /dev/null +++ b/src/common/indexer/db/src/utils/errors.ts @@ -0,0 +1,3 @@ +export enum MongoDbErrorCode { + DUPLICATE_KEY_ERROR = 11000, +} diff --git a/src/common/indexer/db/src/utils/index.ts b/src/common/indexer/db/src/utils/index.ts new file mode 100644 index 000000000..f72bc43e2 --- /dev/null +++ b/src/common/indexer/db/src/utils/index.ts @@ -0,0 +1 @@ +export * from './errors'; diff --git a/src/common/indexer/elastic/elastic.indexer.service.ts b/src/common/indexer/elastic/elastic.indexer.service.ts index 661012cb1..9188341cf 100644 --- a/src/common/indexer/elastic/elastic.indexer.service.ts +++ b/src/common/indexer/elastic/elastic.indexer.service.ts @@ -890,7 +890,7 @@ export class ElasticIndexerService implements IndexerInterface { async getAllFungibleTokens(): Promise { const query = ElasticQuery.create() .withMustMatchCondition('type', TokenType.FungibleESDT) - .withFields(["name", "type", "currentOwner", "numDecimals", "properties", "timestamp", "ownersHistory"]) + .withFields(["name", "type", "currentOwner", "numDecimals", "properties", "timestamp", "ownersHistory", "paused"]) .withMustNotExistCondition('identifier') .withPagination({ from: 0, size: 1000 }); @@ -1011,4 +1011,30 @@ export class ElasticIndexerService implements IndexerInterface { return await this.elasticService.getCount('events', elasticQuery); } + + async getAccountNftReceivedTimestamps(address: string, identifiers: string[]): Promise> { + if (!identifiers || identifiers.length === 0) { + return {}; + } + + const identifierToTimestamp: Record = {}; + + const elasticQuery = ElasticQuery.create() + .withMustMatchCondition('address', address) + .withMustMultiShouldCondition(identifiers, identifier => QueryType.Match('identifier', identifier, QueryOperator.AND)) + .withSort([{ name: 'timestamp', order: ElasticSortOrder.ascending }]) + .withPagination({ from: 0, size: 10000 }); + + const history = await this.elasticService.getList('accountsesdthistory', 'address', elasticQuery); + + for (const entry of history) { + if (entry.identifier) { + if (!identifierToTimestamp[entry.identifier] || entry.timestamp < identifierToTimestamp[entry.identifier]) { + identifierToTimestamp[entry.identifier] = entry.timestamp; + } + } + } + + return identifierToTimestamp; + } } diff --git a/src/common/indexer/indexer.interface.ts b/src/common/indexer/indexer.interface.ts index d22317bff..355dfc0d6 100644 --- a/src/common/indexer/indexer.interface.ts +++ b/src/common/indexer/indexer.interface.ts @@ -197,4 +197,6 @@ export interface IndexerInterface { getEvent(txHash: string): Promise getEventsCount(filter: EventsFilter): Promise + + getAccountNftReceivedTimestamps(address: string, identifiers: string[]): Promise> } diff --git a/src/common/indexer/indexer.service.ts b/src/common/indexer/indexer.service.ts index 715670321..ac168ed75 100644 --- a/src/common/indexer/indexer.service.ts +++ b/src/common/indexer/indexer.service.ts @@ -474,4 +474,9 @@ export class IndexerService implements IndexerInterface { async getEventsCount(filter: EventsFilter): Promise { return await this.indexerInterface.getEventsCount(filter); } + + @LogPerformanceAsync(MetricsEvents.SetIndexerDuration) + async getAccountNftReceivedTimestamps(address: string, identifiers: string[]): Promise> { + return await this.indexerInterface.getAccountNftReceivedTimestamps(address, identifiers); + } } diff --git a/src/common/locked-asset/locked-asset.service.ts b/src/common/locked-asset/locked-asset.service.ts index baec56c52..f20a36169 100644 --- a/src/common/locked-asset/locked-asset.service.ts +++ b/src/common/locked-asset/locked-asset.service.ts @@ -1,5 +1,4 @@ import { Injectable } from '@nestjs/common'; -import { LockedAssetAttributes, UnlockMilestone, LockedTokenAttributes } from '@elrondnetwork/erdjs-dex'; import { ApiConfigService } from '../api-config/api.config.service'; import { VmQueryService } from '../../endpoints/vm.query/vm.query.service'; import { CacheInfo } from '../../utils/cache.info'; @@ -10,6 +9,7 @@ import { GatewayService } from '../gateway/gateway.service'; import { MexSettingsService } from 'src/endpoints/mex/mex.settings.service'; import { LockedTokensInterface } from './entities/locked.tokens.interface'; import { UnlockMileStoneModel } from './entities/unlock.milestone.model'; +import { LockedAssetAttributes, UnlockMilestone, LockedTokenAttributes } from '@multiversx/sdk-exchange'; @Injectable() export class LockedAssetService { diff --git a/src/common/persistence/persistence.service.ts b/src/common/persistence/persistence.service.ts index dcae306ef..99795eaf0 100644 --- a/src/common/persistence/persistence.service.ts +++ b/src/common/persistence/persistence.service.ts @@ -31,6 +31,7 @@ export class PersistenceService implements PersistenceInterface { private readonly settingsRepository: Repository, ) { } + @PassthroughAsync(isPassThrough, null) @LogPerformanceAsync(MetricsEvents.SetPersistenceDuration, 'getMetadata') @ErrorLoggerAsync({ logArgs: true }) diff --git a/src/common/rabbitmq/rabbitmq.nft.handler.service.ts b/src/common/rabbitmq/rabbitmq.nft.handler.service.ts index a5f8ba8e9..970204bfa 100644 --- a/src/common/rabbitmq/rabbitmq.nft.handler.service.ts +++ b/src/common/rabbitmq/rabbitmq.nft.handler.service.ts @@ -28,7 +28,7 @@ export class RabbitMqNftHandlerService { return null; } - await this.cachingService.setLocal( + this.cachingService.setLocal( CacheInfo.CollectionType(collectionIdentifier).key, type, CacheInfo.CollectionType(collectionIdentifier).ttl diff --git a/src/common/websockets/web-socket-publisher-controller.ts b/src/common/websockets/web-socket-publisher-controller.ts index 17a9addc0..5eba56647 100644 --- a/src/common/websockets/web-socket-publisher-controller.ts +++ b/src/common/websockets/web-socket-publisher-controller.ts @@ -1,5 +1,5 @@ import { OriginLogger } from "@multiversx/sdk-nestjs-common"; -import { ShardTransaction } from "@elrondnetwork/transaction-processor"; +import { ShardTransaction } from "@multiversx/sdk-transaction-processor"; import { Controller } from "@nestjs/common"; import { EventPattern } from "@nestjs/microservices"; import { WebSocketPublisherService } from "src/common/websockets/web-socket-publisher-service"; diff --git a/src/common/websockets/web-socket-publisher-service.ts b/src/common/websockets/web-socket-publisher-service.ts index 7a3cf824b..4ded7caff 100644 --- a/src/common/websockets/web-socket-publisher-service.ts +++ b/src/common/websockets/web-socket-publisher-service.ts @@ -1,5 +1,5 @@ import { AddressUtils } from "@multiversx/sdk-nestjs-common"; -import { ShardTransaction } from "@elrondnetwork/transaction-processor"; +import { ShardTransaction } from "@multiversx/sdk-transaction-processor"; import { Injectable } from "@nestjs/common"; import { WebSocketGateway, WebSocketServer } from "@nestjs/websockets"; import { Server, Socket } from 'socket.io'; diff --git a/src/crons/cache.warmer/cache.warmer.service.ts b/src/crons/cache.warmer/cache.warmer.service.ts index 0649e7c81..5a5f7c44e 100644 --- a/src/crons/cache.warmer/cache.warmer.service.ts +++ b/src/crons/cache.warmer/cache.warmer.service.ts @@ -407,10 +407,10 @@ export class CacheWarmerService { private async invalidateKey(key: string, data: any, ttl: number) { await this.cachingService.set(key, data, ttl); - await this.refreshCacheKey(key, ttl); + this.refreshCacheKey(key, ttl); } - private async refreshCacheKey(key: string, ttl: number) { - await this.clientProxy.emit('refreshCacheKey', { key, ttl }); + private refreshCacheKey(key: string, ttl: number) { + this.clientProxy.emit('refreshCacheKey', { key, ttl }); } } diff --git a/src/crons/transaction.processor/batch.transaction.processor.service.ts b/src/crons/transaction.processor/batch.transaction.processor.service.ts index bce75620f..69da7a2bf 100644 --- a/src/crons/transaction.processor/batch.transaction.processor.service.ts +++ b/src/crons/transaction.processor/batch.transaction.processor.service.ts @@ -1,5 +1,5 @@ import { CacheService } from "@multiversx/sdk-nestjs-cache"; -import { ShardTransaction, TransactionProcessor } from "@elrondnetwork/transaction-processor"; +import { ShardTransaction, TransactionProcessor } from "@multiversx/sdk-transaction-processor"; import { Inject, Injectable, Logger } from "@nestjs/common"; import { ClientProxy } from "@nestjs/microservices"; import { Cron } from "@nestjs/schedule"; diff --git a/src/crons/transaction.processor/extractor/nft.create.transaction.extractor.ts b/src/crons/transaction.processor/extractor/nft.create.transaction.extractor.ts index 7c6956130..eed35d42d 100644 --- a/src/crons/transaction.processor/extractor/nft.create.transaction.extractor.ts +++ b/src/crons/transaction.processor/extractor/nft.create.transaction.extractor.ts @@ -1,5 +1,5 @@ import { AddressUtils, BinaryUtils, OriginLogger } from "@multiversx/sdk-nestjs-common"; -import { ShardTransaction } from "@elrondnetwork/transaction-processor"; +import { ShardTransaction } from "@multiversx/sdk-transaction-processor"; import { Logger } from "@nestjs/common"; import { TransactionDetailed } from "src/endpoints/transactions/entities/transaction.detailed"; import { TransactionExtractorInterface } from "./transaction.extractor.interface"; diff --git a/src/crons/transaction.processor/extractor/nft.update.attributes.transaction.extractor.ts b/src/crons/transaction.processor/extractor/nft.update.attributes.transaction.extractor.ts index 5db86c532..481ae0209 100644 --- a/src/crons/transaction.processor/extractor/nft.update.attributes.transaction.extractor.ts +++ b/src/crons/transaction.processor/extractor/nft.update.attributes.transaction.extractor.ts @@ -1,5 +1,5 @@ import { BinaryUtils } from "@multiversx/sdk-nestjs-common"; -import { ShardTransaction } from "@elrondnetwork/transaction-processor"; +import { ShardTransaction } from "@multiversx/sdk-transaction-processor"; import { Logger } from "@nestjs/common"; import { TransactionExtractorInterface } from "./transaction.extractor.interface"; diff --git a/src/crons/transaction.processor/extractor/sft.change.transaction.extractor.ts b/src/crons/transaction.processor/extractor/sft.change.transaction.extractor.ts index 61cef81f4..2a69111e1 100644 --- a/src/crons/transaction.processor/extractor/sft.change.transaction.extractor.ts +++ b/src/crons/transaction.processor/extractor/sft.change.transaction.extractor.ts @@ -1,5 +1,5 @@ import { BinaryUtils } from "@multiversx/sdk-nestjs-common"; -import { ShardTransaction } from "@elrondnetwork/transaction-processor"; +import { ShardTransaction } from "@multiversx/sdk-transaction-processor"; import { Logger } from "@nestjs/common"; import { TransactionExtractorInterface } from "./transaction.extractor.interface"; diff --git a/src/crons/transaction.processor/extractor/transaction.extractor.interface.ts b/src/crons/transaction.processor/extractor/transaction.extractor.interface.ts index e3ccc6cf4..4d468134f 100644 --- a/src/crons/transaction.processor/extractor/transaction.extractor.interface.ts +++ b/src/crons/transaction.processor/extractor/transaction.extractor.interface.ts @@ -1,4 +1,4 @@ -import { ShardTransaction } from "@elrondnetwork/transaction-processor"; +import { ShardTransaction } from "@multiversx/sdk-transaction-processor"; import { TransactionDetailed } from "src/endpoints/transactions/entities/transaction.detailed"; export interface TransactionExtractorInterface { diff --git a/src/crons/transaction.processor/extractor/transfer.ownership.extractor.ts b/src/crons/transaction.processor/extractor/transfer.ownership.extractor.ts index e5d368e0c..340c68e37 100644 --- a/src/crons/transaction.processor/extractor/transfer.ownership.extractor.ts +++ b/src/crons/transaction.processor/extractor/transfer.ownership.extractor.ts @@ -1,5 +1,5 @@ import { BinaryUtils } from "@multiversx/sdk-nestjs-common"; -import { ShardTransaction } from "@elrondnetwork/transaction-processor"; +import { ShardTransaction } from "@multiversx/sdk-transaction-processor"; import { Logger } from "@nestjs/common"; import { TransactionExtractorInterface } from "./transaction.extractor.interface"; diff --git a/src/crons/transaction.processor/transaction.completed.service.ts b/src/crons/transaction.processor/transaction.completed.service.ts index 2aadb00b4..635c23ced 100644 --- a/src/crons/transaction.processor/transaction.completed.service.ts +++ b/src/crons/transaction.processor/transaction.completed.service.ts @@ -1,5 +1,4 @@ import { CacheService } from "@multiversx/sdk-nestjs-cache"; -import { LogTopic, TransactionProcessor } from "@elrondnetwork/transaction-processor"; import { Inject, Injectable, Logger } from "@nestjs/common"; import { ClientProxy } from "@nestjs/microservices"; import { Cron } from "@nestjs/schedule"; @@ -8,6 +7,8 @@ import { CacheInfo } from "src/utils/cache.info"; import { LogMetricsEvent } from "src/common/entities/log.metrics.event"; import { EventEmitter2 } from "@nestjs/event-emitter"; import { MetricsEvents } from "src/utils/metrics-events.constants"; +import { TransactionProcessor } from "@multiversx/sdk-transaction-processor"; +import { LogTopic } from "@multiversx/sdk-transaction-processor/lib/types/log-topic"; @Injectable() export class TransactionCompletedService { diff --git a/src/crons/transaction.processor/transaction.processor.module.ts b/src/crons/transaction.processor/transaction.processor.module.ts index 703d3e749..7415e1c52 100644 --- a/src/crons/transaction.processor/transaction.processor.module.ts +++ b/src/crons/transaction.processor/transaction.processor.module.ts @@ -7,6 +7,10 @@ import { TransactionModule } from 'src/endpoints/transactions/transaction.module import { NftWorkerModule } from 'src/queue.worker/nft.worker/nft.worker.module'; import { DynamicModuleUtils } from 'src/utils/dynamic.module.utils'; import { TransactionProcessorService } from './transaction.processor.service'; +import { PersistenceModule } from 'src/common/persistence/persistence.module'; +import { AccountModule } from 'src/endpoints/accounts/account.module'; +import { MongoDbModule } from 'src/common/indexer/db/src'; +import { TokenModule } from 'src/endpoints/tokens/token.module'; @Module({ imports: [ @@ -16,6 +20,11 @@ import { TransactionProcessorService } from './transaction.processor.service'; NodeModule, NftModule, NftWorkerModule, + PersistenceModule, + MongoDbModule, + AccountModule, + TokenModule, + NftModule, ], providers: [ DynamicModuleUtils.getPubSubService(), diff --git a/src/crons/transaction.processor/transaction.processor.service.ts b/src/crons/transaction.processor/transaction.processor.service.ts index 4b05c5f4d..50531650f 100644 --- a/src/crons/transaction.processor/transaction.processor.service.ts +++ b/src/crons/transaction.processor/transaction.processor.service.ts @@ -3,7 +3,6 @@ import { ClientProxy } from "@nestjs/microservices"; import { Cron } from "@nestjs/schedule"; import { ApiConfigService } from "src/common/api-config/api.config.service"; import { NodeService } from "src/endpoints/nodes/node.service"; -import { ShardTransaction, TransactionProcessor } from "@elrondnetwork/transaction-processor"; import { CacheInfo } from "src/utils/cache.info"; import { EventEmitter2 } from '@nestjs/event-emitter'; import { SftChangeTransactionExtractor } from "./extractor/sft.change.transaction.extractor"; @@ -15,21 +14,165 @@ import { CacheService } from "@multiversx/sdk-nestjs-cache"; import { BinaryUtils, OriginLogger } from "@multiversx/sdk-nestjs-common"; import { PerformanceProfiler } from "@multiversx/sdk-nestjs-monitoring"; import { StakeFunction } from "src/endpoints/transactions/transaction-action/recognizers/staking/entities/stake.function"; - +import { ShardTransaction, TransactionProcessor } from "@multiversx/sdk-transaction-processor"; @Injectable() export class TransactionProcessorService { + // private readonly systemAddresses = [ + // "erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqllls0lczs7", + // "erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqplllst77y4l", + // "erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u", + // "erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqrlllsrujgla", + // "erd1qqqqqqqqqqqqqqqpqqqqqqqqqrlllllllllllllllllllllllllsn60f0k", + // "erd1qqqqqqqqqqqqqqqpqqqqqqqqlllllllllllllllllllllllllllsr9gav8", + // "erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqylllslmq6y6", + // "erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq0llllsqkarq6", + // "erd1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq6gq4hu", + // "erd17rc0pu8s7rc0pu8s7rc0pu8s7rc0pu8s7rc0pu8s7rc0pu8s7rcqqkhty3", + // "erd1lllllllllllllllllllllllllllllllllllllllllllllllllllsckry7t", + // "erd1llllllllllllllllllllllllllllllllllllllllllllllllluqq2m3f0f", + // "erd1llllllllllllllllllllllllllllllllllllllllllllllllluqsl6e366", + // "erd1lllllllllllllllllllllllllllllllllllllllllllllllllupq9x7ny0" + // ]; private readonly logger = new OriginLogger(TransactionProcessorService.name); private transactionProcessor: TransactionProcessor = new TransactionProcessor(); constructor( private readonly cachingService: CacheService, private readonly apiConfigService: ApiConfigService, + //@ts-ignore @Inject('PUBSUB_SERVICE') private clientProxy: ClientProxy, private readonly nodeService: NodeService, private readonly eventEmitter: EventEmitter2, + // private readonly accountDetailsRepository: AccountDetailsRepository, + // private readonly accountService: AccountService, + // private readonly tokenService: TokenService, + // private readonly nftService: NftService, ) { } + // @Cron('*/1 * * * * *') + // async handleTx() { + // await this.transactionProcessor.start({ + // gatewayUrl: this.apiConfigService.getGatewayUrl(), + // maxLookBehind: this.apiConfigService.getTransactionProcessorMaxLookBehind(), + // onTransactionsReceived: async (shard, nonce, transactions) => { + // const profiler = new PerformanceProfiler('Processing new transactions'); + + // const uniqueAddresses = new Set(); + // this.logger.log(`New transactions: ${transactions.length} for shard ${shard} and nonce ${nonce}`); + // const filteredTransactions = transactions.filter(transaction => transaction.status === 'success'); + // // Group transactions by address to determine which fields need updating + // const addressUpdates = new Map>(); + + // for (const transaction of filteredTransactions) { + // // Only add addresses that are not system addresses + // if (!this.systemAddresses.includes(transaction.sender)) { + // uniqueAddresses.add(transaction.sender); + // } + // if (!this.systemAddresses.includes(transaction.receiver)) { + // uniqueAddresses.add(transaction.receiver); + // } + + // // Get fields to update for sender and receiver separately + // const senderFields = this.getFieldsToUpdate(transaction); + // const receiverFields = this.getFieldsToUpdate(transaction); + + // // Add fields to update for sender + // if (!addressUpdates.has(transaction.sender)) { + // addressUpdates.set(transaction.sender, new Set()); + // } + // senderFields.forEach(field => addressUpdates.get(transaction.sender)?.add(field)); + + // // Add fields to update for receiver + // if (!addressUpdates.has(transaction.receiver)) { + // addressUpdates.set(transaction.receiver, new Set()); + // } + // receiverFields.forEach(field => addressUpdates.get(transaction.receiver)?.add(field)); + // } + + // for (const address of uniqueAddresses) { + // const documentExists = await this.accountDetailsRepository.getAccount(address) + // const fieldsToUpdate = documentExists ? (addressUpdates.get(address) ?? new Set()) + // : new Set(['guardianInfo', 'txCount', 'scrCount', 'timestamp', 'assets']); + + // // Only fetch account if we need to update fields + // if (fieldsToUpdate.size > 0) { + // const accountFetchOptions = { + // withGuardianInfo: fieldsToUpdate.has('guardianInfo'), + // withTxCount: fieldsToUpdate.has('txCount'), + // withScrCount: fieldsToUpdate.has('scrCount'), + // withTimestamp: fieldsToUpdate.has('timestamp'), + // withAssets: fieldsToUpdate.has('assets') + // } + // // console.log('accountFetchOptions ', accountFetchOptions); + // const accountDetails = await this.accountService.getAccount(address, accountFetchOptions) as AccountDetails; + // if (fieldsToUpdate.has('tokens') || !documentExists) { + // accountDetails.tokens = await this.tokenService.getTokensForAddress(address, new QueryPagination({ from: 0, size: 100 }), new TokenFilter()); + // } + + // if (fieldsToUpdate.has('nfts') || !documentExists) { + // accountDetails.nfts = await this.nftService.getNftsForAddress(address, new QueryPagination({ from: 0, size: 100 }), new NftFilter()); + // } + // // console.log('accountDetailed ', accountDetailed); + // if (accountDetails) { + // await this.accountDetailsRepository.updateAccount(accountDetails); + // } + // } + // } + // profiler.stop(); + // }, + // getLastProcessedNonce: async (shardId) => { + // return await this.cachingService.get(CacheInfo.TransactionProcessorShardNonce(shardId).key); + // }, + // setLastProcessedNonce: async (shardId, nonce) => { + // const event = new LogMetricsEvent(); + // event.args = [shardId, nonce]; + // this.eventEmitter.emit( + // MetricsEvents.SetLastProcessedNonce, + // event + // ); + + // await this.cachingService.set(CacheInfo.TransactionProcessorShardNonce(shardId).key, nonce, CacheInfo.TransactionProcessorShardNonce(shardId).ttl); + // }, + // }); + // } + + // private getFieldsToUpdate(transaction: ShardTransaction): Set { + // const fields = new Set(); + + // // Always update timestamp as it's transaction-related + // fields.add('timestamp'); + + // // Balance changes + // if (transaction.value !== '0') { + // fields.add('balance'); + // } + + // // Transaction count changes + // fields.add('txCount'); + + // // Smart contract interactions - only for smart contract addresses + // if (AddressUtils.isSmartContractAddress(transaction.receiver)) { + // fields.add('scrCount'); + // } + + // // Guardian changes - only for non-smart contract addresses + // if (transaction.getDataFunctionName() === 'GuardAccount' || transaction.getDataFunctionName() === 'UnGuardAccount') { + // fields.add('guardianInfo'); + // } + + // // Asset changes - check for transfer/mint/burn in a case-insensitive way + // const functionName = transaction.getDataFunctionName()?.toLowerCase() ?? ''; + // if (functionName.includes('transfer') || + // functionName.includes('mint') || + // functionName.includes('burn')) { + // fields.add('tokens'); + // fields.add('nfts'); + // } + + // return fields; + // } + @Cron('*/1 * * * * *') async handleNewTransactions() { await this.transactionProcessor.start({ @@ -83,6 +226,7 @@ export class TransactionProcessorService { }); } + //@ts-ignore private async tryInvalidateTokenProperties(transaction: ShardTransaction): Promise { if (transaction.receiver !== this.apiConfigService.getEsdtContractAddress()) { return []; diff --git a/src/endpoints/accounts-v2/account.controller.v2.ts b/src/endpoints/accounts-v2/account.controller.v2.ts new file mode 100644 index 000000000..d3593bf73 --- /dev/null +++ b/src/endpoints/accounts-v2/account.controller.v2.ts @@ -0,0 +1,1420 @@ +import { Controller, DefaultValuePipe, Get, HttpException, HttpStatus, NotFoundException, Param, Query, UseInterceptors } from '@nestjs/common'; +import { ApiExcludeEndpoint, ApiOkResponse, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger'; +import { AccountServiceV2 } from './account.service.v2'; +import { AccountDetailed } from './entities/account.detailed'; +import { Account } from './entities/account'; +import { AccountDeferred } from './entities/account.deferred'; +import { TokenService } from '../tokens/token.service'; +import { TokenWithBalance } from '../tokens/entities/token.with.balance'; +import { DelegationLegacyService } from '../delegation.legacy/delegation.legacy.service'; +import { AccountDelegationLegacy } from '../delegation.legacy/entities/account.delegation.legacy'; +import { AccountKey } from './entities/account.key'; +import { NftAccount } from '../nfts/entities/nft.account'; +import { NftType } from '../nfts/entities/nft.type'; +import { WaitingList } from '../waiting-list/entities/waiting.list'; +import { WaitingListService } from '../waiting-list/waiting.list.service'; +import { StakeService } from '../stake/stake.service'; +import { NftService } from '../nfts/nft.service'; +import { TransactionStatus } from '../transactions/entities/transaction.status'; +import { TransactionService } from '../transactions/transaction.service'; +import { DeployedContract } from './entities/deployed.contract'; +import { SmartContractResult } from '../sc-results/entities/smart.contract.result'; +import { SmartContractResultService } from '../sc-results/scresult.service'; +import { CollectionService } from '../collections/collection.service'; +import { NftCollectionWithRoles } from '../collections/entities/nft.collection.with.roles'; +import { SortOrder } from 'src/common/entities/sort.order'; +import { AccountHistory } from "./entities/account.history"; +import { AccountEsdtHistory } from "./entities/account.esdt.history"; +import { EsdtDataSource } from '../esdt/entities/esdt.data.source'; +import { TransferService } from '../transfers/transfer.service'; +import { Transaction } from '../transactions/entities/transaction'; +import { ProviderStake } from '../stake/entities/provider.stake'; +import { TokenDetailedWithBalance } from '../tokens/entities/token.detailed.with.balance'; +import { NftCollectionAccount } from '../collections/entities/nft.collection.account'; +import { TokenWithRoles } from '../tokens/entities/token.with.roles'; +import { ParseAddressPipe, ParseTokenPipe, OriginLogger, ParseArrayPipe, ParseBlockHashPipe, ParseCollectionPipe, ParseNftPipe, ParseBoolPipe, ParseEnumArrayPipe, ParseEnumPipe, ParseIntPipe, ParseTokenOrNftPipe, ParseTransactionHashPipe, ParseAddressArrayPipe, ApplyComplexity, ParseNftArrayPipe } from '@multiversx/sdk-nestjs-common'; +import { QueryPagination } from 'src/common/entities/query.pagination'; +import { TransactionQueryOptions } from '../transactions/entities/transactions.query.options'; +import { TokenWithRolesFilter } from '../tokens/entities/token.with.roles.filter'; +import { CollectionFilter } from '../collections/entities/collection.filter'; +import { TokenFilter } from '../tokens/entities/token.filter'; +import { NftFilter } from '../nfts/entities/nft.filter'; +import { NftQueryOptions } from '../nfts/entities/nft.query.options'; +import { TransactionFilter } from '../transactions/entities/transaction.filter'; +import { TransactionDetailed } from '../transactions/entities/transaction.detailed'; +import { AccountDelegation } from '../stake/entities/account.delegation'; +import { DelegationService } from '../delegation/delegation.service'; +import { TokenType } from '../tokens/entities/token.type'; +import { ContractUpgrades } from './entities/contract.upgrades'; +import { AccountVerification } from './entities/account.verification'; +import { AccountQueryOptions } from './entities/account.query.options'; +import { AccountSort } from './entities/account.sort'; +import { AccountHistoryFilter } from './entities/account.history.filter'; +import { ParseArrayPipeOptions } from '@multiversx/sdk-nestjs-common/lib/pipes/entities/parse.array.options'; +import { NodeStatusRaw } from '../nodes/entities/node.status'; +import { AccountKeyFilter } from './entities/account.key.filter'; +import { ScamType } from 'src/common/entities/scam-type.enum'; +import { DeepHistoryInterceptor } from 'src/interceptors/deep-history.interceptor'; +import { MexPairType } from '../mex/entities/mex.pair.type'; +import { NftSubType } from '../nfts/entities/nft.sub.type'; +import { AccountContract } from './entities/account.contract'; +import { AccountFetchOptions } from './entities/account.fetch.options'; +@Controller('/v2') +@ApiTags('accounts') +export class AccountControllerV2 { + private readonly logger = new OriginLogger(AccountControllerV2.name); + + constructor( + private readonly accountService: AccountServiceV2, + private readonly tokenService: TokenService, + private readonly nftService: NftService, + private readonly delegationLegacyService: DelegationLegacyService, + private readonly waitingListService: WaitingListService, + private readonly stakeService: StakeService, + private readonly transactionService: TransactionService, + private readonly scResultService: SmartContractResultService, + private readonly collectionService: CollectionService, + private readonly transferService: TransferService, + private readonly delegationService: DelegationService, + ) { } + + @Get("/accounts") + @ApiOperation({ summary: 'Accounts details', description: 'Returns all accounts available on blockchain. By default it returns 25 accounts' }) + @ApiOkResponse({ type: [Account] }) + @ApiQuery({ name: 'from', description: 'Number of items to skip for the result set', required: false }) + @ApiQuery({ name: 'size', description: 'Number of items to retrieve', required: false }) + @ApiQuery({ name: 'ownerAddress', description: 'Search by owner address', required: false }) + @ApiQuery({ name: 'sort', description: 'Sort criteria (balance / timestamp)', required: false, enum: AccountSort }) + @ApiQuery({ name: 'order', description: 'Sort order (asc/desc)', required: false, enum: SortOrder }) + @ApiQuery({ name: 'isSmartContract', description: 'Filter accounts by whether they are smart contract or not', required: false }) + @ApiQuery({ name: 'withOwnerAssets', description: 'Return a list accounts with owner assets', required: false }) + @ApiQuery({ name: 'withDeployInfo', description: 'Include deployedAt and deployTxHash fields in the result', required: false }) + @ApiQuery({ name: 'withTxCount', description: 'Include txCount field in the result', required: false }) + @ApiQuery({ name: 'withScrCount', description: 'Include scrCount field in the result', required: false }) + @ApiQuery({ name: 'name', description: 'Filter accounts by assets name', required: false }) + @ApiQuery({ name: 'tags', description: 'Filter accounts by assets tags', required: false }) + @ApiQuery({ name: 'excludeTags', description: 'Exclude specific tags from result', required: false }) + @ApiQuery({ name: 'hasAssets', description: 'Returns a list of accounts that have assets', required: false }) + @ApiQuery({ name: 'search', description: 'Search by account address', required: false }) + @ApiQuery({ name: 'addresses', description: 'A comma-separated list of addresses to filter by', required: false, type: String }) + getAccounts( + @Query('from', new DefaultValuePipe(0), ParseIntPipe) from: number, + @Query("size", new DefaultValuePipe(25), ParseIntPipe) size: number, + @Query("ownerAddress", ParseAddressPipe) ownerAddress?: string, + @Query("name") name?: string, + @Query("tags", ParseArrayPipe) tags?: string[], + @Query('sort', new ParseEnumPipe(AccountSort)) sort?: AccountSort, + @Query('order', new ParseEnumPipe(SortOrder)) order?: SortOrder, + @Query("isSmartContract", ParseBoolPipe) isSmartContract?: boolean, + @Query("withOwnerAssets", ParseBoolPipe) withOwnerAssets?: boolean, + @Query("withDeployInfo", ParseBoolPipe) withDeployInfo?: boolean, + @Query("withTxCount", ParseBoolPipe) withTxCount?: boolean, + @Query("withScrCount", ParseBoolPipe) withScrCount?: boolean, + @Query("excludeTags", ParseArrayPipe) excludeTags?: string[], + @Query("hasAssets", ParseBoolPipe) hasAssets?: boolean, + @Query("search") search?: string, + @Query("addresses", ParseAddressArrayPipe) addresses?: string[], + ): Promise { + const queryOptions = new AccountQueryOptions( + { + ownerAddress, + addresses, + sort, + order, + isSmartContract, + withOwnerAssets, + withDeployInfo, + withTxCount, + withScrCount, + name, + tags, + excludeTags, + hasAssets, + search, + }); + queryOptions.validate(size); + return this.accountService.getAccounts( + new QueryPagination({ from, size }), + queryOptions, + ); + } + + @Get("/accounts/count") + @ApiOperation({ summary: 'Total number of accounts', description: 'Returns total number of accounts available on blockchain' }) + @ApiOkResponse({ type: Number }) + @ApiQuery({ name: 'ownerAddress', description: 'Search by owner address', required: false }) + @ApiQuery({ name: 'isSmartContract', description: 'Return total smart contracts count', required: false }) + @ApiQuery({ name: 'name', description: 'Filter accounts by assets name', required: false }) + @ApiQuery({ name: 'tags', description: 'Filter accounts by assets tags', required: false }) + @ApiQuery({ name: 'search', description: 'Search by account address, assets name', required: false }) + @ApiQuery({ name: 'excludeTags', description: 'Exclude specific tags from result', required: false }) + @ApiQuery({ name: 'hasAssets', description: 'Returns a list of accounts that have assets', required: false }) + async getAccountsCount( + @Query("ownerAddress", ParseAddressPipe) ownerAddress?: string, + @Query("isSmartContract", ParseBoolPipe) isSmartContract?: boolean, + @Query("name") name?: string, + @Query("tags", ParseArrayPipe) tags?: string[], + @Query("excludeTags", ParseArrayPipe) excludeTags?: string[], + @Query("hasAssets", ParseBoolPipe) hasAssets?: boolean, + @Query("search") search?: string, + ): Promise { + return await this.accountService.getAccountsCount( + new AccountQueryOptions( + { + ownerAddress, + isSmartContract, + name, + tags, + excludeTags, + hasAssets, + search, + })); + } + + @Get("/accounts/c") + @ApiExcludeEndpoint() + async getAccountsCountAlternative( + @Query("ownerAddress", ParseAddressPipe) ownerAddress?: string, + @Query("isSmartContract", ParseBoolPipe) isSmartContract?: boolean, + @Query("name") name?: string, + @Query("tags", ParseArrayPipe) tags?: string[], + @Query("excludeTags", ParseArrayPipe) excludeTags?: string[], + @Query("hasAssets", ParseBoolPipe) hasAssets?: boolean, + @Query("search") search?: string, + ): Promise { + return await this.accountService.getAccountsCount( + new AccountQueryOptions( + { + ownerAddress, + isSmartContract, + name, + tags, + excludeTags, + hasAssets, + search, + })); + } + + @Get("/accounts/:address") + @UseInterceptors(DeepHistoryInterceptor) + @ApiOperation({ summary: 'Account details', description: 'Returns account details for a given address' }) + @ApiQuery({ name: 'withGuardianInfo', description: 'Returns guardian data for a given address', required: false }) + @ApiQuery({ name: 'withTxCount', description: 'Returns the count of the transactions for a given address', required: false }) + @ApiQuery({ name: 'withScrCount', description: 'Returns the sc results count for a given address', required: false }) + @ApiQuery({ name: 'withTimestamp', description: 'Returns the timestamp of the last activity for a given address', required: false }) + @ApiQuery({ name: 'withAssets', description: 'Returns the assets for a given address', required: false }) + @ApiQuery({ name: 'timestamp', description: 'Retrieve entry from timestamp', required: false, type: Number }) + @ApiOkResponse({ type: AccountDetailed }) + // @NoCache() + async getAccountDetails( + @Param('address', ParseAddressPipe) address: string, + @Query('withGuardianInfo', ParseBoolPipe) withGuardianInfo?: boolean, + @Query('withTxCount', ParseBoolPipe) withTxCount?: boolean, + @Query('withScrCount', ParseBoolPipe) withScrCount?: boolean, + @Query('withTimestamp', ParseBoolPipe) withTimestamp?: boolean, + @Query('withAssets', ParseBoolPipe) withAssets?: boolean, + @Query('timestamp', ParseIntPipe) _timestamp?: number, + ): Promise { + const account = await this.accountService.getAccountFromDb( + address, + new AccountFetchOptions({ withGuardianInfo, withTxCount, withScrCount, withTimestamp, withAssets }), + ); + if (!account) { + throw new NotFoundException('Account not found'); + } + + return account; + } + + @Get("/accounts/:address/deferred") + @ApiOperation({ summary: 'Account deferred payment details', description: 'Returns deferred payments from legacy staking' }) + @ApiOkResponse({ type: [AccountDeferred] }) + async getAccountDeferred(@Param('address', ParseAddressPipe) address: string): Promise { + try { + return await this.accountService.getDeferredAccount(address); + } catch (error) { + this.logger.error(`Error in getAccountDeferred for address ${address}`); + this.logger.error(error); + throw new HttpException('Account not found', HttpStatus.NOT_FOUND); + } + } + + @Get("/accounts/:address/verification") + @ApiOperation({ summary: 'Account verification details', description: 'Returns contract verification details' }) + @ApiOkResponse({ type: AccountVerification }) + async getAccountVerification(@Param('address', ParseAddressPipe) address: string): Promise { + try { + return await this.accountService.getAccountVerification(address); + } catch (error) { + this.logger.error(`Error in getAccountVerification for address ${address}`); + this.logger.error(error); + throw new HttpException('Account verification not found', HttpStatus.NOT_FOUND); + } + } + + @Get("/accounts/:address/tokens") + @UseInterceptors(DeepHistoryInterceptor) + @ApiOperation({ summary: 'Account tokens', description: 'Returns a list of all available fungible tokens for a given address, together with their balance' }) + @ApiQuery({ name: 'from', description: 'Number of items to skip for the result set', required: false }) + @ApiQuery({ name: 'size', description: 'Number of items to retrieve', required: false }) + @ApiQuery({ name: 'type', description: 'Token type', required: false, enum: TokenType }) + @ApiQuery({ name: 'subType', description: 'Token sub type', required: false, enum: NftSubType }) + @ApiQuery({ name: 'search', description: 'Search by collection identifier', required: false }) + @ApiQuery({ name: 'name', description: 'Search by token name', required: false }) + @ApiQuery({ name: 'identifier', description: 'Search by token identifier', required: false }) + @ApiQuery({ name: 'identifiers', description: 'A comma-separated list of identifiers to filter by', required: false, type: String }) + @ApiQuery({ name: 'includeMetaESDT', description: 'Include MetaESDTs in response', required: false, type: Boolean }) + @ApiQuery({ name: 'timestamp', description: 'Retrieve entries from timestamp', required: false, type: Number }) + @ApiQuery({ name: 'mexPairType', description: 'Token Mex Pair', required: false, enum: MexPairType }) + @ApiOkResponse({ type: [TokenWithBalance] }) + // @NoCache() + async getAccountTokens( + @Param('address', ParseAddressPipe) address: string, + @Query('from', new DefaultValuePipe(0), ParseIntPipe) from: number, + @Query('size', new DefaultValuePipe(25), ParseIntPipe) size: number, + @Query('type', new ParseEnumPipe(TokenType)) type?: TokenType, + @Query('subType', new ParseEnumPipe(NftSubType)) subType?: NftSubType, + @Query('search') search?: string, + @Query('name') name?: string, + @Query('identifier') identifier?: string, + @Query('identifiers', ParseArrayPipe) identifiers?: string[], + @Query('includeMetaESDT', ParseBoolPipe) includeMetaESDT?: boolean, + @Query('timestamp', ParseIntPipe) _timestamp?: number, + @Query('mexPairType', new ParseEnumArrayPipe(MexPairType)) mexPairType?: MexPairType[], + ): Promise { + try { + return await this.tokenService.getTokensForAddressFromDb(address, new QueryPagination({ from, size }), new TokenFilter({ type, subType, search, name, identifier, identifiers, includeMetaESDT, mexPairType })); + } catch (error) { + this.logger.error(`Error in getAccountTokens for address ${address}`); + this.logger.error(error); + // throw new HttpException('Account not found', HttpStatus.NOT_FOUND); + return []; + } + } + + @Get("/accounts/:address/tokens/count") + @UseInterceptors(DeepHistoryInterceptor) + @ApiOperation({ summary: 'Account token count', description: 'Returns the total number of tokens for a given address' }) + @ApiQuery({ name: 'type', description: 'Token type', required: false, enum: TokenType }) + @ApiQuery({ name: 'search', description: 'Search by collection identifier', required: false }) + @ApiQuery({ name: 'name', description: 'Search by token name', required: false }) + @ApiQuery({ name: 'identifier', description: 'Search by token identifier', required: false }) + @ApiQuery({ name: 'identifiers', description: 'A comma-separated list of identifiers to filter by', required: false, type: String }) + @ApiQuery({ name: 'includeMetaESDT', description: 'Include MetaESDTs in response', required: false, type: Boolean }) + @ApiQuery({ name: 'timestamp', description: 'Retrieve entries from timestamp', required: false, type: Number }) + @ApiQuery({ name: 'mexPairType', description: 'Token Mex Pair', required: false, enum: MexPairType }) + @ApiOkResponse({ type: Number }) + async getTokenCount( + @Param('address', ParseAddressPipe) address: string, + @Query('type', new ParseEnumPipe(TokenType)) type?: TokenType, + @Query('search') search?: string, + @Query('name') name?: string, + @Query('identifier') identifier?: string, + @Query('identifiers', ParseArrayPipe) identifiers?: string[], + @Query('includeMetaESDT', ParseBoolPipe) includeMetaESDT?: boolean, + @Query('timestamp', ParseIntPipe) _timestamp?: number, + @Query('mexPairType', new ParseEnumArrayPipe(MexPairType)) mexPairType?: MexPairType[], + ): Promise { + try { + return await this.tokenService.getTokenCountForAddress(address, new TokenFilter({ type, search, name, identifier, identifiers, includeMetaESDT, mexPairType })); + } catch (error) { + this.logger.error(`Error in getTokenCount for address ${address}`); + this.logger.error(error); + // throw new HttpException('Account not found', HttpStatus.NOT_FOUND); + return 0; + } + } + + @Get("/accounts/:address/tokens/c") + @UseInterceptors(DeepHistoryInterceptor) + @ApiExcludeEndpoint() + async getTokenCountAlternative( + @Param('address', ParseAddressPipe) address: string, + @Query('type', new ParseEnumPipe(TokenType)) type?: TokenType, + @Query('search') search?: string, + @Query('name') name?: string, + @Query('identifier') identifier?: string, + @Query('identifiers', ParseArrayPipe) identifiers?: string[], + @Query('includeMetaESDT', ParseBoolPipe) includeMetaESDT?: boolean, + @Query('timestamp', ParseIntPipe) _timestamp?: number, + @Query('mexPairType', new ParseEnumArrayPipe(MexPairType)) mexPairType?: MexPairType[], + ): Promise { + try { + return await this.tokenService.getTokenCountForAddress(address, new TokenFilter({ type, search, name, identifier, identifiers, includeMetaESDT, mexPairType })); + } catch (error) { + this.logger.error(`Error in getTokenCount for address ${address}`); + this.logger.error(error); + // throw new HttpException('Account not found', HttpStatus.NOT_FOUND); + return 0; + } + } + + @Get("/accounts/:address/tokens/:token") + @UseInterceptors(DeepHistoryInterceptor) + @ApiOkResponse({ type: TokenWithBalance }) + @ApiOperation({ summary: 'Account token details', description: 'Returns details about a specific fungible token from a given address' }) + @ApiQuery({ name: 'timestamp', description: 'Retrieve entries from timestamp', required: false, type: Number }) + // @NoCache() + async getAccountToken( + @Param('address', ParseAddressPipe) address: string, + @Param('token', ParseTokenOrNftPipe) token: string, + @Query('timestamp', ParseIntPipe) _timestamp?: number, + ): Promise { + const result = await this.tokenService.getTokenForAddressFromDb(address, token); + if (!result) { + throw new HttpException('Token for given account not found', HttpStatus.NOT_FOUND); + } + + return result; + } + + @Get("/accounts/:address/roles/collections") + @ApiOperation({ summary: 'Account collections', description: 'Returns NFT/SFT/MetaESDT collections where the account is owner or has some special roles assigned to it' }) + @ApiQuery({ name: 'from', description: 'Number of items to skip for the result set', required: false }) + @ApiQuery({ name: 'size', description: 'Number of items to retrieve', required: false }) + @ApiQuery({ name: 'search', description: 'Search by collection identifier', required: false }) + @ApiQuery({ name: 'type', description: 'Filter by type (NonFungibleESDT/SemiFungibleESDT/MetaESDT)', required: false }) + @ApiQuery({ name: 'subType', description: 'Filter by type (NonFungibleESDTv2/DynamicNonFungibleESDT/DynamicSemiFungibleESDT)', required: false }) + @ApiQuery({ name: 'owner', description: 'Filter by collection owner', required: false }) + @ApiQuery({ name: 'canCreate', description: 'Filter by property canCreate (boolean)', required: false }) + @ApiQuery({ name: 'canBurn', description: 'Filter by property canBurn (boolean)', required: false }) + @ApiQuery({ name: 'canAddQuantity', description: 'Filter by property canAddQuantity (boolean)', required: false }) + @ApiQuery({ name: 'canUpdateAttributes', description: 'Filter by property canUpdateAttributes (boolean)', required: false }) + @ApiQuery({ name: 'canAddUri', description: 'Filter by property canAddUri (boolean)', required: false }) + @ApiQuery({ name: 'canTransferRole', description: 'Filter by property canTransferRole (boolean)', required: false }) + @ApiQuery({ name: 'excludeMetaESDT', description: 'Exclude collections of type "MetaESDT" in the response', required: false, type: Boolean }) + @ApiOkResponse({ type: [NftCollectionWithRoles] }) + async getAccountCollectionsWithRoles( + @Param('address', ParseAddressPipe) address: string, + @Query('from', new DefaultValuePipe(0), ParseIntPipe) from: number, + @Query('size', new DefaultValuePipe(25), ParseIntPipe) size: number, + @Query('search') search?: string, + @Query('type', new ParseEnumArrayPipe(NftType)) type?: NftType[], + @Query('subType', new ParseEnumArrayPipe(NftSubType)) subType?: NftSubType[], + @Query('owner', ParseAddressPipe) owner?: string, + @Query('canCreate', ParseBoolPipe) canCreate?: boolean, + @Query('canBurn', ParseBoolPipe) canBurn?: boolean, + @Query('canAddQuantity', ParseBoolPipe) canAddQuantity?: boolean, + @Query('canUpdateAttributes', ParseBoolPipe) canUpdateAttributes?: boolean, + @Query('canAddUri', ParseBoolPipe) canAddUri?: boolean, + @Query('canTransferRole', ParseBoolPipe) canTransferRole?: boolean, + @Query('excludeMetaESDT', ParseBoolPipe) excludeMetaESDT?: boolean, + ): Promise { + return await this.collectionService.getCollectionsWithRolesForAddress( + address, + new CollectionFilter({ + search, + type, + subType, + owner, + canCreate, + canBurn, + canAddQuantity, + canUpdateAttributes, + canAddUri, + canTransferRole, + excludeMetaESDT, + }), new QueryPagination({ from, size })); + } + + @Get("/accounts/:address/roles/collections/count") + @ApiOperation({ summary: 'Account collection count', description: 'Returns the total number of NFT/SFT/MetaESDT collections where the account is owner or has some special roles assigned to it' }) + @ApiQuery({ name: 'search', description: 'Search by collection identifier', required: false }) + @ApiQuery({ name: 'type', description: 'Filter by type (NonFungibleESDT/SemiFungibleESDT/MetaESDT)', required: false }) + @ApiQuery({ name: 'subType', description: 'Filter by type (NonFungibleESDTv2/DynamicNonFungibleESDT/DynamicSemiFungibleESDT)', required: false }) + @ApiQuery({ name: 'owner', description: 'Filter by collection owner', required: false }) + @ApiQuery({ name: 'canCreate', description: 'Filter by property canCreate (boolean)', required: false }) + @ApiQuery({ name: 'canBurn', description: 'Filter by property canCreate (boolean)', required: false }) + @ApiQuery({ name: 'canAddQuantity', description: 'Filter by property canAddQuantity (boolean)', required: false }) + @ApiQuery({ name: 'excludeMetaESDT', description: 'Exclude collections of type "MetaESDT" in the response', required: false, type: Boolean }) + @ApiOkResponse({ type: Number }) + async getCollectionWithRolesCount( + @Param('address', ParseAddressPipe) address: string, + @Query('search') search?: string, + @Query('type', new ParseEnumArrayPipe(NftType)) type?: NftType[], + @Query('subType', new ParseEnumArrayPipe(NftSubType)) subType?: NftSubType[], + @Query('owner', ParseAddressPipe) owner?: string, + @Query('canCreate', ParseBoolPipe) canCreate?: boolean, + @Query('canBurn', ParseBoolPipe) canBurn?: boolean, + @Query('canAddQuantity', ParseBoolPipe) canAddQuantity?: boolean, + @Query('excludeMetaESDT', ParseBoolPipe) excludeMetaESDT?: boolean, + ): Promise { + return await this.collectionService.getCollectionCountForAddressWithRoles(address, new CollectionFilter({ search, type, subType, owner, canCreate, canBurn, canAddQuantity, excludeMetaESDT })); + } + + @Get("/accounts/:address/roles/collections/c") + @ApiExcludeEndpoint() + async getCollectionCountAlternative( + @Param('address', ParseAddressPipe) address: string, + @Query('search') search?: string, + @Query('type', new ParseEnumArrayPipe(NftType)) type?: NftType[], + @Query('subType', new ParseEnumArrayPipe(NftSubType)) subType?: NftSubType[], + @Query('owner', ParseAddressPipe) owner?: string, + @Query('canCreate', ParseBoolPipe) canCreate?: boolean, + @Query('canBurn', ParseBoolPipe) canBurn?: boolean, + @Query('canAddQuantity', ParseBoolPipe) canAddQuantity?: boolean, + @Query('excludeMetaESDT', ParseBoolPipe) excludeMetaESDT?: boolean, + ): Promise { + return await this.collectionService.getCollectionCountForAddressWithRoles(address, new CollectionFilter({ + search, type, subType, owner, canCreate, canBurn, canAddQuantity, excludeMetaESDT, + })); + } + + @Get("/accounts/:address/roles/collections/:collection") + @ApiOperation({ summary: 'Account collection details', description: 'Returns details about a specific NFT/SFT/MetaESDT collection from a given address' }) + @ApiOkResponse({ type: NftCollectionWithRoles }) + async getAccountCollection( + @Param('address', ParseAddressPipe) address: string, + @Param('collection', ParseCollectionPipe) collection: string, + ): Promise { + const result = await this.collectionService.getCollectionForAddressWithRole(address, collection); + if (!result) { + throw new NotFoundException('Collection for given account not found'); + } + + return result; + } + + @Get("/accounts/:address/roles/tokens") + @ApiOperation({ summary: 'Account token roles', description: 'Returns fungible token roles where the account is owner or has some special roles assigned to it' }) + @ApiQuery({ name: 'from', description: 'Number of items to skip for the result set', required: false }) + @ApiQuery({ name: 'size', description: 'Number of items to retrieve', required: false }) + @ApiQuery({ name: 'search', description: 'Search by token identifier or name', required: false }) + @ApiQuery({ name: 'owner', description: 'Filter by token owner', required: false }) + @ApiQuery({ name: 'canMint', description: 'Filter by property canMint (boolean)', required: false }) + @ApiQuery({ name: 'canBurn', description: 'Filter by property canBurn (boolean)', required: false }) + @ApiQuery({ name: 'includeMetaESDT', description: 'Include MetaESDTs in response', required: false, type: Boolean }) + @ApiOkResponse({ type: [TokenWithRoles] }) + async getAccountTokensWithRoles( + @Param('address', ParseAddressPipe) address: string, + @Query('from', new DefaultValuePipe(0), ParseIntPipe) from: number, + @Query('size', new DefaultValuePipe(25), ParseIntPipe) size: number, + @Query('search') search?: string, + @Query('owner', ParseAddressPipe) owner?: string, + @Query('canMint', ParseBoolPipe) canMint?: boolean, + @Query('canBurn', ParseBoolPipe) canBurn?: boolean, + @Query('includeMetaESDT', ParseBoolPipe) includeMetaESDT?: boolean, + ): Promise { + return await this.tokenService.getTokensWithRolesForAddress(address, new TokenWithRolesFilter({ search, owner, canMint, canBurn, includeMetaESDT }), new QueryPagination({ from, size })); + } + + @Get("/accounts/:address/roles/tokens/count") + @ApiOperation({ summary: 'Account token roles count', description: 'Returns the total number of fungible token roles where the account is owner or has some special roles assigned to it' }) + @ApiQuery({ name: 'search', description: 'Search by token identifier or name', required: false }) + @ApiQuery({ name: 'owner', description: 'Filter by token owner', required: false }) + @ApiQuery({ name: 'canMint', description: 'Filter by property canMint (boolean)', required: false }) + @ApiQuery({ name: 'canBurn', description: 'Filter by property canCreate (boolean)', required: false }) + @ApiQuery({ name: 'includeMetaESDT', description: 'Include MetaESDTs in response', required: false, type: Boolean }) + @ApiOkResponse({ type: Number }) + async getTokensWithRolesCount( + @Param('address', ParseAddressPipe) address: string, + @Query('search') search?: string, + @Query('owner', ParseAddressPipe) owner?: string, + @Query('canMint', ParseBoolPipe) canMint?: boolean, + @Query('canBurn', ParseBoolPipe) canBurn?: boolean, + @Query('includeMetaESDT', ParseBoolPipe) includeMetaESDT?: boolean, + ): Promise { + return await this.tokenService.getTokensWithRolesForAddressCount(address, new TokenWithRolesFilter({ search, owner, canMint, canBurn, includeMetaESDT })); + } + + @Get("/accounts/:address/roles/tokens/c") + @ApiExcludeEndpoint() + async getTokensWithRolesCountAlternative( + @Param('address', ParseAddressPipe) address: string, + @Query('search') search?: string, + @Query('owner', ParseAddressPipe) owner?: string, + @Query('canMint', ParseBoolPipe) canMint?: boolean, + @Query('canBurn', ParseBoolPipe) canBurn?: boolean, + @Query('includeMetaESDT', ParseBoolPipe) includeMetaESDT?: boolean, + ): Promise { + return await this.tokenService.getTokensWithRolesForAddressCount(address, new TokenWithRolesFilter({ search, owner, canMint, canBurn, includeMetaESDT })); + } + + @Get("/accounts/:address/roles/tokens/:identifier") + @ApiOperation({ summary: 'Account token roles details', description: 'Returns details about fungible token roles where the account is owner or has some special roles assigned to it' }) + @ApiOkResponse({ type: TokenWithRoles }) + async getTokenWithRoles( + @Param('address', ParseAddressPipe) address: string, + @Param('identifier', ParseTokenPipe) identifier: string, + ): Promise { + const result = await this.tokenService.getTokenWithRolesForAddress(address, identifier); + if (!result) { + throw new NotFoundException('Token with roles for given account not found'); + } + + return result; + } + + @Get("/accounts/:address/collections") + @ApiOperation({ summary: 'Account collections', description: 'Returns NFT/SFT/MetaESDT collections where the account owns one or more NFTs' }) + @ApiQuery({ name: 'from', description: 'Number of items to skip for the result set', required: false }) + @ApiQuery({ name: 'size', description: 'Number of items to retrieve', required: false }) + @ApiQuery({ name: 'search', description: 'Search by collection identifier', required: false }) + @ApiQuery({ name: 'type', description: 'Filter by type (NonFungibleESDT/SemiFungibleESDT/MetaESDT)', required: false }) + @ApiQuery({ name: 'subType', description: 'Filter by type (NonFungibleESDTv2/DynamicNonFungibleESDT/DynamicSemiFungibleESDT)', required: false }) + @ApiQuery({ name: 'excludeMetaESDT', description: 'Exclude collections of type "MetaESDT" in the response', required: false, type: Boolean }) + @ApiOkResponse({ type: [NftCollectionAccount] }) + async getAccountNftCollections( + @Param('address', ParseAddressPipe) address: string, + @Query('from', new DefaultValuePipe(0), ParseIntPipe) from: number, + @Query('size', new DefaultValuePipe(25), ParseIntPipe) size: number, + @Query('search') search?: string, + @Query('type', new ParseEnumArrayPipe(NftType)) type?: NftType[], + @Query('subType', new ParseEnumArrayPipe(NftSubType)) subType?: NftSubType[], + @Query('excludeMetaESDT', ParseBoolPipe) excludeMetaESDT?: boolean, + ): Promise { + return await this.collectionService.getCollectionsForAddress( + address, + new CollectionFilter({ search, type, subType, excludeMetaESDT }), + new QueryPagination({ from, size })); + } + + @Get("/accounts/:address/collections/count") + @ApiOperation({ summary: 'Account collection count', description: 'Returns the total number of NFT/SFT/MetaESDT collections where the account is owner or has some special roles assigned to it' }) + @ApiQuery({ name: 'search', description: 'Search by collection identifier', required: false }) + @ApiQuery({ name: 'type', description: 'Filter by type (NonFungibleESDT/SemiFungibleESDT/MetaESDT)', required: false }) + @ApiQuery({ name: 'subType', description: 'Filter by type (NonFungibleESDTv2/DynamicNonFungibleESDT/DynamicSemiFungibleESDT)', required: false }) + @ApiQuery({ name: 'excludeMetaESDT', description: 'Exclude collections of type "MetaESDT" in the response', required: false, type: Boolean }) + @ApiOkResponse({ type: Number }) + async getNftCollectionCount( + @Param('address', ParseAddressPipe) address: string, + @Query('search') search?: string, + @Query('type', new ParseEnumArrayPipe(NftType)) type?: NftType[], + @Query('subType', new ParseEnumArrayPipe(NftSubType)) subType?: NftSubType[], + @Query('excludeMetaESDT', ParseBoolPipe) excludeMetaESDT?: boolean, + ): Promise { + return await this.collectionService.getCollectionCountForAddress(address, new CollectionFilter({ search, type, subType, excludeMetaESDT })); + } + + @Get("/accounts/:address/collections/c") + @ApiExcludeEndpoint() + async getNftCollectionCountAlternative( + @Param('address', ParseAddressPipe) address: string, + @Query('search') search?: string, + @Query('type', new ParseEnumArrayPipe(NftType)) type?: NftType[], + @Query('subType', new ParseEnumArrayPipe(NftSubType)) subType?: NftSubType[], + @Query('excludeMetaESDT', ParseBoolPipe) excludeMetaESDT?: boolean, + ): Promise { + return await this.collectionService.getCollectionCountForAddress(address, new CollectionFilter({ search, type, subType, excludeMetaESDT })); + } + + @Get("/accounts/:address/collections/:collection") + @ApiOperation({ summary: 'Account collection details', description: 'Returns details about a specific NFT/SFT/MetaESDT collection from a given address' }) + @ApiOkResponse({ type: NftCollectionAccount }) + async getAccountNftCollection( + @Param('address', ParseAddressPipe) address: string, + @Param('collection', ParseCollectionPipe) collection: string, + ): Promise { + const result = await this.collectionService.getCollectionForAddress(address, collection); + if (!result) { + throw new NotFoundException('Collection for given account not found'); + } + + return result; + } + + @Get("/accounts/:address/nfts") + @UseInterceptors(DeepHistoryInterceptor) + @ApiOkResponse({ type: [NftAccount] }) + @ApiOperation({ summary: 'Account NFTs', description: 'Returns a list of all available NFTs/SFTs/MetaESDTs owned by the provided address' }) + @ApiQuery({ name: 'from', description: 'Number of items to skip for the result set', required: false }) + @ApiQuery({ name: 'size', description: 'Number of items to retrieve', required: false }) + @ApiQuery({ name: 'search', description: 'Search by collection identifier', required: false }) + @ApiQuery({ name: 'identifiers', description: 'Filter by identifiers, comma-separated', required: false }) + @ApiQuery({ name: 'type', description: 'Filter by type (NonFungibleESDT/SemiFungibleESDT/MetaESDT)', required: false }) + @ApiQuery({ name: 'subType', description: 'Filter by type (NonFungibleESDTv2/DynamicNonFungibleESDT/DynamicSemiFungibleESDT)', required: false }) + @ApiQuery({ name: 'collection', description: 'Get all tokens by token collection. Deprecated, replaced by collections parameter', required: false, deprecated: true }) + @ApiQuery({ name: 'collections', description: 'Get all tokens by token collections, comma-separated', required: false }) + @ApiQuery({ name: 'name', description: 'Get all nfts by name', required: false }) + @ApiQuery({ name: 'tags', description: 'Filter by one or more comma-separated tags', required: false }) + @ApiQuery({ name: 'creator', description: 'Return all NFTs associated with a given creator', required: false }) + @ApiQuery({ name: 'hasUris', description: 'Return all NFTs that have one or more uris', required: false }) + @ApiQuery({ name: 'includeFlagged', description: 'Include NFTs that are flagged or not', required: false }) + @ApiQuery({ name: 'withSupply', description: 'Return supply where type = SemiFungibleESDT', required: false }) + @ApiQuery({ name: 'source', description: 'Data source of request', required: false }) + @ApiQuery({ name: 'withScamInfo', description: 'Include scam info in the response', required: false, type: Boolean }) + @ApiQuery({ name: 'computeScamInfo', description: 'Compute scam info in the response', required: false, type: Boolean }) + @ApiQuery({ name: 'excludeMetaESDT', description: 'Exclude NFTs of type "MetaESDT" in the response', required: false, type: Boolean }) + @ApiQuery({ name: 'fields', description: 'List of fields to filter by', required: false, isArray: true, style: 'form', explode: false }) + @ApiQuery({ name: 'isScam', description: 'Filter by scam status', required: false, type: Boolean }) + @ApiQuery({ name: 'scamType', description: 'Filter by type (scam/potentialScam)', required: false }) + @ApiQuery({ name: 'timestamp', description: 'Retrieve entry from timestamp', required: false, type: Number }) + // @NoCache() + async getAccountNfts( + @Param('address', ParseAddressPipe) address: string, + @Query('from', new DefaultValuePipe(0), ParseIntPipe) from: number, + @Query('size', new DefaultValuePipe(25), ParseIntPipe) size: number, + @Query('search') search?: string, + @Query('identifiers', ParseNftArrayPipe) identifiers?: string[], + @Query('type', new ParseEnumArrayPipe(NftType)) type?: NftType[], + @Query('subType', new ParseEnumArrayPipe(NftSubType)) subType?: NftSubType[], + @Query('collection') collection?: string, + @Query('collections', ParseArrayPipe) collections?: string[], + @Query('name') name?: string, + @Query('tags', ParseArrayPipe) tags?: string[], + @Query('creator', ParseAddressPipe) creator?: string, + @Query('hasUris', ParseBoolPipe) hasUris?: boolean, + @Query('includeFlagged', ParseBoolPipe) includeFlagged?: boolean, + @Query('withSupply', ParseBoolPipe) withSupply?: boolean, + @Query('source', new ParseEnumPipe(EsdtDataSource)) source?: EsdtDataSource, + @Query('excludeMetaESDT', ParseBoolPipe) excludeMetaESDT?: boolean, + @Query('fields', ParseArrayPipe) fields?: string[], + @Query('isScam', ParseBoolPipe) isScam?: boolean, + @Query('scamType', new ParseEnumPipe(ScamType)) scamType?: ScamType, + @Query('timestamp', ParseIntPipe) _timestamp?: number, + ): Promise { + return await this.nftService.getNftsForAddressFromDb( + address, + new QueryPagination({ from, size }), + new NftFilter({ + search, + identifiers, + type, + subType, + collection, + name, + collections, + tags, + creator, + hasUris, + includeFlagged, + excludeMetaESDT, + isScam, + scamType, + }), + fields, + new NftQueryOptions({ withSupply }), + source + ); + } + + @Get("/accounts/:address/nfts/count") + @UseInterceptors(DeepHistoryInterceptor) + @ApiOperation({ summary: 'Account NFT/SFT tokens count', description: 'Returns the total number of NFT/SFT tokens from a given address, as well as the total number of a certain type of ESDT ' }) + @ApiQuery({ name: 'search', description: 'Search by collection identifier', required: false }) + @ApiQuery({ name: 'identifiers', description: 'Filter by identifiers, comma-separated', required: false }) + @ApiQuery({ name: 'type', description: 'Filter by type (NonFungibleESDT/SemiFungibleESDT/MetaESDT)', required: false }) + @ApiQuery({ name: 'subType', description: 'Filter by subType', required: false }) + @ApiQuery({ name: 'collection', description: 'Get all tokens by token collection', required: false }) + @ApiQuery({ name: 'collections', description: 'Get all tokens by token collections, comma-separated', required: false }) + @ApiQuery({ name: 'name', description: 'Get all nfts by name', required: false }) + @ApiQuery({ name: 'tags', description: 'Filter by one or more comma-separated tags', required: false }) + @ApiQuery({ name: 'creator', description: 'Return all NFTs associated with a given creator', required: false }) + @ApiQuery({ name: 'hasUris', description: 'Return all NFTs that have one or more uris', required: false }) + @ApiQuery({ name: 'includeFlagged', description: 'Include NFTs that are flagged or not', required: false }) + @ApiQuery({ name: 'excludeMetaESDT', description: 'Exclude NFTs of type "MetaESDT" in the response', required: false, type: Boolean }) + @ApiQuery({ name: 'isScam', description: 'Filter by scam status', required: false, type: Boolean }) + @ApiQuery({ name: 'scamType', description: 'Filter by type (scam/potentialScam)', required: false }) + @ApiQuery({ name: 'timestamp', description: 'Retrieve entry from timestamp', required: false, type: Number }) + @ApiOkResponse({ type: Number }) + // @NoCache() + async getNftCount( + @Param('address', ParseAddressPipe) address: string, + @Query('identifiers', ParseNftArrayPipe) identifiers?: string[], + @Query('search') search?: string, + @Query('type', new ParseEnumArrayPipe(NftType)) type?: NftType[], + @Query('subType', new ParseEnumArrayPipe(NftSubType)) subType?: NftSubType[], + @Query('collection') collection?: string, + @Query('collections', ParseArrayPipe) collections?: string[], + @Query('name') name?: string, + @Query('tags', ParseArrayPipe) tags?: string[], + @Query('creator', ParseAddressPipe) creator?: string, + @Query('hasUris', ParseBoolPipe) hasUris?: boolean, + @Query('includeFlagged', ParseBoolPipe) includeFlagged?: boolean, + @Query('excludeMetaESDT', ParseBoolPipe) excludeMetaESDT?: boolean, + @Query('isScam', ParseBoolPipe) isScam?: boolean, + @Query('scamType', new ParseEnumPipe(ScamType)) scamType?: ScamType, + @Query('timestamp', ParseIntPipe) _timestamp?: number, + ): Promise { + return await this.nftService.getNftCountForAddress(address, new NftFilter({ + search, + identifiers, + type, + subType, + collection, + collections, + name, + tags, + creator, + hasUris, + includeFlagged, + excludeMetaESDT, + isScam, + scamType, + })); + } + + @Get("/accounts/:address/nfts/c") + @UseInterceptors(DeepHistoryInterceptor) + @ApiExcludeEndpoint() + async getNftCountAlternative( + @Param('address', ParseAddressPipe) address: string, + @Query('search') search?: string, + @Query('identifiers', ParseNftArrayPipe) identifiers?: string[], + @Query('type', new ParseEnumArrayPipe(NftType)) type?: NftType[], + @Query('subType', new ParseEnumArrayPipe(NftSubType)) subType?: NftSubType[], + @Query('collection') collection?: string, + @Query('collections', ParseArrayPipe) collections?: string[], + @Query('name') name?: string, + @Query('tags', ParseArrayPipe) tags?: string[], + @Query('creator', ParseAddressPipe) creator?: string, + @Query('hasUris', ParseBoolPipe) hasUris?: boolean, + @Query('includeFlagged', ParseBoolPipe) includeFlagged?: boolean, + @Query('excludeMetaESDT', ParseBoolPipe) excludeMetaESDT?: boolean, + @Query('isScam', ParseBoolPipe) isScam?: boolean, + @Query('scamType', new ParseEnumPipe(ScamType)) scamType?: ScamType, + @Query('timestamp', ParseIntPipe) _timestamp?: number, + ): Promise { + return await this.nftService.getNftCountForAddress(address, new NftFilter({ search, identifiers, type, subType, collection, collections, name, tags, creator, hasUris, includeFlagged, excludeMetaESDT, isScam, scamType })); + } + + @Get("/accounts/:address/nfts/:nft") + @UseInterceptors(DeepHistoryInterceptor) + @ApiOperation({ summary: 'Account NFT/SFT token details', description: 'Returns details about a specific fungible token for a given address' }) + @ApiQuery({ name: 'fields', description: 'List of fields to filter by', required: false, isArray: true, style: 'form', explode: false }) + @ApiQuery({ name: 'extract', description: 'Extract a specific field', required: false }) + @ApiQuery({ name: 'timestamp', description: 'Retrieve entry from timestamp', required: false, type: Number }) + @ApiOkResponse({ type: NftAccount }) + // @NoCache() + async getAccountNft( + @Param('address', ParseAddressPipe) address: string, + @Param('nft', ParseNftPipe) nft: string, + @Query('fields', ParseArrayPipe) fields?: string[], + @Query('extract') extract?: string, + @Query('timestamp', ParseIntPipe) _timestamp?: number, + ): Promise { + const actualFields = extract ? [extract] : fields; + + const result = await this.nftService.getNftForAddressFromDb(address, nft, actualFields); + if (!result) { + throw new HttpException('Token for given account not found', HttpStatus.NOT_FOUND); + } + + return result; + } + + @Get('/accounts/:address/stake') + @UseInterceptors(DeepHistoryInterceptor) + @ApiOperation({ + summary: 'Account stake details', + description: + 'Summarizes total staked amount for the given provider, as well as when and how much unbond will be performed', + }) + @ApiQuery({ + name: 'timestamp', + description: 'Retrieve entry from timestamp', + required: false, + type: Number, + }) + @ApiOkResponse({ type: ProviderStake }) + async getAccountStake( + @Param('address', ParseAddressPipe) address: string, + @Query('timestamp', ParseIntPipe) _timestamp?: number, + ): Promise { + return await this.stakeService.getStakeForAddress(address); + } + + @Get("/accounts/:address/delegation") + @ApiOperation({ summary: 'Account delegations with staking providers', description: 'Summarizes all delegation positions with staking providers, together with unDelegation positions' }) + @ApiOkResponse({ type: AccountDelegation, isArray: true }) + async getDelegationForAddress(@Param('address', ParseAddressPipe) address: string): Promise { + return await this.delegationService.getDelegationForAddress(address); + } + + @Get("/accounts/:address/delegation-legacy") + @UseInterceptors(DeepHistoryInterceptor) + @ApiOperation({ summary: 'Account legacy delegation details', description: 'Returns staking information related to the legacy delegation pool' }) + @ApiOkResponse({ type: AccountDelegationLegacy }) + @ApiQuery({ name: 'timestamp', description: 'Retrieve entry from timestamp', required: false, type: Number }) + async getAccountDelegationLegacy( + @Param('address', ParseAddressPipe) address: string, + @Query('timestamp', ParseIntPipe) _timestamp?: number, + ): Promise { + return await this.delegationLegacyService.getDelegationForAddress(address); + } + + @Get("/accounts/:address/keys") + @ApiOperation({ summary: 'Account nodes', description: 'Returns all active / queued nodes where the account is owner' }) + @ApiOkResponse({ type: [AccountKey] }) + @ApiQuery({ name: 'from', description: 'Number of items to skip for the result set', required: false }) + @ApiQuery({ name: 'size', description: 'Number of items to retrieve', required: false }) + @ApiQuery({ name: 'status', description: 'Key status', required: false, enum: NodeStatusRaw }) + async getAccountKeys( + @Param('address', ParseAddressPipe) address: string, + @Query('from', new DefaultValuePipe(0), ParseIntPipe) from: number, + @Query('size', new DefaultValuePipe(25), ParseIntPipe) size: number, + @Query('status', new ParseEnumArrayPipe(NodeStatusRaw)) status?: NodeStatusRaw[], + ): Promise { + return await this.accountService.getKeys( + address, + new AccountKeyFilter({ status }), + new QueryPagination({ from, size })); + } + + @Get("/accounts/:address/waiting-list") + @ApiOperation({ summary: 'Account queued nodes', description: 'Returns all nodes in the node queue where the account is owner' }) + @ApiOkResponse({ type: [WaitingList] }) + async getAccountWaitingList(@Param('address', ParseAddressPipe) address: string): Promise { + return await this.waitingListService.getWaitingListForAddress(address); + } + + @Get("/accounts/:address/transactions") + @ApiOperation({ summary: 'Account transaction list', description: 'Returns details of all transactions where the account is sender or receiver' }) + @ApplyComplexity({ target: TransactionDetailed }) + @ApiOkResponse({ type: [Transaction] }) + @ApiQuery({ name: 'from', description: 'Number of items to skip for the result set', required: false }) + @ApiQuery({ name: 'size', description: 'Number of items to retrieve', required: false }) + @ApiQuery({ name: 'sender', description: 'Address of the transaction sender', required: false }) + @ApiQuery({ name: 'receiver', description: 'Search by multiple receiver addresses, comma-separated', required: false }) + @ApiQuery({ name: 'token', description: 'Identifier of the token', required: false }) + @ApiQuery({ name: 'senderShard', description: 'Id of the shard the sender address belongs to', required: false }) + @ApiQuery({ name: 'receiverShard', description: 'Id of the shard the receiver address belongs to', required: false }) + @ApiQuery({ name: 'miniBlockHash', description: 'Filter by miniblock hash', required: false }) + @ApiQuery({ name: 'hashes', description: 'Filter by a comma-separated list of transaction hashes', required: false }) + @ApiQuery({ name: 'status', description: 'Status of the transaction (success / pending / invalid / fail)', required: false, enum: TransactionStatus }) + @ApiQuery({ name: 'function', description: 'Filter transactions by function name', required: false }) + @ApiQuery({ name: 'order', description: 'Sort order (asc/desc)', required: false, enum: SortOrder }) + @ApiQuery({ name: 'fields', description: 'List of fields to filter by', required: false, isArray: true, style: 'form', explode: false }) + @ApiQuery({ name: 'before', description: 'Before timestamp', required: false }) + @ApiQuery({ name: 'after', description: 'After timestamp', required: false }) + @ApiQuery({ name: 'round', description: 'Round number', required: false }) + @ApiQuery({ name: 'withScResults', description: 'Return scResults for transactions. When "withScresults" parameter is applied, complexity estimation is 200', required: false }) + @ApiQuery({ name: 'withOperations', description: 'Return operations for transactions. When "withOperations" parameter is applied, complexity estimation is 200', required: false }) + @ApiQuery({ name: 'withLogs', description: 'Return logs for transactions. When "withLogs" parameter is applied, complexity estimation is 200', required: false }) + @ApiQuery({ name: 'withScamInfo', description: 'Returns scam information', required: false, type: Boolean }) + @ApiQuery({ name: 'withUsername', description: 'Integrates username in assets for all addresses present in the transactions', required: false, type: Boolean }) + @ApiQuery({ name: 'withBlockInfo', description: 'Returns sender / receiver block details', required: false, type: Boolean }) + @ApiQuery({ name: 'computeScamInfo', required: false, type: Boolean }) + @ApiQuery({ name: 'senderOrReceiver', description: 'One address that current address interacted with', required: false }) + @ApiQuery({ name: 'isRelayed', description: 'Returns isRelayed transactions details', required: false, type: Boolean }) + @ApiQuery({ name: 'isScCall', description: 'Returns sc call transactions details', required: false, type: Boolean }) + @ApiQuery({ name: 'withActionTransferValue', description: 'Returns value in USD and EGLD for transferred tokens within the action attribute', required: false }) + @ApiQuery({ name: 'withRelayedScresults', description: 'If set to true, will include smart contract results that resemble relayed transactions', required: false, type: Boolean }) + async getAccountTransactions( + @Param('address', ParseAddressPipe) address: string, + @Query('from', new DefaultValuePipe(0), ParseIntPipe) from: number, + @Query('size', new DefaultValuePipe(25), ParseIntPipe) size: number, + @Query('sender', ParseAddressPipe) sender?: string, + @Query('receiver', ParseAddressArrayPipe) receiver?: string[], + @Query('token') token?: string, + @Query('senderShard', ParseIntPipe) senderShard?: number, + @Query('receiverShard', ParseIntPipe) receiverShard?: number, + @Query('miniBlockHash', ParseBlockHashPipe) miniBlockHash?: string, + @Query('hashes', ParseArrayPipe) hashes?: string[], + @Query('status', new ParseEnumPipe(TransactionStatus)) status?: TransactionStatus, + @Query('function', new ParseArrayPipe(new ParseArrayPipeOptions({ allowEmptyString: true }))) functions?: string[], + @Query('before', ParseIntPipe) before?: number, + @Query('after', ParseIntPipe) after?: number, + @Query('round', ParseIntPipe) round?: number, + @Query('order', new ParseEnumPipe(SortOrder)) order?: SortOrder, + @Query('fields', ParseArrayPipe) fields?: string[], + @Query('withScResults', ParseBoolPipe) withScResults?: boolean, + @Query('withOperations', ParseBoolPipe) withOperations?: boolean, + @Query('withLogs', ParseBoolPipe) withLogs?: boolean, + @Query('withScamInfo', ParseBoolPipe) withScamInfo?: boolean, + @Query('withUsername', ParseBoolPipe) withUsername?: boolean, + @Query('withBlockInfo', ParseBoolPipe) withBlockInfo?: boolean, + @Query('senderOrReceiver', ParseAddressPipe) senderOrReceiver?: string, + @Query('isRelayed', ParseBoolPipe) isRelayed?: boolean, + @Query('isScCall', ParseBoolPipe) isScCall?: boolean, + @Query('withActionTransferValue', ParseBoolPipe) withActionTransferValue?: boolean, + @Query('withRelayedScresults', ParseBoolPipe) withRelayedScresults?: boolean, + ) { + const options = TransactionQueryOptions.applyDefaultOptions(size, { withScResults, withOperations, withLogs, withScamInfo, withUsername, withBlockInfo, withActionTransferValue }); + + const transactionFilter = new TransactionFilter({ + sender, + receivers: receiver, + token, + functions, + senderShard, + receiverShard, + miniBlockHash, + hashes, + status, + before, + after, + order, + senderOrReceiver, + isRelayed, + isScCall, + round, + withRelayedScresults, + }); + TransactionFilter.validate(transactionFilter, size); + return await this.transactionService.getTransactions(transactionFilter, new QueryPagination({ from, size }), options, address, fields); + } + + @Get("/accounts/:address/transactions/count") + @ApiOperation({ summary: 'Account transactions count', description: 'Returns total number of transactions for a given address where the account is sender or receiver, as well as total transactions count that have a certain status' }) + @ApiOkResponse({ type: Number }) + @ApiQuery({ name: 'sender', description: 'Address of the transaction sender', required: false }) + @ApiQuery({ name: 'receiver', description: 'Search by multiple receiver addresses, comma-separated', required: false }) + @ApiQuery({ name: 'token', description: 'Identifier of the token', required: false }) + @ApiQuery({ name: 'senderShard', description: 'Id of the shard the sender address belongs to', required: false }) + @ApiQuery({ name: 'receiverShard', description: 'Id of the shard the receiver address belongs to', required: false }) + @ApiQuery({ name: 'miniBlockHash', description: 'Filter by miniblock hash', required: false }) + @ApiQuery({ name: 'hashes', description: 'Filter by a comma-separated list of transaction hashes', required: false }) + @ApiQuery({ name: 'status', description: 'Status of the transaction (success / pending / invalid / fail)', required: false, enum: TransactionStatus }) + @ApiQuery({ name: 'function', description: 'Filter transactions by function name', required: false }) + @ApiQuery({ name: 'before', description: 'Before timestamp', required: false }) + @ApiQuery({ name: 'after', description: 'After timestamp', required: false }) + @ApiQuery({ name: 'round', description: 'Round number', required: false }) + @ApiQuery({ name: 'senderOrReceiver', description: 'One address that current address interacted with', required: false }) + @ApiQuery({ name: 'isRelayed', description: 'Returns isRelayed transactions details', required: false, type: Boolean }) + @ApiQuery({ name: 'isScCall', description: 'Returns sc call transactions details', required: false, type: Boolean }) + @ApiQuery({ name: 'withRelayedScresults', description: 'If set to true, will include smart contract results that resemble relayed transactions', required: false, type: Boolean }) + async getAccountTransactionsCount( + @Param('address', ParseAddressPipe) address: string, + @Query('sender', ParseAddressPipe) sender?: string, + @Query('receiver', ParseAddressArrayPipe) receiver?: string[], + @Query('token') token?: string, + @Query('senderShard', ParseIntPipe) senderShard?: number, + @Query('receiverShard', ParseIntPipe) receiverShard?: number, + @Query('miniBlockHash', ParseBlockHashPipe) miniBlockHash?: string, + @Query('hashes', ParseArrayPipe) hashes?: string[], + @Query('status', new ParseEnumPipe(TransactionStatus)) status?: TransactionStatus, + @Query('function', new ParseArrayPipe(new ParseArrayPipeOptions({ allowEmptyString: true }))) functions?: string[], + @Query('before', ParseIntPipe) before?: number, + @Query('after', ParseIntPipe) after?: number, + @Query('round', ParseIntPipe) round?: number, + @Query('senderOrReceiver', ParseAddressPipe) senderOrReceiver?: string, + @Query('isRelayed', ParseBoolPipe) isRelayed?: boolean, + @Query('isScCall', ParseBoolPipe) isScCall?: boolean, + @Query('withRelayedScresults', ParseBoolPipe) withRelayedScresults?: boolean, + + ): Promise { + + return await this.transactionService.getTransactionCount(new TransactionFilter({ + sender, + receivers: receiver, + token, + functions, + senderShard, + receiverShard, + miniBlockHash, + hashes, + status, + before, + after, + senderOrReceiver, + isRelayed, + isScCall, + round, + withRelayedScresults, + }), address); + } + + @Get("/accounts/:address/transfers") + @ApiOperation({ summary: 'Account value transfers', description: 'Returns both transfers triggerred by a user account (type = Transaction), as well as transfers triggerred by smart contracts (type = SmartContractResult), thus providing a full picture of all in/out value transfers for a given account' }) + @ApiOkResponse({ type: [Transaction] }) + @ApplyComplexity({ target: TransactionDetailed }) + @ApiQuery({ name: 'from', description: 'Number of items to skip for the result set', required: false }) + @ApiQuery({ name: 'size', description: 'Number of items to retrieve', required: false }) + @ApiQuery({ name: 'sender', description: 'Address of the transfer sender', required: false }) + @ApiQuery({ name: 'receiver', description: 'Search by multiple receiver addresses, comma-separated', required: false }) + @ApiQuery({ name: 'token', description: 'Identifier of the token', required: false }) + @ApiQuery({ name: 'senderShard', description: 'Id of the shard the sender address belongs to', required: false }) + @ApiQuery({ name: 'receiverShard', description: 'Id of the shard the receiver address belongs to', required: false }) + @ApiQuery({ name: 'miniBlockHash', description: 'Filter by miniblock hash', required: false }) + @ApiQuery({ name: 'hashes', description: 'Filter by a comma-separated list of transfer hashes', required: false }) + @ApiQuery({ name: 'status', description: 'Status of the transaction (success / pending / invalid / fail)', required: false, enum: TransactionStatus }) + @ApiQuery({ name: 'function', description: 'Filter transactions by function name', required: false }) + @ApiQuery({ name: 'order', description: 'Sort order (asc/desc)', required: false, enum: SortOrder }) + @ApiQuery({ name: 'before', description: 'Before timestamp', required: false }) + @ApiQuery({ name: 'after', description: 'After timestamp', required: false }) + @ApiQuery({ name: 'round', description: 'Round number', required: false }) + @ApiQuery({ name: 'fields', description: 'List of fields to filter by', required: false, isArray: true, style: 'form', explode: false }) + @ApiQuery({ name: 'relayer', description: 'Address of the relayer', required: false }) + @ApiQuery({ name: 'isScCall', description: 'Returns sc call transactions details', required: false, type: Boolean }) + @ApiQuery({ name: 'withScamInfo', description: 'Returns scam information', required: false, type: Boolean }) + @ApiQuery({ name: 'withUsername', description: 'Integrates username in assets for all addresses present in the transactions', required: false, type: Boolean }) + @ApiQuery({ name: 'withBlockInfo', description: 'Returns sender / receiver block details', required: false, type: Boolean }) + @ApiQuery({ name: 'senderOrReceiver', description: 'One address that current address interacted with', required: false }) + @ApiQuery({ name: 'withLogs', description: 'Return logs for transfers. When "withLogs" parameter is applied, complexity estimation is 200', required: false }) + @ApiQuery({ name: 'withOperations', description: 'Return operations for transfers. When "withOperations" parameter is applied, complexity estimation is 200', required: false }) + @ApiQuery({ name: 'withActionTransferValue', description: 'Returns value in USD and EGLD for transferred tokens within the action attribute', required: false }) + @ApiQuery({ name: 'withRefunds', description: 'Include refund transactions', required: false }) + @ApiQuery({ name: 'withTxsRelayedByAddress', description: 'Include transactions that were relayed by the address', required: false }) + async getAccountTransfers( + @Param('address', ParseAddressPipe) address: string, + @Query('from', new DefaultValuePipe(0), ParseIntPipe) from: number, + @Query('size', new DefaultValuePipe(25), ParseIntPipe) size: number, + @Query('sender', ParseAddressArrayPipe) sender?: string[], + @Query('receiver', ParseAddressArrayPipe) receiver?: string[], + @Query('token') token?: string, + @Query('senderShard', ParseIntPipe) senderShard?: number, + @Query('receiverShard', ParseIntPipe) receiverShard?: number, + @Query('miniBlockHash', ParseBlockHashPipe) miniBlockHash?: string, + @Query('hashes', ParseArrayPipe) hashes?: string[], + @Query('status', new ParseEnumPipe(TransactionStatus)) status?: TransactionStatus, + @Query('function', new ParseArrayPipe(new ParseArrayPipeOptions({ allowEmptyString: true }))) functions?: string[], + @Query('before', ParseIntPipe) before?: number, + @Query('after', ParseIntPipe) after?: number, + @Query('round', ParseIntPipe) round?: number, + @Query('fields', ParseArrayPipe) fields?: string[], + @Query('order', new ParseEnumPipe(SortOrder)) order?: SortOrder, + @Query('relayer', ParseAddressPipe) relayer?: string, + @Query('withScamInfo', ParseBoolPipe) withScamInfo?: boolean, + @Query('withUsername', ParseBoolPipe) withUsername?: boolean, + @Query('withBlockInfo', ParseBoolPipe) withBlockInfo?: boolean, + @Query('senderOrReceiver', ParseAddressPipe) senderOrReceiver?: string, + @Query('isScCall', ParseBoolPipe) isScCall?: boolean, + @Query('withLogs', ParseBoolPipe) withLogs?: boolean, + @Query('withOperations', ParseBoolPipe) withOperations?: boolean, + @Query('withActionTransferValue', ParseBoolPipe) withActionTransferValue?: boolean, + @Query('withRefunds', ParseBoolPipe) withRefunds?: boolean, + @Query('withTxsRelayedByAddress', ParseBoolPipe) withTxsRelayedByAddress?: boolean, + ): Promise { + const options = TransactionQueryOptions.applyDefaultOptions( + size, { withScamInfo, withUsername, withBlockInfo, withOperations, withLogs, withActionTransferValue }); + + return await this.transferService.getTransfers(new TransactionFilter({ + address, + senders: sender, + receivers: receiver, + token, + functions, + senderShard, + receiverShard, + miniBlockHash, + hashes, + status, + before, + after, + order, + senderOrReceiver, + relayer, + round, + withRefunds, + withTxsRelayedByAddress, + isScCall, + }), + new QueryPagination({ from, size }), + options, + fields + ); + } + + @Get("/accounts/:address/transfers/count") + @ApiOperation({ summary: 'Account transfer count', description: 'Return total count of transfers triggerred by a user account (type = Transaction), as well as transfers triggerred by smart contracts (type = SmartContractResult)' }) + @ApiOkResponse({ type: Number }) + @ApiQuery({ name: 'sender', description: 'Address of the transfer sender', required: false }) + @ApiQuery({ name: 'receiver', description: 'Search by multiple receiver addresses, comma-separated', required: false }) + @ApiQuery({ name: 'token', description: 'Identifier of the token', required: false }) + @ApiQuery({ name: 'senderShard', description: 'Id of the shard the sender address belongs to', required: false }) + @ApiQuery({ name: 'receiverShard', description: 'Id of the shard the receiver address belongs to', required: false }) + @ApiQuery({ name: 'miniBlockHash', description: 'Filter by miniblock hash', required: false }) + @ApiQuery({ name: 'hashes', description: 'Filter by a comma-separated list of transfer hashes', required: false }) + @ApiQuery({ name: 'status', description: 'Status of the transaction (success / pending / invalid / fail)', required: false, enum: TransactionStatus }) + @ApiQuery({ name: 'function', description: 'Filter transfers by function name', required: false }) + @ApiQuery({ name: 'before', description: 'Before timestamp', required: false }) + @ApiQuery({ name: 'after', description: 'After timestamp', required: false }) + @ApiQuery({ name: 'round', description: 'Round number', required: false }) + @ApiQuery({ name: 'isScCall', description: 'Returns sc call transactions details', required: false, type: Boolean }) + @ApiQuery({ name: 'senderOrReceiver', description: 'One address that current address interacted with', required: false }) + @ApiQuery({ name: 'withRefunds', description: 'Include refund transactions', required: false }) + async getAccountTransfersCount( + @Param('address', ParseAddressPipe) address: string, + @Query('sender', ParseAddressArrayPipe) sender?: string[], + @Query('receiver', ParseAddressArrayPipe) receiver?: string[], + @Query('token') token?: string, + @Query('senderShard', ParseIntPipe) senderShard?: number, + @Query('receiverShard', ParseIntPipe) receiverShard?: number, + @Query('miniBlockHash', ParseBlockHashPipe) miniBlockHash?: string, + @Query('hashes', ParseArrayPipe) hashes?: string[], + @Query('status', new ParseEnumPipe(TransactionStatus)) status?: TransactionStatus, + @Query('function', new ParseArrayPipe(new ParseArrayPipeOptions({ allowEmptyString: true }))) functions?: string[], + @Query('before', ParseIntPipe) before?: number, + @Query('after', ParseIntPipe) after?: number, + @Query('round', ParseIntPipe) round?: number, + @Query('senderOrReceiver', ParseAddressPipe) senderOrReceiver?: string, + @Query('isScCall', ParseBoolPipe) isScCall?: boolean, + @Query('withRefunds', ParseBoolPipe) withRefunds?: boolean, + ): Promise { + return await this.transferService.getTransfersCount(new TransactionFilter({ + address, + senders: sender, + receivers: receiver, + token, + functions, + senderShard, + receiverShard, + miniBlockHash, + hashes, + status, + before, + after, + senderOrReceiver, + round, + isScCall, + withRefunds, + })); + } + + @Get("/accounts/:address/transfers/c") + @ApiExcludeEndpoint() + async getAccountTransfersCountAlternative( + @Param('address', ParseAddressPipe) address: string, + @Query('sender', ParseAddressArrayPipe) sender?: string[], + @Query('receiver', ParseAddressArrayPipe) receiver?: string[], + @Query('token') token?: string, + @Query('senderShard', ParseIntPipe) senderShard?: number, + @Query('receiverShard', ParseIntPipe) receiverShard?: number, + @Query('miniBlockHash', ParseBlockHashPipe) miniBlockHash?: string, + @Query('hashes', ParseArrayPipe) hashes?: string[], + @Query('status', new ParseEnumPipe(TransactionStatus)) status?: TransactionStatus, + @Query('function', new ParseArrayPipe(new ParseArrayPipeOptions({ allowEmptyString: true }))) functions?: string[], + @Query('before', ParseIntPipe) before?: number, + @Query('after', ParseIntPipe) after?: number, + @Query('round', ParseIntPipe) round?: number, + @Query('senderOrReceiver', ParseAddressPipe) senderOrReceiver?: string, + @Query('withRefunds', ParseBoolPipe) withRefunds?: boolean, + @Query('isScCall', ParseBoolPipe) isScCall?: boolean, + ): Promise { + return await this.transferService.getTransfersCount(new TransactionFilter({ + address, + senders: sender, + receivers: receiver, + token, + functions, + senderShard, + receiverShard, + miniBlockHash, + hashes, + status, + before, + after, + senderOrReceiver, + round, + withRefunds, + isScCall, + })); + } + + @Get("/accounts/:address/deploys") + @ApiOperation({ summary: 'Account deploys details', description: 'Returns deploys details for a given account' }) + @ApiQuery({ name: 'from', description: 'Number of items to skip for the result set', required: false }) + @ApiQuery({ name: 'size', description: 'Number of items to retrieve', required: false }) + @ApiOkResponse({ type: [DeployedContract] }) + getAccountDeploys( + @Param('address', ParseAddressPipe) address: string, + @Query('from', new DefaultValuePipe(0), ParseIntPipe) from: number, + @Query('size', new DefaultValuePipe(25), ParseIntPipe) size: number, + ): Promise { + return this.accountService.getAccountDeploys(new QueryPagination({ from, size }), address); + } + + @Get("/accounts/:address/deploys/count") + @ApiOperation({ summary: 'Account deploys count', description: 'Returns total number of deploys for a given address' }) + @ApiOkResponse({ type: Number }) + getAccountDeploysCount(@Param('address', ParseAddressPipe) address: string): Promise { + return this.accountService.getAccountDeploysCount(address); + } + + @Get("/accounts/:address/deploys/c") + @ApiExcludeEndpoint() + getAccountDeploysCountAlternative(@Param('address', ParseAddressPipe) address: string): Promise { + return this.accountService.getAccountDeploysCount(address); + } + + @Get("/accounts/:address/contracts") + @ApiOperation({ summary: 'Account contracts details', description: 'Returns contracts details for a given account' }) + @ApiQuery({ name: 'from', description: 'Number of items to skip for the result set', required: false }) + @ApiQuery({ name: 'size', description: 'Number of items to retrieve', required: false }) + @ApiOkResponse({ type: [DeployedContract] }) + getAccountContracts( + @Param('address', ParseAddressPipe) address: string, + @Query('from', new DefaultValuePipe(0), ParseIntPipe) from: number, + @Query('size', new DefaultValuePipe(25), ParseIntPipe) size: number, + ): Promise { + return this.accountService.getAccountContracts(new QueryPagination({ from, size }), address); + } + + @Get("/accounts/:address/contracts/count") + @ApiOperation({ summary: 'Account contracts count', description: 'Returns total number of contracts for a given address' }) + @ApiOkResponse({ type: Number }) + getAccountContractsCount(@Param('address', ParseAddressPipe) address: string): Promise { + return this.accountService.getAccountContractsCount(address); + } + + @Get("/accounts/:address/contracts/c") + @ApiExcludeEndpoint() + getAccountContractsCountAlternative(@Param('address', ParseAddressPipe) address: string): Promise { + return this.accountService.getAccountContractsCount(address); + } + + @Get("/accounts/:address/upgrades") + @ApiOperation({ summary: 'Account upgrades details', description: 'Returns all upgrades details for a specific contract address' }) + @ApiQuery({ name: 'from', description: 'Number of items to skip for the result set', required: false }) + @ApiQuery({ name: 'size', description: 'Number of items to retrieve', required: false }) + @ApiOkResponse({ type: ContractUpgrades }) + getContractUpgrades( + @Param('address', ParseAddressPipe) address: string, + @Query('from', new DefaultValuePipe(0), ParseIntPipe) from: number, + @Query('size', new DefaultValuePipe(25), ParseIntPipe) size: number, + ): Promise { + return this.accountService.getContractUpgrades(new QueryPagination({ from, size }), address); + } + + @Get("/accounts/:address/results") + @ApiOperation({ summary: 'Account smart contract results', description: 'Returns smart contract results where the account is sender or receiver' }) + @ApiQuery({ name: 'from', description: 'Number of items to skip for the result set', required: false }) + @ApiQuery({ name: 'size', description: 'Number of items to retrieve', required: false }) + @ApiOkResponse({ type: [SmartContractResult] }) + getAccountScResults( + @Param('address', ParseAddressPipe) address: string, + @Query('from', new DefaultValuePipe(0), ParseIntPipe) from: number, + @Query('size', new DefaultValuePipe(25), ParseIntPipe) size: number, + ): Promise { + return this.scResultService.getAccountScResults(address, new QueryPagination({ from, size })); + } + + @Get("/accounts/:address/results/count") + @ApiOperation({ summary: 'Account smart contracts results count', description: 'Returns number of smart contract results where the account is sender or receiver' }) + @ApiOkResponse({ type: Number }) + getAccountScResultsCount( + @Param('address', ParseAddressPipe) address: string, + ): Promise { + return this.scResultService.getAccountScResultsCount(address); + } + + @Get("/accounts/:address/results/:scHash") + @ApiOperation({ summary: 'Account smart contract result', description: 'Returns details of a smart contract result where the account is sender or receiver' }) + @ApiOkResponse({ type: SmartContractResult }) + async getAccountScResult( + @Param('address', ParseAddressPipe) address: string, + @Param('scHash', ParseTransactionHashPipe) scHash: string, + ): Promise { + const scResult = await this.scResultService.getScResult(scHash); + if (!scResult || (scResult.sender !== address && scResult.receiver !== address)) { + throw new NotFoundException('Smart contract result not found'); + } + + return scResult; + } + + @Get("/accounts/:address/history") + @ApiOperation({ summary: 'Account history', description: 'Return account EGLD balance history' }) + @ApiQuery({ name: 'from', description: 'Number of items to skip for the result set', required: false }) + @ApiQuery({ name: 'size', description: 'Number of items to retrieve', required: false }) + @ApiQuery({ name: 'before', description: 'Before timestamp', required: false }) + @ApiQuery({ name: 'after', description: 'After timestamp', required: false }) + @ApiOkResponse({ type: [AccountHistory] }) + getAccountHistory( + @Param('address', ParseAddressPipe) address: string, + @Query('from', new DefaultValuePipe(0), ParseIntPipe) from: number, + @Query('size', new DefaultValuePipe(25), ParseIntPipe) size: number, + @Query('before', ParseIntPipe) before?: number, + @Query('after', ParseIntPipe) after?: number, + ): Promise { + return this.accountService.getAccountHistory( + address, + new QueryPagination({ from, size }), + new AccountHistoryFilter({ before, after })); + } + + @Get("/accounts/:address/history/count") + @ApiOperation({ summary: 'Account history count', description: 'Return account EGLD balance history count' }) + @ApiQuery({ name: 'before', description: 'Before timestamp', required: false }) + @ApiQuery({ name: 'after', description: 'After timestamp', required: false }) + @ApiOkResponse({ type: Number }) + getAccountHistoryCount( + @Param('address', ParseAddressPipe) address: string, + @Query('before', ParseIntPipe) before?: number, + @Query('after', ParseIntPipe) after?: number, + ): Promise { + return this.accountService.getAccountHistoryCount( + address, + new AccountHistoryFilter({ before, after })); + } + + @Get("/accounts/:address/history/:tokenIdentifier/count") + @ApiOperation({ summary: 'Account token history count', description: 'Return account token balance history count' }) + @ApiQuery({ name: 'before', description: 'Before timestamp', required: false }) + @ApiQuery({ name: 'after', description: 'After timestamp', required: false }) + @ApiOkResponse({ type: Number }) + async getAccountTokenHistoryCount( + @Param('address', ParseAddressPipe) address: string, + @Param('tokenIdentifier', ParseTokenOrNftPipe) tokenIdentifier: string, + @Query('before', ParseIntPipe) before?: number, + @Query('after', ParseIntPipe) after?: number, + ): Promise { + const isToken = await this.tokenService.isToken(tokenIdentifier) || await this.collectionService.isCollection(tokenIdentifier) || await this.nftService.isNft(tokenIdentifier); + if (!isToken) { + throw new NotFoundException(`Token '${tokenIdentifier}' not found`); + } + return this.accountService.getAccountTokenHistoryCount( + address, + tokenIdentifier, + new AccountHistoryFilter({ before, after })); + } + + @Get("/accounts/:address/esdthistory") + @ApiOperation({ summary: 'Account esdts history', description: 'Returns account esdts balance history' }) + @ApiQuery({ name: 'from', description: 'Number of items to skip for the result set', required: false }) + @ApiQuery({ name: 'size', description: 'Number of items to retrieve', required: false }) + @ApiQuery({ name: 'before', description: 'Before timestamp', required: false }) + @ApiQuery({ name: 'after', description: 'After timestamp', required: false }) + @ApiQuery({ name: 'identifier', description: 'Filter by multiple esdt identifiers, comma-separated', required: false }) + @ApiQuery({ name: 'token', description: 'Token identifier', required: false }) + @ApiOkResponse({ type: [AccountEsdtHistory] }) + async getAccountEsdtHistory( + @Param('address', ParseAddressPipe) address: string, + @Query('from', new DefaultValuePipe(0), ParseIntPipe) from: number, + @Query('size', new DefaultValuePipe(25), ParseIntPipe) size: number, + @Query('before', ParseIntPipe) before?: number, + @Query('after', ParseIntPipe) after?: number, + @Query('identifier', ParseArrayPipe) identifier?: string[], + @Query('token', ParseTokenPipe) token?: string, + ): Promise { + return await this.accountService.getAccountEsdtHistory( + address, + new QueryPagination({ from, size }), + new AccountHistoryFilter({ before, after, identifiers: identifier, token })); + } + + @Get("/accounts/:address/esdthistory/count") + @ApiOperation({ summary: 'Account esdts history count', description: 'Returns account esdts balance history count' }) + @ApiQuery({ name: 'before', description: 'Before timestamp', required: false }) + @ApiQuery({ name: 'after', description: 'After timestamp', required: false }) + @ApiQuery({ name: 'identifier', description: 'Filter by multiple esdt identifiers, comma-separated', required: false }) + @ApiQuery({ name: 'token', description: 'Token identifier', required: false }) + async getAccountEsdtHistoryCount( + @Param('address', ParseAddressPipe) address: string, + @Query('before', ParseIntPipe) before?: number, + @Query('after', ParseIntPipe) after?: number, + @Query('identifier', ParseArrayPipe) identifier?: string[], + @Query('token', ParseTokenPipe) token?: string, + ): Promise { + return await this.accountService.getAccountEsdtHistoryCount( + address, + new AccountHistoryFilter({ before, after, identifiers: identifier, token })); + } + + @Get("/accounts/:address/history/:tokenIdentifier") + @ApiOperation({ summary: 'Account token history', description: 'Returns account token balance history' }) + @ApiQuery({ name: 'from', description: 'Number of items to skip for the result set', required: false }) + @ApiQuery({ name: 'size', description: 'Number of items to retrieve', required: false }) + @ApiQuery({ name: 'before', description: 'Before timestamp', required: false }) + @ApiQuery({ name: 'after', description: 'After timestamp', required: false }) + @ApiOkResponse({ type: [AccountEsdtHistory] }) + async getAccountTokenHistory( + @Param('address', ParseAddressPipe) address: string, + @Param('tokenIdentifier', ParseTokenOrNftPipe) tokenIdentifier: string, + @Query('from', new DefaultValuePipe(0), ParseIntPipe) from: number, + @Query('size', new DefaultValuePipe(25), ParseIntPipe) size: number, + @Query('before', ParseIntPipe) before?: number, + @Query('after', ParseIntPipe) after?: number, + ): Promise { + const isToken = await this.tokenService.isToken(tokenIdentifier) || await this.collectionService.isCollection(tokenIdentifier) || await this.nftService.isNft(tokenIdentifier); + if (!isToken) { + throw new NotFoundException(`Token '${tokenIdentifier}' not found`); + } + + return await this.accountService.getAccountTokenHistory( + address, tokenIdentifier, + new QueryPagination({ from, size }), + new AccountHistoryFilter({ before, after })); + } +} diff --git a/src/endpoints/accounts-v2/account.module.v2.ts b/src/endpoints/accounts-v2/account.module.v2.ts new file mode 100644 index 000000000..77418574d --- /dev/null +++ b/src/endpoints/accounts-v2/account.module.v2.ts @@ -0,0 +1,46 @@ +import { forwardRef, Module } from "@nestjs/common"; +import { AssetsModule } from "src/common/assets/assets.module"; +import { PluginModule } from "src/plugins/plugin.module"; +import { CollectionModule } from "../collections/collection.module"; +import { DelegationLegacyModule } from "../delegation.legacy/delegation.legacy.module"; +import { NftModule } from "../nfts/nft.module"; +import { SmartContractResultModule } from "../sc-results/scresult.module"; +import { StakeModule } from "../stake/stake.module"; +import { TokenModule } from "../tokens/token.module"; +import { TransactionModule } from "../transactions/transaction.module"; +import { TransferModule } from "../transfers/transfer.module"; +import { UsernameModule } from "../usernames/username.module"; +import { VmQueryModule } from "../vm.query/vm.query.module"; +import { WaitingListModule } from "../waiting-list/waiting.list.module"; +import { AccountServiceV2 } from "./account.service.v2"; +import { ProviderModule } from "../providers/provider.module"; +import { KeysModule } from "../keys/keys.module"; +import { MongoDbModule } from "src/common/indexer/db/src"; + +@Module({ + imports: [ + VmQueryModule, + forwardRef(() => NftModule), + DelegationLegacyModule, + WaitingListModule, + forwardRef(() => StakeModule), + forwardRef(() => TransactionModule), + forwardRef(() => SmartContractResultModule), + forwardRef(() => CollectionModule), + forwardRef(() => PluginModule), + forwardRef(() => TransferModule), + forwardRef(() => TokenModule), + forwardRef(() => AssetsModule), + forwardRef(() => ProviderModule), + UsernameModule, + forwardRef(() => KeysModule), + MongoDbModule, + ], + providers: [ + AccountServiceV2, + ], + exports: [ + AccountServiceV2, + ], +}) +export class AccountModuleV2 { } diff --git a/src/endpoints/accounts-v2/account.service.v2.ts b/src/endpoints/accounts-v2/account.service.v2.ts new file mode 100644 index 000000000..4a19504e1 --- /dev/null +++ b/src/endpoints/accounts-v2/account.service.v2.ts @@ -0,0 +1,770 @@ +import { forwardRef, HttpStatus, Inject, Injectable } from '@nestjs/common'; +import { AccountDetailed } from './entities/account.detailed'; +import { Account } from './entities/account'; +import { VmQueryService } from 'src/endpoints/vm.query/vm.query.service'; +import { ApiConfigService } from 'src/common/api-config/api.config.service'; +import { AccountDeferred } from './entities/account.deferred'; +import { QueryPagination } from 'src/common/entities/query.pagination'; +import { AccountKey } from './entities/account.key'; +import { DeployedContract } from './entities/deployed.contract'; +import { PluginService } from 'src/common/plugins/plugin.service'; +import { AccountEsdtHistory } from "./entities/account.esdt.history"; +import { AccountHistory } from "./entities/account.history"; +import { StakeService } from '../stake/stake.service'; +import { TransferService } from '../transfers/transfer.service'; +import { TransactionType } from '../transactions/entities/transaction.type'; +import { AssetsService } from 'src/common/assets/assets.service'; +import { TransactionFilter } from '../transactions/entities/transaction.filter'; +import { CacheService } from "@multiversx/sdk-nestjs-cache"; +import { AddressUtils, BinaryUtils, OriginLogger } from '@multiversx/sdk-nestjs-common'; +import { ApiService, ApiUtils } from "@multiversx/sdk-nestjs-http"; +import { GatewayService } from 'src/common/gateway/gateway.service'; +import { IndexerService } from "src/common/indexer/indexer.service"; +import { AccountAssets } from 'src/common/assets/entities/account.assets'; +import { CacheInfo } from 'src/utils/cache.info'; +import { UsernameService } from '../usernames/username.service'; +import { ContractUpgrades } from './entities/contract.upgrades'; +import { AccountVerification } from './entities/account.verification'; +import { AccountQueryOptions } from './entities/account.query.options'; +import { AccountHistoryFilter } from './entities/account.history.filter'; +import { ProtocolService } from 'src/common/protocol/protocol.service'; +import { ProviderService } from '../providers/provider.service'; +import { KeysService } from '../keys/keys.service'; +import { NodeStatusRaw } from '../nodes/entities/node.status'; +import { AccountKeyFilter } from './entities/account.key.filter'; +import { ApplicationMostUsed } from './entities/application.most.used'; +import { AccountContract } from './entities/account.contract'; +import { AccountFetchOptions } from './entities/account.fetch.options'; +import { Provider } from '../providers/entities/provider'; +import { AccountDetailsRepository } from 'src/common/indexer/db/src'; + +@Injectable() +export class AccountServiceV2 { + private readonly logger = new OriginLogger(AccountServiceV2.name); + + constructor( + private readonly indexerService: IndexerService, + private readonly gatewayService: GatewayService, + private readonly cachingService: CacheService, + private readonly vmQueryService: VmQueryService, + private readonly apiConfigService: ApiConfigService, + @Inject(forwardRef(() => PluginService)) + private readonly pluginService: PluginService, + @Inject(forwardRef(() => StakeService)) + private readonly stakeService: StakeService, + @Inject(forwardRef(() => TransferService)) + private readonly transferService: TransferService, + private readonly assetsService: AssetsService, + private readonly usernameService: UsernameService, + private readonly apiService: ApiService, + private readonly protocolService: ProtocolService, + @Inject(forwardRef(() => ProviderService)) + private readonly providerService: ProviderService, + private readonly keysService: KeysService, + private readonly accountDetailsDepository: AccountDetailsRepository, + ) { } + + async getAccountsCount(filter: AccountQueryOptions): Promise { + if (!filter.isSet()) { + return await this.cachingService.getOrSet( + CacheInfo.AccountsCount.key, + async () => await this.indexerService.getAccountsCount(filter), + CacheInfo.AccountsCount.ttl + ); + } + + return await this.indexerService.getAccountsCount(filter); + } + + async getAccount(address: string, options?: AccountFetchOptions): Promise { + if (!AddressUtils.isAddressValid(address)) { + return null; + } + + const account = await this.getAccountRaw(address, options?.withAssets); + if (!account) { + return null; + } + + if (options?.withTxCount === true) { + account.txCount = await this.getAccountTxCount(address); + } + + if (options?.withScrCount === true) { + account.scrCount = await this.getAccountScResults(address); + } + + if (options?.withGuardianInfo === true) { + await this.applyGuardianInfo(account); + } + + if (options?.withTimestamp) { + const elasticSearchAccount = await this.indexerService.getAccount(address); + account.timestamp = elasticSearchAccount.timestamp; + } + + if (AddressUtils.isSmartContractAddress(address)) { + const provider: Provider | undefined = await this.providerService.getProvider(address); + if (provider && provider.owner) { + account.ownerAddress = provider.owner; + } + } + + return account; + } + + async getAccountFromDb(address: string, options?: AccountFetchOptions): Promise { + if (!AddressUtils.isAddressValid(address)) { + return null; + } + + try { + // First try to get account from MongoDB + const accountFromDb = await this.accountDetailsDepository.getAccount(address) as AccountDetailed; + + if (accountFromDb) { + // console.log('Account found in DB:', accountFromDb); + return accountFromDb; + } + + // If not found in DB, call getAccount with the same parameters + return await this.getAccount(address, options); + } catch (error) { + this.logger.error(`Error when getting account from DB for address '${address}'`); + this.logger.error(error); + return null; + } + } + + async applyGuardianInfo(account: AccountDetailed): Promise { + try { + const guardianResult = await this.gatewayService.getGuardianData(account.address); + const guardianData = guardianResult?.guardianData; + if (guardianData) { + const activeGuardian = guardianData.activeGuardian; + if (activeGuardian) { + account.activeGuardianActivationEpoch = activeGuardian.activationEpoch; + account.activeGuardianAddress = activeGuardian.address; + account.activeGuardianServiceUid = activeGuardian.serviceUID; + } + + const pendingGuardian = guardianData.pendingGuardian; + if (pendingGuardian) { + account.pendingGuardianActivationEpoch = pendingGuardian.activationEpoch; + account.pendingGuardianAddress = pendingGuardian.address; + account.pendingGuardianServiceUid = pendingGuardian.serviceUID; + } + + account.isGuarded = guardianData.guarded; + } + } catch (error) { + this.logger.error(`Error when getting guardian data for address '${account.address}'`); + this.logger.error(error); + } + } + + async getAccountVerification(address: string): Promise { + if (!AddressUtils.isAddressValid(address)) { + return null; + } + + const verificationResponse = await this.apiService.get(`${this.apiConfigService.getVerifierUrl()}/verifier/${address}`); + return verificationResponse.data; + } + + async getVerifiedAccounts(): Promise { + const verificationResponse = await this.apiService.get(`${this.apiConfigService.getVerifierUrl()}/verifier`); + return verificationResponse.data; + } + + async getAccountSimple(address: string): Promise { + if (!AddressUtils.isAddressValid(address)) { + return null; + } + + return await this.getAccountRaw(address); + } + + async getAccountRaw(address: string, withAssets?: boolean): Promise { + try { + const { + account: { nonce, balance, code, codeHash, rootHash, developerReward, ownerAddress, codeMetadata }, + } = await this.gatewayService.getAddressDetails(address); + + const shardCount = await this.protocolService.getShardCount(); + const shard = AddressUtils.computeShard(AddressUtils.bech32Decode(address), shardCount); + let account = new AccountDetailed({ address, nonce, balance, code, codeHash, rootHash, shard, developerReward, ownerAddress, scamInfo: undefined, nftCollections: undefined, nfts: undefined }); + + if (withAssets === true) { + const assets = await this.assetsService.getAllAccountAssets(); + account.assets = assets[address]; + account.ownerAssets = assets[ownerAddress]; + } + + const codeAttributes = AddressUtils.decodeCodeMetadata(codeMetadata); + if (codeAttributes) { + account = { ...account, ...codeAttributes }; + } + + if (AddressUtils.isSmartContractAddress(address) && account.code) { + const deployTxHash = await this.getAccountDeployedTxHash(address); + if (deployTxHash) { + account.deployTxHash = deployTxHash; + } + + const deployedAt = await this.getAccountDeployedAt(address); + if (deployedAt) { + account.deployedAt = deployedAt; + } + + const isVerified = await this.getAccountIsVerified(address, account.codeHash); + if (isVerified) { + account.isVerified = isVerified; + } + } + + if (!AddressUtils.isSmartContractAddress(address)) { + account.username = await this.usernameService.getUsernameForAddress(address) ?? undefined; + account.isPayableBySmartContract = undefined; + account.isUpgradeable = undefined; + account.isReadable = undefined; + account.isPayable = undefined; + } + + await this.pluginService.processAccount(account); + return account; + } catch (error) { + this.logger.error(error); + this.logger.error(`Error when getting account details for address '${address}'`); + return null; + } + } + + async getAccountTxCount(address: string): Promise { + return await this.transferService.getTransfersCount(new TransactionFilter({ address, type: TransactionType.Transaction })); + } + + async getAccountScResults(address: string): Promise { + return await this.transferService.getTransfersCount(new TransactionFilter({ address, type: TransactionType.SmartContractResult })); + } + + async getAccountDeployedAt(address: string): Promise { + return await this.cachingService.getOrSet( + CacheInfo.AccountDeployedAt(address).key, + async () => await this.getAccountDeployedAtRaw(address), + CacheInfo.AccountDeployedAt(address).ttl + ); + } + + async getAccountDeployedAtRaw(address: string): Promise { + const scDeploy = await this.indexerService.getScDeploy(address); + if (!scDeploy) { + return null; + } + + const txHash = scDeploy.deployTxHash; + if (!txHash) { + return null; + } + + const transaction = await this.indexerService.getTransaction(txHash); + if (!transaction) { + return null; + } + + return transaction.timestamp; + } + + async getAccountDeployedTxHash(address: string): Promise { + return await this.cachingService.getOrSet( + CacheInfo.AccountDeployTxHash(address).key, + async () => await this.getAccountDeployedTxHashRaw(address), + CacheInfo.AccountDeployTxHash(address).ttl, + ); + } + + async getAccountDeployedTxHashRaw(address: string): Promise { + const scDeploy = await this.indexerService.getScDeploy(address); + if (!scDeploy) { + return null; + } + + return scDeploy.deployTxHash; + } + + async getAccountIsVerified(address: string, codeHash: string): Promise { + return await this.cachingService.getOrSet( + CacheInfo.AccountIsVerified(address).key, + async () => await this.getAccountIsVerifiedRaw(address, codeHash), + CacheInfo.AccountIsVerified(address).ttl + ); + } + + async getAccountIsVerifiedRaw(address: string, codeHash: string): Promise { + try { + // eslint-disable-next-line require-await + const { data } = await this.apiService.get(`${this.apiConfigService.getVerifierUrl()}/verifier/${address}/codehash`, undefined, async (error) => error.response?.status === HttpStatus.NOT_FOUND); + + if (data.codeHash === Buffer.from(codeHash, 'base64').toString('hex')) { + return true; + } + } catch { + // ignore + } + + return null; + } + + async getAccounts(queryPagination: QueryPagination, filter: AccountQueryOptions): Promise { + if (!filter.isSet()) { + return await this.cachingService.getOrSet( + CacheInfo.Accounts(queryPagination).key, + async () => await this.getAccountsRaw(queryPagination, filter), + CacheInfo.Accounts(queryPagination).ttl + ); + } + + return await this.getAccountsRaw(queryPagination, filter); + } + + public async getAccountsForAddresses(addresses: Array): Promise> { + const assets: { [key: string]: AccountAssets; } = await this.assetsService.getAllAccountAssets(); + + const accountsRaw = await this.indexerService.getAccountsForAddresses(addresses); + const accounts: Array = accountsRaw.map(account => ApiUtils.mergeObjects(new Account(), account)); + const shardCount = await this.protocolService.getShardCount(); + + for (const account of accounts) { + account.shard = AddressUtils.computeShard(AddressUtils.bech32Decode(account.address), shardCount); + account.assets = assets[account.address]; + } + + return accounts; + } + + async getAccountsRaw(queryPagination: QueryPagination, options: AccountQueryOptions): Promise { + const result = await this.indexerService.getAccounts(queryPagination, options); + const assets = await this.assetsService.getAllAccountAssets(); + const accounts: Account[] = result.map(item => { + const account = ApiUtils.mergeObjects(new Account(), item); + account.ownerAddress = item.currentOwner; + account.transfersLast24h = item.api_transfersLast24h; + + return account; + }); + + const shardCount = await this.protocolService.getShardCount(); + + const verifiedAccounts = await this.cachingService.get(CacheInfo.VerifiedAccounts.key); + + if (options.addresses && options.addresses.length > 0) { + const gatewayResponse: any = await this.gatewayService.getAccountsBulk(options.addresses); + const finalAccounts: Record = {}; + + for (const address in gatewayResponse) { + if (gatewayResponse.hasOwnProperty(address)) { + finalAccounts[address] = gatewayResponse[address] as AccountDetailed; + } + } + + for (const account of accounts) { + const gatewayAccount = finalAccounts[account.address]; + if (gatewayAccount) { + account.balance = gatewayAccount.balance; + } + } + } + + for (const account of accounts) { + account.shard = AddressUtils.computeShard(AddressUtils.bech32Decode(account.address), shardCount); + account.assets = assets[account.address]; + + if (options.withDeployInfo && AddressUtils.isSmartContractAddress(account.address)) { + const [deployedAt, deployTxHash] = await Promise.all([ + this.getAccountDeployedAt(account.address), + this.getAccountDeployedTxHash(account.address), + ]); + + account.deployedAt = deployedAt; + account.deployTxHash = deployTxHash; + } + + if (options.withTxCount) { + account.txCount = await this.getAccountTxCount(account.address); + } + + if (options.withScrCount) { + account.scrCount = await this.getAccountScResults(account.address); + } + + if (options.withOwnerAssets && account.ownerAddress) { + account.ownerAssets = assets[account.ownerAddress]; + } + + if (verifiedAccounts && verifiedAccounts.includes(account.address)) { + account.isVerified = true; + } + } + + return accounts; + } + + async getDeferredAccount(address: string): Promise { + const publicKey = AddressUtils.bech32Decode(address); + const delegationContractAddress = this.apiConfigService.getDelegationContractAddress(); + if (!delegationContractAddress) { + return []; + } + + const delegationContractShardId = AddressUtils.computeShard(AddressUtils.bech32Decode(delegationContractAddress), await this.protocolService.getShardCount()); + + const [ + encodedUserDeferredPaymentList, + [encodedNumBlocksBeforeUnBond], + { + erd_nonce, + }, + ] = await Promise.all([ + this.vmQueryService.vmQuery( + delegationContractAddress, + 'getUserDeferredPaymentList', + undefined, + [publicKey] + ), + this.vmQueryService.vmQuery( + delegationContractAddress, + 'getNumBlocksBeforeUnBond', + ), + this.gatewayService.getNetworkStatus(`${delegationContractShardId}`), + ]); + + const numBlocksBeforeUnBond = parseInt(BinaryUtils.base64ToBigInt(encodedNumBlocksBeforeUnBond).toString()); + const erdNonce = erd_nonce; + + const data: AccountDeferred[] = encodedUserDeferredPaymentList.reduce((result: AccountDeferred[], _, index, array) => { + if (index % 2 === 0) { + const [encodedDeferredPayment, encodedUnstakedNonce] = array.slice(index, index + 2); + + const deferredPayment = BinaryUtils.base64ToBigInt(encodedDeferredPayment).toString(); + const unstakedNonce = parseInt(BinaryUtils.base64ToBigInt(encodedUnstakedNonce).toString()); + const blocksLeft = Math.max(0, unstakedNonce + numBlocksBeforeUnBond - erdNonce); + const secondsLeft = blocksLeft * 6; // 6 seconds per block + + result.push({ deferredPayment, secondsLeft }); + } + + return result; + }, []); + + return data; + } + + private async getBlsKeysStatusForPublicKey(publicKey: string) { + const auctionContractAddress = this.apiConfigService.getAuctionContractAddress(); + if (!auctionContractAddress) { + return undefined; + } + + return await this.vmQueryService.vmQuery( + auctionContractAddress, + 'getBlsKeysStatus', + auctionContractAddress, + [publicKey], + ); + } + + private async getRewardAddressForNode(blsKey: string): Promise { + const stakingContractAddress = this.apiConfigService.getStakingContractAddress(); + if (!stakingContractAddress) { + return ''; + } + + const [encodedRewardsPublicKey] = await this.vmQueryService.vmQuery( + stakingContractAddress, + 'getRewardAddress', + undefined, + [blsKey], + ); + + const rewardsPublicKey = Buffer.from(encodedRewardsPublicKey, 'base64').toString(); + return AddressUtils.bech32Encode(rewardsPublicKey); + } + + private async getAllNodeStates(address: string) { + return await this.vmQueryService.vmQuery( + address, + 'getAllNodeStates' + ); + } + + async getKeys(address: string, filter: AccountKeyFilter, pagination: QueryPagination): Promise { + const { from, size } = pagination; + const publicKey = AddressUtils.bech32Decode(address); + const isStakingProvider = await this.providerService.isProvider(address); + + let notStakedNodes: AccountKey[] = []; + + if (isStakingProvider) { + const allNodeStates = await this.getAllNodeStates(address); + const inactiveNodesBuffers = this.getInactiveNodesBuffers(allNodeStates); + notStakedNodes = this.createNotStakedNodes(inactiveNodesBuffers); + } + + const blsKeysStatus = await this.getBlsKeysStatusForPublicKey(publicKey); + let nodes: AccountKey[] = []; + + if (blsKeysStatus) { + nodes = this.createAccountKeys(blsKeysStatus); + await this.applyRewardAddressAndTopUpToNodes(nodes, address); + await this.applyNodeUnbondingPeriods(nodes); + await this.updateQueuedNodes(nodes); + } + + let filteredNodes = [...notStakedNodes, ...nodes]; + + if (filter && filter.status && filter.status.length > 0) { + filteredNodes = filteredNodes.filter(node => filter.status.includes(node.status as NodeStatusRaw)); + filteredNodes = this.sortNodesByStatus(filteredNodes, filter.status); + } + + return filteredNodes.slice(from, from + size); + } + + getInactiveNodesBuffers(allNodeStates: string[]): string[] { + if (!allNodeStates) { + return []; + } + + const checkIfCurrentItemIsStatus = (currentNodeData: string) => + Object.values(NodeStatusRaw).includes( + currentNodeData as NodeStatusRaw + ); + + return allNodeStates.reduce( + (totalNodes: string[], currentNodeState, nodeIndex, allNodesDataArray) => { + const decodedData = Buffer.from(currentNodeState, 'base64').toString(); + const isNotStakedStatus = + decodedData === NodeStatusRaw.notStaked; + + const isCurrentItemTheStatus = checkIfCurrentItemIsStatus(decodedData); + + const nextStatusItemIndex = allNodesDataArray.findIndex( + (nodeData, nodeDataIndex) => + nodeIndex < nodeDataIndex + ? checkIfCurrentItemIsStatus(Buffer.from(nodeData, 'base64').toString()) + : false + ); + + if (isCurrentItemTheStatus && nextStatusItemIndex < 0 && isNotStakedStatus) { + return [...totalNodes, ...allNodesDataArray.slice(nodeIndex + 1)]; + } + + if (isCurrentItemTheStatus && isNotStakedStatus) { + return [...totalNodes, ...allNodesDataArray.slice(nodeIndex + 1, nextStatusItemIndex)]; + } + + return totalNodes; + }, + [] + ); + } + + createNotStakedNodes(inactiveNodesBuffers: string[]): AccountKey[] { + return inactiveNodesBuffers.map((inactiveNodeBuffer) => { + const accountKey: AccountKey = new AccountKey(); + accountKey.blsKey = BinaryUtils.padHex(Buffer.from(inactiveNodeBuffer, 'base64').toString('hex')); + accountKey.status = NodeStatusRaw.notStaked; + accountKey.stake = '2500000000000000000000'; + + return accountKey; + }); + } + + createAccountKeys(blsKeysStatus: string[]): AccountKey[] { + const nodes: AccountKey[] = []; + for (let index = 0; index < blsKeysStatus.length; index += 2) { + const [encodedBlsKey, encodedStatus] = blsKeysStatus.slice(index, index + 2); + + const accountKey: AccountKey = new AccountKey(); + accountKey.blsKey = BinaryUtils.padHex(Buffer.from(encodedBlsKey, 'base64').toString('hex')); + accountKey.status = Buffer.from(encodedStatus, 'base64').toString(); + accountKey.stake = '2500000000000000000000'; + + nodes.push(accountKey); + } + return nodes; + } + + private sortNodesByStatus(nodes: AccountKey[], status: NodeStatusRaw[]): AccountKey[] { + return nodes.sorted(node => { + const statusIndex = status.indexOf(node.status as NodeStatusRaw); + return statusIndex === -1 ? status.length : statusIndex; + }); + } + + async applyRewardAddressAndTopUpToNodes(nodes: AccountKey[], address: string) { + if (nodes.length) { + const rewardAddress = await this.getRewardAddressForNode(nodes[0].blsKey); + const { topUp } = await this.stakeService.getAllStakesForNode(address); + + for (const node of nodes) { + node.rewardAddress = rewardAddress; + node.topUp = topUp; + node.remainingUnBondPeriod = undefined; + } + } + } + + async updateQueuedNodes(nodes: AccountKey[]) { + const stakingContractAddress = this.apiConfigService.getStakingContractAddress(); + if (!stakingContractAddress) { + return; + } + + const queuedNodes: string[] = nodes + .filter((node: AccountKey) => node.status === 'queued') + .map(({ blsKey }) => blsKey); + + if (queuedNodes.length) { + const [queueSizeEncoded] = await this.vmQueryService.vmQuery( + stakingContractAddress, + 'getQueueSize', + ); + + if (queueSizeEncoded) { + const queueSize = Buffer.from(queueSizeEncoded, 'base64').toString(); + + const queueIndexes = await Promise.all( + queuedNodes.map((blsKey: string) => + this.vmQueryService.vmQuery( + stakingContractAddress, + 'getQueueIndex', + this.apiConfigService.getAuctionContractAddress(), + [blsKey], + ) + ), + ); + + let index = 0; + for (const queueIndexEncoded of queueIndexes) { + if (queueIndexEncoded) { + const [found] = nodes.filter((x: AccountKey) => x.blsKey === queuedNodes[index]); + + found.queueIndex = Buffer.from(queueIndexEncoded[0], 'base64').toString(); + found.queueSize = queueSize; + + index++; + } + } + } + } + } + + async getAccountDeploys(pagination: QueryPagination, address: string): Promise { + const accountDeployedContracts = await this.indexerService.getAccountDeploys(pagination, address); + const assets = await this.assetsService.getAllAccountAssets(); + + const accounts: DeployedContract[] = accountDeployedContracts.map(contract => ({ + address: contract.contract, + deployTxHash: contract.deployTxHash, + timestamp: contract.timestamp, + assets: assets[contract.contract], + })); + + return accounts; + } + + async getAccountDeploysCount(address: string): Promise { + return await this.indexerService.getAccountDeploysCount(address); + } + + async getAccountContracts(pagination: QueryPagination, address: string): Promise { + const accountContracts = await this.indexerService.getAccountContracts(pagination, address); + const assets = await this.assetsService.getAllAccountAssets(); + + const accounts: DeployedContract[] = accountContracts.map(contract => ({ + address: contract.contract, + deployTxHash: contract.deployTxHash, + timestamp: contract.timestamp, + assets: assets[contract.contract], + })); + + return accounts; + } + + async getAccountContractsCount(address: string): Promise { + return await this.indexerService.getAccountContractsCount(address); + } + + async getContractUpgrades(queryPagination: QueryPagination, address: string): Promise { + const details = await this.indexerService.getScDeploy(address); + if (!details) { + return []; + } + + const upgrades = details.upgrades.map(item => ApiUtils.mergeObjects(new ContractUpgrades(), { + address: item.upgrader, + txHash: item.upgradeTxHash, + codeHash: item.codeHash, + timestamp: item.timestamp, + })).sortedDescending(item => item.timestamp); + + return upgrades.slice(queryPagination.from, queryPagination.from + queryPagination.size); + } + + async getAccountHistory(address: string, pagination: QueryPagination, filter: AccountHistoryFilter): Promise { + const elasticResult = await this.indexerService.getAccountHistory(address, pagination, filter); + return elasticResult.map(item => ApiUtils.mergeObjects(new AccountHistory(), item)); + } + + async getAccountHistoryCount(address: string, filter: AccountHistoryFilter): Promise { + return await this.indexerService.getAccountHistoryCount(address, filter); + } + + async getAccountTokenHistoryCount(address: string, tokenIdentifier: string, filter: AccountHistoryFilter): Promise { + return await this.indexerService.getAccountTokenHistoryCount(address, tokenIdentifier, filter); + } + + async getAccountTokenHistory(address: string, tokenIdentifier: string, pagination: QueryPagination, filter: AccountHistoryFilter): Promise { + const elasticResult = await this.indexerService.getAccountTokenHistory(address, tokenIdentifier, pagination, filter); + return elasticResult.map(item => ApiUtils.mergeObjects(new AccountEsdtHistory(), item)); + } + + async getAccountEsdtHistory(address: string, pagination: QueryPagination, filter: AccountHistoryFilter): Promise { + const elasticResult = await this.indexerService.getAccountEsdtHistory(address, pagination, filter); + return elasticResult.map(item => ApiUtils.mergeObjects(new AccountEsdtHistory(), item)); + } + + async getAccountEsdtHistoryCount(address: string, filter: AccountHistoryFilter): Promise { + return await this.indexerService.getAccountEsdtHistoryCount(address, filter); + } + + private async applyNodeUnbondingPeriods(nodes: AccountKey[]): Promise { + const leavingNodes = nodes.filter(node => node.status === 'unStaked'); + await Promise.all(leavingNodes.map(async node => { + const keyUnbondPeriod = await this.keysService.getKeyUnbondPeriod(node.blsKey); + node.remainingUnBondPeriod = keyUnbondPeriod?.remainingUnBondPeriod; + })); + } + + async getApplicationMostUsed(): Promise { + return await this.cachingService.getOrSet( + CacheInfo.ApplicationMostUsed.key, + async () => await this.getApplicationMostUsedRaw(), + CacheInfo.ApplicationMostUsed.ttl + ); + } + + async getApplicationMostUsedRaw(): Promise { + const transfersLast24hUrl = this.apiConfigService.getAccountExtraDetailsTransfersLast24hUrl(); + if (!transfersLast24hUrl) { + throw new Error('Transfers last 24h URL is not set'); + } + + const { data: mostUsedApplications } = await this.apiService.get(transfersLast24hUrl); + return mostUsedApplications.map((item: any) => new ApplicationMostUsed({ + address: item.key, + transfers24H: item.value, + })); + } +} diff --git a/src/endpoints/accounts-v2/entities/account.contract.ts b/src/endpoints/accounts-v2/entities/account.contract.ts new file mode 100644 index 000000000..e75cf782a --- /dev/null +++ b/src/endpoints/accounts-v2/entities/account.contract.ts @@ -0,0 +1,20 @@ +import { ApiProperty } from "@nestjs/swagger"; +import { AccountAssets } from "src/common/assets/entities/account.assets"; + +export class AccountContract { + constructor(init?: Partial) { + Object.assign(this, init); + } + + @ApiProperty({ type: String }) + address: string = ""; + + @ApiProperty({ type: String }) + deployTxHash: string = ""; + + @ApiProperty({ type: Number }) + timestamp: number = 0; + + @ApiProperty({ type: AccountAssets, nullable: true, description: 'Contract assets' }) + assets: AccountAssets | undefined = undefined; +} diff --git a/src/endpoints/accounts-v2/entities/account.deferred.ts b/src/endpoints/accounts-v2/entities/account.deferred.ts new file mode 100644 index 000000000..ce99c31e1 --- /dev/null +++ b/src/endpoints/accounts-v2/entities/account.deferred.ts @@ -0,0 +1,14 @@ +import { SwaggerUtils } from '@multiversx/sdk-nestjs-common'; +import { ApiProperty } from '@nestjs/swagger'; + +export class AccountDeferred { + constructor(init?: Partial) { + Object.assign(this, init); + } + + @ApiProperty(SwaggerUtils.amountPropertyOptions({ description: 'Deferred payment amount' })) + deferredPayment: string = ''; + + @ApiProperty({ description: 'Seconds left until unbonding time' }) + secondsLeft: number = 0; +} diff --git a/src/endpoints/accounts-v2/entities/account.detailed.ts b/src/endpoints/accounts-v2/entities/account.detailed.ts new file mode 100644 index 000000000..2c9f131ec --- /dev/null +++ b/src/endpoints/accounts-v2/entities/account.detailed.ts @@ -0,0 +1,74 @@ +import { ComplexityEstimation } from "@multiversx/sdk-nestjs-common"; +import { ApiProperty } from "@nestjs/swagger"; +import { ScamInfo } from "src/common/entities/scam-info.dto"; +import { NftCollectionAccount } from "src/endpoints/collections/entities/nft.collection.account"; +import { NftAccount } from "src/endpoints/nfts/entities/nft.account"; +import { Account } from "./account"; + +export class AccountDetailed extends Account { + constructor(init?: Partial) { + super(); + Object.assign(this, init); + } + + @ApiProperty({ description: 'The source code in hex format', required: false }) + code: string = ''; + + @ApiProperty({ description: 'The hash of the source code', required: false }) + codeHash: string = ''; + + @ApiProperty({ description: 'The hash of the root node' }) + rootHash: string = ''; + + @ApiProperty({ description: 'The username specific for this account', nullable: true, required: false }) + username: string | undefined = undefined; + + @ApiProperty({ description: 'The developer reward' }) + developerReward: string = ''; + + @ApiProperty({ description: 'The address in bech 32 format of owner account', required: false }) + ownerAddress: string = ''; + + @ApiProperty({ description: 'Specific property flag for smart contract', type: Boolean, required: false }) + isUpgradeable?: boolean; + + @ApiProperty({ description: 'Specific property flag for smart contract', type: Boolean, required: false }) + isReadable?: boolean; + + @ApiProperty({ description: 'Specific property flag for smart contract', type: Boolean, required: false }) + isPayable?: boolean; + + @ApiProperty({ description: 'Specific property flag for smart contract', type: Boolean, nullable: true, required: false }) + isPayableBySmartContract?: boolean | undefined = undefined; + + @ApiProperty({ type: ScamInfo, nullable: true, required: false }) + scamInfo: ScamInfo | undefined = undefined; + + @ApiProperty({ description: 'Account nft collections', type: Boolean, nullable: true, required: false }) + nftCollections: NftCollectionAccount[] | undefined = undefined; + + @ApiProperty({ description: 'Account nfts', type: Boolean, nullable: true, required: false }) + @ComplexityEstimation({ group: 'nfts', value: 1000 }) + nfts: NftAccount[] | undefined = undefined; + + @ApiProperty({ type: Number, nullable: true, required: false }) + activeGuardianActivationEpoch?: number; + + @ApiProperty({ type: String, nullable: true, required: false }) + activeGuardianAddress?: string; + + @ApiProperty({ type: String, nullable: true, required: false }) + activeGuardianServiceUid?: string; + + @ApiProperty({ type: Number, nullable: true, required: false }) + pendingGuardianActivationEpoch?: number; + + @ApiProperty({ type: String, nullable: true, required: false }) + pendingGuardianAddress?: string; + + @ApiProperty({ type: String, nullable: true, required: false }) + pendingGuardianServiceUid?: string; + + @ApiProperty({ type: Boolean, nullable: true, required: false }) + isGuarded?: boolean; +} diff --git a/src/endpoints/accounts-v2/entities/account.esdt.history.ts b/src/endpoints/accounts-v2/entities/account.esdt.history.ts new file mode 100644 index 000000000..ce48af609 --- /dev/null +++ b/src/endpoints/accounts-v2/entities/account.esdt.history.ts @@ -0,0 +1,15 @@ +import { ApiProperty } from "@nestjs/swagger"; +import { AccountHistory } from "./account.history"; + +export class AccountEsdtHistory extends AccountHistory { + constructor(init?: Partial) { + super(); + Object.assign(this, init); + } + + @ApiProperty({ type: String, example: 'WEGLD-bd4d79' }) + token: string = ''; + + @ApiProperty({ type: String, example: 'XPACHIEVE-5a0519-01' }) + identifier: string | undefined = undefined; +} diff --git a/src/endpoints/accounts-v2/entities/account.fetch.options.ts b/src/endpoints/accounts-v2/entities/account.fetch.options.ts new file mode 100644 index 000000000..367686761 --- /dev/null +++ b/src/endpoints/accounts-v2/entities/account.fetch.options.ts @@ -0,0 +1,11 @@ +export class AccountFetchOptions { + constructor(init?: Partial) { + Object.assign(this, init); + } + + withGuardianInfo?: boolean; + withTxCount?: boolean; + withScrCount?: boolean; + withTimestamp?: boolean; + withAssets?: boolean; +} diff --git a/src/endpoints/accounts-v2/entities/account.history.filter.ts b/src/endpoints/accounts-v2/entities/account.history.filter.ts new file mode 100644 index 000000000..bed36d66a --- /dev/null +++ b/src/endpoints/accounts-v2/entities/account.history.filter.ts @@ -0,0 +1,10 @@ + +export class AccountHistoryFilter { + constructor(init?: Partial) { + Object.assign(this, init); + } + before?: number; + after?: number; + identifiers?: string[]; + token?: string; +} diff --git a/src/endpoints/accounts-v2/entities/account.history.ts b/src/endpoints/accounts-v2/entities/account.history.ts new file mode 100644 index 000000000..4fe64333b --- /dev/null +++ b/src/endpoints/accounts-v2/entities/account.history.ts @@ -0,0 +1,20 @@ +import { SwaggerUtils } from "@multiversx/sdk-nestjs-common"; +import { ApiProperty } from "@nestjs/swagger"; + +export class AccountHistory { + constructor(init?: Partial) { + Object.assign(this, init); + } + + @ApiProperty({ type: String, example: 'erd1qga7ze0l03chfgru0a32wxqf2226nzrxnyhzer9lmudqhjgy7ycqjjyknz' }) + address: string = ''; + + @ApiProperty(SwaggerUtils.amountPropertyOptions()) + balance: string = ''; + + @ApiProperty({ type: Number, example: 10000 }) + timestamp: number = 0; + + @ApiProperty({ type: Boolean, nullable: true, example: true, required: false }) + isSender?: boolean | undefined = undefined; +} diff --git a/src/endpoints/accounts-v2/entities/account.key.filter.ts b/src/endpoints/accounts-v2/entities/account.key.filter.ts new file mode 100644 index 000000000..67f73fade --- /dev/null +++ b/src/endpoints/accounts-v2/entities/account.key.filter.ts @@ -0,0 +1,10 @@ + +import { NodeStatusRaw } from "src/endpoints/nodes/entities/node.status"; + +export class AccountKeyFilter { + constructor(init?: Partial) { + Object.assign(this, init); + } + + status: NodeStatusRaw[] = []; +} diff --git a/src/endpoints/accounts-v2/entities/account.key.ts b/src/endpoints/accounts-v2/entities/account.key.ts new file mode 100644 index 000000000..51a59f4fc --- /dev/null +++ b/src/endpoints/accounts-v2/entities/account.key.ts @@ -0,0 +1,33 @@ + +import { SwaggerUtils } from "@multiversx/sdk-nestjs-common"; +import { ApiProperty } from "@nestjs/swagger"; + +export class AccountKey { + constructor(init?: Partial) { + Object.assign(this, init); + } + + @ApiProperty({ type: String, example: '2ef384d4d38bf3aad5cef34ce6eab047fba6d52b9735dbfdf7591289ed9c26ac7e816c9bb56ebf4f09129f045860f401275a91009befb4dc8ddc24ea4bc597290bd916b9f984c2a415ec9b2cfbc4a09de42c032314e6a21e69daf76302fcaa99' }) + blsKey: string = ''; + + @ApiProperty(SwaggerUtils.amountPropertyOptions()) + stake: string = ''; + + @ApiProperty(SwaggerUtils.amountPropertyOptions()) + topUp: string = ''; + + @ApiProperty({ type: String, example: 'online' }) + status: string = ''; + + @ApiProperty({ type: String, example: 'erd1qga7ze0l03chfgru0a32wxqf2226nzrxnyhzer9lmudqhjgy7ycqjjyknz' }) + rewardAddress: string = ''; + + @ApiProperty({ type: String, nullable: true, example: '2' }) + queueIndex: string | undefined = undefined; + + @ApiProperty({ type: String, nullable: true, example: '100' }) + queueSize: string | undefined = undefined; + + @ApiProperty({ type: Number, example: 10 }) + remainingUnBondPeriod: number | undefined = 0; +} diff --git a/src/endpoints/accounts-v2/entities/account.query.options.ts b/src/endpoints/accounts-v2/entities/account.query.options.ts new file mode 100644 index 000000000..91649d3c1 --- /dev/null +++ b/src/endpoints/accounts-v2/entities/account.query.options.ts @@ -0,0 +1,58 @@ +import { SortOrder } from "src/common/entities/sort.order"; +import { AccountSort } from "./account.sort"; +import { BadRequestException } from "@nestjs/common"; + +export class AccountQueryOptions { + constructor(init?: Partial) { + Object.assign(this, init); + } + + addresses?: string[]; + ownerAddress?: string; + + sort?: AccountSort; + order?: SortOrder; + isSmartContract?: boolean; + withOwnerAssets?: boolean; + withDeployInfo?: boolean; + withTxCount?: boolean; + withScrCount?: boolean; + name?: string; + tags?: string[]; + excludeTags?: string[]; + hasAssets?: boolean; + search?: string; + + validate(size: number) { + if (this.withDeployInfo && size > 25) { + throw new BadRequestException('Size must be less than or equal to 25 when withDeployInfo is set'); + } + + if (this.withTxCount && size > 25) { + throw new BadRequestException('Size must be less than or equal to 25 when withTxCount is set'); + } + + if (this.withScrCount && size > 25) { + throw new BadRequestException('Size must be less than or equal to 25 when withScrCount is set'); + } + + if (this.addresses && this.addresses.length > 25) { + throw new BadRequestException('Addresses array must contain 25 or fewer elements'); + } + } + + isSet(): boolean { + return this.ownerAddress !== undefined || + this.sort !== undefined || + this.order !== undefined || + this.isSmartContract !== undefined || + this.withOwnerAssets !== undefined || + this.withDeployInfo !== undefined || + this.name !== undefined || + this.tags !== undefined || + this.excludeTags !== undefined || + this.hasAssets !== undefined || + this.search !== undefined || + this.addresses !== undefined; + } +} diff --git a/src/endpoints/accounts-v2/entities/account.sort.ts b/src/endpoints/accounts-v2/entities/account.sort.ts new file mode 100644 index 000000000..fbbdfddc4 --- /dev/null +++ b/src/endpoints/accounts-v2/entities/account.sort.ts @@ -0,0 +1,23 @@ +import { registerEnumType } from "@nestjs/graphql"; + +export enum AccountSort { + balance = 'balance', + timestamp = 'timestamp', + transfersLast24h = 'transfersLast24h', +} + +registerEnumType(AccountSort, { + name: 'AccountSort', + description: 'Account Sort object.', + valuesMap: { + balance: { + description: 'Sort by balance.', + }, + timestamp: { + description: 'Sort by timestamp.', + }, + transfersLast24h: { + description: 'Sort by transfersLast24h.', + }, + }, +}); diff --git a/src/endpoints/accounts-v2/entities/account.ts b/src/endpoints/accounts-v2/entities/account.ts new file mode 100644 index 000000000..6403d3cce --- /dev/null +++ b/src/endpoints/accounts-v2/entities/account.ts @@ -0,0 +1,51 @@ +import { SwaggerUtils } from "@multiversx/sdk-nestjs-common"; +import { ApiProperty } from "@nestjs/swagger"; +import { AccountAssets } from "src/common/assets/entities/account.assets"; + +export class Account { + constructor(init?: Partial) { + Object.assign(this, init); + } + + @ApiProperty({ type: String, description: 'Account bech32 address', example: 'erd1qga7ze0l03chfgru0a32wxqf2226nzrxnyhzer9lmudqhjgy7ycqjjyknz' }) + address: string = ''; + + @ApiProperty(SwaggerUtils.amountPropertyOptions({ description: 'Account current balance' })) + balance: string = ''; + + @ApiProperty({ type: Number, description: 'Account current nonce', example: 42 }) + nonce: number = 0; + + @ApiProperty({ type: Number, description: 'Timestamp of the block where the account was first indexed', example: 1676979360 }) + timestamp: number = 0; + + @ApiProperty({ type: Number, description: 'The shard ID allocated to the account', example: 0 }) + shard: number = 0; + + @ApiProperty({ type: String, description: 'Current owner address', required: false }) + ownerAddress: string | undefined = undefined; + + @ApiProperty({ type: AccountAssets, nullable: true, description: 'Account assets', required: false }) + assets: AccountAssets | undefined = undefined; + + @ApiProperty({ description: 'Specific property flag for smart contract', type: Number, required: false }) + deployedAt?: number | null; + + @ApiProperty({ description: 'The contract deploy transaction hash', required: false }) + deployTxHash?: string | null; + + @ApiProperty({ type: AccountAssets, nullable: true, description: 'Account assets', required: false }) + ownerAssets: AccountAssets | undefined = undefined; + + @ApiProperty({ description: 'Specific property flag for smart contract', type: Boolean, required: false }) + isVerified?: boolean; + + @ApiProperty({ description: 'The number of transactions performed on this account' }) + txCount?: number; + + @ApiProperty({ description: 'The number of smart contract results of this account' }) + scrCount?: number; + + @ApiProperty({ type: Number, description: 'Transfers in the last 24 hours', required: false }) + transfersLast24h: number | undefined = undefined; +} diff --git a/src/endpoints/accounts-v2/entities/account.verification.source.ts b/src/endpoints/accounts-v2/entities/account.verification.source.ts new file mode 100644 index 000000000..040cfc251 --- /dev/null +++ b/src/endpoints/accounts-v2/entities/account.verification.source.ts @@ -0,0 +1,13 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class AccountVerificationSource { + constructor(init?: Partial) { + Object.assign(this, init); + } + + @ApiProperty({ description: 'Abi file source' }) + abi: any = ''; + + @ApiProperty({ description: 'Contract source code' }) + contract: any = ''; +} diff --git a/src/endpoints/accounts-v2/entities/account.verification.status.ts b/src/endpoints/accounts-v2/entities/account.verification.status.ts new file mode 100644 index 000000000..996c4447d --- /dev/null +++ b/src/endpoints/accounts-v2/entities/account.verification.status.ts @@ -0,0 +1,4 @@ +export enum AccountVerificationStatus { + success = 'success', + byteCodeChangedSinceLastVerification = 'byteCodeChangedSinceLastVerification' +} diff --git a/src/endpoints/accounts-v2/entities/account.verification.ts b/src/endpoints/accounts-v2/entities/account.verification.ts new file mode 100644 index 000000000..29e72590d --- /dev/null +++ b/src/endpoints/accounts-v2/entities/account.verification.ts @@ -0,0 +1,21 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { AccountVerificationSource } from './account.verification.source'; +import { AccountVerificationStatus } from './account.verification.status'; + +export class AccountVerification { + constructor(init?: Partial) { + Object.assign(this, init); + } + + @ApiProperty({ description: 'Source code hash' }) + codeHash?: string = ''; + + @ApiProperty({ description: 'Source code of contract', type: AccountVerificationSource, required: false }) + source?: any; + + @ApiProperty({ description: 'Verifier process status', enum: AccountVerificationStatus }) + status!: AccountVerificationStatus; + + @ApiProperty({ description: 'File hash for IPFS', required: false }) + ipfsFileHash?: string; +} diff --git a/src/endpoints/accounts-v2/entities/application.most.used.ts b/src/endpoints/accounts-v2/entities/application.most.used.ts new file mode 100644 index 000000000..cf507a4b4 --- /dev/null +++ b/src/endpoints/accounts-v2/entities/application.most.used.ts @@ -0,0 +1,8 @@ +export class ApplicationMostUsed { + constructor(init?: Partial) { + Object.assign(this, init); + } + + address: string = ''; + transfers24H: number = 0; +} diff --git a/src/endpoints/accounts-v2/entities/contract.upgrades.ts b/src/endpoints/accounts-v2/entities/contract.upgrades.ts new file mode 100644 index 000000000..2c7c7c601 --- /dev/null +++ b/src/endpoints/accounts-v2/entities/contract.upgrades.ts @@ -0,0 +1,17 @@ +import { ApiProperty } from "@nestjs/swagger"; +export class ContractUpgrades { + constructor(init?: Partial) { + Object.assign(this, init); + } + @ApiProperty({ type: String, nullable: true, example: 'erd1qga7ze0l03chfgru0a32wxqf2226nzrxnyhzer9lmudqhjgy7ycqjjyknz' }) + address: string = ''; + + @ApiProperty({ type: String, nullable: true, example: '1c8c6b2148f25621fa2c798a2c9a184df61fdd1991aa0af7ea01eb7b89025d2a' }) + txHash: string = ''; + + @ApiProperty({ type: String, nullable: true, example: '1c8c6b2148f25621fa2c798a2c9a184df61fdd1991aa0af7ea01eb7b89025d2a' }) + codeHash: string = ''; + + @ApiProperty({ type: Number, nullable: true, example: '1638577452' }) + timestamp: number = 0; +} diff --git a/src/endpoints/accounts-v2/entities/deployed.contract.ts b/src/endpoints/accounts-v2/entities/deployed.contract.ts new file mode 100644 index 000000000..b2dce1663 --- /dev/null +++ b/src/endpoints/accounts-v2/entities/deployed.contract.ts @@ -0,0 +1,20 @@ +import { ApiProperty } from "@nestjs/swagger"; +import { AccountAssets } from "src/common/assets/entities/account.assets"; + +export class DeployedContract { + constructor(init?: Partial) { + Object.assign(this, init); + } + + @ApiProperty({ type: String }) + address: string = ""; + + @ApiProperty({ type: String }) + deployTxHash: string = ""; + + @ApiProperty({ type: Number }) + timestamp: number = 0; + + @ApiProperty({ type: AccountAssets, nullable: true, required: false, description: 'Contract assets' }) + assets: AccountAssets | undefined = undefined; +} diff --git a/src/endpoints/accounts/account.controller.ts b/src/endpoints/accounts/account.controller.ts index bb39209a9..99d64b859 100644 --- a/src/endpoints/accounts/account.controller.ts +++ b/src/endpoints/accounts/account.controller.ts @@ -637,6 +637,7 @@ export class AccountController { @ApiQuery({ name: 'isScam', description: 'Filter by scam status', required: false, type: Boolean }) @ApiQuery({ name: 'scamType', description: 'Filter by type (scam/potentialScam)', required: false }) @ApiQuery({ name: 'timestamp', description: 'Retrieve entry from timestamp', required: false, type: Number }) + @ApiQuery({ name: 'withReceivedAt', description: 'Include receivedAt timestamp in the response (when the NFT was received by the address)', required: false, type: Boolean }) async getAccountNfts( @Param('address', ParseAddressPipe) address: string, @Query('from', new DefaultValuePipe(0), ParseIntPipe) from: number, @@ -659,7 +660,12 @@ export class AccountController { @Query('isScam', ParseBoolPipe) isScam?: boolean, @Query('scamType', new ParseEnumPipe(ScamType)) scamType?: ScamType, @Query('timestamp', ParseIntPipe) _timestamp?: number, + @Query('withReceivedAt', ParseBoolPipe) withReceivedAt?: boolean, ): Promise { + // Validăm opțiunile de interogare + const queryOptions = new NftQueryOptions({ withSupply, withReceivedAt }); + queryOptions.validate(size); + return await this.nftService.getNftsForAddress( address, new QueryPagination({ from, size }), @@ -680,8 +686,8 @@ export class AccountController { scamType, }), fields, - new NftQueryOptions({ withSupply }), - source + queryOptions, + source, ); } diff --git a/src/endpoints/accounts/account.service.ts b/src/endpoints/accounts/account.service.ts index 96f647f8f..4e350e1c3 100644 --- a/src/endpoints/accounts/account.service.ts +++ b/src/endpoints/accounts/account.service.ts @@ -98,7 +98,9 @@ export class AccountService { if (options?.withTimestamp) { const elasticSearchAccount = await this.indexerService.getAccount(address); - account.timestamp = elasticSearchAccount.timestamp; + if (elasticSearchAccount) { + account.timestamp = elasticSearchAccount.timestamp; + } } if (AddressUtils.isSmartContractAddress(address)) { diff --git a/src/endpoints/blocks/block.service.ts b/src/endpoints/blocks/block.service.ts index 3b8418655..1543f4119 100644 --- a/src/endpoints/blocks/block.service.ts +++ b/src/endpoints/blocks/block.service.ts @@ -9,6 +9,7 @@ import { CacheService } from "@multiversx/sdk-nestjs-cache"; import { IndexerService } from "src/common/indexer/indexer.service"; import { NodeService } from "../nodes/node.service"; import { IdentitiesService } from "../identities/identities.service"; +import { ApiConfigService } from "../../common/api-config/api.config.service"; @Injectable() export class BlockService { @@ -20,13 +21,14 @@ export class BlockService { private readonly nodeService: NodeService, @Inject(forwardRef(() => IdentitiesService)) private readonly identitiesService: IdentitiesService, + private readonly apiConfigService: ApiConfigService, ) { } async getBlocksCount(filter: BlockFilter): Promise { return await this.cachingService.getOrSet( CacheInfo.BlocksCount(filter).key, async () => await this.indexerService.getBlocksCount(filter), - CacheInfo.BlocksCount(filter).ttl + CacheInfo.BlocksCount(filter).ttl, ); } @@ -87,7 +89,7 @@ export class BlockService { if (!blses) { blses = await this.blsService.getPublicKeys(shardId, epoch); - await this.cachingService.setLocal(CacheInfo.ShardAndEpochBlses(shardId, epoch).key, blses, CacheInfo.ShardAndEpochBlses(shardId, epoch).ttl); + this.cachingService.setLocal(CacheInfo.ShardAndEpochBlses(shardId, epoch).key, blses, CacheInfo.ShardAndEpochBlses(shardId, epoch).ttl); } proposer = blses[proposer]; @@ -96,21 +98,27 @@ export class BlockService { validators = validators.map((index: number) => blses[index]); } - return { shardId, epoch, validators, ...rest, proposer }; + return {shardId, epoch, validators, ...rest, proposer}; } async getBlock(hash: string): Promise { const result = await this.indexerService.getBlock(hash) as any; + const isChainAndromedaEnabled = this.apiConfigService.isChainAndromedaEnabled() + && result.epoch >= this.apiConfigService.getChainAndromedaActivationEpoch(); + if (result.round > 0) { const publicKeys = await this.blsService.getPublicKeys(result.shardId, result.epoch); result.proposer = publicKeys[result.proposer]; - result.validators = result.validators.map((validator: number) => publicKeys[validator]); + if (!isChainAndromedaEnabled) { + result.validators = result.validators.map((validator: number) => publicKeys[validator]); + } else { + result.validators = publicKeys; + } } else { result.validators = []; } - const block = BlockDetailed.mergeWithElasticResponse(new BlockDetailed(), result); await this.applyProposerIdentity([block]); @@ -131,7 +139,7 @@ export class BlockService { CacheInfo.BlocksLatest(ttl).key, async () => await this.getLatestBlockRaw(), CacheInfo.BlocksLatest(ttl).ttl, - Math.round(CacheInfo.BlocksLatest(ttl).ttl / 10) + Math.round(CacheInfo.BlocksLatest(ttl).ttl / 10), ); } diff --git a/src/endpoints/caching/local.cache.controller.ts b/src/endpoints/caching/local.cache.controller.ts index c278c05f5..1d492c8d7 100644 --- a/src/endpoints/caching/local.cache.controller.ts +++ b/src/endpoints/caching/local.cache.controller.ts @@ -36,8 +36,8 @@ export class LocalCacheController { status: 200, description: 'Key has been updated', }) - async setCache(@Param('key') key: string, @Body() cacheValue: CacheValue) { - await this.cachingService.setLocal(key, cacheValue.value, cacheValue.ttl); + setCache(@Param('key') key: string, @Body() cacheValue: CacheValue) { + this.cachingService.setLocal(key, cacheValue.value, cacheValue.ttl); } @UseGuards(NativeAuthGuard, JwtAdminGuard) diff --git a/src/endpoints/collections/collection.service.ts b/src/endpoints/collections/collection.service.ts index ecff14fd2..b86af5fd5 100644 --- a/src/endpoints/collections/collection.service.ts +++ b/src/endpoints/collections/collection.service.ts @@ -243,8 +243,8 @@ export class CollectionService { } } - async getNftCollectionRoles(elasticCollection: any): Promise { - return await this.getNftCollectionRolesFromElasticResponse(elasticCollection); + getNftCollectionRoles(elasticCollection: any): CollectionRoles[] { + return this.getNftCollectionRolesFromElasticResponse(elasticCollection); } async getNftCollectionRolesFromGateway(elasticCollection: any): Promise { diff --git a/src/endpoints/dapp-config/dapp.config.controller.ts b/src/endpoints/dapp-config/dapp.config.controller.ts index d782ce123..4702138ce 100644 --- a/src/endpoints/dapp-config/dapp.config.controller.ts +++ b/src/endpoints/dapp-config/dapp.config.controller.ts @@ -14,8 +14,8 @@ export class DappConfigController { @ApiOperation({ summary: 'Dapp configuration', description: 'Returns configuration used in dapps' }) @ApiOkResponse({ type: DappConfig }) @ApiNotFoundResponse({ description: 'Network configuration not found' }) - getDappConfiguration(): DappConfig { - const configuration = this.dappConfigService.getDappConfiguration(); + async getDappConfiguration(): Promise { + const configuration = await this.dappConfigService.getDappConfiguration(); if (!configuration) { throw new NotFoundException(`Network configuration not found`); } diff --git a/src/endpoints/dapp-config/dapp.config.service.ts b/src/endpoints/dapp-config/dapp.config.service.ts index bbc324871..1e6a00712 100644 --- a/src/endpoints/dapp-config/dapp.config.service.ts +++ b/src/endpoints/dapp-config/dapp.config.service.ts @@ -2,6 +2,7 @@ import { FileUtils } from "@multiversx/sdk-nestjs-common"; import { Injectable } from "@nestjs/common"; import { ApiConfigService } from "src/common/api-config/api.config.service"; import { DappConfig } from "./entities/dapp-config"; +import { GatewayService } from "src/common/gateway/gateway.service"; @Injectable() export class DappConfigService { @@ -9,11 +10,26 @@ export class DappConfigService { constructor( private readonly apiConfigService: ApiConfigService, + private readonly gatewayService: GatewayService, ) { this.dappConfig = this.getDappConfigurationRaw(); } - getDappConfiguration(): DappConfig | undefined { + async getDappConfiguration(): Promise { + if (!this.dappConfig) { + return undefined; + } + + const networkConfig = await this.gatewayService.getNetworkConfig(); + const refreshRate = networkConfig.erd_round_duration; + + if (refreshRate) { + return { + ...this.dappConfig, + refreshRate, + }; + } + return this.dappConfig; } diff --git a/src/endpoints/dapp-config/entities/dapp-config.ts b/src/endpoints/dapp-config/entities/dapp-config.ts index 4044f06ef..3dbd0e34c 100644 --- a/src/endpoints/dapp-config/entities/dapp-config.ts +++ b/src/endpoints/dapp-config/entities/dapp-config.ts @@ -43,4 +43,7 @@ export class DappConfig { @ApiProperty({ type: String, example: '1' }) chainId: string = ''; + + @ApiProperty({ type: Number, example: 6000 }) + refreshRate: number = 0; } diff --git a/src/endpoints/endpoints.controllers.module.ts b/src/endpoints/endpoints.controllers.module.ts index 318e527f0..0c2bb08d5 100644 --- a/src/endpoints/endpoints.controllers.module.ts +++ b/src/endpoints/endpoints.controllers.module.ts @@ -39,6 +39,8 @@ import { PoolController } from "./pool/pool.controller"; import { TpsController } from "./tps/tps.controller"; import { ApplicationController } from "./applications/application.controller"; import { EventsController } from "./events/events.controller"; +import { AccountControllerV2 } from "./accounts-v2/account.controller.v2"; +import { MediaController } from "./media/media.controller"; @Module({}) export class EndpointsControllersModule { @@ -49,7 +51,8 @@ export class EndpointsControllersModule { ProviderController, GatewayProxyController, RoundController, SmartContractResultController, ShardController, StakeController, StakeController, TokenController, TransactionController, UsernameController, VmQueryController, WaitingListController, HealthCheckController, DappConfigController, WebsocketController, TransferController, - ProcessNftsPublicController, TransactionsBatchController, ApplicationController, EventsController, + ProcessNftsPublicController, TransactionsBatchController, ApplicationController, EventsController, AccountControllerV2, + MediaController, ]; const isMarketplaceFeatureEnabled = configuration().features?.marketplace?.enabled ?? false; diff --git a/src/endpoints/endpoints.services.module.ts b/src/endpoints/endpoints.services.module.ts index fc8531828..32f14949a 100644 --- a/src/endpoints/endpoints.services.module.ts +++ b/src/endpoints/endpoints.services.module.ts @@ -36,6 +36,8 @@ import { PoolModule } from "./pool/pool.module"; import { TpsModule } from "./tps/tps.module"; import { ApplicationModule } from "./applications/application.module"; import { EventsModule } from "./events/events.module"; +import { AccountModuleV2 } from "./accounts-v2/account.module.v2"; +import { MediaModule } from "./media/media.module"; @Module({ imports: [ @@ -77,13 +79,15 @@ import { EventsModule } from "./events/events.module"; TpsModule, ApplicationModule, EventsModule, + AccountModuleV2, + MediaModule, ], exports: [ AccountModule, CollectionModule, BlockModule, DelegationModule, DelegationLegacyModule, IdentitiesModule, KeysModule, MiniBlockModule, NetworkModule, NftModule, NftMediaModule, TagModule, NodeModule, ProviderModule, RoundModule, SmartContractResultModule, ShardModule, StakeModule, TokenModule, RoundModule, TransactionModule, UsernameModule, VmQueryModule, WaitingListModule, EsdtModule, BlsModule, DappConfigModule, TransferModule, PoolModule, TransactionActionModule, WebsocketModule, MexModule, - ProcessNftsModule, NftMarketplaceModule, TransactionsBatchModule, TpsModule, ApplicationModule, EventsModule, + ProcessNftsModule, NftMarketplaceModule, TransactionsBatchModule, TpsModule, ApplicationModule, EventsModule, AccountModuleV2, MediaModule, ], }) export class EndpointsServicesModule { } diff --git a/src/endpoints/esdt/esdt.address.service.ts b/src/endpoints/esdt/esdt.address.service.ts index 566759eb7..fa625f182 100644 --- a/src/endpoints/esdt/esdt.address.service.ts +++ b/src/endpoints/esdt/esdt.address.service.ts @@ -24,6 +24,7 @@ import { IndexerService } from "src/common/indexer/indexer.service"; import { TrieOperationsTimeoutError } from "./exceptions/trie.operations.timeout.error"; import { CacheInfo } from "src/utils/cache.info"; import { AssetsService } from "src/common/assets/assets.service"; +import { NftQueryOptions } from "../nfts/entities/nft.query.options"; @Injectable() export class EsdtAddressService { @@ -46,16 +47,16 @@ export class EsdtAddressService { this.NFT_THUMBNAIL_PREFIX = this.apiConfigService.getExternalMediaUrl() + '/nfts/asset'; } - async getNftsForAddress(address: string, filter: NftFilter, pagination: QueryPagination, source?: EsdtDataSource): Promise { + async getNftsForAddress(address: string, filter: NftFilter, pagination: QueryPagination, source?: EsdtDataSource, options?: NftQueryOptions): Promise { if (filter.identifiers && filter.identifiers.length === 1) { - return await this.getNftsForAddressFromGatewayWithElasticFallback(address, filter, pagination); + return await this.getNftsForAddressFromGatewayWithElasticFallback(address, filter, pagination, options); } if (source === EsdtDataSource.elastic || AddressUtils.isSmartContractAddress(address)) { - return await this.getNftsForAddressFromElastic(address, filter, pagination); + return await this.getNftsForAddressFromElastic(address, filter, pagination, options); } - return await this.getNftsForAddressFromGatewayWithElasticFallback(address, filter, pagination); + return await this.getNftsForAddressFromGatewayWithElasticFallback(address, filter, pagination, options); } async getNftCountForAddressFromElastic(address: string, filter: NftFilter): Promise { @@ -66,7 +67,7 @@ export class EsdtAddressService { return await this.indexerService.getCollectionCountForAddress(address, filter); } - private async getNftsForAddressFromElastic(address: string, filter: NftFilter, pagination: QueryPagination): Promise { + private async getNftsForAddressFromElastic(address: string, filter: NftFilter, pagination: QueryPagination, options?: NftQueryOptions): Promise { const esdts = await this.indexerService.getNftsForAddress(address, filter, pagination) as any; const gatewayNfts: GatewayNft[] = []; @@ -93,7 +94,7 @@ export class EsdtAddressService { const nfts: GatewayNft[] = Object.values(gatewayNfts).map(x => x as any).filter(x => x.tokenIdentifier.split('-').length === 3); - const nftAccounts: NftAccount[] = await this.mapToNftAccount(nfts); + const nftAccounts: NftAccount[] = await this.mapToNftAccount(nfts, address, pagination, options); return nftAccounts; } @@ -190,25 +191,25 @@ export class EsdtAddressService { } } - private async getNftsForAddressFromGatewayWithElasticFallback(address: string, filter: NftFilter, pagination: QueryPagination): Promise { + private async getNftsForAddressFromGatewayWithElasticFallback(address: string, filter: NftFilter, pagination: QueryPagination, options?: NftQueryOptions): Promise { const isTrieTimeout = await this.cachingService.get(CacheInfo.AddressEsdtTrieTimeout(address).key); if (isTrieTimeout) { - return await this.getNftsForAddressFromElastic(address, filter, pagination); + return await this.getNftsForAddressFromElastic(address, filter, pagination, options); } try { - return await this.getNftsForAddressFromGateway(address, filter, pagination); + return await this.getNftsForAddressFromGateway(address, filter, pagination, options); } catch (error) { if (error instanceof TrieOperationsTimeoutError) { await this.cachingService.set(CacheInfo.AddressEsdtTrieTimeout(address).key, true, CacheInfo.AddressEsdtTrieTimeout(address).ttl); - return await this.getNftsForAddressFromElastic(address, filter, pagination); + return await this.getNftsForAddressFromElastic(address, filter, pagination, options); } throw error; } } - private async getNftsForAddressFromGateway(address: string, filter: NftFilter, pagination: QueryPagination): Promise { + private async getNftsForAddressFromGateway(address: string, filter: NftFilter, pagination: QueryPagination, options?: NftQueryOptions): Promise { let esdts: Record = {}; if (filter.identifiers && filter.identifiers.length === 1) { @@ -244,12 +245,12 @@ export class EsdtAddressService { const collator = new Intl.Collator('en', { sensitivity: 'base' }); nfts.sort((a: GatewayNft, b: GatewayNft) => collator.compare(a.tokenIdentifier, b.tokenIdentifier)); - const nftAccounts: NftAccount[] = await this.mapToNftAccount(nfts); + const nftAccounts: NftAccount[] = await this.mapToNftAccount(nfts, address, pagination, options); return this.filterEsdtsForAddressFromGateway(filter, pagination, nftAccounts); } - private async mapToNftAccount(nfts: GatewayNft[]): Promise { + private async mapToNftAccount(nfts: GatewayNft[], address?: string, pagination?: QueryPagination, options?: NftQueryOptions): Promise { const nftAccounts: NftAccount[] = []; for (const dataSourceNft of nfts) { @@ -311,9 +312,33 @@ export class EsdtAddressService { nftAccounts.push(nft); } + if (address && pagination) { + await this.batchFetchReceivedAtTimestamps(nftAccounts, address, options); + } + return nftAccounts; } + private async batchFetchReceivedAtTimestamps(nftAccounts: NftAccount[], address: string, options?: NftQueryOptions): Promise { + try { + if (!options || !options.withReceivedAt || nftAccounts.length === 0) { + return; + } + + const identifiers = nftAccounts.map(nft => nft.identifier); + + const identifierToTimestamp = await this.indexerService.getAccountNftReceivedTimestamps(address, identifiers); + + for (const nft of nftAccounts) { + if (identifierToTimestamp[nft.identifier]) { + nft.receivedAt = identifierToTimestamp[nft.identifier]; + } + } + } catch (error) { + this.logger.error('Error in batchFetchReceivedAtTimestamps', error); + } + } + private async getAllEsdtsForAddressFromGatewayRaw(address: string): Promise<{ [key: string]: any }> { // eslint-disable-next-line require-await const esdtResult = await this.gatewayService.get(`address/${address}/esdt`, GatewayComponentRequest.addressEsdt, async (error) => { @@ -367,7 +392,7 @@ export class EsdtAddressService { const ttl = await this.protocolService.getSecondsRemainingUntilNextRound(); - await this.cachingService.setLocal(`address:${address}:esdts`, esdts, ttl); + this.cachingService.setLocal(`address:${address}:esdts`, esdts, ttl); return esdts; } diff --git a/src/endpoints/esdt/esdt.service.ts b/src/endpoints/esdt/esdt.service.ts index 8f3b117e8..8489db69e 100644 --- a/src/endpoints/esdt/esdt.service.ts +++ b/src/endpoints/esdt/esdt.service.ts @@ -227,7 +227,7 @@ export class EsdtService { canAddSpecialRoles: elasticProperties.properties?.canAddSpecialRoles ?? false, canTransferNFTCreateRole: elasticProperties.properties?.canTransferNFTCreateRole ?? false, NFTCreateStopped: elasticProperties.properties?.NFTCreateStopped ?? false, - isPaused: elasticProperties.properties?.isPaused ?? false, + isPaused: elasticProperties.paused ?? false, timestamp: elasticProperties.timestamp, }); diff --git a/src/endpoints/identities/entities/identity.sort.criteria.ts b/src/endpoints/identities/entities/identity.sort.criteria.ts index 6b5231941..531f1ad3d 100644 --- a/src/endpoints/identities/entities/identity.sort.criteria.ts +++ b/src/endpoints/identities/entities/identity.sort.criteria.ts @@ -1,4 +1,5 @@ export enum IdentitySortCriteria { validators = 'validators', - stake = 'stake' + stake = 'stake', + locked = 'locked' } diff --git a/src/endpoints/identities/identities.controller.ts b/src/endpoints/identities/identities.controller.ts index cc9c7bcc6..9a3c15034 100644 --- a/src/endpoints/identities/identities.controller.ts +++ b/src/endpoints/identities/identities.controller.ts @@ -1,4 +1,4 @@ -import { ParseArrayPipe, ParseEnumPipe } from "@multiversx/sdk-nestjs-common"; +import { ParseArrayPipe, ParseEnumArrayPipe } from "@multiversx/sdk-nestjs-common"; import { Controller, DefaultValuePipe, Get, HttpException, HttpStatus, Param, ParseIntPipe, Query, Res } from "@nestjs/common"; import { ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiQuery, ApiTags } from "@nestjs/swagger"; import { Identity } from "./entities/identity"; @@ -18,12 +18,12 @@ export class IdentitiesController { @ApiQuery({ name: 'from', description: 'Number of items to skip for the result set', required: false }) @ApiQuery({ name: 'size', description: 'Number of items to retrieve', required: false }) @ApiQuery({ name: 'identities', description: 'Filter by comma-separated list of identities', required: false }) - @ApiQuery({ name: 'sort', description: 'Sort criteria (validators)', required: false, enum: IdentitySortCriteria }) + @ApiQuery({ name: 'sort', description: 'Sort criteria (comma-separated list: validators,stake,locked)', required: false }) async getIdentities( @Query('from', new DefaultValuePipe(0), ParseIntPipe) from: number, @Query('size', new DefaultValuePipe(10000), ParseIntPipe) size: number, @Query('identities', ParseArrayPipe) identities: string[] = [], - @Query('sort', new ParseEnumPipe(IdentitySortCriteria)) sort?: IdentitySortCriteria, + @Query('sort', new ParseEnumArrayPipe(IdentitySortCriteria)) sort?: IdentitySortCriteria[], ): Promise { return await this.identitiesService.getIdentities(new QueryPagination({ from, size }), identities, sort); } diff --git a/src/endpoints/identities/identities.service.ts b/src/endpoints/identities/identities.service.ts index 74bb032b1..37215be60 100644 --- a/src/endpoints/identities/identities.service.ts +++ b/src/endpoints/identities/identities.service.ts @@ -40,22 +40,47 @@ export class IdentitiesService { return identity ? identity.avatar : undefined; } - async getIdentities(queryPagination: QueryPagination, ids: string[], sort?: IdentitySortCriteria): Promise { + async getIdentities(queryPagination: QueryPagination, ids: string[], sort?: IdentitySortCriteria[]): Promise { const { from, size } = queryPagination; let identities = await this.getAllIdentities(); if (ids.length > 0) { identities = identities.filter(x => x.identity && ids.includes(x.identity)); } - switch (sort) { + if (sort && sort.length > 0) { + identities = identities.sort((a, b) => this.compareWithCriteria(a, b, sort, 0)); + } + + return identities.slice(from, from + size); + } + + private compareWithCriteria(a: Identity, b: Identity, criteria: IdentitySortCriteria[], currentIndex: number): number { + if (currentIndex >= criteria.length) { + return 0; + } + + const currentCriterion = criteria[currentIndex]; + let comparison: number; + + switch (currentCriterion) { case IdentitySortCriteria.validators: - identities = identities.sortedDescending(x => x.validators ?? 0); + comparison = (b.validators ?? 0) - (a.validators ?? 0); break; case IdentitySortCriteria.stake: - identities = identities.sortedDescending(x => Number(x.stake) ?? 0); + comparison = Number(b.stake ?? '0') - Number(a.stake ?? '0'); + break; + case IdentitySortCriteria.locked: + comparison = Number(b.locked ?? '0') - Number(a.locked ?? '0'); + break; + default: + comparison = 0; } - return identities.slice(from, from + size); + if (comparison === 0 && currentIndex < criteria.length - 1) { + return this.compareWithCriteria(a, b, criteria, currentIndex + 1); + } + + return comparison; } async getAllIdentities(): Promise { diff --git a/src/endpoints/media/media.controller.ts b/src/endpoints/media/media.controller.ts new file mode 100644 index 000000000..e4ece3ead --- /dev/null +++ b/src/endpoints/media/media.controller.ts @@ -0,0 +1,66 @@ +import { Controller, Get, InternalServerErrorException, NotFoundException, Param, Req, Res } from "@nestjs/common"; +import { ApiTags } from "@nestjs/swagger"; +import { Request, Response } from "express"; +import { MediaService } from "./media.service"; +import { ApiService } from "@multiversx/sdk-nestjs-http"; +import { OriginLogger } from "@multiversx/sdk-nestjs-common"; +import https from 'https'; + +@Controller() +@ApiTags('media') +export class MediaController { + private readonly logger = new OriginLogger(MediaController.name); + + constructor( + private readonly mediaService: MediaService, + private readonly apiService: ApiService, + ) { } + + @Get("/media/:uri(*)") + async redirectToMediaUri( + @Param('uri') uri: string, + @Req() req: Request, + @Res() res: Response + ) { + const redirectUrl = await this.mediaService.getRedirectUrl(uri); + if (!redirectUrl) { + throw new NotFoundException('Not found'); + } + + try { + const response = await this.apiService.get(redirectUrl, { + // @ts-ignore + responseType: 'stream', + timeout: 60_000, // 60 seconds timeout + httpsAgent: new https.Agent({ rejectUnauthorized: false }), + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36', + }, + }); + + res.setHeader('content-type', response.headers['content-type']); + res.setHeader('content-length', response.headers['content-length']); + res.setHeader('cache-control', 'max-age=60'); + res.setHeader('Access-Control-Allow-Origin', '*'); + + response.data.pipe(res); + + response.data.on('error', (error: any) => { + this.logger?.error(`Error streaming the resource: ${redirectUrl}`); + this.logger?.error(error); + + throw new InternalServerErrorException('Failed to fetch URL'); + }); + + req.on('close', () => { + response.data?.destroy(); + }); + + return; + } catch (error) { + this.logger.error(`Failed to fetch URL: ${redirectUrl}`); + + throw new InternalServerErrorException('Failed to fetch URL'); + } + } +} diff --git a/src/endpoints/media/media.module.ts b/src/endpoints/media/media.module.ts new file mode 100644 index 000000000..95360285a --- /dev/null +++ b/src/endpoints/media/media.module.ts @@ -0,0 +1,13 @@ +import { Module } from "@nestjs/common"; +import { MediaService } from "./media.service"; + +@Module({ + imports: [], + providers: [ + MediaService, + ], + exports: [ + MediaService, + ], +}) +export class MediaModule { } diff --git a/src/endpoints/media/media.service.ts b/src/endpoints/media/media.service.ts new file mode 100644 index 000000000..8f357c654 --- /dev/null +++ b/src/endpoints/media/media.service.ts @@ -0,0 +1,67 @@ +import { OriginLogger } from "@multiversx/sdk-nestjs-common"; +import { ApiService } from "@multiversx/sdk-nestjs-http"; +import { Injectable } from "@nestjs/common"; +import { ApiConfigService } from "src/common/api-config/api.config.service"; + +@Injectable() +export class MediaService { + private readonly logger = new OriginLogger(MediaService.name); + + private readonly fallbackThumbnail = 'nfts/thumbnail/default.png'; + + constructor( + private readonly apiConfigService: ApiConfigService, + private readonly apiService: ApiService, + ) { } + + public async getRedirectUrl(uri: string): Promise { + const isFeatureEnabled = this.apiConfigService.isMediaRedirectFeatureEnabled(); + if (!isFeatureEnabled) { + // TODO: throw error + // throw new BadRequestException('Media redirect is not allowed'); + } + + // providers logos + if (uri.startsWith('providers/asset/')) { + const awsUri = uri.replace('providers/asset/', 'keybase_processed_uploads/'); + return `https://s3.amazonaws.com/${awsUri}`; + } + + // esdts logos + if (uri.startsWith('tokens/asset/')) { + const network = this.apiConfigService.getNetwork(); + const tokenUri = network === 'mainnet' + ? uri.replace('tokens/asset/', 'multiversx/mx-assets/master/tokens/') + : uri.replace('tokens/asset/', `multiversx/mx-assets/master/${network}/tokens/`); + return `https://raw.githubusercontent.com/${tokenUri}`; + } + + const fileStorageUrls = this.apiConfigService.getMediaRedirectFileStorageUrls(); + for (const fileStorageUrl of fileStorageUrls) { + try { + const { status } = await this.apiService.head(`${fileStorageUrl}/${uri}`, { + validateStatus: () => true, + }); + if (200 <= status && status <= 300) { + return `${fileStorageUrl}/${uri}`; + } + } catch { + this.logger.error(`Could not fetch ${fileStorageUrl}/${uri}`); + continue; + } + } + + // nfts assets' ipfs mirror + if (uri.startsWith('nfts/asset/')) { + const ipfsUri = uri.replace('nfts/asset/', 'ipfs/'); + return `https://ipfs.io/${ipfsUri}`; + } + + // fallback for nft thumbnails + if (uri.startsWith('nfts/thumbnail/') && uri !== this.fallbackThumbnail && fileStorageUrls.length > 0) { + return `${fileStorageUrls[0]}/${this.fallbackThumbnail}`; + } + + return undefined; + } +} diff --git a/src/endpoints/mex/mex.farm.service.ts b/src/endpoints/mex/mex.farm.service.ts index 4cebd7b1f..d907766d2 100644 --- a/src/endpoints/mex/mex.farm.service.ts +++ b/src/endpoints/mex/mex.farm.service.ts @@ -24,7 +24,7 @@ export class MexFarmService { async refreshMexFarms(): Promise { const farms = await this.getAllMexFarmsRaw(); await this.cachingService.setRemote(CacheInfo.MexFarms.key, farms, CacheInfo.MexFarms.ttl); - await this.cachingService.setLocal(CacheInfo.MexFarms.key, farms, Constants.oneSecond() * 30); + this.cachingService.setLocal(CacheInfo.MexFarms.key, farms, Constants.oneSecond() * 30); } async getMexFarms(pagination: QueryPagination): Promise { diff --git a/src/endpoints/mex/mex.pair.service.ts b/src/endpoints/mex/mex.pair.service.ts index a3ad3824c..21a1960e7 100644 --- a/src/endpoints/mex/mex.pair.service.ts +++ b/src/endpoints/mex/mex.pair.service.ts @@ -28,7 +28,7 @@ export class MexPairService { async refreshMexPairs(): Promise { const pairs = await this.getAllMexPairsRaw(false); await this.cachingService.setRemote(CacheInfo.MexPairs.key, pairs, CacheInfo.MexPairs.ttl); - await this.cachingService.setLocal(CacheInfo.MexPairs.key, pairs, Constants.oneSecond() * 30); + this.cachingService.setLocal(CacheInfo.MexPairs.key, pairs, Constants.oneSecond() * 30); } async getMexPairs(from: number, size: number, filter?: MexPairsFilter): Promise { diff --git a/src/endpoints/mex/mex.settings.service.ts b/src/endpoints/mex/mex.settings.service.ts index 243c8a6f9..1a53b84aa 100644 --- a/src/endpoints/mex/mex.settings.service.ts +++ b/src/endpoints/mex/mex.settings.service.ts @@ -37,11 +37,11 @@ export class MexSettingsService { async refreshSettings(): Promise { const settings = await this.getSettingsRaw(); await this.cachingService.setRemote(CacheInfo.MexSettings.key, settings, CacheInfo.MexSettings.ttl); - await this.cachingService.setLocal(CacheInfo.MexSettings.key, settings, Constants.oneMinute() * 10); + this.cachingService.setLocal(CacheInfo.MexSettings.key, settings, Constants.oneMinute() * 10); const contracts = await this.getMexContractsRaw(); await this.cachingService.setRemote(CacheInfo.MexContracts.key, contracts, CacheInfo.MexContracts.ttl); - await this.cachingService.setLocal(CacheInfo.MexContracts.key, contracts, Constants.oneMinute() * 10); + this.cachingService.setLocal(CacheInfo.MexContracts.key, contracts, Constants.oneMinute() * 10); } async getSettings(): Promise { @@ -65,7 +65,7 @@ export class MexSettingsService { let contracts = await this.cachingService.getLocal>(CacheInfo.MexContracts.key); if (!contracts) { contracts = await this.getMexContractsRaw(); - await this.cachingService.setLocal(CacheInfo.MexContracts.key, contracts, Constants.oneMinute() * 10); + this.cachingService.setLocal(CacheInfo.MexContracts.key, contracts, Constants.oneMinute() * 10); } return contracts; diff --git a/src/endpoints/mex/mex.token.service.ts b/src/endpoints/mex/mex.token.service.ts index 7907bf258..7bb8f1dc2 100644 --- a/src/endpoints/mex/mex.token.service.ts +++ b/src/endpoints/mex/mex.token.service.ts @@ -31,19 +31,19 @@ export class MexTokenService { async refreshMexTokens(): Promise { const tokens = await this.getAllMexTokensRaw(); await this.cachingService.setRemote(CacheInfo.MexTokens.key, tokens, CacheInfo.MexTokens.ttl); - await this.cachingService.setLocal(CacheInfo.MexTokens.key, tokens, Constants.oneSecond() * 30); + this.cachingService.setLocal(CacheInfo.MexTokens.key, tokens, Constants.oneSecond() * 30); const tokenTypes = await this.getAllMexTokenTypesRaw(); await this.cachingService.setRemote(CacheInfo.MexTokenTypes.key, tokenTypes, CacheInfo.MexTokenTypes.ttl); - await this.cachingService.setLocal(CacheInfo.MexTokenTypes.key, tokenTypes, Constants.oneSecond() * 30); + this.cachingService.setLocal(CacheInfo.MexTokenTypes.key, tokenTypes, Constants.oneSecond() * 30); const indexedTokens = await this.getIndexedMexTokensRaw(); await this.cachingService.setRemote(CacheInfo.MexTokensIndexed.key, indexedTokens, CacheInfo.MexTokensIndexed.ttl); - await this.cachingService.setLocal(CacheInfo.MexTokensIndexed.key, indexedTokens, Constants.oneSecond() * 30); + this.cachingService.setLocal(CacheInfo.MexTokensIndexed.key, indexedTokens, Constants.oneSecond() * 30); const indexedPrices = await this.getMexPricesRaw(); await this.cachingService.setRemote(CacheInfo.MexPrices.key, indexedPrices, CacheInfo.MexPrices.ttl); - await this.cachingService.setLocal(CacheInfo.MexPrices.key, indexedPrices, Constants.oneSecond() * 30); + this.cachingService.setLocal(CacheInfo.MexPrices.key, indexedPrices, Constants.oneSecond() * 30); } async getMexTokens(queryPagination: QueryPagination): Promise { diff --git a/src/endpoints/mex/mex.warmer.service.ts b/src/endpoints/mex/mex.warmer.service.ts index 96f4fd6be..b32a00d95 100644 --- a/src/endpoints/mex/mex.warmer.service.ts +++ b/src/endpoints/mex/mex.warmer.service.ts @@ -56,10 +56,10 @@ export class MexWarmerService { private async invalidateKey(key: string, data: any, ttl: number) { await this.cachingService.set(key, data, ttl); - await this.refreshCacheKey(key, ttl); + this.refreshCacheKey(key, ttl); } - private async refreshCacheKey(key: string, ttl: number) { - await this.clientProxy.emit('refreshCacheKey', { key, ttl }); + private refreshCacheKey(key: string, ttl: number) { + this.clientProxy.emit('refreshCacheKey', { key, ttl }); } } diff --git a/src/endpoints/network/entities/constants.ts b/src/endpoints/network/entities/constants.ts index 5c309419c..92d0fc38b 100644 --- a/src/endpoints/network/entities/constants.ts +++ b/src/endpoints/network/entities/constants.ts @@ -19,4 +19,7 @@ export class NetworkConstants { @ApiProperty({ description: 'Minimum transaction version' }) minTransactionVersion: number = 0; + + @ApiProperty({ description: 'Gas price modifier' }) + gasPriceModifier: string = ''; } diff --git a/src/endpoints/network/network.service.ts b/src/endpoints/network/network.service.ts index ae0aeab7e..91a30ca6e 100644 --- a/src/endpoints/network/network.service.ts +++ b/src/endpoints/network/network.service.ts @@ -66,6 +66,7 @@ export class NetworkService { const minGasLimit = networkConfig.erd_min_gas_limit; const minGasPrice = networkConfig.erd_min_gas_price; const minTransactionVersion = networkConfig.erd_min_transaction_version; + const gasPriceModifier = networkConfig.erd_gas_price_modifier; return { chainId, @@ -73,6 +74,7 @@ export class NetworkService { minGasLimit, minGasPrice, minTransactionVersion, + gasPriceModifier, }; } diff --git a/src/endpoints/nfts/entities/nft.account.ts b/src/endpoints/nfts/entities/nft.account.ts index 66cdb2221..399025815 100644 --- a/src/endpoints/nfts/entities/nft.account.ts +++ b/src/endpoints/nfts/entities/nft.account.ts @@ -15,4 +15,7 @@ export class NftAccount extends Nft { @ApiProperty({ type: Number, nullable: true, required: false }) valueUsd: number | undefined = undefined; + + @ApiProperty({ type: Number, nullable: true, required: false, description: 'Timestamp when the NFT was received by the address' }) + receivedAt: number | undefined = undefined; } diff --git a/src/endpoints/nfts/entities/nft.query.options.ts b/src/endpoints/nfts/entities/nft.query.options.ts index e9a46ee45..66b01f7aa 100644 --- a/src/endpoints/nfts/entities/nft.query.options.ts +++ b/src/endpoints/nfts/entities/nft.query.options.ts @@ -1,3 +1,4 @@ +import { BadRequestException } from "@nestjs/common"; export class NftQueryOptions { constructor(init?: Partial) { @@ -6,4 +7,11 @@ export class NftQueryOptions { withOwner?: boolean; withSupply?: boolean; + withReceivedAt?: boolean; + + validate(size: number): void { + if (this.withReceivedAt && size > 25) { + throw new BadRequestException('withReceivedAt can only be used with a size of 25'); + } + } } diff --git a/src/endpoints/nfts/nft.module.ts b/src/endpoints/nfts/nft.module.ts index 6242b358d..75c950cc2 100644 --- a/src/endpoints/nfts/nft.module.ts +++ b/src/endpoints/nfts/nft.module.ts @@ -10,6 +10,7 @@ import { TokenModule } from "../tokens/token.module"; import { NftExtendedAttributesService } from "./nft.extendedattributes.service"; import { NftService } from "./nft.service"; import { LockedAssetModule } from "../../common/locked-asset/locked-asset.module"; +import { MongoDbModule } from "src/common/indexer/db/src"; @Module({ imports: [ @@ -22,6 +23,7 @@ import { LockedAssetModule } from "../../common/locked-asset/locked-asset.module forwardRef(() => AssetsModule), forwardRef(() => LockedAssetModule), NftMediaModule, + MongoDbModule, ], providers: [ NftService, NftExtendedAttributesService, diff --git a/src/endpoints/nfts/nft.service.ts b/src/endpoints/nfts/nft.service.ts index f063a648d..3a3ea0887 100644 --- a/src/endpoints/nfts/nft.service.ts +++ b/src/endpoints/nfts/nft.service.ts @@ -31,6 +31,7 @@ import { SortCollectionNfts } from "../collections/entities/sort.collection.nfts import { TokenAssets } from "src/common/assets/entities/token.assets"; import { ScamInfo } from "src/common/entities/scam-info.dto"; import { NftSubType } from "./entities/nft.sub.type"; +import { AccountDetailsRepository } from "src/common/indexer/db/src"; @Injectable() export class NftService { @@ -51,13 +52,14 @@ export class NftService { private readonly esdtAddressService: EsdtAddressService, private readonly mexTokenService: MexTokenService, private readonly lockedAssetService: LockedAssetService, + private readonly accountDetailsRepository: AccountDetailsRepository, ) { this.NFT_THUMBNAIL_PREFIX = this.apiConfigService.getExternalMediaUrl() + '/nfts/asset'; this.DEFAULT_MEDIA = [ { - url: NftMediaService.NFT_THUMBNAIL_DEFAULT, - originalUrl: NftMediaService.NFT_THUMBNAIL_DEFAULT, - thumbnailUrl: NftMediaService.NFT_THUMBNAIL_DEFAULT, + url: this.nftMediaService.NFT_THUMBNAIL_DEFAULT, + originalUrl: this.nftMediaService.NFT_THUMBNAIL_DEFAULT, + thumbnailUrl: this.nftMediaService.NFT_THUMBNAIL_DEFAULT, fileType: 'image/png', fileSize: 29512, }, @@ -153,6 +155,8 @@ export class NftService { if (TokenHelpers.needsDefaultMedia(nft)) { nft.media = this.DEFAULT_MEDIA; } + + this.applyRedirectMedia(nft); } } @@ -276,6 +280,8 @@ export class NftService { private async applyMedia(nft: Nft) { nft.media = await this.nftMediaService.getMedia(nft.identifier) ?? undefined; + + this.applyRedirectMedia(nft); } private async applyMetadata(nft: Nft) { @@ -446,9 +452,17 @@ export class NftService { return await this.indexerService.getNftCount(filter); } - async getNftsForAddress(address: string, queryPagination: QueryPagination, filter: NftFilter, fields?: string[], queryOptions?: NftQueryOptions, source?: EsdtDataSource): Promise { - let nfts = await this.esdtAddressService.getNftsForAddress(address, filter, queryPagination, source); + async getNftsForAddressFromDb(address: string, queryPagination: QueryPagination, filter: NftFilter, fields?: string[], queryOptions?: NftQueryOptions, source?: EsdtDataSource): Promise { + const nfts = await this.accountDetailsRepository.getNftsForAddress(address, queryPagination) as NftAccount[]; + if (nfts && nfts.length > 0) { + return nfts; + } + + return await this.getNftsForAddress(address, queryPagination, filter, fields, queryOptions, source); + } + async getNftsForAddress(address: string, queryPagination: QueryPagination, filter: NftFilter, fields?: string[], queryOptions?: NftQueryOptions, source?: EsdtDataSource): Promise { + let nfts = await this.esdtAddressService.getNftsForAddress(address, filter, queryPagination, source, queryOptions); for (const nft of nfts) { await this.applyAssetsAndTicker(nft, fields); await this.applyPriceUsd(nft, fields); @@ -545,6 +559,13 @@ export class NftService { async getNftCountForAddress(address: string, filter: NftFilter): Promise { return await this.esdtAddressService.getNftCountForAddressFromElastic(address, filter); } + async getNftForAddressFromDb(address: string, identifier: string, fields?: string[]): Promise { + const nft = await this.accountDetailsRepository.getNftForAddress(address, identifier) as NftAccount; + if (nft) { + return nft; + } + return await this.getNftForAddress(address, identifier, fields); + } async getNftForAddress(address: string, identifier: string, fields?: string[]): Promise { const filter = new NftFilter(); @@ -596,7 +617,7 @@ export class NftService { } // TODO: use this function to determine if a MetaESDT is a proof if we decide to add API filters to extract all the proofs - getNftProofHash(nft: Nft): string | undefined{ + getNftProofHash(nft: Nft): string | undefined { const hashField = BinaryUtils.base64Decode(nft.hash); if (nft.type !== NftType.MetaESDT || !hashField.startsWith('proof:')) { return undefined; @@ -647,4 +668,33 @@ export class NftService { private getNftScoreElasticKey(algorithm: NftRankAlgorithm) { return `nft_score_${algorithm}`; } + + private applyRedirectMedia(nft: Nft) { + // FIXME: This is a temporary fix to avoid breaking the API + const isMediaRedirectFeatureEnabled = this.apiConfigService.isMediaRedirectFeatureEnabled(); + if (!isMediaRedirectFeatureEnabled) { + // return; + } + + if (!nft.media || nft.media.length === 0) { + return; + } + + try { + const network = this.apiConfigService.getNetwork(); + // const defaultMediaUrl = `https://${network === 'mainnet' ? '' : `${network}-`}media.elrond.com`; + const defaultMediaUrl = `https://${network === 'mainnet' ? '' : `${network}-`}api.multiversx.com/media`; + + for (const media of nft.media) { + if (media.url) { + media.url = media.url.replace(defaultMediaUrl, this.apiConfigService.getMediaUrl()); + } + if (media.thumbnailUrl) { + media.thumbnailUrl = media.thumbnailUrl.replace(defaultMediaUrl, this.apiConfigService.getMediaUrl()); + } + } + } catch { + // TODO: there are some cases where the nft.media is an empty object, we should investigate why + } + } } diff --git a/src/endpoints/nodes/node.service.ts b/src/endpoints/nodes/node.service.ts index 55acc303a..2738011f4 100644 --- a/src/endpoints/nodes/node.service.ts +++ b/src/endpoints/nodes/node.service.ts @@ -391,7 +391,7 @@ export class NodeService { const currentEpoch = await this.blockService.getCurrentEpoch(); if (this.apiConfigService.isStakingV4Enabled() && currentEpoch >= this.apiConfigService.getStakingV4ActivationEpoch()) { const auctions = await this.gatewayService.getValidatorAuctions(); - await this.processAuctions(nodes, auctions); + this.processAuctions(nodes, auctions); } await this.applyNodeUnbondingPeriods(nodes); @@ -412,8 +412,8 @@ export class NodeService { } } - async processAuctions(nodes: Node[], auctions: Auction[]) { - const minimumAuctionStake = await this.stakeService.getMinimumAuctionStake(auctions); + processAuctions(nodes: Node[], auctions: Auction[]) { + const minimumAuctionStake = this.stakeService.getMinimumAuctionStake(auctions); const dangerZoneThreshold = BigInt(minimumAuctionStake) * BigInt(105) / BigInt(100); for (const node of nodes) { let position = 1; diff --git a/src/endpoints/pool/pool.service.ts b/src/endpoints/pool/pool.service.ts index 4bfd15eb1..f45ef5957 100644 --- a/src/endpoints/pool/pool.service.ts +++ b/src/endpoints/pool/pool.service.ts @@ -26,35 +26,38 @@ export class PoolService { ) { } async getTransactionFromPool(txHash: string): Promise { - const pool = await this.getEntirePool(); + const pool = await this.getPoolWithFilters(); return pool.find(tx => tx.txHash === txHash); } async getPoolCount(filter: PoolFilter): Promise { - const pool = await this.getEntirePool(); - return this.applyFilters(pool, filter).length; + const pool = await this.getPoolWithFilters(filter); + return pool.length; } async getPool( queryPagination: QueryPagination, - filter: PoolFilter, + filter?: PoolFilter, ): Promise { if (!this.apiConfigService.isTransactionPoolEnabled()) { return []; } const { from, size } = queryPagination; - const entirePool = await this.getEntirePool(); - const pool = this.applyFilters(entirePool, filter); + const pool = await this.getPoolWithFilters(filter); return pool.slice(from, from + size); } - async getEntirePool(): Promise { - return await this.cacheService.getOrSet( + async getPoolWithFilters( + filter?: PoolFilter, + ): Promise { + const pool = await this.cacheService.getOrSet( CacheInfo.TransactionPool.key, async () => await this.getTxPoolRaw(), CacheInfo.TransactionPool.ttl, ); + + return this.applyFilters(pool, filter); } async getTxPoolRaw(): Promise { @@ -117,7 +120,11 @@ export class PoolService { return transaction; } - private applyFilters(pool: TransactionInPool[], filters: PoolFilter): TransactionInPool[] { + private applyFilters(pool: TransactionInPool[], filters: PoolFilter | undefined): TransactionInPool[] { + if (!filters) { + return pool; + } + return pool.filter((transaction) => { return ( (!filters.sender || transaction.sender === filters.sender) && diff --git a/src/endpoints/providers/provider.module.ts b/src/endpoints/providers/provider.module.ts index c04f99383..11ba6823a 100644 --- a/src/endpoints/providers/provider.module.ts +++ b/src/endpoints/providers/provider.module.ts @@ -10,7 +10,7 @@ import { ProviderService } from "./provider.service"; forwardRef(() => KeybaseModule), forwardRef(() => NodeModule), VmQueryModule, - IdentitiesModule, + forwardRef(() => IdentitiesModule), ], providers: [ ProviderService, diff --git a/src/endpoints/rounds/round.module.ts b/src/endpoints/rounds/round.module.ts index 5536aa952..748bc71ad 100644 --- a/src/endpoints/rounds/round.module.ts +++ b/src/endpoints/rounds/round.module.ts @@ -1,10 +1,12 @@ import { Module } from "@nestjs/common"; import { BlsModule } from "../bls/bls.module"; import { RoundService } from "./round.service"; +import { BlockModule } from "../blocks/block.module"; @Module({ imports: [ BlsModule, + BlockModule, ], providers: [ RoundService, diff --git a/src/endpoints/rounds/round.service.ts b/src/endpoints/rounds/round.service.ts index 10c29f39e..357b8fe0c 100644 --- a/src/endpoints/rounds/round.service.ts +++ b/src/endpoints/rounds/round.service.ts @@ -6,12 +6,16 @@ import { BlsService } from "src/endpoints/bls/bls.service"; import { RoundUtils } from "@multiversx/sdk-nestjs-common"; import { ApiUtils } from "@multiversx/sdk-nestjs-http"; import { IndexerService } from "src/common/indexer/indexer.service"; +import { ApiConfigService } from "../../common/api-config/api.config.service"; +import { BlockService } from "../blocks/block.service"; @Injectable() export class RoundService { constructor( private readonly indexerService: IndexerService, private readonly blsService: BlsService, + private readonly apiConfigService: ApiConfigService, + private readonly blockService: BlockService, ) { } async getRoundCount(filter: RoundFilter): Promise { @@ -19,6 +23,14 @@ export class RoundService { } async getRounds(filter: RoundFilter): Promise { + const epoch = filter.epoch ? filter.epoch : await this.blockService.getCurrentEpoch(); + const isAndromedaEnabled = this.apiConfigService.isChainAndromedaEnabled() + && epoch >= this.apiConfigService.getChainAndromedaActivationEpoch(); + + if (isAndromedaEnabled) { + filter.validator = undefined; + } + const result = await this.indexerService.getRounds(filter) as any; for (const item of result) { @@ -33,9 +45,15 @@ export class RoundService { const epoch = RoundUtils.roundToEpoch(round); const publicKeys = await this.blsService.getPublicKeys(shard, epoch); + const isChainAndromedaEnabled = this.apiConfigService.isChainAndromedaEnabled() + && epoch >= this.apiConfigService.getChainAndromedaActivationEpoch(); result.shard = result.shardId; - result.signers = result.signersIndexes.map((index: number) => publicKeys[index]); + if (!isChainAndromedaEnabled) { + result.signers = result.signersIndexes.map((index: number) => publicKeys[index]); + } else { + result.signers = publicKeys; + } return ApiUtils.mergeObjects(new RoundDetailed(), result); } diff --git a/src/endpoints/tokens/token.module.ts b/src/endpoints/tokens/token.module.ts index 14669ed7b..b111cce47 100644 --- a/src/endpoints/tokens/token.module.ts +++ b/src/endpoints/tokens/token.module.ts @@ -9,6 +9,7 @@ import { MexModule } from "../mex/mex.module"; import { CollectionModule } from "../collections/collection.module"; import { PluginModule } from "src/plugins/plugin.module"; import { TransferModule } from "../transfers/transfer.module"; +import { MongoDbModule } from "src/common/indexer/db/src"; @Module({ imports: [ @@ -20,6 +21,7 @@ import { TransferModule } from "../transfers/transfer.module"; forwardRef(() => MexModule.forRoot()), forwardRef(() => CollectionModule), forwardRef(() => PluginModule), + MongoDbModule, ], providers: [ TokenService, TokenTransferService, diff --git a/src/endpoints/tokens/token.service.ts b/src/endpoints/tokens/token.service.ts index 3401800ae..f546cd082 100644 --- a/src/endpoints/tokens/token.service.ts +++ b/src/endpoints/tokens/token.service.ts @@ -43,6 +43,7 @@ import { MexPairService } from "../mex/mex.pair.service"; import { MexPairState } from "../mex/entities/mex.pair.state"; import { MexTokenType } from "../mex/entities/mex.token.type"; import { NftSubType } from "../nfts/entities/nft.sub.type"; +import { AccountDetailsRepository } from "src/common/indexer/db/src"; @Injectable() export class TokenService { @@ -68,6 +69,7 @@ export class TokenService { private readonly dataApiService: DataApiService, private readonly mexPairService: MexPairService, private readonly apiService: ApiService, + private readonly accountDetailsRepository: AccountDetailsRepository, ) { } async isToken(identifier: string): Promise { @@ -91,7 +93,7 @@ export class TokenService { token = ApiUtils.mergeObjects(new TokenDetailed(), token); - await this.applyTickerFromAssets(token); + this.applyTickerFromAssets(token); await this.applySupply(token, supplyOptions); @@ -250,6 +252,15 @@ export class TokenService { return tokens.length; } + + async getTokensForAddressFromDb(address: string, queryPagination: QueryPagination, filter: TokenFilter): Promise { + const tokens = await this.accountDetailsRepository.getTokensForAddress(address, queryPagination) as TokenWithBalance[]; + if (tokens && tokens.length > 0) { + return tokens; + } + console.log('aici') + return await this.getTokensForAddress(address, queryPagination, filter); + } async getTokensForAddress(address: string, queryPagination: QueryPagination, filter: TokenFilter): Promise { let tokens: TokenWithBalance[]; if (AddressUtils.isSmartContractAddress(address)) { @@ -339,6 +350,14 @@ export class TokenService { return tokens; } + async getTokenForAddressFromDb(address: string, identifier: string): Promise { + const token = await this.accountDetailsRepository.getTokenForAddress(address, identifier) as TokenDetailedWithBalance; + if (token) { + return token; + } + return await this.getTokenForAddress(address, identifier); + } + async getTokenForAddress(address: string, identifier: string): Promise { const esdtIdentifier = identifier.split('-').slice(0, 2).join('-'); @@ -380,7 +399,7 @@ export class TokenService { tokenWithBalance.identifier = token.identifier; - await this.applyTickerFromAssets(tokenWithBalance); + this.applyTickerFromAssets(tokenWithBalance); await this.applySupply(tokenWithBalance); diff --git a/src/endpoints/transactions/constants/gas.bucket.constants.ts b/src/endpoints/transactions/constants/gas.bucket.constants.ts new file mode 100644 index 000000000..acf8ef974 --- /dev/null +++ b/src/endpoints/transactions/constants/gas.bucket.constants.ts @@ -0,0 +1,11 @@ +/** + * Constants used for gas bucket distribution and PPU calculation + */ +export const GasBucketConstants = { + + GAS_BUCKET_SIZE: 6000000000, + + FAST_BUCKET_INDEX: 2, + + FASTER_BUCKET_INDEX: 0, +}; diff --git a/src/endpoints/transactions/entities/gas.bucket.ts b/src/endpoints/transactions/entities/gas.bucket.ts new file mode 100644 index 000000000..42911bd57 --- /dev/null +++ b/src/endpoints/transactions/entities/gas.bucket.ts @@ -0,0 +1,29 @@ +/** + * Represents a gas bucket for PPU calculation + */ +export interface GasBucket { + /** + * Bucket index + */ + index: number; + + /** + * Total gas accumulated in this bucket + */ + gasAccumulated: number; + + /** + * PPU of the first transaction in the bucket + */ + ppuBegin: number; + + /** + * PPU of the last transaction in the bucket + */ + ppuEnd?: number; + + /** + * Number of transactions in the bucket + */ + numTransactions: number; +} diff --git a/src/endpoints/transactions/entities/ppu.metadata.ts b/src/endpoints/transactions/entities/ppu.metadata.ts new file mode 100644 index 000000000..21dca8d5f --- /dev/null +++ b/src/endpoints/transactions/entities/ppu.metadata.ts @@ -0,0 +1,25 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class PpuMetadata { + @ApiProperty({ + description: 'Last processed block number', + example: 47428477, + }) + lastBlock: number = 0; + + @ApiProperty({ + description: 'Price per unit for standard (medium priority) transactions', + example: 20000000, + }) + fast: number = 0; + + @ApiProperty({ + description: 'Price per unit for fast (high priority) transactions', + example: 40000000, + }) + faster: number = 0; + + constructor(init?: Partial) { + Object.assign(this, init); + } +} diff --git a/src/endpoints/transactions/entities/transaction.create.ts b/src/endpoints/transactions/entities/transaction.create.ts index 4d8dd7cb4..08672e74f 100644 --- a/src/endpoints/transactions/entities/transaction.create.ts +++ b/src/endpoints/transactions/entities/transaction.create.ts @@ -49,4 +49,10 @@ export class TransactionCreate { @ApiProperty() guardianSignature?: string = undefined; + + @ApiProperty() + relayer?: string = undefined; + + @ApiProperty() + relayerSignature?: string = undefined; } diff --git a/src/endpoints/transactions/entities/transaction.ts b/src/endpoints/transactions/entities/transaction.ts index ffd1cb99a..250917604 100644 --- a/src/endpoints/transactions/entities/transaction.ts +++ b/src/endpoints/transactions/entities/transaction.ts @@ -45,6 +45,9 @@ export class Transaction { @ApiProperty({ type: Number }) round: number | undefined = undefined; + @ApiProperty({ type: Number }) + epoch: number | undefined = undefined; + @ApiProperty({ type: String }) sender: string = ''; diff --git a/src/endpoints/transactions/entities/transaction.with.ppu.ts b/src/endpoints/transactions/entities/transaction.with.ppu.ts new file mode 100644 index 000000000..e570e587b --- /dev/null +++ b/src/endpoints/transactions/entities/transaction.with.ppu.ts @@ -0,0 +1,8 @@ +import { TransactionInPool } from '../../pool/entities/transaction.in.pool.dto'; + +/** + * Represents a transaction with price per unit calculated + */ +export interface TransactionWithPpu extends TransactionInPool { + ppu: number; +} diff --git a/src/endpoints/transactions/transaction-action/recognizers/staking/transaction.action.stake.recognizer.service.ts b/src/endpoints/transactions/transaction-action/recognizers/staking/transaction.action.stake.recognizer.service.ts index 607a42205..429c7cf72 100644 --- a/src/endpoints/transactions/transaction-action/recognizers/staking/transaction.action.stake.recognizer.service.ts +++ b/src/endpoints/transactions/transaction-action/recognizers/staking/transaction.action.stake.recognizer.service.ts @@ -46,7 +46,7 @@ export class StakeActionRecognizerService implements TransactionActionRecognizer providersDetails[provider.provider] = { providerName, providerAvatar }; } - await this.cachingService.setLocal('plugins:staking:providerAddresses', providersDetails, Constants.oneHour()); + this.cachingService.setLocal('plugins:staking:providerAddresses', providersDetails, Constants.oneHour()); } return providersDetails; diff --git a/src/endpoints/transactions/transaction.controller.ts b/src/endpoints/transactions/transaction.controller.ts index cd29384af..9d653a5e7 100644 --- a/src/endpoints/transactions/transaction.controller.ts +++ b/src/endpoints/transactions/transaction.controller.ts @@ -14,6 +14,7 @@ import { TransactionStatus } from './entities/transaction.status'; import { TransactionQueryOptions } from './entities/transactions.query.options'; import { TransactionService } from './transaction.service'; import { ParseArrayPipeOptions } from '@multiversx/sdk-nestjs-common/lib/pipes/entities/parse.array.options'; +import { PpuMetadata } from './entities/ppu.metadata'; @Controller() @ApiTags('transactions') @@ -274,4 +275,20 @@ export class TransactionController { return await this.transactionService.decodeTransaction(transaction); } + + @Get('/transactions/ppu/:shardId') + @ApiOperation({ summary: 'Price per unit by shard', description: 'Returns price per unit metadata for a specific shard' }) + @ApiOkResponse({ type: PpuMetadata }) + @ApiNotFoundResponse({ description: 'Price per unit data for shard not found' }) + async getPpuByShardId( + @Param('shardId', ParseIntPipe) shardId: number, + ): Promise { + const ppuMetadata = await this.transactionService.getPpuByShardId(shardId); + + if (ppuMetadata === null) { + throw new NotFoundException(`Price per unit data for shard ${shardId} not found`); + } + + return ppuMetadata; + } } diff --git a/src/endpoints/transactions/transaction.module.ts b/src/endpoints/transactions/transaction.module.ts index 4b406f4d2..f5fbf6cfd 100644 --- a/src/endpoints/transactions/transaction.module.ts +++ b/src/endpoints/transactions/transaction.module.ts @@ -2,6 +2,9 @@ import { forwardRef, Module } from "@nestjs/common"; import { AssetsModule } from "src/common/assets/assets.module"; import { DataApiModule } from "src/common/data-api/data-api.module"; import { PluginModule } from "src/plugins/plugin.module"; +import { BlockModule } from "../blocks/block.module"; +import { NetworkModule } from "../network/network.module"; +import { PoolModule } from "../pool/pool.module"; import { TokenModule } from "../tokens/token.module"; import { UsernameModule } from "../usernames/username.module"; import { TransactionActionModule } from "./transaction-action/transaction.action.module"; @@ -14,6 +17,9 @@ import { TransactionService } from "./transaction.service"; forwardRef(() => TokenModule), forwardRef(() => PluginModule), forwardRef(() => TransactionActionModule), + forwardRef(() => BlockModule), + forwardRef(() => PoolModule), + forwardRef(() => NetworkModule), AssetsModule, UsernameModule, DataApiModule, diff --git a/src/endpoints/transactions/transaction.service.ts b/src/endpoints/transactions/transaction.service.ts index 3fb2770a9..968c70fc3 100644 --- a/src/endpoints/transactions/transaction.service.ts +++ b/src/endpoints/transactions/transaction.service.ts @@ -33,6 +33,15 @@ import { UsernameService } from '../usernames/username.service'; import { MiniBlock } from 'src/common/indexer/entities/miniblock'; import { Block } from 'src/common/indexer/entities/block'; import { ProtocolService } from 'src/common/protocol/protocol.service'; +import { PpuMetadata } from './entities/ppu.metadata'; +import { BlockService } from '../blocks/block.service'; +import { BlockFilter } from '../blocks/entities/block.filter'; +import { SortOrder } from 'src/common/entities/sort.order'; +import { PoolService } from '../pool/pool.service'; +import { NetworkService } from 'src/endpoints/network/network.service'; +import { TransactionWithPpu } from './entities/transaction.with.ppu'; +import { GasBucket } from './entities/gas.bucket'; +import { GasBucketConstants } from './constants/gas.bucket.constants'; @Injectable() export class TransactionService { @@ -54,6 +63,12 @@ export class TransactionService { private readonly apiConfigService: ApiConfigService, private readonly usernameService: UsernameService, private readonly protocolService: ProtocolService, + @Inject(forwardRef(() => BlockService)) + private readonly blockService: BlockService, + @Inject(forwardRef(() => PoolService)) + private readonly poolService: PoolService, + @Inject(forwardRef(() => NetworkService)) + private readonly networkService: NetworkService, ) { } async getTransactionCountForAddress(address: string): Promise { @@ -569,4 +584,165 @@ export class TransactionService { return undefined; } + + async getPpuByShardId(shardId: number): Promise { + return await this.cachingService.getOrSet( + CacheInfo.PpuMetadataByShard(shardId).key, + async () => await this.getPpuByShardIdRaw(shardId), + CacheInfo.PpuMetadataByShard(shardId).ttl, + Constants.oneSecond(), + ); + } + + async getPpuByShardIdRaw(shardId: number): Promise { + try { + if (shardId < 0 || shardId > 2) { + return null; + } + + const blocks = await this.blockService.getBlocks( + new BlockFilter({ shard: shardId, order: SortOrder.desc }), + new QueryPagination({ from: 0, size: 1 }) + ); + + if (!blocks || blocks.length === 0) { + this.logger.error(`No blocks found for shard ${shardId}`); + return null; + } + + const lastBlock = blocks[0].nonce; + const networkConstants = await this.networkService.getConstants(); + const { minGasLimit, gasPerDataByte, gasPriceModifier } = networkConstants; + const gasPriceModifierNumber = Number(gasPriceModifier); + const { GAS_BUCKET_SIZE, FAST_BUCKET_INDEX, FASTER_BUCKET_INDEX } = GasBucketConstants; + + const poolTransactions = await this.poolService.getPoolWithFilters({ senderShard: shardId }); + + if (!poolTransactions || poolTransactions.length === 0) { + return new PpuMetadata({ + lastBlock: lastBlock, + fast: 0, + faster: 0, + }); + } + + const transactionsWithPpu = this.calculatePpuForTransactions( + poolTransactions, + minGasLimit, + gasPerDataByte, + gasPriceModifierNumber + ); + + const sortedTransactions = this.sortTransactionsByPriority(transactionsWithPpu); + const gasBuckets = this.distributeTransactionsIntoGasBuckets(sortedTransactions, GAS_BUCKET_SIZE); + + const fastPpu = gasBuckets.length > FAST_BUCKET_INDEX && gasBuckets[FAST_BUCKET_INDEX].ppuEnd + ? gasBuckets[FAST_BUCKET_INDEX].ppuEnd + : 0; + + const fasterPpu = gasBuckets.length > FASTER_BUCKET_INDEX && gasBuckets[FASTER_BUCKET_INDEX].ppuEnd + ? gasBuckets[FASTER_BUCKET_INDEX].ppuEnd + : 0; + + return new PpuMetadata({ + lastBlock: lastBlock, + fast: fastPpu, + faster: fasterPpu, + }); + } catch (error) { + this.logger.error(`Error getting price per unit metadata for shard ${shardId}`, { + path: 'transactionService.getPpuByShardIdRaw', + shardId, + error, + }); + return null; + } + } + + private calculatePpuForTransactions( + transactions: any[], + minGasLimit: number, + gasPerDataByte: number, + gasPriceModifier: number + ): TransactionWithPpu[] { + return transactions.map(tx => { + const data = tx.data ? BinaryUtils.base64Decode(tx.data) : ''; + const gasLimit = Number(tx.gasLimit); + const gasPrice = Number(tx.gasPrice); + + const dataCost = minGasLimit + data.length * gasPerDataByte; + const executionCost = gasLimit - dataCost; + const initiallyPaidFee = dataCost * gasPrice + executionCost * gasPrice * gasPriceModifier; + const ppu = Math.floor(initiallyPaidFee / gasLimit); + + return { ...tx, ppu }; + }); + } + + private sortTransactionsByPriority(transactions: TransactionWithPpu[]): TransactionWithPpu[] { + return [...transactions].sort((a, b) => { + // Same sender - sort by nonce + if (a.sender === b.sender) { + return a.nonce - b.nonce; + } + + // Different PPU - sort by PPU (descending) + if (a.ppu !== b.ppu) { + return b.ppu - a.ppu; + } + + // Different gas limit - sort by gas limit (descending) + if (a.gasLimit !== b.gasLimit) { + return b.gasLimit - a.gasLimit; + } + + // Otherwise sort by hash (lexicographically) + return a.txHash.localeCompare(b.txHash); + }); + } + + private distributeTransactionsIntoGasBuckets( + transactions: TransactionWithPpu[], + gasBucketSize: number + ): GasBucket[] { + const buckets: GasBucket[] = []; + let currentBucket: GasBucket = { + index: 0, + gasAccumulated: 0, + ppuBegin: 0, + numTransactions: 0, + }; + + for (const transaction of transactions) { + const gasLimit = Number(transaction.gasLimit); + currentBucket.gasAccumulated += gasLimit; + currentBucket.numTransactions += 1; + + if (currentBucket.numTransactions === 1) { + currentBucket.ppuBegin = transaction.ppu; + } + + if (currentBucket.gasAccumulated >= gasBucketSize) { + currentBucket.ppuEnd = transaction.ppu; + buckets.push(currentBucket); + + currentBucket = { + index: currentBucket.index + 1, + gasAccumulated: 0, + ppuBegin: 0, + numTransactions: 0, + }; + } + } + + if (currentBucket.numTransactions > 0) { + currentBucket.ppuEnd = transactions[transactions.length - 1].ppu; + buckets.push(currentBucket); + } + for (const bucket of buckets) { + this.logger.log(`Bucket ${bucket.index}, gas = ${bucket.gasAccumulated}, num_txs = ${bucket.numTransactions}, ppu: ${bucket.ppuBegin} .. ${bucket.ppuEnd}`); + } + + return buckets; + } } diff --git a/src/queue.worker/nft.worker/queue/job-services/media/nft.media.service.ts b/src/queue.worker/nft.worker/queue/job-services/media/nft.media.service.ts index 5c05f2e5b..66d3b0cf3 100644 --- a/src/queue.worker/nft.worker/queue/job-services/media/nft.media.service.ts +++ b/src/queue.worker/nft.worker/queue/job-services/media/nft.media.service.ts @@ -18,8 +18,8 @@ import { CachingUtils } from "src/utils/caching.utils"; export class NftMediaService { private readonly logger = new OriginLogger(NftMediaService.name); private readonly IPFS_REQUEST_TIMEOUT = Constants.oneSecond() * 30 * 1000; - private readonly NFT_THUMBNAIL_PREFIX; - public static readonly NFT_THUMBNAIL_DEFAULT = 'https://media.elrond.com/nfts/thumbnail/default.png'; + private readonly NFT_THUMBNAIL_PREFIX: string; + public readonly NFT_THUMBNAIL_DEFAULT: string; constructor( private readonly cachingService: CacheService, @@ -28,7 +28,8 @@ export class NftMediaService { private readonly persistenceService: PersistenceService, @Inject('PUBSUB_SERVICE') private clientProxy: ClientProxy, ) { - this.NFT_THUMBNAIL_PREFIX = this.apiConfigService.getExternalMediaUrl() + '/nfts/asset'; + this.NFT_THUMBNAIL_PREFIX = `${this.apiConfigService.getExternalMediaUrl()}/nfts/asset`; + this.NFT_THUMBNAIL_DEFAULT = `${this.apiConfigService.getMediaUrl()}/nfts/thumbnail/default.png`; } async getMedia(identifier: string): Promise { @@ -53,7 +54,7 @@ export class NftMediaService { CacheInfo.NftMedia(nft.identifier).ttl ); - await this.clientProxy.emit('refreshCacheKey', { + this.clientProxy.emit('refreshCacheKey', { key: CacheInfo.NftMedia(nft.identifier).key, ttl: CacheInfo.NftMedia(nft.identifier).ttl, }); @@ -112,7 +113,7 @@ export class NftMediaService { nftMedia.thumbnailUrl = `${this.apiConfigService.getExternalMediaUrl()}/nfts/thumbnail/${nft.collection}-${TokenHelpers.getUrlHash(nftMedia.url)}`; } else { this.logger.log(`File size '${fileProperties.contentLength}' not accepted for NFT with identifier '${nft.identifier}'`); - nftMedia.thumbnailUrl = NftMediaService.NFT_THUMBNAIL_DEFAULT; + nftMedia.thumbnailUrl = this.NFT_THUMBNAIL_DEFAULT; } nftMedia.fileType = fileProperties.contentType; diff --git a/src/queue.worker/nft.worker/queue/job-services/metadata/nft.metadata.service.ts b/src/queue.worker/nft.worker/queue/job-services/metadata/nft.metadata.service.ts index 78599bb43..8ab83454b 100644 --- a/src/queue.worker/nft.worker/queue/job-services/metadata/nft.metadata.service.ts +++ b/src/queue.worker/nft.worker/queue/job-services/metadata/nft.metadata.service.ts @@ -56,7 +56,7 @@ export class NftMetadataService { CacheInfo.NftMetadata(nft.identifier).ttl ); - await this.clientProxy.emit('refreshCacheKey', { + this.clientProxy.emit('refreshCacheKey', { key: CacheInfo.NftMetadata(nft.identifier).key, ttl: CacheInfo.NftMetadata(nft.identifier).ttl, }); diff --git a/src/queue.worker/nft.worker/queue/nft.queue.controller.ts b/src/queue.worker/nft.worker/queue/nft.queue.controller.ts index 36989710b..e81b2029b 100644 --- a/src/queue.worker/nft.worker/queue/nft.queue.controller.ts +++ b/src/queue.worker/nft.worker/queue/nft.queue.controller.ts @@ -135,7 +135,7 @@ export class NftQueueController { } if (nft.media && !settings.skipRefreshThumbnail) { - const mediaItems = nft.media.filter(x => x.thumbnailUrl !== NftMediaService.NFT_THUMBNAIL_DEFAULT); + const mediaItems = nft.media.filter(x => x.thumbnailUrl !== this.nftMediaService.NFT_THUMBNAIL_DEFAULT); await Promise.all(mediaItems.map(media => this.generateThumbnail(nft, media, settings.forceRefreshThumbnail))); } diff --git a/src/test/chain-simulator/accounts.cs-e2e.ts b/src/test/chain-simulator/accounts.cs-e2e.ts index 431516f4b..f1182d86e 100644 --- a/src/test/chain-simulator/accounts.cs-e2e.ts +++ b/src/test/chain-simulator/accounts.cs-e2e.ts @@ -2,6 +2,7 @@ import axios from "axios"; import { config } from "./config/env.config"; import { NftType } from "src/endpoints/nfts/entities/nft.type"; import { NftSubType } from "src/endpoints/nfts/entities/nft.sub.type"; +import { transferNftFromTo } from "./utils/chain.simulator.operations"; describe('Accounts e2e tests with chain simulator', () => { describe('GET /accounts with query parameters', () => { @@ -1985,5 +1986,36 @@ describe('Accounts e2e tests with chain simulator', () => { expect(response.data).toHaveProperty(field); } }); + + it('should return the NFT received at timestamp when transferred from one address to another and withReceivedAt parameter is true', async () => { + const accountNfts = await axios.get(`${config.apiServiceUrl}/accounts/${config.aliceAddress}/nfts?size=1&type=${NftType.NonFungibleESDT}`); + const nft = accountNfts.data[0]; + const sendNftTx = await transferNftFromTo(config.chainSimulatorUrl, config.aliceAddress, config.bobAddress, nft.collection, nft.nonce); + + const transaction = await axios.get(`${config.apiServiceUrl}/transactions/${sendNftTx}`); + await new Promise(resolve => setTimeout(resolve, 2000)); + + expect(transaction.status).toBe(200); + + const checkBobNft = await axios.get(`${config.apiServiceUrl}/accounts/${config.bobAddress}/nfts?withReceivedAt=true`); + const bobNft = checkBobNft.data; + + expect(bobNft.length).toBeGreaterThanOrEqual(1); + expect(bobNft[0].receivedAt).toBeDefined(); + }); + + it('should not return the NFT received at timestamp when transferred from one address to another and withReceivedAt parameter is false', async () => { + const response = await axios.get(`${config.apiServiceUrl}/accounts/${config.bobAddress}/nfts?withReceivedAt=false`); + const responseData = response.data; + + expect(responseData.every((nft: any) => nft.receivedAt === undefined)).toBe(true); + }); + + it('should throw an error with 400 Bad Request if size parameter is greater than 25 and withReceivedAt parameter is true', async () => { + const response = await axios.get(`${config.apiServiceUrl}/accounts/${config.bobAddress}/nfts?withReceivedAt=true&size=30`) + .catch(err => err.response); + + expect(response.status).toBe(400); + }); }); }); diff --git a/src/test/chain-simulator/transactions.cs-e2e.ts b/src/test/chain-simulator/transactions.cs-e2e.ts index 620880805..c4a9b2e6b 100644 --- a/src/test/chain-simulator/transactions.cs-e2e.ts +++ b/src/test/chain-simulator/transactions.cs-e2e.ts @@ -194,6 +194,8 @@ describe('Transactions e2e tests with chain simulator', () => { 'receiver', 'receiverShard', 'round', + // TODO: we should also validate the existence of the epoch field after upgrading the CS image + // 'epoch', 'sender', 'senderShard', 'status', diff --git a/src/test/chain-simulator/utils/chain.simulator.operations.ts b/src/test/chain-simulator/utils/chain.simulator.operations.ts index 1b39153fa..683b32110 100644 --- a/src/test/chain-simulator/utils/chain.simulator.operations.ts +++ b/src/test/chain-simulator/utils/chain.simulator.operations.ts @@ -184,6 +184,7 @@ export class SendTransactionArgs { value?: string = '0'; gasLimit?: number = 100_000_000; nonceOffset?: number = 0; // useful for scenarios where a higher nonce is desired + gasPrice?: string; constructor(options: Partial = {}) { Object.assign(this, options); @@ -548,4 +549,77 @@ export async function issueMultipleMetaESDTCollections( return metaEsdtCollectionIdentifiers.map(x => x.identifier); } +export async function transferNft(args: TransferNftArgs) { + // Format nonce as hex string with at least 2 digits + const nonceHex = typeof args.nonce === 'number' + ? args.nonce.toString(16).padStart(2, '0') + : args.nonce; + // Format quantity as hex string, always specify it (even for quantity=1) + const quantityHex = args.quantity.toString(16).padStart(2, '0'); + + // Convert receiver address from bech32 to hex format + const receiverHex = AddressUtils.bech32Decode(args.receiver); + + // Prepare data field components + const dataField = [ + 'ESDTNFTTransfer', + Buffer.from(args.collectionIdentifier).toString('hex'), + nonceHex, + quantityHex, // Always specify quantity + receiverHex, + ].join('@'); + + // Log the data field for debugging + console.log(`NFT Transfer data field: ${dataField}`); + + return await sendTransaction( + new SendTransactionArgs({ + chainSimulatorUrl: args.chainSimulatorUrl, + sender: args.sender, + receiver: args.sender, + dataField: dataField, + value: '0', + gasLimit: 1000000, + }), + ); +} + +export class TransferNftArgs { + chainSimulatorUrl: string = ''; + sender: string = ''; + receiver: string = ''; + collectionIdentifier: string = ''; + nonce: string | number = ''; + quantity: number = 1; + + constructor(options: Partial = {}) { + Object.assign(this, options); + } +} + +export async function transferNftFromTo( + chainSimulatorUrl: string, + senderAddress: string, + receiverAddress: string, + collectionIdentifier: string, + nftNonce: string | number, + quantity: number = 1 +): Promise { + console.log(`Transferring NFT from ${senderAddress} to ${receiverAddress}`); + console.log(`Collection: ${collectionIdentifier}, Nonce: ${nftNonce}, Quantity: ${quantity}`); + + const txHash = await transferNft( + new TransferNftArgs({ + chainSimulatorUrl, + sender: senderAddress, + receiver: receiverAddress, + collectionIdentifier, + nonce: nftNonce, + quantity, + }) + ); + + console.log(`NFT transfer completed. Transaction hash: ${txHash}`); + return txHash; +} diff --git a/src/test/chain-simulator/utils/test-ppu-calculation.ts b/src/test/chain-simulator/utils/test-ppu-calculation.ts new file mode 100644 index 000000000..d35f527dc --- /dev/null +++ b/src/test/chain-simulator/utils/test-ppu-calculation.ts @@ -0,0 +1,482 @@ +import axios from 'axios'; +import { config } from '../config/env.config'; +import { fundAddress, sendTransaction, SendTransactionArgs } from './chain.simulator.operations'; +import { ChainSimulatorUtils } from './test.utils'; +import { BinaryUtils } from '@multiversx/sdk-nestjs-common'; +import * as fs from 'fs'; +import * as path from 'path'; + +async function testPpuCalculation() { + try { + console.log('Starting PPU calculation test...'); + + // Wait for chain simulator to be ready + console.log('Waiting for epoch 2...'); + await ChainSimulatorUtils.waitForEpoch(2); + console.log('✓ Chain simulator reached epoch 2'); + + // Fund test addresses + const addresses = { + shard0: config.aliceAddress, + shard1: config.bobAddress, + }; + + // Fund all addresses + for (const [shardName, address] of Object.entries(addresses)) { + await fundAddress(config.chainSimulatorUrl, address); + console.log(`✓ Funded address for ${shardName}: ${address}`); + } + + // Deploy smart contract + const pingPongAddress = await deployPingPongSmartContract(addresses.shard0); + console.log(`✓ Deployed PingPong smart contract at address: ${pingPongAddress}`); + + // Start PPU monitoring in background + const stopMonitoring = startContinuousPpuMonitoring(); + + try { + // Create transactions in batches to maintain continuous congestion + await createContinuousCongestion(addresses, pingPongAddress); + } finally { + // Stop the monitoring when we're done + stopMonitoring(); + } + + // Wait a bit for last transactions to be processed + console.log('\nWaiting for final transactions to be processed...'); + await new Promise(resolve => setTimeout(resolve, 5000)); + + // Generate final report + await getFinalPpuReport(); + + console.log('\nPPU calculation test completed successfully!'); + } catch (error) { + console.error('Error testing PPU calculation:', error); + process.exit(1); + } +} + +/** + * Deploy PingPong smart contract for testing contract interactions + */ +async function deployPingPongSmartContract(deployerAddress: string): Promise { + console.log('Deploying PingPong smart contract...'); + + // Deploy the PingPong contract + const scAddress = await ChainSimulatorUtils.deployPingPongSc(deployerAddress); + + // Wait a bit for deployment to be processed + await new Promise(resolve => setTimeout(resolve, 3000)); + + return scAddress; +} + +interface PpuActivityReport { + timestamp: string; + shardId: number; + lastBlock: number; + fastPpu: number; + fasterPpu: number; + totalTransactions: number; + mempoolAnalysis?: { + calculatedFastPpu: number; + calculatedFasterPpu: number; + fastPpuDifference: number; + fasterPpuDifference: number; + transactionCount: number; + }; +} + +function startContinuousPpuMonitoring() { + let shouldContinue = true; + + const monitor = async () => { + while (shouldContinue) { + for (let shardId = 0; shardId <= 2; shardId++) { + try { + const response = await axios.get(`${config.apiServiceUrl}/transactions/ppu/${shardId}`); + const ppuData = response.data; + + if (ppuData.Fast > 0 || ppuData.Faster > 0) { + const timestamp = new Date().toISOString(); + console.log(`\nDetected PPU activity in shard ${shardId} at ${timestamp}:`); + console.log(`- Last Block: ${ppuData.LastBlock}`); + console.log(`- Fast PPU: ${ppuData.Fast}`); + console.log(`- Faster PPU: ${ppuData.Faster}`); + + const activityReport: PpuActivityReport = { + timestamp, + shardId, + lastBlock: ppuData.LastBlock, + fastPpu: ppuData.Fast, + fasterPpu: ppuData.Faster, + totalTransactions: 0, + }; + + // Get mempool transactions for validation + const poolResponse = await axios.get(`${config.apiServiceUrl}/pool?senderShard=${shardId}&size=10000`); + const transactions = poolResponse.data; + + if (transactions.length > 0) { + // Get network constants + const networkResponse = await axios.get(`${config.apiServiceUrl}/constants`); + const { minGasLimit, gasPerDataByte, gasPriceModifier } = networkResponse.data; + + // Calculate PPU for all transactions + const ppuValues = transactions.map((tx: { data?: string; gasLimit: string; gasPrice: string }) => { + const data = tx.data ? BinaryUtils.base64Decode(tx.data) : ''; + const gasLimit = Number(tx.gasLimit); + const gasPrice = Number(tx.gasPrice); + + const dataCost = minGasLimit + data.length * gasPerDataByte; + const executionCost = gasLimit - dataCost; + const initiallyPaidFee = dataCost * gasPrice + executionCost * gasPrice * Number(gasPriceModifier); + return Math.floor(initiallyPaidFee / gasLimit); + }); + + // Sort PPU values and calculate percentiles + const sortedPpuValues = [...ppuValues].sort((a, b) => b - a); + const fastIndex = Math.floor(transactions.length * 0.2); // 20th percentile + const fasterIndex = Math.floor(transactions.length * 0.1); // 10th percentile + + console.log(`\nMempool Analysis for shard ${shardId}:`); + console.log(`- Total transactions: ${transactions.length}`); + console.log(`- Calculated Fast PPU (20th percentile): ${sortedPpuValues[fastIndex]}`); + console.log(`- Calculated Faster PPU (10th percentile): ${sortedPpuValues[fasterIndex]}`); + + // Calculate and log the difference + const fastDiff = ppuData.Fast > 0 ? Math.abs(ppuData.Fast - sortedPpuValues[fastIndex]) / ppuData.Fast : 0; + const fasterDiff = ppuData.Faster > 0 ? Math.abs(ppuData.Faster - sortedPpuValues[fasterIndex]) / ppuData.Faster : 0; + + console.log(`- Fast PPU difference: ${(fastDiff * 100).toFixed(2)}%`); + console.log(`- Faster PPU difference: ${(fasterDiff * 100).toFixed(2)}%`); + + activityReport.totalTransactions = transactions.length; + activityReport.mempoolAnalysis = { + calculatedFastPpu: sortedPpuValues[fastIndex], + calculatedFasterPpu: sortedPpuValues[fasterIndex], + fastPpuDifference: fastDiff, + fasterPpuDifference: fasterDiff, + transactionCount: transactions.length, + }; + + // Save the activity report + const reportsDir = path.join(__dirname, '../../../reports/ppu-activity'); + if (!fs.existsSync(reportsDir)) { + fs.mkdirSync(reportsDir, { recursive: true }); + } + + const safeTimestamp = timestamp.replace(/[:.]/g, '-'); + const filename = path.join(reportsDir, `ppu-activity-shard-${shardId}-${safeTimestamp}.json`); + fs.writeFileSync(filename, JSON.stringify(activityReport, null, 2)); + console.log(`\nActivity report saved to: ${filename}`); + } + } + } catch (error) { + console.error(`Error monitoring PPU for shard ${shardId}:`, error); + } + } + // Wait before next check + await new Promise(resolve => setTimeout(resolve, 2000)); + } + }; + + // Start the monitoring process + void monitor(); + + // Return function to stop monitoring + return () => { + shouldContinue = false; + }; +} + +interface PpuReportData { + timestamp: string; + batchNumber: number; + shards: { + [key: number]: { + lastBlock: number; + fastPpu: number; + fasterPpu: number; + totalTransactions: number; + ppuDistribution?: { + highest: number; + fast: number; + faster: number; + lowest: number; + }; + validation?: { + fastDiff: number; + fasterDiff: number; + }; + transactionDistribution?: { + regular: number; + smartContract: number; + }; + }; + }; +} + +function calculatePpuDifference(actualPpu: number, calculatedPpu: number): number { + if (actualPpu === 0 || calculatedPpu === 0) { + return 0; + } + + // Calculate the relative difference as a percentage + const relativeDiff = Math.abs(actualPpu - calculatedPpu) / Math.max(actualPpu, calculatedPpu); + + // We consider differences of less than 1% as acceptable + return relativeDiff; +} + +async function getFinalPpuReport(batchNumber?: number): Promise { + const reportData: PpuReportData = { + timestamp: new Date().toISOString(), + batchNumber: batchNumber || 0, + shards: {}, + }; + + console.log('\n=== PPU Report' + (batchNumber ? ` after batch ${batchNumber}` : '') + ' ==='); + + for (let shardId = 0; shardId <= 2; shardId++) { + try { + console.log(`\nShard ${shardId}:`); + console.log('------------------------'); + + // Get PPU data + const ppuResponse = await axios.get(`${config.apiServiceUrl}/transactions/ppu/${shardId}`); + const ppuData = ppuResponse.data; + + // Get mempool transactions + const poolResponse = await axios.get(`${config.apiServiceUrl}/pool?senderShard=${shardId}&size=10000`); + const transactions = poolResponse.data; + + reportData.shards[shardId] = { + lastBlock: ppuData.LastBlock, + fastPpu: ppuData.Fast, + fasterPpu: ppuData.Faster, + totalTransactions: transactions.length, + }; + + console.log(`Last Block: ${ppuData.LastBlock}`); + console.log(`Fast PPU: ${ppuData.Fast}`); + console.log(`Faster PPU: ${ppuData.Faster}`); + console.log(`Total transactions in mempool: ${transactions.length}`); + + if (transactions.length > 0) { + // Get network constants + const networkResponse = await axios.get(`${config.apiServiceUrl}/constants`); + const { minGasLimit, gasPerDataByte, gasPriceModifier } = networkResponse.data; + + // Calculate PPU distribution + const ppuValues = transactions.map((tx: { data?: string; gasLimit: string; gasPrice: string }) => { + const data = tx.data ? BinaryUtils.base64Decode(tx.data) : ''; + const gasLimit = Number(tx.gasLimit); + const gasPrice = Number(tx.gasPrice); + + const dataCost = minGasLimit + data.length * gasPerDataByte; + const executionCost = gasLimit - dataCost; + const initiallyPaidFee = dataCost * gasPrice + executionCost * gasPrice * Number(gasPriceModifier); + return Math.floor(initiallyPaidFee / gasLimit); + }); + + // Sort and get statistics + const sortedPpuValues = [...ppuValues].sort((a, b) => b - a); + const fastIndex = Math.floor(transactions.length * 0.2); + const fasterIndex = Math.floor(transactions.length * 0.1); + + console.log('\nPPU Distribution:'); + console.log(`Highest PPU: ${sortedPpuValues[0]}`); + console.log(`Calculated Fast PPU (20th percentile): ${sortedPpuValues[fastIndex]}`); + console.log(`Calculated Faster PPU (10th percentile): ${sortedPpuValues[fasterIndex]}`); + console.log(`Lowest PPU: ${sortedPpuValues[sortedPpuValues.length - 1]}`); + + reportData.shards[shardId].ppuDistribution = { + highest: sortedPpuValues[0], + fast: sortedPpuValues[fastIndex], + faster: sortedPpuValues[fasterIndex], + lowest: sortedPpuValues[sortedPpuValues.length - 1], + }; + + // Calculate differences using the new method + const fastDiff = calculatePpuDifference(ppuData.Fast, sortedPpuValues[fastIndex]); + const fasterDiff = calculatePpuDifference(ppuData.Faster, sortedPpuValues[fasterIndex]); + + console.log('\nPPU Analysis:'); + console.log(`Fast PPU from API: ${ppuData.Fast}`); + console.log(`Fast PPU calculated (20th percentile): ${sortedPpuValues[fastIndex]}`); + console.log(`Fast PPU difference: ${(fastDiff * 100).toFixed(2)}%`); + + console.log(`\nFaster PPU from API: ${ppuData.Faster}`); + console.log(`Faster PPU calculated (10th percentile): ${sortedPpuValues[fasterIndex]}`); + console.log(`Faster PPU difference: ${(fasterDiff * 100).toFixed(2)}%`); + + if (fastDiff > 0.1 || fasterDiff > 0.1) { + console.log('\n⚠️ Warning: Large PPU difference detected!'); + console.log('This might indicate:'); + console.log('1. High mempool congestion'); + console.log('2. Rapid changes in gas prices'); + console.log('3. Potential calculation discrepancies'); + } + + reportData.shards[shardId].validation = { + fastDiff: fastDiff, + fasterDiff: fasterDiff, + }; + + // Transaction type distribution + const scTransactions = transactions.filter((tx: { data?: string }) => + tx.data && BinaryUtils.base64Decode(tx.data).startsWith('ping') + ).length; + const regularTransactions = transactions.length - scTransactions; + + console.log('\nTransaction Distribution:'); + console.log(`Regular transactions: ${regularTransactions}`); + console.log(`Smart Contract transactions: ${scTransactions}`); + + reportData.shards[shardId].transactionDistribution = { + regular: regularTransactions, + smartContract: scTransactions, + }; + } + } catch (error) { + console.error(`Error getting final report for shard ${shardId}:`, error); + } + } + + // Save report to file + const reportsDir = path.join(__dirname, '../../../reports'); + if (!fs.existsSync(reportsDir)) { + fs.mkdirSync(reportsDir, { recursive: true }); + } + + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + const filename = path.join(reportsDir, `ppu-report-${batchNumber ? `batch-${batchNumber}-` : ''}${timestamp}.json`); + + fs.writeFileSync(filename, JSON.stringify(reportData, null, 2)); + console.log(`\nReport saved to: ${filename}`); + + return reportData; +} + +async function createContinuousCongestion(addresses: Record, pingPongAddress: string) { + console.log('Starting continuous congestion generation...'); + + let batchNumber = 1; + + // Create transactions with realistic gas prices, including higher values + const gasPrices = [ + 1000000000, + 2000000000, + 3000000000, + 5000000000, + 7000000000, + 10000000000, + 15000000000, + 20000000000, + ]; + + // Create transactions with different data sizes, including larger ones + const dataSizes = [ + '', // Empty data + 'small data field', // Small data + 'a'.repeat(100), // Medium data + 'a'.repeat(500), // Large data + 'a'.repeat(1000), // Very large data + 'a'.repeat(2000), // Extra large data + 'a'.repeat(5000), // Huge data + 'a'.repeat(10000), // Massive data + ]; + + // Smart contract function calls with varying complexity + const scCalls = [ + 'ping', + 'ping@01', + 'ping@0123456789', + 'ping@' + 'a'.repeat(100), // Large argument + 'ping@' + 'a'.repeat(500), // Very large argument + 'ping@' + 'a'.repeat(1000), // Massive argument + ]; + + // Gas limits for smart contracts, including higher values + const scGasLimits = [ + 150000000, // 150M + 200000000, // 200M + 300000000, // 300M + 400000000, // 400M + ]; + + while (batchNumber <= 4) { + console.log(`\nCreating transaction batch ${batchNumber}...`); + + // Create a mix of regular and smart contract transactions + for (const [, sender] of Object.entries(addresses)) { + // Regular transactions - create more heavy ones + for (const gasPrice of gasPrices) { + for (const dataField of dataSizes) { + for (const receiver of Object.values(addresses)) { + if (sender !== receiver) { + // Add more transactions for higher gas prices + const repeatCount = gasPrice >= 10000000000 ? 3 : 1; // Create more high-gas-price transactions + + for (let i = 0; i < repeatCount; i++) { + await sendTransaction( + new SendTransactionArgs({ + chainSimulatorUrl: config.chainSimulatorUrl, + sender: sender, + receiver: receiver, + dataField: dataField, + value: '1000000000000000000', + gasLimit: 50000000 + (dataField.length * 1500), // Adjust gas limit based on data size + nonceOffset: Math.floor(Math.random() * 5), + gasPrice: gasPrice.toString(), + }) + ); + } + } + } + } + } + + // Smart contract transactions - create more heavy ones + for (const gasPrice of gasPrices) { + for (const scCall of scCalls) { + for (const gasLimit of scGasLimits) { + // Add more transactions for higher gas prices + const repeatCount = gasPrice >= 10000000000 ? 3 : 1; + + for (let i = 0; i < repeatCount; i++) { + await sendTransaction( + new SendTransactionArgs({ + chainSimulatorUrl: config.chainSimulatorUrl, + sender: sender, + receiver: pingPongAddress, + dataField: scCall, + value: '1000000000000000000', + gasLimit: gasLimit, + nonceOffset: Math.floor(Math.random() * 5), + gasPrice: gasPrice.toString(), + }) + ); + } + } + } + } + } + + console.log(`✓ Batch ${batchNumber} created`); + + // Generate and save report after each batch + console.log('\nGenerating report for this batch...'); + await getFinalPpuReport(batchNumber); + + // Wait a bit before next batch to allow some transactions to be processed + console.log('\nWaiting for transactions to be processed before next batch...'); + await new Promise(resolve => setTimeout(resolve, 5000)); + + batchNumber++; + } +} + +// Run the test +void testPpuCalculation(); diff --git a/src/test/unit/controllers/identities.controller.spec.ts b/src/test/unit/controllers/identities.controller.spec.ts index b159977b1..e92305430 100644 --- a/src/test/unit/controllers/identities.controller.spec.ts +++ b/src/test/unit/controllers/identities.controller.spec.ts @@ -5,6 +5,7 @@ import { mockIdentityService } from "./services.mock/identity.services.mock"; import { IdentitiesController } from "src/endpoints/identities/identities.controller"; import { PublicAppModule } from "src/public.app.module"; import { IdentitiesService } from "src/endpoints/identities/identities.service"; +import { IdentitySortCriteria } from "src/endpoints/identities/entities/identity.sort.criteria"; describe('IdentityController', () => { let app: INestApplication; @@ -38,6 +39,54 @@ describe('IdentityController', () => { expect(response.body.length).toBe(5); }); }); + + it('should properly handle single sort criteria', async () => { + const mockIdentitiesList = createMockIdentitiesList(5); + identitiesServiceMocks.getIdentities.mockResolvedValue(mockIdentitiesList); + + await request(app.getHttpServer()) + .get(`${path}?sort=validators`) + .expect(200) + .expect(() => { + expect(identitiesServiceMocks.getIdentities).toHaveBeenCalledWith( + expect.any(Object), + expect.any(Array), + [IdentitySortCriteria.validators] + ); + }); + }); + + it('should properly handle multiple sort criteria', async () => { + const mockIdentitiesList = createMockIdentitiesList(5); + identitiesServiceMocks.getIdentities.mockResolvedValue(mockIdentitiesList); + + await request(app.getHttpServer()) + .get(`${path}?sort=validators,locked`) + .expect(200) + .expect(() => { + expect(identitiesServiceMocks.getIdentities).toHaveBeenCalledWith( + expect.any(Object), + expect.any(Array), + [IdentitySortCriteria.validators, IdentitySortCriteria.locked] + ); + }); + }); + + it('should properly handle the stake sort criterion', async () => { + const mockIdentitiesList = createMockIdentitiesList(5); + identitiesServiceMocks.getIdentities.mockResolvedValue(mockIdentitiesList); + + await request(app.getHttpServer()) + .get(`${path}?sort=stake`) + .expect(200) + .expect(() => { + expect(identitiesServiceMocks.getIdentities).toHaveBeenCalledWith( + expect.any(Object), + expect.any(Array), + [IdentitySortCriteria.stake] + ); + }); + }); }); describe("GET /identities/:identifier", () => { diff --git a/src/test/unit/controllers/media.controller.spec.ts b/src/test/unit/controllers/media.controller.spec.ts new file mode 100644 index 000000000..1570042d4 --- /dev/null +++ b/src/test/unit/controllers/media.controller.spec.ts @@ -0,0 +1,55 @@ +import { INestApplication } from "@nestjs/common"; +import { Test } from "@nestjs/testing"; +import request = require('supertest'); +import { MediaController } from "src/endpoints/media/media.controller"; +import { PublicAppModule } from "src/public.app.module"; +import { MediaService } from "src/endpoints/media/media.service"; + +describe('MediaController', () => { + let app: INestApplication; + const path: string = "/media"; + + const mediaService = { + getRedirectUrl: jest.fn(), + }; + + beforeAll(async () => { + const moduleRef = await Test.createTestingModule({ + controllers: [MediaController], + imports: [PublicAppModule], + }) + .overrideProvider(MediaService) + .useValue(mediaService) + .compile(); + + app = moduleRef.createNestApplication(); + await app.init(); + }); + + it(`/GET media/:uri(*)`, async () => { + const mockUrl = 'https://s3.amazonaws.com/media.elrond.com/nfts/thumbnail/XPACHIEVE-5a0519-e302a15d'; + + mediaService.getRedirectUrl.mockResolvedValue(mockUrl); + + await request(app.getHttpServer()) + .get(`${path}/nfts/thumbnail/XPACHIEVE-5a0519-e302a15d`) + .expect(200) + .expect('content-type', 'image/jpeg') + .expect('cache-control', 'max-age=60') + .expect('Access-Control-Allow-Origin', '*'); + + expect(mediaService.getRedirectUrl).toHaveBeenCalled(); + }); + + it(`/GET media/:uri(*) - not found`, async () => { + mediaService.getRedirectUrl.mockResolvedValue(undefined); + + await request(app.getHttpServer()) + .get(`${path}/nfts/thumbnail/XPACHIEVE-5a0519-e302a15d`) + .expect(404); + }); + + afterAll(async () => { + await app.close(); + }); +}); diff --git a/src/test/unit/controllers/network.controller.spec.ts b/src/test/unit/controllers/network.controller.spec.ts index a032ebff6..f902919a9 100644 --- a/src/test/unit/controllers/network.controller.spec.ts +++ b/src/test/unit/controllers/network.controller.spec.ts @@ -36,6 +36,7 @@ describe("NetworkController", () => { minGasLimit: 50000, minGasPrice: 1000000000, minTransactionVersion: 1, + gasPriceModifier: "0.000000000000000000", }; networkServiceMocks.getConstants.mockResolvedValue(mockConstants); diff --git a/src/test/unit/controllers/scresults.controller.spec.ts b/src/test/unit/controllers/scresults.controller.spec.ts index c2e6bc3e2..5e9e5738f 100644 --- a/src/test/unit/controllers/scresults.controller.spec.ts +++ b/src/test/unit/controllers/scresults.controller.spec.ts @@ -9,11 +9,14 @@ import { SmartContractResultFilter } from "src/endpoints/sc-results/entities/sma import { ConfigModule } from "@nestjs/config"; import { PublicAppModule } from "src/public.app.module"; import { SmartContractResultOptions } from "src/endpoints/sc-results/entities/smart.contract.result.options"; +import { PoolService } from "src/endpoints/pool/pool.service"; +import { mockPoolService } from "./services.mock/pool.services.mock"; describe('CollectionController', () => { let app: INestApplication; const path = '/results'; const scResultsServiceMocks = mockScResultsService(); + const poolServiceMocks = mockPoolService(); beforeEach(async () => { jest.resetAllMocks(); @@ -24,6 +27,7 @@ describe('CollectionController', () => { ], }) .overrideProvider(SmartContractResultService).useValue(scResultsServiceMocks) + .overrideProvider(PoolService).useValue(poolServiceMocks) .compile(); app = moduleFixture.createNestApplication(); diff --git a/src/test/unit/controllers/services.mock/account.services.mock.ts b/src/test/unit/controllers/services.mock/account.services.mock.ts index 954062ae2..5eb918811 100644 --- a/src/test/unit/controllers/services.mock/account.services.mock.ts +++ b/src/test/unit/controllers/services.mock/account.services.mock.ts @@ -75,6 +75,7 @@ export const mockApiConfigService = () => ({ getPoolLimit: jest.fn().mockReturnValue(''), getProcessTtl: jest.fn().mockReturnValue(''), getExternalMediaUrl: jest.fn().mockReturnValue(''), + getMediaUrl: jest.fn().mockReturnValue(''), getConfig: jest.fn(), }); diff --git a/src/test/unit/controllers/web.socket.publiser.controller.spec.ts b/src/test/unit/controllers/web.socket.publiser.controller.spec.ts index 91fc3bb9c..a9edc0fb1 100644 --- a/src/test/unit/controllers/web.socket.publiser.controller.spec.ts +++ b/src/test/unit/controllers/web.socket.publiser.controller.spec.ts @@ -1,4 +1,4 @@ -import { ShardTransaction } from "@elrondnetwork/transaction-processor"; +import { ShardTransaction } from "@multiversx/sdk-transaction-processor"; import { TestingModule, Test } from "@nestjs/testing"; import { EventEmitter2 } from "@nestjs/event-emitter"; import { WebSocketPublisherController } from "src/common/websockets/web-socket-publisher-controller"; diff --git a/src/test/unit/services/api.config.spec.ts b/src/test/unit/services/api.config.spec.ts index 80dce0ab5..a0c5650d8 100644 --- a/src/test/unit/services/api.config.spec.ts +++ b/src/test/unit/services/api.config.spec.ts @@ -1096,7 +1096,7 @@ describe('API Config', () => { expect(results).toEqual('https://media.elrond.com'); }); - it("should throw error because test simulates that media url is not defined", () => { + it.skip("should throw error because test simulates that media url is not defined", () => { jest .spyOn(ConfigService.prototype, 'get') .mockImplementation(jest.fn(() => undefined)); @@ -1111,7 +1111,7 @@ describe('API Config', () => { .spyOn(ConfigService.prototype, "get") .mockImplementation(jest.fn(() => 'https://media-internal.elrond.com')); - const results = apiConfigService.getMediaUrl(); + const results = apiConfigService.getMediaInternalUrl(); expect(results).toEqual('https://media-internal.elrond.com'); }); diff --git a/src/test/unit/services/blocks.spec.ts b/src/test/unit/services/blocks.spec.ts index 9730e0ddb..6d6e05587 100644 --- a/src/test/unit/services/blocks.spec.ts +++ b/src/test/unit/services/blocks.spec.ts @@ -10,6 +10,7 @@ import { IdentitiesService } from "src/endpoints/identities/identities.service"; import { NodeService } from "src/endpoints/nodes/node.service"; import { CacheInfo } from "src/utils/cache.info"; import { BlockProofDto } from "../../../endpoints/blocks/entities/block.proof"; +import { ApiConfigService } from "../../../common/api-config/api.config.service"; describe('Block Service', () => { let blockService: BlockService; @@ -57,6 +58,13 @@ describe('Block Service', () => { getIdentity: jest.fn(), }, }, + { + provide: ApiConfigService, + useValue: { + isChainAndromedaEnabled: jest.fn(), + getChainAndromedaActivationEpoch: jest.fn(), + }, + }, ], }).compile(); diff --git a/src/test/unit/services/media.spec.ts b/src/test/unit/services/media.spec.ts new file mode 100644 index 000000000..da602aeae --- /dev/null +++ b/src/test/unit/services/media.spec.ts @@ -0,0 +1,135 @@ +import { ApiService } from "@multiversx/sdk-nestjs-http"; +import { Test } from "@nestjs/testing"; +import { ApiConfigService } from "src/common/api-config/api.config.service"; +import { MediaService } from "src/endpoints/media/media.service"; + +describe('MediaService', () => { + let mediaService: MediaService; + let apiConfigService: ApiConfigService; + let apiService: ApiService; + + beforeEach(async () => { + const moduleRef = await Test.createTestingModule({ + providers: [ + MediaService, + { + provide: ApiConfigService, + useValue: { + getNetwork: jest.fn(), + isMediaRedirectFeatureEnabled: jest.fn(), + getMediaRedirectFileStorageUrls: jest.fn(), + }, + }, + { + provide: ApiService, + useValue: { + head: jest.fn(), + }, + }, + ], + }).compile(); + + mediaService = moduleRef.get(MediaService); + apiConfigService = moduleRef.get(ApiConfigService); + apiService = moduleRef.get(ApiService); + }); + + describe('redirectToMediaUri', () => { + it.skip('should throw BadRequestException when media redirect feature is disabled', async () => { + jest.spyOn(apiConfigService, 'isMediaRedirectFeatureEnabled').mockReturnValueOnce(false); + + await expect(mediaService.getRedirectUrl('url')).rejects.toThrowError('Media redirect is not allowed'); + }); + + it('should return redirect url for providers logos', async () => { + jest.spyOn(apiConfigService, 'isMediaRedirectFeatureEnabled').mockReturnValueOnce(true); + + const uri = 'providers/asset/test.png'; + const expectedUri = 'keybase_processed_uploads/test.png'; + const expectedUrl = `https://s3.amazonaws.com/${expectedUri}`; + + const result = await mediaService.getRedirectUrl(uri); + + expect(result).toBe(expectedUrl); + }); + + it('should return redirect url for tokens logos', async () => { + jest.spyOn(apiConfigService, 'isMediaRedirectFeatureEnabled').mockReturnValueOnce(true); + + const network = 'devnet'; + jest.spyOn(apiConfigService, 'getNetwork').mockReturnValueOnce(network); + + const uri = 'tokens/asset/test.png'; + const expectedUri = `multiversx/mx-assets/master/${network}/tokens/test.png`; + const expectedUrl = `https://raw.githubusercontent.com/${expectedUri}`; + + const result = await mediaService.getRedirectUrl(uri); + + expect(result).toBe(expectedUrl); + }); + + it('should return redirect url for tokens logos on mainnet', async () => { + jest.spyOn(apiConfigService, 'isMediaRedirectFeatureEnabled').mockReturnValueOnce(true); + jest.spyOn(apiConfigService, 'getNetwork').mockReturnValueOnce('mainnet'); + + const uri = 'tokens/asset/test.png'; + const expectedUri = `multiversx/mx-assets/master/tokens/test.png`; + const expectedUrl = `https://raw.githubusercontent.com/${expectedUri}`; + + const result = await mediaService.getRedirectUrl(uri); + + expect(result).toBe(expectedUrl); + }); + + it('should return redirect url to storage urls', async () => { + jest.spyOn(apiConfigService, 'isMediaRedirectFeatureEnabled').mockReturnValueOnce(true); + jest.spyOn(apiConfigService, 'getMediaRedirectFileStorageUrls').mockReturnValueOnce(['https://s3.amazonaws.com']); + jest.spyOn(apiService, 'head').mockResolvedValueOnce({ status: 200 }); + + const uri = 'test.png'; + const expectedUrl = `https://s3.amazonaws.com/${uri}`; + + const result = await mediaService.getRedirectUrl(uri); + + expect(result).toBe(expectedUrl); + }); + + it('should return undefined when not found in file storage urls', async () => { + jest.spyOn(apiConfigService, 'isMediaRedirectFeatureEnabled').mockReturnValueOnce(true); + jest.spyOn(apiConfigService, 'getMediaRedirectFileStorageUrls').mockReturnValueOnce(['https://s3.amazonaws.com']); + jest.spyOn(apiService, 'head').mockResolvedValueOnce({ status: 404 }); + + const uri = 'test.png'; + + const result = await mediaService.getRedirectUrl(uri); + + expect(result).toBeUndefined(); + }); + + it('should return redirect url for nfts assets', async () => { + jest.spyOn(apiConfigService, 'isMediaRedirectFeatureEnabled').mockReturnValueOnce(true); + jest.spyOn(apiConfigService, 'getMediaRedirectFileStorageUrls').mockReturnValueOnce([]); + + const uri = 'nfts/asset/test.png'; + const expectedUri = `ipfs/test.png`; + const expectedUrl = `https://ipfs.io/${expectedUri}`; + + const result = await mediaService.getRedirectUrl(uri); + + expect(result).toBe(expectedUrl); + }); + + it('should return redirect to fallback thumbnail if not found in file storage urls', async () => { + jest.spyOn(apiConfigService, 'isMediaRedirectFeatureEnabled').mockReturnValueOnce(true); + jest.spyOn(apiConfigService, 'getMediaRedirectFileStorageUrls').mockReturnValueOnce(['https://s3.amazonaws.com']); + jest.spyOn(apiService, 'head').mockResolvedValueOnce({ status: 404 }); + + const uri = 'nfts/thumbnail/random'; + const expectedUrl = `https://s3.amazonaws.com/nfts/thumbnail/default.png`; + + const result = await mediaService.getRedirectUrl(uri); + + expect(result).toBe(expectedUrl); + }); + }); +}); diff --git a/src/test/unit/services/rounds.spec.ts b/src/test/unit/services/rounds.spec.ts index ee328eeeb..755c8fbbf 100644 --- a/src/test/unit/services/rounds.spec.ts +++ b/src/test/unit/services/rounds.spec.ts @@ -5,10 +5,14 @@ import { BlsService } from "src/endpoints/bls/bls.service"; import { RoundDetailed } from "src/endpoints/rounds/entities/round.detailed"; import { RoundFilter } from "src/endpoints/rounds/entities/round.filter"; import { RoundService } from "src/endpoints/rounds/round.service"; +import { ApiConfigService } from "../../../common/api-config/api.config.service"; +import { BlockService } from "../../../endpoints/blocks/block.service"; describe('RoundService', () => { let roundService: RoundService; let indexerService: IndexerService; + let blockService: BlockService; + let apiConfigService: ApiConfigService; beforeEach(async () => { const moduleRef = await Test.createTestingModule({ @@ -28,12 +32,26 @@ describe('RoundService', () => { getPublicKeys: jest.fn(), }, }, - + { + provide: ApiConfigService, + useValue: { + isChainAndromedaEnabled: jest.fn(), + getChainAndromedaActivationEpoch: jest.fn(), + }, + }, + { + provide: BlockService, + useValue: { + getCurrentEpoch: jest.fn(), + }, + }, ], }).compile(); roundService = moduleRef.get(RoundService); indexerService = moduleRef.get(IndexerService); + blockService = moduleRef.get(BlockService); + apiConfigService = moduleRef.get(ApiConfigService); }); describe('getRoundCount', () => { @@ -97,6 +115,74 @@ describe('RoundService', () => { expect(indexerService.getRounds).toHaveBeenCalledWith(filter); expect(result).toEqual(expectedRounds); }); + + it('should remove validator filter if Andromeda is active', async () => { + const filter = new RoundFilter(); + filter.shard = 0; + filter.validator = 'should not exist'; + + jest.spyOn(blockService, 'getCurrentEpoch').mockResolvedValue(10); + jest.spyOn(apiConfigService, 'isChainAndromedaEnabled').mockReturnValue(true); + jest.spyOn(apiConfigService, 'getChainAndromedaActivationEpoch').mockReturnValue(9); + + const indexerRoundsMock: Round[] = [ + { + round: 1, + signersIndexes: [], + blockWasProposed: true, + shardId: 0, + epoch: 0, + timestamp: 1596117606, + }, + { + round: 1, + signersIndexes: [], + blockWasProposed: true, + shardId: 0, + epoch: 0, + timestamp: 1596117116, + }, + ]; + jest.spyOn(indexerService, 'getRounds').mockResolvedValue(indexerRoundsMock); + + await roundService.getRounds(filter); + + expect(indexerService.getRounds).toHaveBeenCalledWith(new RoundFilter({ shard: 0, validator: undefined })); + }); + + it('should keep validator filter if Andromeda is active', async () => { + const filter = new RoundFilter(); + filter.shard = 0; + filter.validator = 'should exist'; + + jest.spyOn(blockService, 'getCurrentEpoch').mockResolvedValue(10); + jest.spyOn(apiConfigService, 'isChainAndromedaEnabled').mockReturnValue(true); + jest.spyOn(apiConfigService, 'getChainAndromedaActivationEpoch').mockReturnValue(11); + + const indexerRoundsMock: Round[] = [ + { + round: 1, + signersIndexes: [], + blockWasProposed: true, + shardId: 0, + epoch: 0, + timestamp: 1596117606, + }, + { + round: 1, + signersIndexes: [], + blockWasProposed: true, + shardId: 0, + epoch: 0, + timestamp: 1596117116, + }, + ]; + jest.spyOn(indexerService, 'getRounds').mockResolvedValue(indexerRoundsMock); + + await roundService.getRounds(filter); + + expect(indexerService.getRounds).toHaveBeenCalledWith(new RoundFilter({ shard: 0, validator: 'should exist' })); + }); }); describe('getRound', () => { @@ -113,14 +199,14 @@ describe('RoundService', () => { }; const expectedRound: RoundDetailed = - { - round: 10, - signers: [], - blockWasProposed: true, - shard: 0, - epoch: 0, - timestamp: 1596117606, - }; + { + round: 10, + signers: [], + blockWasProposed: true, + shard: 0, + epoch: 0, + timestamp: 1596117606, + }; jest.spyOn(indexerService, 'getRound').mockResolvedValue(indexerRoundMock); diff --git a/src/test/unit/services/transactions.spec.ts b/src/test/unit/services/transactions.spec.ts index 996ae2808..f943a2637 100644 --- a/src/test/unit/services/transactions.spec.ts +++ b/src/test/unit/services/transactions.spec.ts @@ -9,6 +9,9 @@ import { Transaction } from "src/common/indexer/entities/transaction"; import { IndexerService } from "src/common/indexer/indexer.service"; import { PluginService } from "src/common/plugins/plugin.service"; import { ProtocolService } from "src/common/protocol/protocol.service"; +import { BlockService } from "src/endpoints/blocks/block.service"; +import { NetworkService } from "src/endpoints/network/network.service"; +import { PoolService } from "src/endpoints/pool/pool.service"; import { TokenTransferService } from "src/endpoints/tokens/token.transfer.service"; import { TransactionFilter } from "src/endpoints/transactions/entities/transaction.filter"; import { TransactionActionService } from "src/endpoints/transactions/transaction-action/transaction.action.service"; @@ -110,6 +113,25 @@ describe('TransactionService', () => { getShardCount: jest.fn(), }, }, + { + provide: BlockService, + useValue: { + getBlockByHash: jest.fn(), + }, + }, + { + provide: PoolService, + useValue: { + getPool: jest.fn(), + }, + }, + { + provide: NetworkService, + useValue: { + getConstants: jest.fn(), + }, + }, + ], }).compile(); diff --git a/src/test/unit/utils/transaction.utils.spec.ts b/src/test/unit/utils/transaction.utils.spec.ts index 45f131a38..3421f495e 100644 --- a/src/test/unit/utils/transaction.utils.spec.ts +++ b/src/test/unit/utils/transaction.utils.spec.ts @@ -1,4 +1,4 @@ -import { ShardTransaction } from "@elrondnetwork/transaction-processor"; +import { ShardTransaction } from "@multiversx/sdk-transaction-processor"; import { TransferOwnershipExtractor } from "src/crons/transaction.processor/extractor/transfer.ownership.extractor"; import { NftCreateTransactionExtractor } from "src/crons/transaction.processor/extractor/nft.create.transaction.extractor"; import { NftUpdateAttributesTransactionExtractor } from "src/crons/transaction.processor/extractor/nft.update.attributes.transaction.extractor"; diff --git a/src/utils/cache.info.ts b/src/utils/cache.info.ts index b0d38e08a..531400971 100644 --- a/src/utils/cache.info.ts +++ b/src/utils/cache.info.ts @@ -703,4 +703,11 @@ export class CacheInfo { ttl: Constants.oneMinute() * 10, }; } + + static PpuMetadataByShard(shardId: number): CacheInfo { + return { + key: `ppuMetadata:shard:${shardId}`, + ttl: Constants.oneSecond() * 30, + }; + } }