From 06310143b87ace187e398a66692ac1f0c59fbeb6 Mon Sep 17 00:00:00 2001 From: Kacper Sawicki Date: Thu, 17 Oct 2024 09:46:26 +0200 Subject: [PATCH] Explorer V2 (#275) * Migrate explorer to use v2 api * Fix transaction status and overview values * Add new logic for search, fix atx page, fix overview, fix right side block on rewards page, fix issue with transaction row * Get sent/received for accounts list, fix epochs table, fix time block with account recent activity * Add account stats, add loaders, cleanup * Catch errors * Use discovery service url to get api conf * Override PUBLIC_API with env variable * Fix issues with page refresh. Query data per row instead of all at the same time. Add stats_api env to override networks.json. * Fix empty layer * Fix account right side block and add loaders for rewards and transactions * Fix right side block for smeshers and smeshers rewards page * Fix loading issues * Add malfeasance proofs * Add throttle warning popup * Fix rewards, transactions and minor issues * Clean-up * Set cache-control headers for index.html * Add check if api is initialized, modify malfeasance msg and fix other issues * Update env --- .env.example | 5 +- .github/workflows/ci.yaml | 5 +- .github/workflows/deploy.yaml | 44 +- api/.babelrc | 9 + api/.flowconfig | 11 + api/.gitignore | 1 + api/.openapi-generator-ignore | 23 + api/.openapi-generator/FILES | 8 + api/.openapi-generator/VERSION | 1 + api/README.md | 42 + api/lib/api.js | 981 +++++++ api/lib/api.js.flow | 1983 +++++++++++++ api/lib/configuration.js | 66 + api/lib/configuration.js.flow | 75 + api/lib/index.js | 12 + api/lib/index.js.flow | 15 + api/package.json | 35 + api/src/api.js | 1983 +++++++++++++ api/src/configuration.js | 75 + api/src/index.js | 15 + api/yarn.lock | 2581 +++++++++++++++++ openapitools.json | 7 + package.json | 8 +- src/api/fetchAPI.js | 15 - src/components/CountBlock/RightCountBlock.jsx | 7 +- src/components/CountBlock/RightSideBlock.jsx | 15 +- src/components/Header/index.jsx | 24 +- src/components/InfoBlock/index.jsx | 12 +- src/components/MalfeasanceBlock/index.jsx | 53 +- src/components/Search/index.jsx | 83 +- src/components/Table/AccountsRow.jsx | 47 +- src/components/Table/AppRow.jsx | 32 - src/components/Table/AtxsRow.jsx | 28 +- src/components/Table/EpochsRow.jsx | 47 +- src/components/Table/LayersRow.jsx | 47 +- src/components/Table/RewardsRow.jsx | 23 +- src/components/Table/SmesherRow.jsx | 63 +- src/components/Table/TransactionsRow.jsx | 47 +- .../Table/config/tableFieldConfig.js | 19 - src/components/Table/index.js | 422 ++- src/components/ThrottleWarningPopup/index.jsx | 51 + src/components/TimeBlock/index.jsx | 17 +- src/components/TxnsStatus/index.jsx | 5 +- src/config/titleBlockConfig.js | 32 - src/helper/converter.js | 11 + src/helper/grba.js | 3 - src/helper/hashFilter.js | 6 - src/helper/isEmpty.js | 8 - src/helper/mocker.js | 297 -- src/helper/tx.js | 66 +- src/index.jsx | 3 +- src/router/index.js | 37 +- src/routes/accounts/account-rewards.jsx | 70 +- src/routes/accounts/account-txns.jsx | 49 - src/routes/accounts/account.jsx | 78 +- src/routes/accounts/accounts.jsx | 60 +- src/routes/accounts/index.js | 3 +- src/routes/atx.jsx | 175 +- src/routes/epochs/epoch-atxs.jsx | 48 - src/routes/epochs/epoch-layers.jsx | 19 +- src/routes/epochs/epoch-rewards.jsx | 57 +- src/routes/epochs/epoch-smeshers.jsx | 56 +- src/routes/epochs/epoch-txns.jsx | 57 +- src/routes/epochs/epoch.jsx | 160 +- src/routes/epochs/epochs.jsx | 42 +- src/routes/epochs/index.js | 3 +- src/routes/layers/index.js | 5 +- src/routes/layers/layer-atxs.jsx | 47 - src/routes/layers/layer-blocks.jsx | 48 - src/routes/layers/layer-rewards.jsx | 5 +- src/routes/layers/layer-smeshers.jsx | 35 - src/routes/layers/layer-txns.jsx | 81 +- src/routes/layers/layer.jsx | 74 +- src/routes/layers/layers.jsx | 26 +- src/routes/overview.jsx | 66 +- src/routes/reward.jsx | 111 - src/routes/rewards.jsx | 26 +- src/routes/rewardv2.jsx | 170 +- src/routes/root.jsx | 2 + src/routes/smeshers/index.js | 3 +- src/routes/smeshers/smesher-atxs.jsx | 49 - src/routes/smeshers/smesher-rewards.jsx | 65 +- src/routes/smeshers/smesher.jsx | 86 +- src/routes/smeshers/smeshers.jsx | 49 +- src/routes/tx.jsx | 88 +- src/routes/txns.jsx | 6 +- src/store/index.jsx | 189 +- src/styles/components/common/_table.scss | 1 + 88 files changed, 9805 insertions(+), 1809 deletions(-) create mode 100644 api/.babelrc create mode 100644 api/.flowconfig create mode 100644 api/.gitignore create mode 100644 api/.openapi-generator-ignore create mode 100644 api/.openapi-generator/FILES create mode 100644 api/.openapi-generator/VERSION create mode 100644 api/README.md create mode 100644 api/lib/api.js create mode 100644 api/lib/api.js.flow create mode 100644 api/lib/configuration.js create mode 100644 api/lib/configuration.js.flow create mode 100644 api/lib/index.js create mode 100644 api/lib/index.js.flow create mode 100644 api/package.json create mode 100644 api/src/api.js create mode 100644 api/src/configuration.js create mode 100644 api/src/index.js create mode 100644 api/yarn.lock create mode 100644 openapitools.json delete mode 100644 src/api/fetchAPI.js delete mode 100644 src/components/Table/AppRow.jsx create mode 100644 src/components/ThrottleWarningPopup/index.jsx delete mode 100644 src/config/titleBlockConfig.js delete mode 100644 src/helper/grba.js delete mode 100644 src/helper/hashFilter.js delete mode 100644 src/helper/isEmpty.js delete mode 100644 src/helper/mocker.js delete mode 100644 src/routes/accounts/account-txns.jsx delete mode 100644 src/routes/epochs/epoch-atxs.jsx delete mode 100644 src/routes/layers/layer-atxs.jsx delete mode 100644 src/routes/layers/layer-blocks.jsx delete mode 100644 src/routes/layers/layer-smeshers.jsx delete mode 100644 src/routes/reward.jsx delete mode 100644 src/routes/smeshers/smesher-atxs.jsx diff --git a/.env.example b/.env.example index ab575b8..1674de4 100644 --- a/.env.example +++ b/.env.example @@ -1 +1,4 @@ -REACT_APP_DISCOVERY_SERVICE_URL= +REACT_APP_API_BASE_URL=http://localhost:9094 +REACT_APP_CUSTOM_API_URL=http://localhost:5001 +REACT_APP_BITS_PER_LABEL=128 +REACT_APP_LABELS_PER_UNIT=1024 \ No newline at end of file diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8579379..88c4875 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -11,7 +11,10 @@ jobs: - name: Build env: - REACT_APP_DISCOVERY_SERVICE_URL: https://configs.spacemesh.network/networks.json + REACT_APP_API_BASE_URL: https://localhost:9094 + REACT_APP_CUSTOM_API_URL: http://localhost:5001 + REACT_APP_BITS_PER_LABEL: 128 + REACT_APP_LABELS_PER_UNIT: 1024 run: | yarn yarn build \ No newline at end of file diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 0e60d0b..24ba026 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -19,6 +19,7 @@ jobs: - name: Build to Mainnet Explorer env: REACT_APP_DISCOVERY_SERVICE_URL: https://configs.spacemesh.network/networks.json + REACT_APP_LABELS_PER_UNIT: 4294967296 run: | yarn yarn build @@ -26,6 +27,9 @@ jobs: - name: Upload to Mainnet Explorer run: gsutil -m rsync -r -d ./build gs://spacemesh-explorer + - name: Set cache-control headers for Mainnet Explorer + run: gsutil -m setmeta -h "Cache-Control:public, max-age=0, no-transform" -r gs://spacemesh-explorer/index.html + - name: Remove build dir run: rm -rf ./build @@ -39,43 +43,3 @@ jobs: - name: Upload to Dev Explorer run: gsutil -m rsync -r -d ./build gs://spacemesh-explorer-dev - - - name: Build to testnet-15 Explorer - env: - REACT_APP_DISCOVERY_SERVICE_URL: https://configs.spacemesh.network/networks-testnet-15.json - run: | - yarn - yarn build - - - name: Upload to testnet-15 Explorer - run: gsutil -m rsync -r -d ./build gs://testnet-15-explorer.spacemesh.network - - - name: Build to testnet-atxmerge2 Explorer - env: - REACT_APP_DISCOVERY_SERVICE_URL: https://configs.spacemesh.network/networks-testnet-atxmerge2.json - run: | - yarn - yarn build - - - name: Upload to testnet-atxmerge2 Explorer - run: gsutil -m rsync -r -d ./build gs://testnet-atxmerge2-explorer.spacemesh.network - - - name: Build to testnet-atxmerge3 Explorer - env: - REACT_APP_DISCOVERY_SERVICE_URL: https://configs.spacemesh.network/networks-testnet-atxmerge3.json - run: | - yarn - yarn build - - - name: Upload to testnet-atxmerge3 Explorer - run: gsutil -m rsync -r -d ./build gs://testnet-atxmerge3-explorer.spacemesh.network - - - name: Build to testnet-hare-4 Explorer - env: - REACT_APP_DISCOVERY_SERVICE_URL: https://configs.spacemesh.network/networks-testnet-hare-4.json - run: | - yarn - yarn build - - - name: Upload to testnet-hare-4 Explorer - run: gsutil -m rsync -r -d ./build gs://testnet-hare-4-explorer.spacemesh.network diff --git a/api/.babelrc b/api/.babelrc new file mode 100644 index 0000000..49f99e7 --- /dev/null +++ b/api/.babelrc @@ -0,0 +1,9 @@ +{ + "presets": [ + ["react-app", { "absoluteRuntime": false }], + "@babel/preset-flow" + ], + "plugins": [ + "@babel/plugin-transform-flow-strip-types" + ] +} diff --git a/api/.flowconfig b/api/.flowconfig new file mode 100644 index 0000000..1fed445 --- /dev/null +++ b/api/.flowconfig @@ -0,0 +1,11 @@ +[ignore] + +[include] + +[libs] + +[lints] + +[options] + +[strict] diff --git a/api/.gitignore b/api/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/api/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/api/.openapi-generator-ignore b/api/.openapi-generator-ignore new file mode 100644 index 0000000..7484ee5 --- /dev/null +++ b/api/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/api/.openapi-generator/FILES b/api/.openapi-generator/FILES new file mode 100644 index 0000000..282d25c --- /dev/null +++ b/api/.openapi-generator/FILES @@ -0,0 +1,8 @@ +.babelrc +.flowconfig +.gitignore +README.md +package.json +src/api.js +src/configuration.js +src/index.js diff --git a/api/.openapi-generator/VERSION b/api/.openapi-generator/VERSION new file mode 100644 index 0000000..93c8dda --- /dev/null +++ b/api/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.6.0 diff --git a/api/README.md b/api/README.md new file mode 100644 index 0000000..95fc8f5 --- /dev/null +++ b/api/README.md @@ -0,0 +1,42 @@ +## spacemesh_api@1.0.0 + +This generator creates Flow typed JavaScript client that utilizes [Fetch API](https://fetch.spec.whatwg.org/). The generated Node module can be used in the following environments: + +Environment +* Node.js +* Webpack +* Browserify + +Language level +* ES6 + +Module system +* ES6 module system + +### Building + +To build and compile the flow typed sources to javascript use: +``` +npm install +# The dependency `babel-preset-react-app` requires that you specify `NODE_ENV` or `BABEL_ENV` environment variables +env BABEL_ENV={YOUR_ENV} npm run build +``` + +### Publishing + +First build the package then run ```npm publish``` + +### Consuming + +navigate to the folder of your consuming project and run one of the following commands. + +_published:_ + +``` +npm install spacemesh_api@1.0.0 --save +``` + +_unPublished (not recommended):_ + +``` +npm install PATH_TO_GENERATED_PACKAGE --save diff --git a/api/lib/api.js b/api/lib/api.js new file mode 100644 index 0000000..054f314 --- /dev/null +++ b/api/lib/api.js @@ -0,0 +1,981 @@ +import _createClass from "@babel/runtime/helpers/esm/createClass"; +import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck"; +import _possibleConstructorReturn from "@babel/runtime/helpers/esm/possibleConstructorReturn"; +import _getPrototypeOf from "@babel/runtime/helpers/esm/getPrototypeOf"; +import _inherits from "@babel/runtime/helpers/esm/inherits"; +import _wrapNativeSuper from "@babel/runtime/helpers/esm/wrapNativeSuper"; +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +/* eslint-disable no-use-before-define */ +/** + * Spacemesh API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v2alpha1 + * + * NOTE: This class is auto generated by OpenAPI-Generator + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import * as url from "url"; +import * as portableFetch from "portable-fetch"; +import { Configuration } from "./configuration"; +var BASE_PATH = "https://testnet-api.spacemesh.network".replace(/\/+$/, ""); + +/** + * + * @export + */ +export var COLLECTION_FORMATS = { + csv: ",", + ssv: " ", + tsv: "\t", + pipes: "|" +}; + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * * @export + * @class RequiredError + * @extends {Error} + */ +export var RequiredError = /*#__PURE__*/function (_Error) { + function RequiredError(field, msg) { + var _this; + _classCallCheck(this, RequiredError); + _this = _callSuper(this, RequiredError, [msg]); + _this.name = "RequiredError"; + return _this; + } + _inherits(RequiredError, _Error); + return _createClass(RequiredError); +}( /*#__PURE__*/_wrapNativeSuper(Error)); + +/** + * The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors). + * @export + */ + +/** + * + * @export + * @enum {string} + */ + +/** + * + * @export + * @enum {string} + */ + +/** + * `Any` contains an arbitrary serialized protocol buffer message along with a URL that describes the type of the serialized message. Protobuf library provides support to pack/unpack Any values in the form of utility functions or additional generated methods of the Any type. Example 1: Pack and unpack a message in C++. Foo foo = ...; Any any; any.PackFrom(foo); ... if (any.UnpackTo(&foo)) { ... } Example 2: Pack and unpack a message in Java. Foo foo = ...; Any any = Any.pack(foo); ... if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } // or ... if (any.isSameTypeAs(Foo.getDefaultInstance())) { foo = any.unpack(Foo.getDefaultInstance()); } Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() any.Pack(foo) ... if any.Is(Foo.DESCRIPTOR): any.Unpack(foo) ... Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) if err != nil { ... } ... foo := &pb.Foo{} if err := any.UnmarshalTo(foo); err != nil { ... } The pack methods provided by protobuf library will by default use \'type.googleapis.com/full.type.name\' as the type URL and the unpack methods only use the fully qualified type name after the last \'/\' in the type URL, for example \"foo.bar.com/x/y.z\" will yield type name \"y.z\". JSON ==== The JSON representation of an `Any` value uses the regular representation of the deserialized, embedded message, with an additional field `@type` which contains the type URL. Example: package google.profile; message Person { string first_name = 1; string last_name = 2; } { \"@type\": \"type.googleapis.com/google.profile.Person\", \"firstName\": , \"lastName\": } If the embedded message type is well-known and has a custom JSON representation, that representation will be embedded adding a field `value` which holds the custom JSON in addition to the `@type` field. Example (for message [google.protobuf.Duration][]): { \"@type\": \"type.googleapis.com/google.protobuf.Duration\", \"value\": \"1.212s\" } + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + * @enum {string} + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * An immutable Spacemesh transaction. do not include mutable data such as tx state or result. + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + * @enum {string} + */ + +/** + * TransactionState is the \"journey\" of a tx from mempool to block inclusion to mesh to STF processing. To know whether or not the tx actually succeeded, and its side effects, check tx_state. - TRANSACTION_STATE_UNSPECIFIED: default state - TRANSACTION_STATE_REJECTED: rejected from mempool due to, e.g., invalid syntax - TRANSACTION_STATE_INSUFFICIENT_FUNDS: rejected from mempool by funds check - TRANSACTION_STATE_CONFLICTING: rejected from mempool due to conflicting counter - TRANSACTION_STATE_MEMPOOL: in mempool but not on the mesh yet - TRANSACTION_STATE_MESH: submitted to the mesh - TRANSACTION_STATE_PROCESSED: processed by STF; check Receipt for success or failure + * @export + * @enum {string} + */ + +/** + * + * @export + * @enum {string} + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + * @enum {string} + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * + * @export + */ + +/** + * AccountServiceApi - fetch parameter creator + * @export + */ +export var AccountServiceApiFetchParamCreator = function AccountServiceApiFetchParamCreator(configuration) { + return { + /** + * + * @throws {RequiredError} + */ + accountServiceList: function accountServiceList(body, options) { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body', 'Required parameter body was null or undefined when calling accountServiceList.'); + } + var localVarPath = "/spacemesh.v2alpha1.AccountService/List"; + var localVarUrlObj = url.parse(localVarPath, true); + var localVarRequestOptions = Object.assign({}, { + method: 'POST' + }, options); + var localVarHeaderParameter = {}; + var localVarQueryParameter = {}; + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + var needsSerialization = typeof body !== "string" || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : body || ""; + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions + }; + } + }; +}; +/** + * AccountServiceApi - factory function to inject configuration + * @export + */ +export var AccountServiceApi = function AccountServiceApi(configuration) { + var fetch = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : portableFetch; + var basePath = configuration && configuration.basePath || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + accountServiceList: function accountServiceList(body) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var localVarFetchArgs = AccountServiceApiFetchParamCreator(configuration).accountServiceList(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then(function (response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + } + }; +}; + +/** + * ActivationServiceApi - fetch parameter creator + * @export + */ +export var ActivationServiceApiFetchParamCreator = function ActivationServiceApiFetchParamCreator(configuration) { + return { + /** + * + * @throws {RequiredError} + */ + activationServiceActivationsCount: function activationServiceActivationsCount(body, options) { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body', 'Required parameter body was null or undefined when calling activationServiceActivationsCount.'); + } + var localVarPath = "/spacemesh.v2alpha1.ActivationService/ActivationsCount"; + var localVarUrlObj = url.parse(localVarPath, true); + var localVarRequestOptions = Object.assign({}, { + method: 'POST' + }, options); + var localVarHeaderParameter = {}; + var localVarQueryParameter = {}; + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + var needsSerialization = typeof body !== "string" || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : body || ""; + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions + }; + }, + /** + * + * @throws {RequiredError} + */ + activationServiceList: function activationServiceList(body, options) { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body', 'Required parameter body was null or undefined when calling activationServiceList.'); + } + var localVarPath = "/spacemesh.v2alpha1.ActivationService/List"; + var localVarUrlObj = url.parse(localVarPath, true); + var localVarRequestOptions = Object.assign({}, { + method: 'POST' + }, options); + var localVarHeaderParameter = {}; + var localVarQueryParameter = {}; + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + var needsSerialization = typeof body !== "string" || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : body || ""; + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions + }; + } + }; +}; +/** + * ActivationServiceApi - factory function to inject configuration + * @export + */ +export var ActivationServiceApi = function ActivationServiceApi(configuration) { + var fetch = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : portableFetch; + var basePath = configuration && configuration.basePath || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + activationServiceActivationsCount: function activationServiceActivationsCount(body) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var localVarFetchArgs = ActivationServiceApiFetchParamCreator(configuration).activationServiceActivationsCount(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then(function (response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + /** + * + * @throws {RequiredError} + */ + activationServiceList: function activationServiceList(body) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var localVarFetchArgs = ActivationServiceApiFetchParamCreator(configuration).activationServiceList(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then(function (response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + } + }; +}; + +/** + * LayerServiceApi - fetch parameter creator + * @export + */ +export var LayerServiceApiFetchParamCreator = function LayerServiceApiFetchParamCreator(configuration) { + return { + /** + * + * @throws {RequiredError} + */ + layerServiceList: function layerServiceList(body, options) { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body', 'Required parameter body was null or undefined when calling layerServiceList.'); + } + var localVarPath = "/spacemesh.v2alpha1.LayerService/List"; + var localVarUrlObj = url.parse(localVarPath, true); + var localVarRequestOptions = Object.assign({}, { + method: 'POST' + }, options); + var localVarHeaderParameter = {}; + var localVarQueryParameter = {}; + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + var needsSerialization = typeof body !== "string" || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : body || ""; + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions + }; + } + }; +}; +/** + * LayerServiceApi - factory function to inject configuration + * @export + */ +export var LayerServiceApi = function LayerServiceApi(configuration) { + var fetch = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : portableFetch; + var basePath = configuration && configuration.basePath || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + layerServiceList: function layerServiceList(body) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var localVarFetchArgs = LayerServiceApiFetchParamCreator(configuration).layerServiceList(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then(function (response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + } + }; +}; + +/** + * MalfeasanceServiceApi - fetch parameter creator + * @export + */ +export var MalfeasanceServiceApiFetchParamCreator = function MalfeasanceServiceApiFetchParamCreator(configuration) { + return { + /** + * + * @throws {RequiredError} + */ + malfeasanceServiceList: function malfeasanceServiceList(body, options) { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body', 'Required parameter body was null or undefined when calling malfeasanceServiceList.'); + } + var localVarPath = "/spacemesh.v2alpha1.MalfeasanceService/List"; + var localVarUrlObj = url.parse(localVarPath, true); + var localVarRequestOptions = Object.assign({}, { + method: 'POST' + }, options); + var localVarHeaderParameter = {}; + var localVarQueryParameter = {}; + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + var needsSerialization = typeof body !== "string" || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : body || ""; + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions + }; + } + }; +}; +/** + * MalfeasanceServiceApi - factory function to inject configuration + * @export + */ +export var MalfeasanceServiceApi = function MalfeasanceServiceApi(configuration) { + var fetch = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : portableFetch; + var basePath = configuration && configuration.basePath || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + malfeasanceServiceList: function malfeasanceServiceList(body) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var localVarFetchArgs = MalfeasanceServiceApiFetchParamCreator(configuration).malfeasanceServiceList(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then(function (response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + } + }; +}; + +/** + * NetworkServiceApi - fetch parameter creator + * @export + */ +export var NetworkServiceApiFetchParamCreator = function NetworkServiceApiFetchParamCreator(configuration) { + return { + /** + * + * @throws {RequiredError} + */ + networkServiceInfo: function networkServiceInfo(body, options) { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body', 'Required parameter body was null or undefined when calling networkServiceInfo.'); + } + var localVarPath = "/spacemesh.v2alpha1.NetworkService/Info"; + var localVarUrlObj = url.parse(localVarPath, true); + var localVarRequestOptions = Object.assign({}, { + method: 'POST' + }, options); + var localVarHeaderParameter = {}; + var localVarQueryParameter = {}; + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + var needsSerialization = typeof body !== "string" || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : body || ""; + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions + }; + } + }; +}; +/** + * NetworkServiceApi - factory function to inject configuration + * @export + */ +export var NetworkServiceApi = function NetworkServiceApi(configuration) { + var fetch = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : portableFetch; + var basePath = configuration && configuration.basePath || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + networkServiceInfo: function networkServiceInfo(body) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var localVarFetchArgs = NetworkServiceApiFetchParamCreator(configuration).networkServiceInfo(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then(function (response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + } + }; +}; + +/** + * NodeServiceApi - fetch parameter creator + * @export + */ +export var NodeServiceApiFetchParamCreator = function NodeServiceApiFetchParamCreator(configuration) { + return { + /** + * + * @throws {RequiredError} + */ + nodeServiceStatus: function nodeServiceStatus(body, options) { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body', 'Required parameter body was null or undefined when calling nodeServiceStatus.'); + } + var localVarPath = "/spacemesh.v2alpha1.NodeService/Status"; + var localVarUrlObj = url.parse(localVarPath, true); + var localVarRequestOptions = Object.assign({}, { + method: 'POST' + }, options); + var localVarHeaderParameter = {}; + var localVarQueryParameter = {}; + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + var needsSerialization = typeof body !== "string" || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : body || ""; + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions + }; + } + }; +}; +/** + * NodeServiceApi - factory function to inject configuration + * @export + */ +export var NodeServiceApi = function NodeServiceApi(configuration) { + var fetch = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : portableFetch; + var basePath = configuration && configuration.basePath || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + nodeServiceStatus: function nodeServiceStatus(body) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var localVarFetchArgs = NodeServiceApiFetchParamCreator(configuration).nodeServiceStatus(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then(function (response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + } + }; +}; + +/** + * RewardServiceApi - fetch parameter creator + * @export + */ +export var RewardServiceApiFetchParamCreator = function RewardServiceApiFetchParamCreator(configuration) { + return { + /** + * + * @throws {RequiredError} + */ + rewardServiceList: function rewardServiceList(body, options) { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body', 'Required parameter body was null or undefined when calling rewardServiceList.'); + } + var localVarPath = "/spacemesh.v2alpha1.RewardService/List"; + var localVarUrlObj = url.parse(localVarPath, true); + var localVarRequestOptions = Object.assign({}, { + method: 'POST' + }, options); + var localVarHeaderParameter = {}; + var localVarQueryParameter = {}; + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + var needsSerialization = typeof body !== "string" || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : body || ""; + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions + }; + } + }; +}; +/** + * RewardServiceApi - factory function to inject configuration + * @export + */ +export var RewardServiceApi = function RewardServiceApi(configuration) { + var fetch = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : portableFetch; + var basePath = configuration && configuration.basePath || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + rewardServiceList: function rewardServiceList(body) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var localVarFetchArgs = RewardServiceApiFetchParamCreator(configuration).rewardServiceList(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then(function (response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + } + }; +}; + +/** + * TransactionServiceApi - fetch parameter creator + * @export + */ +export var TransactionServiceApiFetchParamCreator = function TransactionServiceApiFetchParamCreator(configuration) { + return { + /** + * + * @throws {RequiredError} + */ + transactionServiceEstimateGas: function transactionServiceEstimateGas(body, options) { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body', 'Required parameter body was null or undefined when calling transactionServiceEstimateGas.'); + } + var localVarPath = "/spacemesh.v2alpha1.TransactionService/EstimateGas"; + var localVarUrlObj = url.parse(localVarPath, true); + var localVarRequestOptions = Object.assign({}, { + method: 'POST' + }, options); + var localVarHeaderParameter = {}; + var localVarQueryParameter = {}; + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + var needsSerialization = typeof body !== "string" || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : body || ""; + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions + }; + }, + /** + * + * @throws {RequiredError} + */ + transactionServiceList: function transactionServiceList(body, options) { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body', 'Required parameter body was null or undefined when calling transactionServiceList.'); + } + var localVarPath = "/spacemesh.v2alpha1.TransactionService/List"; + var localVarUrlObj = url.parse(localVarPath, true); + var localVarRequestOptions = Object.assign({}, { + method: 'POST' + }, options); + var localVarHeaderParameter = {}; + var localVarQueryParameter = {}; + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + var needsSerialization = typeof body !== "string" || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : body || ""; + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions + }; + }, + /** + * + * @throws {RequiredError} + */ + transactionServiceParseTransaction: function transactionServiceParseTransaction(body, options) { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body', 'Required parameter body was null or undefined when calling transactionServiceParseTransaction.'); + } + var localVarPath = "/spacemesh.v2alpha1.TransactionService/ParseTransaction"; + var localVarUrlObj = url.parse(localVarPath, true); + var localVarRequestOptions = Object.assign({}, { + method: 'POST' + }, options); + var localVarHeaderParameter = {}; + var localVarQueryParameter = {}; + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + var needsSerialization = typeof body !== "string" || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : body || ""; + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions + }; + }, + /** + * + * @throws {RequiredError} + */ + transactionServiceSubmitTransaction: function transactionServiceSubmitTransaction(body, options) { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body', 'Required parameter body was null or undefined when calling transactionServiceSubmitTransaction.'); + } + var localVarPath = "/spacemesh.v2alpha1.TransactionService/SubmitTransaction"; + var localVarUrlObj = url.parse(localVarPath, true); + var localVarRequestOptions = Object.assign({}, { + method: 'POST' + }, options); + var localVarHeaderParameter = {}; + var localVarQueryParameter = {}; + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + var needsSerialization = typeof body !== "string" || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : body || ""; + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions + }; + } + }; +}; +/** + * TransactionServiceApi - factory function to inject configuration + * @export + */ +export var TransactionServiceApi = function TransactionServiceApi(configuration) { + var fetch = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : portableFetch; + var basePath = configuration && configuration.basePath || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + transactionServiceEstimateGas: function transactionServiceEstimateGas(body) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var localVarFetchArgs = TransactionServiceApiFetchParamCreator(configuration).transactionServiceEstimateGas(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then(function (response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + /** + * + * @throws {RequiredError} + */ + transactionServiceList: function transactionServiceList(body) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var localVarFetchArgs = TransactionServiceApiFetchParamCreator(configuration).transactionServiceList(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then(function (response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + /** + * + * @throws {RequiredError} + */ + transactionServiceParseTransaction: function transactionServiceParseTransaction(body) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var localVarFetchArgs = TransactionServiceApiFetchParamCreator(configuration).transactionServiceParseTransaction(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then(function (response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + /** + * + * @throws {RequiredError} + */ + transactionServiceSubmitTransaction: function transactionServiceSubmitTransaction(body) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var localVarFetchArgs = TransactionServiceApiFetchParamCreator(configuration).transactionServiceSubmitTransaction(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then(function (response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + } + }; +}; \ No newline at end of file diff --git a/api/lib/api.js.flow b/api/lib/api.js.flow new file mode 100644 index 0000000..e3bfbc7 --- /dev/null +++ b/api/lib/api.js.flow @@ -0,0 +1,1983 @@ +// @flow +/* eslint-disable no-use-before-define */ +/** + * Spacemesh API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v2alpha1 + * + * NOTE: This class is auto generated by OpenAPI-Generator + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import * as url from "url"; +import * as portableFetch from "portable-fetch"; +import { Configuration } from "./configuration"; + +const BASE_PATH: string = "https://testnet-api.spacemesh.network".replace(/\/+$/, ""); + +/** + * + * @export + */ +export const COLLECTION_FORMATS = { + csv: ",", + ssv: " ", + tsv: "\t", + pipes: "|", +}; + +/** + * + * @export + */ +export type FetchAPI = { + (url: string, init?: any): Promise; +} + +/** + * + * @export + */ +export type FetchArgs = { + url: string; + options: {}; +} + +/** + * + * @export + */ +export type RequestOptions = { + headers?: {}; + query?: {}; + body?: string | FormData; +} + +/** + * * @export + * @class RequiredError + * @extends {Error} + */ +export class RequiredError extends Error { + name:string = "RequiredError" + constructor(field: string, msg?: string) { + super(msg); + } +} + +/** + * The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors). + * @export + */ +export type GooglerpcStatus = { + /** + * The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code]. + * @type {number} + * @memberof GooglerpcStatus + */ + code?: number; + /** + * A list of messages that carry the error details. There is a common set of message types for APIs to use. + * @type {Array} + * @memberof GooglerpcStatus + */ + details?: Array; + /** + * A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client. + * @type {string} + * @memberof GooglerpcStatus + */ + message?: string; +} + +/** + * + * @export + * @enum {string} + */ +export type MalfeasanceProofMalfeasanceDomain = 'DOMAIN_UNSPECIFIED'; + +/** + * + * @export + * @enum {string} + */ +export type NodeStatusResponseSyncStatus = 'SYNC_STATUS_UNSPECIFIED' | 'SYNC_STATUS_OFFLINE' | 'SYNC_STATUS_SYNCING' | 'SYNC_STATUS_SYNCED'; + +/** + * `Any` contains an arbitrary serialized protocol buffer message along with a URL that describes the type of the serialized message. Protobuf library provides support to pack/unpack Any values in the form of utility functions or additional generated methods of the Any type. Example 1: Pack and unpack a message in C++. Foo foo = ...; Any any; any.PackFrom(foo); ... if (any.UnpackTo(&foo)) { ... } Example 2: Pack and unpack a message in Java. Foo foo = ...; Any any = Any.pack(foo); ... if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } // or ... if (any.isSameTypeAs(Foo.getDefaultInstance())) { foo = any.unpack(Foo.getDefaultInstance()); } Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() any.Pack(foo) ... if any.Is(Foo.DESCRIPTOR): any.Unpack(foo) ... Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) if err != nil { ... } ... foo := &pb.Foo{} if err := any.UnmarshalTo(foo); err != nil { ... } The pack methods provided by protobuf library will by default use \'type.googleapis.com/full.type.name\' as the type URL and the unpack methods only use the fully qualified type name after the last \'/\' in the type URL, for example \"foo.bar.com/x/y.z\" will yield type name \"y.z\". JSON ==== The JSON representation of an `Any` value uses the regular representation of the deserialized, embedded message, with an additional field `@type` which contains the type URL. Example: package google.profile; message Person { string first_name = 1; string last_name = 2; } { \"@type\": \"type.googleapis.com/google.profile.Person\", \"firstName\": , \"lastName\": } If the embedded message type is well-known and has a custom JSON representation, that representation will be embedded adding a field `value` which holds the custom JSON in addition to the `@type` field. Example (for message [google.protobuf.Duration][]): { \"@type\": \"type.googleapis.com/google.protobuf.Duration\", \"value\": \"1.212s\" } + * @export + */ +export type ProtobufAny = { + [key: string]: Object | any; + + /** + * A URL/resource name that uniquely identifies the type of the serialized protocol buffer message. This string must contain at least one \"/\" character. The last segment of the URL\'s path must represent the fully qualified name of the type (as in `path/google.protobuf.Duration`). The name should be in a canonical form (e.g., leading \".\" is not accepted). In practice, teams usually precompile into the binary all types that they expect it to use in the context of Any. However, for URLs which use the scheme `http`, `https`, or no scheme, one can optionally set up a type server that maps type URLs to message definitions as follows: * If no scheme is provided, `https` is assumed. * An HTTP GET on the URL must yield a [google.protobuf.Type][] value in binary format, or produce an error. * Applications are allowed to cache lookup results based on the URL, or have them precompiled into a binary to avoid any lookup. Therefore, binary compatibility needs to be preserved on changes to types. (Use versioned type names to manage breaking changes.) Note: this functionality is not currently available in the official protobuf release, and it is not used for type URLs beginning with type.googleapis.com. As of May 2023, there are no widely used type server implementations and no plans to implement one. Schemes other than `http`, `https` (or the empty scheme) might be used with implementation specific semantics. + * @type {string} + * @memberof ProtobufAny + */ + type?: string; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1Account = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Account + */ + address?: string; + /** + * + * @type {Spacemeshv2alpha1AccountState} + * @memberof Spacemeshv2alpha1Account + */ + current?: Spacemeshv2alpha1AccountState; + /** + * + * @type {Spacemeshv2alpha1AccountState} + * @memberof Spacemeshv2alpha1Account + */ + projected?: Spacemeshv2alpha1AccountState; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Account + */ + template?: string; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1AccountRequest = { + /** + * + * @type {Array} + * @memberof Spacemeshv2alpha1AccountRequest + */ + addresses?: Array; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1AccountRequest + */ + limit?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1AccountRequest + */ + offset?: string; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1AccountState = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1AccountState + */ + balance?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1AccountState + */ + counter?: string; + /** + * + * @type {number} + * @memberof Spacemeshv2alpha1AccountState + */ + layer?: number; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1Activation = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Activation + */ + coinbase?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Activation + */ + height?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Activation + */ + id?: string; + /** + * + * @type {number} + * @memberof Spacemeshv2alpha1Activation + */ + numUnits?: number; + /** + * + * @type {number} + * @memberof Spacemeshv2alpha1Activation + */ + publishEpoch?: number; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Activation + */ + smesherId?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Activation + */ + weight?: string; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1Block = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Block + */ + id?: string; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1Layer = { + /** + * + * @type {Spacemeshv2alpha1Block} + * @memberof Spacemeshv2alpha1Layer + */ + block?: Spacemeshv2alpha1Block; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Layer + */ + consensusHash?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Layer + */ + cumulativeStateHash?: string; + /** + * + * @type {number} + * @memberof Spacemeshv2alpha1Layer + */ + _number?: number; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Layer + */ + stateHash?: string; + /** + * + * @type {Spacemeshv2alpha1LayerLayerStatus} + * @memberof Spacemeshv2alpha1Layer + */ + status?: Spacemeshv2alpha1LayerLayerStatus; +} + +/** + * + * @export + * @enum {string} + */ +export type Spacemeshv2alpha1LayerLayerStatus = 'LAYER_STATUS_UNSPECIFIED' | 'LAYER_STATUS_APPLIED' | 'LAYER_STATUS_VERIFIED'; + +/** + * + * @export + */ +export type Spacemeshv2alpha1MalfeasanceProof = { + /** + * + * @type {MalfeasanceProofMalfeasanceDomain} + * @memberof Spacemeshv2alpha1MalfeasanceProof + */ + domain?: MalfeasanceProofMalfeasanceDomain; + /** + * + * @type {{ [key: string]: string; }} + * @memberof Spacemeshv2alpha1MalfeasanceProof + */ + properties?: { [key: string]: string; }; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1MalfeasanceProof + */ + smesher?: string; + /** + * for legacy proofs the types are 1 - Double publish of ATX 2 - Multiple ballots for a layer by same smesher 3 - Hare Equivocation (currently unused) 4 - ATX with invalid PoST proof publised 5 - ATX referencing an invalid previous ATX published + * @type {number} + * @memberof Spacemeshv2alpha1MalfeasanceProof + */ + type?: number; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1MalfeasanceRequest = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1MalfeasanceRequest + */ + limit?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1MalfeasanceRequest + */ + offset?: string; + /** + * + * @type {Array} + * @memberof Spacemeshv2alpha1MalfeasanceRequest + */ + smesherId?: Array; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1NetworkInfoResponse = { + /** + * + * @type {number} + * @memberof Spacemeshv2alpha1NetworkInfoResponse + */ + effectiveGenesisLayer?: number; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1NetworkInfoResponse + */ + genesisId?: string; + /** + * + * @type {Date} + * @memberof Spacemeshv2alpha1NetworkInfoResponse + */ + genesisTime?: Date; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1NetworkInfoResponse + */ + hrp?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1NetworkInfoResponse + */ + labelsPerUnit?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1NetworkInfoResponse + */ + layerDuration?: string; + /** + * + * @type {number} + * @memberof Spacemeshv2alpha1NetworkInfoResponse + */ + layersPerEpoch?: number; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1Nonce = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Nonce + */ + counter?: string; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1ParseTransactionRequest = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1ParseTransactionRequest + */ + transaction?: string; + /** + * + * @type {boolean} + * @memberof Spacemeshv2alpha1ParseTransactionRequest + */ + verify?: boolean; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1ParseTransactionResponse = { + /** + * + * @type {GooglerpcStatus} + * @memberof Spacemeshv2alpha1ParseTransactionResponse + */ + status?: GooglerpcStatus; + /** + * + * @type {Spacemeshv2alpha1Transaction} + * @memberof Spacemeshv2alpha1ParseTransactionResponse + */ + tx?: Spacemeshv2alpha1Transaction; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1Reward = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Reward + */ + coinbase?: string; + /** + * + * @type {number} + * @memberof Spacemeshv2alpha1Reward + */ + layer?: number; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Reward + */ + layerReward?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Reward + */ + smesher?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Reward + */ + total?: string; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1SubmitTransactionRequest = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1SubmitTransactionRequest + */ + transaction?: string; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1SubmitTransactionResponse = { + /** + * + * @type {GooglerpcStatus} + * @memberof Spacemeshv2alpha1SubmitTransactionResponse + */ + status?: GooglerpcStatus; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1SubmitTransactionResponse + */ + txId?: string; +} + +/** + * An immutable Spacemesh transaction. do not include mutable data such as tx state or result. + * @export + */ +export type Spacemeshv2alpha1Transaction = { + /** + * + * @type {V2alpha1TransactionContents} + * @memberof Spacemeshv2alpha1Transaction + */ + contents?: V2alpha1TransactionContents; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Transaction + */ + gasPrice?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Transaction + */ + id?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Transaction + */ + maxGas?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Transaction + */ + maxSpend?: string; + /** + * this is actually limited by uint8, but no type for that. + * @type {number} + * @memberof Spacemeshv2alpha1Transaction + */ + method?: number; + /** + * + * @type {Spacemeshv2alpha1Nonce} + * @memberof Spacemeshv2alpha1Transaction + */ + nonce?: Spacemeshv2alpha1Nonce; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Transaction + */ + principal?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Transaction + */ + raw?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Transaction + */ + template?: string; + /** + * + * @type {TransactionTransactionType} + * @memberof Spacemeshv2alpha1Transaction + */ + type?: TransactionTransactionType; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1TransactionResult = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1TransactionResult + */ + block?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1TransactionResult + */ + fee?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1TransactionResult + */ + gasConsumed?: string; + /** + * + * @type {number} + * @memberof Spacemeshv2alpha1TransactionResult + */ + layer?: number; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1TransactionResult + */ + message?: string; + /** + * + * @type {Spacemeshv2alpha1TransactionResultStatus} + * @memberof Spacemeshv2alpha1TransactionResult + */ + status?: Spacemeshv2alpha1TransactionResultStatus; + /** + * + * @type {Array} + * @memberof Spacemeshv2alpha1TransactionResult + */ + touchedAddresses?: Array; +} + +/** + * + * @export + * @enum {string} + */ +export type Spacemeshv2alpha1TransactionResultStatus = 'TRANSACTION_STATUS_UNSPECIFIED' | 'TRANSACTION_STATUS_SUCCESS' | 'TRANSACTION_STATUS_FAILURE' | 'TRANSACTION_STATUS_INVALID'; + +/** + * TransactionState is the \"journey\" of a tx from mempool to block inclusion to mesh to STF processing. To know whether or not the tx actually succeeded, and its side effects, check tx_state. - TRANSACTION_STATE_UNSPECIFIED: default state - TRANSACTION_STATE_REJECTED: rejected from mempool due to, e.g., invalid syntax - TRANSACTION_STATE_INSUFFICIENT_FUNDS: rejected from mempool by funds check - TRANSACTION_STATE_CONFLICTING: rejected from mempool due to conflicting counter - TRANSACTION_STATE_MEMPOOL: in mempool but not on the mesh yet - TRANSACTION_STATE_MESH: submitted to the mesh - TRANSACTION_STATE_PROCESSED: processed by STF; check Receipt for success or failure + * @export + * @enum {string} + */ +export type Spacemeshv2alpha1TransactionState = 'TRANSACTION_STATE_UNSPECIFIED' | 'TRANSACTION_STATE_REJECTED' | 'TRANSACTION_STATE_INSUFFICIENT_FUNDS' | 'TRANSACTION_STATE_CONFLICTING' | 'TRANSACTION_STATE_MEMPOOL' | 'TRANSACTION_STATE_MESH' | 'TRANSACTION_STATE_PROCESSED'; + +/** + * + * @export + * @enum {string} + */ +export type TransactionTransactionType = 'TRANSACTION_TYPE_UNSPECIFIED' | 'TRANSACTION_TYPE_SINGLE_SIG_SEND' | 'TRANSACTION_TYPE_SINGLE_SIG_SPAWN' | 'TRANSACTION_TYPE_SINGLE_SIG_SELFSPAWN' | 'TRANSACTION_TYPE_MULTI_SIG_SEND' | 'TRANSACTION_TYPE_MULTI_SIG_SPAWN' | 'TRANSACTION_TYPE_MULTI_SIG_SELFSPAWN' | 'TRANSACTION_TYPE_VESTING_SPAWN' | 'TRANSACTION_TYPE_VAULT_SPAWN' | 'TRANSACTION_TYPE_DRAIN_VAULT'; + +/** + * + * @export + */ +export type V2alpha1AccountList = { + /** + * + * @type {Array} + * @memberof V2alpha1AccountList + */ + accounts?: Array; +} + +/** + * + * @export + */ +export type V2alpha1ActivationList = { + /** + * + * @type {Array} + * @memberof V2alpha1ActivationList + */ + activations?: Array; +} + +/** + * + * @export + */ +export type V2alpha1ActivationRequest = { + /** + * `coinbase` filter is not supported by database index and will result in sequential scan. + * @type {string} + * @memberof V2alpha1ActivationRequest + */ + coinbase?: string; + /** + * + * @type {number} + * @memberof V2alpha1ActivationRequest + */ + endEpoch?: number; + /** + * + * @type {Array} + * @memberof V2alpha1ActivationRequest + */ + id?: Array; + /** + * + * @type {string} + * @memberof V2alpha1ActivationRequest + */ + limit?: string; + /** + * + * @type {string} + * @memberof V2alpha1ActivationRequest + */ + offset?: string; + /** + * + * @type {Array} + * @memberof V2alpha1ActivationRequest + */ + smesherId?: Array; + /** + * Apply `start_epoch/end_epoch` filters together with `coinbase` filter for better performance. + * @type {number} + * @memberof V2alpha1ActivationRequest + */ + startEpoch?: number; +} + +/** + * + * @export + */ +export type V2alpha1ActivationsCountRequest = { + /** + * + * @type {number} + * @memberof V2alpha1ActivationsCountRequest + */ + epoch?: number; +} + +/** + * + * @export + */ +export type V2alpha1ActivationsCountResponse = { + /** + * + * @type {number} + * @memberof V2alpha1ActivationsCountResponse + */ + count?: number; +} + +/** + * + * @export + */ +export type V2alpha1ContentsDrainVault = { + /** + * + * @type {string} + * @memberof V2alpha1ContentsDrainVault + */ + amount?: string; + /** + * + * @type {string} + * @memberof V2alpha1ContentsDrainVault + */ + destination?: string; + /** + * + * @type {string} + * @memberof V2alpha1ContentsDrainVault + */ + vault?: string; +} + +/** + * + * @export + */ +export type V2alpha1ContentsMultiSigSpawn = { + /** + * + * @type {Array} + * @memberof V2alpha1ContentsMultiSigSpawn + */ + pubkey?: Array; + /** + * + * @type {number} + * @memberof V2alpha1ContentsMultiSigSpawn + */ + required?: number; +} + +/** + * + * @export + */ +export type V2alpha1ContentsSend = { + /** + * + * @type {string} + * @memberof V2alpha1ContentsSend + */ + amount?: string; + /** + * + * @type {string} + * @memberof V2alpha1ContentsSend + */ + destination?: string; +} + +/** + * + * @export + */ +export type V2alpha1ContentsSingleSigSpawn = { + /** + * + * @type {string} + * @memberof V2alpha1ContentsSingleSigSpawn + */ + pubkey?: string; +} + +/** + * + * @export + */ +export type V2alpha1ContentsVaultSpawn = { + /** + * + * @type {string} + * @memberof V2alpha1ContentsVaultSpawn + */ + initialUnlockAmount?: string; + /** + * + * @type {string} + * @memberof V2alpha1ContentsVaultSpawn + */ + owner?: string; + /** + * + * @type {string} + * @memberof V2alpha1ContentsVaultSpawn + */ + totalAmount?: string; + /** + * + * @type {number} + * @memberof V2alpha1ContentsVaultSpawn + */ + vestingEnd?: number; + /** + * + * @type {number} + * @memberof V2alpha1ContentsVaultSpawn + */ + vestingStart?: number; +} + +/** + * + * @export + */ +export type V2alpha1EstimateGasRequest = { + /** + * + * @type {string} + * @memberof V2alpha1EstimateGasRequest + */ + transaction?: string; +} + +/** + * + * @export + */ +export type V2alpha1EstimateGasResponse = { + /** + * + * @type {string} + * @memberof V2alpha1EstimateGasResponse + */ + recommendedMaxGas?: string; + /** + * + * @type {GooglerpcStatus} + * @memberof V2alpha1EstimateGasResponse + */ + status?: GooglerpcStatus; +} + +/** + * + * @export + */ +export type V2alpha1LayerList = { + /** + * + * @type {Array} + * @memberof V2alpha1LayerList + */ + layers?: Array; +} + +/** + * + * @export + */ +export type V2alpha1LayerRequest = { + /** + * + * @type {number} + * @memberof V2alpha1LayerRequest + */ + endLayer?: number; + /** + * + * @type {string} + * @memberof V2alpha1LayerRequest + */ + limit?: string; + /** + * + * @type {string} + * @memberof V2alpha1LayerRequest + */ + offset?: string; + /** + * + * @type {V2alpha1SortOrder} + * @memberof V2alpha1LayerRequest + */ + sortOrder?: V2alpha1SortOrder; + /** + * + * @type {number} + * @memberof V2alpha1LayerRequest + */ + startLayer?: number; +} + +/** + * + * @export + */ +export type V2alpha1MalfeasanceList = { + /** + * + * @type {Array} + * @memberof V2alpha1MalfeasanceList + */ + proofs?: Array; +} + +/** + * + * @export + */ +export type V2alpha1NodeStatusResponse = { + /** + * + * @type {number} + * @memberof V2alpha1NodeStatusResponse + */ + appliedLayer?: number; + /** + * + * @type {string} + * @memberof V2alpha1NodeStatusResponse + */ + connectedPeers?: string; + /** + * + * @type {number} + * @memberof V2alpha1NodeStatusResponse + */ + currentLayer?: number; + /** + * + * @type {number} + * @memberof V2alpha1NodeStatusResponse + */ + latestLayer?: number; + /** + * + * @type {number} + * @memberof V2alpha1NodeStatusResponse + */ + processedLayer?: number; + /** + * + * @type {NodeStatusResponseSyncStatus} + * @memberof V2alpha1NodeStatusResponse + */ + status?: NodeStatusResponseSyncStatus; +} + +/** + * + * @export + */ +export type V2alpha1RewardList = { + /** + * + * @type {Array} + * @memberof V2alpha1RewardList + */ + rewards?: Array; +} + +/** + * + * @export + */ +export type V2alpha1RewardRequest = { + /** + * + * @type {string} + * @memberof V2alpha1RewardRequest + */ + coinbase?: string; + /** + * + * @type {number} + * @memberof V2alpha1RewardRequest + */ + endLayer?: number; + /** + * + * @type {string} + * @memberof V2alpha1RewardRequest + */ + limit?: string; + /** + * + * @type {string} + * @memberof V2alpha1RewardRequest + */ + offset?: string; + /** + * + * @type {string} + * @memberof V2alpha1RewardRequest + */ + smesher?: string; + /** + * + * @type {V2alpha1SortOrder} + * @memberof V2alpha1RewardRequest + */ + sortOrder?: V2alpha1SortOrder; + /** + * + * @type {number} + * @memberof V2alpha1RewardRequest + */ + startLayer?: number; +} + +/** + * + * @export + * @enum {string} + */ +export type V2alpha1SortOrder = 'ASC' | 'DESC'; + +/** + * + * @export + */ +export type V2alpha1TransactionContents = { + /** + * + * @type {V2alpha1ContentsDrainVault} + * @memberof V2alpha1TransactionContents + */ + drainVault?: V2alpha1ContentsDrainVault; + /** + * + * @type {V2alpha1ContentsMultiSigSpawn} + * @memberof V2alpha1TransactionContents + */ + multiSigSpawn?: V2alpha1ContentsMultiSigSpawn; + /** + * + * @type {V2alpha1ContentsSend} + * @memberof V2alpha1TransactionContents + */ + send?: V2alpha1ContentsSend; + /** + * + * @type {V2alpha1ContentsSingleSigSpawn} + * @memberof V2alpha1TransactionContents + */ + singleSigSpawn?: V2alpha1ContentsSingleSigSpawn; + /** + * + * @type {V2alpha1ContentsVaultSpawn} + * @memberof V2alpha1TransactionContents + */ + vaultSpawn?: V2alpha1ContentsVaultSpawn; + /** + * + * @type {V2alpha1ContentsMultiSigSpawn} + * @memberof V2alpha1TransactionContents + */ + vestingSpawn?: V2alpha1ContentsMultiSigSpawn; +} + +/** + * + * @export + */ +export type V2alpha1TransactionList = { + /** + * + * @type {Array} + * @memberof V2alpha1TransactionList + */ + transactions?: Array; +} + +/** + * + * @export + */ +export type V2alpha1TransactionRequest = { + /** + * + * @type {string} + * @memberof V2alpha1TransactionRequest + */ + address?: string; + /** + * Ending layer for transactions. + * @type {number} + * @memberof V2alpha1TransactionRequest + */ + endLayer?: number; + /** + * Whether to include result of transactions in response. + * @type {boolean} + * @memberof V2alpha1TransactionRequest + */ + includeResult?: boolean; + /** + * Whether to include transaction state in response. + * @type {boolean} + * @memberof V2alpha1TransactionRequest + */ + includeState?: boolean; + /** + * Specifies maximum number of items to fetch. + * @type {string} + * @memberof V2alpha1TransactionRequest + */ + limit?: string; + /** + * Adjusts the starting point for data retrieval. + * @type {string} + * @memberof V2alpha1TransactionRequest + */ + offset?: string; + /** + * + * @type {V2alpha1SortOrder} + * @memberof V2alpha1TransactionRequest + */ + sortOrder?: V2alpha1SortOrder; + /** + * Starting layer for transactions. + * @type {number} + * @memberof V2alpha1TransactionRequest + */ + startLayer?: number; + /** + * Filter: specific transaction IDs to filter. + * @type {Array} + * @memberof V2alpha1TransactionRequest + */ + txid?: Array; +} + +/** + * + * @export + */ +export type V2alpha1TransactionResponse = { + /** + * + * @type {Spacemeshv2alpha1Transaction} + * @memberof V2alpha1TransactionResponse + */ + tx?: Spacemeshv2alpha1Transaction; + /** + * + * @type {Spacemeshv2alpha1TransactionResult} + * @memberof V2alpha1TransactionResponse + */ + txResult?: Spacemeshv2alpha1TransactionResult; + /** + * + * @type {Spacemeshv2alpha1TransactionState} + * @memberof V2alpha1TransactionResponse + */ + txState?: Spacemeshv2alpha1TransactionState; +} + + + +/** + * AccountServiceApi - fetch parameter creator + * @export + */ +export const AccountServiceApiFetchParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @throws {RequiredError} + */ + accountServiceList(body: Spacemeshv2alpha1AccountRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling accountServiceList.'); + } + const localVarPath = `/spacemesh.v2alpha1.AccountService/List`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +export type AccountServiceApiType = { + accountServiceList(body: Spacemeshv2alpha1AccountRequest, options?: RequestOptions): Promise, +} + +/** + * AccountServiceApi - factory function to inject configuration + * @export + */ +export const AccountServiceApi = function(configuration?: Configuration, fetch: FetchAPI = portableFetch): AccountServiceApiType { + const basePath: string = (configuration && configuration.basePath) || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + accountServiceList(body: Spacemeshv2alpha1AccountRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = AccountServiceApiFetchParamCreator(configuration).accountServiceList(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + } +}; + + +/** + * ActivationServiceApi - fetch parameter creator + * @export + */ +export const ActivationServiceApiFetchParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @throws {RequiredError} + */ + activationServiceActivationsCount(body: V2alpha1ActivationsCountRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling activationServiceActivationsCount.'); + } + const localVarPath = `/spacemesh.v2alpha1.ActivationService/ActivationsCount`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @throws {RequiredError} + */ + activationServiceList(body: V2alpha1ActivationRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling activationServiceList.'); + } + const localVarPath = `/spacemesh.v2alpha1.ActivationService/List`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +export type ActivationServiceApiType = { + activationServiceActivationsCount(body: V2alpha1ActivationsCountRequest, options?: RequestOptions): Promise, + + activationServiceList(body: V2alpha1ActivationRequest, options?: RequestOptions): Promise, +} + +/** + * ActivationServiceApi - factory function to inject configuration + * @export + */ +export const ActivationServiceApi = function(configuration?: Configuration, fetch: FetchAPI = portableFetch): ActivationServiceApiType { + const basePath: string = (configuration && configuration.basePath) || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + activationServiceActivationsCount(body: V2alpha1ActivationsCountRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = ActivationServiceApiFetchParamCreator(configuration).activationServiceActivationsCount(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + /** + * + * @throws {RequiredError} + */ + activationServiceList(body: V2alpha1ActivationRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = ActivationServiceApiFetchParamCreator(configuration).activationServiceList(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + } +}; + + +/** + * LayerServiceApi - fetch parameter creator + * @export + */ +export const LayerServiceApiFetchParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @throws {RequiredError} + */ + layerServiceList(body: V2alpha1LayerRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling layerServiceList.'); + } + const localVarPath = `/spacemesh.v2alpha1.LayerService/List`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +export type LayerServiceApiType = { + layerServiceList(body: V2alpha1LayerRequest, options?: RequestOptions): Promise, +} + +/** + * LayerServiceApi - factory function to inject configuration + * @export + */ +export const LayerServiceApi = function(configuration?: Configuration, fetch: FetchAPI = portableFetch): LayerServiceApiType { + const basePath: string = (configuration && configuration.basePath) || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + layerServiceList(body: V2alpha1LayerRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = LayerServiceApiFetchParamCreator(configuration).layerServiceList(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + } +}; + + +/** + * MalfeasanceServiceApi - fetch parameter creator + * @export + */ +export const MalfeasanceServiceApiFetchParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @throws {RequiredError} + */ + malfeasanceServiceList(body: Spacemeshv2alpha1MalfeasanceRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling malfeasanceServiceList.'); + } + const localVarPath = `/spacemesh.v2alpha1.MalfeasanceService/List`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +export type MalfeasanceServiceApiType = { + malfeasanceServiceList(body: Spacemeshv2alpha1MalfeasanceRequest, options?: RequestOptions): Promise, +} + +/** + * MalfeasanceServiceApi - factory function to inject configuration + * @export + */ +export const MalfeasanceServiceApi = function(configuration?: Configuration, fetch: FetchAPI = portableFetch): MalfeasanceServiceApiType { + const basePath: string = (configuration && configuration.basePath) || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + malfeasanceServiceList(body: Spacemeshv2alpha1MalfeasanceRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = MalfeasanceServiceApiFetchParamCreator(configuration).malfeasanceServiceList(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + } +}; + + +/** + * NetworkServiceApi - fetch parameter creator + * @export + */ +export const NetworkServiceApiFetchParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @throws {RequiredError} + */ + networkServiceInfo(body: Object, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling networkServiceInfo.'); + } + const localVarPath = `/spacemesh.v2alpha1.NetworkService/Info`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +export type NetworkServiceApiType = { + networkServiceInfo(body: Object, options?: RequestOptions): Promise, +} + +/** + * NetworkServiceApi - factory function to inject configuration + * @export + */ +export const NetworkServiceApi = function(configuration?: Configuration, fetch: FetchAPI = portableFetch): NetworkServiceApiType { + const basePath: string = (configuration && configuration.basePath) || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + networkServiceInfo(body: Object, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = NetworkServiceApiFetchParamCreator(configuration).networkServiceInfo(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + } +}; + + +/** + * NodeServiceApi - fetch parameter creator + * @export + */ +export const NodeServiceApiFetchParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @throws {RequiredError} + */ + nodeServiceStatus(body: Object, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling nodeServiceStatus.'); + } + const localVarPath = `/spacemesh.v2alpha1.NodeService/Status`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +export type NodeServiceApiType = { + nodeServiceStatus(body: Object, options?: RequestOptions): Promise, +} + +/** + * NodeServiceApi - factory function to inject configuration + * @export + */ +export const NodeServiceApi = function(configuration?: Configuration, fetch: FetchAPI = portableFetch): NodeServiceApiType { + const basePath: string = (configuration && configuration.basePath) || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + nodeServiceStatus(body: Object, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = NodeServiceApiFetchParamCreator(configuration).nodeServiceStatus(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + } +}; + + +/** + * RewardServiceApi - fetch parameter creator + * @export + */ +export const RewardServiceApiFetchParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @throws {RequiredError} + */ + rewardServiceList(body: V2alpha1RewardRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling rewardServiceList.'); + } + const localVarPath = `/spacemesh.v2alpha1.RewardService/List`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +export type RewardServiceApiType = { + rewardServiceList(body: V2alpha1RewardRequest, options?: RequestOptions): Promise, +} + +/** + * RewardServiceApi - factory function to inject configuration + * @export + */ +export const RewardServiceApi = function(configuration?: Configuration, fetch: FetchAPI = portableFetch): RewardServiceApiType { + const basePath: string = (configuration && configuration.basePath) || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + rewardServiceList(body: V2alpha1RewardRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = RewardServiceApiFetchParamCreator(configuration).rewardServiceList(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + } +}; + + +/** + * TransactionServiceApi - fetch parameter creator + * @export + */ +export const TransactionServiceApiFetchParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @throws {RequiredError} + */ + transactionServiceEstimateGas(body: V2alpha1EstimateGasRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling transactionServiceEstimateGas.'); + } + const localVarPath = `/spacemesh.v2alpha1.TransactionService/EstimateGas`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @throws {RequiredError} + */ + transactionServiceList(body: V2alpha1TransactionRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling transactionServiceList.'); + } + const localVarPath = `/spacemesh.v2alpha1.TransactionService/List`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @throws {RequiredError} + */ + transactionServiceParseTransaction(body: Spacemeshv2alpha1ParseTransactionRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling transactionServiceParseTransaction.'); + } + const localVarPath = `/spacemesh.v2alpha1.TransactionService/ParseTransaction`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @throws {RequiredError} + */ + transactionServiceSubmitTransaction(body: Spacemeshv2alpha1SubmitTransactionRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling transactionServiceSubmitTransaction.'); + } + const localVarPath = `/spacemesh.v2alpha1.TransactionService/SubmitTransaction`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +export type TransactionServiceApiType = { + transactionServiceEstimateGas(body: V2alpha1EstimateGasRequest, options?: RequestOptions): Promise, + + transactionServiceList(body: V2alpha1TransactionRequest, options?: RequestOptions): Promise, + + transactionServiceParseTransaction(body: Spacemeshv2alpha1ParseTransactionRequest, options?: RequestOptions): Promise, + + transactionServiceSubmitTransaction(body: Spacemeshv2alpha1SubmitTransactionRequest, options?: RequestOptions): Promise, +} + +/** + * TransactionServiceApi - factory function to inject configuration + * @export + */ +export const TransactionServiceApi = function(configuration?: Configuration, fetch: FetchAPI = portableFetch): TransactionServiceApiType { + const basePath: string = (configuration && configuration.basePath) || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + transactionServiceEstimateGas(body: V2alpha1EstimateGasRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = TransactionServiceApiFetchParamCreator(configuration).transactionServiceEstimateGas(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + /** + * + * @throws {RequiredError} + */ + transactionServiceList(body: V2alpha1TransactionRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = TransactionServiceApiFetchParamCreator(configuration).transactionServiceList(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + /** + * + * @throws {RequiredError} + */ + transactionServiceParseTransaction(body: Spacemeshv2alpha1ParseTransactionRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = TransactionServiceApiFetchParamCreator(configuration).transactionServiceParseTransaction(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + /** + * + * @throws {RequiredError} + */ + transactionServiceSubmitTransaction(body: Spacemeshv2alpha1SubmitTransactionRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = TransactionServiceApiFetchParamCreator(configuration).transactionServiceSubmitTransaction(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + } +}; + + +export type ApiTypes = { + AccountServiceApi: AccountServiceApiType, + + ActivationServiceApi: ActivationServiceApiType, + + LayerServiceApi: LayerServiceApiType, + + MalfeasanceServiceApi: MalfeasanceServiceApiType, + + NetworkServiceApi: NetworkServiceApiType, + + NodeServiceApi: NodeServiceApiType, + + RewardServiceApi: RewardServiceApiType, + + TransactionServiceApi: TransactionServiceApiType, + } diff --git a/api/lib/configuration.js b/api/lib/configuration.js new file mode 100644 index 0000000..5e620e5 --- /dev/null +++ b/api/lib/configuration.js @@ -0,0 +1,66 @@ +import _createClass from "@babel/runtime/helpers/esm/createClass"; +import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck"; +/** + * Spacemesh API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v2alpha1 + * + * NOTE: This class is auto generated by OpenAPI-Generator + * https://openapi-generator.tech + * Do not edit the class manually. + */ +export var Configuration = /*#__PURE__*/_createClass( +/** + * parameter for apiKey security + * @param name security name + * @memberof Configuration + */ + +/** + * parameter for basic security + * + * @type {string} + * @memberof Configuration + */ + +/** + * parameter for basic security + * + * @type {string} + * @memberof Configuration + */ + +/** + * parameter for oauth2 security + * @param name security name + * @param scopes oauth2 scope + * @memberof Configuration + */ + +/** + * override base path + * + * @type {string} + * @memberof Configuration + */ + +function Configuration() { + var param = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + _classCallCheck(this, Configuration); + if (param.apiKey) { + this.apiKey = param.apiKey; + } + if (param.username) { + this.username = param.username; + } + if (param.password) { + this.password = param.password; + } + if (param.accessToken) { + this.accessToken = param.accessToken; + } + if (param.basePath) { + this.basePath = param.basePath; + } +}); \ No newline at end of file diff --git a/api/lib/configuration.js.flow b/api/lib/configuration.js.flow new file mode 100644 index 0000000..8d06e3b --- /dev/null +++ b/api/lib/configuration.js.flow @@ -0,0 +1,75 @@ +// @flow +/** + * Spacemesh API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v2alpha1 + * + * NOTE: This class is auto generated by OpenAPI-Generator + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export type ConfigurationParameters = { + apiKey?: string | (name: string) => string; + username?: string; + password?: string; + accessToken?: string | (name: string, scopes?: string[]) => string; + basePath?: string; +} + +export class Configuration { + /** + * parameter for apiKey security + * @param name security name + * @memberof Configuration + */ + apiKey: string | (name: string) => string; + /** + * parameter for basic security + * + * @type {string} + * @memberof Configuration + */ + username: string; + /** + * parameter for basic security + * + * @type {string} + * @memberof Configuration + */ + password: string; + /** + * parameter for oauth2 security + * @param name security name + * @param scopes oauth2 scope + * @memberof Configuration + */ + accessToken: string | ((name: string, scopes?: string[]) => string); + /** + * override base path + * + * @type {string} + * @memberof Configuration + */ + basePath: string; + + constructor(param: ConfigurationParameters = {}) { + if (param.apiKey) { + this.apiKey = param.apiKey; + } + if (param.username) { + this.username = param.username; + } + if (param.password) { + this.password = param.password; + } + if (param.accessToken) { + this.accessToken = param.accessToken; + } + if (param.basePath) { + this.basePath = param.basePath; + } + } +} diff --git a/api/lib/index.js b/api/lib/index.js new file mode 100644 index 0000000..40284e7 --- /dev/null +++ b/api/lib/index.js @@ -0,0 +1,12 @@ +/** + * Spacemesh API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v2alpha1 + * + * NOTE: This class is auto generated by OpenAPI-Generator + * https://openapi-generator.tech + * Do not edit the class manually. + */ +export * from "./api"; +export * from "./configuration"; \ No newline at end of file diff --git a/api/lib/index.js.flow b/api/lib/index.js.flow new file mode 100644 index 0000000..1b6e12c --- /dev/null +++ b/api/lib/index.js.flow @@ -0,0 +1,15 @@ +// @flow +/** + * Spacemesh API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v2alpha1 + * + * NOTE: This class is auto generated by OpenAPI-Generator + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export * from "./api"; +export * from "./configuration"; diff --git a/api/package.json b/api/package.json new file mode 100644 index 0000000..d5eb98d --- /dev/null +++ b/api/package.json @@ -0,0 +1,35 @@ +{ + "name": "spacemesh_api", + "version": "1.0.0", + "description": "OpenAPI Client for spacemesh_api", + "author": "OpenAPI-Generator Contributors", + "keywords": [ + "fetch", + "flow", + "openapi", + "openapi-generator", + "spacemesh_api" + ], + "license": "Unlicense", + "main": "./lib/index.js", + "scripts": { + "build": "npm run build:clean && npm run build:lib && npm run build:flow", + "build:clean": "rimraf lib", + "build:lib": "node_modules/.bin/babel -d lib src --ignore '**/__tests__/**'", + "build:flow": "flow-copy-source -v -i '**/__tests__/**' src lib" + }, + "dependencies": { + "node-fetch": ">=3.1.1", + "portable-fetch": "^3.0.0" + }, + "devDependencies": { + "@babel/cli": "^7.0.0", + "@babel/core": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/preset-flow": "^7.0.0", + "babel-preset-react-app": "^7.0.0", + "flow-copy-source": "^2.0.0", + "lodash": ">=4.17.19", + "rimraf": "^2.6.2" + } +} diff --git a/api/src/api.js b/api/src/api.js new file mode 100644 index 0000000..e3bfbc7 --- /dev/null +++ b/api/src/api.js @@ -0,0 +1,1983 @@ +// @flow +/* eslint-disable no-use-before-define */ +/** + * Spacemesh API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v2alpha1 + * + * NOTE: This class is auto generated by OpenAPI-Generator + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import * as url from "url"; +import * as portableFetch from "portable-fetch"; +import { Configuration } from "./configuration"; + +const BASE_PATH: string = "https://testnet-api.spacemesh.network".replace(/\/+$/, ""); + +/** + * + * @export + */ +export const COLLECTION_FORMATS = { + csv: ",", + ssv: " ", + tsv: "\t", + pipes: "|", +}; + +/** + * + * @export + */ +export type FetchAPI = { + (url: string, init?: any): Promise; +} + +/** + * + * @export + */ +export type FetchArgs = { + url: string; + options: {}; +} + +/** + * + * @export + */ +export type RequestOptions = { + headers?: {}; + query?: {}; + body?: string | FormData; +} + +/** + * * @export + * @class RequiredError + * @extends {Error} + */ +export class RequiredError extends Error { + name:string = "RequiredError" + constructor(field: string, msg?: string) { + super(msg); + } +} + +/** + * The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors). + * @export + */ +export type GooglerpcStatus = { + /** + * The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code]. + * @type {number} + * @memberof GooglerpcStatus + */ + code?: number; + /** + * A list of messages that carry the error details. There is a common set of message types for APIs to use. + * @type {Array} + * @memberof GooglerpcStatus + */ + details?: Array; + /** + * A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client. + * @type {string} + * @memberof GooglerpcStatus + */ + message?: string; +} + +/** + * + * @export + * @enum {string} + */ +export type MalfeasanceProofMalfeasanceDomain = 'DOMAIN_UNSPECIFIED'; + +/** + * + * @export + * @enum {string} + */ +export type NodeStatusResponseSyncStatus = 'SYNC_STATUS_UNSPECIFIED' | 'SYNC_STATUS_OFFLINE' | 'SYNC_STATUS_SYNCING' | 'SYNC_STATUS_SYNCED'; + +/** + * `Any` contains an arbitrary serialized protocol buffer message along with a URL that describes the type of the serialized message. Protobuf library provides support to pack/unpack Any values in the form of utility functions or additional generated methods of the Any type. Example 1: Pack and unpack a message in C++. Foo foo = ...; Any any; any.PackFrom(foo); ... if (any.UnpackTo(&foo)) { ... } Example 2: Pack and unpack a message in Java. Foo foo = ...; Any any = Any.pack(foo); ... if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } // or ... if (any.isSameTypeAs(Foo.getDefaultInstance())) { foo = any.unpack(Foo.getDefaultInstance()); } Example 3: Pack and unpack a message in Python. foo = Foo(...) any = Any() any.Pack(foo) ... if any.Is(Foo.DESCRIPTOR): any.Unpack(foo) ... Example 4: Pack and unpack a message in Go foo := &pb.Foo{...} any, err := anypb.New(foo) if err != nil { ... } ... foo := &pb.Foo{} if err := any.UnmarshalTo(foo); err != nil { ... } The pack methods provided by protobuf library will by default use \'type.googleapis.com/full.type.name\' as the type URL and the unpack methods only use the fully qualified type name after the last \'/\' in the type URL, for example \"foo.bar.com/x/y.z\" will yield type name \"y.z\". JSON ==== The JSON representation of an `Any` value uses the regular representation of the deserialized, embedded message, with an additional field `@type` which contains the type URL. Example: package google.profile; message Person { string first_name = 1; string last_name = 2; } { \"@type\": \"type.googleapis.com/google.profile.Person\", \"firstName\": , \"lastName\": } If the embedded message type is well-known and has a custom JSON representation, that representation will be embedded adding a field `value` which holds the custom JSON in addition to the `@type` field. Example (for message [google.protobuf.Duration][]): { \"@type\": \"type.googleapis.com/google.protobuf.Duration\", \"value\": \"1.212s\" } + * @export + */ +export type ProtobufAny = { + [key: string]: Object | any; + + /** + * A URL/resource name that uniquely identifies the type of the serialized protocol buffer message. This string must contain at least one \"/\" character. The last segment of the URL\'s path must represent the fully qualified name of the type (as in `path/google.protobuf.Duration`). The name should be in a canonical form (e.g., leading \".\" is not accepted). In practice, teams usually precompile into the binary all types that they expect it to use in the context of Any. However, for URLs which use the scheme `http`, `https`, or no scheme, one can optionally set up a type server that maps type URLs to message definitions as follows: * If no scheme is provided, `https` is assumed. * An HTTP GET on the URL must yield a [google.protobuf.Type][] value in binary format, or produce an error. * Applications are allowed to cache lookup results based on the URL, or have them precompiled into a binary to avoid any lookup. Therefore, binary compatibility needs to be preserved on changes to types. (Use versioned type names to manage breaking changes.) Note: this functionality is not currently available in the official protobuf release, and it is not used for type URLs beginning with type.googleapis.com. As of May 2023, there are no widely used type server implementations and no plans to implement one. Schemes other than `http`, `https` (or the empty scheme) might be used with implementation specific semantics. + * @type {string} + * @memberof ProtobufAny + */ + type?: string; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1Account = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Account + */ + address?: string; + /** + * + * @type {Spacemeshv2alpha1AccountState} + * @memberof Spacemeshv2alpha1Account + */ + current?: Spacemeshv2alpha1AccountState; + /** + * + * @type {Spacemeshv2alpha1AccountState} + * @memberof Spacemeshv2alpha1Account + */ + projected?: Spacemeshv2alpha1AccountState; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Account + */ + template?: string; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1AccountRequest = { + /** + * + * @type {Array} + * @memberof Spacemeshv2alpha1AccountRequest + */ + addresses?: Array; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1AccountRequest + */ + limit?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1AccountRequest + */ + offset?: string; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1AccountState = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1AccountState + */ + balance?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1AccountState + */ + counter?: string; + /** + * + * @type {number} + * @memberof Spacemeshv2alpha1AccountState + */ + layer?: number; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1Activation = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Activation + */ + coinbase?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Activation + */ + height?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Activation + */ + id?: string; + /** + * + * @type {number} + * @memberof Spacemeshv2alpha1Activation + */ + numUnits?: number; + /** + * + * @type {number} + * @memberof Spacemeshv2alpha1Activation + */ + publishEpoch?: number; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Activation + */ + smesherId?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Activation + */ + weight?: string; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1Block = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Block + */ + id?: string; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1Layer = { + /** + * + * @type {Spacemeshv2alpha1Block} + * @memberof Spacemeshv2alpha1Layer + */ + block?: Spacemeshv2alpha1Block; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Layer + */ + consensusHash?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Layer + */ + cumulativeStateHash?: string; + /** + * + * @type {number} + * @memberof Spacemeshv2alpha1Layer + */ + _number?: number; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Layer + */ + stateHash?: string; + /** + * + * @type {Spacemeshv2alpha1LayerLayerStatus} + * @memberof Spacemeshv2alpha1Layer + */ + status?: Spacemeshv2alpha1LayerLayerStatus; +} + +/** + * + * @export + * @enum {string} + */ +export type Spacemeshv2alpha1LayerLayerStatus = 'LAYER_STATUS_UNSPECIFIED' | 'LAYER_STATUS_APPLIED' | 'LAYER_STATUS_VERIFIED'; + +/** + * + * @export + */ +export type Spacemeshv2alpha1MalfeasanceProof = { + /** + * + * @type {MalfeasanceProofMalfeasanceDomain} + * @memberof Spacemeshv2alpha1MalfeasanceProof + */ + domain?: MalfeasanceProofMalfeasanceDomain; + /** + * + * @type {{ [key: string]: string; }} + * @memberof Spacemeshv2alpha1MalfeasanceProof + */ + properties?: { [key: string]: string; }; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1MalfeasanceProof + */ + smesher?: string; + /** + * for legacy proofs the types are 1 - Double publish of ATX 2 - Multiple ballots for a layer by same smesher 3 - Hare Equivocation (currently unused) 4 - ATX with invalid PoST proof publised 5 - ATX referencing an invalid previous ATX published + * @type {number} + * @memberof Spacemeshv2alpha1MalfeasanceProof + */ + type?: number; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1MalfeasanceRequest = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1MalfeasanceRequest + */ + limit?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1MalfeasanceRequest + */ + offset?: string; + /** + * + * @type {Array} + * @memberof Spacemeshv2alpha1MalfeasanceRequest + */ + smesherId?: Array; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1NetworkInfoResponse = { + /** + * + * @type {number} + * @memberof Spacemeshv2alpha1NetworkInfoResponse + */ + effectiveGenesisLayer?: number; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1NetworkInfoResponse + */ + genesisId?: string; + /** + * + * @type {Date} + * @memberof Spacemeshv2alpha1NetworkInfoResponse + */ + genesisTime?: Date; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1NetworkInfoResponse + */ + hrp?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1NetworkInfoResponse + */ + labelsPerUnit?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1NetworkInfoResponse + */ + layerDuration?: string; + /** + * + * @type {number} + * @memberof Spacemeshv2alpha1NetworkInfoResponse + */ + layersPerEpoch?: number; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1Nonce = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Nonce + */ + counter?: string; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1ParseTransactionRequest = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1ParseTransactionRequest + */ + transaction?: string; + /** + * + * @type {boolean} + * @memberof Spacemeshv2alpha1ParseTransactionRequest + */ + verify?: boolean; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1ParseTransactionResponse = { + /** + * + * @type {GooglerpcStatus} + * @memberof Spacemeshv2alpha1ParseTransactionResponse + */ + status?: GooglerpcStatus; + /** + * + * @type {Spacemeshv2alpha1Transaction} + * @memberof Spacemeshv2alpha1ParseTransactionResponse + */ + tx?: Spacemeshv2alpha1Transaction; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1Reward = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Reward + */ + coinbase?: string; + /** + * + * @type {number} + * @memberof Spacemeshv2alpha1Reward + */ + layer?: number; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Reward + */ + layerReward?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Reward + */ + smesher?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Reward + */ + total?: string; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1SubmitTransactionRequest = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1SubmitTransactionRequest + */ + transaction?: string; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1SubmitTransactionResponse = { + /** + * + * @type {GooglerpcStatus} + * @memberof Spacemeshv2alpha1SubmitTransactionResponse + */ + status?: GooglerpcStatus; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1SubmitTransactionResponse + */ + txId?: string; +} + +/** + * An immutable Spacemesh transaction. do not include mutable data such as tx state or result. + * @export + */ +export type Spacemeshv2alpha1Transaction = { + /** + * + * @type {V2alpha1TransactionContents} + * @memberof Spacemeshv2alpha1Transaction + */ + contents?: V2alpha1TransactionContents; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Transaction + */ + gasPrice?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Transaction + */ + id?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Transaction + */ + maxGas?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Transaction + */ + maxSpend?: string; + /** + * this is actually limited by uint8, but no type for that. + * @type {number} + * @memberof Spacemeshv2alpha1Transaction + */ + method?: number; + /** + * + * @type {Spacemeshv2alpha1Nonce} + * @memberof Spacemeshv2alpha1Transaction + */ + nonce?: Spacemeshv2alpha1Nonce; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Transaction + */ + principal?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Transaction + */ + raw?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1Transaction + */ + template?: string; + /** + * + * @type {TransactionTransactionType} + * @memberof Spacemeshv2alpha1Transaction + */ + type?: TransactionTransactionType; +} + +/** + * + * @export + */ +export type Spacemeshv2alpha1TransactionResult = { + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1TransactionResult + */ + block?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1TransactionResult + */ + fee?: string; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1TransactionResult + */ + gasConsumed?: string; + /** + * + * @type {number} + * @memberof Spacemeshv2alpha1TransactionResult + */ + layer?: number; + /** + * + * @type {string} + * @memberof Spacemeshv2alpha1TransactionResult + */ + message?: string; + /** + * + * @type {Spacemeshv2alpha1TransactionResultStatus} + * @memberof Spacemeshv2alpha1TransactionResult + */ + status?: Spacemeshv2alpha1TransactionResultStatus; + /** + * + * @type {Array} + * @memberof Spacemeshv2alpha1TransactionResult + */ + touchedAddresses?: Array; +} + +/** + * + * @export + * @enum {string} + */ +export type Spacemeshv2alpha1TransactionResultStatus = 'TRANSACTION_STATUS_UNSPECIFIED' | 'TRANSACTION_STATUS_SUCCESS' | 'TRANSACTION_STATUS_FAILURE' | 'TRANSACTION_STATUS_INVALID'; + +/** + * TransactionState is the \"journey\" of a tx from mempool to block inclusion to mesh to STF processing. To know whether or not the tx actually succeeded, and its side effects, check tx_state. - TRANSACTION_STATE_UNSPECIFIED: default state - TRANSACTION_STATE_REJECTED: rejected from mempool due to, e.g., invalid syntax - TRANSACTION_STATE_INSUFFICIENT_FUNDS: rejected from mempool by funds check - TRANSACTION_STATE_CONFLICTING: rejected from mempool due to conflicting counter - TRANSACTION_STATE_MEMPOOL: in mempool but not on the mesh yet - TRANSACTION_STATE_MESH: submitted to the mesh - TRANSACTION_STATE_PROCESSED: processed by STF; check Receipt for success or failure + * @export + * @enum {string} + */ +export type Spacemeshv2alpha1TransactionState = 'TRANSACTION_STATE_UNSPECIFIED' | 'TRANSACTION_STATE_REJECTED' | 'TRANSACTION_STATE_INSUFFICIENT_FUNDS' | 'TRANSACTION_STATE_CONFLICTING' | 'TRANSACTION_STATE_MEMPOOL' | 'TRANSACTION_STATE_MESH' | 'TRANSACTION_STATE_PROCESSED'; + +/** + * + * @export + * @enum {string} + */ +export type TransactionTransactionType = 'TRANSACTION_TYPE_UNSPECIFIED' | 'TRANSACTION_TYPE_SINGLE_SIG_SEND' | 'TRANSACTION_TYPE_SINGLE_SIG_SPAWN' | 'TRANSACTION_TYPE_SINGLE_SIG_SELFSPAWN' | 'TRANSACTION_TYPE_MULTI_SIG_SEND' | 'TRANSACTION_TYPE_MULTI_SIG_SPAWN' | 'TRANSACTION_TYPE_MULTI_SIG_SELFSPAWN' | 'TRANSACTION_TYPE_VESTING_SPAWN' | 'TRANSACTION_TYPE_VAULT_SPAWN' | 'TRANSACTION_TYPE_DRAIN_VAULT'; + +/** + * + * @export + */ +export type V2alpha1AccountList = { + /** + * + * @type {Array} + * @memberof V2alpha1AccountList + */ + accounts?: Array; +} + +/** + * + * @export + */ +export type V2alpha1ActivationList = { + /** + * + * @type {Array} + * @memberof V2alpha1ActivationList + */ + activations?: Array; +} + +/** + * + * @export + */ +export type V2alpha1ActivationRequest = { + /** + * `coinbase` filter is not supported by database index and will result in sequential scan. + * @type {string} + * @memberof V2alpha1ActivationRequest + */ + coinbase?: string; + /** + * + * @type {number} + * @memberof V2alpha1ActivationRequest + */ + endEpoch?: number; + /** + * + * @type {Array} + * @memberof V2alpha1ActivationRequest + */ + id?: Array; + /** + * + * @type {string} + * @memberof V2alpha1ActivationRequest + */ + limit?: string; + /** + * + * @type {string} + * @memberof V2alpha1ActivationRequest + */ + offset?: string; + /** + * + * @type {Array} + * @memberof V2alpha1ActivationRequest + */ + smesherId?: Array; + /** + * Apply `start_epoch/end_epoch` filters together with `coinbase` filter for better performance. + * @type {number} + * @memberof V2alpha1ActivationRequest + */ + startEpoch?: number; +} + +/** + * + * @export + */ +export type V2alpha1ActivationsCountRequest = { + /** + * + * @type {number} + * @memberof V2alpha1ActivationsCountRequest + */ + epoch?: number; +} + +/** + * + * @export + */ +export type V2alpha1ActivationsCountResponse = { + /** + * + * @type {number} + * @memberof V2alpha1ActivationsCountResponse + */ + count?: number; +} + +/** + * + * @export + */ +export type V2alpha1ContentsDrainVault = { + /** + * + * @type {string} + * @memberof V2alpha1ContentsDrainVault + */ + amount?: string; + /** + * + * @type {string} + * @memberof V2alpha1ContentsDrainVault + */ + destination?: string; + /** + * + * @type {string} + * @memberof V2alpha1ContentsDrainVault + */ + vault?: string; +} + +/** + * + * @export + */ +export type V2alpha1ContentsMultiSigSpawn = { + /** + * + * @type {Array} + * @memberof V2alpha1ContentsMultiSigSpawn + */ + pubkey?: Array; + /** + * + * @type {number} + * @memberof V2alpha1ContentsMultiSigSpawn + */ + required?: number; +} + +/** + * + * @export + */ +export type V2alpha1ContentsSend = { + /** + * + * @type {string} + * @memberof V2alpha1ContentsSend + */ + amount?: string; + /** + * + * @type {string} + * @memberof V2alpha1ContentsSend + */ + destination?: string; +} + +/** + * + * @export + */ +export type V2alpha1ContentsSingleSigSpawn = { + /** + * + * @type {string} + * @memberof V2alpha1ContentsSingleSigSpawn + */ + pubkey?: string; +} + +/** + * + * @export + */ +export type V2alpha1ContentsVaultSpawn = { + /** + * + * @type {string} + * @memberof V2alpha1ContentsVaultSpawn + */ + initialUnlockAmount?: string; + /** + * + * @type {string} + * @memberof V2alpha1ContentsVaultSpawn + */ + owner?: string; + /** + * + * @type {string} + * @memberof V2alpha1ContentsVaultSpawn + */ + totalAmount?: string; + /** + * + * @type {number} + * @memberof V2alpha1ContentsVaultSpawn + */ + vestingEnd?: number; + /** + * + * @type {number} + * @memberof V2alpha1ContentsVaultSpawn + */ + vestingStart?: number; +} + +/** + * + * @export + */ +export type V2alpha1EstimateGasRequest = { + /** + * + * @type {string} + * @memberof V2alpha1EstimateGasRequest + */ + transaction?: string; +} + +/** + * + * @export + */ +export type V2alpha1EstimateGasResponse = { + /** + * + * @type {string} + * @memberof V2alpha1EstimateGasResponse + */ + recommendedMaxGas?: string; + /** + * + * @type {GooglerpcStatus} + * @memberof V2alpha1EstimateGasResponse + */ + status?: GooglerpcStatus; +} + +/** + * + * @export + */ +export type V2alpha1LayerList = { + /** + * + * @type {Array} + * @memberof V2alpha1LayerList + */ + layers?: Array; +} + +/** + * + * @export + */ +export type V2alpha1LayerRequest = { + /** + * + * @type {number} + * @memberof V2alpha1LayerRequest + */ + endLayer?: number; + /** + * + * @type {string} + * @memberof V2alpha1LayerRequest + */ + limit?: string; + /** + * + * @type {string} + * @memberof V2alpha1LayerRequest + */ + offset?: string; + /** + * + * @type {V2alpha1SortOrder} + * @memberof V2alpha1LayerRequest + */ + sortOrder?: V2alpha1SortOrder; + /** + * + * @type {number} + * @memberof V2alpha1LayerRequest + */ + startLayer?: number; +} + +/** + * + * @export + */ +export type V2alpha1MalfeasanceList = { + /** + * + * @type {Array} + * @memberof V2alpha1MalfeasanceList + */ + proofs?: Array; +} + +/** + * + * @export + */ +export type V2alpha1NodeStatusResponse = { + /** + * + * @type {number} + * @memberof V2alpha1NodeStatusResponse + */ + appliedLayer?: number; + /** + * + * @type {string} + * @memberof V2alpha1NodeStatusResponse + */ + connectedPeers?: string; + /** + * + * @type {number} + * @memberof V2alpha1NodeStatusResponse + */ + currentLayer?: number; + /** + * + * @type {number} + * @memberof V2alpha1NodeStatusResponse + */ + latestLayer?: number; + /** + * + * @type {number} + * @memberof V2alpha1NodeStatusResponse + */ + processedLayer?: number; + /** + * + * @type {NodeStatusResponseSyncStatus} + * @memberof V2alpha1NodeStatusResponse + */ + status?: NodeStatusResponseSyncStatus; +} + +/** + * + * @export + */ +export type V2alpha1RewardList = { + /** + * + * @type {Array} + * @memberof V2alpha1RewardList + */ + rewards?: Array; +} + +/** + * + * @export + */ +export type V2alpha1RewardRequest = { + /** + * + * @type {string} + * @memberof V2alpha1RewardRequest + */ + coinbase?: string; + /** + * + * @type {number} + * @memberof V2alpha1RewardRequest + */ + endLayer?: number; + /** + * + * @type {string} + * @memberof V2alpha1RewardRequest + */ + limit?: string; + /** + * + * @type {string} + * @memberof V2alpha1RewardRequest + */ + offset?: string; + /** + * + * @type {string} + * @memberof V2alpha1RewardRequest + */ + smesher?: string; + /** + * + * @type {V2alpha1SortOrder} + * @memberof V2alpha1RewardRequest + */ + sortOrder?: V2alpha1SortOrder; + /** + * + * @type {number} + * @memberof V2alpha1RewardRequest + */ + startLayer?: number; +} + +/** + * + * @export + * @enum {string} + */ +export type V2alpha1SortOrder = 'ASC' | 'DESC'; + +/** + * + * @export + */ +export type V2alpha1TransactionContents = { + /** + * + * @type {V2alpha1ContentsDrainVault} + * @memberof V2alpha1TransactionContents + */ + drainVault?: V2alpha1ContentsDrainVault; + /** + * + * @type {V2alpha1ContentsMultiSigSpawn} + * @memberof V2alpha1TransactionContents + */ + multiSigSpawn?: V2alpha1ContentsMultiSigSpawn; + /** + * + * @type {V2alpha1ContentsSend} + * @memberof V2alpha1TransactionContents + */ + send?: V2alpha1ContentsSend; + /** + * + * @type {V2alpha1ContentsSingleSigSpawn} + * @memberof V2alpha1TransactionContents + */ + singleSigSpawn?: V2alpha1ContentsSingleSigSpawn; + /** + * + * @type {V2alpha1ContentsVaultSpawn} + * @memberof V2alpha1TransactionContents + */ + vaultSpawn?: V2alpha1ContentsVaultSpawn; + /** + * + * @type {V2alpha1ContentsMultiSigSpawn} + * @memberof V2alpha1TransactionContents + */ + vestingSpawn?: V2alpha1ContentsMultiSigSpawn; +} + +/** + * + * @export + */ +export type V2alpha1TransactionList = { + /** + * + * @type {Array} + * @memberof V2alpha1TransactionList + */ + transactions?: Array; +} + +/** + * + * @export + */ +export type V2alpha1TransactionRequest = { + /** + * + * @type {string} + * @memberof V2alpha1TransactionRequest + */ + address?: string; + /** + * Ending layer for transactions. + * @type {number} + * @memberof V2alpha1TransactionRequest + */ + endLayer?: number; + /** + * Whether to include result of transactions in response. + * @type {boolean} + * @memberof V2alpha1TransactionRequest + */ + includeResult?: boolean; + /** + * Whether to include transaction state in response. + * @type {boolean} + * @memberof V2alpha1TransactionRequest + */ + includeState?: boolean; + /** + * Specifies maximum number of items to fetch. + * @type {string} + * @memberof V2alpha1TransactionRequest + */ + limit?: string; + /** + * Adjusts the starting point for data retrieval. + * @type {string} + * @memberof V2alpha1TransactionRequest + */ + offset?: string; + /** + * + * @type {V2alpha1SortOrder} + * @memberof V2alpha1TransactionRequest + */ + sortOrder?: V2alpha1SortOrder; + /** + * Starting layer for transactions. + * @type {number} + * @memberof V2alpha1TransactionRequest + */ + startLayer?: number; + /** + * Filter: specific transaction IDs to filter. + * @type {Array} + * @memberof V2alpha1TransactionRequest + */ + txid?: Array; +} + +/** + * + * @export + */ +export type V2alpha1TransactionResponse = { + /** + * + * @type {Spacemeshv2alpha1Transaction} + * @memberof V2alpha1TransactionResponse + */ + tx?: Spacemeshv2alpha1Transaction; + /** + * + * @type {Spacemeshv2alpha1TransactionResult} + * @memberof V2alpha1TransactionResponse + */ + txResult?: Spacemeshv2alpha1TransactionResult; + /** + * + * @type {Spacemeshv2alpha1TransactionState} + * @memberof V2alpha1TransactionResponse + */ + txState?: Spacemeshv2alpha1TransactionState; +} + + + +/** + * AccountServiceApi - fetch parameter creator + * @export + */ +export const AccountServiceApiFetchParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @throws {RequiredError} + */ + accountServiceList(body: Spacemeshv2alpha1AccountRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling accountServiceList.'); + } + const localVarPath = `/spacemesh.v2alpha1.AccountService/List`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +export type AccountServiceApiType = { + accountServiceList(body: Spacemeshv2alpha1AccountRequest, options?: RequestOptions): Promise, +} + +/** + * AccountServiceApi - factory function to inject configuration + * @export + */ +export const AccountServiceApi = function(configuration?: Configuration, fetch: FetchAPI = portableFetch): AccountServiceApiType { + const basePath: string = (configuration && configuration.basePath) || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + accountServiceList(body: Spacemeshv2alpha1AccountRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = AccountServiceApiFetchParamCreator(configuration).accountServiceList(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + } +}; + + +/** + * ActivationServiceApi - fetch parameter creator + * @export + */ +export const ActivationServiceApiFetchParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @throws {RequiredError} + */ + activationServiceActivationsCount(body: V2alpha1ActivationsCountRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling activationServiceActivationsCount.'); + } + const localVarPath = `/spacemesh.v2alpha1.ActivationService/ActivationsCount`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @throws {RequiredError} + */ + activationServiceList(body: V2alpha1ActivationRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling activationServiceList.'); + } + const localVarPath = `/spacemesh.v2alpha1.ActivationService/List`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +export type ActivationServiceApiType = { + activationServiceActivationsCount(body: V2alpha1ActivationsCountRequest, options?: RequestOptions): Promise, + + activationServiceList(body: V2alpha1ActivationRequest, options?: RequestOptions): Promise, +} + +/** + * ActivationServiceApi - factory function to inject configuration + * @export + */ +export const ActivationServiceApi = function(configuration?: Configuration, fetch: FetchAPI = portableFetch): ActivationServiceApiType { + const basePath: string = (configuration && configuration.basePath) || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + activationServiceActivationsCount(body: V2alpha1ActivationsCountRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = ActivationServiceApiFetchParamCreator(configuration).activationServiceActivationsCount(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + /** + * + * @throws {RequiredError} + */ + activationServiceList(body: V2alpha1ActivationRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = ActivationServiceApiFetchParamCreator(configuration).activationServiceList(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + } +}; + + +/** + * LayerServiceApi - fetch parameter creator + * @export + */ +export const LayerServiceApiFetchParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @throws {RequiredError} + */ + layerServiceList(body: V2alpha1LayerRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling layerServiceList.'); + } + const localVarPath = `/spacemesh.v2alpha1.LayerService/List`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +export type LayerServiceApiType = { + layerServiceList(body: V2alpha1LayerRequest, options?: RequestOptions): Promise, +} + +/** + * LayerServiceApi - factory function to inject configuration + * @export + */ +export const LayerServiceApi = function(configuration?: Configuration, fetch: FetchAPI = portableFetch): LayerServiceApiType { + const basePath: string = (configuration && configuration.basePath) || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + layerServiceList(body: V2alpha1LayerRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = LayerServiceApiFetchParamCreator(configuration).layerServiceList(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + } +}; + + +/** + * MalfeasanceServiceApi - fetch parameter creator + * @export + */ +export const MalfeasanceServiceApiFetchParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @throws {RequiredError} + */ + malfeasanceServiceList(body: Spacemeshv2alpha1MalfeasanceRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling malfeasanceServiceList.'); + } + const localVarPath = `/spacemesh.v2alpha1.MalfeasanceService/List`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +export type MalfeasanceServiceApiType = { + malfeasanceServiceList(body: Spacemeshv2alpha1MalfeasanceRequest, options?: RequestOptions): Promise, +} + +/** + * MalfeasanceServiceApi - factory function to inject configuration + * @export + */ +export const MalfeasanceServiceApi = function(configuration?: Configuration, fetch: FetchAPI = portableFetch): MalfeasanceServiceApiType { + const basePath: string = (configuration && configuration.basePath) || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + malfeasanceServiceList(body: Spacemeshv2alpha1MalfeasanceRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = MalfeasanceServiceApiFetchParamCreator(configuration).malfeasanceServiceList(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + } +}; + + +/** + * NetworkServiceApi - fetch parameter creator + * @export + */ +export const NetworkServiceApiFetchParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @throws {RequiredError} + */ + networkServiceInfo(body: Object, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling networkServiceInfo.'); + } + const localVarPath = `/spacemesh.v2alpha1.NetworkService/Info`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +export type NetworkServiceApiType = { + networkServiceInfo(body: Object, options?: RequestOptions): Promise, +} + +/** + * NetworkServiceApi - factory function to inject configuration + * @export + */ +export const NetworkServiceApi = function(configuration?: Configuration, fetch: FetchAPI = portableFetch): NetworkServiceApiType { + const basePath: string = (configuration && configuration.basePath) || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + networkServiceInfo(body: Object, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = NetworkServiceApiFetchParamCreator(configuration).networkServiceInfo(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + } +}; + + +/** + * NodeServiceApi - fetch parameter creator + * @export + */ +export const NodeServiceApiFetchParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @throws {RequiredError} + */ + nodeServiceStatus(body: Object, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling nodeServiceStatus.'); + } + const localVarPath = `/spacemesh.v2alpha1.NodeService/Status`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +export type NodeServiceApiType = { + nodeServiceStatus(body: Object, options?: RequestOptions): Promise, +} + +/** + * NodeServiceApi - factory function to inject configuration + * @export + */ +export const NodeServiceApi = function(configuration?: Configuration, fetch: FetchAPI = portableFetch): NodeServiceApiType { + const basePath: string = (configuration && configuration.basePath) || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + nodeServiceStatus(body: Object, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = NodeServiceApiFetchParamCreator(configuration).nodeServiceStatus(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + } +}; + + +/** + * RewardServiceApi - fetch parameter creator + * @export + */ +export const RewardServiceApiFetchParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @throws {RequiredError} + */ + rewardServiceList(body: V2alpha1RewardRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling rewardServiceList.'); + } + const localVarPath = `/spacemesh.v2alpha1.RewardService/List`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +export type RewardServiceApiType = { + rewardServiceList(body: V2alpha1RewardRequest, options?: RequestOptions): Promise, +} + +/** + * RewardServiceApi - factory function to inject configuration + * @export + */ +export const RewardServiceApi = function(configuration?: Configuration, fetch: FetchAPI = portableFetch): RewardServiceApiType { + const basePath: string = (configuration && configuration.basePath) || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + rewardServiceList(body: V2alpha1RewardRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = RewardServiceApiFetchParamCreator(configuration).rewardServiceList(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + } +}; + + +/** + * TransactionServiceApi - fetch parameter creator + * @export + */ +export const TransactionServiceApiFetchParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @throws {RequiredError} + */ + transactionServiceEstimateGas(body: V2alpha1EstimateGasRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling transactionServiceEstimateGas.'); + } + const localVarPath = `/spacemesh.v2alpha1.TransactionService/EstimateGas`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @throws {RequiredError} + */ + transactionServiceList(body: V2alpha1TransactionRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling transactionServiceList.'); + } + const localVarPath = `/spacemesh.v2alpha1.TransactionService/List`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @throws {RequiredError} + */ + transactionServiceParseTransaction(body: Spacemeshv2alpha1ParseTransactionRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling transactionServiceParseTransaction.'); + } + const localVarPath = `/spacemesh.v2alpha1.TransactionService/ParseTransaction`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @throws {RequiredError} + */ + transactionServiceSubmitTransaction(body: Spacemeshv2alpha1SubmitTransactionRequest, options: RequestOptions): FetchArgs { + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError('body','Required parameter body was null or undefined when calling transactionServiceSubmitTransaction.'); + } + const localVarPath = `/spacemesh.v2alpha1.TransactionService/SubmitTransaction`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions: RequestOptions = Object.assign({}, { method: 'POST' }, options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.body = needsSerialization ? JSON.stringify(body != null ? body : {}) : (((body:any):string) || ""); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +export type TransactionServiceApiType = { + transactionServiceEstimateGas(body: V2alpha1EstimateGasRequest, options?: RequestOptions): Promise, + + transactionServiceList(body: V2alpha1TransactionRequest, options?: RequestOptions): Promise, + + transactionServiceParseTransaction(body: Spacemeshv2alpha1ParseTransactionRequest, options?: RequestOptions): Promise, + + transactionServiceSubmitTransaction(body: Spacemeshv2alpha1SubmitTransactionRequest, options?: RequestOptions): Promise, +} + +/** + * TransactionServiceApi - factory function to inject configuration + * @export + */ +export const TransactionServiceApi = function(configuration?: Configuration, fetch: FetchAPI = portableFetch): TransactionServiceApiType { + const basePath: string = (configuration && configuration.basePath) || BASE_PATH; + return { + /** + * + * @throws {RequiredError} + */ + transactionServiceEstimateGas(body: V2alpha1EstimateGasRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = TransactionServiceApiFetchParamCreator(configuration).transactionServiceEstimateGas(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + /** + * + * @throws {RequiredError} + */ + transactionServiceList(body: V2alpha1TransactionRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = TransactionServiceApiFetchParamCreator(configuration).transactionServiceList(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + /** + * + * @throws {RequiredError} + */ + transactionServiceParseTransaction(body: Spacemeshv2alpha1ParseTransactionRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = TransactionServiceApiFetchParamCreator(configuration).transactionServiceParseTransaction(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + /** + * + * @throws {RequiredError} + */ + transactionServiceSubmitTransaction(body: Spacemeshv2alpha1SubmitTransactionRequest, options?: RequestOptions = {}): Promise { + const localVarFetchArgs = TransactionServiceApiFetchParamCreator(configuration).transactionServiceSubmitTransaction(body, options); + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }, + } +}; + + +export type ApiTypes = { + AccountServiceApi: AccountServiceApiType, + + ActivationServiceApi: ActivationServiceApiType, + + LayerServiceApi: LayerServiceApiType, + + MalfeasanceServiceApi: MalfeasanceServiceApiType, + + NetworkServiceApi: NetworkServiceApiType, + + NodeServiceApi: NodeServiceApiType, + + RewardServiceApi: RewardServiceApiType, + + TransactionServiceApi: TransactionServiceApiType, + } diff --git a/api/src/configuration.js b/api/src/configuration.js new file mode 100644 index 0000000..8d06e3b --- /dev/null +++ b/api/src/configuration.js @@ -0,0 +1,75 @@ +// @flow +/** + * Spacemesh API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v2alpha1 + * + * NOTE: This class is auto generated by OpenAPI-Generator + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export type ConfigurationParameters = { + apiKey?: string | (name: string) => string; + username?: string; + password?: string; + accessToken?: string | (name: string, scopes?: string[]) => string; + basePath?: string; +} + +export class Configuration { + /** + * parameter for apiKey security + * @param name security name + * @memberof Configuration + */ + apiKey: string | (name: string) => string; + /** + * parameter for basic security + * + * @type {string} + * @memberof Configuration + */ + username: string; + /** + * parameter for basic security + * + * @type {string} + * @memberof Configuration + */ + password: string; + /** + * parameter for oauth2 security + * @param name security name + * @param scopes oauth2 scope + * @memberof Configuration + */ + accessToken: string | ((name: string, scopes?: string[]) => string); + /** + * override base path + * + * @type {string} + * @memberof Configuration + */ + basePath: string; + + constructor(param: ConfigurationParameters = {}) { + if (param.apiKey) { + this.apiKey = param.apiKey; + } + if (param.username) { + this.username = param.username; + } + if (param.password) { + this.password = param.password; + } + if (param.accessToken) { + this.accessToken = param.accessToken; + } + if (param.basePath) { + this.basePath = param.basePath; + } + } +} diff --git a/api/src/index.js b/api/src/index.js new file mode 100644 index 0000000..1b6e12c --- /dev/null +++ b/api/src/index.js @@ -0,0 +1,15 @@ +// @flow +/** + * Spacemesh API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v2alpha1 + * + * NOTE: This class is auto generated by OpenAPI-Generator + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export * from "./api"; +export * from "./configuration"; diff --git a/api/yarn.lock b/api/yarn.lock new file mode 100644 index 0000000..986131a --- /dev/null +++ b/api/yarn.lock @@ -0,0 +1,2581 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@babel/cli@^7.0.0": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.8.tgz#79eaa55a69c77cafbea3e87537fd1df5a5a2edf8" + integrity sha512-isdp+G6DpRyKc+3Gqxy2rjzgF7Zj9K0mzLNnxz+E/fgeag8qT3vVulX4gY9dGO1q0y+0lUv6V3a+uhUzMzrwXg== + dependencies: + "@jridgewell/trace-mapping" "^0.3.25" + commander "^6.2.0" + convert-source-map "^2.0.0" + fs-readdir-recursive "^1.1.0" + glob "^7.2.0" + make-dir "^2.1.0" + slash "^2.0.0" + optionalDependencies: + "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" + chokidar "^3.4.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + dependencies: + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" + +"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.8.tgz#f9196455334c38d059ac8b1a16a51decda9d30d3" + integrity sha512-c4IM7OTg6k1Q+AJ153e2mc2QVTezTwnb4VzquwcyiEzGnW0Kedv4do/TrkU98qPeC5LNiMt/QXwIjzYXLBpyZg== + +"@babel/core@7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.2.tgz#07adba6dde27bb5ad8d8672f15fde3e08184a687" + integrity sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.2.2" + "@babel/helpers" "^7.2.0" + "@babel/parser" "^7.2.2" + "@babel/template" "^7.2.2" + "@babel/traverse" "^7.2.2" + "@babel/types" "^7.2.2" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.10" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.0.0": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.8.tgz#c24f83985214f599cee5fc26d393d9ab320342f4" + integrity sha512-6AWcmZC/MZCO0yKys4uhg5NlxL0ESF3K6IAaoQ+xSXvPyPyxNWRafP+GDbI88Oh68O7QkJgmEtedWPM9U0pZNg== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.8" + "@babel/helper-compilation-targets" "^7.24.8" + "@babel/helper-module-transforms" "^7.24.8" + "@babel/helpers" "^7.24.8" + "@babel/parser" "^7.24.8" + "@babel/template" "^7.24.7" + "@babel/traverse" "^7.24.8" + "@babel/types" "^7.24.8" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.2.2", "@babel/generator@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.8.tgz#1802d6ac4d77a9199c75ae3eb6a08336e5d1d39a" + integrity sha512-47DG+6F5SzOi0uEvK4wMShmn5yY0mVjVJoWTphdY2B4Rx9wHgjK7Yhtr0ru6nE+sn0v38mzrWOlah0p/YlHHOQ== + dependencies: + "@babel/types" "^7.24.8" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" + integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" + integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz#b607c3161cd9d1744977d4f97139572fe778c271" + integrity sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw== + dependencies: + "@babel/compat-data" "^7.24.8" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.24.8", "@babel/helper-create-class-features-plugin@^7.3.0": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.8.tgz#47f546408d13c200c0867f9d935184eaa0851b09" + integrity sha512-4f6Oqnmyp2PP3olgUMmOwC3akxSm5aBYraQ6YDdKy7NcAMkDECHWG0DEnV6M2UAkERgIBhYt8S27rURPg7SxWA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.8" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz#be4f435a80dc2b053c76eeb4b7d16dd22cfc89da" + integrity sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-map@^7.1.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.18.6.tgz#8dca645a768d0a5007b0bb90078c1d623e99e614" + integrity sha512-XSOjXUDG7KODvtURN1p29hGHa4RFgqBQELuBowUOBt3alf2Ny/oNFJygS4yCXwM0vMoqLDjE1O7wSmocUmQ3Kg== + dependencies: + "@babel/helper-function-name" "^7.18.6" + "@babel/types" "^7.18.6" + +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" + integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-function-name@^7.1.0", "@babel/helper-function-name@^7.18.6", "@babel/helper-function-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" + integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== + dependencies: + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-hoist-variables@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" + integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-member-expression-to-functions@^7.24.7", "@babel/helper-member-expression-to-functions@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6" + integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA== + dependencies: + "@babel/traverse" "^7.24.8" + "@babel/types" "^7.24.8" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.8.tgz#b1f2df4f96f3465b0d035b697ec86cb51ff348fe" + integrity sha512-m4vWKVqvkVAWLXfHCCfff2luJj86U+J0/x+0N3ArG/tP0Fq7zky2dYwMbtPmkc/oulkkbjdL3uWzuoBwQ8R00Q== + dependencies: + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + +"@babel/helper-optimise-call-expression@^7.0.0", "@babel/helper-optimise-call-expression@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" + integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== + +"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz#b3f0f203628522713849d49403f1a414468be4c7" + integrity sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-wrap-function" "^7.24.7" + +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz#f933b7eed81a1c0265740edc91491ce51250f765" + integrity sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg== + dependencies: + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.7" + "@babel/helper-optimise-call-expression" "^7.24.7" + +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-skip-transparent-expression-wrappers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" + integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-split-export-declaration@^7.0.0", "@babel/helper-split-export-declaration@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" + integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-option@^7.24.7", "@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== + +"@babel/helper-wrap-function@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz#52d893af7e42edca7c6d2c6764549826336aae1f" + integrity sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw== + dependencies: + "@babel/helper-function-name" "^7.24.7" + "@babel/template" "^7.24.7" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helpers@^7.2.0", "@babel/helpers@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.8.tgz#2820d64d5d6686cca8789dd15b074cd862795873" + integrity sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ== + dependencies: + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.8" + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.2.2", "@babel/parser@^7.24.7", "@babel/parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.8.tgz#58a4dbbcad7eb1d48930524a3fd93d93e9084c6f" + integrity sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.0.tgz#272636bc0fa19a0bc46e601ec78136a173ea36cd" + integrity sha512-wNHxLkEKTQ2ay0tnsam2z7fGZUi+05ziDJflEt3AZTP3oXLKHJp9HqhfroB/vdMvt3sda9fAbq7FsG8QPDrZBg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.3.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-proposal-decorators@7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.3.0.tgz#637ba075fa780b1f75d08186e8fb4357d03a72a7" + integrity sha512-3W/oCUmsO43FmZIqermmq6TKaRSYhmh/vybPfVFwQWdSb8xwki38uAIvknCRzuyHRuYfCYmJzL9or1v0AffPjg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.3.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-decorators" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-object-rest-spread@7.3.2": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.2.tgz#6d1859882d4d778578e41f82cc5d7bf3d5daf6c1" + integrity sha512-DjeMS+J2+lpANkYLLO+m6GjoTMygYglKmRe6cDTbFv3L9i6mmiE8fe6B8MtCSLZpVXscD5kn7s6SgtHrDoBWoA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.3.1": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-unicode-property-regex@^7.2.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.2.0", "@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-decorators@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz#e4f8a0a8778ccec669611cd5aed1ed8e6e3a6fcf" + integrity sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-syntax-dynamic-import@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" + integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-flow@^7.2.0", "@babel/plugin-syntax-flow@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz#d1759e84dd4b437cf9fae69b4c06c41d7625bfb7" + integrity sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-syntax-json-strings@^7.2.0", "@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" + integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-syntax-object-rest-spread@^7.2.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-typescript@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c" + integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514" + integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-async-to-generator@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" + integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== + dependencies: + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-remap-async-to-generator" "^7.24.7" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f" + integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-block-scoping@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz#42063e4deb850c7bd7c55e626bf4e7ab48e6ce02" + integrity sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-classes@7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz#6c90542f210ee975aa2aa8c8b5af7fa73a126953" + integrity sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.1.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + globals "^11.1.0" + +"@babel/plugin-transform-classes@^7.2.0": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.8.tgz#ad23301fe5bc153ca4cf7fb572a9bc8b0b711cf7" + integrity sha512-VXy91c47uujj758ud9wx+OMgheXm4qJfyhj1P18YvlrQkNOSrwsteHk+EFS3OMGfhMhpZa0A+81eE7G4QC+3CA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.8" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-replace-supers" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707" + integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/template" "^7.24.7" + +"@babel/plugin-transform-destructuring@7.3.2": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.3.2.tgz#f2f5520be055ba1c38c41c0e094d8a461dd78f2d" + integrity sha512-Lrj/u53Ufqxl/sGxyjsJ2XNtNuEjDyjpqdhMNh5aZ+XFOdThL46KBj27Uem4ggoezSYBxKWAil6Hu8HtwqesYw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.2.0": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550" + integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-transform-dotall-regex@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0" + integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee" + integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d" + integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-flow-strip-types@7.2.3": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.2.3.tgz#e3ac2a594948454e7431c7db33e1d02d51b5cd69" + integrity sha512-xnt7UIk9GYZRitqCnsVMjQK1O2eKZwFB3CvvHjf5SGx6K6vr/MScCKQDnf1DxRaj501e3pXjti+inbSXX2ZUoQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.2.0" + +"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.7.tgz#ae454e62219288fbb734541ab00389bfb13c063e" + integrity sha512-cjRKJ7FobOH2eakx7Ja+KpJRj8+y+/SiB3ooYm/n2UJfxu0oEaOoxOinitkJcPqv9KxS0kxTGPUaR7L2XcXDXA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-flow" "^7.24.7" + +"@babel/plugin-transform-for-of@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70" + integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + +"@babel/plugin-transform-function-name@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz#6d8601fbffe665c894440ab4470bc721dd9131d6" + integrity sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w== + dependencies: + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz#36b505c1e655151a9d7607799a9988fc5467d06c" + integrity sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-modules-amd@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7" + integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg== + dependencies: + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-modules-commonjs@^7.2.0": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz#ab6421e564b717cb475d6fff70ae7f103536ea3c" + integrity sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA== + dependencies: + "@babel/helper-module-transforms" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-simple-access" "^7.24.7" + +"@babel/plugin-transform-modules-systemjs@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz#f8012316c5098f6e8dee6ecd58e2bc6f003d0ce7" + integrity sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw== + dependencies: + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8" + integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A== + dependencies: + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.3.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923" + integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-new-target@^7.0.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00" + integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-object-super@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be" + integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" + +"@babel/plugin-transform-parameters@^7.2.0", "@babel/plugin-transform-parameters@^7.20.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" + integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-react-constant-elements@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.2.0.tgz#ed602dc2d8bff2f0cb1a5ce29263dbdec40779f7" + integrity sha512-YYQFg6giRFMsZPKUM9v+VcHOdfSQdz9jHCx3akAi3UYgyjndmdYGSXylQ/V+HswQt4fL8IklchD9HTsaOCrWQQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-display-name@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" + integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz#9caff79836803bc666bcfe210aeb6626230c293b" + integrity sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-react-jsx-self@^7.0.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz#66bff0248ea0b549972e733516ffad577477bdab" + integrity sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz#1198aab2548ad19582013815c938d3ebd8291ee3" + integrity sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz#17cd06b75a9f0e2bd076503400e7c4b99beedac4" + integrity sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-jsx" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/plugin-transform-regenerator@^7.0.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" + integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-runtime@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz#566bc43f7d0aedc880eaddbd29168d0f248966ea" + integrity sha512-jIgkljDdq4RYDnJyQsiWbdvGeei/0MOTtSHKO/rfbd/mXBxNpdlulMx49L0HQ4pug1fXannxoqCI+fYSle9eSw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73" + integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-spread@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3" + integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb" + integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-template-literals@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8" + integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz#383dab37fb073f5bfe6e60c654caac309f92ba1c" + integrity sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-transform-typescript@^7.1.0": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.8.tgz#c104d6286e04bf7e44b8cba1b686d41bad57eb84" + integrity sha512-CgFgtN61BbdOGCP4fLaAMOPkzWUh6yQZNMr5YSt8uz2cZSSiQONCQFWqsE4NeVfOIhqDOlS9CR3WD91FzMeB2Q== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/plugin-syntax-typescript" "^7.24.7" + +"@babel/plugin-transform-unicode-regex@^7.2.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" + integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/preset-env@7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.3.1.tgz#389e8ca6b17ae67aaf9a2111665030be923515db" + integrity sha512-FHKrD6Dxf30e8xgHQO0zJZpUPfVZg+Xwgz5/RdSWCbza9QLNk4Qbp40ctRoqDxml3O8RMzB1DU55SXeDG6PqHQ== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.3.1" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.2.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.2.0" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.2.0" + "@babel/plugin-transform-classes" "^7.2.0" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.2.0" + "@babel/plugin-transform-dotall-regex" "^7.2.0" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.2.0" + "@babel/plugin-transform-function-name" "^7.2.0" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.2.0" + "@babel/plugin-transform-modules-systemjs" "^7.2.0" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.3.0" + "@babel/plugin-transform-new-target" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.2.0" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.2.0" + browserslist "^4.3.4" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.3.0" + +"@babel/preset-flow@^7.0.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.24.7.tgz#eef5cb8e05e97a448fc50c16826f5612fe512c06" + integrity sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + "@babel/plugin-transform-flow-strip-types" "^7.24.7" + +"@babel/preset-react@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" + integrity sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + +"@babel/preset-typescript@7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.1.0.tgz#49ad6e2084ff0bfb5f1f7fb3b5e76c434d442c7f" + integrity sha512-LYveByuF9AOM8WrsNne5+N79k1YxjNB6gmpCQsnuSBAcV8QUeB+ZUxQzL7Rz7HksPbahymKkq2qBR+o36ggFZA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.1.0" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.1.tgz#574b03e8e8a9898eaf4a872a92ea20b7846f6f2a" + integrity sha512-7jGW8ppV0ant637pIqAcFfQDDH1orEPGJb8aXfUozuCU3QqX7rX4DA8iwrbPrR1hcH0FTTHz47yQnk+bl5xHQA== + dependencies: + regenerator-runtime "^0.12.0" + +"@babel/runtime@^7.8.4": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.8.tgz#5d958c3827b13cc6d05e038c07fb2e5e3420d82e" + integrity sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.2.2", "@babel/template@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" + integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/traverse@^7.2.2", "@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.8.tgz#6c14ed5232b7549df3371d820fbd9abfcd7dfab7" + integrity sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.8" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/parser" "^7.24.8" + "@babel/types" "^7.24.8" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.18.6", "@babel/types@^7.2.2", "@babel/types@^7.24.7", "@babel/types@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.8.tgz#d51ffa9043b17d36622efa44e861a49e69e130a8" + integrity sha512-SkSBEHwwJRU52QEVZBmMBnE5Ux2/6WU1grdYyOhpbCNxbmJrDuDCphBzKZSO3taf0zztp+qkWlymE5tVL5l0TA== + dependencies: + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": + version "2.1.8-no-fsevents.3" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b" + integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +array.prototype.reduce@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz#6aadc2f995af29cb887eb866d981dc85ab6f7dc7" + integrity sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-array-method-boxes-properly "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + is-string "^1.0.7" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +babel-loader@8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.5.tgz#225322d7509c2157655840bba52e46b6c2f2fe33" + integrity sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw== + dependencies: + find-cache-dir "^2.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + util.promisify "^1.0.0" + +babel-plugin-dynamic-import-node@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz#c0adfb07d95f4a4495e9aaac6ec386c4d7c2524e" + integrity sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA== + dependencies: + object.assign "^4.1.0" + +babel-plugin-macros@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.5.0.tgz#01f4d3b50ed567a67b80a30b9da066e94f4097b6" + integrity sha512-BWw0lD0kVZAXRD3Od1kMrdmfudqzDzYv2qrN3l2ISR1HVp1EgLKfbOrYV9xmY5k3qx3RIu5uPAUZZZHpo0o5Iw== + dependencies: + cosmiconfig "^5.0.5" + resolve "^1.8.1" + +babel-plugin-transform-react-remove-prop-types@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== + +babel-preset-react-app@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-7.0.2.tgz#d01ae973edc93b9f1015cb0236dd55889a584308" + integrity sha512-mwCk/u2wuiO8qQqblN5PlDa44taY0acq7hw6W+a70W522P7a9mIcdggL1fe5/LgAT7tqCq46q9wwhqaMoYKslQ== + dependencies: + "@babel/core" "7.2.2" + "@babel/plugin-proposal-class-properties" "7.3.0" + "@babel/plugin-proposal-decorators" "7.3.0" + "@babel/plugin-proposal-object-rest-spread" "7.3.2" + "@babel/plugin-syntax-dynamic-import" "7.2.0" + "@babel/plugin-transform-classes" "7.2.2" + "@babel/plugin-transform-destructuring" "7.3.2" + "@babel/plugin-transform-flow-strip-types" "7.2.3" + "@babel/plugin-transform-react-constant-elements" "7.2.0" + "@babel/plugin-transform-react-display-name" "7.2.0" + "@babel/plugin-transform-runtime" "7.2.0" + "@babel/preset-env" "7.3.1" + "@babel/preset-react" "7.0.0" + "@babel/preset-typescript" "7.1.0" + "@babel/runtime" "7.3.1" + babel-loader "8.0.5" + babel-plugin-dynamic-import-node "2.2.0" + babel-plugin-macros "2.5.0" + babel-plugin-transform-react-remove-prop-types "0.4.24" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.23.1, browserslist@^4.3.4: + version "4.23.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.2.tgz#244fe803641f1c19c28c48c4b6ec9736eb3d32ed" + integrity sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA== + dependencies: + caniuse-lite "^1.0.30001640" + electron-to-chromium "^1.4.820" + node-releases "^2.0.14" + update-browserslist-db "^1.1.0" + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + 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" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30001640: + version "1.0.30001641" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001641.tgz#3572862cd18befae3f637f2a1101cc033c6782ac" + integrity sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chokidar@^3.0.0, chokidar@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^1.1.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cosmiconfig@^5.0.5: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +data-uri-to-buffer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" + integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== + +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debug@^4.1.0, debug@^4.3.1: + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + 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" + +define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +electron-to-chromium@^1.4.820: + version "1.4.827" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.827.tgz#76068ed1c71dd3963e1befc8ae815004b2da6a02" + integrity sha512-VY+J0e4SFcNfQy19MEoMdaIcZLmDCprqvBtkii1WTCTQHpRvf5N8+3kTYCgL/PcntvwQvmMJWTuDPsq+IlhWKQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encoding@^0.1.11: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" + integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flow-copy-source@^2.0.0: + version "2.0.9" + resolved "https://registry.yarnpkg.com/flow-copy-source/-/flow-copy-source-2.0.9.tgz#0c94ad842f2ae544d5a6b8ae720cee0b8678d742" + integrity sha512-7zX/oHSIHe8YRGiA9QIcC4SW6KF667ikdmiDfbST15up1Ona8dn7Xy0PmSrfw6ceBWDww8sRKlCLKsztStpYkQ== + dependencies: + chokidar "^3.0.0" + fs-extra "^8.1.0" + glob "^7.0.0" + kefir "^3.7.3" + yargs "^15.0.1" + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-readdir-recursive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.0.0, glob@^7.1.3, glob@^7.2.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globalthis@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" + integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== + dependencies: + hasown "^2.0.2" + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json5@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.1.0, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +kefir@^3.7.3: + version "3.8.8" + resolved "https://registry.yarnpkg.com/kefir/-/kefir-3.8.8.tgz#235932ddfbed422acebf5d7cba503035e9ea05c5" + integrity sha512-xWga7QCZsR2Wjy2vNL3Kq/irT+IwxwItEWycRRlT5yhqHZK2fmEhziP+LzcJBWSTAMranGKtGTQ6lFpyJS3+jA== + +loader-utils@^1.0.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash@>=4.17.19, lodash@^4.17.10: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + +node-fetch@>=3.1.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" + integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + 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" + +object.getownpropertydescriptors@^2.1.6: + version "2.1.8" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz#2f1fe0606ec1a7658154ccd4f728504f69667923" + integrity sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A== + dependencies: + array.prototype.reduce "^1.0.6" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + gopd "^1.0.1" + safe-array-concat "^1.1.2" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0, picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +portable-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/portable-fetch/-/portable-fetch-3.0.0.tgz#3cbf4aa6dbc5a5734b41c0419c9273313bfd9ad8" + integrity sha512-2Gl204JKeJSFH3sIboK4iMPPaZI223xfBMHfQMcULTwySt2skWEd5OnYhtciPtHoxGzyaNLkGCalNfivCKxhQQ== + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerate-unicode-properties@^10.1.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== + +resolve@^1.3.2, resolve@^1.8.1: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +rimraf@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +safe-array-concat@^1.0.0, safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^5.3.0, semver@^5.4.1, semver@^5.5.1, semver@^5.6.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + 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" + +set-function-name@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +side-channel@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" + +util.promisify@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.2.tgz#02b3dbadbb80071eee4c43aed58747afdfc516db" + integrity sha512-PBdZ03m1kBnQ5cjjO0ZvJMJS+QsbyIcFwi4hY4U76OQsCO9JrOYjbCFgIF76ccFg9xnJo7ZHPkqyj1GqmdS7MA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + for-each "^0.3.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + object.getownpropertydescriptors "^2.1.6" + safe-array-concat "^1.0.0" + +web-streams-polyfill@^3.0.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" + integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== + +whatwg-fetch@>=0.10.0: + version "3.6.20" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" + integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + 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" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^15.0.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" diff --git a/openapitools.json b/openapitools.json new file mode 100644 index 0000000..5c50d6a --- /dev/null +++ b/openapitools.json @@ -0,0 +1,7 @@ +{ + "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json", + "spaces": 2, + "generator-cli": { + "version": "7.6.0" + } +} diff --git a/package.json b/package.json index 0ccd8ee..260f507 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "@testing-library/jest-dom": "^5.11.4", "@testing-library/react": "^11.1.0", "@testing-library/user-event": "^12.1.10", + "api": "file:./api", "mobx": "^6.0.4", "mobx-react": "^7.6.0", "nanoid": "^3.1.20", @@ -14,6 +15,7 @@ "react-dom": "^17.0.1", "react-dropdown": "^1.9.0", "react-paginate": "^8.2.0", + "react-responsive-modal": "^6.4.2", "react-router-dom": "^6.6.2", "react-scripts": "5.0.1", "react-select": "^3.1.1", @@ -22,6 +24,8 @@ "reactjs-dropdown-component": "^1.1.3", "sass": "^1.30.0", "sheet-router": "^4.2.3", + "spacemesh_api": "./api", + "url": "^0.11.3", "web-vitals": "^0.2.4" }, "scripts": { @@ -30,7 +34,8 @@ "test": "react-scripts test", "eject": "react-scripts eject", "flow": "flow", - "lint": "eslint ." + "lint": "eslint .", + "generate-api": "openapi-generator-cli generate -i api.swagger.json -g javascript-flowtyped -o ./api --additional-properties=usePromises=true && cd api && yarn install && BABEL_ENV=production yarn build" }, "browserslist": { "production": [ @@ -49,6 +54,7 @@ "@babel/core": "^7.20.12", "@babel/eslint-parser": "^7.19.1", "@babel/preset-flow": "^7.18.6", + "@openapitools/openapi-generator-cli": "^2.13.4", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-flowtype": "^8.0.3", "eslint-plugin-ft-flow": "^2.0.3", diff --git a/src/api/fetchAPI.js b/src/api/fetchAPI.js deleted file mode 100644 index c4a23f1..0000000 --- a/src/api/fetchAPI.js +++ /dev/null @@ -1,15 +0,0 @@ -// @flow -export function fetchAPI(url, path, options) { - const fetchOptions = {}; - fetchOptions.method = options && (options.method || 'GET'); - - if (options && options.headers) { - fetchOptions.headers = { ...fetchOptions.headers, ...options.headers }; - } - - const requestUrl = path ? `${url}${path}` : url; - - return fetch(requestUrl, fetchOptions) - .then((response) => response.json()) - .then((data) => data); -} diff --git a/src/components/CountBlock/RightCountBlock.jsx b/src/components/CountBlock/RightCountBlock.jsx index 7107912..dd62659 100644 --- a/src/components/CountBlock/RightCountBlock.jsx +++ b/src/components/CountBlock/RightCountBlock.jsx @@ -1,4 +1,6 @@ // @flow +import { commaNumber } from '../../helper/comma'; + type Props = { color: string, number: string, @@ -32,9 +34,11 @@ const RightCountBlock = (props: Props) => { lineHeight: setLineHeight(number), }} > - {number || '000'} + {commaNumber(number) || '000'}
{caption}
+ {coinCaption && coins !== undefined + && (

{`${coinCaption} `} @@ -43,6 +47,7 @@ const RightCountBlock = (props: Props) => { {coins}

+ )} ); }; diff --git a/src/components/CountBlock/RightSideBlock.jsx b/src/components/CountBlock/RightSideBlock.jsx index 324d51a..6628266 100644 --- a/src/components/CountBlock/RightSideBlock.jsx +++ b/src/components/CountBlock/RightSideBlock.jsx @@ -14,10 +14,12 @@ type Props = { coinCaption?: string, coins?: string, label?: string, + disableRightColumnData?: boolean, }; const RightSideBlock = (props: Props) => { - const { color, unit, number, startTime, coinCaption, coins, label, rewards } = props; + const { color, unit, number, startTime, coinCaption, + coins, label, rewards, disableRightColumnData } = props; const blockWithTime = () => (
@@ -50,6 +52,7 @@ const RightSideBlock = (props: Props) => { const blockWithCoinStyle = { backgroundColor: color.bgColor }; if (rewards) blockWithCoinStyle['grid-template-columns'] = '1fr 1fr 2fr'; + if (disableRightColumnData) blockWithCoinStyle['grid-template-columns'] = '1fr 1fr'; const blockWithCoin = () => (
@@ -64,10 +67,12 @@ const RightSideBlock = (props: Props) => { {commaNumber(number) || '000'}
{unit}
-
-

{`${coinCaption}`}

-

{`${formatSmidge(coins)}`}

-
+ {!disableRightColumnData && ( +
+

{`${coinCaption}`}

+

{`${formatSmidge(coins)}`}

+
+ )}
); return (startTime || startTime === 0 ? blockWithTime() : blockWithCoin()); diff --git a/src/components/Header/index.jsx b/src/components/Header/index.jsx index a193745..b4619cb 100644 --- a/src/components/Header/index.jsx +++ b/src/components/Header/index.jsx @@ -4,8 +4,6 @@ import { observer } from 'mobx-react'; import Logo from '../Logo'; import NavBar from '../NavBar'; import Switcher from '../Switcher'; -import DropDown from '../DropDown'; -import NetworkStatus from '../NetworkStatus'; import { useStore } from '../../store'; const Header = () => { @@ -26,17 +24,17 @@ const Header = () => {
-
- - { - store.setNetwork(e); - store.getNetworkInfo(); - }} - /> -
+ {/*
*/} + {/* */} + {/* { */} + {/* store.setNetwork(e); */} + {/* store.getNetworkInfo(); */} + {/* }} */} + {/* /> */} + {/*
*/} store.changeTheme(e)} checked={store.theme === 'dark'} />
); diff --git a/src/components/InfoBlock/index.jsx b/src/components/InfoBlock/index.jsx index 1107db0..89917d1 100644 --- a/src/components/InfoBlock/index.jsx +++ b/src/components/InfoBlock/index.jsx @@ -13,7 +13,7 @@ const InfoBlock = ({ accounts, security, epoch, layer, rewards, smeshers }) => (
  • - {JSON.stringify(accounts) || ()} + {accounts || ()}

    Accounts

    @@ -21,19 +21,19 @@ const InfoBlock = ({ accounts, security, epoch, layer, rewards, smeshers }) => (
  • - {formatSmidge(rewards) || ()} + {rewards ? formatSmidge(rewards) : ()}

    smeshing rewards

  • -

    {byteConverter(security)}

    +

    {security ? byteConverter(security) : ()}

    security

  • - {JSON.stringify(epoch) || ()} + {epoch || ()}

    epoch

    @@ -41,7 +41,7 @@ const InfoBlock = ({ accounts, security, epoch, layer, rewards, smeshers }) => (
  • - {JSON.stringify(layer) || ()} + {layer || ()}

    layer

    @@ -49,7 +49,7 @@ const InfoBlock = ({ accounts, security, epoch, layer, rewards, smeshers }) => (
  • - {JSON.stringify(smeshers) || ()} + {smeshers || ()}

    active smeshers

    diff --git a/src/components/MalfeasanceBlock/index.jsx b/src/components/MalfeasanceBlock/index.jsx index f15e451..d284a73 100644 --- a/src/components/MalfeasanceBlock/index.jsx +++ b/src/components/MalfeasanceBlock/index.jsx @@ -1,23 +1,32 @@ // @flow import { observer } from 'mobx-react'; +import { Spacemeshv2alpha1MalfeasanceProof } from 'api'; import { MALFEASANCE } from '../../config/constants'; import { getColorByPageName } from '../../helper/getColorByPageName'; type Props = { - title: string; - color: string, - desc: string; - uiStore: string, + proof: Spacemeshv2alpha1MalfeasanceProof }; const MalfeasanceBlock = (props: Props) => { - const { kind, layer, debugInfo } = props; + const { proof } = props; - const kindTranslation = { - MALFEASANCE_ATX: 'ATXs', - MALFEASANCE_BALLOT: 'ballots', - MALFEASANCE_HARE: 'Hare messages', + const message = () => { + switch (proof.type) { + case 1: + return `The key associated with this smesher was used to sign two contradictory ATXs in epoch ${proof.properties.publish_epoch}.`; + case 2: + return `The key associated with this smesher was used to sign two contradictory ballots in layer ${proof.properties.layer}.`; + case 3: + return `The key associated with this smesher was used to sign two contradictory Hare messages in layer ${proof.properties.layer} round ${proof.properties.round}.`; + case 4: + return `Smesher published ATX ${proof.properties.atx} with invalid PoST index ${proof.properties.index}.`; + case 5: + return `Smesher published ATX ${proof.properties.atx1} and ${proof.properties.atx2} with the same previous ATX ${proof.properties.prev_atx}.`; + default: + return ''; + } }; return ( @@ -28,26 +37,12 @@ const MalfeasanceBlock = (props: Props) => { This smesher identity is disqualified from participating in the protocol due to violation of protocol rules.

    - {kind === '5' ? ( -

    - {debugInfo.split('cause: ')[1]} -
    - This smesher will therefore be excluded from all future protocol decisions and denied any rewards beyond - those already received. -

    - ) : ( -

    - The key associated with this smesher was used to sign two contradictory - {' '} - {kindTranslation[kind]} - {' '} - in layer - {' '} - {layer} - . This smesher will therefore be excluded from all future protocol decisions and denied any rewards beyond - those already received. -

    - )} +

    + {message()} +
    + This smesher will therefore be excluded from all future protocol decisions and denied any rewards beyond + those already received. +

    READ MORE diff --git a/src/components/Search/index.jsx b/src/components/Search/index.jsx index c4f5637..a9383a9 100644 --- a/src/components/Search/index.jsx +++ b/src/components/Search/index.jsx @@ -2,33 +2,90 @@ import { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useStore } from '../../store'; -import { fetchAPI } from '../../api/fetchAPI'; +import { calculateEpoch, hexToBase64 } from '../../helper/converter'; + +const addressTestLength = 51; +const addressLength = 48; +const idLength = 66; const Search = () => { - const store = useStore(); const navigate = useNavigate(); const [searchValue, setSearchValue] = useState(''); + const store = useStore(); const [error, setError] = useState(); if (error) throw error; const onChangeHandler = (e) => setSearchValue(e.target.value); - const onClickHandler = () => { - // store.showSearchResult(searchValue); - fetchAPI(`${store.network.value}search/${searchValue}`).then((res) => { - const stringData = res.redirect.split('/'); - navigate(`/${stringData[1]}/${stringData[2]}`); - }).catch(() => { - const err = new Error('Not found'); - err.id = searchValue; - setError(err); - }); + const onClickHandler = async () => { + switch (searchValue.length) { + case addressLength: + case addressTestLength: + navigate(`/accounts/${searchValue}`); + break; + case idLength: + const tx = await store.api.transaction.transactionServiceList({ + txid: [hexToBase64(searchValue)], + limit: 1, + includeResult: false, + includeState: false, + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + } + }); + if (tx.transactions.length > 0) { + navigate(`/txs/${searchValue}`); + break; + } + + const atx = await store.api.activation.activationServiceList({ + id: [hexToBase64(searchValue)], + limit: 1, + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + } + }); + if (atx.activations.length > 0) { + navigate(`/atxs/${searchValue}`); + break; + } + + const response = await fetch(`${store.statsApiUrl}/smesher/${searchValue}`); + if (response.status === 429) { + store.showThrottlePopup(); + } else if (!response.ok) { + const err = new Error('Not found'); + err.id = searchValue; + setError(err); + break; + } + navigate(`/smeshers/${searchValue}`); + break; + default: + const id = parseInt(searchValue, 10); + if (Number.isNaN(id)) { + const err = new Error('Not found'); + err.id = searchValue; + setError(err); + } + const currentLayer = store.nodeStatus.currentLayer; + const currentEpoch = calculateEpoch(currentLayer, store.netInfo.layersPerEpoch); + if (id > currentEpoch + 1) { + if (id <= currentLayer && id > 0) { + navigate(`/layers/${id}`); + } + } else if (id > 0) { + navigate(`/epochs/${id}`); + } + break; + } }; useEffect(() => { const listener = (event) => { if (event.code === 'Enter' || event.code === 'NumpadEnter') { - // store.showSearchResult(searchValue); onClickHandler(); setSearchValue(''); } diff --git a/src/components/Table/AccountsRow.jsx b/src/components/Table/AccountsRow.jsx index e8a24fe..38c9637 100644 --- a/src/components/Table/AccountsRow.jsx +++ b/src/components/Table/AccountsRow.jsx @@ -3,14 +3,43 @@ import { nanoid } from 'nanoid'; import { observer } from 'mobx-react'; import { Link } from 'react-router-dom'; -import CustomTimeAgo from '../CustomTimeAgo'; +import { Spacemeshv2alpha1Account } from 'api'; +import { useEffect, useState } from 'react'; import shortFormHash from '../../helper/longFormHash'; import { formatSmidge } from '../../helper/converter'; import { ACCOUNTS } from '../../config/constants'; +import CustomTimeAgo from '../CustomTimeAgo'; +import { useStore } from '../../store'; +import Loader from '../Loader'; + +type Props = { + data: Spacemeshv2alpha1Account[], +} + +const AccountsRow = ({ data }: Props) => { + const store = useStore(); + const [stats, setStats] = useState({}); + + useEffect(() => { + if (data && data.length > 0) { + for (const item of data) { + fetch(`${store.statsApiUrl}/account/${item.address}`).then((res) => { + if (res.status === 429) { + store.showThrottlePopup(); + throw new Error('Too Many Requests'); + } + return res.json(); + }).then((res) => { + setStats((prev) => ({ ...prev, [item.address]: res })); + }).catch((error) => { + console.error(error); + }); + } + } + }, [data]); -const AccountsRow = ({ data }) => ( - data && data.map((item) => ( + return data && data.map((item: Spacemeshv2alpha1Account) => (

    @@ -18,19 +47,19 @@ const AccountsRow = ({ data }) => (
    - {formatSmidge(item.sent)} + {stats[item.address] ? formatSmidge(stats[item.address].sent) : }
    - {formatSmidge(item.received)} + {stats[item.address] ? formatSmidge(stats[item.address].received) : }
    - +
    - {formatSmidge(item.balance)} + {formatSmidge(item.current.balance)}
    - )) -); + )); +}; export default observer(AccountsRow); diff --git a/src/components/Table/AppRow.jsx b/src/components/Table/AppRow.jsx deleted file mode 100644 index 63e8750..0000000 --- a/src/components/Table/AppRow.jsx +++ /dev/null @@ -1,32 +0,0 @@ -// @flow -import { nanoid } from 'nanoid'; -import { observer } from 'mobx-react'; - -import { Link } from 'react-router-dom'; -import shortFormHash from '../../helper/longFormHash'; - -import { SMART_WALLET } from '../../config/constants'; -import { formatSmidge } from '../../helper/converter'; - -const AppRow = ({ data }) => ( - data && data.map((item) => ( -
    -
    - - {shortFormHash(item.address)} - -
    -
    - {item.name} -
    -
    - {item.created} -
    -
    - {formatSmidge(item.balance)} -
    -
    - )) -); - -export default observer(AppRow); diff --git a/src/components/Table/AtxsRow.jsx b/src/components/Table/AtxsRow.jsx index 7872af8..963cdcc 100644 --- a/src/components/Table/AtxsRow.jsx +++ b/src/components/Table/AtxsRow.jsx @@ -3,34 +3,30 @@ import { nanoid } from 'nanoid'; import { Link } from 'react-router-dom'; import StatusIcon from '../StatusIcon'; import shortFormHash from '../../helper/shortFormHash'; -import longFormHash from '../../helper/longFormHash'; import { ATXS, EPOCHS } from '../../config/constants'; -import { byteConverter } from '../../helper/converter'; +import { base64ToHex, byteConverter } from '../../helper/converter'; +import { useStore } from '../../store'; -const AtxsRow = ({ data }) => ( - data.map((item) => ( +const AtxsRow = ({ data }) => { + const store = useStore(); + return data.map((item) => (
    - - {shortFormHash(item.id)} + + {shortFormHash(base64ToHex(item.id))}
    - {byteConverter(item.commitmentSize)} + {byteConverter(item.numUnits * store.postUnitSize)}
    - - {item.targetEpoch} - -
    -
    - - {longFormHash(item.prevAtx)} + + {item.publishEpoch + 1}
    - )) -); + )); +}; export default AtxsRow; diff --git a/src/components/Table/EpochsRow.jsx b/src/components/Table/EpochsRow.jsx index 614bfab..5798322 100644 --- a/src/components/Table/EpochsRow.jsx +++ b/src/components/Table/EpochsRow.jsx @@ -3,17 +3,42 @@ import { observer } from 'mobx-react'; import { nanoid } from 'nanoid'; import { Link } from 'react-router-dom'; +import { useEffect, useState } from 'react'; import { EPOCHS, LAYERS, REWARDS, SMESHER, TXNS, } from '../../config/constants'; import CustomTimeAgo from '../CustomTimeAgo'; +import { useStore } from '../../store'; import { formatSmidge } from '../../helper/converter'; +import Loader from '../Loader'; -const EpochsRow = ({ data }) => ( - data && data.map((item) => { - const futureEpoch = item.start * 1000 > Date.now(); +const EpochsRow = ({ data }) => { + const store = useStore(); + + const [stats, setStats] = useState({}); + + useEffect(() => { + if (data && data.length > 0) { + for (const item of data) { + fetch(`${store.statsApiUrl}/epoch/${item.number}`).then((res) => { + if (res.status === 429) { + store.showThrottlePopup(); + throw new Error('Too Many Requests'); + } + return res.json(); + }).then((res) => { + setStats((prev) => ({ ...prev, [item.number]: res })); + }).catch((error) => { + console.error(error); + }); + } + } + }, [data]); + + return data && data.map((item) => { + const futureEpoch = store.layerTimestamp(item.startLayer) * 1000 > Date.now(); return (
    @@ -22,25 +47,29 @@ const EpochsRow = ({ data }) => (
    - +
    {item.layers}
    - {item.stats.current.transactions} + + {stats[item.number] ? stats[item.number]?.transactions_count || 0 : } +
    - {item.stats.current.smeshers} + + {stats[item.number] ? stats[item.number]?.activations_count || 0 : } +
    - {formatSmidge(item.stats.current.rewards)} + {stats[item.number] ? formatSmidge(stats[item.number].rewards_sum || 0) : }
    ); - }) -); + }); +}; export default observer(EpochsRow); diff --git a/src/components/Table/LayersRow.jsx b/src/components/Table/LayersRow.jsx index 0bfd308..a16961d 100644 --- a/src/components/Table/LayersRow.jsx +++ b/src/components/Table/LayersRow.jsx @@ -3,15 +3,44 @@ import { nanoid } from 'nanoid'; import { observer } from 'mobx-react'; import { Link } from 'react-router-dom'; +import { Spacemeshv2alpha1Layer } from 'api'; +import { useEffect, useState } from 'react'; import { LAYERS, TXNS, REWARDS, } from '../../config/constants'; -import { formatSmidge } from '../../helper/converter'; import CustomTimeAgo from '../CustomTimeAgo'; +import { useStore } from '../../store'; +import { formatSmidge } from '../../helper/converter'; +import Loader from '../Loader'; + +type Props = { + data: Spacemeshv2alpha1Layer[], +} +const LayersRow = ({ data }: Props) => { + const store = useStore(); + + const [stats, setStats] = useState({}); + + useEffect(() => { + if (data && data.length > 0) { + for (const item of data) { + fetch(`${store.statsApiUrl}/layer/${item.number}`).then((res) => { + if (res.status === 429) { + store.showThrottlePopup(); + throw new Error('Too Many Requests'); + } + return res.json(); + }).then((res) => { + setStats((prev) => ({ ...prev, [item.number]: res })); + }).catch((error) => { + console.error(error); + }); + } + } + }, [data]); -const LayersRow = ({ data }) => ( - data && data.map((item) => ( + return data && data.map((item: Spacemeshv2alpha1Layer) => (
    @@ -19,20 +48,22 @@ const LayersRow = ({ data }) => (
    - +
    - {`${item.txs} Transactions (${formatSmidge(item.txsamount)})`} + { stats[item.number] ? ( + `${stats[item.number].transactions_count} Transactions (${formatSmidge(stats[item.number].transactions_sum)})` + ) : }
    - {formatSmidge(item.rewards)} + {stats[item.number] ? formatSmidge(stats[item.number].rewards_sum) : }
    - )) -); + )); +}; export default observer(LayersRow); diff --git a/src/components/Table/RewardsRow.jsx b/src/components/Table/RewardsRow.jsx index 856a961..e1debb4 100644 --- a/src/components/Table/RewardsRow.jsx +++ b/src/components/Table/RewardsRow.jsx @@ -3,31 +3,30 @@ import { nanoid } from 'nanoid'; import { observer } from 'mobx-react'; import { Link } from 'react-router-dom'; -import shortFormHash from '../../helper/shortFormHash'; +import { Spacemeshv2alpha1Reward } from 'api'; import longFormHash from '../../helper/longFormHash'; import { ACCOUNTS, LAYERS, - REWARDS, SMESHER, + SMESHER, } from '../../config/constants'; -import { formatSmidge } from '../../helper/converter'; +import { base64ToHex, formatSmidge } from '../../helper/converter'; -const RewardsRow = ({ data }) => ( - data && data.length !== 0 && data.map((item) => ( +type Props = { + data: Spacemeshv2alpha1Reward[], +} + +const RewardsRow = ({ data }: Props) => ( + data && data.length !== 0 && data.map((item: Spacemeshv2alpha1Reward) => (
    -
    - - {item.displayName ? shortFormHash(item.displayName) : '--'} - -
    {longFormHash(item.coinbase)}
    - - {longFormHash(item.smesher)} + + {longFormHash(base64ToHex(item.smesher))}
    diff --git a/src/components/Table/SmesherRow.jsx b/src/components/Table/SmesherRow.jsx index ee6f4fb..07164ea 100644 --- a/src/components/Table/SmesherRow.jsx +++ b/src/components/Table/SmesherRow.jsx @@ -3,34 +3,71 @@ import { nanoid } from 'nanoid'; import { observer } from 'mobx-react'; import { Link } from 'react-router-dom'; +import { useEffect, useState } from 'react'; import shortFormHash from '../../helper/longFormHash'; -import { - ACCOUNTS, ATXS, SMESHER, -} from '../../config/constants'; -import { byteConverter } from '../../helper/converter'; +import { ACCOUNTS, SMESHER } from '../../config/constants'; +import { base64ToHex, byteConverter } from '../../helper/converter'; +import { useStore } from '../../store'; +import Loader from '../Loader'; -const SmesherRow = ({ data }) => ( - data && data.map((item) => ( +const SmesherRow = ({ data }) => { + const store = useStore(); + const [atxs, setAtxs] = useState({}); + const [isFetching, setIsFetching] = useState(true); + + useEffect(() => { + const fetchData = async () => { + if (data && data.length > 0) { + setIsFetching(true); + try { + const promises = data.map(async (item) => { + const res = await store.api.activation.activationServiceList({ + smesherId: [item.pubkey], + limit: 100, + }); + return { [item.pubkey]: res }; + }); + + const allStats = await Promise.all(promises); + const combinedStats = allStats.reduce((acc, result) => ({ ...acc, ...result }), {}); + setAtxs(combinedStats); + setIsFetching(false); + } catch (error) { + if (error.status === 429) { + store.showThrottlePopup(); + } + console.error(error); + } + } + }; + fetchData(); + }, [data]); + + if (isFetching) { + return ; + } + + return data && data.map((item) => (
    - - {shortFormHash(item.id)} + + {shortFormHash(base64ToHex(item.pubkey))}
    - {shortFormHash(item.coinbase)} + {shortFormHash(atxs[item.pubkey].activations[atxs[item.pubkey].activations.length - 1].coinbase)}
    - {byteConverter(item.cSize)} + {byteConverter(atxs[item.pubkey].activations[atxs[item.pubkey].activations.length - 1].numUnits * store.postUnitSize)}
    - {item.atxcount} + {item.atxs}
    - )) -); + )); +}; export default observer(SmesherRow); diff --git a/src/components/Table/TransactionsRow.jsx b/src/components/Table/TransactionsRow.jsx index e0560c1..1b2422b 100644 --- a/src/components/Table/TransactionsRow.jsx +++ b/src/components/Table/TransactionsRow.jsx @@ -3,35 +3,43 @@ import { observer } from 'mobx-react'; import { nanoid } from 'nanoid'; import { Link } from 'react-router-dom'; +import type { V2alpha1TransactionResponse } from 'api'; import StatusIcon from '../StatusIcon'; import longFormHash from '../../helper/longFormHash'; import { ACCOUNTS, LAYERS, TXNS, } from '../../config/constants'; -import { formatSmidge } from '../../helper/converter'; -import { typeOfTransaction, mapTxResult } from '../../helper/tx'; +import { base64ToHex, formatSmidge } from '../../helper/converter'; +import { + typeOfTransaction, mapTxResult, amount, destination, +} from '../../helper/tx'; + +type Props = { + data: V2alpha1TransactionResponse[], + pathname: string +} -const TransactionsRow = ({ data, pathname }) => ( - data && data.map((item) => ( +const TransactionsRow = ({ data, pathname }: Props) => ( + data && data.map((item: V2alpha1TransactionResponse) => (
    - - - {longFormHash(item.id)} + + + {longFormHash(base64ToHex(item.tx.id))}
    - - {item.layer} + + {item.txResult?.layer}
    -
    {formatSmidge(item.amount)}
    +
    {formatSmidge(amount(item))}
    { - pathname === `/${ACCOUNTS}/${item.sender}` ? longFormHash(item.sender) : ( - - {longFormHash(item.sender)} + pathname === `/${ACCOUNTS}/${item.tx.principal}` ? longFormHash(item.tx.principal) : ( + + {longFormHash(item.tx.principal)} ) } @@ -39,14 +47,15 @@ const TransactionsRow = ({ data, pathname }) => (
    { - pathname === `/${ACCOUNTS}/${item.receiver}` ? longFormHash(item.receiver) : ( - - {longFormHash(item.receiver)} - - ) + pathname === `/${ACCOUNTS}/${destination(item)}` + ? longFormHash(destination(item)) : ( + + {longFormHash(destination(item))} + + ) }
    -
    {typeOfTransaction(item.type)}
    +
    {typeOfTransaction(item.tx.type)}
    )) ); diff --git a/src/components/Table/config/tableFieldConfig.js b/src/components/Table/config/tableFieldConfig.js index 11a4339..b7934f5 100644 --- a/src/components/Table/config/tableFieldConfig.js +++ b/src/components/Table/config/tableFieldConfig.js @@ -6,7 +6,6 @@ import { REWARDS, ACCOUNTS, SMESHER, - SMART_WALLET, ATXS, BLOCKS, ACCOUNTS_TXNS, } from '../../../config/constants'; @@ -77,7 +76,6 @@ export default { { fieldName: 'id' }, { fieldName: 'space' }, { fieldName: 'target epoch' }, - { fieldName: 'Previous Activation' }, ], [LAYERS]: [ { @@ -94,9 +92,6 @@ export default { }, ], [REWARDS]: [ - { - fieldName: 'reward', - }, { fieldName: 'account', }, @@ -127,20 +122,6 @@ export default { fieldName: 'balance', }, ], - [SMART_WALLET]: [ - { - fieldName: 'address', - }, - { - fieldName: 'name', - }, - { - fieldName: 'created', - }, - { - fieldName: 'balance', - }, - ], [SMESHER]: [ { fieldName: 'Smesher Id', diff --git a/src/components/Table/index.js b/src/components/Table/index.js index d0a1553..34805b7 100644 --- a/src/components/Table/index.js +++ b/src/components/Table/index.js @@ -3,7 +3,6 @@ import { useState, useEffect } from 'react'; import { nanoid } from 'nanoid'; import { observer } from 'mobx-react'; -import ReactPaginate from 'react-paginate'; import { useLocation } from 'react-router-dom'; import TransactionsRow from './TransactionsRow'; import AccountTxsRow from './AccountTxsRow'; @@ -18,7 +17,6 @@ import { LAYERS, OVERVIEW, REWARDS, - SMART_WALLET, SMESHER, TXNS, ATXS, @@ -29,87 +27,307 @@ import tableFieldConfig from './config/tableFieldConfig'; import LayersRow from './LayersRow'; import AtxsRow from './AtxsRow'; import BlocksRow from './BlocksRow'; -import AppRow from './AppRow'; import Loader from '../Loader'; import NoData from '../NoData'; import { useStore } from '../../store'; -import { fetchAPI } from '../../api/fetchAPI'; +import { hexToBase64 } from '../../helper/converter'; -const Table = ({ name, subPage, id, results }) => { +type Props = { + name: string, + subPage?: string, + id?: string, + epochs?: any, +} + +const Table = ({ name, subPage, id, epochs }: Props) => { const store = useStore(); const { pathname } = useLocation(); - const [data, setData] = useState(results?.data); + const [data, setData] = useState([]); const [status, setStatus] = useState(STATUS_LOADING); - const [currentNetwork, setCurrentNetwork] = useState(store.network.value); const tableConfigName = subPage || name; const pageSize = 20; - const pages = Math.ceil((results?.pagination.totalCount || 0) / pageSize); - const [page, setPage] = useState(1); - const [pageCount, setPageCount] = useState(pages); - const [isFetching, setIsFetching] = useState(false); - - const getUri = () => { - let pathName = name; - if (subPage && id) { - pathName = `${name}/${id}/${subPage}`; - } + const [currentOffset, setCurrentOffset] = useState(0); + const [isFetching, setIsFetching] = useState(true); - if (name === OVERVIEW) { - pathName = TXNS; - } + const getData = (offset) => { + switch (name) { + case OVERVIEW: + case TXNS: + store.api.transaction.transactionServiceList({ + limit: pageSize, + offset, + sort_order: 1, + includeState: true, + includeResult: true, + }).then((res) => { + setData(res.transactions); + setStatus(STATUS_SUCCESS); + setIsFetching(false); + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + } + setStatus(STATUS_ERROR); + }); + break; + case LAYERS: + if (subPage === REWARDS) { + store.api.reward.rewardServiceList({ + startLayer: id, + endLayer: id, + limit: pageSize, + offset, + sort_order: 1, + }).then((res) => { + setData(res.rewards); + setStatus(STATUS_SUCCESS); + setIsFetching(false); + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + } + setStatus(STATUS_ERROR); + }); + } else if (subPage === TXNS) { + store.api.transaction.transactionServiceList({ + startLayer: id, + endLayer: id, + limit: pageSize, + offset, + sort_order: 1, + includeState: true, + includeResult: true, + }).then((res) => { + setData(res.transactions); + setStatus(STATUS_SUCCESS); + setIsFetching(false); + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + } + setStatus(STATUS_ERROR); + }); + } else { + store.api.layer.layerServiceList({ + limit: pageSize, + offset, + sort_order: 1, + }).then((res) => { + setData(res.layers); + setStatus(STATUS_SUCCESS); + setIsFetching(false); + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + } + setStatus(STATUS_ERROR); + }); + } + break; + case REWARDS: + store.api.reward.rewardServiceList({ + limit: pageSize, + offset, + sort_order: 1, + }).then((res) => { + setData(res.rewards); + setStatus(STATUS_SUCCESS); + setIsFetching(false); + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + } + setStatus(STATUS_ERROR); + }); + break; + case ACCOUNTS: + if (subPage === TXNS) { + store.api.transaction.transactionServiceList({ + address: id, + limit: pageSize, + offset, + sort_order: 1, + includeState: true, + includeResult: true, + }).then((res) => { + setData(res.transactions); + setStatus(STATUS_SUCCESS); + setIsFetching(false); + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + } + setStatus(STATUS_ERROR); + }); + } else if (subPage === REWARDS) { + store.api.reward.rewardServiceList({ + coinbase: id, + limit: pageSize, + offset, + sort_order: 1, + }).then((res) => { + setData(res.rewards); + setStatus(STATUS_SUCCESS); + setIsFetching(false); + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + } + setStatus(STATUS_ERROR); + }); + } else { + store.api.account.accountServiceList({ + limit: pageSize, + offset, + }).then((res) => { + setData(res.accounts); + setStatus(STATUS_SUCCESS); + setIsFetching(false); + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + } + setStatus(STATUS_ERROR); + }); + } + break; + case EPOCHS: + if (subPage === SMESHER) { + fetch(`${store.statsApiUrl}/smeshers/${id}?limit=${pageSize}&offset=${offset}`) + .then((res) => { + if (res.status === 429) { + store.showThrottlePopup(); + throw new Error('Too Many Requests'); + } + return res.json(); + }) + .then((res) => { + setData(res.smeshers); + setStatus(STATUS_SUCCESS); + setIsFetching(false); + }); + } else if (subPage === TXNS) { + store.api.transaction.transactionServiceList({ + limit: pageSize, + offset, + sort_order: 1, + includeState: true, + includeResult: true, + startLayer: store.netInfo.layersPerEpoch * id, + endLayer: store.netInfo.layersPerEpoch * id + store.netInfo.layersPerEpoch - 1, + }).then((res) => { + setData(res.transactions); + setStatus(STATUS_SUCCESS); + setIsFetching(false); + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + } + setStatus(STATUS_ERROR); + }); + } else if (subPage === LAYERS) { + store.api.layer.layerServiceList({ + limit: pageSize, + offset, + sort_order: 1, + startLayer: store.netInfo.layersPerEpoch * id, + endLayer: store.netInfo.layersPerEpoch * id + store.netInfo.layersPerEpoch - 1, + }).then((res) => { + setData(res.layers); + setStatus(STATUS_SUCCESS); + setIsFetching(false); + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + } + setStatus(STATUS_ERROR); + }); + } else if (subPage === REWARDS) { + store.api.reward.rewardServiceList({ + limit: pageSize, + offset, + sort_order: 1, + startLayer: store.netInfo.layersPerEpoch * id, + endLayer: store.netInfo.layersPerEpoch * id + store.netInfo.layersPerEpoch - 1, + }).then((res) => { + setData(res.rewards); + setStatus(STATUS_SUCCESS); + setIsFetching(false); + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + } + setStatus(STATUS_ERROR); + }); + } else { + if (!epochs) { + break; + } + setData(epochs.slice(offset, offset + pageSize)); + setStatus(STATUS_SUCCESS); + setIsFetching(false); + } + break; + case SMESHER: + if (subPage === ATXS) { + store.api.activation.activationServiceList({ + smesherId: [hexToBase64(id)], + limit: pageSize, + offset, + }).then((res) => { + setData(res.activations); + setStatus(STATUS_SUCCESS); + setIsFetching(false); + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + } + setStatus(STATUS_ERROR); + }); + } else if (subPage === REWARDS) { + store.api.reward.rewardServiceList({ + smesher: hexToBase64(id), + limit: pageSize, + offset, + sort_order: 1, + }).then((res) => { + setData(res.rewards); + setStatus(STATUS_SUCCESS); + setIsFetching(false); + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + } + setStatus(STATUS_ERROR); + }); + } else { + fetch(`${store.statsApiUrl}/smeshers?limit=${pageSize}&offset=${offset}`) + .then((res) => { + if (res.status === 429) { + store.showThrottlePopup(); + throw new Error('Too Many Requests'); + } + return res.json(); + }) + .then((res) => { + setData(res.smeshers); + setStatus(STATUS_SUCCESS); + setIsFetching(false); + }); + } - if (subPage === ACCOUNTS_TXNS) { - pathName = `${name}/${id}/${TXNS}`; + break; + default: + break; } - - return pathName; }; - const getRewardsData = (d) => d.map((item) => ({ ...item, displayName: `0x${item._id}` })); - useEffect(() => { - if (store.network.value === null) return; - if (data !== null && data !== undefined && (Object.entries(data).length > 0) && currentNetwork === store.network.value) { - if (name === REWARDS || subPage === REWARDS) { - setData(getRewardsData(data)); - } - return; - } - setCurrentNetwork(store.network.value); - - fetchAPI(`${store.network.value}${getUri()}`).then((result) => { - if (name === REWARDS || subPage === REWARDS) { - setData(getRewardsData(result.data)); - } else { - setData(result.data); - } - const totalPages = Math.ceil(result.pagination.totalCount / pageSize); - setPageCount(totalPages); - setStatus(STATUS_SUCCESS); - }); - }, [store.network.value]); - - const getPaginationData = (pageNumber) => { - if (name === OVERVIEW) return; - fetchAPI(`${store.network.value}${getUri()}?page=${pageNumber}&pagesize=${pageSize}`).then( - (result) => { - if (name === REWARDS || subPage === REWARDS) { - setData(getRewardsData(result.data)); - } else { - setData(result.data); - } - setStatus(STATUS_SUCCESS); - setIsFetching(false); - }, - (error) => { - console.log(error); - setIsFetching(false); - setStatus(STATUS_ERROR); - }, - ); - }; + if (store.netInfo === null) return; + getData(0); + }, [store.netInfo]); const renderTableData = () => { if (isFetching) { @@ -166,14 +384,6 @@ const Table = ({ name, subPage, id, results }) => { config={tableFieldConfig[tableConfigName]} /> ); - case SMART_WALLET: - return ( - - ); case SMESHER: return ( { } }; - const handlePageClick = (event) => { + const handlePrevClick = () => { + if (currentOffset === 0) { + return; + } + setIsFetching(true); + const prevOffset = currentOffset - pageSize; + setCurrentOffset(prevOffset); + getData(prevOffset); + }; + + const handleNextClick = () => { + if (data.length < pageSize) { + return; + } setIsFetching(true); - const nextPage = event.selected + 1; - setPage(nextPage); - getPaginationData(nextPage); + const nextOffset = currentOffset + pageSize; + setCurrentOffset(nextOffset); + getData(nextOffset); }; + if (isFetching) { + return ; + } + return ( <>
    @@ -230,29 +457,30 @@ const Table = ({ name, subPage, id, results }) => {
    ))}
    - {data ? renderTableData() : } + {data && data.length > 0 && renderTableData()} {status === STATUS_SUCCESS && data.length === 0 && }
    - {(pageCount && name !== OVERVIEW) && ( + {(name !== OVERVIEW) && ( )} diff --git a/src/components/ThrottleWarningPopup/index.jsx b/src/components/ThrottleWarningPopup/index.jsx new file mode 100644 index 0000000..75696e4 --- /dev/null +++ b/src/components/ThrottleWarningPopup/index.jsx @@ -0,0 +1,51 @@ +import 'react-responsive-modal/styles.css'; +import { observer } from 'mobx-react'; +import Modal from 'react-responsive-modal'; +import { useStore } from '../../store'; +import { getColorByPageName } from '../../helper/getColorByPageName'; +import { EPOCHS } from '../../config/constants'; +import BitmapSVG from '../TitleBlock/BitmapSVG'; + +const ThrottleWarningPopup = () => { + const store = useStore(); + + const color = getColorByPageName(EPOCHS); + const closeStyle = { color: color.textColor, cursor: 'pointer', marginRight: '8px', fontSize: '40px' }; + + return ( + store.hideThrottlePopup()} + center + styles={{ + modal: { + maxWidth: '650px', + padding: 0, + }, + }} + > +
    +
    +

    Slow Down!

    +
    + +
    +
    +
    +

    Our system detected that you are using the app too heavily. Please slow down to avoid further limitations.

    +
    +
    +
    + ); +}; + +export default observer(ThrottleWarningPopup); diff --git a/src/components/TimeBlock/index.jsx b/src/components/TimeBlock/index.jsx index 8b753ca..f5832ec 100644 --- a/src/components/TimeBlock/index.jsx +++ b/src/components/TimeBlock/index.jsx @@ -2,30 +2,29 @@ import { observer } from 'mobx-react'; import { Link } from 'react-router-dom'; import { EPOCHS, LAYERS } from '../../config/constants'; +import { calculateEpoch } from '../../helper/converter'; import { useStore } from '../../store'; const TimeBlock = () => { - const store = useStore(); - const { epoch, layer } = store.networkInfo; - + const { nodeStatus, netInfo } = useStore(); return (
    - {epoch && ( + {nodeStatus && nodeStatus.latestLayer && netInfo && netInfo.layersPerEpoch && (
    Epoch
    - - {epoch.number} + + {calculateEpoch(nodeStatus.latestLayer, netInfo.layersPerEpoch)}
    )} - {layer && ( + {nodeStatus && nodeStatus.latestLayer && (
    Layer
    - - {layer.number} + + {nodeStatus.latestLayer}
    diff --git a/src/components/TxnsStatus/index.jsx b/src/components/TxnsStatus/index.jsx index bbf85e5..5c5a1e2 100644 --- a/src/components/TxnsStatus/index.jsx +++ b/src/components/TxnsStatus/index.jsx @@ -1,9 +1,12 @@ // @flow import { observer } from 'mobx-react'; +import { Spacemeshv2alpha1TransactionResult, Spacemeshv2alpha1TransactionState } from 'api'; import { mapTxResult } from '../../helper/tx'; type Props = { - status: string + result: Spacemeshv2alpha1TransactionResult, + state: Spacemeshv2alpha1TransactionState, + message?: string }; const TxnsStatus = (props: Props) => { diff --git a/src/config/titleBlockConfig.js b/src/config/titleBlockConfig.js deleted file mode 100644 index 948eaca..0000000 --- a/src/config/titleBlockConfig.js +++ /dev/null @@ -1,32 +0,0 @@ -export const titleBlockConfig = { - overview: { - title: '', - desc: '', - }, - epochs: { - title: '', - desc: '', - }, - layers: { - title: '', - desc: '', - }, - txns: { - title: 'transactions', - desc: 'transactions across the entire mesh', - }, - rewards: { - title: '', - desc: '', - }, - accounts: { - title: '', - desc: '', - }, - apps: { - title: '', - desc: '', - }, - smesher: { title: '', - desc: '' }, -}; diff --git a/src/helper/converter.js b/src/helper/converter.js index a517d5d..1b58690 100644 --- a/src/helper/converter.js +++ b/src/helper/converter.js @@ -55,3 +55,14 @@ export const formatSmidge = (amount: number): string => { const { value, unit } = parseSmidge(amount); return `${value} ${unit}`; }; + +// hex to base64 +export const hexToBase64 = (hex: string) => { + const hexWithoutPrefix = hex.replace(/^0x/, ''); + return btoa(hexWithoutPrefix.match(/\w{2}/g).map((a) => String.fromCharCode(parseInt(a, 16))).join('')); +}; + +// base64 to hex +export const base64ToHex = (base64: string) => `0x${atob(base64).split('').map((c) => (`0${c.charCodeAt(0).toString(16)}`).slice(-2)).join('')}`; + +export const calculateEpoch = (layer: number, layersPerEpoch: number) => Math.floor(layer / layersPerEpoch); diff --git a/src/helper/grba.js b/src/helper/grba.js deleted file mode 100644 index 7765b9b..0000000 --- a/src/helper/grba.js +++ /dev/null @@ -1,3 +0,0 @@ -const rgba = (r: (string | number), g: (string | number), b: (string | number), a: (string | number)): string => `rgba(${r}, ${g}, ${b}, ${a})`; - -export default rgba; diff --git a/src/helper/hashFilter.js b/src/helper/hashFilter.js deleted file mode 100644 index d61cc4c..0000000 --- a/src/helper/hashFilter.js +++ /dev/null @@ -1,6 +0,0 @@ -const hashFilter = (hash) => { - if (typeof hash === 'undefined') return '?'; - return `${hash.substr(0, 4)}...${hash.substr(56, 4)}`; -}; - -export default hashFilter; diff --git a/src/helper/isEmpty.js b/src/helper/isEmpty.js deleted file mode 100644 index b2e9d21..0000000 --- a/src/helper/isEmpty.js +++ /dev/null @@ -1,8 +0,0 @@ -const isEmpty = (value) => ( - value === undefined - || value === null - || (typeof value === 'object' && Object.keys(value).length === 0) - || (typeof value === 'string' && value.trim().length === 0) -); - -export default isEmpty; diff --git a/src/helper/mocker.js b/src/helper/mocker.js deleted file mode 100644 index eaeba8e..0000000 --- a/src/helper/mocker.js +++ /dev/null @@ -1,297 +0,0 @@ -import { - ACCOUNTS, EPOCHS, REWARDS, SMART_WALLET, SMESHER, -} from '../config/constants'; - -const overviewData = { - networks: [ - { - id: '1', - domain: 'https://testnet1.com', - name: "TestNet 0.1 'TweedleDee'", - }, - { - id: '2', - domain: 'https://testnet2.com', - name: "TestNet 0.2 'TweedleDee'", - }, - ], - transactions: 0, - smeshingRewards: 0, - security: 0, - epochs: 0, - layers: 0, - activeSmeshers: 0, -}; - -const epochsData = [ - { - id: '126812', - started: '31 days ago', - ended: '14 days ago', - layers: '123', - transactions: '3867', - smeshers: '126', - rewards: '320 SMH', - total: '32 SMH', - }, - { - id: '126812', - started: '31 days ago', - ended: '14 days ago', - layers: '123', - transactions: '3867', - smeshers: '126', - rewards: '320 SMH', - total: '32 SMH', - }, - { - id: '126812', - started: '31 days ago', - ended: '14 days ago', - layers: '123', - transactions: '3867', - smeshers: '126', - rewards: '320 SMH', - total: '32 SMH', - }, - { - id: '126812', - started: '31 days ago', - ended: '14 days ago', - layers: '123', - transactions: '3867', - smeshers: '126', - rewards: '320 SMH', - total: '32 SMH', - }, - { - id: '126812', - started: '31 days ago', - ended: '14 days ago', - layers: '123', - transactions: '3867', - smeshers: '126', - rewards: '320 SMH', - total: '32 SMH', - }, - { - id: '126812', - started: '31 days ago', - ended: '14 days ago', - layers: '123', - transactions: '3867', - smeshers: '126', - rewards: '320 SMH', - total: '32 SMH', - }, -]; -const rewardsData = [ - { - id: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - account: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - smesher: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - layer: '123321', - space: '120', - value: '325', - }, - { - id: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - account: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - smesher: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - layer: '123321', - space: '120', - value: '325', - }, - { - id: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - account: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - smesher: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - layer: '123321', - space: '120', - value: '325', - }, - { - id: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - account: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - smesher: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - layer: '123321', - space: '120', - value: '325', - }, - { - id: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - account: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - smesher: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - layer: '123321', - space: '120', - value: '325', - }, - { - id: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - account: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - smesher: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - layer: '123321', - space: '120', - value: '325', - }, -]; -const accountsData = [ - { - id: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - sent: '32', - recieved: '32', - lastActive: '2 hrs ago', - awards: '320', - balance: '11', - }, - { - id: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - sent: '32', - recieved: '32', - lastActive: '2 hrs ago', - awards: '320', - balance: '11', - }, - { - id: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - sent: '32', - recieved: '32', - lastActive: '2 hrs ago', - awards: '320', - balance: '11', - }, - { - id: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - sent: '32', - recieved: '32', - lastActive: '2 hrs ago', - awards: '320', - balance: '11', - }, - { - id: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - sent: '32', - recieved: '32', - lastActive: '2 hrs ago', - awards: '320', - balance: '11', - }, - { - id: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - sent: '32', - recieved: '32', - lastActive: '2 hrs ago', - awards: '320', - balance: '11', - }, -]; -const appsData = [ - { - address: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - name: 'SM W #1', - created: '3 days ago', - balance: '11', - }, - { - address: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - name: 'SM W #1', - created: '3 days ago', - balance: '11', - }, -]; -const smeshersData = [ - { - id: '126812', - rewardsAccount: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - committedSpace: '200', - totalAtxTxns: '32', - }, - { - id: '126812', - rewardsAccount: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - committedSpace: '200', - totalAtxTxns: '32', - }, - { - id: '126812', - rewardsAccount: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - committedSpace: '200', - totalAtxTxns: '32', - }, - { - id: '126812', - rewardsAccount: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - committedSpace: '200', - totalAtxTxns: '32', - }, - { - id: '126812', - rewardsAccount: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - committedSpace: '200', - totalAtxTxns: '32', - }, - { - id: '126812', - rewardsAccount: '0x69c756d06F0C1236F34D3A627EAcb7a4722FC5B8', - committedSpace: '200', - totalAtxTxns: '32', - }, -]; - -function randomInteger(min, max) { - const rand = min + Math.random() * (max + 1 - min); - return Math.floor(rand); -} - -export const overviewMocker = () => new Promise((resolve) => { - setTimeout(() => resolve(overviewData), randomInteger(600, 1200)); -}); - -// export const transactionMocker = () => new Promise((resolve) => { -// setTimeout(() => resolve(transactionsData), randomInteger(600, 1200)); -// }); - -export const epochsMocker = () => new Promise((resolve) => { - setTimeout(() => resolve(epochsData), randomInteger(600, 1200)); -}); - -// export const layersMocker = () => new Promise((resolve) => { -// setTimeout(() => resolve(layersData), randomInteger(600, 1200)); -// }); - -export const rewardsMocker = () => new Promise((resolve) => { - setTimeout(() => resolve(rewardsData), randomInteger(600, 1200)); -}); - -export const accountsMocker = () => new Promise((resolve) => { - setTimeout(() => resolve(accountsData), randomInteger(600, 1200)); -}); - -export const appsMocker = () => new Promise((resolve) => { - setTimeout(() => resolve(appsData), randomInteger(600, 1200)); -}); - -export const smeshersMocker = () => new Promise((resolve) => { - setTimeout(() => resolve(smeshersData), randomInteger(600, 1200)); -}); - -export const getMockerByPage = (page) => { - switch (page) { - // case TXNS: - // return transactionMocker(); - case EPOCHS: - return epochsMocker(); - // case LAYERS: - // return layersMocker(); - case REWARDS: - return rewardsMocker(); - case ACCOUNTS: - return accountsMocker(); - case SMART_WALLET: - return appsMocker(); - case SMESHER: - return smeshersMocker(); - default: - return null; - } -}; diff --git a/src/helper/tx.js b/src/helper/tx.js index a222058..5d8bfdb 100644 --- a/src/helper/tx.js +++ b/src/helper/tx.js @@ -1,53 +1,73 @@ -export const TransactionType = { - SingleSigSpawn: 1, - MultiSigSpawn: 2, - SingleSigSpend: 3, -}; +import type { Spacemeshv2alpha1TransactionResultStatus, Spacemeshv2alpha1TransactionState } from 'api'; export const typeOfTransaction = (type) => { switch (type) { - case 1: + case 'TRANSACTION_TYPE_SINGLE_SIG_SEND': + return 'Send'; + case 'TRANSACTION_TYPE_SINGLE_SIG_SPAWN': return 'Spawn'; - case 2: + case 'TRANSACTION_TYPE_MULTI_SIG_SEND': + return 'MultiSig.Send'; + case 'TRANSACTION_TYPE_MULTI_SIG_SPAWN': return 'MultiSig.Spawn'; - case 3: - return 'Spend'; - case 4: - return 'MultiSig.Spend'; - case 5: + case 'TRANSACTION_TYPE_VESTING_SPAWN': return 'Vesting.Spawn'; - case 6: + case 'TRANSACTION_TYPE_VAULT_SPAWN': return 'Vault.Spawn'; - case 7: - return 'Drain.Vault'; + case 'TRANSACTION_TYPE_DRAIN_VAULT': + return 'Vault.Drain'; default: - return null; + return 'Unspecified'; } }; -export const mappingStatus = (status) => { +export const mappingState = (status: Spacemeshv2alpha1TransactionState) => { switch (status) { - case 6: + case 'TRANSACTION_STATE_PROCESSED': return 'approved'; default: return 'pending'; } }; -export const mappingResult = (status) => { +export const mappingResult = (status: Spacemeshv2alpha1TransactionResultStatus) => { switch (status) { - case 1: + case 'TRANSACTION_STATUS_FAILURE': return 'failure'; - case 2: + case 'TRANSACTION_STATUS_INVALID': return 'invalid'; default: return null; } }; -export const mapTxResult = (state, result) => { - const status = mappingStatus(state); +export const mapTxResult = (state: Spacemeshv2alpha1TransactionState, result: Spacemeshv2alpha1TransactionResultStatus) => { + const status = mappingState(state); const res = mappingResult(result); return res === null ? status : res; }; + +export const amount = (tx) => { + switch (tx.tx.type) { + case 'TRANSACTION_TYPE_DRAIN_VAULT': + return tx.tx.contents.drainVault.amount; + case 'TRANSACTION_TYPE_MULTI_SIG_SEND': + case 'TRANSACTION_TYPE_SINGLE_SIG_SEND': + return tx.tx.contents.send.amount; + default: + return 0; + } +}; + +export const destination = (tx) => { + switch (tx.tx.type) { + case 'TRANSACTION_TYPE_DRAIN_VAULT': + return tx.tx.contents.drainVault.destination; + case 'TRANSACTION_TYPE_MULTI_SIG_SEND': + case 'TRANSACTION_TYPE_SINGLE_SIG_SEND': + return tx.tx.contents.send.destination; + default: + return tx.tx.principal; + } +}; diff --git a/src/index.jsx b/src/index.jsx index 3edb0e7..3325337 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -3,12 +3,11 @@ import { RouterProvider } from 'react-router-dom'; import reportWebVitals from './reportWebVitals'; import Store, { StoreProvider } from './store'; -import { fetchAPI } from './api/fetchAPI'; import router from './router'; window.name = '_spacemesh'; -const store = new Store(fetchAPI); +const store = new Store(); store.bootstrap(); ReactDOM.render( diff --git a/src/router/index.js b/src/router/index.js index b7f9291..e86a896 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -6,18 +6,17 @@ import NotFound from '../routes/not-found'; import Txs from '../routes/txns'; import Tx from '../routes/tx'; import Rewards from '../routes/rewards'; -import Reward from '../routes/reward'; import { - Epoch, EpochAtxs, EpochLayers, EpochRewards, Epochs, EpochSmeshers, EpochTxns, + Epoch, EpochLayers, EpochRewards, Epochs, EpochSmeshers, EpochTxns, } from '../routes/epochs'; import { - Layer, LayerAtxs, LayerBlocks, LayerRewards, Layers, LayerSmeshers, LayerTxns, + Layer, LayerRewards, Layers, LayerTxns, } from '../routes/layers'; import { - Account, AccountRewards, Accounts, AccountTxns, + Account, AccountRewards, Accounts, } from '../routes/accounts'; import { - Smesher, SmesherAtxs, SmesherRewards, Smeshers, + Smesher, SmesherRewards, Smeshers, } from '../routes/smeshers'; import Atx from '../routes/atx'; import RewardV2 from '../routes/rewardv2'; @@ -45,22 +44,10 @@ const router = createBrowserRouter([ path: '/layers/:id', element: , }, - { - path: '/layers/:id/atxs', - element: , - }, - { - path: '/layers/:id/blocks', - element: , - }, { path: '/layers/:id/rewards', element: , }, - { - path: '/layers/:id/smeshers', - element: , - }, { path: '/layers/:id/txs', element: , @@ -83,10 +70,6 @@ const router = createBrowserRouter([ path: '/accounts/:id', element: , }, - { - path: '/accounts/:id/txs', - element: , - }, { path: '/accounts/:id/rewards', element: , @@ -112,10 +95,6 @@ const router = createBrowserRouter([ path: '/epochs/:id/smeshers', element: , }, - { - path: '/epochs/:id/atxs', - element: , - }, { path: '/epochs/:id/rewards', element: , @@ -129,10 +108,6 @@ const router = createBrowserRouter([ path: '/smeshers/:id', element: , }, - { - path: '/smeshers/:id/atxs', - element: , - }, { path: '/smeshers/:id/rewards', element: , @@ -142,10 +117,6 @@ const router = createBrowserRouter([ path: '/rewards', element: , }, - { - path: '/rewards/:id', - element: , - }, { path: '/v2/rewards/:smesherId/:layer', element: , diff --git a/src/routes/accounts/account-rewards.jsx b/src/routes/accounts/account-rewards.jsx index d82a548..37034d1 100644 --- a/src/routes/accounts/account-rewards.jsx +++ b/src/routes/accounts/account-rewards.jsx @@ -6,44 +6,58 @@ import { ACCOUNTS, REWARDS } from '../../config/constants'; import TitleBlock from '../../components/TitleBlock'; import { getColorByPageName } from '../../helper/getColorByPageName'; import RightSideBlock from '../../components/CountBlock/RightSideBlock'; -import { useStore } from '../../store'; import Table from '../../components/Table'; -import { fetchAPI } from '../../api/fetchAPI'; -import Loader from '../../components/Loader'; +import { useStore } from '../../store'; const AccountRewards = () => { const store = useStore(); const params = useParams(); - const { network } = store.networkInfo; - - const [data, setData] = useState(); + const [total, setTotal] = useState(0); + const [rewardsSum, setRewardsSum] = useState(null); + const [error, setError] = useState(); + if (error) throw error; useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${ACCOUNTS}/${params.id}/${REWARDS}`).then((result) => { - setData(result); + if (store.netInfo === null) return; + fetch(`${store.statsApiUrl}/account/${params.id}`).then(async (res) => { + if (res.status === 429) { + store.showThrottlePopup(); + throw new Error('Too Many Requests'); + } + if (res.ok) { + const r = await res.json(); + setTotal(r.rewards_count); + setRewardsSum(r.rewards_sum); + } else { + throw new Error(); + } + }).catch((err) => { + if (err.message === 'Too Many Requests') return; + + const err2 = new Error('Account not found'); + err2.id = params.id; + setError(err2); }); - }, [store.network.value]); + }, [store.netInfo, params.id]); return ( - data ? ( - <> -
    - - -
    - - - ) : + <> +
    + + +
    +
    + ); }; diff --git a/src/routes/accounts/account-txns.jsx b/src/routes/accounts/account-txns.jsx deleted file mode 100644 index 94560cb..0000000 --- a/src/routes/accounts/account-txns.jsx +++ /dev/null @@ -1,49 +0,0 @@ -import { observer } from 'mobx-react'; -import { useParams } from 'react-router-dom'; -import { useEffect, useState } from 'react'; -import longFormHash from '../../helper/longFormHash'; -import { ACCOUNTS, TXNS } from '../../config/constants'; -import TitleBlock from '../../components/TitleBlock'; -import { getColorByPageName } from '../../helper/getColorByPageName'; -import RightSideBlock from '../../components/CountBlock/RightSideBlock'; -import { useStore } from '../../store'; -import Table from '../../components/Table'; -import { fetchAPI } from '../../api/fetchAPI'; -import Loader from '../../components/Loader'; - -const AccountTxns = () => { - const store = useStore(); - const params = useParams(); - - const [data, setData] = useState(); - - useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${ACCOUNTS}/${params.id}/${TXNS}`).then((result) => { - setData(result); - }); - }, [store.network.value]); - - return ( - data ? ( - <> -
    - - -
    -
    - - ) : - ); -}; - -export default observer(AccountTxns); diff --git a/src/routes/accounts/account.jsx b/src/routes/accounts/account.jsx index 1b4275f..50b9a0b 100644 --- a/src/routes/accounts/account.jsx +++ b/src/routes/accounts/account.jsx @@ -1,15 +1,15 @@ +// @flow import { observer } from 'mobx-react'; import { useEffect, useState } from 'react'; import { Link, useParams } from 'react-router-dom'; +import { Spacemeshv2alpha1Account } from 'api'; import TitleBlock from '../../components/TitleBlock'; import { getColorByPageName } from '../../helper/getColorByPageName'; - import { - ACCOUNTS, ACCOUNTS_TXNS, REWARDS, TXNS, + ACCOUNTS, REWARDS, TXNS, } from '../../config/constants'; import RightSideBlock from '../../components/CountBlock/RightSideBlock'; import { useStore } from '../../store'; -import { fetchAPI } from '../../api/fetchAPI'; import Loader from '../../components/Loader'; import { formatSmidge, parseSmidge } from '../../helper/converter'; import CopyButton from '../../components/CopyButton'; @@ -20,33 +20,58 @@ const Account = () => { const name = ACCOUNTS; const params = useParams(); - const [data, setData] = useState(); - const [txData, setTxData] = useState(); + const [data, setData] = useState (); + const [totalRewards, setTotalRewards] = useState(null); + const [totalTransactions, setTotalTransactions] = useState(null); + const [rewardsSum, setRewardsSum] = useState(null); const [smidge, setSmidge] = useState({ value: 0, unit: 'SMH' }); - + const [activity, setActivity] = useState(null); const [error, setError] = useState(); if (error) throw error; useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${name}/${params.id}`).then((res) => { - if (res.data) { - setData(res.data[0]); - setSmidge(parseSmidge(res.data[0].balance)); - } else { - const err = new Error('Not found'); - err.id = params.id; - setError(err); + if (store.netInfo === null) return; + store.api.account.accountServiceList({ + addresses: [params.id], + limit: 1, + }).then((res) => { + setData(res.accounts[0]); + setSmidge(parseSmidge(res.accounts[0].current.balance)); + setActivity(store.layerTimestamp(res.accounts[0].current.layer)); + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + return; } + const err2 = new Error('Account not found'); + err2.id = params.id; + setError(err2); }); - }, [store.network.value, params.id]); + }, [store.netInfo, params.id]); useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${ACCOUNTS}/${params.id}/${TXNS}`).then((result) => { - setTxData(result); + if (store.netInfo === null) return; + fetch(`${store.statsApiUrl}/account/${params.id}`).then(async (res) => { + if (res.status === 429) { + store.showThrottlePopup(); + throw new Error('Too Many Requests'); + } + if (res.ok) { + const r = await res.json(); + setRewardsSum(formatSmidge(r.rewards_sum)); + setTotalRewards(r.rewards_count); + setTotalTransactions(r.transactions_count); + } else { + throw new Error(); + } + }).catch((err) => { + if (err.message === 'Too Many Requests') return; + + const err2 = new Error('Account not found'); + err2.id = params.id; + setError(err2); }); - }, [store.network.value, params.id]); + }, [store.netInfo, params.id]); return ( <> @@ -62,7 +87,7 @@ const Account = () => { color={getColorByPageName(name)} number={smidge && smidge.value} unit={`${smidge && smidge.unit} Balance`} - startTime={data && data.lastActivity} + startTime={activity} />
    @@ -76,22 +101,21 @@ const Account = () => {
  • Counter - {data.counter} + {data.current.counter}
  • Rewards - {formatSmidge(data.awards)} + {totalRewards && rewardsSum + ? `${totalRewards} (${rewardsSum})` : }
  • Transactions - - {data.txs} - + {totalTransactions || }
  • @@ -102,7 +126,7 @@ const Account = () => { color={getColorByPageName(name)} desc="account transactions" /> -
    +
    ) : ()} diff --git a/src/routes/accounts/accounts.jsx b/src/routes/accounts/accounts.jsx index 8946f21..8183130 100644 --- a/src/routes/accounts/accounts.jsx +++ b/src/routes/accounts/accounts.jsx @@ -6,44 +6,44 @@ import { ACCOUNTS } from '../../config/constants'; import RightSideBlock from '../../components/CountBlock/RightSideBlock'; import { useStore } from '../../store'; import Table from '../../components/Table'; -import { fetchAPI } from '../../api/fetchAPI'; -import Loader from '../../components/Loader'; const Accounts = () => { const store = useStore(); - const { epoch } = store.networkInfo; - const [recentActivityTimestamp, setRecentActivityTimestamp] = useState(null); - const [data, setData] = useState(); + const [recentActivity, setRecentActivity] = useState(0); useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${ACCOUNTS}`).then((res) => { - const recentActivity = res.data && res.data.length && res.data.length > 0 && res.data[0].lastActivity; - setRecentActivityTimestamp(recentActivity); - setData(res); + if (store.netInfo === null) return; + store.api.account.accountServiceList({ + limit: 1, + }).then((res) => { + if (res.accounts.length === 1) { + setRecentActivity(store.layerTimestamp(res.accounts[0].current.layer)); + } + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + } }); - }, [store.network.value]); + }, [store.netInfo]); return ( - data ? ( - <> -
    - - -
    -
    - - ) : + <> +
    + + +
    +
    + ); }; diff --git a/src/routes/accounts/index.js b/src/routes/accounts/index.js index 688d025..0379812 100644 --- a/src/routes/accounts/index.js +++ b/src/routes/accounts/index.js @@ -1,6 +1,5 @@ import Account from './account'; import Accounts from './accounts'; import AccountRewards from './account-rewards'; -import AccountTxns from './account-txns'; -export { Account, Accounts, AccountRewards, AccountTxns }; +export { Account, Accounts, AccountRewards }; diff --git a/src/routes/atx.jsx b/src/routes/atx.jsx index 45587d7..9c342fb 100644 --- a/src/routes/atx.jsx +++ b/src/routes/atx.jsx @@ -1,16 +1,18 @@ import { observer } from 'mobx-react'; import { useEffect, useState } from 'react'; import { Link, useParams } from 'react-router-dom'; +import type { Spacemeshv2alpha1Activation } from 'api'; import TitleBlock from '../components/TitleBlock'; import { getColorByPageName } from '../helper/getColorByPageName'; import { ACCOUNTS, ATXS, EPOCHS, SMESHER, } from '../config/constants'; import { useStore } from '../store'; -import { fetchAPI } from '../api/fetchAPI'; import longFormHash from '../helper/longFormHash'; import Loader from '../components/Loader'; -import { byteConverter } from '../helper/converter'; +import { + base64ToHex, byteConverter, hexToBase64, +} from '../helper/converter'; import CopyButton from '../components/CopyButton'; import CountAtxBlock from '../components/CountBlock/CountAtxBlock'; @@ -18,89 +20,106 @@ const Atx = () => { const store = useStore(); const params = useParams(); - const [data, setData] = useState(); + const [data: Spacemeshv2alpha1Activation, setData] = useState(); const [cSize, setCSize] = useState({ value: 0, unit: '' }); + const [error, setError] = useState(); + if (error) throw error; useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${ATXS}/${params.id}`).then((res) => { - setData(res.data[0]); - setCSize(byteConverter(res.data[0]?.commitmentSize, true)); + if (store.api.activation === undefined) return; + store.api.activation.activationServiceList({ + id: [hexToBase64(params.id)], + limit: 1, + }).then((res) => { + if (res.activations.length === 0) { + throw new Error(); + } + setData(res.activations[0]); + if (res.activations[0] !== undefined) { + setCSize(byteConverter(res.activations[0].numUnits * store.postUnitSize, true)); + } + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + return; + } + const err2 = new Error('Activation not found'); + err2.id = params.id; + setError(err2); }); - }, [store.network.value, params.id]); + }, [store.netInfo, params.id]); + + if (!data || store.netInfo === null) { + return ; + } return ( <> - {data ? ( - <> -
    - - -
    -
    -
      -
    • - Activation Id - - {data.id} - - -
    • -
    • - Smesher - - - {data.smesher} - - - -
    • -
    • - Rewards Account - - {data.coinbase} - - -
    • -
    • - Target Epoch - - - {data.targetEpoch} - - -
    • -
    • - Commitment size - {byteConverter(data.commitmentSize)} -
    • -
    • - Tick count - {data.tickCount} -
    • -
    • - Previous Activation - - - {data.prevAtx} - - - -
    • -
    -
    - - ) : ()} +
    + + +
    +
    +
      +
    • + Activation Id + + {base64ToHex(data.id)} + + +
    • +
    • + Smesher + + + {base64ToHex(data.smesherId)} + + + +
    • +
    • + Rewards Account + + {data.coinbase} + + +
    • +
    • + Target Epoch + + + {data.publishEpoch + 1} + + +
    • +
    • + Commitment size + + {cSize.value} + {' '} + {cSize.unit} + +
    • +
    • + Weight + {data.weight} +
    • +
    • + Height + {data.height} +
    • +
    +
    ); }; diff --git a/src/routes/epochs/epoch-atxs.jsx b/src/routes/epochs/epoch-atxs.jsx deleted file mode 100644 index f8a6690..0000000 --- a/src/routes/epochs/epoch-atxs.jsx +++ /dev/null @@ -1,48 +0,0 @@ -import { observer } from 'mobx-react'; -import { useParams } from 'react-router-dom'; -import { useEffect, useState } from 'react'; -import { ATXS, EPOCHS } from '../../config/constants'; -import TitleBlock from '../../components/TitleBlock'; -import { getColorByPageName } from '../../helper/getColorByPageName'; -import RightSideBlock from '../../components/CountBlock/RightSideBlock'; -import { useStore } from '../../store'; -import Table from '../../components/Table'; -import { fetchAPI } from '../../api/fetchAPI'; -import Loader from '../../components/Loader'; - -const EpochAtxs = () => { - const store = useStore(); - const params = useParams(); - - const [data, setData] = useState(); - - useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${EPOCHS}/${params.id}/${ATXS}`).then((result) => { - setData(result); - }); - }, [store.network.value]); - - return ( - data ? ( - <> -
    - - -
    -
    - - ) : - ); -}; - -export default observer(EpochAtxs); diff --git a/src/routes/epochs/epoch-layers.jsx b/src/routes/epochs/epoch-layers.jsx index c15a29a..f6c0f14 100644 --- a/src/routes/epochs/epoch-layers.jsx +++ b/src/routes/epochs/epoch-layers.jsx @@ -1,17 +1,30 @@ import { observer } from 'mobx-react'; import { useParams } from 'react-router-dom'; +import { useEffect, useState } from 'react'; import { EPOCHS, LAYERS } from '../../config/constants'; import TitleBlock from '../../components/TitleBlock'; import { getColorByPageName } from '../../helper/getColorByPageName'; import RightSideBlock from '../../components/CountBlock/RightSideBlock'; import { useStore } from '../../store'; import Table from '../../components/Table'; +import Loader from '../../components/Loader'; const EpochLayers = () => { const store = useStore(); - const { epoch } = store.networkInfo; const params = useParams(); + const [start, setStart] = useState(0); + + useEffect(() => { + if (store.netInfo === null || store.netInfo.layersPerEpoch === null) return; + const epochStart = params.id * store.netInfo.layersPerEpoch; + setStart(store.layerTimestamp(epochStart)); + }, [store.netInfo]); + + if (!store.netInfo) { + return ; + } + return ( <>
    @@ -21,8 +34,8 @@ const EpochLayers = () => { desc={`Layers contained within Epoch ${params.id}`} /> diff --git a/src/routes/epochs/epoch-rewards.jsx b/src/routes/epochs/epoch-rewards.jsx index 802d3cc..07a158e 100644 --- a/src/routes/epochs/epoch-rewards.jsx +++ b/src/routes/epochs/epoch-rewards.jsx @@ -6,43 +6,48 @@ import TitleBlock from '../../components/TitleBlock'; import { getColorByPageName } from '../../helper/getColorByPageName'; import { useStore } from '../../store'; import Table from '../../components/Table'; -import { fetchAPI } from '../../api/fetchAPI'; import { AmountBlock } from '../../components/CountBlock'; -import Loader from '../../components/Loader'; const EpochRewards = () => { const store = useStore(); const params = useParams(); - const { network } = store.networkInfo; - const [data, setData] = useState(); + const [stats, setStats] = useState({}); + const [start, setStart] = useState(0); useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${EPOCHS}/${params.id}/${REWARDS}`).then((result) => { - setData(result); + if (store.netInfo === null) return; + fetch(`${store.statsApiUrl}/epoch/${params.id}`).then((res) => { + if (res.status === 429) { + store.showThrottlePopup(); + throw new Error('Too Many Requests'); + } + return res.json(); + }).then((res) => { + setStats(res); }); - }, [store.network.value]); + + const epochStart = params.id * store.netInfo.layersPerEpoch; + setStart(store.layerTimestamp(epochStart)); + }, [store.netInfo]); return ( - data ? ( - <> -
    - - -
    -
    - - ) : + <> +
    + + +
    +
    + ); }; diff --git a/src/routes/epochs/epoch-smeshers.jsx b/src/routes/epochs/epoch-smeshers.jsx index 2db0604..72fbd8d 100644 --- a/src/routes/epochs/epoch-smeshers.jsx +++ b/src/routes/epochs/epoch-smeshers.jsx @@ -7,42 +7,46 @@ import { getColorByPageName } from '../../helper/getColorByPageName'; import RightSideBlock from '../../components/CountBlock/RightSideBlock'; import { useStore } from '../../store'; import Table from '../../components/Table'; -import { fetchAPI } from '../../api/fetchAPI'; -import Loader from '../../components/Loader'; const EpochSmeshers = () => { const store = useStore(); - const { epoch, network } = store.networkInfo; const params = useParams(); - const [data, setData] = useState(); + const [stats, setStats] = useState({}); + const [start, setStart] = useState(0); useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${EPOCHS}/${params.id}/${SMESHER}`).then((result) => { - setData(result); + if (store.netInfo === null) return; + fetch(`${store.statsApiUrl}/epoch/${params.id}`).then((res) => { + if (res.status === 429) { + store.showThrottlePopup(); + throw new Error('Too Many Requests'); + } + return res.json(); + }).then((res) => { + setStats(res); + const epochStart = params.id * store.netInfo.layersPerEpoch; + setStart(epochStart); }); - }, [store.network.value]); + }, [store.netInfo]); return ( - data ? ( - <> -
    - - -
    -
    - - ) : + <> +
    + + +
    +
    + ); }; diff --git a/src/routes/epochs/epoch-txns.jsx b/src/routes/epochs/epoch-txns.jsx index 3aea21b..08264a4 100644 --- a/src/routes/epochs/epoch-txns.jsx +++ b/src/routes/epochs/epoch-txns.jsx @@ -7,42 +7,47 @@ import { getColorByPageName } from '../../helper/getColorByPageName'; import RightSideBlock from '../../components/CountBlock/RightSideBlock'; import { useStore } from '../../store'; import Table from '../../components/Table'; -import { fetchAPI } from '../../api/fetchAPI'; -import Loader from '../../components/Loader'; const EpochTxns = () => { const store = useStore(); - const { epoch, network } = store.networkInfo; const params = useParams(); - const [data, setData] = useState(); + const [stats, setStats] = useState({}); + const [start, setStart] = useState(0); useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${EPOCHS}/${params.id}/${TXNS}`).then((result) => { - setData(result); + if (store.netInfo === null) return; + fetch(`${store.statsApiUrl}/epoch/${params.id}`).then((res) => { + if (res.status === 429) { + store.showThrottlePopup(); + throw new Error('Too Many Requests'); + } + return res.json(); + }).then((res) => { + setStats(res); }); - }, [store.network.value]); + + const epochStart = params.id * store.netInfo.layersPerEpoch; + setStart(store.layerTimestamp(epochStart)); + }, [store.netInfo]); return ( - data ? ( - <> -
    - - -
    -
    - - ) : + <> +
    + + +
    +
    + ); }; diff --git a/src/routes/epochs/epoch.jsx b/src/routes/epochs/epoch.jsx index 6c0b0c5..ba1d561 100644 --- a/src/routes/epochs/epoch.jsx +++ b/src/routes/epochs/epoch.jsx @@ -8,96 +8,106 @@ import { } from '../../config/constants'; import RightSideBlock from '../../components/CountBlock/RightSideBlock'; import { useStore } from '../../store'; -import { fetchAPI } from '../../api/fetchAPI'; -import Loader from '../../components/Loader'; import { formatSmidge } from '../../helper/converter'; import CustomTimeAgo from '../../components/CustomTimeAgo'; import { fullDate } from '../../helper/formatter'; -import getValueFromStatsObject from '../../helper/getValueFromStatsObject'; +import Loader from '../../components/Loader'; const Epoch = () => { const store = useStore(); const name = EPOCHS; const params = useParams(); - const [data, setData] = useState(); - const [stats, setStats] = useState({}); + const [start, setStart] = useState(0); + const [end, setEnd] = useState(0); + const [stats, setStats] = useState(null); useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${name}/${params.id}`).then((res) => { - setData(res.data[0]); - setStats(getValueFromStatsObject(res.data[0].stats)); + if (store.netInfo === null || store.netInfo.layersPerEpoch === null) return; + fetch(`${store.statsApiUrl}/epoch/${params.id}`).then((res) => { + if (res.status === 429) { + store.showThrottlePopup(); + throw new Error('Too Many Requests'); + } + return res.json(); + }).then((res) => { + setStats(res); }); - }, [store.network.value]); + + const epochStart = params.id * store.netInfo.layersPerEpoch; + setStart(epochStart); + setEnd(epochStart + store.netInfo.layersPerEpoch - 1); + }, [store.netInfo]); return ( <> - {data ? ( - <> -
    - - -
    -
    -
      -
    • - Number - {data.number} -
    • -
    • - Started - - - {`${fullDate(data.start)}`} - -
    • -
    • - { Math.floor(Date.now() / 1000) > data.end ? 'Ended' : 'Ends'} - - - {`${fullDate(data.end)}`} - -
    • -
    • - Layers - - {data.layers} - -
    • -
    • - Rewards - - - {`${stats.rewardsnumber} (${formatSmidge(stats.rewards)})`} - - -
    • -
    • - Smeshers - - {stats.smeshers} - -
    • -
    • - Transactions - - {stats.transactions} - -
    • -
    -
    - - ) : ()} + <> +
    + + +
    +
    +
      +
    • + Number + {params.id} +
    • +
    • + Started + + + {`${fullDate(store.layerTimestamp(start))}`} + +
    • +
    • + + {Math.floor(Date.now() / 1000) > store.layerEndTimestamp(end) ? 'Ended' : 'Ends'} + + + + {`${fullDate(store.layerEndTimestamp(end))}`} + +
    • +
    • + Layers + + {store.netInfo?.layersPerEpoch || 0} + +
    • +
    • + Rewards + + + {stats ? `${stats.rewards_count || 0} (${formatSmidge(stats.rewards_sum || 0)})` : } + + +
    • +
    • + Smeshers + + {stats ? stats.smeshers_count || 0 : } + +
    • +
    • + Transactions + + {stats ? stats.transactions_count || 0 : } + +
    • +
    +
    + ); }; diff --git a/src/routes/epochs/epochs.jsx b/src/routes/epochs/epochs.jsx index 7dfc298..73b3621 100644 --- a/src/routes/epochs/epochs.jsx +++ b/src/routes/epochs/epochs.jsx @@ -1,14 +1,48 @@ import { observer } from 'mobx-react'; +import { useEffect, useState } from 'react'; import TitleBlock from '../../components/TitleBlock'; import { getColorByPageName } from '../../helper/getColorByPageName'; import { EPOCHS } from '../../config/constants'; import RightSideBlock from '../../components/CountBlock/RightSideBlock'; import { useStore } from '../../store'; import Table from '../../components/Table'; +import Loader from '../../components/Loader'; const Epochs = () => { const store = useStore(); - const { network, epoch } = store.networkInfo; + + const [isFetching, setIsFetching] = useState(true); + const [genesisTime, setGenesisTime] = useState(0); + const [epochs, setEpochs] = useState([]); + + useEffect(() => { + if (store.netInfo === null) return; + setGenesisTime(new Date(store.netInfo.genesisTime || 0).getTime() / 1000); + + store.api.layer.layerServiceList({ + limit: 1, + sort_order: 1, + }).then((res) => { + const epochNums = Math.floor(res.layers[0].number / store.netInfo.layersPerEpoch); + for (let i = epochNums + 1; i >= 0; i--) { + setEpochs((prev) => [...prev, { + number: i, + layers: store.netInfo.layersPerEpoch, + startLayer: i * store.netInfo.layersPerEpoch, + endLayer: i * store.netInfo.layersPerEpoch + store.netInfo.layersPerEpoch - 1, + }]); + } + setIsFetching(false); + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + } + }); + }, [store.netInfo]); + + if (isFetching) { + return ; + } return ( <> @@ -20,13 +54,13 @@ const Epochs = () => { /> -
    +
    ); }; diff --git a/src/routes/epochs/index.js b/src/routes/epochs/index.js index ac348a1..7ef401b 100644 --- a/src/routes/epochs/index.js +++ b/src/routes/epochs/index.js @@ -1,9 +1,8 @@ import Epochs from './epochs'; import Epoch from './epoch'; -import EpochAtxs from './epoch-atxs'; import EpochLayers from './epoch-layers'; import EpochRewards from './epoch-rewards'; import EpochSmeshers from './epoch-smeshers'; import EpochTxns from './epoch-txns'; -export { Epochs, Epoch, EpochAtxs, EpochLayers, EpochRewards, EpochSmeshers, EpochTxns }; +export { Epochs, Epoch, EpochLayers, EpochRewards, EpochSmeshers, EpochTxns }; diff --git a/src/routes/layers/index.js b/src/routes/layers/index.js index 2fde2b8..bcf0366 100644 --- a/src/routes/layers/index.js +++ b/src/routes/layers/index.js @@ -1,9 +1,6 @@ import Layer from './layer'; import Layers from './layers'; -import LayerAtxs from './layer-atxs'; -import LayerBlocks from './layer-blocks'; import LayerRewards from './layer-rewards'; -import LayerSmeshers from './layer-smeshers'; import LayerTxns from './layer-txns'; -export { Layer, Layers, LayerAtxs, LayerBlocks, LayerRewards, LayerSmeshers, LayerTxns }; +export { Layer, Layers, LayerRewards, LayerTxns }; diff --git a/src/routes/layers/layer-atxs.jsx b/src/routes/layers/layer-atxs.jsx deleted file mode 100644 index 4d7d48d..0000000 --- a/src/routes/layers/layer-atxs.jsx +++ /dev/null @@ -1,47 +0,0 @@ -import { observer } from 'mobx-react'; -import { useParams } from 'react-router-dom'; -import { useEffect, useState } from 'react'; -import { ATXS, LAYERS } from '../../config/constants'; -import TitleBlock from '../../components/TitleBlock'; -import { getColorByPageName } from '../../helper/getColorByPageName'; -import RightSideBlock from '../../components/CountBlock/RightSideBlock'; -import { useStore } from '../../store'; -import Table from '../../components/Table'; -import { fetchAPI } from '../../api/fetchAPI'; -import Loader from '../../components/Loader'; - -const LayerAtxs = () => { - const store = useStore(); - const params = useParams(); - const [data, setData] = useState(); - - useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${LAYERS}/${params.id}/${ATXS}`).then((result) => { - setData(result); - }); - }, [store.network.value]); - - return ( - data ? ( - <> -
    - - -
    -
    - - ) : - ); -}; - -export default observer(LayerAtxs); diff --git a/src/routes/layers/layer-blocks.jsx b/src/routes/layers/layer-blocks.jsx deleted file mode 100644 index e95942b..0000000 --- a/src/routes/layers/layer-blocks.jsx +++ /dev/null @@ -1,48 +0,0 @@ -import { observer } from 'mobx-react'; -import { useParams } from 'react-router-dom'; -import { useEffect, useState } from 'react'; -import { BLOCKS, LAYERS } from '../../config/constants'; -import TitleBlock from '../../components/TitleBlock'; -import { getColorByPageName } from '../../helper/getColorByPageName'; -import RightSideBlock from '../../components/CountBlock/RightSideBlock'; -import { useStore } from '../../store'; -import Table from '../../components/Table'; -import { fetchAPI } from '../../api/fetchAPI'; -import Loader from '../../components/Loader'; - -const LayerBlocks = () => { - const store = useStore(); - const { layer } = store.networkInfo; - const params = useParams(); - - const [data, setData] = useState(); - - useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${LAYERS}/${params.id}/${BLOCKS}`).then((result) => { - setData(result); - }); - }, [store.network.value]); - - return ( - data ? ( - <> -
    - - -
    -
    - - ) : - ); -}; - -export default observer(LayerBlocks); diff --git a/src/routes/layers/layer-rewards.jsx b/src/routes/layers/layer-rewards.jsx index ad3eb66..9e24ca6 100644 --- a/src/routes/layers/layer-rewards.jsx +++ b/src/routes/layers/layer-rewards.jsx @@ -10,7 +10,6 @@ import { AmountBlock } from '../../components/CountBlock'; const LayerRewards = () => { const store = useStore(); const params = useParams(); - const { layer } = store.networkInfo; return ( <> @@ -21,8 +20,8 @@ const LayerRewards = () => { desc={`Rewards within Layer ${params.id}`} /> diff --git a/src/routes/layers/layer-smeshers.jsx b/src/routes/layers/layer-smeshers.jsx deleted file mode 100644 index 5b18ac4..0000000 --- a/src/routes/layers/layer-smeshers.jsx +++ /dev/null @@ -1,35 +0,0 @@ -import { observer } from 'mobx-react'; -import { useParams } from 'react-router-dom'; -import { LAYERS, SMESHER } from '../../config/constants'; -import TitleBlock from '../../components/TitleBlock'; -import { getColorByPageName } from '../../helper/getColorByPageName'; -import RightSideBlock from '../../components/CountBlock/RightSideBlock'; -import { useStore } from '../../store'; -import Table from '../../components/Table'; - -const LayerSmeshers = () => { - const store = useStore(); - const { layer } = store.networkInfo; - const params = useParams(); - - return ( - <> -
    - - -
    -
    - - ); -}; - -export default observer(LayerSmeshers); diff --git a/src/routes/layers/layer-txns.jsx b/src/routes/layers/layer-txns.jsx index bf3e6d2..90cb8e0 100644 --- a/src/routes/layers/layer-txns.jsx +++ b/src/routes/layers/layer-txns.jsx @@ -6,7 +6,6 @@ import TitleBlock from '../../components/TitleBlock'; import { getColorByPageName } from '../../helper/getColorByPageName'; import { useStore } from '../../store'; import Table from '../../components/Table'; -import { fetchAPI } from '../../api/fetchAPI'; import RightCountBlock from '../../components/CountBlock/RightCountBlock'; import { formatSmidge } from '../../helper/converter'; import Loader from '../../components/Loader'; @@ -15,51 +14,53 @@ const LayerTxns = () => { const store = useStore(); const params = useParams(); - const [data, setData] = useState(); - const [info, setInfo] = useState({ - txs: 0, - txsamount: 0, - }); + const [stats, setStats] = useState({}); + const [error, setError] = useState(); + if (error) throw error; useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${LAYERS}/${params.id}/${TXNS}`).then((result) => { - setData(result); - }); - }, [store.network.value]); - - useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${LAYERS}/${params.id}`).then((result) => { - if (result.data && result.data[0]) { - setInfo({ - txs: result.data[0].txs, - txsamount: result.data[0].txsamount, - }); + if (store.statsApiUrl === null) return; + fetch(`${store.statsApiUrl}/layer/${params.id}`).then(async (res) => { + if (res.status === 429) { + store.showThrottlePopup(); + throw new Error('Too Many Requests'); } + if (res.ok) { + const r = await res.json(); + setStats(r); + } else { + throw new Error(); + } + }).catch((err) => { + if (err.message === 'Too Many Requests') return; + const err2 = new Error('Layer not found'); + err2.id = params.id; + setError(err2); }); - }, [store.network.value]); + }, [store.statsApiUrl, params.id]); + + if (!stats) { + return ; + } return ( - data ? ( - <> -
    - - -
    -
    - - ) : + <> +
    + + +
    +
    + ); }; diff --git a/src/routes/layers/layer.jsx b/src/routes/layers/layer.jsx index 4b2a17f..defac7b 100644 --- a/src/routes/layers/layer.jsx +++ b/src/routes/layers/layer.jsx @@ -1,34 +1,64 @@ +// @flow import { observer } from 'mobx-react'; import { useEffect, useState } from 'react'; import { Link, useParams } from 'react-router-dom'; +import { Spacemeshv2alpha1Layer } from 'api'; import TitleBlock from '../../components/TitleBlock'; import { getColorByPageName } from '../../helper/getColorByPageName'; import { - BLOCKS, EPOCHS, LAYERS, REWARDS, TXNS, + EPOCHS, LAYERS, REWARDS, TXNS, } from '../../config/constants'; import RightSideBlock from '../../components/CountBlock/RightSideBlock'; import { useStore } from '../../store'; -import { fetchAPI } from '../../api/fetchAPI'; import Loader from '../../components/Loader'; -import { formatSmidge, parseSmidge } from '../../helper/converter'; +import { + base64ToHex, calculateEpoch, formatSmidge, parseSmidge, +} from '../../helper/converter'; import CopyButton from '../../components/CopyButton'; import CustomTimeAgo from '../../components/CustomTimeAgo'; import { fullDate } from '../../helper/formatter'; const Layer = () => { const store = useStore(); + const { api, netInfo, layerTimestamp, layerEndTimestamp } = useStore(); const params = useParams(); - const [data, setData] = useState({}); + const [data, setData] = useState(); + const [epoch, setEpoch] = useState(0); const [rewards, setRewards] = useState({}); + const [stats, setStats] = useState({}); + const [error, setError] = useState(); + if (error) throw error; + + useEffect(() => { + if (store.netInfo === null || store.statsApiUrl === null) return; + api.layer.layerServiceList({ + startLayer: params.id, + endLayer: params.id, + limit: 1, + }).then((res) => { + setData(res.layers[0]); + setEpoch(calculateEpoch(res.layers[0].number, netInfo.layersPerEpoch)); + }).catch(() => { + const err = new Error('Layer not found'); + err.id = params.id; + setError(err); + }); + }, [params.id, netInfo]); useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${LAYERS}/${params.id}`).then((res) => { - setData(res.data[0]); - setRewards(parseSmidge(res.data[0].rewards)); + if (store.netInfo === null || store.statsApiUrl === null) return; + fetch(`${store.statsApiUrl}/layer/${params.id}`).then((res) => { + if (res.status === 429) { + store.showThrottlePopup(); + throw new Error('Too Many Requests'); + } + return res.json(); + }).then((res) => { + setStats(res); + setRewards(parseSmidge(res.rewards_sum)); }); - }, [store.network.value, params.id]); + }, [store.netInfo, store.statsApiUrl, params.id]); return ( <> @@ -45,7 +75,7 @@ const Layer = () => { number={rewards.value} unit={rewards.unit} coinCaption="Rewards" - coins={data && data.rewards} + coins={stats.rewards_sum} />
    @@ -57,35 +87,35 @@ const Layer = () => {
  • Start Timestamp - - {` ${fullDate(data.start)}`} + + {` ${fullDate(layerTimestamp(data.number))}`}
  • End Timestamp - - {` ${fullDate(data.end)}`} + + {` ${fullDate(layerEndTimestamp(data.number))}`}
  • Transactions - {data.txs} + {stats.transactions_count || 0}
  • - Rewards + Rewards - {formatSmidge(data.rewards)} + {formatSmidge(stats.rewards_sum)}
  • Epoch - {data.epoch} + {epoch}
  • {/*
  • */} @@ -97,14 +127,14 @@ const Layer = () => {
  • Hash - {data.hash} - + {base64ToHex(data.cumulativeStateHash)} +
  • - Blocks + Block - {data.blocksnumber} + {data.block ? base64ToHex(data.block?.id) : '---'}
  • diff --git a/src/routes/layers/layers.jsx b/src/routes/layers/layers.jsx index 77d18d1..c6bd2ab 100644 --- a/src/routes/layers/layers.jsx +++ b/src/routes/layers/layers.jsx @@ -1,14 +1,34 @@ import { observer } from 'mobx-react'; +import { useEffect, useState } from 'react'; import TitleBlock from '../../components/TitleBlock'; import { getColorByPageName } from '../../helper/getColorByPageName'; import { LAYERS } from '../../config/constants'; import RightSideBlock from '../../components/CountBlock/RightSideBlock'; import { useStore } from '../../store'; import Table from '../../components/Table'; +import Loader from '../../components/Loader'; const Layers = ({ customPageWrap }) => { const store = useStore(); - const { layer } = store.networkInfo; + const [layer, setLayer] = useState(0); + + useEffect(() => { + if (store.api.layer === undefined) return; + store.api.layer.layerServiceList({ + limit: 1, + sort_order: 1, + }).then((data) => { + setLayer(data.layers[0].number); + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + } + }); + }, [store.api.layer]); + + if (layer === 0) { + return ; + } return ( <> @@ -22,9 +42,9 @@ const Layers = ({ customPageWrap }) => { />
    ) diff --git a/src/routes/overview.jsx b/src/routes/overview.jsx index 181b43c..69da021 100644 --- a/src/routes/overview.jsx +++ b/src/routes/overview.jsx @@ -1,25 +1,65 @@ import { observer } from 'mobx-react'; +import { useEffect, useState } from 'react'; import InfoBlock from '../components/InfoBlock'; import TitleBlock from '../components/TitleBlock'; import { getColorByPageName } from '../helper/getColorByPageName'; import { OVERVIEW, TXNS } from '../config/constants'; -import RightSideBlock from '../components/CountBlock/RightSideBlock'; -import { useStore } from '../store'; import Table from '../components/Table'; +import { useStore } from '../store'; +import { calculateEpoch } from '../helper/converter'; +import RightCountBlock from '../components/CountBlock/RightCountBlock'; +// TODO: cumulative stats const Overview = () => { const store = useStore(); - const { epoch, layer } = store.networkInfo; + + const [layer, setLayer] = useState(0); + const [currentEpoch, setCurrentEpoch] = useState(0); + const [epochInfo, setEpochInfo] = useState({ + transactions_count: 0, + activations_count: 0, + rewards_count: 0, + rewards_sum: 0, + num_units: 0, + smeshers_count: 0, + }); + + useEffect(() => { + if (store.netInfo === null) return; + const fetchInfo = async () => { + const layers = await store.api.layer.layerServiceList({ + limit: 1, + sort_order: 1, + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + } + }); + setLayer(layers.layers[0].number); + const epoch = calculateEpoch(layers.layers[0].number, store.netInfo.layersPerEpoch); + setCurrentEpoch(epoch); + + const res = await fetch(`${store.statsApiUrl}/epoch/${epoch}`); + if (res.status === 429) { + store.showThrottlePopup(); + return; + } + const data = await res.json(); + setEpochInfo(data); + }; + + fetchInfo(); + }, [store.netInfo]); return ( <>
    { color={getColorByPageName(TXNS)} desc="Recent transactions" /> -
    diff --git a/src/routes/reward.jsx b/src/routes/reward.jsx deleted file mode 100644 index df52b68..0000000 --- a/src/routes/reward.jsx +++ /dev/null @@ -1,111 +0,0 @@ -import { observer } from 'mobx-react'; -import { useEffect, useState } from 'react'; -import { Link, useParams } from 'react-router-dom'; -import TitleBlock from '../components/TitleBlock'; -import { getColorByPageName } from '../helper/getColorByPageName'; -import { - ACCOUNTS, LAYERS, REWARDS, SMESHER, -} from '../config/constants'; -import RightSideBlock from '../components/CountBlock/RightSideBlock'; -import { useStore } from '../store'; -import { fetchAPI } from '../api/fetchAPI'; -import longFormHash from '../helper/longFormHash'; -import Loader from '../components/Loader'; -import { - byteConverter, formatSmidge, parseSmidge, -} from '../helper/converter'; -import CopyButton from '../components/CopyButton'; -import CustomTimeAgo from '../components/CustomTimeAgo'; -import { fullDate } from '../helper/formatter'; - -const Reward = () => { - const store = useStore(); - const { network } = store.networkInfo; - const name = REWARDS; - const params = useParams(); - - const [data, setData] = useState(); - const [smidge, setSmidge] = useState({ value: 0, unit: 'SMH' }); - - useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${name}/${params.id}`).then((res) => { - setData(res.data[0]); - setSmidge(parseSmidge(res.data[0].total)); - }); - }, [store.network.value]); - - return ( - <> - {data ? ( - <> -
    - - -
    -
    -
      -
    • - Id - - {data._id} - - -
    • -
    • - Timestamp - - - {fullDate(data.timestamp)} - -
    • -
    • - Layer - - - {data.layer} - - -
    • -
    • - Smesher Id - - - {data.smesher} - - - -
    • -
    • - Account - - {data.coinbase} - - -
    • -
    • - Block Reward - {formatSmidge(data.total)} -
    • -
    • - Space - {byteConverter(data.space)} -
    • -
    -
    - - ) : ()} - - ); -}; - -export default observer(Reward); diff --git a/src/routes/rewards.jsx b/src/routes/rewards.jsx index 53fd161..e9b31c6 100644 --- a/src/routes/rewards.jsx +++ b/src/routes/rewards.jsx @@ -1,24 +1,26 @@ import { observer } from 'mobx-react'; -import { useEffect, useState } from 'react'; import TitleBlock from '../components/TitleBlock'; import { getColorByPageName } from '../helper/getColorByPageName'; import { REWARDS } from '../config/constants'; import RightSideBlock from '../components/CountBlock/RightSideBlock'; import { useStore } from '../store'; import Table from '../components/Table'; -import { fetchAPI } from '../api/fetchAPI'; const Rewards = () => { const store = useStore(); - const { epoch } = store.networkInfo; - const [data, setData] = useState(); - useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}rewards/total`).then((res) => { - setData(res.data); - }); - }, [store.network.value]); + // prepare func which will take an integer and convert it to a string like 29 million + const formatNumber = (num) => { + const numString = num.toString(); + const numLength = numString.length; + if (numLength <= 6) { + return numString; + } + if (numLength <= 9) { + return `${numString.slice(0, numLength - 6)}mil`; + } + return `${numString.slice(0, numLength - 9)}bil`; + }; return ( <> @@ -30,10 +32,10 @@ const Rewards = () => { /> diff --git a/src/routes/rewardv2.jsx b/src/routes/rewardv2.jsx index 7492c7d..de74eef 100644 --- a/src/routes/rewardv2.jsx +++ b/src/routes/rewardv2.jsx @@ -8,19 +8,17 @@ import { } from '../config/constants'; import RightSideBlock from '../components/CountBlock/RightSideBlock'; import { useStore } from '../store'; -import { fetchAPI } from '../api/fetchAPI'; -import longFormHash from '../helper/longFormHash'; import Loader from '../components/Loader'; import { - byteConverter, formatSmidge, parseSmidge, + formatSmidge, hexToBase64, parseSmidge, } from '../helper/converter'; import CopyButton from '../components/CopyButton'; import CustomTimeAgo from '../components/CustomTimeAgo'; import { fullDate } from '../helper/formatter'; +import shortFormHash from '../helper/shortFormHash'; const RewardV2 = () => { const store = useStore(); - const { network } = store.networkInfo; const name = REWARDS; const params = useParams(); @@ -31,98 +29,100 @@ const RewardV2 = () => { if (error) throw error; useEffect(() => { - if (store.network.value === null) return; + if (store.api.reward === undefined) return; if (!params.smesherId.startsWith('0x')) { const err = new Error('Smesher ID should start with \'0x\''); err.id = params.smesherId; setError(err); } - fetchAPI(`${store.network.value}v2/${name}/${params.smesherId}/${params.layer}`).then((res) => { - if (res.data) { - setData(res.data[0]); - setSmidge(parseSmidge(res.data[0].total)); - } else { - const err = new Error('Not found'); - err.id = params.smesherId; - setError(err); - } - }).catch(() => { - const err = new Error('Not found'); - err.id = params.smesherId; + const layerNum = parseInt(params.layer, 10); + if (Number.isNaN(layerNum) || layerNum < 0) { + const err = new Error('Invalid layer number'); + err.id = params.layer; setError(err); + return; + } + + store.api.reward.rewardServiceList({ + smesher: hexToBase64(params.smesherId), + startLayer: params.layer, + endLayer: params.layer, + limit: 1, + }).then((res) => { + setData(res.rewards[0]); + setSmidge(parseSmidge(res.rewards[0].layerReward)); + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + return; + } + const err2 = new Error('Not found'); + err2.id = params.smesherId; + setError(err2); }); - }, [store.network.value, params.smesherId, params.layer]); + }, [store.netInfo, params.smesherId, params.layer]); + + if (!data) { + return ; + } return ( <> - {data ? ( - <> -
    - - -
    -
    -
      -
    • - Id - - {data._id} - - -
    • -
    • - Timestamp - - - {fullDate(data.timestamp)} - -
    • -
    • - Layer - - - {data.layer} - - -
    • -
    • - Smesher Id - - - {data.smesher} - - - -
    • -
    • - Account - - {data.coinbase} - - -
    • -
    • - Block Reward - {formatSmidge(data.total)} -
    • -
    • - Space - {byteConverter(data.space)} -
    • -
    -
    - - ) : ()} + <> +
    + + +
    +
    +
      +
    • + Timestamp + + + {fullDate(store.layerTimestamp(data.layer))} + +
    • +
    • + Layer + + + {data.layer} + + +
    • +
    • + Smesher Id + + + {params.smesherId} + + + +
    • +
    • + Account + + {data.coinbase} + + +
    • +
    • + Layer Reward + {formatSmidge(data.total)} +
    • +
    +
    + ); }; diff --git a/src/routes/root.jsx b/src/routes/root.jsx index ba44433..4a590b2 100644 --- a/src/routes/root.jsx +++ b/src/routes/root.jsx @@ -11,6 +11,7 @@ import { LAYERS, OVERVIEW, TXNS, } from '../config/constants'; import TimeBlock from '../components/TimeBlock'; +import ThrottleWarningPopup from '../components/ThrottleWarningPopup'; const Root = ({ errorElement }) => { const { pathname } = useLocation(); @@ -23,6 +24,7 @@ const Root = ({ errorElement }) => {
    +
    - - ) : - ); -}; - -export default observer(SmesherAtxs); diff --git a/src/routes/smeshers/smesher-rewards.jsx b/src/routes/smeshers/smesher-rewards.jsx index 01e4ed2..47c02ab 100644 --- a/src/routes/smeshers/smesher-rewards.jsx +++ b/src/routes/smeshers/smesher-rewards.jsx @@ -8,40 +8,59 @@ import { getColorByPageName } from '../../helper/getColorByPageName'; import RightSideBlock from '../../components/CountBlock/RightSideBlock'; import { useStore } from '../../store'; import Table from '../../components/Table'; -import { fetchAPI } from '../../api/fetchAPI'; import Loader from '../../components/Loader'; const SmesherRewards = () => { const store = useStore(); const params = useParams(); + const [data, setData] = useState(); + const [error, setError] = useState(); + if (error) throw error; useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${SMESHER}/${params.id}/${REWARDS}`).then((result) => { - setData(result); + if (store.statsApiUrl === null) return; + fetch(`${store.statsApiUrl}/smesher/${params.id}`).then(async (res) => { + if (res.status === 429) { + store.showThrottlePopup(); + throw new Error('Too Many Requests'); + } + if (res.ok) { + const r = await res.json(); + setData(r); + } else { + throw new Error(); + } + }).catch((err) => { + if (err.message === 'Too Many Requests') return; + const err2 = new Error('Smesher not found'); + err2.id = params.id; + setError(err2); }); - }, [store.network.value]); + }, [store.statsApiUrl, params.id]); + + if (!data) { + return ; + } return ( - data ? ( - <> -
    - - 0 ? data.data[0].timestamp : 0} - /> -
    -
    - - ) : + <> +
    + + +
    +
    + ); }; diff --git a/src/routes/smeshers/smesher.jsx b/src/routes/smeshers/smesher.jsx index 12dafba..da59e81 100644 --- a/src/routes/smeshers/smesher.jsx +++ b/src/routes/smeshers/smesher.jsx @@ -2,6 +2,7 @@ import { observer } from 'mobx-react'; import { useEffect, useState } from 'react'; import { Link, useParams } from 'react-router-dom'; import { nanoid } from 'nanoid'; +import { Spacemeshv2alpha1MalfeasanceProof } from 'api'; import TitleBlock from '../../components/TitleBlock'; import { getColorByPageName } from '../../helper/getColorByPageName'; import { @@ -9,46 +10,69 @@ import { } from '../../config/constants'; import RightSideBlock from '../../components/CountBlock/RightSideBlock'; import { useStore } from '../../store'; -import { fetchAPI } from '../../api/fetchAPI'; import longFormHash from '../../helper/longFormHash'; import Loader from '../../components/Loader'; -import { byteConverter, formatSmidge } from '../../helper/converter'; +import { + byteConverter, formatSmidge, hexToBase64, +} from '../../helper/converter'; import CopyButton from '../../components/CopyButton'; import MalfeasanceBlock from '../../components/MalfeasanceBlock'; +import Table from '../../components/Table'; const Smesher = () => { const store = useStore(); const params = useParams(); - const { network } = store.networkInfo; const [data, setData] = useState(); - const [error, setError] = useState(); + const [proofs: Array, setProofs] = useState([]); + if (error) throw error; useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${SMESHER}/${params.id}`).then((res) => { - if (res.data) { - setData(res.data[0]); + if (store.statsApiUrl === null) return; + fetch(`${store.statsApiUrl}/smesher/${params.id}`).then(async (res) => { + if (res.status === 429) { + store.showThrottlePopup(); + throw new Error('Too Many Requests'); + } + if (res.ok) { + const r = await res.json(); + setData(r); } else { - const err = new Error('Not found'); - err.id = params.id; - setError(err); + throw new Error(); + } + }).catch((err) => { + if (err.message === 'Too Many Requests') return; + const err2 = new Error('Smesher not found'); + err2.id = params.id; + setError(err2); + }); + }, [store.statsApiUrl, params.id]); + + useEffect(() => { + if (store.netInfo === null || store.api.malfeasance === null) return; + store.api.malfeasance.malfeasanceServiceList({ + smesherId: [hexToBase64(params.id)], + limit: 100, + }).then((res) => { + console.log(res); + setProofs(res.proofs); + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); } }); - }, [store.network.value, params.id]); + }, [store.netInfo, store.api.malfeasance, params.id]); return ( <> {data ? ( <> - {data.proofs && data.proofs.length > 0 && data?.proofs.map((item) => ( + {proofs.length > 0 && proofs.map((item) => ( ))}
    @@ -59,18 +83,18 @@ const Smesher = () => { />
    -
    +
    • Id - {data.id} - + {params.id} +
    • @@ -85,23 +109,37 @@ const Smesher = () => {
    • Space - {byteConverter(data.cSize)} + {byteConverter(data.num_units * store.postUnitSize)}
    • Reward - {formatSmidge(data.rewards)} + + {data.rewards_count} + {' '} + ( + {formatSmidge(data.rewards_sum)} + ) +
    • Activations - {data.atxcount} + {data.atxs}
    +
    + +
    + ) : ()} diff --git a/src/routes/smeshers/smeshers.jsx b/src/routes/smeshers/smeshers.jsx index 117cbf7..913ad9f 100644 --- a/src/routes/smeshers/smeshers.jsx +++ b/src/routes/smeshers/smeshers.jsx @@ -6,43 +6,34 @@ import { SMESHER } from '../../config/constants'; import RightSideBlock from '../../components/CountBlock/RightSideBlock'; import { useStore } from '../../store'; import Table from '../../components/Table'; -import { fetchAPI } from '../../api/fetchAPI'; -import Loader from '../../components/Loader'; const Smeshers = () => { const store = useStore(); - const [dataTimeCreation, setDataTimeCreation] = useState([]); - const [data, setData] = useState(); + const [genesisTime, setGenesisTime] = useState(0); useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${SMESHER}`).then((res) => { - const creation = res.data && res.data.length && res.data.length > 0 && res.data[0].timestamp; - setDataTimeCreation(creation); - setData(res); - }); - }, [store.network.value]); + if (store.netInfo === null) return; + setGenesisTime(new Date(store.netInfo.genesisTime || 0).getTime() / 1000); + }, [store.netInfo]); return ( - data ? ( - <> -
    - - -
    -
    - - ) : + <> +
    + + +
    +
    + ); }; diff --git a/src/routes/tx.jsx b/src/routes/tx.jsx index 1788cf1..12d7285 100644 --- a/src/routes/tx.jsx +++ b/src/routes/tx.jsx @@ -1,20 +1,27 @@ +// @flow + import { observer } from 'mobx-react'; import { useEffect, useState } from 'react'; import { Link, useParams } from 'react-router-dom'; +import { V2alpha1TransactionResponse } from 'api'; import TitleBlock from '../components/TitleBlock'; import { getColorByPageName } from '../helper/getColorByPageName'; import { ACCOUNTS, LAYERS, TXNS, } from '../config/constants'; import { useStore } from '../store'; -import { fetchAPI } from '../api/fetchAPI'; import longFormHash from '../helper/longFormHash'; import { CountTxnsBlock } from '../components/CountBlock'; import TxnsStatus from '../components/TxnsStatus'; import Loader from '../components/Loader'; -import { formatSmidge, parseSmidge } from '../helper/converter'; +import { + base64ToHex, + formatSmidge, hexToBase64, parseSmidge, +} from '../helper/converter'; import CopyButton from '../components/CopyButton'; -import { typeOfTransaction } from '../helper/tx'; +import { + amount, destination, typeOfTransaction, +} from '../helper/tx'; import CustomTimeAgo from '../components/CustomTimeAgo'; import { fullDate } from '../helper/formatter'; @@ -23,16 +30,35 @@ const Tx = () => { const name = TXNS; const params = useParams(); - const [data, setData] = useState(); + const [data, setData] = useState(); const [smidge, setSmidge] = useState({ value: 0, unit: 'SMH' }); + const [error, setError] = useState(); + if (error) throw error; useEffect(() => { - if (store.network.value === null) return; - fetchAPI(`${store.network.value}${name}/${params.id}`).then((res) => { - setData(res.data[0]); - setSmidge(parseSmidge(res.data[0].amount)); + if (store.netInfo === null) return; + store.api.transaction.transactionServiceList({ + txid: [hexToBase64(params.id)], + limit: 1, + includeResult: true, + includeState: true, + }).then((res) => { + if (res.transactions.length === 0) { + throw new Error(); + } + const tx = res.transactions[0]; + setData(tx); + setSmidge(parseSmidge(amount(tx))); + }).catch((err) => { + if (err.status === 429) { + store.showThrottlePopup(); + return; + } + const err2 = new Error('Transaction not found'); + err2.id = params.id; + setError(err2); }); - }, [store.network.value, params.id]); + }, [params.id, store.netInfo]); return ( <> @@ -48,80 +74,78 @@ const Tx = () => { badgeType="coin" amount={smidge.value} unit={smidge.unit} - startTime={data && data.timestamp} + startTime={data && store.layerTimestamp(data.txResult.layer)} color={getColorByPageName(name)} /> - +
    • ID - {data.id} - + {params.id} +
    • Type - {typeOfTransaction(data.type)} + {typeOfTransaction(data.tx.type)}
    • To - {data.receiver} - + + {destination(data)} + +
    • From - {data.sender} - + {data.tx.principal} +
    • Timestamp - +   - {`${fullDate(data.timestamp)}`} + {`${fullDate(store.layerTimestamp(data.txResult.layer))}`}
    • Layer - {data.layer} + {data.txResult.layer}
    • Value - {formatSmidge(data.amount)} + {formatSmidge(amount(data))}
    • Counter - {data.counter} + {data.tx.nonce.counter}
    • Fee - {formatSmidge(data.fee)} + {formatSmidge(data.txResult.fee)}
    • Block - {data.block} + {base64ToHex(data.txResult.block)}
    • -
    • - Position in block - {data.blockIndex} -
    • - {data.type === 7 && ( + {data.tx.type === 'TRANSACTION_TYPE_DRAIN_VAULT' && (
    • Vault - {data.vault} - + {data.tx.contents.drainVault.vault} +
    • )} diff --git a/src/routes/txns.jsx b/src/routes/txns.jsx index 7b38350..16ee002 100644 --- a/src/routes/txns.jsx +++ b/src/routes/txns.jsx @@ -8,7 +8,6 @@ import Table from '../components/Table'; const Txns = () => { const store = useStore(); - const { epoch } = store.networkInfo; return ( <>
      @@ -19,10 +18,9 @@ const Txns = () => { />
    diff --git a/src/store/index.jsx b/src/store/index.jsx index 95e45b3..00dbbee 100644 --- a/src/store/index.jsx +++ b/src/store/index.jsx @@ -1,16 +1,36 @@ import { - makeAutoObservable, toJS, runInAction, observable, action, + action, makeAutoObservable, observable, toJS, } from 'mobx'; import React from 'react'; -import { reMappingNetworkArray } from '../helper/mapping'; +import { + AccountServiceApi, + ActivationServiceApi, + Configuration, + LayerServiceApi, + NetworkServiceApi, + NodeServiceApi, + RewardServiceApi, + TransactionServiceApi, + Spacemeshv2alpha1NetworkInfoResponse, + V2alpha1NodeStatusResponse, + MalfeasanceServiceApi, +} from 'api'; const DISCOVERY_SERVICE_URL = process.env.REACT_APP_DISCOVERY_SERVICE_URL || 'https://configs.spacemesh.network/networks.json'; +const BITS_PER_LABEL = 128; +const LABELS_PER_UNIT = process.env.REACT_APP_LABELS_PER_UNIT || 1024; +const PUBLIC_API = process.env.REACT_APP_PUBLIC_API || null; +const STATS_API = process.env.REACT_APP_STATS_API || null; export default class Store { theme = localStorage.getItem('theme') ? localStorage.getItem('theme') : 'light'; + isThrottlePopupOpen: boolean = false; + networks = []; + postUnitSize = null; + network = { value: null, label: null, explorer: null, dash: null }; networkInfo = {}; @@ -19,7 +39,27 @@ export default class Store { fetch = null; - constructor(fetch) { + netInfo: Spacemeshv2alpha1NetworkInfoResponse = null; + + nodeStatus: V2alpha1NodeStatusResponse = null; + + apiConf = null; + + api = {}; + + overview = { + transactions_count: 0, + accounts_count: 0, + rewards_sum: 0, + rewards_count: 0, + layers_count: 0, + smeshers_count: 0, + num_units: 0, + }; + + statsApiUrl = null; + + constructor() { makeAutoObservable(this, { theme: observable, networks: observable.ref, @@ -27,16 +67,31 @@ export default class Store { networkInfo: observable, networkColor: observable, color: observable, + overview: observable, + netInfo: observable, + nodeStatus: observable, + postUnitSize: observable, + isThrottlePopupOpen: observable, setNetwork: action, - getNetworkInfo: action, showSearchResult: action, + setNetInfo: action, + setNodeStatus: action, + showThrottlePopup: action, + hideThrottlePopup: action, }, { autoBind: true }); - this.fetch = fetch; document.documentElement.classList.add(`theme-${this.theme}`); // this.bootstrap(); } + showThrottlePopup() { + this.isThrottlePopupOpen = true; + } + + hideThrottlePopup() { + this.isThrottlePopupOpen = false; + } + changeTheme(e) { this.theme = e.target.checked ? 'dark' : 'light'; localStorage.setItem('theme', this.theme); @@ -44,22 +99,110 @@ export default class Store { document.documentElement.classList.add(`theme-${this.theme}`); } + setNetwork(data) { + this.network = this.networks.find((item) => item.value === data.value); + this.network.value += this.network.value.endsWith('/') ? '' : '/'; + } + + setNetInfo(data) { + this.netInfo = data; + this.postUnitSize = (BITS_PER_LABEL * LABELS_PER_UNIT) / 8; + } + + setNodeStatus(data) { + this.nodeStatus = data; + } + + setOverview(data) { + this.overview = data; + } + setNetworks(data) { this.networks = data; } - setNetwork(data) { - this.network = this.networks.find((item) => item.value === data.value); - this.network.value += this.network.value.endsWith('/') ? '' : '/'; + setStatsApiUrl(url) { + this.statsApiUrl = url; + } + + setApiConf(conf) { + this.apiConf = conf; + } + + setApi(api) { + this.api = api; } async bootstrap() { try { - const response = await this.fetch(DISCOVERY_SERVICE_URL); - const networks = reMappingNetworkArray(response); + const response = await fetch(DISCOVERY_SERVICE_URL); + const data = await response.json(); + const networks = data.map((network) => ( + { + value: network.dashAPI, + label: network.netName, + dash: network.dash, + explorer: network.explorer, + statsAPI: network.statsAPI, + grpcAPI: network.grpcAPI, + } + )); this.setNetworks(networks); this.setNetwork(networks[0]); - await this.getNetworkInfo(); + + if (PUBLIC_API === null) { + this.setApiConf(new Configuration({ + basePath: networks[0].grpcAPI.replace(/\/$/, ''), + })); + } else { + this.setApiConf(new Configuration({ + basePath: PUBLIC_API.replace(/\/$/, ''), + })); + } + this.setApi({ + account: new AccountServiceApi(this.apiConf), + activation: new ActivationServiceApi(this.apiConf), + layer: new LayerServiceApi(this.apiConf), + network: new NetworkServiceApi(this.apiConf), + node: new NodeServiceApi(this.apiConf), + reward: new RewardServiceApi(this.apiConf), + transaction: new TransactionServiceApi(this.apiConf), + malfeasance: new MalfeasanceServiceApi(this.apiConf), + }); + if (STATS_API === null) { + this.setStatsApiUrl(networks[0].statsAPI.replace(/\/$/, '')); + } else { + this.setStatsApiUrl(STATS_API.replace(/\/$/, '')); + } + } catch (e) { + console.log('Error: ', e.message); + } + + try { + this.setNodeStatus(await this.api.node.nodeServiceStatus({})); + } catch (e) { + if (e.status === 429) { + this.showThrottlePopup(); + } + console.log('Error: ', e.message); + } + + try { + this.setNetInfo(await this.api.network.networkServiceInfo({})); + } catch (e) { + if (e.status === 429) { + this.showThrottlePopup(); + } + console.log('Error: ', e.message); + } + + try { + const response = await fetch(`${this.statsApiUrl}/overview`); + if (!response.ok || response.status === 429) { + throw new Error('Error fetching data'); + } + const res = await response.json(); + this.setOverview(res); } catch (e) { console.log('Error: ', e.message); } @@ -77,20 +220,16 @@ export default class Store { } } - async getNetworkInfo() { - const network = this.network.value; - const wsUrl = network.replace(/^https(.*)/, 'wss$1').replace(/^http(.*)/, 'ws$1'); - const ws = new WebSocket(`${wsUrl}ws/network-info`); - ws.onmessage = (event) => { - if (network !== this.network.value) { - ws.close(); - } else { - runInAction(async () => { - this.networkInfo = JSON.parse(event.data); - this.processNetworkInfo(this.networkInfo); - }); - } - }; + layerTimestamp(layer: number) { + const genesisTime = new Date(this.netInfo?.genesisTime || 0); + const durationMs = parseInt(this.netInfo?.layerDuration, 10); + return (genesisTime.getTime() / 1000 + (layer * durationMs)); + } + + layerEndTimestamp(layer: number) { + const genesisTime = new Date(this.netInfo?.genesisTime || 0); + const durationMs = parseInt(this.netInfo?.layerDuration, 10); + return (genesisTime.getTime() / 1000 + (layer * durationMs) + durationMs) - 1; } } diff --git a/src/styles/components/common/_table.scss b/src/styles/components/common/_table.scss index 95fffaa..096d9ea 100644 --- a/src/styles/components/common/_table.scss +++ b/src/styles/components/common/_table.scss @@ -133,6 +133,7 @@ .pagination_link--disabled { a { color: $textColor; + cursor: default; } a:hover { background-color: initial;