From 608edc31b39c6ff9a285af46d1c1037cd36a7252 Mon Sep 17 00:00:00 2001 From: Daniel Olshansky Date: Tue, 9 Apr 2024 13:16:38 -0700 Subject: [PATCH 1/3] [Tokenomics] Foundation PR to integrate `SessionAccountingSettlement` w/ the Claim & Proof lifecycle (#448) _tl;dr The foundation for settling the Claim & Proof lifecycle where emissions = burn._ **Core Changes** - Introduced a fully function E2E Tokenomics test - Added `EventClaimExpired` and `EventClaimSettled` - Added and Implemented `SettlePendingClaims` to run on `EndBlocker` - Placeholder entrypoints for `Probabilistic proofs` **Supporting Changes** - Fixed `config.yml` to have module accounts on genesis - Major changes to e2e testing utilities to support listening on events and storing additional state - Added various TODOs to tend to in the coming months to productionze this feature - Created testutil `Tokenomics` keeper with real module dependencies - Switch all `UndelegateCoinsFromXXX` to `SendCoinsFromXXX` **Side Quests** - Streamlined the `Makefile` helpers to avoid confirmation when unnecessary - Fixed incorrect start/end session block height calculations - Centralized business logic for relay hashing - Added and improved lots of logging lines --- Co-authored-by: Bryan White Co-authored-by: Redouane Lakrache --- Makefile | 46 +- api/poktroll/application/event.pulsar.go | 48 +- api/poktroll/service/service.pulsar.go | 639 --------- api/poktroll/session/session.pulsar.go | 138 +- api/poktroll/tokenomics/event.pulsar.go | 1263 +++++++++++++++++ app/app.go | 6 +- app/app_config.go | 5 +- config.yml | 45 +- e2e/tests/0_tokenomics.feature | 27 + e2e/tests/init_test.go | 254 ++-- e2e/tests/session.feature | 55 +- e2e/tests/session_steps_test.go | 128 +- e2e/tests/stake.feature | 21 +- e2e/tests/tokenomics.feature | 13 - .../config/application1_stake_config.yaml | 8 +- .../config/application2_stake_config.yaml | 8 +- .../config/application3_stake_config.yaml | 8 +- localnet/poktrolld/config/config.toml | 4 +- .../config/gateway1_stake_config.yaml | 2 +- .../config/gateway2_stake_config.yaml | 2 +- .../config/gateway3_stake_config.yaml | 2 +- .../config/supplier1_stake_config.yaml | 20 +- .../config/supplier2_stake_config.yaml | 2 +- .../config/supplier3_stake_config.yaml | 2 +- pkg/appgateserver/server.go | 2 +- pkg/appgateserver/synchronous.go | 5 +- pkg/client/block/block.go | 43 +- pkg/client/block/client.go | 2 +- pkg/client/interface.go | 2 +- .../supplier/client_integration_test.go | 2 +- pkg/client/supplier/client_test.go | 6 +- pkg/client/tx/client.go | 8 +- pkg/client/tx/client_test.go | 3 +- pkg/polylog/polyzero/test_logger.go | 2 - .../config/relayminer_configs_reader_test.go | 74 +- pkg/relayer/miner/miner.go | 27 +- pkg/relayer/miner/miner_test.go | 18 +- pkg/relayer/protocol/block_heights.go | 4 +- pkg/relayer/session/claim.go | 2 +- pkg/relayer/session/proof.go | 2 +- pkg/relayer/session/session_test.go | 2 +- pkg/sdk/interface.go | 2 +- pkg/sdk/send_relay.go | 2 +- proto/poktroll/application/event.proto | 2 - .../poktroll/application/module/module.proto | 2 +- proto/poktroll/session/session.proto | 8 +- proto/poktroll/shared/service.proto | 1 + proto/poktroll/tokenomics/event.proto | 22 + testutil/keeper/application.go | 4 +- testutil/keeper/gateway.go | 4 +- testutil/keeper/proof.go | 15 +- testutil/keeper/supplier.go | 4 +- testutil/keeper/tokenomics.go | 233 ++- testutil/testrelayer/hash.go | 16 - testutil/testrelayer/relays.go | 8 +- tools/scripts/goimports/filters/filters.go | 2 +- x/application/keeper/application_test.go | 13 + .../keeper/msg_server_stake_application.go | 37 +- .../keeper/msg_server_unstake_application.go | 2 +- x/application/module/module.go | 4 +- .../module/query_application_test.go | 6 +- x/application/types/expected_keepers.go | 8 +- x/gateway/keeper/gateway_test.go | 4 +- x/gateway/keeper/msg_server_stake_gateway.go | 28 +- .../keeper/msg_server_unstake_gateway.go | 2 +- x/gateway/module/query_gateway_test.go | 6 +- x/gateway/types/expected_keepers.go | 18 +- x/proof/keeper/claim.go | 3 - x/proof/keeper/msg_server_create_claim.go | 24 +- .../keeper/msg_server_create_claim_test.go | 5 +- x/proof/keeper/msg_server_submit_proof.go | 77 +- x/proof/keeper/proof.go | 2 +- x/proof/keeper/proof_test.go | 2 +- x/proof/module/helpers_test.go | 32 +- x/proof/module/query_claim_test.go | 39 +- x/proof/types/errors.go | 35 +- x/proof/types/expected_keepers.go | 9 +- x/proof/types/message_create_claim.go | 17 +- x/proof/types/message_create_claim_test.go | 52 +- x/proof/types/message_submit_proof_test.go | 20 +- x/proof/types/query_validation.go | 2 +- x/service/keeper/service_test.go | 4 +- x/service/types/expected_keepers.go | 13 +- x/service/types/relay.go | 1 - x/session/keeper/query_get_session.go | 3 +- x/session/keeper/session_hydrator.go | 7 +- x/session/module/module.go | 12 +- x/session/module/query_get_session_test.go | 4 +- x/session/types/session_header.go | 21 +- x/session/types/session_header_test.go | 24 +- x/shared/helpers/service.go | 2 + .../keeper/msg_server_stake_supplier.go | 31 +- .../keeper/msg_server_unstake_supplier.go | 2 +- x/supplier/keeper/supplier_test.go | 14 +- x/supplier/module/query_supplier_test.go | 6 +- x/supplier/types/expected_keepers.go | 4 +- x/tokenomics/keeper/keeper.go | 40 +- x/tokenomics/keeper/keeper_test.go | 285 ++++ x/tokenomics/keeper/settle_pending_claims.go | 149 ++ .../keeper/settle_session_accounting.go | 108 +- .../keeper/settle_session_accounting_test.go | 9 +- x/tokenomics/module/abci.go | 19 + x/tokenomics/module/module.go | 43 +- x/tokenomics/module/tx_update_params_test.go | 7 +- x/tokenomics/types/errors.go | 29 +- x/tokenomics/types/expected_keepers.go | 39 +- 106 files changed, 3052 insertions(+), 1546 deletions(-) delete mode 100644 api/poktroll/service/service.pulsar.go create mode 100644 api/poktroll/tokenomics/event.pulsar.go create mode 100644 e2e/tests/0_tokenomics.feature delete mode 100644 e2e/tests/tokenomics.feature create mode 100644 proto/poktroll/tokenomics/event.proto delete mode 100644 testutil/testrelayer/hash.go create mode 100644 x/tokenomics/keeper/keeper_test.go create mode 100644 x/tokenomics/keeper/settle_pending_claims.go create mode 100644 x/tokenomics/module/abci.go diff --git a/Makefile b/Makefile index a467c6b63..8475ca7b5 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,13 @@ APPGATE_SERVER ?= http://localhost:42069 POCKET_ADDR_PREFIX = pokt CHAIN_ID = poktroll +# On-chain module account addresses. Search for `func TestModuleAddress` in the +# codebase to get an understanding of how we got these values. +APPLICATION_MODULE_ADDRESS = pokt1rl3gjgzexmplmds3tq3r3yk84zlwdl6djzgsvm +SUPPLIER_MODULE_ADDRESS = pokt1j40dzzmn6cn9kxku7a5tjnud6hv37vesr5ccaa +GATEWAY_MODULE_ADDRESS = pokt1f6j7u6875p2cvyrgjr0d2uecyzah0kget9vlpl +SERVICE_MODULE_ADDRESS = pokt1nhmtqf4gcmpxu0p6e53hpgtwj0llmsqpxtumcf + # Detect operating system OS := $(shell uname -s) @@ -186,11 +193,14 @@ warn_destructive: ## Print WARNING to the user proto_ignite_gen: ## Generate protobuf artifacts using ignite ignite generate proto-go --yes -.PHONY: proto_fix_self_import proto_fix_self_import: ## TODO_TECHDEBT(@bryanchriswhite): Add a proper explanation for this make target explaining why it's necessary + @echo "Updating all instances of cosmossdk.io/api/poktroll to github.com/pokt-network/poktroll/api/poktroll..." + @find ./api/poktroll/ -type f | while read -r file; do \ + $(SED) -i 's,cosmossdk.io/api/poktroll,github.com/pokt-network/poktroll/api/poktroll,g' "$$file"; \ + done @for dir in $(wildcard ./api/poktroll/*/); do \ module=$$(basename $$dir); \ - echo "Processing module $$module"; \ + echo "Further processing module $$module"; \ $(GREP) -lRP '\s+'$$module' "github.com/pokt-network/poktroll/api/poktroll/'$$module'"' ./api/poktroll/$$module | while read -r file; do \ echo "Modifying file: $$file"; \ $(SED) -i -E 's,^[[:space:]]+'$$module'[[:space:]]+"github.com/pokt-network/poktroll/api/poktroll/'$$module'",,' "$$file"; \ @@ -198,6 +208,7 @@ proto_fix_self_import: ## TODO_TECHDEBT(@bryanchriswhite): Add a proper explanat done; \ done + .PHONY: proto_clean proto_clean: ## Delete existing .pb.go or .pb.gw.go files find . \( -name "*.pb.go" -o -name "*.pb.gw.go" \) | xargs --no-run-if-empty rm @@ -337,7 +348,7 @@ load_test_simple: ## Runs the simplest load test through the whole stack (appgat # e.g. TODO_HACK: This is a hack, we need to fix it later # 2. If there's a specific issue, or specific person, add that in paranthesiss # e.g. TODO(@Olshansk): Automatically link to the Github user https://github.com/olshansk -# e.g. TODO_INVESTIGATE(#420): Automatically link this to github issue https://github.com/pokt-network/pocket/issues/420 +# e.g. TODO_INVESTIGATE(#420): Automatically link this to github issue https://github.com/pokt-network/poktroll/issues/420 # e.g. TODO_DISCUSS(@Olshansk, #420): Specific individual should tend to the action item in the specific ticket # e.g. TODO_CLEANUP(core): This is not tied to an issue, or a person, but should only be done by the core team. # e.g. TODO_CLEANUP: This is not tied to an issue, or a person, and can be done by the core team or external contributors. @@ -390,7 +401,7 @@ gateway_list: ## List all the staked gateways .PHONY: gateway_stake gateway_stake: ## Stake tokens for the gateway specified (must specify the gateway env var) - poktrolld --home=$(POKTROLLD_HOME) tx gateway stake-gateway --config $(POKTROLLD_HOME)/config/$(STAKE) --keyring-backend test --from $(GATEWAY) --node $(POCKET_NODE) --chain-id $(CHAIN_ID) + poktrolld --home=$(POKTROLLD_HOME) tx gateway stake-gateway -y --config $(POKTROLLD_HOME)/config/$(STAKE) --keyring-backend test --from $(GATEWAY) --node $(POCKET_NODE) --chain-id $(CHAIN_ID) .PHONY: gateway1_stake gateway1_stake: ## Stake gateway1 @@ -430,7 +441,7 @@ app_list: ## List all the staked applications .PHONY: app_stake app_stake: ## Stake tokens for the application specified (must specify the APP and SERVICES env vars) - poktrolld --home=$(POKTROLLD_HOME) tx application stake-application --config $(POKTROLLD_HOME)/config/$(SERVICES) --keyring-backend test --from $(APP) --node $(POCKET_NODE) --chain-id $(CHAIN_ID) + poktrolld --home=$(POKTROLLD_HOME) tx application stake-application -y --config $(POKTROLLD_HOME)/config/$(SERVICES) --keyring-backend test --from $(APP) --node $(POCKET_NODE) --chain-id $(CHAIN_ID) .PHONY: app1_stake app1_stake: ## Stake app1 (also staked in genesis) @@ -508,7 +519,7 @@ supplier_list: ## List all the staked supplier .PHONY: supplier_stake supplier_stake: ## Stake tokens for the supplier specified (must specify the SUPPLIER and SUPPLIER_CONFIG env vars) - poktrolld --home=$(POKTROLLD_HOME) tx supplier stake-supplier --config $(POKTROLLD_HOME)/config/$(SERVICES) --keyring-backend test --from $(SUPPLIER) --node $(POCKET_NODE) --chain-id $(CHAIN_ID) + poktrolld --home=$(POKTROLLD_HOME) tx supplier stake-supplier -y --config $(POKTROLLD_HOME)/config/$(SERVICES) --keyring-backend test --from $(SUPPLIER) --node $(POCKET_NODE) --chain-id $(CHAIN_ID) .PHONY: supplier1_stake supplier1_stake: ## Stake supplier1 (also staked in genesis) @@ -567,20 +578,22 @@ get_session_app3_anvil: ## Retrieve the session for (app3, anvil, latest_height) .PHONY: acc_balance_query acc_balance_query: ## Query the balance of the account specified (make acc_balance_query ACC=pokt...) - @echo "~~~ Balances ~~~" + @echo "~ Balances ~" poktrolld --home=$(POKTROLLD_HOME) q bank balances $(ACC) --node $(POCKET_NODE) - @echo "~~~ Spendable Balances ~~~" + @echo "~ Spendable Balances ~" @echo "Querying spendable balance for $(ACC)" poktrolld --home=$(POKTROLLD_HOME) q bank spendable-balances $(ACC) --node $(POCKET_NODE) -.PHONY: acc_balance_query_module_app -acc_balance_query_module_app: ## Query the balance of the network level "application" module - make acc_balance_query ACC=pokt1rl3gjgzexmplmds3tq3r3yk84zlwdl6djzgsvm - -.PHONY: acc_balance_query_module_supplier -acc_balance_query_module_supplier: ## Query the balance of the network level "supplier" module - SUPPLIER1=$(make poktrolld_addr ACC_NAME=supplier1) - make acc_balance_query ACC=SUPPLIER1 +.PHONY: acc_balance_query_modules +acc_balance_query_modules: ## Query the balance of the network level module accounts + @echo "### Application ###" + make acc_balance_query ACC=$(APPLICATION_MODULE_ADDRESS) + @echo "### Supplier ###" + make acc_balance_query ACC=$(SUPPLIER_MODULE_ADDRESS) + @echo "### Gateway ###" + make acc_balance_query ACC=$(GATEWAY_MODULE_ADDRESS) + @echo "### Service ###" + make acc_balance_query ACC=$(SERVICE_MODULE_ADDRESS) .PHONY: acc_balance_query_app1 acc_balance_query_app1: ## Query the balance of app1 @@ -604,7 +617,6 @@ acc_balance_total_supply: ## Query the total supply of the network acc_initialize_pubkeys: ## Make sure the account keeper has public keys for all available accounts $(eval ADDRESSES=$(shell make -s ignite_acc_list | grep pokt | awk '{printf "%s ", $$2}' | sed 's/.$$//')) $(eval PNF_ADDR=pokt1eeeksh2tvkh7wzmfrljnhw4wrhs55lcuvmekkw) - # @printf "Addresses: ${ADDRESSES}" $(foreach addr, $(ADDRESSES),\ echo $(addr);\ poktrolld tx bank send \ diff --git a/api/poktroll/application/event.pulsar.go b/api/poktroll/application/event.pulsar.go index 755da9625..6f5701306 100644 --- a/api/poktroll/application/event.pulsar.go +++ b/api/poktroll/application/event.pulsar.go @@ -5,7 +5,6 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" runtime "github.com/cosmos/cosmos-proto/runtime" - _ "github.com/cosmos/gogoproto/gogoproto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoiface "google.golang.org/protobuf/runtime/protoiface" protoimpl "google.golang.org/protobuf/runtime/protoimpl" @@ -519,7 +518,6 @@ type EventRedelegation struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // TODO: Check if this tag is relevant for events: (gogoproto.jsontag) = "app_address" AppAddress string `protobuf:"bytes,1,opt,name=app_address,json=appAddress,proto3" json:"app_address,omitempty"` // The Bech32 address of the application, using cosmos' ScalarDescriptor to ensure deterministic encoding GatewayAddress string `protobuf:"bytes,2,opt,name=gateway_address,json=gatewayAddress,proto3" json:"gateway_address,omitempty"` // The Bech32 address of the gateway the application has changed their delegation of, using cosmos' ScalarDescriptor to ensure deterministic encoding } @@ -566,30 +564,28 @@ var file_poktroll_application_event_proto_rawDesc = []byte{ 0x74, 0x6f, 0x12, 0x14, 0x70, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x19, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x14, 0x67, 0x6f, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, - 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x91, 0x01, 0x0a, 0x11, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x39, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0a, - 0x61, 0x70, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x41, 0x0a, 0x0f, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0xbe, 0x01, - 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x2e, 0x61, - 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0a, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x25, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6f, 0x6b, 0x74, 0x72, - 0x6f, 0x6c, 0x6c, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, - 0x02, 0x03, 0x50, 0x41, 0x58, 0xaa, 0x02, 0x14, 0x50, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, - 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02, 0x14, 0x50, - 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x5c, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0xe2, 0x02, 0x20, 0x50, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x5c, 0x41, - 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x15, 0x50, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, - 0x6c, 0x3a, 0x3a, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x74, 0x6f, 0x22, 0x91, 0x01, 0x0a, 0x11, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x64, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0b, 0x61, 0x70, 0x70, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, + 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x41, 0x0a, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, + 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0xbe, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, + 0x70, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0a, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x25, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x2f, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x50, 0x41, 0x58, 0xaa, + 0x02, 0x14, 0x50, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02, 0x14, 0x50, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x5c, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xe2, 0x02, 0x20, + 0x50, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x5c, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0xea, 0x02, 0x15, 0x50, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x3a, 0x3a, 0x41, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/poktroll/service/service.pulsar.go b/api/poktroll/service/service.pulsar.go deleted file mode 100644 index e47fdeda9..000000000 --- a/api/poktroll/service/service.pulsar.go +++ /dev/null @@ -1,639 +0,0 @@ -// Code generated by protoc-gen-go-pulsar. DO NOT EDIT. -package service - -import ( - fmt "fmt" - runtime "github.com/cosmos/cosmos-proto/runtime" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoiface "google.golang.org/protobuf/runtime/protoiface" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - io "io" - reflect "reflect" - sync "sync" -) - -var ( - md_Service protoreflect.MessageDescriptor - fd_Service_index protoreflect.FieldDescriptor - fd_Service_name protoreflect.FieldDescriptor -) - -func init() { - file_poktroll_service_service_proto_init() - md_Service = File_poktroll_service_service_proto.Messages().ByName("Service") - fd_Service_index = md_Service.Fields().ByName("index") - fd_Service_name = md_Service.Fields().ByName("name") -} - -var _ protoreflect.Message = (*fastReflection_Service)(nil) - -type fastReflection_Service Service - -func (x *Service) ProtoReflect() protoreflect.Message { - return (*fastReflection_Service)(x) -} - -func (x *Service) slowProtoReflect() protoreflect.Message { - mi := &file_poktroll_service_service_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -var _fastReflection_Service_messageType fastReflection_Service_messageType -var _ protoreflect.MessageType = fastReflection_Service_messageType{} - -type fastReflection_Service_messageType struct{} - -func (x fastReflection_Service_messageType) Zero() protoreflect.Message { - return (*fastReflection_Service)(nil) -} -func (x fastReflection_Service_messageType) New() protoreflect.Message { - return new(fastReflection_Service) -} -func (x fastReflection_Service_messageType) Descriptor() protoreflect.MessageDescriptor { - return md_Service -} - -// Descriptor returns message descriptor, which contains only the protobuf -// type information for the message. -func (x *fastReflection_Service) Descriptor() protoreflect.MessageDescriptor { - return md_Service -} - -// Type returns the message type, which encapsulates both Go and protobuf -// type information. If the Go type information is not needed, -// it is recommended that the message descriptor be used instead. -func (x *fastReflection_Service) Type() protoreflect.MessageType { - return _fastReflection_Service_messageType -} - -// New returns a newly allocated and mutable empty message. -func (x *fastReflection_Service) New() protoreflect.Message { - return new(fastReflection_Service) -} - -// Interface unwraps the message reflection interface and -// returns the underlying ProtoMessage interface. -func (x *fastReflection_Service) Interface() protoreflect.ProtoMessage { - return (*Service)(x) -} - -// Range iterates over every populated field in an undefined order, -// calling f for each field descriptor and value encountered. -// Range returns immediately if f returns false. -// While iterating, mutating operations may only be performed -// on the current field descriptor. -func (x *fastReflection_Service) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { - if x.Index != "" { - value := protoreflect.ValueOfString(x.Index) - if !f(fd_Service_index, value) { - return - } - } - if x.Name != "" { - value := protoreflect.ValueOfString(x.Name) - if !f(fd_Service_name, value) { - return - } - } -} - -// Has reports whether a field is populated. -// -// Some fields have the property of nullability where it is possible to -// distinguish between the default value of a field and whether the field -// was explicitly populated with the default value. Singular message fields, -// member fields of a oneof, and proto2 scalar fields are nullable. Such -// fields are populated only if explicitly set. -// -// In other cases (aside from the nullable cases above), -// a proto3 scalar field is populated if it contains a non-zero value, and -// a repeated field is populated if it is non-empty. -func (x *fastReflection_Service) Has(fd protoreflect.FieldDescriptor) bool { - switch fd.FullName() { - case "poktroll.service.Service.index": - return x.Index != "" - case "poktroll.service.Service.name": - return x.Name != "" - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: poktroll.service.Service")) - } - panic(fmt.Errorf("message poktroll.service.Service does not contain field %s", fd.FullName())) - } -} - -// Clear clears the field such that a subsequent Has call reports false. -// -// Clearing an extension field clears both the extension type and value -// associated with the given field number. -// -// Clear is a mutating operation and unsafe for concurrent use. -func (x *fastReflection_Service) Clear(fd protoreflect.FieldDescriptor) { - switch fd.FullName() { - case "poktroll.service.Service.index": - x.Index = "" - case "poktroll.service.Service.name": - x.Name = "" - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: poktroll.service.Service")) - } - panic(fmt.Errorf("message poktroll.service.Service does not contain field %s", fd.FullName())) - } -} - -// Get retrieves the value for a field. -// -// For unpopulated scalars, it returns the default value, where -// the default value of a bytes scalar is guaranteed to be a copy. -// For unpopulated composite types, it returns an empty, read-only view -// of the value; to obtain a mutable reference, use Mutable. -func (x *fastReflection_Service) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { - switch descriptor.FullName() { - case "poktroll.service.Service.index": - value := x.Index - return protoreflect.ValueOfString(value) - case "poktroll.service.Service.name": - value := x.Name - return protoreflect.ValueOfString(value) - default: - if descriptor.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: poktroll.service.Service")) - } - panic(fmt.Errorf("message poktroll.service.Service does not contain field %s", descriptor.FullName())) - } -} - -// Set stores the value for a field. -// -// For a field belonging to a oneof, it implicitly clears any other field -// that may be currently set within the same oneof. -// For extension fields, it implicitly stores the provided ExtensionType. -// When setting a composite type, it is unspecified whether the stored value -// aliases the source's memory in any way. If the composite value is an -// empty, read-only value, then it panics. -// -// Set is a mutating operation and unsafe for concurrent use. -func (x *fastReflection_Service) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { - switch fd.FullName() { - case "poktroll.service.Service.index": - x.Index = value.Interface().(string) - case "poktroll.service.Service.name": - x.Name = value.Interface().(string) - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: poktroll.service.Service")) - } - panic(fmt.Errorf("message poktroll.service.Service does not contain field %s", fd.FullName())) - } -} - -// Mutable returns a mutable reference to a composite type. -// -// If the field is unpopulated, it may allocate a composite value. -// For a field belonging to a oneof, it implicitly clears any other field -// that may be currently set within the same oneof. -// For extension fields, it implicitly stores the provided ExtensionType -// if not already stored. -// It panics if the field does not contain a composite type. -// -// Mutable is a mutating operation and unsafe for concurrent use. -func (x *fastReflection_Service) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { - switch fd.FullName() { - case "poktroll.service.Service.index": - panic(fmt.Errorf("field index of message poktroll.service.Service is not mutable")) - case "poktroll.service.Service.name": - panic(fmt.Errorf("field name of message poktroll.service.Service is not mutable")) - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: poktroll.service.Service")) - } - panic(fmt.Errorf("message poktroll.service.Service does not contain field %s", fd.FullName())) - } -} - -// NewField returns a new value that is assignable to the field -// for the given descriptor. For scalars, this returns the default value. -// For lists, maps, and messages, this returns a new, empty, mutable value. -func (x *fastReflection_Service) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { - switch fd.FullName() { - case "poktroll.service.Service.index": - return protoreflect.ValueOfString("") - case "poktroll.service.Service.name": - return protoreflect.ValueOfString("") - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: poktroll.service.Service")) - } - panic(fmt.Errorf("message poktroll.service.Service does not contain field %s", fd.FullName())) - } -} - -// WhichOneof reports which field within the oneof is populated, -// returning nil if none are populated. -// It panics if the oneof descriptor does not belong to this message. -func (x *fastReflection_Service) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { - switch d.FullName() { - default: - panic(fmt.Errorf("%s is not a oneof field in poktroll.service.Service", d.FullName())) - } - panic("unreachable") -} - -// GetUnknown retrieves the entire list of unknown fields. -// The caller may only mutate the contents of the RawFields -// if the mutated bytes are stored back into the message with SetUnknown. -func (x *fastReflection_Service) GetUnknown() protoreflect.RawFields { - return x.unknownFields -} - -// SetUnknown stores an entire list of unknown fields. -// The raw fields must be syntactically valid according to the wire format. -// An implementation may panic if this is not the case. -// Once stored, the caller must not mutate the content of the RawFields. -// An empty RawFields may be passed to clear the fields. -// -// SetUnknown is a mutating operation and unsafe for concurrent use. -func (x *fastReflection_Service) SetUnknown(fields protoreflect.RawFields) { - x.unknownFields = fields -} - -// IsValid reports whether the message is valid. -// -// An invalid message is an empty, read-only value. -// -// An invalid message often corresponds to a nil pointer of the concrete -// message type, but the details are implementation dependent. -// Validity is not part of the protobuf data model, and may not -// be preserved in marshaling or other operations. -func (x *fastReflection_Service) IsValid() bool { - return x != nil -} - -// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. -// This method may return nil. -// -// The returned methods type is identical to -// "google.golang.org/protobuf/runtime/protoiface".Methods. -// Consult the protoiface package documentation for details. -func (x *fastReflection_Service) ProtoMethods() *protoiface.Methods { - size := func(input protoiface.SizeInput) protoiface.SizeOutput { - x := input.Message.Interface().(*Service) - if x == nil { - return protoiface.SizeOutput{ - NoUnkeyedLiterals: input.NoUnkeyedLiterals, - Size: 0, - } - } - options := runtime.SizeInputToOptions(input) - _ = options - var n int - var l int - _ = l - l = len(x.Index) - if l > 0 { - n += 1 + l + runtime.Sov(uint64(l)) - } - l = len(x.Name) - if l > 0 { - n += 1 + l + runtime.Sov(uint64(l)) - } - if x.unknownFields != nil { - n += len(x.unknownFields) - } - return protoiface.SizeOutput{ - NoUnkeyedLiterals: input.NoUnkeyedLiterals, - Size: n, - } - } - - marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { - x := input.Message.Interface().(*Service) - if x == nil { - return protoiface.MarshalOutput{ - NoUnkeyedLiterals: input.NoUnkeyedLiterals, - Buf: input.Buf, - }, nil - } - options := runtime.MarshalInputToOptions(input) - _ = options - size := options.Size(x) - dAtA := make([]byte, size) - i := len(dAtA) - _ = i - var l int - _ = l - if x.unknownFields != nil { - i -= len(x.unknownFields) - copy(dAtA[i:], x.unknownFields) - } - if len(x.Name) > 0 { - i -= len(x.Name) - copy(dAtA[i:], x.Name) - i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Name))) - i-- - dAtA[i] = 0x12 - } - if len(x.Index) > 0 { - i -= len(x.Index) - copy(dAtA[i:], x.Index) - i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Index))) - i-- - dAtA[i] = 0xa - } - if input.Buf != nil { - input.Buf = append(input.Buf, dAtA...) - } else { - input.Buf = dAtA - } - return protoiface.MarshalOutput{ - NoUnkeyedLiterals: input.NoUnkeyedLiterals, - Buf: input.Buf, - }, nil - } - unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { - x := input.Message.Interface().(*Service) - if x == nil { - return protoiface.UnmarshalOutput{ - NoUnkeyedLiterals: input.NoUnkeyedLiterals, - Flags: input.Flags, - }, nil - } - options := runtime.UnmarshalInputToOptions(input) - _ = options - dAtA := input.Buf - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow - } - if iNdEx >= l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: Service: wiretype end group for non-group") - } - if fieldNum <= 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: Service: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow - } - if iNdEx >= l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength - } - if postIndex > l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - x.Index = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow - } - if iNdEx >= l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength - } - if postIndex > l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - x.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := runtime.Skip(dAtA[iNdEx:]) - if err != nil { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength - } - if (iNdEx + skippy) > l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - if !options.DiscardUnknown { - x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - } - iNdEx += skippy - } - } - - if iNdEx > l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil - } - return &protoiface.Methods{ - NoUnkeyedLiterals: struct{}{}, - Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, - Size: size, - Marshal: marshal, - Unmarshal: unmarshal, - Merge: nil, - CheckInitialized: nil, - } -} - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.0 -// protoc (unknown) -// source: poktroll/service/service.proto - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type Service struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Index string `protobuf:"bytes,1,opt,name=index,proto3" json:"index,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *Service) Reset() { - *x = Service{} - if protoimpl.UnsafeEnabled { - mi := &file_poktroll_service_service_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Service) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Service) ProtoMessage() {} - -// Deprecated: Use Service.ProtoReflect.Descriptor instead. -func (*Service) Descriptor() ([]byte, []int) { - return file_poktroll_service_service_proto_rawDescGZIP(), []int{0} -} - -func (x *Service) GetIndex() string { - if x != nil { - return x.Index - } - return "" -} - -func (x *Service) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -var File_poktroll_service_service_proto protoreflect.FileDescriptor - -var file_poktroll_service_service_proto_rawDesc = []byte{ - 0x0a, 0x1e, 0x70, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x12, 0x10, 0x70, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x22, 0x33, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0xa8, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, - 0x70, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x42, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x21, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x70, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x2f, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0xa2, 0x02, 0x03, 0x50, 0x53, 0x58, 0xaa, 0x02, 0x10, 0x50, 0x6f, 0x6b, 0x74, - 0x72, 0x6f, 0x6c, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xca, 0x02, 0x10, 0x50, - 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x5c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xe2, - 0x02, 0x1c, 0x50, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x5c, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, - 0x11, 0x50, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x3a, 0x3a, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_poktroll_service_service_proto_rawDescOnce sync.Once - file_poktroll_service_service_proto_rawDescData = file_poktroll_service_service_proto_rawDesc -) - -func file_poktroll_service_service_proto_rawDescGZIP() []byte { - file_poktroll_service_service_proto_rawDescOnce.Do(func() { - file_poktroll_service_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_poktroll_service_service_proto_rawDescData) - }) - return file_poktroll_service_service_proto_rawDescData -} - -var file_poktroll_service_service_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_poktroll_service_service_proto_goTypes = []interface{}{ - (*Service)(nil), // 0: poktroll.service.Service -} -var file_poktroll_service_service_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_poktroll_service_service_proto_init() } -func file_poktroll_service_service_proto_init() { - if File_poktroll_service_service_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_poktroll_service_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Service); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_poktroll_service_service_proto_rawDesc, - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_poktroll_service_service_proto_goTypes, - DependencyIndexes: file_poktroll_service_service_proto_depIdxs, - MessageInfos: file_poktroll_service_service_proto_msgTypes, - }.Build() - File_poktroll_service_service_proto = out.File - file_poktroll_service_service_proto_rawDesc = nil - file_poktroll_service_service_proto_goTypes = nil - file_poktroll_service_service_proto_depIdxs = nil -} diff --git a/api/poktroll/session/session.pulsar.go b/api/poktroll/session/session.pulsar.go index c0a424878..b4fad060b 100644 --- a/api/poktroll/session/session.pulsar.go +++ b/api/poktroll/session/session.pulsar.go @@ -19,8 +19,8 @@ var ( md_SessionHeader protoreflect.MessageDescriptor fd_SessionHeader_application_address protoreflect.FieldDescriptor fd_SessionHeader_service protoreflect.FieldDescriptor - fd_SessionHeader_session_start_block_height protoreflect.FieldDescriptor fd_SessionHeader_session_id protoreflect.FieldDescriptor + fd_SessionHeader_session_start_block_height protoreflect.FieldDescriptor fd_SessionHeader_session_end_block_height protoreflect.FieldDescriptor ) @@ -29,8 +29,8 @@ func init() { md_SessionHeader = File_poktroll_session_session_proto.Messages().ByName("SessionHeader") fd_SessionHeader_application_address = md_SessionHeader.Fields().ByName("application_address") fd_SessionHeader_service = md_SessionHeader.Fields().ByName("service") - fd_SessionHeader_session_start_block_height = md_SessionHeader.Fields().ByName("session_start_block_height") fd_SessionHeader_session_id = md_SessionHeader.Fields().ByName("session_id") + fd_SessionHeader_session_start_block_height = md_SessionHeader.Fields().ByName("session_start_block_height") fd_SessionHeader_session_end_block_height = md_SessionHeader.Fields().ByName("session_end_block_height") } @@ -111,18 +111,18 @@ func (x *fastReflection_SessionHeader) Range(f func(protoreflect.FieldDescriptor return } } - if x.SessionStartBlockHeight != int64(0) { - value := protoreflect.ValueOfInt64(x.SessionStartBlockHeight) - if !f(fd_SessionHeader_session_start_block_height, value) { - return - } - } if x.SessionId != "" { value := protoreflect.ValueOfString(x.SessionId) if !f(fd_SessionHeader_session_id, value) { return } } + if x.SessionStartBlockHeight != int64(0) { + value := protoreflect.ValueOfInt64(x.SessionStartBlockHeight) + if !f(fd_SessionHeader_session_start_block_height, value) { + return + } + } if x.SessionEndBlockHeight != int64(0) { value := protoreflect.ValueOfInt64(x.SessionEndBlockHeight) if !f(fd_SessionHeader_session_end_block_height, value) { @@ -148,10 +148,10 @@ func (x *fastReflection_SessionHeader) Has(fd protoreflect.FieldDescriptor) bool return x.ApplicationAddress != "" case "poktroll.session.SessionHeader.service": return x.Service != nil - case "poktroll.session.SessionHeader.session_start_block_height": - return x.SessionStartBlockHeight != int64(0) case "poktroll.session.SessionHeader.session_id": return x.SessionId != "" + case "poktroll.session.SessionHeader.session_start_block_height": + return x.SessionStartBlockHeight != int64(0) case "poktroll.session.SessionHeader.session_end_block_height": return x.SessionEndBlockHeight != int64(0) default: @@ -174,10 +174,10 @@ func (x *fastReflection_SessionHeader) Clear(fd protoreflect.FieldDescriptor) { x.ApplicationAddress = "" case "poktroll.session.SessionHeader.service": x.Service = nil - case "poktroll.session.SessionHeader.session_start_block_height": - x.SessionStartBlockHeight = int64(0) case "poktroll.session.SessionHeader.session_id": x.SessionId = "" + case "poktroll.session.SessionHeader.session_start_block_height": + x.SessionStartBlockHeight = int64(0) case "poktroll.session.SessionHeader.session_end_block_height": x.SessionEndBlockHeight = int64(0) default: @@ -202,12 +202,12 @@ func (x *fastReflection_SessionHeader) Get(descriptor protoreflect.FieldDescript case "poktroll.session.SessionHeader.service": value := x.Service return protoreflect.ValueOfMessage(value.ProtoReflect()) - case "poktroll.session.SessionHeader.session_start_block_height": - value := x.SessionStartBlockHeight - return protoreflect.ValueOfInt64(value) case "poktroll.session.SessionHeader.session_id": value := x.SessionId return protoreflect.ValueOfString(value) + case "poktroll.session.SessionHeader.session_start_block_height": + value := x.SessionStartBlockHeight + return protoreflect.ValueOfInt64(value) case "poktroll.session.SessionHeader.session_end_block_height": value := x.SessionEndBlockHeight return protoreflect.ValueOfInt64(value) @@ -235,10 +235,10 @@ func (x *fastReflection_SessionHeader) Set(fd protoreflect.FieldDescriptor, valu x.ApplicationAddress = value.Interface().(string) case "poktroll.session.SessionHeader.service": x.Service = value.Message().Interface().(*shared.Service) - case "poktroll.session.SessionHeader.session_start_block_height": - x.SessionStartBlockHeight = value.Int() case "poktroll.session.SessionHeader.session_id": x.SessionId = value.Interface().(string) + case "poktroll.session.SessionHeader.session_start_block_height": + x.SessionStartBlockHeight = value.Int() case "poktroll.session.SessionHeader.session_end_block_height": x.SessionEndBlockHeight = value.Int() default: @@ -268,10 +268,10 @@ func (x *fastReflection_SessionHeader) Mutable(fd protoreflect.FieldDescriptor) return protoreflect.ValueOfMessage(x.Service.ProtoReflect()) case "poktroll.session.SessionHeader.application_address": panic(fmt.Errorf("field application_address of message poktroll.session.SessionHeader is not mutable")) - case "poktroll.session.SessionHeader.session_start_block_height": - panic(fmt.Errorf("field session_start_block_height of message poktroll.session.SessionHeader is not mutable")) case "poktroll.session.SessionHeader.session_id": panic(fmt.Errorf("field session_id of message poktroll.session.SessionHeader is not mutable")) + case "poktroll.session.SessionHeader.session_start_block_height": + panic(fmt.Errorf("field session_start_block_height of message poktroll.session.SessionHeader is not mutable")) case "poktroll.session.SessionHeader.session_end_block_height": panic(fmt.Errorf("field session_end_block_height of message poktroll.session.SessionHeader is not mutable")) default: @@ -292,10 +292,10 @@ func (x *fastReflection_SessionHeader) NewField(fd protoreflect.FieldDescriptor) case "poktroll.session.SessionHeader.service": m := new(shared.Service) return protoreflect.ValueOfMessage(m.ProtoReflect()) - case "poktroll.session.SessionHeader.session_start_block_height": - return protoreflect.ValueOfInt64(int64(0)) case "poktroll.session.SessionHeader.session_id": return protoreflect.ValueOfString("") + case "poktroll.session.SessionHeader.session_start_block_height": + return protoreflect.ValueOfInt64(int64(0)) case "poktroll.session.SessionHeader.session_end_block_height": return protoreflect.ValueOfInt64(int64(0)) default: @@ -375,13 +375,13 @@ func (x *fastReflection_SessionHeader) ProtoMethods() *protoiface.Methods { l = options.Size(x.Service) n += 1 + l + runtime.Sov(uint64(l)) } - if x.SessionStartBlockHeight != 0 { - n += 1 + runtime.Sov(uint64(x.SessionStartBlockHeight)) - } l = len(x.SessionId) if l > 0 { n += 1 + l + runtime.Sov(uint64(l)) } + if x.SessionStartBlockHeight != 0 { + n += 1 + runtime.Sov(uint64(x.SessionStartBlockHeight)) + } if x.SessionEndBlockHeight != 0 { n += 1 + runtime.Sov(uint64(x.SessionEndBlockHeight)) } @@ -419,17 +419,17 @@ func (x *fastReflection_SessionHeader) ProtoMethods() *protoiface.Methods { i-- dAtA[i] = 0x28 } + if x.SessionStartBlockHeight != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.SessionStartBlockHeight)) + i-- + dAtA[i] = 0x20 + } if len(x.SessionId) > 0 { i -= len(x.SessionId) copy(dAtA[i:], x.SessionId) i = runtime.EncodeVarint(dAtA, i, uint64(len(x.SessionId))) i-- - dAtA[i] = 0x22 - } - if x.SessionStartBlockHeight != 0 { - i = runtime.EncodeVarint(dAtA, i, uint64(x.SessionStartBlockHeight)) - i-- - dAtA[i] = 0x18 + dAtA[i] = 0x1a } if x.Service != nil { encoded, err := options.Marshal(x.Service) @@ -570,25 +570,6 @@ func (x *fastReflection_SessionHeader) ProtoMethods() *protoiface.Methods { } iNdEx = postIndex case 3: - if wireType != 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field SessionStartBlockHeight", wireType) - } - x.SessionStartBlockHeight = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow - } - if iNdEx >= l { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - x.SessionStartBlockHeight |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: if wireType != 2 { return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field SessionId", wireType) } @@ -620,6 +601,25 @@ func (x *fastReflection_SessionHeader) ProtoMethods() *protoiface.Methods { } x.SessionId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field SessionStartBlockHeight", wireType) + } + x.SessionStartBlockHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.SessionStartBlockHeight |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } case 5: if wireType != 0 { return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field SessionEndBlockHeight", wireType) @@ -1506,12 +1506,16 @@ type SessionHeader struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ApplicationAddress string `protobuf:"bytes,1,opt,name=application_address,json=applicationAddress,proto3" json:"application_address,omitempty"` // The Bech32 address of the application using cosmos' ScalarDescriptor to ensure deterministic encoding - Service *shared.Service `protobuf:"bytes,2,opt,name=service,proto3" json:"service,omitempty"` // The service this session is for - SessionStartBlockHeight int64 `protobuf:"varint,3,opt,name=session_start_block_height,json=sessionStartBlockHeight,proto3" json:"session_start_block_height,omitempty"` // The height at which this session started + ApplicationAddress string `protobuf:"bytes,1,opt,name=application_address,json=applicationAddress,proto3" json:"application_address,omitempty"` // The Bech32 address of the application using cosmos' ScalarDescriptor to ensure deterministic encoding + Service *shared.Service `protobuf:"bytes,2,opt,name=service,proto3" json:"service,omitempty"` // The service this session is for // NOTE: session_id can be derived from the above values using on-chain but is included in the header for convenience - SessionId string `protobuf:"bytes,4,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"` // A unique pseudoranom ID for this session - SessionEndBlockHeight int64 `protobuf:"varint,5,opt,name=session_end_block_height,json=sessionEndBlockHeight,proto3" json:"session_end_block_height,omitempty"` // The height at which this session ended, this is the last block of the session + SessionId string `protobuf:"bytes,3,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"` // A unique pseudoranom ID for this session + SessionStartBlockHeight int64 `protobuf:"varint,4,opt,name=session_start_block_height,json=sessionStartBlockHeight,proto3" json:"session_start_block_height,omitempty"` // The height at which this session started + // Note that`session_end_block_height` is a derivative of (`start` + `num_blocks_per_session`) + // as goverened by on-chain params at the time of the session start. + // It is stored as an additional field to simplofy business logic in case + // the number of blocks_per_session changes during the session. + SessionEndBlockHeight int64 `protobuf:"varint,5,opt,name=session_end_block_height,json=sessionEndBlockHeight,proto3" json:"session_end_block_height,omitempty"` // The height at which this session ended, this is the last block of the session } func (x *SessionHeader) Reset() { @@ -1548,18 +1552,18 @@ func (x *SessionHeader) GetService() *shared.Service { return nil } -func (x *SessionHeader) GetSessionStartBlockHeight() int64 { +func (x *SessionHeader) GetSessionId() string { if x != nil { - return x.SessionStartBlockHeight + return x.SessionId } - return 0 + return "" } -func (x *SessionHeader) GetSessionId() string { +func (x *SessionHeader) GetSessionStartBlockHeight() int64 { if x != nil { - return x.SessionId + return x.SessionStartBlockHeight } - return "" + return 0 } func (x *SessionHeader) GetSessionEndBlockHeight() int64 { @@ -1669,13 +1673,13 @@ var file_poktroll_session_session_proto_rawDesc = []byte{ 0x73, 0x12, 0x32, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3b, 0x0a, 0x1a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x37, 0x0a, 0x18, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x64, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x1a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x12, 0x37, 0x0a, 0x18, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0xbb, 0x02, 0x0a, 0x07, 0x53, diff --git a/api/poktroll/tokenomics/event.pulsar.go b/api/poktroll/tokenomics/event.pulsar.go new file mode 100644 index 000000000..29cb934ef --- /dev/null +++ b/api/poktroll/tokenomics/event.pulsar.go @@ -0,0 +1,1263 @@ +// Code generated by protoc-gen-go-pulsar. DO NOT EDIT. +package tokenomics + +import ( + proof "github.com/pokt-network/poktroll/api/poktroll/proof" + fmt "fmt" + runtime "github.com/cosmos/cosmos-proto/runtime" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoiface "google.golang.org/protobuf/runtime/protoiface" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + io "io" + reflect "reflect" + sync "sync" +) + +var ( + md_EventClaimExpired protoreflect.MessageDescriptor + fd_EventClaimExpired_claim protoreflect.FieldDescriptor + fd_EventClaimExpired_compute_units protoreflect.FieldDescriptor +) + +func init() { + file_poktroll_tokenomics_event_proto_init() + md_EventClaimExpired = File_poktroll_tokenomics_event_proto.Messages().ByName("EventClaimExpired") + fd_EventClaimExpired_claim = md_EventClaimExpired.Fields().ByName("claim") + fd_EventClaimExpired_compute_units = md_EventClaimExpired.Fields().ByName("compute_units") +} + +var _ protoreflect.Message = (*fastReflection_EventClaimExpired)(nil) + +type fastReflection_EventClaimExpired EventClaimExpired + +func (x *EventClaimExpired) ProtoReflect() protoreflect.Message { + return (*fastReflection_EventClaimExpired)(x) +} + +func (x *EventClaimExpired) slowProtoReflect() protoreflect.Message { + mi := &file_poktroll_tokenomics_event_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_EventClaimExpired_messageType fastReflection_EventClaimExpired_messageType +var _ protoreflect.MessageType = fastReflection_EventClaimExpired_messageType{} + +type fastReflection_EventClaimExpired_messageType struct{} + +func (x fastReflection_EventClaimExpired_messageType) Zero() protoreflect.Message { + return (*fastReflection_EventClaimExpired)(nil) +} +func (x fastReflection_EventClaimExpired_messageType) New() protoreflect.Message { + return new(fastReflection_EventClaimExpired) +} +func (x fastReflection_EventClaimExpired_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_EventClaimExpired +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_EventClaimExpired) Descriptor() protoreflect.MessageDescriptor { + return md_EventClaimExpired +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_EventClaimExpired) Type() protoreflect.MessageType { + return _fastReflection_EventClaimExpired_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_EventClaimExpired) New() protoreflect.Message { + return new(fastReflection_EventClaimExpired) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_EventClaimExpired) Interface() protoreflect.ProtoMessage { + return (*EventClaimExpired)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_EventClaimExpired) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Claim != nil { + value := protoreflect.ValueOfMessage(x.Claim.ProtoReflect()) + if !f(fd_EventClaimExpired_claim, value) { + return + } + } + if x.ComputeUnits != uint64(0) { + value := protoreflect.ValueOfUint64(x.ComputeUnits) + if !f(fd_EventClaimExpired_compute_units, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_EventClaimExpired) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "poktroll.tokenomics.EventClaimExpired.claim": + return x.Claim != nil + case "poktroll.tokenomics.EventClaimExpired.compute_units": + return x.ComputeUnits != uint64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: poktroll.tokenomics.EventClaimExpired")) + } + panic(fmt.Errorf("message poktroll.tokenomics.EventClaimExpired does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventClaimExpired) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "poktroll.tokenomics.EventClaimExpired.claim": + x.Claim = nil + case "poktroll.tokenomics.EventClaimExpired.compute_units": + x.ComputeUnits = uint64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: poktroll.tokenomics.EventClaimExpired")) + } + panic(fmt.Errorf("message poktroll.tokenomics.EventClaimExpired does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_EventClaimExpired) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "poktroll.tokenomics.EventClaimExpired.claim": + value := x.Claim + return protoreflect.ValueOfMessage(value.ProtoReflect()) + case "poktroll.tokenomics.EventClaimExpired.compute_units": + value := x.ComputeUnits + return protoreflect.ValueOfUint64(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: poktroll.tokenomics.EventClaimExpired")) + } + panic(fmt.Errorf("message poktroll.tokenomics.EventClaimExpired does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventClaimExpired) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "poktroll.tokenomics.EventClaimExpired.claim": + x.Claim = value.Message().Interface().(*proof.Claim) + case "poktroll.tokenomics.EventClaimExpired.compute_units": + x.ComputeUnits = value.Uint() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: poktroll.tokenomics.EventClaimExpired")) + } + panic(fmt.Errorf("message poktroll.tokenomics.EventClaimExpired does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventClaimExpired) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "poktroll.tokenomics.EventClaimExpired.claim": + if x.Claim == nil { + x.Claim = new(proof.Claim) + } + return protoreflect.ValueOfMessage(x.Claim.ProtoReflect()) + case "poktroll.tokenomics.EventClaimExpired.compute_units": + panic(fmt.Errorf("field compute_units of message poktroll.tokenomics.EventClaimExpired is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: poktroll.tokenomics.EventClaimExpired")) + } + panic(fmt.Errorf("message poktroll.tokenomics.EventClaimExpired does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_EventClaimExpired) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "poktroll.tokenomics.EventClaimExpired.claim": + m := new(proof.Claim) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + case "poktroll.tokenomics.EventClaimExpired.compute_units": + return protoreflect.ValueOfUint64(uint64(0)) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: poktroll.tokenomics.EventClaimExpired")) + } + panic(fmt.Errorf("message poktroll.tokenomics.EventClaimExpired does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_EventClaimExpired) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in poktroll.tokenomics.EventClaimExpired", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_EventClaimExpired) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventClaimExpired) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_EventClaimExpired) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_EventClaimExpired) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*EventClaimExpired) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.Claim != nil { + l = options.Size(x.Claim) + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.ComputeUnits != 0 { + n += 1 + runtime.Sov(uint64(x.ComputeUnits)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*EventClaimExpired) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.ComputeUnits != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.ComputeUnits)) + i-- + dAtA[i] = 0x10 + } + if x.Claim != nil { + encoded, err := options.Marshal(x.Claim) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*EventClaimExpired) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: EventClaimExpired: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: EventClaimExpired: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Claim", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if x.Claim == nil { + x.Claim = &proof.Claim{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Claim); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ComputeUnits", wireType) + } + x.ComputeUnits = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.ComputeUnits |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_EventClaimSettled protoreflect.MessageDescriptor + fd_EventClaimSettled_claim protoreflect.FieldDescriptor + fd_EventClaimSettled_compute_units protoreflect.FieldDescriptor + fd_EventClaimSettled_proof_required protoreflect.FieldDescriptor +) + +func init() { + file_poktroll_tokenomics_event_proto_init() + md_EventClaimSettled = File_poktroll_tokenomics_event_proto.Messages().ByName("EventClaimSettled") + fd_EventClaimSettled_claim = md_EventClaimSettled.Fields().ByName("claim") + fd_EventClaimSettled_compute_units = md_EventClaimSettled.Fields().ByName("compute_units") + fd_EventClaimSettled_proof_required = md_EventClaimSettled.Fields().ByName("proof_required") +} + +var _ protoreflect.Message = (*fastReflection_EventClaimSettled)(nil) + +type fastReflection_EventClaimSettled EventClaimSettled + +func (x *EventClaimSettled) ProtoReflect() protoreflect.Message { + return (*fastReflection_EventClaimSettled)(x) +} + +func (x *EventClaimSettled) slowProtoReflect() protoreflect.Message { + mi := &file_poktroll_tokenomics_event_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_EventClaimSettled_messageType fastReflection_EventClaimSettled_messageType +var _ protoreflect.MessageType = fastReflection_EventClaimSettled_messageType{} + +type fastReflection_EventClaimSettled_messageType struct{} + +func (x fastReflection_EventClaimSettled_messageType) Zero() protoreflect.Message { + return (*fastReflection_EventClaimSettled)(nil) +} +func (x fastReflection_EventClaimSettled_messageType) New() protoreflect.Message { + return new(fastReflection_EventClaimSettled) +} +func (x fastReflection_EventClaimSettled_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_EventClaimSettled +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_EventClaimSettled) Descriptor() protoreflect.MessageDescriptor { + return md_EventClaimSettled +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_EventClaimSettled) Type() protoreflect.MessageType { + return _fastReflection_EventClaimSettled_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_EventClaimSettled) New() protoreflect.Message { + return new(fastReflection_EventClaimSettled) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_EventClaimSettled) Interface() protoreflect.ProtoMessage { + return (*EventClaimSettled)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_EventClaimSettled) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Claim != nil { + value := protoreflect.ValueOfMessage(x.Claim.ProtoReflect()) + if !f(fd_EventClaimSettled_claim, value) { + return + } + } + if x.ComputeUnits != uint64(0) { + value := protoreflect.ValueOfUint64(x.ComputeUnits) + if !f(fd_EventClaimSettled_compute_units, value) { + return + } + } + if x.ProofRequired != false { + value := protoreflect.ValueOfBool(x.ProofRequired) + if !f(fd_EventClaimSettled_proof_required, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_EventClaimSettled) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "poktroll.tokenomics.EventClaimSettled.claim": + return x.Claim != nil + case "poktroll.tokenomics.EventClaimSettled.compute_units": + return x.ComputeUnits != uint64(0) + case "poktroll.tokenomics.EventClaimSettled.proof_required": + return x.ProofRequired != false + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: poktroll.tokenomics.EventClaimSettled")) + } + panic(fmt.Errorf("message poktroll.tokenomics.EventClaimSettled does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventClaimSettled) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "poktroll.tokenomics.EventClaimSettled.claim": + x.Claim = nil + case "poktroll.tokenomics.EventClaimSettled.compute_units": + x.ComputeUnits = uint64(0) + case "poktroll.tokenomics.EventClaimSettled.proof_required": + x.ProofRequired = false + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: poktroll.tokenomics.EventClaimSettled")) + } + panic(fmt.Errorf("message poktroll.tokenomics.EventClaimSettled does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_EventClaimSettled) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "poktroll.tokenomics.EventClaimSettled.claim": + value := x.Claim + return protoreflect.ValueOfMessage(value.ProtoReflect()) + case "poktroll.tokenomics.EventClaimSettled.compute_units": + value := x.ComputeUnits + return protoreflect.ValueOfUint64(value) + case "poktroll.tokenomics.EventClaimSettled.proof_required": + value := x.ProofRequired + return protoreflect.ValueOfBool(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: poktroll.tokenomics.EventClaimSettled")) + } + panic(fmt.Errorf("message poktroll.tokenomics.EventClaimSettled does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventClaimSettled) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "poktroll.tokenomics.EventClaimSettled.claim": + x.Claim = value.Message().Interface().(*proof.Claim) + case "poktroll.tokenomics.EventClaimSettled.compute_units": + x.ComputeUnits = value.Uint() + case "poktroll.tokenomics.EventClaimSettled.proof_required": + x.ProofRequired = value.Bool() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: poktroll.tokenomics.EventClaimSettled")) + } + panic(fmt.Errorf("message poktroll.tokenomics.EventClaimSettled does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventClaimSettled) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "poktroll.tokenomics.EventClaimSettled.claim": + if x.Claim == nil { + x.Claim = new(proof.Claim) + } + return protoreflect.ValueOfMessage(x.Claim.ProtoReflect()) + case "poktroll.tokenomics.EventClaimSettled.compute_units": + panic(fmt.Errorf("field compute_units of message poktroll.tokenomics.EventClaimSettled is not mutable")) + case "poktroll.tokenomics.EventClaimSettled.proof_required": + panic(fmt.Errorf("field proof_required of message poktroll.tokenomics.EventClaimSettled is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: poktroll.tokenomics.EventClaimSettled")) + } + panic(fmt.Errorf("message poktroll.tokenomics.EventClaimSettled does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_EventClaimSettled) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "poktroll.tokenomics.EventClaimSettled.claim": + m := new(proof.Claim) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + case "poktroll.tokenomics.EventClaimSettled.compute_units": + return protoreflect.ValueOfUint64(uint64(0)) + case "poktroll.tokenomics.EventClaimSettled.proof_required": + return protoreflect.ValueOfBool(false) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: poktroll.tokenomics.EventClaimSettled")) + } + panic(fmt.Errorf("message poktroll.tokenomics.EventClaimSettled does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_EventClaimSettled) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in poktroll.tokenomics.EventClaimSettled", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_EventClaimSettled) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventClaimSettled) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_EventClaimSettled) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_EventClaimSettled) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*EventClaimSettled) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.Claim != nil { + l = options.Size(x.Claim) + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.ComputeUnits != 0 { + n += 1 + runtime.Sov(uint64(x.ComputeUnits)) + } + if x.ProofRequired { + n += 2 + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*EventClaimSettled) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.ProofRequired { + i-- + if x.ProofRequired { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if x.ComputeUnits != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.ComputeUnits)) + i-- + dAtA[i] = 0x10 + } + if x.Claim != nil { + encoded, err := options.Marshal(x.Claim) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*EventClaimSettled) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: EventClaimSettled: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: EventClaimSettled: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Claim", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if x.Claim == nil { + x.Claim = &proof.Claim{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Claim); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ComputeUnits", wireType) + } + x.ComputeUnits = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.ComputeUnits |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ProofRequired", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + x.ProofRequired = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.0 +// protoc (unknown) +// source: poktroll/tokenomics/event.proto + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// EventClaimExpired is an event emitted during settlement whenever a claim requiring +// an on-chain proof doesn't have one. The claim cannot be settled, leading to that work +// never being rewarded. +type EventClaimExpired struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Claim *proof.Claim `protobuf:"bytes,1,opt,name=claim,proto3" json:"claim,omitempty"` + ComputeUnits uint64 `protobuf:"varint,2,opt,name=compute_units,json=computeUnits,proto3" json:"compute_units,omitempty"` +} + +func (x *EventClaimExpired) Reset() { + *x = EventClaimExpired{} + if protoimpl.UnsafeEnabled { + mi := &file_poktroll_tokenomics_event_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EventClaimExpired) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EventClaimExpired) ProtoMessage() {} + +// Deprecated: Use EventClaimExpired.ProtoReflect.Descriptor instead. +func (*EventClaimExpired) Descriptor() ([]byte, []int) { + return file_poktroll_tokenomics_event_proto_rawDescGZIP(), []int{0} +} + +func (x *EventClaimExpired) GetClaim() *proof.Claim { + if x != nil { + return x.Claim + } + return nil +} + +func (x *EventClaimExpired) GetComputeUnits() uint64 { + if x != nil { + return x.ComputeUnits + } + return 0 +} + +// EventClaimSettled is an event emitted whenever a claim is settled. +// The proof_required determines whether the claim requires a proof that has been submitted or not +type EventClaimSettled struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Claim *proof.Claim `protobuf:"bytes,1,opt,name=claim,proto3" json:"claim,omitempty"` + ComputeUnits uint64 `protobuf:"varint,2,opt,name=compute_units,json=computeUnits,proto3" json:"compute_units,omitempty"` + ProofRequired bool `protobuf:"varint,3,opt,name=proof_required,json=proofRequired,proto3" json:"proof_required,omitempty"` +} + +func (x *EventClaimSettled) Reset() { + *x = EventClaimSettled{} + if protoimpl.UnsafeEnabled { + mi := &file_poktroll_tokenomics_event_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EventClaimSettled) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EventClaimSettled) ProtoMessage() {} + +// Deprecated: Use EventClaimSettled.ProtoReflect.Descriptor instead. +func (*EventClaimSettled) Descriptor() ([]byte, []int) { + return file_poktroll_tokenomics_event_proto_rawDescGZIP(), []int{1} +} + +func (x *EventClaimSettled) GetClaim() *proof.Claim { + if x != nil { + return x.Claim + } + return nil +} + +func (x *EventClaimSettled) GetComputeUnits() uint64 { + if x != nil { + return x.ComputeUnits + } + return 0 +} + +func (x *EventClaimSettled) GetProofRequired() bool { + if x != nil { + return x.ProofRequired + } + return false +} + +var File_poktroll_tokenomics_event_proto protoreflect.FileDescriptor + +var file_poktroll_tokenomics_event_proto_rawDesc = []byte{ + 0x0a, 0x1f, 0x70, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x13, 0x70, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x2e, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x1a, 0x1a, 0x70, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, + 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x2f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0x65, 0x0a, 0x11, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, + 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x69, 0x6d, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x52, 0x05, 0x63, + 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x5f, + 0x75, 0x6e, 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x63, 0x6f, 0x6d, + 0x70, 0x75, 0x74, 0x65, 0x55, 0x6e, 0x69, 0x74, 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x11, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x12, + 0x2b, 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x70, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x2e, + 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x52, 0x05, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x23, 0x0a, 0x0d, + 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x55, 0x6e, 0x69, 0x74, + 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x42, 0xb8, 0x01, 0x0a, 0x17, 0x63, 0x6f, 0x6d, + 0x2e, 0x70, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x2e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, + 0x6d, 0x69, 0x63, 0x73, 0x42, 0x0a, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x24, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x2f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0xa2, 0x02, 0x03, 0x50, 0x54, 0x58, 0xaa, 0x02, + 0x13, 0x50, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, + 0x6d, 0x69, 0x63, 0x73, 0xca, 0x02, 0x13, 0x50, 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x5c, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0xe2, 0x02, 0x1f, 0x50, 0x6f, 0x6b, + 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x5c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x14, 0x50, + 0x6f, 0x6b, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x3a, 0x3a, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, + 0x69, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_poktroll_tokenomics_event_proto_rawDescOnce sync.Once + file_poktroll_tokenomics_event_proto_rawDescData = file_poktroll_tokenomics_event_proto_rawDesc +) + +func file_poktroll_tokenomics_event_proto_rawDescGZIP() []byte { + file_poktroll_tokenomics_event_proto_rawDescOnce.Do(func() { + file_poktroll_tokenomics_event_proto_rawDescData = protoimpl.X.CompressGZIP(file_poktroll_tokenomics_event_proto_rawDescData) + }) + return file_poktroll_tokenomics_event_proto_rawDescData +} + +var file_poktroll_tokenomics_event_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_poktroll_tokenomics_event_proto_goTypes = []interface{}{ + (*EventClaimExpired)(nil), // 0: poktroll.tokenomics.EventClaimExpired + (*EventClaimSettled)(nil), // 1: poktroll.tokenomics.EventClaimSettled + (*proof.Claim)(nil), // 2: poktroll.proof.Claim +} +var file_poktroll_tokenomics_event_proto_depIdxs = []int32{ + 2, // 0: poktroll.tokenomics.EventClaimExpired.claim:type_name -> poktroll.proof.Claim + 2, // 1: poktroll.tokenomics.EventClaimSettled.claim:type_name -> poktroll.proof.Claim + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_poktroll_tokenomics_event_proto_init() } +func file_poktroll_tokenomics_event_proto_init() { + if File_poktroll_tokenomics_event_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_poktroll_tokenomics_event_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EventClaimExpired); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_poktroll_tokenomics_event_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EventClaimSettled); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_poktroll_tokenomics_event_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_poktroll_tokenomics_event_proto_goTypes, + DependencyIndexes: file_poktroll_tokenomics_event_proto_depIdxs, + MessageInfos: file_poktroll_tokenomics_event_proto_msgTypes, + }.Build() + File_poktroll_tokenomics_event_proto = out.File + file_poktroll_tokenomics_event_proto_rawDesc = nil + file_poktroll_tokenomics_event_proto_goTypes = nil + file_poktroll_tokenomics_event_proto_depIdxs = nil +} diff --git a/app/app.go b/app/app.go index 66fe5ec05..aff96cb0c 100644 --- a/app/app.go +++ b/app/app.go @@ -1,6 +1,7 @@ package app import ( + // this line is used by starport scaffolding # stargate/app/moduleImport "io" "os" "path/filepath" @@ -53,6 +54,7 @@ import ( ibctransferkeeper "github.com/cosmos/ibc-go/v8/modules/apps/transfer/keeper" ibckeeper "github.com/cosmos/ibc-go/v8/modules/core/keeper" + "github.com/pokt-network/poktroll/docs" applicationmodulekeeper "github.com/pokt-network/poktroll/x/application/keeper" gatewaymodulekeeper "github.com/pokt-network/poktroll/x/gateway/keeper" proofmodulekeeper "github.com/pokt-network/poktroll/x/proof/keeper" @@ -60,10 +62,6 @@ import ( sessionmodulekeeper "github.com/pokt-network/poktroll/x/session/keeper" suppliermodulekeeper "github.com/pokt-network/poktroll/x/supplier/keeper" tokenomicsmodulekeeper "github.com/pokt-network/poktroll/x/tokenomics/keeper" - - // this line is used by starport scaffolding # stargate/app/moduleImport - - "github.com/pokt-network/poktroll/docs" ) const ( diff --git a/app/app_config.go b/app/app_config.go index fb5e1e833..5edce4972 100644 --- a/app/app_config.go +++ b/app/app_config.go @@ -1,6 +1,7 @@ package app import ( + // this line is used by starport scaffolding # stargate/app/moduleImport "time" runtimev1alpha1 "cosmossdk.io/api/cosmos/app/runtime/v1alpha1" @@ -69,6 +70,8 @@ import ( ibcfeetypes "github.com/cosmos/ibc-go/v8/modules/apps/29-fee/types" ibctransfertypes "github.com/cosmos/ibc-go/v8/modules/apps/transfer/types" ibcexported "github.com/cosmos/ibc-go/v8/modules/core/exported" + "google.golang.org/protobuf/types/known/durationpb" + applicationmodulev1 "github.com/pokt-network/poktroll/api/poktroll/application/module" gatewaymodulev1 "github.com/pokt-network/poktroll/api/poktroll/gateway/module" proofmodulev1 "github.com/pokt-network/poktroll/api/poktroll/proof/module" @@ -90,8 +93,6 @@ import ( suppliermoduletypes "github.com/pokt-network/poktroll/x/supplier/types" _ "github.com/pokt-network/poktroll/x/tokenomics/module" // import for side-effects tokenomicsmoduletypes "github.com/pokt-network/poktroll/x/tokenomics/types" - "google.golang.org/protobuf/types/known/durationpb" - // this line is used by starport scaffolding # stargate/app/moduleImport ) var ( diff --git a/config.yml b/config.yml index 3a67b94da..828c75f95 100644 --- a/config.yml +++ b/config.yml @@ -68,8 +68,8 @@ validators: config: moniker: "validator1" consensus: - timeout_commit: "1s" - timeout_propose: "1s" + timeout_commit: "2s" + timeout_propose: "2s" client: chain-id: poktroll @@ -91,6 +91,31 @@ genesis: min_deposit: - amount: "10000" denom: upokt + bank: + supply: + - amount: "1003000204" + denom: upokt + balances: + # Application module + - address: pokt1rl3gjgzexmplmds3tq3r3yk84zlwdl6djzgsvm + coins: + - amount: "1000068" # Equals to the total of all app stakes below + denom: upokt + # Supplier module + - address: pokt1j40dzzmn6cn9kxku7a5tjnud6hv37vesr5ccaa + coins: + - amount: "1000068" # Equals to the total of all supplier stakes below + denom: upokt + # Gateway module + - address: pokt1f6j7u6875p2cvyrgjr0d2uecyzah0kget9vlpl + coins: + - amount: "1000068" # Equals to the total of all gateway stakes below + denom: upokt + # Service module + - address: pokt1nhmtqf4gcmpxu0p6e53hpgtwj0llmsqpxtumcf + coins: + - amount: "1000000000" # Equals to one add_service_fee below + denom: upokt application: params: max_delegated_gateways: "7" @@ -102,7 +127,9 @@ genesis: id: anvil name: "" stake: - amount: "1000" + # NB: This value should be exactly 1upokt smaller than the value in + # `supplier1_stake_config.yaml` so that the stake command causes a state change. + amount: "1000068" denom: upokt supplier: supplierList: @@ -116,7 +143,17 @@ genesis: id: anvil name: "" stake: - amount: "1000" + # NB: This value should be exactly 1upokt smaller than the value in + # `application1_stake_config.yaml` so that the stake command causes a state change. + amount: "1000068" + denom: upokt + gateway: + gatewayList: + - address: pokt15vzxjqklzjtlz7lahe8z2dfe9nm5vxwwmscne4 + stake: + # NB: This value should be exactly 1upokt smaller than the value in + # `gateway1_stake_config.yaml` so that the stake command causes a state change. + amount: "1000068" denom: upokt service: params: diff --git a/e2e/tests/0_tokenomics.feature b/e2e/tests/0_tokenomics.feature new file mode 100644 index 000000000..ed2bfd837 --- /dev/null +++ b/e2e/tests/0_tokenomics.feature @@ -0,0 +1,27 @@ +# TODO_TECHDEBT: This file is called `0_tokenomics.feature` instead of +# `tokenomics.feature` to force it to run before other tests and ensure +# the corrctness of the numbers asserted on. For example, if another test +# crates a Claim but doesn't wait for it to be settled, the numbers will be +# incorrect. A good long-term solution for this would be debug endpoints +# that can be used to clear the state of the chain between tests. + +Feature: Tokenomics Namespace + + Scenario: Emissions equals burn when a claim is created and a valid proof is submitted and required + Given the user has the pocketd binary installed + And an account exists for "supplier1" + And the "supplier" account for "supplier1" is staked + And an account exists for "app1" + And the "application" account for "app1" is staked + When the supplier "supplier1" has serviced a session with "10" relays for service "anvil" for application "app1" + And the user should wait for the "proof" module "CreateClaim" Message to be submitted + And the user should wait for the "proof" module "SubmitProof" Message to be submitted + And the user should wait for the "tokenomics" module "ClaimSettled" Event to be broadcast + Then the account balance of "supplier1" should be "420" uPOKT "more" than before + And the "application" stake of "app1" should be "420" uPOKT "less" than before + + # TODO_ADDTEST: Implement the following scenarios + # Scenario: Emissions equals burn when a claim is created and a valid proof is submitted but not required + # Scenario: No emissions or burn when a claim is created and an invalid proof is submitted + # Scenario: No emissions or burn when a claim is created and a proof is required but is not submitted + # Scenario: No emissions or burn when no claim is created \ No newline at end of file diff --git a/e2e/tests/init_test.go b/e2e/tests/init_test.go index f1bcb422d..1f4d0e480 100644 --- a/e2e/tests/init_test.go +++ b/e2e/tests/init_test.go @@ -5,9 +5,10 @@ package e2e import ( "flag" "fmt" - "io/ioutil" "log" + "math" "os" + "path" "regexp" "strconv" "strings" @@ -16,7 +17,7 @@ import ( "cosmossdk.io/depinject" sdklog "cosmossdk.io/log" - tmcli "github.com/cometbft/cometbft/libs/cli" + cometcli "github.com/cometbft/cometbft/libs/cli" "github.com/cosmos/cosmos-sdk/codec" "github.com/regen-network/gocuke" "github.com/stretchr/testify/require" @@ -31,8 +32,9 @@ import ( ) var ( - addrRe *regexp.Regexp - amountRe *regexp.Regexp + addrRe *regexp.Regexp + amountRe *regexp.Regexp + addrAndAmountRe *regexp.Regexp accNameToAddrMap = make(map[string]string) accAddrToNameMap = make(map[string]string) @@ -48,6 +50,7 @@ var ( func init() { addrRe = regexp.MustCompile(`address:\s+(\S+)\s+name:\s+(\S+)`) amountRe = regexp.MustCompile(`amount:\s+"(.+?)"\s+denom:\s+upokt`) + addrAndAmountRe = regexp.MustCompile(`(?s)address: ([\w\d]+).*?stake:\s*amount: "(\d+)"`) flag.StringVar(&flagFeaturesPath, "features-path", "*.feature", "Specifies glob paths for the runner to look up .feature files") @@ -110,16 +113,12 @@ func (s *suite) ThePocketdBinaryShouldExitWithoutError() { func (s *suite) TheUserRunsTheCommand(cmd string) { cmds := strings.Split(cmd, " ") res, err := s.pocketd.RunCommand(cmds...) + require.NoError(s, err, "error running command %s", cmd) s.pocketd.result = res - if err != nil { - s.Fatalf("error running command %s: %s", cmd, err) - } } func (s *suite) TheUserShouldBeAbleToSeeStandardOutputContaining(arg1 string) { - if !strings.Contains(s.pocketd.result.Stdout, arg1) { - s.Fatalf("stdout must contain %s", arg1) - } + require.Contains(s, s.pocketd.result.Stdout, arg1) } func (s *suite) TheUserSendsUpoktFromAccountToAccount(amount int64, accName1, accName2 string) { @@ -135,44 +134,52 @@ func (s *suite) TheUserSendsUpoktFromAccountToAccount(amount int64, accName1, ac "-y", } res, err := s.pocketd.RunCommandOnHost("", args...) - if err != nil { - s.Fatalf("error sending upokt: %s", err) - } + require.NoError(s, err, "error sending upokt from %q to %q", accName1, accName2) s.pocketd.result = res } func (s *suite) TheAccountHasABalanceGreaterThanUpokt(accName string, amount int64) { bal := s.getAccBalance(accName) - if int64(bal) < amount { - s.Fatalf("account %s does not have enough upokt: %d < %d", accName, bal, amount) - } - s.scenarioState[accName] = bal // save the balance for later + require.Greaterf(s, bal, int(amount), "account %s does not have enough upokt", accName) + s.scenarioState[accBalanceKey(accName)] = bal // save the balance for later } func (s *suite) AnAccountExistsFor(accName string) { bal := s.getAccBalance(accName) - s.scenarioState[accName] = bal // save the balance for later + s.scenarioState[accBalanceKey(accName)] = bal // save the balance for later } -func (s *suite) TheAccountBalanceOfShouldBeUpoktThanBefore(accName string, amount int64, condition string) { - prev, ok := s.scenarioState[accName] - if !ok { - s.Fatalf("no previous balance found for %s", accName) - } +func (s *suite) TheStakeOfShouldBeUpoktThanBefore(actorType string, accName string, expectedStakeChange int64, condition string) { + // Get previous stake + stakeKey := accStakeKey(actorType, accName) + prevStakeAny, ok := s.scenarioState[stakeKey] + require.True(s, ok, "no previous stake found for %s", accName) + prevStake, ok := prevStakeAny.(int) + require.True(s, ok, "previous stake for %s is not an int", accName) + + // Get current stake + currStake, ok := s.getStakedAmount(actorType, accName) + require.True(s, ok, "no current stake found for %s", accName) + s.scenarioState[stakeKey] = currStake // save the stake for later + + // Validate the change in stake + s.validateAmountChange(prevStake, currStake, expectedStakeChange, accName, condition, "stake") +} - bal := s.getAccBalance(accName) - switch condition { - case "more": - if bal <= prev.(int) { - s.Fatalf("account %s expected to have more upokt but: %d <= %d", accName, bal, prev) - } - case "less": - if bal >= prev.(int) { - s.Fatalf("account %s expected to have less upokt but: %d >= %d", accName, bal, prev) - } - default: - s.Fatalf("unknown condition %s", condition) - } +func (s *suite) TheAccountBalanceOfShouldBeUpoktThanBefore(accName string, expectedStakeChange int64, condition string) { + // Get previous balance + balanceKey := accBalanceKey(accName) + prevBalanceAny, ok := s.scenarioState[balanceKey] + require.True(s, ok, "no previous balance found for %s", accName) + prevBalance, ok := prevBalanceAny.(int) + require.True(s, ok, "previous balance for %s is not an int", accName) + + // Get current balance + currBalance := s.getAccBalance(accName) + s.scenarioState[balanceKey] = currBalance // save the balance for later + + // Validate the change in stake + s.validateAmountChange(prevBalance, currBalance, expectedStakeChange, accName, condition, "balance") } func (s *suite) TheUserShouldWaitForSeconds(dur int64) { @@ -182,14 +189,12 @@ func (s *suite) TheUserShouldWaitForSeconds(dur int64) { func (s *suite) TheUserStakesAWithUpoktFromTheAccount(actorType string, amount int64, accName string) { // Create a temporary config file configPathPattern := fmt.Sprintf("%s_stake_config_*.yaml", accName) + configFile, err := os.CreateTemp("", configPathPattern) + require.NoError(s, err, "error creating config file in %q", path.Join(os.TempDir(), configPathPattern)) + configContent := fmt.Sprintf(`stake_amount: %d upokt`, amount) - configFile, err := ioutil.TempFile("", configPathPattern) - if err != nil { - s.Fatalf("error creating config file: %q", err) - } - if _, err = configFile.Write([]byte(configContent)); err != nil { - s.Fatalf("error writing config file: %q", err) - } + _, err = configFile.Write([]byte(configContent)) + require.NoError(s, err, "error writing config file %q", configFile.Name()) args := []string{ "tx", @@ -207,13 +212,8 @@ func (s *suite) TheUserStakesAWithUpoktFromTheAccount(actorType string, amount i // Remove the temporary config file err = os.Remove(configFile.Name()) - if err != nil { - s.Fatalf("error removing config file: %q", err) - } + require.NoError(s, err, "error removing config file %q", configFile.Name()) - if err != nil { - s.Fatalf("error staking %s: %s", actorType, err) - } s.pocketd.result = res } @@ -228,28 +228,29 @@ func (s *suite) TheUserUnstakesAFromTheAccount(actorType string, accName string) chainIdFlag, "-y", } + res, err := s.pocketd.RunCommandOnHost("", args...) - if err != nil { - s.Fatalf("error unstaking %s: %s", actorType, err) - } + require.NoError(s, err, "error unstaking %s", actorType) + s.pocketd.result = res } +func (s *suite) TheAccountForIsStaked(actorType, accName string) { + stakeAmount, ok := s.getStakedAmount(actorType, accName) + require.Truef(s, ok, "account %s of type %s SHOULD be staked", accName, actorType) + s.scenarioState[accStakeKey(actorType, accName)] = stakeAmount // save the stakeAmount for later +} + func (s *suite) TheForAccountIsNotStaked(actorType, accName string) { - found, _ := s.getStakedAmount(actorType, accName) - if found { - s.Fatalf("account %s should not be staked", accName) - } + _, ok := s.getStakedAmount(actorType, accName) + require.Falsef(s, ok, "account %s of type %s SHOULD NOT be staked", accName, actorType) } func (s *suite) TheForAccountIsStakedWithUpokt(actorType, accName string, amount int64) { - found, stakeAmount := s.getStakedAmount(actorType, accName) - if !found { - s.Fatalf("account %s should be staked", accName) - } - if int64(stakeAmount) != amount { - s.Fatalf("account %s stake amount is not %d", accName, amount) - } + stakeAmount, ok := s.getStakedAmount(actorType, accName) + require.Truef(s, ok, "account %s of type %s SHOULD be staked", accName, actorType) + require.Equalf(s, int64(stakeAmount), amount, "account %s stake amount is not %d", accName, amount) + s.scenarioState[accStakeKey(actorType, accName)] = stakeAmount // save the stakeAmount for later } func (s *suite) TheApplicationIsStakedForService(appName string, serviceId string) { @@ -271,26 +272,23 @@ func (s *suite) TheSupplierIsStakedForService(supplierName string, serviceId str } func (s *suite) TheSessionForApplicationAndServiceContainsTheSupplier(appName string, serviceId string, supplierName string) { - app, found := accNameToAppMap[appName] - if !found { - s.Fatalf("application %s not found", appName) - } - expectedSupplier, found := accNameToSupplierMap[supplierName] - if !found { - s.Fatalf("supplier %s not found", supplierName) - } + app, ok := accNameToAppMap[appName] + require.True(s, ok, "application %s not found", appName) + + expectedSupplier, ok := accNameToSupplierMap[supplierName] + require.True(s, ok, "supplier %s not found", supplierName) + argsAndFlags := []string{ "query", "session", "get-session", app.Address, serviceId, - fmt.Sprintf("--%s=json", tmcli.OutputFlag), + fmt.Sprintf("--%s=json", cometcli.OutputFlag), } res, err := s.pocketd.RunCommandOnHost("", argsAndFlags...) - if err != nil { - s.Fatalf("error getting session for app %s and service %s: %s", appName, serviceId, err) - } + require.NoError(s, err, "error getting session for app %s and service %q", appName, serviceId) + var resp sessiontypes.QueryGetSessionResponse responseBz := []byte(strings.TrimSpace(res.Stdout)) s.cdc.MustUnmarshalJSON(responseBz, &resp) @@ -303,24 +301,29 @@ func (s *suite) TheSessionForApplicationAndServiceContainsTheSupplier(appName st } func (s *suite) TheApplicationSendsTheSupplierARequestForServiceWithData(appName, supplierName, serviceId, requestData string) { + // TODO_HACK: We need to support a non self_signing LocalNet AppGateServer + // that allows any application to send a relay in LocalNet and our E2E Tests. + require.Equal(s, "app1", appName, "TODO_HACK: The LocalNet AppGateServer is self_signing and only supports app1.") + res, err := s.pocketd.RunCurl(appGateServerUrl, serviceId, requestData) - if err != nil { - s.Fatalf("error sending relay request from app %s to supplier %s for service %s: %v", appName, supplierName, serviceId, err) - } + require.NoError(s, err, "error sending relay request from app %q to supplier %q for service %q", appName, supplierName, serviceId) relayKey := relayReferenceKey(appName, supplierName) s.scenarioState[relayKey] = res.Stdout } func (s *suite) TheApplicationReceivesASuccessfulRelayResponseSignedBy(appName string, supplierName string) { + // TODO_HACK: We need to support a non self_signing LocalNet AppGateServer + // that allows any application to send a relay in LocalNet and our E2E Tests. + require.Equal(s, "app1", appName, "TODO_HACK: The LocalNet AppGateServer is self_signing and only supports app1.") + relayKey := relayReferenceKey(appName, supplierName) stdout, ok := s.scenarioState[relayKey] - require.Truef(s, ok, "no relay response found for %s", relayKey) require.Contains(s, stdout, `"result":"0x`) } -func (s *suite) getStakedAmount(actorType, accName string) (bool, int) { +func (s *suite) getStakedAmount(actorType, accName string) (int, bool) { s.Helper() args := []string{ "query", @@ -328,23 +331,25 @@ func (s *suite) getStakedAmount(actorType, accName string) (bool, int) { fmt.Sprintf("list-%s", actorType), } res, err := s.pocketd.RunCommandOnHost("", args...) - if err != nil { - s.Fatalf("error getting %s: %s", actorType, err) - } + require.NoError(s, err, "error getting %s", actorType) s.pocketd.result = res - found := strings.Contains(res.Stdout, accNameToAddrMap[accName]) + + escapedAddress := accNameToAddrMap[accName] amount := 0 - if found { - escapedAddress := regexp.QuoteMeta(accNameToAddrMap[accName]) - stakedAmountRe := regexp.MustCompile(`address: ` + escapedAddress + `\s+stake:\s+amount: "(\d+)"`) - matches := stakedAmountRe.FindStringSubmatch(res.Stdout) - if len(matches) < 2 { - s.Fatalf("no stake amount found for %s", accName) + if strings.Contains(res.Stdout, escapedAddress) { + matches := addrAndAmountRe.FindAllStringSubmatch(res.Stdout, -1) + if len(matches) < 1 { + return 0, false + } + for _, match := range matches { + if match[1] == escapedAddress { + amount, err = strconv.Atoi(match[2]) + require.NoError(s, err) + return amount, true + } } - amount, err = strconv.Atoi(matches[1]) - require.NoError(s, err) } - return found, amount + return 0, false } func (s *suite) buildAddrMap() { @@ -352,9 +357,7 @@ func (s *suite) buildAddrMap() { res, err := s.pocketd.RunCommand( "keys", "list", keyRingFlag, ) - if err != nil { - s.Fatalf("error getting keys: %s", err) - } + require.NoError(s, err, "error getting keys") s.pocketd.result = res matches := addrRe.FindAllStringSubmatch(res.Stdout, -1) for _, match := range matches { @@ -371,12 +374,10 @@ func (s *suite) buildAppMap() { "query", "application", "list-application", - fmt.Sprintf("--%s=json", tmcli.OutputFlag), + fmt.Sprintf("--%s=json", cometcli.OutputFlag), } res, err := s.pocketd.RunCommandOnHost("", argsAndFlags...) - if err != nil { - s.Fatalf("error getting application list: %s", err) - } + require.NoError(s, err, "error getting application list") s.pocketd.result = res var resp apptypes.QueryAllApplicationsResponse responseBz := []byte(strings.TrimSpace(res.Stdout)) @@ -392,12 +393,10 @@ func (s *suite) buildSupplierMap() { "query", "supplier", "list-supplier", - fmt.Sprintf("--%s=json", tmcli.OutputFlag), + fmt.Sprintf("--%s=json", cometcli.OutputFlag), } res, err := s.pocketd.RunCommandOnHost("", argsAndFlags...) - if err != nil { - s.Fatalf("error getting supplier list: %s", err) - } + require.NoError(s, err, "error getting supplier list") s.pocketd.result = res var resp suppliertypes.QueryAllSuppliersResponse responseBz := []byte(strings.TrimSpace(res.Stdout)) @@ -407,8 +406,11 @@ func (s *suite) buildSupplierMap() { } } +// TODO_TECHDEBT(@bryanchriswhite): Cleanup & deduplicate the code related +// to this accessors. Ref: https://github.com/pokt-network/poktroll/pull/448/files#r1547930911 func (s *suite) getAccBalance(accName string) int { s.Helper() + args := []string{ "query", "bank", @@ -416,17 +418,33 @@ func (s *suite) getAccBalance(accName string) int { accNameToAddrMap[accName], } res, err := s.pocketd.RunCommandOnHost("", args...) - if err != nil { - s.Fatalf("error getting balance: %s", err) - } + require.NoError(s, err, "error getting balance") s.pocketd.result = res + match := amountRe.FindStringSubmatch(res.Stdout) - if len(match) < 2 { - s.Fatalf("no balance found for %s", accName) - } - found, err := strconv.Atoi(match[1]) + require.GreaterOrEqual(s, len(match), 2, "no balance found for %s", accName) + + accBalance, err := strconv.Atoi(match[1]) require.NoError(s, err) - return found + + return accBalance +} + +// validateAmountChange validates if the balance of an account has increased or decreased by the expected amount +func (s *suite) validateAmountChange(prevAmount, currAmount int, expectedAmountChange int64, accName, condition, balanceType string) { + deltaAmount := int64(math.Abs(float64(currAmount - prevAmount))) + // Verify if balance is more or less than before + switch condition { + case "more": + require.GreaterOrEqual(s, currAmount, prevAmount, "%s %s expected to have more upokt but actually had less", accName, balanceType) + require.Equal(s, expectedAmountChange, deltaAmount, "%s %s expected increase in upokt was incorrect", accName, balanceType) + case "less": + require.LessOrEqual(s, currAmount, prevAmount, "%s %s expected to have less upokt but actually had more", accName, balanceType) + require.Equal(s, expectedAmountChange, deltaAmount, "%s %s expected) decrease in upokt was incorrect", accName, balanceType) + default: + s.Fatalf("unknown condition %s", condition) + } + } // TODO_IMPROVE: use `sessionId` and `supplierName` since those are the two values @@ -434,3 +452,15 @@ func (s *suite) getAccBalance(accName string) int { func relayReferenceKey(appName, supplierName string) string { return fmt.Sprintf("%s/%s", appName, supplierName) } + +// accBalanceKey is a helper function to create a key to store the balance +// for accName in the context of a scenario state. +func accBalanceKey(accName string) string { + return fmt.Sprintf("balance/%s", accName) +} + +// accStakeKey is a helper function to create a key to store the stake +// for accName of type actorType in the context of a scenario state. +func accStakeKey(actorType, accName string) string { + return fmt.Sprintf("stake/%s/%s", actorType, accName) +} diff --git a/e2e/tests/session.feature b/e2e/tests/session.feature index 030b85607..36e88e513 100644 --- a/e2e/tests/session.feature +++ b/e2e/tests/session.feature @@ -1,40 +1,39 @@ Feature: Session Namespace - # TODO_TECHDEBT(@Olshansk, #180): This test requires you to run `make supplier1_stake && make app1_stake` first - # As a shorter workaround, we can also add steps that stake the application and supplier as part of the scenario. Scenario: Supplier completes claim/proof lifecycle for a valid session Given the user has the pocketd binary installed When the supplier "supplier1" has serviced a session with "5" relays for service "svc1" for application "app1" - And the user should wait for the "proof" "CreateClaim" Message to be submited + And the user should wait for the "proof" module "CreateClaim" Message to be submitted Then the claim created by supplier "supplier1" for service "svc1" for application "app1" should be persisted on-chain - # TODO_IMPROVE: And an event should be emitted... - And after the supplier submits a proof for the session for service "svc1" for application "app1" + # TODO_IMPROVE(@bryanchriswhite): And a cosmos-sdk event (e.g. EventClaimCreated) should be emitted. + And the user should wait for the "proof" module "SubmitProof" Message to be submitted + # TODO_IMPROVE(@bryanchriswhite): And a cosmos-sdk event (e.g. EventClaimCreated) should be emitted. Then the proof submitted by supplier "supplier1" for service "svc1" for application "app1" should be persisted on-chain - # TODO_IMPROVE: And an event should be emitted... # TODO_BLOCKER(@red-0ne): Make sure to implement and validate this test # One way to exercise this behavior is to close the `RelayMiner` port to prevent # the `RelayRequest` from being received and processed then reopen it after the # the defined number of blocks has passed. -# Scenario: A late Relay inside the SessionGracePeriod is handled -# Given the user has the pocketd binary installed -# And the parameter "NumBlockPerSession" is "4" -# And the parameter "SessionGracePeriod" is "1" -# When the application "app1" sends a relay request to supplier "supplier1" for service "svc1" with session number "1" -# And the supplier "supplier1" waits "5" blocks -# And the supllier "supplier1" calls GetSession and gets session number "2" -# Then the supplier "supplier1" replys with a relay response for service "svc1" for application "app1" with session number "1" -# And the application "app1" receives a successful relay response signed by "supplier1" for session number "1" -# And after the supplier "supplier1" updates a claim for session number "1" for service "svc1" for application "app1" -# Then the claim created by supplier "supplier1" for service "svc1" for application "app1" should be persisted on-chain -# -# Scenario: A late Relay outside the SessionGracePeriod is rejected -# Given the user has the pocketd binary installed -# And the parameter "NumBlockPerSession" is "4" -# And the parameter "SessionGracePeriod" is "1" -# When the application "app1" sends a relay request to supplier "supplier1" for service "svc1" with session number "1" -# And the supplier "supplier1" waits "10" blocks -# And the supllier "supplier1" calls GetSession and gets session number "3" -# Then the supplier "supplier1" replys to application "app1" with a "session mismatch" error relay response -# And the application "app1" receives a failed relay response with a "session mismatch" error -# And the supplier "supplier1" do not update a claim for session number "1" for service "svc1" for application "app1" + + # Scenario: A late Relay inside the SessionGracePeriod is handled + # Given the user has the pocketd binary installed + # And the parameter "NumBlockPerSession" is "4" + # And the parameter "SessionGracePeriod" is "1" + # When the application "app1" sends a relay request to supplier "supplier1" for service "svc1" with session number "1" + # And the supplier "supplier1" waits "5" blocks + # And the supllier "supplier1" calls GetSession and gets session number "2" + # Then the supplier "supplier1" replys with a relay response for service "svc1" for application "app1" with session number "1" + # And the application "app1" receives a successful relay response signed by "supplier1" for session number "1" + # And after the supplier "supplier1" updates a claim for session number "1" for service "svc1" for application "app1" + # Then the claim created by supplier "supplier1" for service "svc1" for application "app1" should be persisted on-chain + + # Scenario: A late Relay outside the SessionGracePeriod is rejected + # Given the user has the pocketd binary installed + # And the parameter "NumBlockPerSession" is "4" + # And the parameter "SessionGracePeriod" is "1" + # When the application "app1" sends a relay request to supplier "supplier1" for service "svc1" with session number "1" + # And the supplier "supplier1" waits "10" blocks + # And the supllier "supplier1" calls GetSession and gets session number "3" + # Then the supplier "supplier1" replys to application "app1" with a "session mismatch" error relay response + # And the application "app1" receives a failed relay response with a "session mismatch" error + # And the supplier "supplier1" do not update a claim for session number "1" for service "svc1" for application "app1" diff --git a/e2e/tests/session_steps_test.go b/e2e/tests/session_steps_test.go index 1039981b5..83a78e2f1 100644 --- a/e2e/tests/session_steps_test.go +++ b/e2e/tests/session_steps_test.go @@ -13,6 +13,7 @@ import ( "github.com/stretchr/testify/require" "github.com/pokt-network/poktroll/pkg/client" + "github.com/pokt-network/poktroll/pkg/client/block" "github.com/pokt-network/poktroll/pkg/client/events" "github.com/pokt-network/poktroll/pkg/client/tx" "github.com/pokt-network/poktroll/pkg/observable/channel" @@ -21,19 +22,32 @@ import ( ) const ( - // txEventTimeout is the duration of time to wait after sending a valid tx + // eventTimeout is the duration of time to wait after sending a valid tx // before the test should time out (fail). - txEventTimeout = 10 * time.Second + eventTimeout = 60 * time.Second + // testServiceId is the service ID used for testing purposes that is + // expected to be available in LocalNet. + testServiceId = "anvil" + // txSenderEventSubscriptionQueryFmt is the format string which yields the // cosmos-sdk event subscription "query" string for a given sender address. // This is used by an events replay client to subscribe to tx events from the supplier. // See: https://docs.cosmos.network/v0.47/learn/advanced/events#subscribing-to-events txSenderEventSubscriptionQueryFmt = "tm.event='Tx' AND message.sender='%s'" - testEventsReplayClientBufferSize = 100 - testServiceId = "anvil" - // eventsReplayClientKey is the suite#scenarioState key for the events replay client + // newBlockEventSubscriptionQuery is the format string which yields a + // subscription query to listen for on-chain new block events. + newBlockEventSubscriptionQuery = "tm.event='NewBlock'" + // eventsReplayClientBufferSize is the buffer size for the events replay client + // for the subscriptions above. + eventsReplayClientBufferSize = 100 + + // txResultEventsReplayClientKey is the suite#scenarioState key for the events replay client // which is subscribed to tx events where the tx sender is the scenario's supplier. - eventsReplayClientKey = "eventsReplayClientKey" + txResultEventsReplayClientKey = "txResultEventsReplayClientKey" + // newBlockEventReplayClientKey is the suite#scenarioState key for the events replay client + // which is subscribed to claim settlement or expiration events on-chain. + newBlockEventReplayClientKey = "newBlockEventReplayClientKey" + // preExistingClaimsKey is the suite#scenarioState key for any pre-existing // claims when querying for all claims prior to running the scenario. preExistingClaimsKey = "preExistingClaimsKey" @@ -42,13 +56,12 @@ const ( preExistingProofsKey = "preExistingProofsKey" ) -// TODO_TECHDEBT: Evaluate if/where/how this function should be reused in other tests -func (s *suite) TheUserShouldWaitForTheMessageToBeSubmited(module, message string) { - s.waitForMessageAction(fmt.Sprintf("/poktroll.%s.Msg%s", module, message)) +func (s *suite) TheUserShouldWaitForTheModuleMessageToBeSubmitted(module, message string) { + s.waitForTxResultEvent(fmt.Sprintf("/poktroll.%s.Msg%s", module, message)) } -func (s *suite) AfterTheSupplierCreatesAClaimForTheSessionForServiceForApplication(serviceId, appName string) { - s.waitForMessageAction("/poktroll.proof.MsgCreateClaim") +func (s *suite) TheUserShouldWaitForTheModuleEventToBeBroadcast(module, message string) { + s.waitForNewBlockEvent(fmt.Sprintf("poktroll.%s.Event%s", module, message)) } func (s *suite) TheClaimCreatedBySupplierForServiceForApplicationShouldBePersistedOnchain(supplierName, serviceId, appName string) { @@ -64,7 +77,7 @@ func (s *suite) TheClaimCreatedBySupplierForServiceForApplicationShouldBePersist // Assert that the number of claims has increased by one. preExistingClaims, ok := s.scenarioState[preExistingClaimsKey].([]prooftypes.Claim) - require.True(s, ok, "preExistingClaimsKey not found in scenarioState") + require.Truef(s, ok, "%s not found in scenarioState", preExistingClaimsKey) // NB: We are avoiding the use of require.Len here because it provides unreadable output // TODO_TECHDEBT: Due to the speed of the blocks of the LocalNet validator, along with the small number // of blocks per session, multiple claims may be created throughout the duration of the test. Until @@ -83,10 +96,10 @@ func (s *suite) TheClaimCreatedBySupplierForServiceForApplicationShouldBePersist require.Equal(s, accNameToAddrMap[supplierName], claim.SupplierAddress) } -func (s *suite) TheSupplierHasServicedASessionWithRelaysForServiceForApplication(supplierName, relayCountStr, serviceId, appName string) { +func (s *suite) TheSupplierHasServicedASessionWithRelaysForServiceForApplication(supplierName, numRelaysStr, serviceId, appName string) { ctx := context.Background() - relayCount, err := strconv.Atoi(relayCountStr) + numRelays, err := strconv.Atoi(numRelaysStr) require.NoError(s, err) // Query for any existing claims so that we can compare against them in @@ -103,31 +116,37 @@ func (s *suite) TheSupplierHasServicedASessionWithRelaysForServiceForApplication // Construct an events query client to listen for tx events from the supplier. msgSenderQuery := fmt.Sprintf(txSenderEventSubscriptionQueryFmt, accNameToAddrMap[supplierName]) - deps := depinject.Supply(events.NewEventsQueryClient(testclient.CometLocalWebsocketURL)) - eventsReplayClient, err := events.NewEventsReplayClient[*abci.TxResult]( + txSendEventsReplayClient, err := events.NewEventsReplayClient[*abci.TxResult]( ctx, deps, msgSenderQuery, tx.UnmarshalTxResult, - testEventsReplayClientBufferSize, + eventsReplayClientBufferSize, ) require.NoError(s, err) + s.scenarioState[txResultEventsReplayClientKey] = txSendEventsReplayClient - s.scenarioState[eventsReplayClientKey] = eventsReplayClient + // Construct an events query client to listen for claim settlement or expiration events on-chain. + onChainClaimEventsReplayClient, err := events.NewEventsReplayClient[*block.CometNewBlockEvent]( + ctx, + deps, + newBlockEventSubscriptionQuery, + block.UnmarshalNewBlockEvent, + eventsReplayClientBufferSize, + ) + require.NoError(s, err) + s.scenarioState[newBlockEventReplayClientKey] = onChainClaimEventsReplayClient + // Send relays for the session. s.sendRelaysForSession( appName, supplierName, testServiceId, - relayCount, + numRelays, ) } -func (s *suite) AfterTheSupplierSubmitsAProofForTheSessionForServiceForApplication(a string, b string) { - s.waitForMessageAction("/poktroll.proof.MsgSubmitProof") -} - func (s *suite) TheProofSubmittedBySupplierForServiceForApplicationShouldBePersistedOnchain(supplierName, serviceId, appName string) { ctx := context.Background() @@ -174,21 +193,26 @@ func (s *suite) sendRelaysForSession( data := `{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}` for i := 0; i < relayLimit; i++ { + s.Logf("Sending relay %d \n", i) s.TheApplicationSendsTheSupplierARequestForServiceWithData(appName, supplierName, serviceId, data) s.TheApplicationReceivesASuccessfulRelayResponseSignedBy(appName, supplierName) } } -// waitForMessageAction waits for an event to be observed which has the given message action. -func (s *suite) waitForMessageAction(action string) { +// waitForTxResultEvent waits for an event to be observed which has the given message action. +func (s *suite) waitForTxResultEvent(targetAction string) { ctx, done := context.WithCancel(context.Background()) - eventsReplayClient, ok := s.scenarioState[eventsReplayClientKey].(client.EventsReplayClient[*abci.TxResult]) - require.True(s, ok, "eventsReplayClientKey not found in scenarioState") - require.NotNil(s, eventsReplayClient) + txResultEventsReplayClientState, ok := s.scenarioState[txResultEventsReplayClientKey] + require.Truef(s, ok, "%s not found in scenarioState", txResultEventsReplayClientKey) + + txResultEventsReplayClient, ok := txResultEventsReplayClientState.(client.EventsReplayClient[*abci.TxResult]) + require.True(s, ok, "%q not of the right type; expected client.EventsReplayClient[*abci.TxResult], got %T", txResultEventsReplayClientKey, txResultEventsReplayClientState) + require.NotNil(s, txResultEventsReplayClient) + // For each observed event, **asynchronously** check if it contains the given action. channel.ForEach[*abci.TxResult]( - ctx, eventsReplayClient.EventsSequence(ctx), + ctx, txResultEventsReplayClient.EventsSequence(ctx), func(_ context.Context, txResult *abci.TxResult) { if txResult == nil { return @@ -199,7 +223,7 @@ func (s *suite) waitForMessageAction(action string) { for _, event := range txResult.Result.Events { for _, attribute := range event.Attributes { if attribute.Key == "action" { - if attribute.Value == action { + if attribute.Value == targetAction { done() return } @@ -210,8 +234,48 @@ func (s *suite) waitForMessageAction(action string) { ) select { - case <-time.After(txEventTimeout): - s.Fatalf("timed out waiting for message with action %q", action) + case <-time.After(eventTimeout): + s.Fatalf("timed out waiting for message with action %q", targetAction) + case <-ctx.Done(): + s.Log("Success; message detected before timeout.") + } +} + +func (s *suite) waitForNewBlockEvent(targetEvent string) { + ctx, done := context.WithCancel(context.Background()) + + newBlockEventsReplayClientState, ok := s.scenarioState[newBlockEventReplayClientKey] + require.Truef(s, ok, "%s not found in scenarioState", newBlockEventReplayClientKey) + + newBlockEventsReplayClient, ok := newBlockEventsReplayClientState.(client.EventsReplayClient[*block.CometNewBlockEvent]) + require.True(s, ok, "%q not of the right type; expected client.EventsReplayClient[*block.CometNewBlockEvent], got %T", newBlockEventReplayClientKey, newBlockEventsReplayClientState) + require.NotNil(s, newBlockEventsReplayClient) + + // For each observed event, **asynchronously** check if it contains the given action. + channel.ForEach[*block.CometNewBlockEvent]( + ctx, newBlockEventsReplayClient.EventsSequence(ctx), + func(_ context.Context, newBlockEvent *block.CometNewBlockEvent) { + if newBlockEvent == nil { + return + } + + // Range over each event's attributes to find the "action" attribute + // and compare its value to that of the action provided. + for _, event := range newBlockEvent.Data.Value.ResultFinalizeBlock.Events { + // TODO_IMPROVE: We can pass in a function to do even more granular + // checks on the event. For example, for a Claim Settlement event, + // we can parse the claim and verify the compute units. + if event.Type == targetEvent { + done() + return + } + } + }, + ) + + select { + case <-time.After(eventTimeout): + s.Fatalf("timed out waiting for NewBlock event %q", targetEvent) case <-ctx.Done(): s.Log("Success; message detected before timeout.") } diff --git a/e2e/tests/stake.feature b/e2e/tests/stake.feature index 1171ef3d6..f995db0e0 100644 --- a/e2e/tests/stake.feature +++ b/e2e/tests/stake.feature @@ -2,24 +2,25 @@ Feature: Stake Namespaces Scenario: User can stake a Gateway Given the user has the pocketd binary installed - And the "gateway" for account "gateway1" is not staked - And the account "gateway1" has a balance greater than "1000" uPOKT - When the user stakes a "gateway" with "1000" uPOKT from the account "gateway1" + And the "gateway" for account "gateway2" is not staked + And the account "gateway2" has a balance greater than "1000070" uPOKT + When the user stakes a "gateway" with "1000070" uPOKT from the account "gateway2" Then the user should be able to see standard output containing "txhash:" And the user should be able to see standard output containing "code: 0" And the pocketd binary should exit without error + # TODO_TECHDEBT(@Olshansk, @red-0ne): Replace these time-based waits with event listening waits And the user should wait for "5" seconds - And the "gateway" for account "gateway1" is staked with "1000" uPOKT - And the account balance of "gateway1" should be "1000" uPOKT "less" than before + And the "gateway" for account "gateway2" is staked with "1000070" uPOKT + And the account balance of "gateway2" should be "1000070" uPOKT "less" than before Scenario: User can unstake a Gateway Given the user has the pocketd binary installed - And the "gateway" for account "gateway1" is staked with "1000" uPOKT - And an account exists for "gateway1" - When the user unstakes a "gateway" from the account "gateway1" + And the "gateway" for account "gateway2" is staked with "1000070" uPOKT + And an account exists for "gateway2" + When the user unstakes a "gateway" from the account "gateway2" Then the user should be able to see standard output containing "txhash:" And the user should be able to see standard output containing "code: 0" And the pocketd binary should exit without error And the user should wait for "5" seconds - And the "gateway" for account "gateway1" is not staked - And the account balance of "gateway1" should be "1000" uPOKT "more" than before + And the "gateway" for account "gateway2" is not staked + And the account balance of "gateway2" should be "1000070" uPOKT "more" than before \ No newline at end of file diff --git a/e2e/tests/tokenomics.feature b/e2e/tests/tokenomics.feature deleted file mode 100644 index 09e6cd83b..000000000 --- a/e2e/tests/tokenomics.feature +++ /dev/null @@ -1,13 +0,0 @@ -Feature: Tokenomics Namespaces - - # This test - Scenario: Basic tokenomics validation that Supplier mint equals Application burn - Given the user has the pocketd binary installed - And an account exists for "supplier1" - And an account exists for "app1" - When the supplier "supplier1" has serviced a session with "20" relays for service "svc1" for application "app1" - # And the user should wait for "5" seconds - # TODO_UPNEXT(@Olshansk, #359): Expand on the two expectations below after integrating the tokenomics module - # into the supplier module. - # Then the account balance of "supplier1" should be "1000" uPOKT "more" than before - # And the account balance of "app1" should be "1000" uPOKT "less" than before diff --git a/localnet/poktrolld/config/application1_stake_config.yaml b/localnet/poktrolld/config/application1_stake_config.yaml index 69b07354f..b4e8aa96c 100644 --- a/localnet/poktrolld/config/application1_stake_config.yaml +++ b/localnet/poktrolld/config/application1_stake_config.yaml @@ -1,5 +1,5 @@ -stake_amount: 1000upokt +stake_amount: 1000069upokt service_ids: - - anvil - - svc1 - - svc2 \ No newline at end of file + - anvil + - svc1 + - svc2 diff --git a/localnet/poktrolld/config/application2_stake_config.yaml b/localnet/poktrolld/config/application2_stake_config.yaml index 251d8e376..9a0aa6c03 100644 --- a/localnet/poktrolld/config/application2_stake_config.yaml +++ b/localnet/poktrolld/config/application2_stake_config.yaml @@ -1,5 +1,5 @@ -stake_amount: 1000upokt +stake_amount: 1000070upokt service_ids: - - anvil - - svc2 - - svc3 \ No newline at end of file + - anvil + - svc2 + - svc3 diff --git a/localnet/poktrolld/config/application3_stake_config.yaml b/localnet/poktrolld/config/application3_stake_config.yaml index a6e2256f1..14425035a 100644 --- a/localnet/poktrolld/config/application3_stake_config.yaml +++ b/localnet/poktrolld/config/application3_stake_config.yaml @@ -1,5 +1,5 @@ -stake_amount: 1000upokt +stake_amount: 1000071upokt service_ids: - - anvil - - svc3 - - svc4 \ No newline at end of file + - anvil + - svc3 + - svc4 diff --git a/localnet/poktrolld/config/config.toml b/localnet/poktrolld/config/config.toml index 4e067d5b3..85e7715cc 100644 --- a/localnet/poktrolld/config/config.toml +++ b/localnet/poktrolld/config/config.toml @@ -393,7 +393,7 @@ version = "v0" wal_file = "data/cs.wal/wal" # How long we wait for a proposal block before prevoting nil -timeout_propose = "1s" +timeout_propose = "2s" # How much timeout_propose increases with each round timeout_propose_delta = "500ms" # How long we wait after receiving +2/3 prevotes for “anything” (ie. not a single block or nil) @@ -407,7 +407,7 @@ timeout_precommit_delta = "500ms" # How long we wait after committing a block, before starting on the new # height (this gives us a chance to receive some more precommits, even # though we already have +2/3). -timeout_commit = "1s" +timeout_commit = "2s" # How many blocks to look back to check existence of the node's consensus votes before joining consensus # When non-zero, the node will panic upon restart diff --git a/localnet/poktrolld/config/gateway1_stake_config.yaml b/localnet/poktrolld/config/gateway1_stake_config.yaml index 2f085c5ef..dc6a9bad7 100644 --- a/localnet/poktrolld/config/gateway1_stake_config.yaml +++ b/localnet/poktrolld/config/gateway1_stake_config.yaml @@ -1 +1 @@ -stake_amount: 1000upokt \ No newline at end of file +stake_amount: 1000069upokt diff --git a/localnet/poktrolld/config/gateway2_stake_config.yaml b/localnet/poktrolld/config/gateway2_stake_config.yaml index 2f085c5ef..c2ab05f77 100644 --- a/localnet/poktrolld/config/gateway2_stake_config.yaml +++ b/localnet/poktrolld/config/gateway2_stake_config.yaml @@ -1 +1 @@ -stake_amount: 1000upokt \ No newline at end of file +stake_amount: 10070upokt diff --git a/localnet/poktrolld/config/gateway3_stake_config.yaml b/localnet/poktrolld/config/gateway3_stake_config.yaml index 2f085c5ef..51e2c6353 100644 --- a/localnet/poktrolld/config/gateway3_stake_config.yaml +++ b/localnet/poktrolld/config/gateway3_stake_config.yaml @@ -1 +1 @@ -stake_amount: 1000upokt \ No newline at end of file +stake_amount: 10071upokt diff --git a/localnet/poktrolld/config/supplier1_stake_config.yaml b/localnet/poktrolld/config/supplier1_stake_config.yaml index 880ef234b..9384657b1 100644 --- a/localnet/poktrolld/config/supplier1_stake_config.yaml +++ b/localnet/poktrolld/config/supplier1_stake_config.yaml @@ -1,15 +1,15 @@ -# TODO(@Olshansk, @okdas): Add more services (in addition to anvil) for apps and suppliers to stake for. -# TODO_TECHDEBT: svc1 below are only in place to make GetSession testable -stake_amount: 1000upokt +# NB: The stake amount is exactly 1upokt greater than the value in genesis.json +# so that the stake command causes a state change. +stake_amount: 1000069upokt services: - - service_id: anvil - endpoints: - # The endpoint URL for the Anvil service is provided via the RelayMiner. - # The RelayMiner acts as a proxy, forwarding requests to the actual Anvil data node behind it. - # This setup allows for flexible and dynamic service provisioning within the network. - - url: http://relayminer1:8545 - rpc_type: json_rpc - service_id: svc1 endpoints: - url: http://localhost:8081 rpc_type: json_rpc + # The endpoint URL for the Anvil service is provided via the RelayMiner. + # The RelayMiner acts as a proxy, forwarding requests to the actual Anvil data node behind it. + # This setup allows for flexible and dynamic service provisioning within the network. + - service_id: anvil + endpoints: + - url: http://relayminer1:8545 + rpc_type: json_rpc diff --git a/localnet/poktrolld/config/supplier2_stake_config.yaml b/localnet/poktrolld/config/supplier2_stake_config.yaml index 15e54191f..831e56091 100644 --- a/localnet/poktrolld/config/supplier2_stake_config.yaml +++ b/localnet/poktrolld/config/supplier2_stake_config.yaml @@ -1,4 +1,4 @@ -stake_amount: 1000upokt +stake_amount: 1000070upokt services: - service_id: anvil endpoints: diff --git a/localnet/poktrolld/config/supplier3_stake_config.yaml b/localnet/poktrolld/config/supplier3_stake_config.yaml index c3e30628c..78b6402a2 100644 --- a/localnet/poktrolld/config/supplier3_stake_config.yaml +++ b/localnet/poktrolld/config/supplier3_stake_config.yaml @@ -1,4 +1,4 @@ -stake_amount: 1000upokt +stake_amount: 1000071upokt services: - service_id: anvil endpoints: diff --git a/pkg/appgateserver/server.go b/pkg/appgateserver/server.go index 68c253fc3..761ff0b18 100644 --- a/pkg/appgateserver/server.go +++ b/pkg/appgateserver/server.go @@ -227,7 +227,7 @@ func (app *appGateServer) ServeHTTP(writer http.ResponseWriter, request *http.Re // TODO_RESEARCH: Should this be started in a goroutine, to allow for // concurrent requests from numerous applications? if err := app.handleSynchronousRelay( - ctx, appAddress, serviceId, requestPayloadBz, requestType, request, writer); err != nil { + ctx, appAddress, serviceId, requestType, request, writer); err != nil { // Reply with an error response if there was an error handling the relay. app.replyWithError(ctx, requestPayloadBz, writer, serviceId, requestType.String(), err) diff --git a/pkg/appgateserver/synchronous.go b/pkg/appgateserver/synchronous.go index e0b2f5d10..5feb9baac 100644 --- a/pkg/appgateserver/synchronous.go +++ b/pkg/appgateserver/synchronous.go @@ -8,13 +8,12 @@ import ( ) // handleSynchronousRelay handles relay requests for synchronous protocols, where -// there is a one-to-one correspondance between the request and response. +// there is a one-to-one correspondence between the request and response. // It does everything from preparing, signing and sending the request. // It then blocks on the response to come back and forward it to the provided writer. func (app *appGateServer) handleSynchronousRelay( ctx context.Context, appAddress, serviceId string, - payloadBz []byte, requestType sharedtypes.RPCType, request *http.Request, writer http.ResponseWriter, @@ -42,7 +41,7 @@ func (app *appGateServer) handleSynchronousRelay( return ErrAppGateHandleRelay.Wrapf("getting supplier URL: %s", err) } - relayResponse, err := app.sdk.SendRelay(ctx, supplierEndpoint, request) + relayResponse, err := app.sdk.SendRelay(ctx, supplierEndpoint, *request) if err != nil { return err } diff --git a/pkg/client/block/block.go b/pkg/client/block/block.go index cefd99b96..0b55104df 100644 --- a/pkg/client/block/block.go +++ b/pkg/client/block/block.go @@ -1,6 +1,7 @@ package block import ( + abci "github.com/cometbft/cometbft/abci/types" "github.com/cometbft/cometbft/libs/json" rpctypes "github.com/cometbft/cometbft/rpc/jsonrpc/types" "github.com/cometbft/cometbft/types" @@ -9,28 +10,31 @@ import ( "github.com/pokt-network/poktroll/pkg/client/events" ) -// cometBlockEvent is used to deserialize incoming committed block event messages +// CometNewBlockEvent is used to deserialize incoming committed block event messages // from the respective events query subscription. It implements the client.Block // interface by loosely wrapping cometbft's block type, into which messages are // deserialized. -type cometBlockEvent struct { +type CometNewBlockEvent struct { Data struct { Value struct { // Block and BlockID are nested to match CometBFT's unique serialization, // diverging from the rollkit's approach seen in other implementations. - Block *types.Block `json:"block"` - BlockID types.BlockID `json:"block_id"` + Block *types.Block `json:"block"` + BlockID types.BlockID `json:"block_id"` + ResultFinalizeBlock struct { + Events []abci.Event `json:"events"` + } `json:"result_finalize_block"` } `json:"value"` } `json:"data"` } // Height returns the block's height. -func (blockEvent *cometBlockEvent) Height() int64 { +func (blockEvent *CometNewBlockEvent) Height() int64 { return blockEvent.Data.Value.Block.Height } // Hash returns the binary representation of the block's hash as a byte slice. -func (blockEvent *cometBlockEvent) Hash() []byte { +func (blockEvent *CometNewBlockEvent) Hash() []byte { // Use BlockID.Hash and not LastBlockID.Hash because the latter refers to the // previous block's hash, not the hash of the block being fetched // see: https://docs.cometbft.com/v0.37/spec/core/data_structures#blockid @@ -38,28 +42,37 @@ func (blockEvent *cometBlockEvent) Hash() []byte { return blockEvent.Data.Value.BlockID.Hash } -// newCometBlockEvent is a function that attempts to deserialize the given bytes -// into a comet block. If the resulting block has a height of zero, assume the event -// was not a block event and return an ErrUnmarshalBlockEvent error. -func newCometBlockEvent(blockMsgBz []byte) (client.Block, error) { +// UnmarshalNewBlockEvent is a function that attempts to deserialize the given bytes +// into a comet new block event . If the resulting block has a height of zero, +// assume the event was not a block event and return an ErrUnmarshalBlockEvent error. +func UnmarshalNewBlockEvent(blockMsgBz []byte) (*CometNewBlockEvent, error) { var rpcResponse rpctypes.RPCResponse if err := json.Unmarshal(blockMsgBz, &rpcResponse); err != nil { return nil, err } - var eventDataNewBlock cometBlockEvent - // If rpcResponse.Result fails unmarshaling into types.EventDataNewBlock, // then it does not match the expected format - if err := json.Unmarshal(rpcResponse.Result, &eventDataNewBlock); err != nil { + var newBlockEvent CometNewBlockEvent + if err := json.Unmarshal(rpcResponse.Result, &newBlockEvent); err != nil { return nil, events.ErrEventsUnmarshalEvent. Wrapf("with block data: %s", string(blockMsgBz)) } - if eventDataNewBlock.Data.Value.Block == nil { + if newBlockEvent.Data.Value.Block == nil { return nil, events.ErrEventsUnmarshalEvent. Wrapf("with block data: %s", string(blockMsgBz)) } - return &eventDataNewBlock, nil + return &newBlockEvent, nil +} + +// UnmarshalNewBlock is a wrapper around UnmarshalNewBlockEvent to return an +// interface that satisfies the client.Block interface. +func UnmarshalNewBlock(blockMsgBz []byte) (client.Block, error) { + newBlockEvent, err := UnmarshalNewBlockEvent(blockMsgBz) + if err != nil { + return nil, err + } + return client.Block(newBlockEvent), nil } diff --git a/pkg/client/block/client.go b/pkg/client/block/client.go index 1e3bd21ea..ba809194d 100644 --- a/pkg/client/block/client.go +++ b/pkg/client/block/client.go @@ -40,7 +40,7 @@ func NewBlockClient( ctx, deps, committedBlocksQuery, - newCometBlockEvent, + UnmarshalNewBlock, defaultBlocksReplayLimit, ) if err != nil { diff --git a/pkg/client/interface.go b/pkg/client/interface.go index 52b50e052..ec92dc562 100644 --- a/pkg/client/interface.go +++ b/pkg/client/interface.go @@ -111,7 +111,7 @@ type Block interface { // Redelegation is an interface which wraps the EventRedelegation event // emitted by the application module. -// See: proto/pocket/application/types/event.proto#EventRedelegation +// See: proto/poktroll/application/types/event.proto#EventRedelegation type Redelegation interface { GetAppAddress() string GetGatewayAddress() string diff --git a/pkg/client/supplier/client_integration_test.go b/pkg/client/supplier/client_integration_test.go index f7ea11f56..02a8e0796 100644 --- a/pkg/client/supplier/client_integration_test.go +++ b/pkg/client/supplier/client_integration_test.go @@ -26,7 +26,7 @@ func TestNewSupplierClient_Localnet(t *testing.T) { var rootHash []byte sessionHeader := sessiontypes.SessionHeader{ ApplicationAddress: "", - SessionStartBlockHeight: 0, + SessionStartBlockHeight: 1, SessionId: "", } err := supplierClient.CreateClaim(ctx, sessionHeader, rootHash) diff --git a/pkg/client/supplier/client_test.go b/pkg/client/supplier/client_test.go index 7a21bcaf2..f9e907b82 100644 --- a/pkg/client/supplier/client_test.go +++ b/pkg/client/supplier/client_test.go @@ -104,7 +104,7 @@ func TestSupplierClient_CreateClaim(t *testing.T) { var rootHash []byte sessionHeader := sessiontypes.SessionHeader{ ApplicationAddress: testAppAddr.String(), - SessionStartBlockHeight: 0, + SessionStartBlockHeight: 1, SessionId: "", Service: &sharedtypes.Service{ Id: testService, @@ -162,7 +162,7 @@ func TestSupplierClient_SubmitProof(t *testing.T) { sessionHeader := sessiontypes.SessionHeader{ ApplicationAddress: testAppAddr.String(), - SessionStartBlockHeight: 0, + SessionStartBlockHeight: 1, SessionId: "", Service: &sharedtypes.Service{ Id: testService, @@ -174,7 +174,7 @@ func TestSupplierClient_SubmitProof(t *testing.T) { // Generating an ephemeral tree & spec just so we can submit // a proof of the right size. - // TODO_TECHDEBT: Centralize the configuration for the SMT spec. + // TODO_TECHDEBT(#446): Centralize the configuration for the SMT spec. tree := smt.NewSparseMerkleSumTrie(kvStore, sha256.New()) emptyPath := make([]byte, tree.PathHasherSize()) proof, err := tree.ProveClosest(emptyPath) diff --git a/pkg/client/tx/client.go b/pkg/client/tx/client.go index 849de62aa..95e1a2599 100644 --- a/pkg/client/tx/client.go +++ b/pkg/client/tx/client.go @@ -519,18 +519,18 @@ func UnmarshalTxResult(txResultBz []byte) (*abci.TxResult, error) { return nil, events.ErrEventsUnmarshalEvent.Wrap(err.Error()) } - var txResult CometTxEvent + var cometTxEvent CometTxEvent // Try to deserialize the provided bytes into a TxResult. - if err := json.Unmarshal(rpcResponse.Result, &txResult); err != nil { + if err := json.Unmarshal(rpcResponse.Result, &cometTxEvent); err != nil { return nil, events.ErrEventsUnmarshalEvent.Wrap(err.Error()) } // Check if the TxResult has empty transaction bytes, which indicates // the message might not be a valid transaction event. - if bytes.Equal(txResult.Data.Value.TxResult.Tx, []byte{}) { + if bytes.Equal(cometTxEvent.Data.Value.TxResult.Tx, []byte{}) { return nil, events.ErrEventsUnmarshalEvent.Wrap("event bytes do not correspond to an abci.TxResult") } - return &txResult.Data.Value.TxResult, nil + return &cometTxEvent.Data.Value.TxResult, nil } diff --git a/pkg/client/tx/client_test.go b/pkg/client/tx/client_test.go index 827929dd7..71c4a573d 100644 --- a/pkg/client/tx/client_test.go +++ b/pkg/client/tx/client_test.go @@ -42,6 +42,7 @@ const ( // TODO_TECHDEBT: add coverage for the transactions client handling an events bytes error either. func TestTxClient_SignAndBroadcast_Succeeds(t *testing.T) { + t.Skip("TODO_BLOCKER(#425): Revisit Observable test tooling & fix flaky test") var ( // expectedTx is the expected transactions bytes that will be signed and broadcast // by the transaction client. It is computed and assigned in the @@ -403,7 +404,7 @@ func TestTxClient_SignAndBroadcast_Timeout(t *testing.T) { err, errCh := eitherErr.SyncOrAsyncError() require.NoError(t, err) - // TODO_TECHDEBT: Centralize the configuration for the SMT spec. + // TODO_TECHDEBT(#446): Centralize the configuration for the SMT spec. spec := smt.NoPrehashSpec(sha256.New(), true) emptyBlockHash := make([]byte, spec.PathHasherSize()) diff --git a/pkg/polylog/polyzero/test_logger.go b/pkg/polylog/polyzero/test_logger.go index f0c35c89c..610f23990 100644 --- a/pkg/polylog/polyzero/test_logger.go +++ b/pkg/polylog/polyzero/test_logger.go @@ -1,5 +1,3 @@ -//go:build test - package polyzero import ( diff --git a/pkg/relayer/config/relayminer_configs_reader_test.go b/pkg/relayer/config/relayminer_configs_reader_test.go index 777e908da..e82f39fa1 100644 --- a/pkg/relayer/config/relayminer_configs_reader_test.go +++ b/pkg/relayer/config/relayminer_configs_reader_test.go @@ -30,7 +30,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -59,7 +59,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { QueryNodeGRPCUrl: &url.URL{Scheme: "tcp", Host: "127.0.0.1:36658"}, TxNodeRPCUrl: &url.URL{Scheme: "tcp", Host: "127.0.0.1:36659"}, }, - SigningKeyName: "servicer1", + SigningKeyName: "supplier1", SmtStorePath: "smt_stores", Proxies: map[string]*config.RelayMinerProxyConfig{ "http-example": { @@ -97,7 +97,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -134,7 +134,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { QueryNodeGRPCUrl: &url.URL{Scheme: "tcp", Host: "127.0.0.1:36658"}, TxNodeRPCUrl: &url.URL{Scheme: "tcp", Host: "127.0.0.1:36659"}, }, - SigningKeyName: "servicer1", + SigningKeyName: "supplier1", SmtStorePath: "smt_stores", Proxies: map[string]*config.RelayMinerProxyConfig{ "http-example": { @@ -183,7 +183,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: first-proxy @@ -211,7 +211,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { QueryNodeGRPCUrl: &url.URL{Scheme: "tcp", Host: "127.0.0.1:36658"}, TxNodeRPCUrl: &url.URL{Scheme: "tcp", Host: "127.0.0.1:36659"}, }, - SigningKeyName: "servicer1", + SigningKeyName: "supplier1", SmtStorePath: "smt_stores", Proxies: map[string]*config.RelayMinerProxyConfig{ "first-proxy": { @@ -260,7 +260,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { pocket_node: query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -285,7 +285,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { QueryNodeGRPCUrl: &url.URL{Scheme: "tcp", Host: "127.0.0.1:36658"}, TxNodeRPCUrl: &url.URL{Scheme: "tcp", Host: "127.0.0.1:36659"}, }, - SigningKeyName: "servicer1", + SigningKeyName: "supplier1", SmtStorePath: "smt_stores", Proxies: map[string]*config.RelayMinerProxyConfig{ "http-example": { @@ -318,7 +318,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -344,7 +344,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { QueryNodeGRPCUrl: &url.URL{Scheme: "tcp", Host: "127.0.0.1:36658"}, TxNodeRPCUrl: &url.URL{Scheme: "tcp", Host: "127.0.0.1:36659"}, }, - SigningKeyName: "servicer1", + SigningKeyName: "supplier1", SmtStorePath: "smt_stores", Proxies: map[string]*config.RelayMinerProxyConfig{ "http-example": { @@ -378,7 +378,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: &tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -405,7 +405,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 # explicitly omitted tx node grpc url query_node_grpc_url: tcp://127.0.0.1:36658 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -432,7 +432,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: &tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -459,7 +459,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: &tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -486,7 +486,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { # explicitly omitted query node rpc url query_node_rpc_url: tcp://127.0.0.1:36657 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -540,7 +540,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 # explicitly omitted smt store path proxies: - proxy_name: http-example @@ -567,7 +567,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores # explicitly omitted proxies section suppliers: @@ -591,7 +591,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: # explicitly empty proxies section suppliers: @@ -615,7 +615,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: # explicitly omitted proxy name @@ -642,7 +642,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: # explicitly empty proxy name @@ -669,7 +669,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -696,7 +696,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -723,7 +723,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -750,7 +750,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -777,7 +777,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -804,7 +804,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -831,7 +831,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -858,7 +858,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -885,7 +885,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -912,7 +912,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -939,7 +939,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -966,7 +966,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -993,7 +993,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -1020,7 +1020,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -1047,7 +1047,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -1074,7 +1074,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example @@ -1101,7 +1101,7 @@ func Test_ParseRelayMinerConfigs(t *testing.T) { query_node_rpc_url: tcp://127.0.0.1:36657 query_node_grpc_url: tcp://127.0.0.1:36658 tx_node_rpc_url: tcp://127.0.0.1:36659 - signing_key_name: servicer1 + signing_key_name: supplier1 smt_store_path: smt_stores proxies: - proxy_name: http-example diff --git a/pkg/relayer/miner/miner.go b/pkg/relayer/miner/miner.go index 591b31875..b8e6ce161 100644 --- a/pkg/relayer/miner/miner.go +++ b/pkg/relayer/miner/miner.go @@ -2,7 +2,6 @@ package miner import ( "context" - "crypto/sha256" "hash" "github.com/pokt-network/poktroll/pkg/either" @@ -17,10 +16,6 @@ import ( var ( _ relayer.Miner = (*miner)(nil) - // TODO_BLOCKER(@Olshansk): Retrieve the relay hasher mechanism from the `smt` repo. - // TODO_TECHDEBT: Centralize the configuration for the SMT spec. Look at - // `GetHashFromBytes` in `miner.go`. - DefaultRelayHasher = sha256.New // TODO_BLOCKER: query on-chain governance params once available. // Setting this to 0 to effectively disables mining for now. // I.e., all relays are added to the tree. @@ -87,10 +82,6 @@ func (mnr *miner) MinedRelays( // setDefaults ensures that the miner has been configured with a hasherConstructor and uses // the default hasherConstructor if not. func (mnr *miner) setDefaults() { - if mnr.relayHasher == nil { - mnr.relayHasher = DefaultRelayHasher - } - if mnr.relayDifficultyBits == 0 { mnr.relayDifficultyBits = defaultRelayDifficultyBits } @@ -105,19 +96,14 @@ func (mnr *miner) mapMineRelay( _ context.Context, relay *servicetypes.Relay, ) (_ either.Either[*relayer.MinedRelay], skip bool) { + // TODO_TECHDEBT(#446): Centralize the configuration for the SMT spec. // TODO_BLOCKER: marshal using canonical codec. relayBz, err := relay.Marshal() if err != nil { return either.Error[*relayer.MinedRelay](err), false } - - // TODO_BLOCKER: Centralize the logic of hashing a relay. It should live - // alongside signing & verification. - // - // TODO_IMPROVE: We need to hash the key; it would be nice if smst.Update() could do it - // since smst has a reference to the hasherConstructor - // TODO_TECHDEBT: Why is this not `relay.GetHash()`? - relayHash := mnr.hash(relayBz) + relayHashArr := servicetypes.GetHashFromBytes(relayBz) + relayHash := relayHashArr[:] // The relay IS NOT volume / reward applicable if protocol.MustCountDifficultyBits(relayHash) < mnr.relayDifficultyBits { @@ -131,10 +117,3 @@ func (mnr *miner) mapMineRelay( Hash: relayHash, }), false } - -// hash constructs a new hasher and hashes the given input bytes. -func (mnr *miner) hash(inputBz []byte) []byte { - hasher := mnr.relayHasher() - hasher.Write(inputBz) - return hasher.Sum(nil) -} diff --git a/pkg/relayer/miner/miner_test.go b/pkg/relayer/miner/miner_test.go index 9366f4121..cabfbb0c6 100644 --- a/pkg/relayer/miner/miner_test.go +++ b/pkg/relayer/miner/miner_test.go @@ -1,4 +1,5 @@ //go:generate go run gen/gen_fixtures.go gen/template.go + // (see: https://pkg.go.dev/cmd/go/internal/generate) // (see: https://go.googlesource.com/proposal/+/refs/heads/master/design/go-generate.md) @@ -7,7 +8,6 @@ package miner_test import ( "context" "encoding/hex" - "hash" "sync" "testing" "time" @@ -17,7 +17,6 @@ import ( "github.com/pokt-network/poktroll/pkg/observable/channel" "github.com/pokt-network/poktroll/pkg/relayer" "github.com/pokt-network/poktroll/pkg/relayer/miner" - "github.com/pokt-network/poktroll/testutil/testrelayer" servicetypes "github.com/pokt-network/poktroll/x/service/types" ) @@ -36,10 +35,7 @@ func TestMiner_MinedRelays(t *testing.T) { actualMinedRelaysMu sync.Mutex actualMinedRelays []*relayer.MinedRelay mockRelaysObs, relaysFixturePublishCh = channel.NewObservable[*servicetypes.Relay]() - expectedMinedRelays = unmarshalHexMinedRelays( - t, marshaledMinableRelaysHex, - miner.DefaultRelayHasher, - ) + expectedMinedRelays = unmarshalHexMinedRelays(t, marshaledMinableRelaysHex) ) mnr, err := miner.NewMiner(miner.WithDifficulty(testDifficulty)) @@ -111,12 +107,11 @@ func unmarshalHexRelay( func unmarshalHexMinedRelays( t *testing.T, marshalledHexMinedRelays []string, - newHasher func() hash.Hash, ) (relays []*relayer.MinedRelay) { t.Helper() for _, marshalledRelayHex := range marshalledHexMinedRelays { - relays = append(relays, unmarshalHexMinedRelay(t, marshalledRelayHex, newHasher)) + relays = append(relays, unmarshalHexMinedRelay(t, marshalledRelayHex)) } return relays } @@ -124,7 +119,6 @@ func unmarshalHexMinedRelays( func unmarshalHexMinedRelay( t *testing.T, marshalledHexMinedRelay string, - newHasher func() hash.Hash, ) *relayer.MinedRelay { t.Helper() @@ -135,11 +129,13 @@ func unmarshalHexMinedRelay( err = relay.Unmarshal(relayBz) require.NoError(t, err) - relayHashBz := testrelayer.HashBytes(t, newHasher, relayBz) + // TODO_TECHDEBT(#446): Centralize the configuration for the SMT spec. + relayHashArr := servicetypes.GetHashFromBytes(relayBz) + relayHash := relayHashArr[:] return &relayer.MinedRelay{ Relay: relay, Bytes: relayBz, - Hash: relayHashBz, + Hash: relayHash, } } diff --git a/pkg/relayer/protocol/block_heights.go b/pkg/relayer/protocol/block_heights.go index bb0676737..2785ba1f3 100644 --- a/pkg/relayer/protocol/block_heights.go +++ b/pkg/relayer/protocol/block_heights.go @@ -31,7 +31,7 @@ func GetEarliestCreateClaimHeight(ctx context.Context, createClaimWindowStartBlo rngSeed, _ := binary.Varint(createClaimWindowStartBlockHash) randomNumber := rand.NewSource(rngSeed).Int63() - // TODO_TECHDEBT: query the on-chain governance parameter once available. + // TODO_BLOCKER: query the on-chain governance parameter once available. // randCreateClaimHeightOffset := randomNumber % (claimproofparams.GovCreateClaimIntervalBlocks - claimproofparams.GovCreateClaimWindowBlocks - 1) _ = randomNumber randCreateClaimHeightOffset := int64(0) @@ -59,7 +59,7 @@ func GetEarliestSubmitProofHeight(ctx context.Context, submitProofWindowStartBlo rngSeed, _ := binary.Varint(earliestSubmitProofBlockHash) randomNumber := rand.NewSource(rngSeed).Int63() - // TODO_TECHDEBT: query the on-chain governance parameter once available. + // TODO_BLOCKER: query the on-chain governance parameter once available. // randSubmitProofHeightOffset := randomNumber % (claimproofparams.GovSubmitProofIntervalBlocks - claimproofparams.GovSubmitProofWindowBlocks - 1) _ = randomNumber randSubmitProofHeightOffset := int64(0) diff --git a/pkg/relayer/session/claim.go b/pkg/relayer/session/claim.go index 0894d5ff7..9ac33b485 100644 --- a/pkg/relayer/session/claim.go +++ b/pkg/relayer/session/claim.go @@ -77,7 +77,7 @@ func (rs *relayerSessionsManager) waitForEarliestCreateClaimHeight( // into account the heights, windows and grace periods into helper functions. createClaimWindowStartHeight := sessionEndHeight + sessionkeeper.GetSessionGracePeriodBlockCount() - // TODO_TECHDEBT: query the on-chain governance parameter once available. + // TODO_BLOCKER: query the on-chain governance parameter once available. // + claimproofparams.GovCreateClaimWindowStartHeightOffset // we wait for createClaimWindowStartHeight to be received before proceeding since we need its hash diff --git a/pkg/relayer/session/proof.go b/pkg/relayer/session/proof.go index 9d155acd1..5a237af40 100644 --- a/pkg/relayer/session/proof.go +++ b/pkg/relayer/session/proof.go @@ -72,7 +72,7 @@ func (rs *relayerSessionsManager) waitForEarliestSubmitProofHeight( // TODO_TECHDEBT(@red-0ne): Centralize the business logic that involves taking // into account the heights, windows and grace periods into helper functions. submitProofWindowStartHeight := createClaimHeight + sessionkeeper.GetSessionGracePeriodBlockCount() - // TODO_TECHDEBT: query the on-chain governance parameter once available. + // TODO_BLOCKER: query the on-chain governance parameter once available. // + claimproofparams.GovSubmitProofWindowStartHeightOffset // we wait for submitProofWindowStartHeight to be received before proceeding since we need its hash diff --git a/pkg/relayer/session/session_test.go b/pkg/relayer/session/session_test.go index 6ed5a4a6a..519c86acb 100644 --- a/pkg/relayer/session/session_test.go +++ b/pkg/relayer/session/session_test.go @@ -28,7 +28,7 @@ func TestRelayerSessionsManager_Start(t *testing.T) { sessionEndHeight = 2 ) - // TODO_TECHDEBT: Centralize the configuration for the SMT spec. + // TODO_TECHDEBT(#446): Centralize the configuration for the SMT spec. var ( _, ctx = testpolylog.NewLoggerWithCtx(context.Background(), polyzero.DebugLevel) spec = smt.NoPrehashSpec(sha256.New(), true) diff --git a/pkg/sdk/interface.go b/pkg/sdk/interface.go index aa462abd6..42e8ebf33 100644 --- a/pkg/sdk/interface.go +++ b/pkg/sdk/interface.go @@ -27,6 +27,6 @@ type POKTRollSDK interface { SendRelay( ctx context.Context, sessionSupplierEndpoint *SingleSupplierEndpoint, - request *http.Request, + request http.Request, ) (response *servicetypes.RelayResponse, err error) } diff --git a/pkg/sdk/send_relay.go b/pkg/sdk/send_relay.go index 447418048..a00c8ebc2 100644 --- a/pkg/sdk/send_relay.go +++ b/pkg/sdk/send_relay.go @@ -23,7 +23,7 @@ func init() { func (sdk *poktrollSDK) SendRelay( ctx context.Context, supplierEndpoint *SingleSupplierEndpoint, - request *http.Request, + request http.Request, ) (response *types.RelayResponse, err error) { // Retrieve the request's payload. payloadBz, err := io.ReadAll(request.Body) diff --git a/proto/poktroll/application/event.proto b/proto/poktroll/application/event.proto index 8602c195e..16d70a795 100644 --- a/proto/poktroll/application/event.proto +++ b/proto/poktroll/application/event.proto @@ -4,13 +4,11 @@ package poktroll.application; option go_package = "github.com/pokt-network/poktroll/x/application/types"; import "cosmos_proto/cosmos.proto"; -import "gogoproto/gogo.proto"; // EventRedelegation is an event emitted whenever an application changes its // delegatee gateways on chain. This is in response to both a DelegateToGateway // and UndelegateFromGateway message. message EventRedelegation { - // TODO: Check if this tag is relevant for events: (gogoproto.jsontag) = "app_address" string app_address = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; // The Bech32 address of the application, using cosmos' ScalarDescriptor to ensure deterministic encoding string gateway_address = 2 [(cosmos_proto.scalar) = "cosmos.AddressString"]; // The Bech32 address of the gateway the application has changed their delegation of, using cosmos' ScalarDescriptor to ensure deterministic encoding } \ No newline at end of file diff --git a/proto/poktroll/application/module/module.proto b/proto/poktroll/application/module/module.proto index 29bc985e2..cae429795 100644 --- a/proto/poktroll/application/module/module.proto +++ b/proto/poktroll/application/module/module.proto @@ -11,4 +11,4 @@ message Module { // authority defines the custom module authority. If not set, defaults to the governance module. string authority = 1; -} \ No newline at end of file +} diff --git a/proto/poktroll/session/session.proto b/proto/poktroll/session/session.proto index 071fbb6e2..4049fb72c 100644 --- a/proto/poktroll/session/session.proto +++ b/proto/poktroll/session/session.proto @@ -16,9 +16,13 @@ import "poktroll/shared/supplier.proto"; message SessionHeader { string application_address = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; // The Bech32 address of the application using cosmos' ScalarDescriptor to ensure deterministic encoding poktroll.shared.Service service = 2; // The service this session is for - int64 session_start_block_height = 3; // The height at which this session started // NOTE: session_id can be derived from the above values using on-chain but is included in the header for convenience - string session_id = 4; // A unique pseudoranom ID for this session + string session_id = 3; // A unique pseudoranom ID for this session + int64 session_start_block_height = 4; // The height at which this session started + // Note that`session_end_block_height` is a derivative of (`start` + `num_blocks_per_session`) + // as goverened by on-chain params at the time of the session start. + // It is stored as an additional field to simplofy business logic in case + // the number of blocks_per_session changes during the session. int64 session_end_block_height = 5; // The height at which this session ended, this is the last block of the session } diff --git a/proto/poktroll/shared/service.proto b/proto/poktroll/shared/service.proto index 3b0849600..03b045d72 100644 --- a/proto/poktroll/shared/service.proto +++ b/proto/poktroll/shared/service.proto @@ -64,3 +64,4 @@ message ConfigOption { ConfigOptions key = 1; // Config option key string value = 2; // Config option value } + diff --git a/proto/poktroll/tokenomics/event.proto b/proto/poktroll/tokenomics/event.proto new file mode 100644 index 000000000..cf3ff45ba --- /dev/null +++ b/proto/poktroll/tokenomics/event.proto @@ -0,0 +1,22 @@ +syntax = "proto3"; +package poktroll.tokenomics; + +option go_package = "github.com/pokt-network/poktroll/x/tokenomics/types"; + +import "poktroll/proof/claim.proto"; + +// EventClaimExpired is an event emitted during settlement whenever a claim requiring +// an on-chain proof doesn't have one. The claim cannot be settled, leading to that work +// never being rewarded. +message EventClaimExpired { + poktroll.proof.Claim claim = 1; + uint64 compute_units = 2; +} + +// EventClaimSettled is an event emitted whenever a claim is settled. +// The proof_required determines whether the claim requires a proof that has been submitted or not +message EventClaimSettled { + poktroll.proof.Claim claim = 1; + uint64 compute_units = 2; + bool proof_required = 3; +} diff --git a/testutil/keeper/application.go b/testutil/keeper/application.go index f266a72c8..f7c5a165a 100644 --- a/testutil/keeper/application.go +++ b/testutil/keeper/application.go @@ -47,8 +47,8 @@ func ApplicationKeeper(t testing.TB) (keeper.Keeper, context.Context) { ctrl := gomock.NewController(t) mockBankKeeper := mocks.NewMockBankKeeper(ctrl) - mockBankKeeper.EXPECT().DelegateCoinsFromAccountToModule(gomock.Any(), gomock.Any(), types.ModuleName, gomock.Any()).AnyTimes() - mockBankKeeper.EXPECT().UndelegateCoinsFromModuleToAccount(gomock.Any(), types.ModuleName, gomock.Any(), gomock.Any()).AnyTimes() + mockBankKeeper.EXPECT().SendCoinsFromAccountToModule(gomock.Any(), gomock.Any(), types.ModuleName, gomock.Any()).AnyTimes() + mockBankKeeper.EXPECT().SendCoinsFromModuleToAccount(gomock.Any(), types.ModuleName, gomock.Any(), gomock.Any()).AnyTimes() mockAccountKeeper := mocks.NewMockAccountKeeper(ctrl) mockAccountKeeper.EXPECT().GetAccount(gomock.Any(), gomock.Any()).AnyTimes() diff --git a/testutil/keeper/gateway.go b/testutil/keeper/gateway.go index e7176e11a..197ce6b2a 100644 --- a/testutil/keeper/gateway.go +++ b/testutil/keeper/gateway.go @@ -39,8 +39,8 @@ func GatewayKeeper(t testing.TB) (keeper.Keeper, context.Context) { ctrl := gomock.NewController(t) mockBankKeeper := mocks.NewMockBankKeeper(ctrl) - mockBankKeeper.EXPECT().DelegateCoinsFromAccountToModule(gomock.Any(), gomock.Any(), types.ModuleName, gomock.Any()).AnyTimes() - mockBankKeeper.EXPECT().UndelegateCoinsFromModuleToAccount(gomock.Any(), types.ModuleName, gomock.Any(), gomock.Any()).AnyTimes() + mockBankKeeper.EXPECT().SendCoinsFromAccountToModule(gomock.Any(), gomock.Any(), types.ModuleName, gomock.Any()).AnyTimes() + mockBankKeeper.EXPECT().SendCoinsFromModuleToAccount(gomock.Any(), types.ModuleName, gomock.Any(), gomock.Any()).AnyTimes() k := keeper.NewKeeper( cdc, diff --git a/testutil/keeper/proof.go b/testutil/keeper/proof.go index dba70ce68..3a6e8b68c 100644 --- a/testutil/keeper/proof.go +++ b/testutil/keeper/proof.go @@ -25,7 +25,11 @@ import ( "github.com/stretchr/testify/require" "github.com/pokt-network/poktroll/app" + applicationmocks "github.com/pokt-network/poktroll/testutil/application/mocks" + gatewaymocks "github.com/pokt-network/poktroll/testutil/gateway/mocks" "github.com/pokt-network/poktroll/testutil/proof/mocks" + sessionmocks "github.com/pokt-network/poktroll/testutil/session/mocks" + suppliermocks "github.com/pokt-network/poktroll/testutil/supplier/mocks" appkeeper "github.com/pokt-network/poktroll/x/application/keeper" apptypes "github.com/pokt-network/poktroll/x/application/types" gatewaykeeper "github.com/pokt-network/poktroll/x/gateway/keeper" @@ -56,7 +60,7 @@ type ProofModuleKeepers struct { Codec *codec.ProtoCodec } -// ProofKeepersOpt is a function which receives and potentailly modifies the context +// ProofKeepersOpt is a function which receives and potentially modifies the context // and proof keepers during construction of the aggregation. type ProofKeepersOpt func(context.Context, *ProofModuleKeepers) context.Context @@ -126,7 +130,6 @@ func NewProofModuleKeepers(t testing.TB, opts ...ProofKeepersOpt) (_ *ProofModul // Mock the bank keeper. ctrl := gomock.NewController(t) - bankKeeperMock := mocks.NewMockBankKeeper(ctrl) // Construct a real account keeper so that public keys can be queried. accountKeeper := authkeeper.NewAccountKeeper( @@ -145,7 +148,7 @@ func NewProofModuleKeepers(t testing.TB, opts ...ProofKeepersOpt) (_ *ProofModul runtime.NewKVStoreService(keys[gatewaytypes.StoreKey]), logger, authority.String(), - bankKeeperMock, + gatewaymocks.NewMockBankKeeper(ctrl), ) require.NoError(t, gatewayKeeper.SetParams(ctx, gatewaytypes.DefaultParams())) @@ -155,7 +158,7 @@ func NewProofModuleKeepers(t testing.TB, opts ...ProofKeepersOpt) (_ *ProofModul runtime.NewKVStoreService(keys[apptypes.StoreKey]), logger, authority.String(), - bankKeeperMock, + applicationmocks.NewMockBankKeeper(ctrl), accountKeeper, gatewayKeeper, ) @@ -167,7 +170,7 @@ func NewProofModuleKeepers(t testing.TB, opts ...ProofKeepersOpt) (_ *ProofModul runtime.NewKVStoreService(keys[suppliertypes.StoreKey]), log.NewNopLogger(), authority.String(), - bankKeeperMock, + suppliermocks.NewMockBankKeeper(ctrl), ) require.NoError(t, supplierKeeper.SetParams(ctx, suppliertypes.DefaultParams())) @@ -178,7 +181,7 @@ func NewProofModuleKeepers(t testing.TB, opts ...ProofKeepersOpt) (_ *ProofModul log.NewNopLogger(), authority.String(), accountKeeper, - bankKeeperMock, + sessionmocks.NewMockBankKeeper(ctrl), appKeeper, supplierKeeper, ) diff --git a/testutil/keeper/supplier.go b/testutil/keeper/supplier.go index 85c1cdff1..6f502a316 100644 --- a/testutil/keeper/supplier.go +++ b/testutil/keeper/supplier.go @@ -40,8 +40,8 @@ func SupplierKeeper(t testing.TB) (keeper.Keeper, context.Context) { ctrl := gomock.NewController(t) mockBankKeeper := mocks.NewMockBankKeeper(ctrl) - mockBankKeeper.EXPECT().DelegateCoinsFromAccountToModule(gomock.Any(), gomock.Any(), types.ModuleName, gomock.Any()).AnyTimes() - mockBankKeeper.EXPECT().UndelegateCoinsFromModuleToAccount(gomock.Any(), types.ModuleName, gomock.Any(), gomock.Any()).AnyTimes() + mockBankKeeper.EXPECT().SendCoinsFromAccountToModule(gomock.Any(), gomock.Any(), types.ModuleName, gomock.Any()).AnyTimes() + mockBankKeeper.EXPECT().SendCoinsFromModuleToAccount(gomock.Any(), types.ModuleName, gomock.Any(), gomock.Any()).AnyTimes() k := keeper.NewKeeper( cdc, diff --git a/testutil/keeper/tokenomics.go b/testutil/keeper/tokenomics.go index db7e0d517..1ef241ac6 100644 --- a/testutil/keeper/tokenomics.go +++ b/testutil/keeper/tokenomics.go @@ -12,34 +12,67 @@ import ( cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" dbm "github.com/cosmos/cosmos-db" "github.com/cosmos/cosmos-sdk/codec" + addresscodec "github.com/cosmos/cosmos-sdk/codec/address" codectypes "github.com/cosmos/cosmos-sdk/codec/types" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/runtime" + "github.com/cosmos/cosmos-sdk/testutil/integration" sdk "github.com/cosmos/cosmos-sdk/types" + authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" + "github.com/pokt-network/poktroll/app" "github.com/pokt-network/poktroll/testutil/sample" "github.com/pokt-network/poktroll/testutil/tokenomics/mocks" + appkeeper "github.com/pokt-network/poktroll/x/application/keeper" apptypes "github.com/pokt-network/poktroll/x/application/types" + gatewaykeeper "github.com/pokt-network/poktroll/x/gateway/keeper" + gatewaytypes "github.com/pokt-network/poktroll/x/gateway/types" + proofkeeper "github.com/pokt-network/poktroll/x/proof/keeper" + prooftypes "github.com/pokt-network/poktroll/x/proof/types" + sessionkeeper "github.com/pokt-network/poktroll/x/session/keeper" + sessiontypes "github.com/pokt-network/poktroll/x/session/types" sharedtypes "github.com/pokt-network/poktroll/x/shared/types" + supplierkeeper "github.com/pokt-network/poktroll/x/supplier/keeper" suppliertypes "github.com/pokt-network/poktroll/x/supplier/types" - "github.com/pokt-network/poktroll/x/tokenomics/keeper" - "github.com/pokt-network/poktroll/x/tokenomics/types" + tokenomicskeeper "github.com/pokt-network/poktroll/x/tokenomics/keeper" + tokenomicstypes "github.com/pokt-network/poktroll/x/tokenomics/types" ) -// TODO_TECHDEBT: Replace `AnyTimes` w/ `Times/MinTimes/MaxTimes` as the tests -// mature to be explicit about the number of expected tests. +// TokenomicsModuleKeepers is an aggregation of the tokenomics keeper, all its dependency +// keepers, and the codec that they share. Each keeper is embedded such that the +// TokenomicsModuleKeepers implements all the interfaces of the keepers. +// To call a method which is common to multiple keepers (e.g. `#SetParams()`), +// the field corresponding to the desired keeper on which to call the method +// MUST be specified (e.g. `keepers.AccountKeeper#SetParams()`). +type TokenomicsModuleKeepers struct { + *tokenomicskeeper.Keeper + tokenomicstypes.AccountKeeper + tokenomicstypes.BankKeeper + tokenomicstypes.ApplicationKeeper + tokenomicstypes.ProofKeeper + + Codec *codec.ProtoCodec +} + +// TokenomicsKeepersOpt is a function which receives and potentially modifies the context +// and tokenomics keepers during construction of the aggregation. +type TokenomicsKeepersOpt func(context.Context, *TokenomicsModuleKeepers) context.Context func TokenomicsKeeper(t testing.TB) ( - k keeper.Keeper, - ttx context.Context, + tokenomicsKeeper tokenomicskeeper.Keeper, + ctx context.Context, appAddr string, supplierAddr string, ) { t.Helper() - storeKey := storetypes.NewKVStoreKey(types.StoreKey) + storeKey := storetypes.NewKVStoreKey(tokenomicstypes.StoreKey) // Initialize the in-memory database. db := dbm.NewMemDB() @@ -88,13 +121,6 @@ func TokenomicsKeeper(t testing.TB) ( SetApplication(gomock.Any(), gomock.Any()). AnyTimes() - // Get test supplier if the address matches. - mockSupplierKeeper := mocks.NewMockSupplierKeeper(ctrl) - mockSupplierKeeper.EXPECT(). - GetSupplier(gomock.Any(), supplier.Address). - Return(supplier, true). - AnyTimes() - // Mock the bank keeper. mockBankKeeper := mocks.NewMockBankKeeper(ctrl) mockBankKeeper.EXPECT(). @@ -106,18 +132,16 @@ func TokenomicsKeeper(t testing.TB) ( mockBankKeeper.EXPECT(). SendCoinsFromModuleToAccount(gomock.Any(), suppliertypes.ModuleName, gomock.Any(), gomock.Any()). AnyTimes() - mockBankKeeper.EXPECT(). - SendCoinsFromAccountToModule(gomock.Any(), gomock.Any(), apptypes.ModuleName, gomock.Any()). - AnyTimes() - mockBankKeeper.EXPECT(). - UndelegateCoinsFromModuleToAccount(gomock.Any(), apptypes.ModuleName, gomock.Any(), gomock.Any()). - AnyTimes() // Mock the account keeper mockAccountKeeper := mocks.NewMockAccountKeeper(ctrl) mockAccountKeeper.EXPECT().GetAccount(gomock.Any(), gomock.Any()).AnyTimes() - tokenomicsKeeper := keeper.NewKeeper( + // Mock the proof keeper + mockProofKeeper := mocks.NewMockProofKeeper(ctrl) + mockProofKeeper.EXPECT().GetAllClaims(gomock.Any()).AnyTimes() + + k := tokenomicskeeper.NewKeeper( cdc, runtime.NewKVStoreService(storeKey), log.NewNopLogger(), @@ -125,13 +149,172 @@ func TokenomicsKeeper(t testing.TB) ( mockBankKeeper, mockAccountKeeper, mockApplicationKeeper, - mockSupplierKeeper, + mockProofKeeper, ) - ctx := sdk.NewContext(stateStore, cmtproto.Header{}, false, log.NewNopLogger()) + sdkCtx := sdk.NewContext(stateStore, cmtproto.Header{}, false, log.NewNopLogger()) // Initialize params - require.NoError(t, tokenomicsKeeper.SetParams(ctx, types.DefaultParams())) + require.NoError(t, k.SetParams(sdkCtx, tokenomicstypes.DefaultParams())) + + return k, sdkCtx, application.Address, supplier.Address +} + +// NewTokenomicsModuleKeepers is a helper function to create a tokenomics keeper +// and a context. It uses real dependencies for all upstream keepers. +func NewTokenomicsModuleKeepers( + t testing.TB, + opts ...TokenomicsKeepersOpt, +) (_ TokenomicsModuleKeepers, ctx context.Context) { + t.Helper() + + // Collect store keys for all keepers which be constructed & interact with the state store. + keys := storetypes.NewKVStoreKeys( + tokenomicstypes.StoreKey, + banktypes.StoreKey, + gatewaytypes.StoreKey, + authtypes.StoreKey, + sessiontypes.StoreKey, + apptypes.StoreKey, + suppliertypes.StoreKey, + prooftypes.StoreKey, + ) + + // Construct a multistore & mount store keys for each keeper that will interact with the state store. + stateStore := integration.CreateMultiStore(keys, log.NewNopLogger()) + + // Prepare the context + logger := log.NewTestLogger(t) + ctx = sdk.NewContext(stateStore, cmtproto.Header{}, false, logger) + + // ctx.SetAccount + // Prepare the account keeper. + registry := codectypes.NewInterfaceRegistry() + authtypes.RegisterInterfaces(registry) + cryptocodec.RegisterInterfaces(registry) + + // Prepare the chain's authority + cdc := codec.NewProtoCodec(registry) + authority := authtypes.NewModuleAddress(govtypes.ModuleName) + t.Logf("authority.String(): %s", authority.String()) + + // Construct a real account keeper so that public keys can be queried. + addrCodec := addresscodec.NewBech32Codec(app.AccountAddressPrefix) + accountKeeper := authkeeper.NewAccountKeeper( + cdc, + runtime.NewKVStoreService(keys[authtypes.StoreKey]), + authtypes.ProtoBaseAccount, + // These module accounts are necessary in order to settle balances + // during claim expiration. + map[string][]string{ + minttypes.ModuleName: {authtypes.Minter}, + suppliertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, + apptypes.ModuleName: {authtypes.Minter, authtypes.Burner}, + }, + addrCodec, + app.AccountAddressPrefix, + authority.String(), + ) + + // Construct a real bank keeper so that the balances can be updated & verified + bankKeeper := bankkeeper.NewBaseKeeper( + cdc, + runtime.NewKVStoreService(keys[banktypes.StoreKey]), + accountKeeper, + make(map[string]bool), + authority.String(), + logger, + ) + require.NoError(t, bankKeeper.SetParams(ctx, banktypes.DefaultParams())) + + // Provide some initial funds to the suppliers & applications module accounts. + bankKeeper.MintCoins(ctx, suppliertypes.ModuleName, sdk.NewCoins(sdk.NewCoin("upokt", math.NewInt(1000000000000)))) + bankKeeper.MintCoins(ctx, apptypes.ModuleName, sdk.NewCoins(sdk.NewCoin("upokt", math.NewInt(1000000000000)))) + + // Construct gateway keeper with a mocked bank keeper. + gatewayKeeper := gatewaykeeper.NewKeeper( + cdc, + runtime.NewKVStoreService(keys[gatewaytypes.StoreKey]), + logger, + authority.String(), + bankKeeper, + ) + require.NoError(t, gatewayKeeper.SetParams(ctx, gatewaytypes.DefaultParams())) + + // Construct an application keeper to add apps to sessions. + appKeeper := appkeeper.NewKeeper( + cdc, + runtime.NewKVStoreService(keys[apptypes.StoreKey]), + logger, + authority.String(), + bankKeeper, + accountKeeper, + gatewayKeeper, + ) + require.NoError(t, appKeeper.SetParams(ctx, apptypes.DefaultParams())) + + // Construct a real supplier keeper to add suppliers to sessions. + supplierKeeper := supplierkeeper.NewKeeper( + cdc, + runtime.NewKVStoreService(keys[suppliertypes.StoreKey]), + log.NewNopLogger(), + authority.String(), + bankKeeper, + ) + require.NoError(t, supplierKeeper.SetParams(ctx, suppliertypes.DefaultParams())) + + // Construct a real session keeper so that sessions can be queried. + sessionKeeper := sessionkeeper.NewKeeper( + cdc, + runtime.NewKVStoreService(keys[sessiontypes.StoreKey]), + logger, + authority.String(), + accountKeeper, + bankKeeper, + appKeeper, + supplierKeeper, + ) + require.NoError(t, sessionKeeper.SetParams(ctx, sessiontypes.DefaultParams())) + + // Construct a real proof keeper so that claims & proofs can be created. + proofKeeper := proofkeeper.NewKeeper( + cdc, + runtime.NewKVStoreService(keys[prooftypes.StoreKey]), + logger, + authority.String(), + sessionKeeper, + appKeeper, + accountKeeper, + ) + + // Construct a real tokenomics keeper so that claims & tokenomics can be created. + tokenomicsKeeper := tokenomicskeeper.NewKeeper( + cdc, + runtime.NewKVStoreService(keys[tokenomicstypes.StoreKey]), + logger, + authority.String(), + bankKeeper, + accountKeeper, + appKeeper, + proofKeeper, + ) + + require.NoError(t, tokenomicsKeeper.SetParams(ctx, tokenomicstypes.DefaultParams())) + + keepers := TokenomicsModuleKeepers{ + Keeper: &tokenomicsKeeper, + AccountKeeper: &accountKeeper, + BankKeeper: &bankKeeper, + ApplicationKeeper: &appKeeper, + ProofKeeper: &proofKeeper, + + Codec: cdc, + } + + // Apply any options to update the keepers or context prior to returning them. + for _, opt := range opts { + ctx = opt(ctx, &keepers) + } - return tokenomicsKeeper, ctx, application.Address, supplier.Address + return keepers, ctx } diff --git a/testutil/testrelayer/hash.go b/testutil/testrelayer/hash.go deleted file mode 100644 index d8c78e64e..000000000 --- a/testutil/testrelayer/hash.go +++ /dev/null @@ -1,16 +0,0 @@ -package testrelayer - -import ( - "hash" - "testing" - - "github.com/stretchr/testify/require" -) - -// TODO_TECHDEBT(@h5law): Retrieve the relay hasher mechanism from the `smt` repo. -func HashBytes(t *testing.T, newHasher func() hash.Hash, relayBz []byte) []byte { - hasher := newHasher() - _, err := hasher.Write(relayBz) - require.NoError(t, err) - return hasher.Sum(nil) -} diff --git a/testutil/testrelayer/relays.go b/testutil/testrelayer/relays.go index db415b468..858bb1f68 100644 --- a/testutil/testrelayer/relays.go +++ b/testutil/testrelayer/relays.go @@ -6,7 +6,6 @@ import ( "github.com/stretchr/testify/require" "github.com/pokt-network/poktroll/pkg/relayer" - "github.com/pokt-network/poktroll/pkg/relayer/miner" servicetypes "github.com/pokt-network/poktroll/x/service/types" sessiontypes "github.com/pokt-network/poktroll/x/session/types" ) @@ -30,11 +29,12 @@ func NewMinedRelay( Res: &servicetypes.RelayResponse{}, } - // TODO_BLOCKER: use canonical codec to serialize the relay + // TODO_TECHDEBT(#446): Centralize the configuration for the SMT spec. + // TODO_BLOCKER: marshal using canonical codec. relayBz, err := relay.Marshal() require.NoError(t, err) - - relayHash := HashBytes(t, miner.DefaultRelayHasher, relayBz) + relayHashArr := servicetypes.GetHashFromBytes(relayBz) + relayHash := relayHashArr[:] return &relayer.MinedRelay{ Relay: relay, diff --git a/tools/scripts/goimports/filters/filters.go b/tools/scripts/goimports/filters/filters.go index 67a048a51..5b78f4eb9 100644 --- a/tools/scripts/goimports/filters/filters.go +++ b/tools/scripts/goimports/filters/filters.go @@ -38,7 +38,7 @@ func PathMatchesProtobufGatewayGo(path string) (bool, error) { // PathMatchesMockGo matches generated mock go source files. func PathMatchesMockGo(path string) (bool, error) { - return strings.HasSuffix(path, "_mock.go"), nil + return (strings.HasSuffix(path, "_mock.go") || strings.Contains(path, "/gomock_reflect_")), nil } // PathMatchesTestGo matches go test files. diff --git a/x/application/keeper/application_test.go b/x/application/keeper/application_test.go index e2775d9a0..6196c8e44 100644 --- a/x/application/keeper/application_test.go +++ b/x/application/keeper/application_test.go @@ -5,8 +5,10 @@ import ( "strconv" "testing" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/stretchr/testify/require" + "github.com/pokt-network/poktroll/cmd/poktrolld/cmd" keepertest "github.com/pokt-network/poktroll/testutil/keeper" "github.com/pokt-network/poktroll/testutil/nullify" "github.com/pokt-network/poktroll/x/application/keeper" @@ -26,6 +28,17 @@ func createNApplications(keeper keeper.Keeper, ctx context.Context, n int) []typ return apps } +func init() { + cmd.InitSDKConfig() +} + +// The module address is derived off of its semantic name. +// This test is a helper for us to easily identify the underlying address. +func TestModuleAddressApplication(t *testing.T) { + moduleAddress := authtypes.NewModuleAddress(types.ModuleName) + require.Equal(t, "pokt1rl3gjgzexmplmds3tq3r3yk84zlwdl6djzgsvm", moduleAddress.String()) +} + func TestApplicationGet(t *testing.T) { keeper, ctx := keepertest.ApplicationKeeper(t) apps := createNApplications(keeper, ctx, 10) diff --git a/x/application/keeper/msg_server_stake_application.go b/x/application/keeper/msg_server_stake_application.go index 387372d76..43952fb3a 100644 --- a/x/application/keeper/msg_server_stake_application.go +++ b/x/application/keeper/msg_server_stake_application.go @@ -19,39 +19,48 @@ func (k msgServer) StakeApplication(ctx context.Context, msg *types.MsgStakeAppl } // Check if the application already exists or not - var ( - err error - coinsToDelegate sdk.Coin - ) - + var err error + var coinsToEscrow sdk.Coin foundApp, isAppFound := k.GetApplication(ctx, msg.Address) if !isAppFound { - logger.Info(fmt.Sprintf("Application not found. Creating new application for address %s", msg.Address)) + logger.Info(fmt.Sprintf("Application not found. Creating new application for address %q", msg.Address)) foundApp = k.createApplication(ctx, msg) - coinsToDelegate = *msg.Stake + coinsToEscrow = *msg.Stake } else { - logger.Info(fmt.Sprintf("Application found. Updating application for address %s", msg.Address)) + logger.Info(fmt.Sprintf("Application found. About to try and update application for address %q", msg.Address)) currAppStake := *foundApp.Stake if err = k.updateApplication(ctx, &foundApp, msg); err != nil { + logger.Error(fmt.Sprintf("could not update application for address %q due to error %v", msg.Address, err)) + return nil, err + } + coinsToEscrow, err = (*msg.Stake).SafeSub(currAppStake) + if err != nil { + logger.Error(fmt.Sprintf("could not calculate coins to escrow due to error %v", err)) return nil, err } - coinsToDelegate = (*msg.Stake).Sub(currAppStake) + logger.Info(fmt.Sprintf("Application is going to escrow an additional %+v coins", coinsToEscrow)) + } + + // Must always stake or upstake (> 0 delta) + if coinsToEscrow.IsZero() { + logger.Warn(fmt.Sprintf("Application %q must escrow more than 0 additional coins", msg.Address)) + return nil, types.ErrAppInvalidStake.Wrapf("application %q must escrow more than 0 additional coins", msg.Address) } // Retrieve the address of the application appAddress, err := sdk.AccAddressFromBech32(msg.Address) if err != nil { - logger.Error(fmt.Sprintf("could not parse address %s", msg.Address)) + logger.Error(fmt.Sprintf("could not parse address %q", msg.Address)) return nil, err } - // TODO_IMPROVE: Should we avoid making this call if `coinsToDelegate` = 0? // Send the coins from the application to the staked application pool - err = k.bankKeeper.DelegateCoinsFromAccountToModule(ctx, appAddress, types.ModuleName, []sdk.Coin{coinsToDelegate}) + err = k.bankKeeper.SendCoinsFromAccountToModule(ctx, appAddress, types.ModuleName, []sdk.Coin{coinsToEscrow}) if err != nil { - logger.Error(fmt.Sprintf("could not send %v coins from %s to %s module account due to %v", coinsToDelegate, appAddress, types.ModuleName, err)) + logger.Error(fmt.Sprintf("could not send %v coins from %q to %q module account due to %v", coinsToEscrow, appAddress, types.ModuleName, err)) return nil, err } + logger.Info(fmt.Sprintf("Successfully escrowed %v coins from %q to %q module account", coinsToEscrow, appAddress, types.ModuleName)) // Update the Application in the store k.SetApplication(ctx, foundApp) @@ -79,7 +88,7 @@ func (k msgServer) updateApplication( ) error { // Checks if the the msg address is the same as the current owner if msg.Address != app.Address { - return types.ErrAppUnauthorized.Wrapf("msg Address (%s) != application address (%s)", msg.Address, app.Address) + return types.ErrAppUnauthorized.Wrapf("msg Address %q != application address %q", msg.Address, app.Address) } // Validate that the stake is not being lowered diff --git a/x/application/keeper/msg_server_unstake_application.go b/x/application/keeper/msg_server_unstake_application.go index 5965adc31..4062c5a32 100644 --- a/x/application/keeper/msg_server_unstake_application.go +++ b/x/application/keeper/msg_server_unstake_application.go @@ -30,7 +30,7 @@ func (k msgServer) UnstakeApplication(ctx context.Context, msg *types.MsgUnstake } // Send the coins from the application pool back to the application - err = k.bankKeeper.UndelegateCoinsFromModuleToAccount(ctx, types.ModuleName, appAddress, []sdk.Coin{*foundApp.Stake}) + err = k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, appAddress, []sdk.Coin{*foundApp.Stake}) if err != nil { logger.Error(fmt.Sprintf("could not send %v coins from %s module to %s account due to %v", foundApp.Stake, appAddress, types.ModuleName, err)) return nil, err diff --git a/x/application/module/module.go b/x/application/module/module.go index e817ddf53..9283099e7 100644 --- a/x/application/module/module.go +++ b/x/application/module/module.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" + // this line is used by starport scaffolding # 1 + "cosmossdk.io/core/appmodule" "cosmossdk.io/core/store" "cosmossdk.io/depinject" @@ -18,8 +20,6 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/grpc-ecosystem/grpc-gateway/runtime" - // this line is used by starport scaffolding # 1 - modulev1 "github.com/pokt-network/poktroll/api/poktroll/application/module" "github.com/pokt-network/poktroll/x/application/keeper" "github.com/pokt-network/poktroll/x/application/types" diff --git a/x/application/module/query_application_test.go b/x/application/module/query_application_test.go index b97fcf71b..0a9c96efc 100644 --- a/x/application/module/query_application_test.go +++ b/x/application/module/query_application_test.go @@ -5,7 +5,7 @@ import ( "strconv" "testing" - tmcli "github.com/cometbft/cometbft/libs/cli" + cometcli "github.com/cometbft/cometbft/libs/cli" "github.com/cosmos/cosmos-sdk/client/flags" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" "github.com/stretchr/testify/require" @@ -22,7 +22,7 @@ func TestShowApplication(t *testing.T) { ctx := net.Validators[0].ClientCtx common := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), + fmt.Sprintf("--%s=json", cometcli.OutputFlag), } tests := []struct { desc string @@ -78,7 +78,7 @@ func TestListApplication(t *testing.T) { ctx := net.Validators[0].ClientCtx request := func(next []byte, offset, limit uint64, total bool) []string { args := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), + fmt.Sprintf("--%s=json", cometcli.OutputFlag), } if next == nil { args = append(args, fmt.Sprintf("--%s=%d", flags.FlagOffset, offset)) diff --git a/x/application/types/expected_keepers.go b/x/application/types/expected_keepers.go index 69fb7ac82..cc74e6f89 100644 --- a/x/application/types/expected_keepers.go +++ b/x/application/types/expected_keepers.go @@ -18,8 +18,12 @@ type AccountKeeper interface { // BankKeeper defines the expected interface for the Bank module. type BankKeeper interface { - DelegateCoinsFromAccountToModule(ctx context.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error - UndelegateCoinsFromModuleToAccount(ctx context.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error + // We use the bankkeeper SendXXX instead of DelegateXX methods + // because their purpose is to "escrow" funds on behalf of an account rather + // than "delegate" funds from one account to another which is more closely + // linked to staking. + SendCoinsFromAccountToModule(ctx context.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error + SendCoinsFromModuleToAccount(ctx context.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error } // GatewayKeeper defines the expected interface needed to retrieve gateway information. diff --git a/x/gateway/keeper/gateway_test.go b/x/gateway/keeper/gateway_test.go index 58d74e7fd..4e486b7ce 100644 --- a/x/gateway/keeper/gateway_test.go +++ b/x/gateway/keeper/gateway_test.go @@ -32,7 +32,9 @@ func createNGateways(keeper keeper.Keeper, ctx context.Context, n int) []types.G return gateway } -func TestGatewayModuleAddress(t *testing.T) { +// The module address is derived off of its semantic name. +// This test is a helper for us to easily identify the underlying address. +func TestModuleAddressGateway(t *testing.T) { moduleAddress := authtypes.NewModuleAddress(types.ModuleName) require.Equal(t, "pokt1f6j7u6875p2cvyrgjr0d2uecyzah0kget9vlpl", moduleAddress.String()) } diff --git a/x/gateway/keeper/msg_server_stake_gateway.go b/x/gateway/keeper/msg_server_stake_gateway.go index 9f257a98f..3aee90437 100644 --- a/x/gateway/keeper/msg_server_stake_gateway.go +++ b/x/gateway/keeper/msg_server_stake_gateway.go @@ -9,6 +9,8 @@ import ( "github.com/pokt-network/poktroll/x/gateway/types" ) +// TODO_IMPROVE(@Olshansk): Add more logging to staking & unstaking branches (success, failure, etc...). + func (k msgServer) StakeGateway( goCtx context.Context, msg *types.MsgStakeGateway, @@ -24,37 +26,45 @@ func (k msgServer) StakeGateway( // Check if the gateway already exists or not var err error - var coinsToDelegate sdk.Coin + var coinsToEscrow sdk.Coin gateway, isGatewayFound := k.GetGateway(ctx, msg.Address) if !isGatewayFound { - logger.Info(fmt.Sprintf("Gateway not found. Creating new gateway for address %s", msg.Address)) + logger.Info(fmt.Sprintf("Gateway not found. Creating new gateway for address %q", msg.Address)) gateway = k.createGateway(ctx, msg) - coinsToDelegate = *msg.Stake + coinsToEscrow = *msg.Stake } else { - logger.Info(fmt.Sprintf("Gateway found. Updating gateway stake for address %s", msg.Address)) + logger.Info(fmt.Sprintf("Gateway found. About to try and update gateway for address %q", msg.Address)) currGatewayStake := *gateway.Stake if err = k.updateGateway(ctx, &gateway, msg); err != nil { + logger.Error(fmt.Sprintf("could not update gateway for address %q due to error %v", msg.Address, err)) return nil, err } - coinsToDelegate, err = (*msg.Stake).SafeSub(currGatewayStake) + coinsToEscrow, err = (*msg.Stake).SafeSub(currGatewayStake) if err != nil { return nil, err } + logger.Info(fmt.Sprintf("Gateway is going to escrow an additional %+v coins", coinsToEscrow)) + } + + // Must always stake or upstake (> 0 delta) + if coinsToEscrow.IsZero() { + logger.Warn(fmt.Sprintf("Gateway %q must escrow more than 0 additional coins", msg.Address)) + return nil, types.ErrGatewayInvalidStake.Wrapf("gateway %q must escrow more than 0 additional coins", msg.Address) } // Retrieve the address of the gateway gatewayAddress, err := sdk.AccAddressFromBech32(msg.Address) if err != nil { // TODO_TECHDEBT(#384): determine whether to continue using cosmos logger for debug level. - logger.Error(fmt.Sprintf("could not parse address %s", msg.Address)) + logger.Error(fmt.Sprintf("could not parse address %q", msg.Address)) return nil, err } // Send the coins from the gateway to the staked gateway pool - err = k.bankKeeper.DelegateCoinsFromAccountToModule(ctx, gatewayAddress, types.ModuleName, []sdk.Coin{coinsToDelegate}) + err = k.bankKeeper.SendCoinsFromAccountToModule(ctx, gatewayAddress, types.ModuleName, []sdk.Coin{coinsToEscrow}) if err != nil { // TODO_TECHDEBT(#384): determine whether to continue using cosmos logger for debug level. - logger.Error(fmt.Sprintf("could not send %v coins from %s to %s module account due to %v", coinsToDelegate, gatewayAddress, types.ModuleName, err)) + logger.Error(fmt.Sprintf("could not escrowed %v coins from %q to %q module account due to %v", coinsToEscrow, gatewayAddress, types.ModuleName, err)) return nil, err } @@ -82,7 +92,7 @@ func (k msgServer) updateGateway( ) error { // Checks if the the msg address is the same as the current owner if msg.Address != gateway.Address { - return types.ErrGatewayUnauthorized.Wrapf("msg Address (%s) != gateway address (%s)", msg.Address, gateway.Address) + return types.ErrGatewayUnauthorized.Wrapf("msg Address %q != gateway address %q", msg.Address, gateway.Address) } if msg.Stake == nil { return types.ErrGatewayInvalidStake.Wrapf("stake amount cannot be nil") diff --git a/x/gateway/keeper/msg_server_unstake_gateway.go b/x/gateway/keeper/msg_server_unstake_gateway.go index 302c388f2..e3b6673a5 100644 --- a/x/gateway/keeper/msg_server_unstake_gateway.go +++ b/x/gateway/keeper/msg_server_unstake_gateway.go @@ -41,7 +41,7 @@ func (k msgServer) UnstakeGateway( } // Send the coins from the gateway pool back to the gateway - err = k.bankKeeper.UndelegateCoinsFromModuleToAccount(ctx, types.ModuleName, gatewayAddress, []sdk.Coin{*gateway.Stake}) + err = k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, gatewayAddress, []sdk.Coin{*gateway.Stake}) if err != nil { logger.Error(fmt.Sprintf("could not send %v coins from %s module to %s account due to %v", gateway.Stake, gatewayAddress, types.ModuleName, err)) return nil, err diff --git a/x/gateway/module/query_gateway_test.go b/x/gateway/module/query_gateway_test.go index e9b4d07b8..be80d4178 100644 --- a/x/gateway/module/query_gateway_test.go +++ b/x/gateway/module/query_gateway_test.go @@ -5,7 +5,7 @@ import ( "strconv" "testing" - tmcli "github.com/cometbft/cometbft/libs/cli" + cometcli "github.com/cometbft/cometbft/libs/cli" "github.com/cosmos/cosmos-sdk/client/flags" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" "github.com/stretchr/testify/require" @@ -25,7 +25,7 @@ func TestShowGateway(t *testing.T) { ctx := net.Validators[0].ClientCtx common := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), + fmt.Sprintf("--%s=json", cometcli.OutputFlag), } tests := []struct { desc string @@ -81,7 +81,7 @@ func TestListGateway(t *testing.T) { ctx := net.Validators[0].ClientCtx request := func(next []byte, offset, limit uint64, total bool) []string { args := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), + fmt.Sprintf("--%s=json", cometcli.OutputFlag), } if next == nil { args = append(args, fmt.Sprintf("--%s=%d", flags.FlagOffset, offset)) diff --git a/x/gateway/types/expected_keepers.go b/x/gateway/types/expected_keepers.go index ca22179fc..54bfdf314 100644 --- a/x/gateway/types/expected_keepers.go +++ b/x/gateway/types/expected_keepers.go @@ -16,16 +16,10 @@ type AccountKeeper interface { // BankKeeper defines the expected interface for the Bank module. type BankKeeper interface { - DelegateCoinsFromAccountToModule( - ctx context.Context, - senderAddr sdk.AccAddress, - recipientModule string, - amt sdk.Coins, - ) error - UndelegateCoinsFromModuleToAccount( - ctx context.Context, - senderModule string, - recipientAddr sdk.AccAddress, - amt sdk.Coins, - ) error + // We use the bankkeeper SendXXX instead of DelegateXX methods + // because their purpose is to "escrow" funds on behalf of an account rather + // than "delegate" funds from one account to another which is more closely + // linked to staking. + SendCoinsFromAccountToModule(ctx context.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error + SendCoinsFromModuleToAccount(ctx context.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error } diff --git a/x/proof/keeper/claim.go b/x/proof/keeper/claim.go index 4e37002ae..4660a4451 100644 --- a/x/proof/keeper/claim.go +++ b/x/proof/keeper/claim.go @@ -22,14 +22,12 @@ func (k Keeper) UpsertClaim(ctx context.Context, claim types.Claim) { sessionId := claim.GetSessionHeader().GetSessionId() primaryKey := types.ClaimPrimaryKey(sessionId, claim.SupplierAddress) primaryStore.Set(primaryKey, claimBz) - logger.Info(fmt.Sprintf("upserted claim for supplier %s with primaryKey %s", claim.SupplierAddress, primaryKey)) // Update the address index: supplierAddress -> [ClaimPrimaryKey] supplierAddrStore := prefix.NewStore(storeAdapter, types.KeyPrefix(types.ClaimSupplierAddressPrefix)) supplierAddrKey := types.ClaimSupplierAddressKey(claim.SupplierAddress, primaryKey) supplierAddrStore.Set(supplierAddrKey, primaryKey) - logger.Info(fmt.Sprintf("indexed claim for supplier %s with primaryKey %s", claim.SupplierAddress, primaryKey)) // Update the session end height index: sessionEndHeight -> [ClaimPrimaryKey] @@ -37,7 +35,6 @@ func (k Keeper) UpsertClaim(ctx context.Context, claim types.Claim) { sessionEndHeight := claim.GetSessionHeader().GetSessionEndBlockHeight() sessionEndHeightKey := types.ClaimSupplierEndSessionHeightKey(sessionEndHeight, primaryKey) sessionEndHeightStore.Set(sessionEndHeightKey, primaryKey) - logger.Info(fmt.Sprintf("indexed claim for supplier %s at session ending height %d", claim.SupplierAddress, sessionEndHeight)) } diff --git a/x/proof/keeper/msg_server_create_claim.go b/x/proof/keeper/msg_server_create_claim.go index 15e7b47e9..5fe7bf477 100644 --- a/x/proof/keeper/msg_server_create_claim.go +++ b/x/proof/keeper/msg_server_create_claim.go @@ -14,28 +14,28 @@ func (k msgServer) CreateClaim(ctx context.Context, msg *types.MsgCreateClaim) ( // TODO_BLOCKER: Validate the signature on the Claim message corresponds to the supplier before Upserting. logger := k.Logger().With("method", "CreateClaim") - logger.Debug("creating claim") + logger.Info("creating claim") if err := msg.ValidateBasic(); err != nil { return nil, err } + sessionHeader := msg.GetSessionHeader() session, err := k.queryAndValidateSessionHeader( ctx, - msg.GetSessionHeader(), + sessionHeader, msg.GetSupplierAddress(), ) if err != nil { return nil, status.Error(codes.InvalidArgument, err.Error()) } - logger. + logger = logger. With( "session_id", session.GetSessionId(), - "session_end_height", msg.GetSessionHeader().GetSessionEndBlockHeight(), + "session_end_height", sessionHeader.GetSessionEndBlockHeight(), "supplier", msg.GetSupplierAddress(), - ). - Debug("validated claim") + ) /* TODO_INCOMPLETE: @@ -49,10 +49,12 @@ func (k msgServer) CreateClaim(ctx context.Context, msg *types.MsgCreateClaim) ( 2. [ ] msg distribution validation */ + logger.Info("validated claim") + // Construct and upsert claim after all validation. claim := types.Claim{ SupplierAddress: msg.GetSupplierAddress(), - SessionHeader: msg.GetSessionHeader(), + SessionHeader: sessionHeader, RootHash: msg.GetRootHash(), } @@ -60,13 +62,7 @@ func (k msgServer) CreateClaim(ctx context.Context, msg *types.MsgCreateClaim) ( // in any case where the supplier should no longer be able to update the given proof. k.Keeper.UpsertClaim(ctx, claim) - logger. - With( - "session_id", claim.GetSessionHeader().GetSessionId(), - "session_end_height", claim.GetSessionHeader().GetSessionEndBlockHeight(), - "supplier", claim.GetSupplierAddress(), - ). - Debug("created claim") + logger.Info("created new claim") // TODO: return the claim in the response. return &types.MsgCreateClaimResponse{}, nil diff --git a/x/proof/keeper/msg_server_create_claim_test.go b/x/proof/keeper/msg_server_create_claim_test.go index 6aef6b5a3..b9c56626c 100644 --- a/x/proof/keeper/msg_server_create_claim_test.go +++ b/x/proof/keeper/msg_server_create_claim_test.go @@ -13,6 +13,7 @@ import ( apptypes "github.com/pokt-network/poktroll/x/application/types" "github.com/pokt-network/poktroll/x/proof/keeper" "github.com/pokt-network/poktroll/x/proof/types" + sessionkeeper "github.com/pokt-network/poktroll/x/session/keeper" sessiontypes "github.com/pokt-network/poktroll/x/session/types" sharedtypes "github.com/pokt-network/poktroll/x/shared/types" ) @@ -284,10 +285,10 @@ func newTestClaimMsg( supplierAddr, &sessiontypes.SessionHeader{ ApplicationAddress: appAddr, - SessionId: sessionId, Service: service, + SessionId: sessionId, SessionStartBlockHeight: 1, - SessionEndBlockHeight: 4, + SessionEndBlockHeight: sessionkeeper.GetSessionEndBlockHeight(1), }, merkleRoot, ) diff --git a/x/proof/keeper/msg_server_submit_proof.go b/x/proof/keeper/msg_server_submit_proof.go index 5a49f7cf8..74940907e 100644 --- a/x/proof/keeper/msg_server_submit_proof.go +++ b/x/proof/keeper/msg_server_submit_proof.go @@ -1,9 +1,14 @@ package keeper +// TODO_TECHDEBT(@bryanchriswhite): Replace all logs in x/ from `.Info` to +// `.Debug` when the logger is replaced close to or after MainNet launch. +// Ref: https://github.com/pokt-network/poktroll/pull/448#discussion_r1549742985 + import ( "bytes" "context" "crypto/sha256" + "fmt" "hash" "github.com/pokt-network/smt" @@ -34,10 +39,22 @@ func init() { // SubmitProof is the server handler to submit and store a proof on-chain. // A proof that's stored on-chain is what leads to rewards (i.e. inflation) // downstream, making the series of checks a critical part of the protocol. -// TODO_BLOCKER: Prevent proof upserts after the tokenomics module has processes the respective session. +// +// TODO_BLOCKER: Prevent proof upserts after the tokenomics module has processed +// the respective session. +// +// Note: The entity sending the SubmitProof messages does not necessarily need +// to correspond to the supplier signing the proof. For example, a single entity +// could (theoretically) batch multiple proofs (signed by the corresponding supplier) +// into one transaction to save on transaction fees. func (k msgServer) SubmitProof(ctx context.Context, msg *types.MsgSubmitProof) (*types.MsgSubmitProofResponse, error) { + // TODO_BLOCKER_DISCUSS: A potential issue with doing proof validation inside + // `SubmitProof` is that we will not be storing false proofs on-chain (e.g. for slashing purposes). + // This could be considered a feature (e.g. less state bloat against sybil attacks) + // or a bug (i.e. no mechanisms for slashing suppliers who submit false proofs). + // Revisit this prior to mainnet launch as to whether the business logic for settling sessions should be in EndBlocker or here. logger := k.Logger().With("method", "SubmitProof") - logger.Debug("about to start submitting proof") + logger.Info("About to start submitting proof") /* TODO_DOCUMENT(@bryanchriswhite): Document these steps in proof @@ -64,17 +81,27 @@ func (k msgServer) SubmitProof(ctx context.Context, msg *types.MsgSubmitProof) ( ## Relay Mining validation 1. verify(proof.path) is the expected path; pseudo-random variation using on-chain data - 2. verify(proof.ValueHash, expectedDiffictulty); governance based + 2. verify(proof.ValueHash, expectedDifficulty); governance based 3. verify(claim.Root, proof.ClosestProof); verify the closest proof is correct */ + // Decomposing a few variables for easier access + sessionHeader := msg.GetSessionHeader() + supplierAddr := msg.GetSupplierAddress() + + // Helpers for logging the same metadata throughout this function calls + logger = logger.With( + "session_id", sessionHeader.GetSessionId(), + "session_end_height", sessionHeader.GetSessionEndBlockHeight(), + "supplier", supplierAddr) + // Basic validation of the SubmitProof message. if err := msg.ValidateBasic(); err != nil { return nil, status.Error(codes.InvalidArgument, err.Error()) } + logger.Info("validated the submitProof message ") // Retrieve the supplier's public key. - supplierAddr := msg.GetSupplierAddress() supplierPubKey, err := k.accountQuerier.GetPubKeyFromAddress(ctx, supplierAddr) if err != nil { return nil, status.Error(codes.FailedPrecondition, err.Error()) @@ -83,11 +110,12 @@ func (k msgServer) SubmitProof(ctx context.Context, msg *types.MsgSubmitProof) ( // Validate the session header. if _, err := k.queryAndValidateSessionHeader( ctx, - msg.GetSessionHeader(), + sessionHeader, supplierAddr, ); err != nil { return nil, status.Error(codes.InvalidArgument, err.Error()) } + logger.Info("queried and validated the session header") // Unmarshal the closest merkle proof from the message. sparseMerkleClosestProof := &smt.SparseMerkleClosestProof{} @@ -113,51 +141,44 @@ func (k msgServer) SubmitProof(ctx context.Context, msg *types.MsgSubmitProof) ( ) } - logger = logger. - With( - "session_id", msg.GetSessionHeader().GetSessionId(), - "session_end_height", msg.GetSessionHeader().GetSessionEndBlockHeight(), - "supplier", supplierAddr, - ) - // Basic validation of the relay request. relayReq := relay.GetReq() if err := relayReq.ValidateBasic(); err != nil { return nil, status.Error(codes.FailedPrecondition, err.Error()) } - logger.Debug("successfully validated relay request") + logger.Info("successfully validated relay request") // Basic validation of the relay response. relayRes := relay.GetRes() if err := relayRes.ValidateBasic(); err != nil { return nil, status.Error(codes.FailedPrecondition, err.Error()) } - logger.Debug("successfully validated relay response") + logger.Info("successfully validated relay response") // Verify that the relay request session header matches the proof session header. if err := compareSessionHeaders(msg.GetSessionHeader(), relayReq.Meta.GetSessionHeader()); err != nil { return nil, status.Error(codes.FailedPrecondition, err.Error()) } - logger.Debug("successfully compared relay request session header") + logger.Info("successfully compared relay request session header") // Verify that the relay response session header matches the proof session header. if err := compareSessionHeaders(msg.GetSessionHeader(), relayRes.Meta.GetSessionHeader()); err != nil { return nil, status.Error(codes.FailedPrecondition, err.Error()) } - logger.Debug("successfully compared relay response session header") + logger.Info("successfully compared relay response session header") // Verify the relay request's signature. // TODO_TECHDEBT(@h5law): Fetch the correct ring for the session this relay is from. if err := k.ringClient.VerifyRelayRequestSignature(ctx, relayReq); err != nil { return nil, status.Error(codes.FailedPrecondition, err.Error()) } - logger.Debug("successfully verified relay request signature") + logger.Info("successfully verified relay request signature") // Verify the relay response's signature. if err := relayRes.VerifySupplierSignature(supplierPubKey); err != nil { return nil, status.Error(codes.FailedPrecondition, err.Error()) } - logger.Debug("successfully verified relay response signature") + logger.Info("successfully verified relay response signature") // Get the proof module's governance parameters. params := k.GetParams(ctx) @@ -166,14 +187,14 @@ func (k msgServer) SubmitProof(ctx context.Context, msg *types.MsgSubmitProof) ( if err := validateMiningDifficulty(relayBz, params.MinRelayDifficultyBits); err != nil { return nil, status.Error(codes.FailedPrecondition, err.Error()) } - logger.Debug("successfully validated relay mining difficulty") + logger.Info("successfully validated relay mining difficulty") // Validate that path the proof is submitted for matches the expected one // based on the pseudo-random on-chain data associated with the header. if err := k.validateClosestPath(ctx, sparseMerkleClosestProof, msg.GetSessionHeader()); err != nil { return nil, status.Error(codes.FailedPrecondition, err.Error()) } - logger.Debug("successfully validated proof path") + logger.Info("successfully validated proof path") // Verify the relay's difficulty. if err := validateMiningDifficulty(relayBz, params.MinRelayDifficultyBits); err != nil { @@ -186,13 +207,13 @@ func (k msgServer) SubmitProof(ctx context.Context, msg *types.MsgSubmitProof) ( if err != nil { return nil, status.Error(codes.FailedPrecondition, err.Error()) } - logger.Debug("successfully retrieved and validated claim") + logger.Info("successfully retrieved and validated claim") // Verify the proof's closest merkle proof. if err := verifyClosestProof(sparseMerkleClosestProof, claim.GetRootHash()); err != nil { return nil, status.Error(codes.FailedPrecondition, err.Error()) } - logger.Debug("successfully verified closest merkle proof") + logger.Info("successfully verified closest merkle proof") // Construct and insert proof after all validation. proof := types.Proof{ @@ -200,14 +221,12 @@ func (k msgServer) SubmitProof(ctx context.Context, msg *types.MsgSubmitProof) ( SessionHeader: msg.GetSessionHeader(), ClosestMerkleProof: msg.GetProof(), } + logger.Info(fmt.Sprintf("queried and validated the claim for session ID %q", sessionHeader.SessionId)) // TODO_BLOCKER: check if this proof already exists and return an appropriate error // in any case where the supplier should no longer be able to update the given proof. - k.Keeper.UpsertProof(ctx, proof) - - // TODO_UPNEXT(@Olshansk, #359): Call `tokenomics.SettleSessionAccounting()` here - - logger.Debug("successfully submitted proof") + k.UpsertProof(ctx, proof) + logger.Info("successfully upserted the proof") return &types.MsgSubmitProofResponse{}, nil } @@ -427,6 +446,8 @@ func GetPathForProof(blockHash []byte, sessionId string) []byte { // TODO_BLOCKER(@Olshansk, @red-0ne, @h5law): We need to replace the return // statement below and change all relevant parts in the codebase. // See the conversation in the following thread for more details: https://github.com/pokt-network/poktroll/pull/406#discussion_r1520790083 - return blockHash + path := make([]byte, SmtSpec.PathHasherSize()) + copy(path, blockHash) + return path // return pathHasher.Sum(append(blockHash, []byte(sessionId)...)) } diff --git a/x/proof/keeper/proof.go b/x/proof/keeper/proof.go index 2a8d2a018..3308ab006 100644 --- a/x/proof/keeper/proof.go +++ b/x/proof/keeper/proof.go @@ -46,7 +46,7 @@ func (k Keeper) GetProof(ctx context.Context, sessionId, supplierAddr string) (_ // RemoveProof removes a proof from the store func (k Keeper) RemoveProof(ctx context.Context, sessionId, supplierAddr string) { - logger := k.Logger().With("method", "RemoveClaim") + logger := k.Logger().With("method", "RemoveProof") storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) primaryStore := prefix.NewStore(storeAdapter, types.KeyPrefix(types.ProofPrimaryKeyPrefix)) diff --git a/x/proof/keeper/proof_test.go b/x/proof/keeper/proof_test.go index 2cb43b127..fb893c5d3 100644 --- a/x/proof/keeper/proof_test.go +++ b/x/proof/keeper/proof_test.go @@ -37,7 +37,7 @@ func createNProofs(keeper keeper.Keeper, ctx context.Context, n int) []types.Pro Service: &sharedtypes.Service{Id: testServiceId}, SessionId: fmt.Sprintf("session-%d", i), SessionStartBlockHeight: 1, - SessionEndBlockHeight: 1 + sessionkeeper.NumBlocksPerSession, + SessionEndBlockHeight: sessionkeeper.GetSessionEndBlockHeight(1), }, ClosestMerkleProof: nil, } diff --git a/x/proof/module/helpers_test.go b/x/proof/module/helpers_test.go index e613322a7..1d4ed38ed 100644 --- a/x/proof/module/helpers_test.go +++ b/x/proof/module/helpers_test.go @@ -23,15 +23,14 @@ import ( apptypes "github.com/pokt-network/poktroll/x/application/types" proof "github.com/pokt-network/poktroll/x/proof/module" "github.com/pokt-network/poktroll/x/proof/types" + sessionkeeper "github.com/pokt-network/poktroll/x/session/keeper" sessiontypes "github.com/pokt-network/poktroll/x/session/types" sharedtypes "github.com/pokt-network/poktroll/x/shared/types" suppliertypes "github.com/pokt-network/poktroll/x/supplier/types" ) -// TODO_TECHDEBT: This should not be hardcoded once the num blocks per session is configurable. const ( - numBlocksPerSession = 4 - testServiceId = "svc1" + testServiceId = "svc1" ) // Dummy variable to avoid unused import error. @@ -56,7 +55,7 @@ func networkWithClaimObjects( // Construct an in-memory keyring so that it can be populated and used prior // to network start. kr := keyring.NewInMemory(cfg.Codec) - // Populate the in-memmory keyring with as many pre-generated accounts as + // Populate the in-memory keyring with as many pre-generated accounts as // we expect to need for the test (i.e. numApps + numSuppliers). testkeyring.CreatePreGeneratedKeyringAccounts(t, kr, numSuppliers+numApps) @@ -121,24 +120,28 @@ func networkWithClaimObjects( require.NoError(t, net.WaitForNextBlock()) // Create numSessions * numClaimsPerSession claims for the supplier - sessionEndHeight := int64(1) + blockHeight := int64(1) + // TODO_HACK(@Olshansk): Revisit this forloop. Resolve the TECHDEBT + // issue that lies inside because it's creating an inconsistency between + // the number of sessions and the number of blocks. for sessionIdx := 0; sessionIdx < numSessions; sessionIdx++ { - sessionEndHeight += numBlocksPerSession for _, appAcct := range appAccts { for _, supplierAcct := range supplierAccts { claim := createClaim( t, net, ctx, supplierAcct.Address.String(), - sessionEndHeight, + sessionkeeper.GetSessionStartBlockHeight(blockHeight), appAcct.Address.String(), ) claims = append(claims, *claim) - // TODO_TECHDEBT(#196): Move this outside of the forloop so that the test iteration is faster + // TODO_HACK(#196, @Olshansk): Move this outside of the forloop + // so that the test iteration is faster. The current issue has + // to do with a "incorrect account sequence timestamp" error require.NoError(t, net.WaitForNextBlock()) + blockHeight += 1 } } } - return net, claims } @@ -154,10 +157,10 @@ func encodeSessionHeader( sessionHeader := &sessiontypes.SessionHeader{ ApplicationAddress: appAddr, - SessionStartBlockHeight: sessionStartHeight, - SessionId: sessionId, - SessionEndBlockHeight: sessionStartHeight + numBlocksPerSession, Service: &sharedtypes.Service{Id: testServiceId}, + SessionId: sessionId, + SessionStartBlockHeight: sessionStartHeight, + SessionEndBlockHeight: sessionkeeper.GetSessionEndBlockHeight(sessionStartHeight), } cdc := codec.NewProtoCodec(codectypes.NewInterfaceRegistry()) sessionHeaderBz := cdc.MustMarshalJSON(sessionHeader) @@ -170,13 +173,12 @@ func createClaim( net *network.Network, ctx client.Context, supplierAddr string, - sessionEndHeight int64, + sessionStartHeight int64, appAddr string, ) *types.Claim { t.Helper() rootHash := []byte("root_hash") - sessionStartHeight := sessionEndHeight - numBlocksPerSession sessionId := getSessionId(t, net, appAddr, supplierAddr, sessionStartHeight) sessionHeaderEncoded := encodeSessionHeader(t, appAddr, sessionId, sessionStartHeight) rootHashEncoded := base64.StdEncoding.EncodeToString(rootHash) @@ -208,7 +210,7 @@ func createClaim( Service: &sharedtypes.Service{Id: testServiceId}, SessionId: sessionId, SessionStartBlockHeight: sessionStartHeight, - SessionEndBlockHeight: sessionEndHeight, + SessionEndBlockHeight: sessionkeeper.GetSessionEndBlockHeight(sessionStartHeight), }, RootHash: rootHash, } diff --git a/x/proof/module/query_claim_test.go b/x/proof/module/query_claim_test.go index a1f4513b9..f4e2597bd 100644 --- a/x/proof/module/query_claim_test.go +++ b/x/proof/module/query_claim_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - tmcli "github.com/cometbft/cometbft/libs/cli" + cometcli "github.com/cometbft/cometbft/libs/cli" "github.com/cosmos/cosmos-sdk/client/flags" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" "github.com/stretchr/testify/require" @@ -16,6 +16,7 @@ import ( _ "github.com/pokt-network/poktroll/testutil/testpolylog" proof "github.com/pokt-network/poktroll/x/proof/module" "github.com/pokt-network/poktroll/x/proof/types" + sessionkeeper "github.com/pokt-network/poktroll/x/session/keeper" ) func TestClaim_Show(t *testing.T) { @@ -27,7 +28,7 @@ func TestClaim_Show(t *testing.T) { ctx := net.Validators[0].ClientCtx commonArgs := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), + fmt.Sprintf("--%s=json", cometcli.OutputFlag), } var wrongSupplierAddr = sample.AccAddress() @@ -44,7 +45,8 @@ func TestClaim_Show(t *testing.T) { sessionId: claims[0].GetSessionHeader().GetSessionId(), supplierAddr: claims[0].GetSupplierAddress(), - claim: claims[0], + claim: claims[0], + expectedErr: nil, }, { desc: "claim not found (wrong session ID)", @@ -114,21 +116,32 @@ func TestClaim_Show(t *testing.T) { } } +// TODO_HACK(@Olshansk): While working on #359, I uncovered that the configurations +// set at the beginning of this test cannot be set independently of how the helpers +// create claims. I'm adapting the tests in #448, in order to keep moving and not +// waste too much time on fixing the test for now but will revisit. func TestClaim_List(t *testing.T) { - sessionCount := 2 numSuppliers := 4 - numApps := 3 - numServices := 1 - // Each supplier will submit a claim for each app x service combination (per session). - numClaimsPerSession := numSuppliers * numApps * numServices - totalClaims := sessionCount * numClaimsPerSession + numApps := 1 + // TODO_HACK(@Olshansk): Due to the bug found in `networkWithClaimObjects`, this + // is a temporary workaround instead of setting numSessions to its own + // independent constant, which requires us to temporarily align the + // with the num blocks per session. See the `forloop` in `networkWithClaimObjects` + // that has a TODO_HACK as well. + require.Equal(t, 0, numSuppliers*numApps%sessionkeeper.NumBlocksPerSession) + + numSessions := numSuppliers * numApps / sessionkeeper.NumBlocksPerSession + + // Submitting one claim per block for simplicity + numClaimsPerSession := sessionkeeper.NumBlocksPerSession + totalClaims := numSessions * numClaimsPerSession - net, claims := networkWithClaimObjects(t, sessionCount, numSuppliers, numApps) + net, claims := networkWithClaimObjects(t, numSessions, numSuppliers, numApps) ctx := net.Validators[0].ClientCtx prepareArgs := func(next []byte, offset, limit uint64, total bool) []string { args := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), + fmt.Sprintf("--%s=json", cometcli.OutputFlag), } if next == nil { args = append(args, fmt.Sprintf("--%s=%d", flags.FlagOffset, offset)) @@ -198,11 +211,11 @@ func TestClaim_List(t *testing.T) { var resp types.QueryAllClaimsResponse require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) + require.Equal(t, numSessions*numApps, int(resp.Pagination.Total)) require.ElementsMatch(t, nullify.Fill(expectedClaims), nullify.Fill(resp.Claims), ) - require.Equal(t, sessionCount*numApps, int(resp.Pagination.Total)) }) t.Run("BySession", func(t *testing.T) { @@ -223,11 +236,11 @@ func TestClaim_List(t *testing.T) { var resp types.QueryAllClaimsResponse require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) + require.Equal(t, numSuppliers, int(resp.Pagination.Total)) require.ElementsMatch(t, nullify.Fill(expectedClaims), nullify.Fill(resp.Claims), ) - require.Equal(t, numSuppliers, int(resp.Pagination.Total)) }) t.Run("ByHeight", func(t *testing.T) { diff --git a/x/proof/types/errors.go b/x/proof/types/errors.go index 414bf467a..dc4f4116c 100644 --- a/x/proof/types/errors.go +++ b/x/proof/types/errors.go @@ -2,26 +2,29 @@ package types // DONTCOVER -import sdkerrors "cosmossdk.io/errors" +import ( + sdkerrors "cosmossdk.io/errors" +) // x/proof module sentinel errors var ( ErrProofInvalidSigner = sdkerrors.Register(ModuleName, 1100, "expected gov account as only signer for proposal message") ErrProofInvalidAddress = sdkerrors.Register(ModuleName, 1101, "invalid address") ErrProofNotFound = sdkerrors.Register(ModuleName, 1102, "supplier not found") - ErrProofInvalidSessionStartHeight = sdkerrors.Register(ModuleName, 1103, "invalid session start height") - ErrProofInvalidSessionId = sdkerrors.Register(ModuleName, 1104, "invalid session ID") - ErrProofInvalidService = sdkerrors.Register(ModuleName, 1105, "invalid service in supplier") - ErrProofInvalidClaimRootHash = sdkerrors.Register(ModuleName, 1106, "invalid root hash") - ErrProofInvalidSessionEndHeight = sdkerrors.Register(ModuleName, 1107, "invalid session ending height") - ErrProofInvalidQueryRequest = sdkerrors.Register(ModuleName, 1108, "invalid query request") - ErrProofClaimNotFound = sdkerrors.Register(ModuleName, 1109, "claim not found") - ErrProofProofNotFound = sdkerrors.Register(ModuleName, 1110, "proof not found") - ErrProofInvalidProof = sdkerrors.Register(ModuleName, 1111, "invalid proof") - ErrProofInvalidRelay = sdkerrors.Register(ModuleName, 1112, "invalid relay") - ErrProofInvalidRelayRequest = sdkerrors.Register(ModuleName, 1113, "invalid relay request") - ErrProofInvalidRelayResponse = sdkerrors.Register(ModuleName, 1114, "invalid relay response") - ErrProofNotSecp256k1Curve = sdkerrors.Register(ModuleName, 1115, "not secp256k1 curve") - ErrProofApplicationNotFound = sdkerrors.Register(ModuleName, 1116, "application not found") - ErrProofPubKeyNotFound = sdkerrors.Register(ModuleName, 1117, "public key not found") + ErrProofInvalidService = sdkerrors.Register(ModuleName, 1103, "invalid service in supplier") + ErrProofInvalidClaimRootHash = sdkerrors.Register(ModuleName, 1104, "invalid root hash") + ErrProofInvalidQueryRequest = sdkerrors.Register(ModuleName, 1105, "invalid query request") + ErrProofClaimNotFound = sdkerrors.Register(ModuleName, 1106, "claim not found") + ErrProofProofNotFound = sdkerrors.Register(ModuleName, 1107, "proof not found") + ErrProofInvalidProof = sdkerrors.Register(ModuleName, 1108, "invalid proof") + ErrProofInvalidRelay = sdkerrors.Register(ModuleName, 1109, "invalid relay") + ErrProofInvalidRelayRequest = sdkerrors.Register(ModuleName, 1110, "invalid relay request") + ErrProofInvalidRelayResponse = sdkerrors.Register(ModuleName, 1111, "invalid relay response") + ErrProofNotSecp256k1Curve = sdkerrors.Register(ModuleName, 1112, "not secp256k1 curve") + ErrProofApplicationNotFound = sdkerrors.Register(ModuleName, 1113, "application not found") + ErrProofPubKeyNotFound = sdkerrors.Register(ModuleName, 1114, "public key not found") + ErrProofInvalidSessionHeader = sdkerrors.Register(ModuleName, 1115, "invalid session header") + ErrProofInvalidSessionId = sdkerrors.Register(ModuleName, 1116, "invalid session ID") + ErrProofInvalidSessionEndHeight = sdkerrors.Register(ModuleName, 1117, "invalid session end height") + ErrProofInvalidSessionStartHeight = sdkerrors.Register(ModuleName, 1118, "invalid session start height") ) diff --git a/x/proof/types/expected_keepers.go b/x/proof/types/expected_keepers.go index bcba3d7e3..9be7dfc0f 100644 --- a/x/proof/types/expected_keepers.go +++ b/x/proof/types/expected_keepers.go @@ -34,9 +34,12 @@ type AccountKeeper interface { // BankKeeper defines the expected interface for the Bank module. type BankKeeper interface { - SpendableCoins(context.Context, sdk.AccAddress) sdk.Coins - DelegateCoinsFromAccountToModule(ctx context.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error - UndelegateCoinsFromModuleToAccount(ctx context.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error + // We use the bankkeeper SendXXX instead of DelegateXX methods + // because their purpose is to "escrow" funds on behalf of an account rather + // than "delegate" funds from one account to another which is more closely + // linked to staking. + SendCoinsFromAccountToModule(ctx context.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error + SendCoinsFromModuleToAccount(ctx context.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error } // ApplicationKeeper defines the expected application keeper to retrieve applications diff --git a/x/proof/types/message_create_claim.go b/x/proof/types/message_create_claim.go index a7bf0f61f..50e094d5b 100644 --- a/x/proof/types/message_create_claim.go +++ b/x/proof/types/message_create_claim.go @@ -4,7 +4,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sessiontypes "github.com/pokt-network/poktroll/x/session/types" - sharedhelpers "github.com/pokt-network/poktroll/x/shared/helpers" ) const TypeMsgCreateClaim = "create_claim" @@ -25,21 +24,17 @@ func NewMsgCreateClaim( func (msg *MsgCreateClaim) ValidateBasic() error { // Validate the supplier address - _, err := sdk.AccAddressFromBech32(msg.GetSupplierAddress()) - if err != nil { + if _, err := sdk.AccAddressFromBech32(msg.GetSupplierAddress()); err != nil { return ErrProofInvalidAddress.Wrapf("%s", msg.GetSupplierAddress()) } - // Validate the session header + // Retrieve & validate the session header sessionHeader := msg.SessionHeader - if sessionHeader.SessionStartBlockHeight < 0 { - return ErrProofInvalidSessionStartHeight.Wrapf("%d", sessionHeader.SessionStartBlockHeight) + if sessionHeader == nil { + return ErrProofInvalidSessionHeader.Wrapf("session header is nil") } - if len(sessionHeader.SessionId) == 0 { - return ErrProofInvalidSessionId.Wrapf("%s", sessionHeader.SessionId) - } - if !sharedhelpers.IsValidService(sessionHeader.Service) { - return ErrProofInvalidService.Wrapf("%v", sessionHeader.Service) + if err := sessionHeader.ValidateBasic(); err != nil { + return ErrProofInvalidSessionHeader.Wrapf("invalid session header: %v", err) } // Validate the root hash diff --git a/x/proof/types/message_create_claim_test.go b/x/proof/types/message_create_claim_test.go index 5c1572866..68befb3ce 100644 --- a/x/proof/types/message_create_claim_test.go +++ b/x/proof/types/message_create_claim_test.go @@ -3,11 +3,11 @@ package types import ( "testing" + "github.com/stretchr/testify/require" + "github.com/pokt-network/poktroll/testutil/sample" sessiontypes "github.com/pokt-network/poktroll/x/session/types" sharedtypes "github.com/pokt-network/poktroll/x/shared/types" - - "github.com/stretchr/testify/require" ) func TestMsgCreateClaim_ValidateBasic(t *testing.T) { @@ -18,35 +18,49 @@ func TestMsgCreateClaim_ValidateBasic(t *testing.T) { expectedErr error }{ { - desc: "invalid address", + desc: "invalid supplier address", msg: MsgCreateClaim{ SupplierAddress: "invalid_address", + SessionHeader: &sessiontypes.SessionHeader{ + ApplicationAddress: sample.AccAddress(), + Service: &sharedtypes.Service{Id: "svcId"}, + SessionStartBlockHeight: 100, + SessionEndBlockHeight: 101, + SessionId: "valid_session_id", + }, }, expectedErr: ErrProofInvalidAddress, }, { - desc: "valid address but invalid session start height", + desc: "valid supplier address but invalid session start height", msg: MsgCreateClaim{ SupplierAddress: sample.AccAddress(), SessionHeader: &sessiontypes.SessionHeader{ - SessionStartBlockHeight: -1, // Invalid start height + ApplicationAddress: sample.AccAddress(), + Service: &sharedtypes.Service{Id: "svcId"}, + SessionStartBlockHeight: -1, + SessionEndBlockHeight: 101, + SessionId: "valid_session_id", }, }, - expectedErr: ErrProofInvalidSessionStartHeight, + expectedErr: ErrProofInvalidSessionHeader, }, { - desc: "valid address and session start height but invalid session ID", + desc: "valid supplier address and session start height but invalid session ID", msg: MsgCreateClaim{ SupplierAddress: sample.AccAddress(), SessionHeader: &sessiontypes.SessionHeader{ + ApplicationAddress: sample.AccAddress(), + Service: &sharedtypes.Service{Id: "svcId"}, SessionStartBlockHeight: 100, - SessionId: "", // Invalid session ID + SessionEndBlockHeight: 101, + SessionId: "", }, }, - expectedErr: ErrProofInvalidSessionId, + expectedErr: ErrProofInvalidSessionHeader, }, { desc: "valid address, session start height, session ID but invalid service", @@ -54,14 +68,14 @@ func TestMsgCreateClaim_ValidateBasic(t *testing.T) { msg: MsgCreateClaim{ SupplierAddress: sample.AccAddress(), SessionHeader: &sessiontypes.SessionHeader{ + ApplicationAddress: sample.AccAddress(), + Service: &sharedtypes.Service{Id: "invalid service id"}, SessionStartBlockHeight: 100, + SessionEndBlockHeight: 101, SessionId: "valid_session_id", - Service: &sharedtypes.Service{ - Id: "invalid_service_id", // Assuming this ID is invalid - }, // Should trigger error }, }, - expectedErr: ErrProofInvalidService, + expectedErr: ErrProofInvalidSessionHeader, }, { desc: "valid address, session start height, session ID, service but invalid root hash", @@ -69,11 +83,11 @@ func TestMsgCreateClaim_ValidateBasic(t *testing.T) { msg: MsgCreateClaim{ SupplierAddress: sample.AccAddress(), SessionHeader: &sessiontypes.SessionHeader{ + ApplicationAddress: sample.AccAddress(), + Service: &sharedtypes.Service{Id: "svcId"}, SessionStartBlockHeight: 100, + SessionEndBlockHeight: 101, SessionId: "valid_session_id", - Service: &sharedtypes.Service{ - Id: "svcId", // Assuming this ID is valid - }, }, RootHash: []byte(""), // Invalid root hash }, @@ -85,11 +99,11 @@ func TestMsgCreateClaim_ValidateBasic(t *testing.T) { msg: MsgCreateClaim{ SupplierAddress: sample.AccAddress(), SessionHeader: &sessiontypes.SessionHeader{ + ApplicationAddress: sample.AccAddress(), + Service: &sharedtypes.Service{Id: "svcId"}, SessionStartBlockHeight: 100, + SessionEndBlockHeight: 101, SessionId: "valid_session_id", - Service: &sharedtypes.Service{ - Id: "svcId", // Assuming this ID is valid - }, }, RootHash: []byte("valid_root_hash"), // Assuming this is valid }, diff --git a/x/proof/types/message_submit_proof_test.go b/x/proof/types/message_submit_proof_test.go index 9ad93c91b..6c5b98abd 100644 --- a/x/proof/types/message_submit_proof_test.go +++ b/x/proof/types/message_submit_proof_test.go @@ -4,12 +4,12 @@ import ( "testing" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/stretchr/testify/require" "github.com/pokt-network/poktroll/testutil/sample" + sessionkeeper "github.com/pokt-network/poktroll/x/session/keeper" sessiontypes "github.com/pokt-network/poktroll/x/session/types" sharedtypes "github.com/pokt-network/poktroll/x/shared/types" - - "github.com/stretchr/testify/require" ) func TestMsgSubmitProof_ValidateBasic(t *testing.T) { @@ -28,9 +28,9 @@ func TestMsgSubmitProof_ValidateBasic(t *testing.T) { SessionHeader: &sessiontypes.SessionHeader{ ApplicationAddress: "not_a_bech32_address", Service: testService, - SessionStartBlockHeight: 0, SessionId: "mock_session_id", - SessionEndBlockHeight: 5, + SessionStartBlockHeight: 1, + SessionEndBlockHeight: sessionkeeper.GetSessionEndBlockHeight(1), }, Proof: testClosestMerkleProof, }, @@ -47,9 +47,9 @@ func TestMsgSubmitProof_ValidateBasic(t *testing.T) { SessionHeader: &sessiontypes.SessionHeader{ ApplicationAddress: sample.AccAddress(), Service: testService, - SessionStartBlockHeight: 0, SessionId: "mock_session_id", - SessionEndBlockHeight: 5, + SessionStartBlockHeight: 1, + SessionEndBlockHeight: sessionkeeper.GetSessionEndBlockHeight(1), }, Proof: testClosestMerkleProof, }, @@ -66,9 +66,9 @@ func TestMsgSubmitProof_ValidateBasic(t *testing.T) { SessionHeader: &sessiontypes.SessionHeader{ ApplicationAddress: sample.AccAddress(), Service: &sharedtypes.Service{Id: ""}, - SessionStartBlockHeight: 0, SessionId: "mock_session_id", - SessionEndBlockHeight: 5, + SessionStartBlockHeight: 1, + SessionEndBlockHeight: sessionkeeper.GetSessionEndBlockHeight(1), }, Proof: testClosestMerkleProof, }, @@ -82,8 +82,8 @@ func TestMsgSubmitProof_ValidateBasic(t *testing.T) { ApplicationAddress: sample.AccAddress(), Service: testService, SessionId: "mock_session_id", - SessionStartBlockHeight: 0, - SessionEndBlockHeight: 5, + SessionStartBlockHeight: 1, + SessionEndBlockHeight: sessionkeeper.GetSessionEndBlockHeight(1), }, Proof: testClosestMerkleProof, }, diff --git a/x/proof/types/query_validation.go b/x/proof/types/query_validation.go index 1b433e839..568e23ff6 100644 --- a/x/proof/types/query_validation.go +++ b/x/proof/types/query_validation.go @@ -87,7 +87,7 @@ func (query *QueryAllProofsRequest) ValidateBasic() error { default: // No filter is set - logger.Debug().Msg("No specific filter set when requesting proofs") + logger.Info().Msg("No specific filter set when requesting proofs") } return nil diff --git a/x/service/keeper/service_test.go b/x/service/keeper/service_test.go index d3a37f6e6..cd236d332 100644 --- a/x/service/keeper/service_test.go +++ b/x/service/keeper/service_test.go @@ -35,7 +35,9 @@ func createNServices(keeper keeper.Keeper, ctx context.Context, n int) []sharedt return services } -func TestServiceModuleAddress(t *testing.T) { +// The module address is derived off of its semantic name. +// This test is a helper for us to easily identify the underlying address. +func TestModuleAddressService(t *testing.T) { moduleAddress := authtypes.NewModuleAddress(types.ModuleName) require.Equal(t, "pokt1nhmtqf4gcmpxu0p6e53hpgtwj0llmsqpxtumcf", moduleAddress.String()) } diff --git a/x/service/types/expected_keepers.go b/x/service/types/expected_keepers.go index ca6a8da01..8157cc89b 100644 --- a/x/service/types/expected_keepers.go +++ b/x/service/types/expected_keepers.go @@ -17,12 +17,9 @@ type AccountKeeper interface { // BankKeeper defines the expected interface for the Bank module. type BankKeeper interface { SpendableCoins(context.Context, sdk.AccAddress) sdk.Coins - // Methods imported from bank should be defined here - - SendCoinsFromAccountToModule( - ctx context.Context, - senderAddr sdk.AccAddress, - recipientModule string, - amt sdk.Coins, - ) error + // We use the bankkeeper SendXXX instead of DelegateXX methods + // because their purpose is to "escrow" funds on behalf of an account rather + // than "delegate" funds from one account to another which is more closely + // linked to staking. + SendCoinsFromAccountToModule(ctx context.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error } diff --git a/x/service/types/relay.go b/x/service/types/relay.go index 0681c8a35..8e27941fa 100644 --- a/x/service/types/relay.go +++ b/x/service/types/relay.go @@ -113,7 +113,6 @@ func (res *RelayResponse) VerifySupplierSignature(supplierPubKey cryptotypes.Pub if err != nil { return err } - if ok := supplierPubKey.VerifySignature(signableBz[:], res.GetMeta().SupplierSignature); !ok { return ErrServiceInvalidRelayResponse.Wrap("invalid signature") } diff --git a/x/session/keeper/query_get_session.go b/x/session/keeper/query_get_session.go index 02d515b9b..77323d6ce 100644 --- a/x/session/keeper/query_get_session.go +++ b/x/session/keeper/query_get_session.go @@ -2,6 +2,7 @@ package keeper import ( "context" + "fmt" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -26,7 +27,7 @@ func (k Keeper) GetSession(ctx context.Context, req *types.QueryGetSessionReques // while the `Msg` server handles the code flow of the validator when a new block is being proposed. blockHeight := req.BlockHeight - k.Logger().Info("Getting session for height: %d", blockHeight) + k.Logger().Info(fmt.Sprintf("Getting session for height: %d", blockHeight)) sessionHydrator := NewSessionHydrator(req.ApplicationAddress, req.Service.Id, blockHeight) session, err := k.HydrateSession(ctx, sessionHydrator) diff --git a/x/session/keeper/session_hydrator.go b/x/session/keeper/session_hydrator.go index 37a1376cf..67fc6b1a5 100644 --- a/x/session/keeper/session_hydrator.go +++ b/x/session/keeper/session_hydrator.go @@ -68,7 +68,7 @@ func (k Keeper) HydrateSession(ctx context.Context, sh *sessionHydrator) (*types if err := k.hydrateSessionMetadata(ctx, sh); err != nil { return nil, err } - logger.Debug("Finished hydrating session metadata") + logger.Info("Finished hydrating session metadata") if err := k.hydrateSessionID(ctx, sh); err != nil { return nil, err @@ -78,12 +78,12 @@ func (k Keeper) HydrateSession(ctx context.Context, sh *sessionHydrator) (*types if err := k.hydrateSessionApplication(ctx, sh); err != nil { return nil, err } - logger.Debug("Finished hydrating session application: %+v", sh.session.Application) + logger.Info("Finished hydrating session application: %+v", sh.session.Application) if err := k.hydrateSessionSuppliers(ctx, sh); err != nil { return nil, err } - logger.Debug("Finished hydrating session suppliers: %+v") + logger.Info("Finished hydrating session suppliers: %+v") sh.session.Header = sh.sessionHeader sh.session.SessionId = sh.sessionHeader.SessionId @@ -274,7 +274,6 @@ func GetSessionStartBlockHeight(blockHeight int64) int64 { if blockHeight <= 0 { return 0 } - return blockHeight - ((blockHeight - 1) % NumBlocksPerSession) } diff --git a/x/session/module/module.go b/x/session/module/module.go index a8c55809b..d37744b35 100644 --- a/x/session/module/module.go +++ b/x/session/module/module.go @@ -18,8 +18,6 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/grpc-ecosystem/grpc-gateway/runtime" - // this line is used by starport scaffolding # 1 - modulev1 "github.com/pokt-network/poktroll/api/poktroll/session/module" "github.com/pokt-network/poktroll/x/session/keeper" "github.com/pokt-network/poktroll/x/session/types" @@ -151,12 +149,18 @@ func (am AppModule) BeginBlock(_ context.Context) error { // EndBlock contains the logic that is automatically triggered at the end of each block. // The end block implementation is optional. +// TODO_TECHDEBT( @red-0ne): Add unit/integration tests for this. func (am AppModule) EndBlock(ctx context.Context) error { - // Store the block hash at the end of every block, so we can query the block hash - // to construct the SessionID. + logger := am.keeper.Logger().With("EndBlock", "SessionModuleEndBlock") + sdkCtx := sdk.UnwrapSDKContext(ctx) + blockHeight := sdkCtx.BlockHeight() + + // Store the block hash at the end of every block. + // This is necessary to correctly and pseudo-randomly construct a SessionID. // EndBlock is preferred over BeginBlock to avoid wasting resources if the block // does not get committed. am.keeper.StoreBlockHash(ctx) + logger.Info(fmt.Sprintf("Stored block hash at height %d", blockHeight)) return nil } diff --git a/x/session/module/query_get_session_test.go b/x/session/module/query_get_session_test.go index f2b230d1e..8c695432c 100644 --- a/x/session/module/query_get_session_test.go +++ b/x/session/module/query_get_session_test.go @@ -6,7 +6,7 @@ import ( "time" sdkerrors "cosmossdk.io/errors" - tmcli "github.com/cometbft/cometbft/libs/cli" + cometcli "github.com/cometbft/cometbft/libs/cli" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" "github.com/gogo/status" "github.com/stretchr/testify/require" @@ -157,7 +157,7 @@ func TestCLI_GetSession(t *testing.T) { // We want to use the `--output=json` flag for all tests so it's easy to unmarshal below common := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), + fmt.Sprintf("--%s=json", cometcli.OutputFlag), } // Run the tests diff --git a/x/session/types/session_header.go b/x/session/types/session_header.go index 6e3daa1d0..45bb43859 100644 --- a/x/session/types/session_header.go +++ b/x/session/types/session_header.go @@ -1,9 +1,13 @@ package types -import sdk "github.com/cosmos/cosmos-sdk/types" +import ( + sdk "github.com/cosmos/cosmos-sdk/types" -// TODO_TECHDEBT: Make sure this is used everywhere we validate components -// of the session header. + sharedhelpers "github.com/pokt-network/poktroll/x/shared/helpers" +) + +// TODO_TECHDEBT: Ensure this is used everywhere a SessionHeader is validated. +// ValidateBasic performs basic stateless validation of a SessionHeader. func (sh *SessionHeader) ValidateBasic() error { // Validate the application address if _, err := sdk.AccAddressFromBech32(sh.ApplicationAddress); err != nil { @@ -11,17 +15,20 @@ func (sh *SessionHeader) ValidateBasic() error { } // Validate the session ID - // TODO_TECHDEBT: Introduce a `SessionId#ValidateBasic` method. - if sh.SessionId == "" { + if len(sh.SessionId) == 0 { return ErrSessionInvalidSessionId.Wrapf("invalid session ID: %s", sh.SessionId) } // Validate the service - // TODO_TECHDEBT: Introduce a `Service#ValidateBasic` method. - if sh.Service == nil { + if sh.Service == nil || !sharedhelpers.IsValidService(sh.Service) { return ErrSessionInvalidService.Wrapf("invalid service: %s", sh.Service) } + // Sessions can only start at height 1 + if sh.SessionStartBlockHeight <= 0 { + return ErrSessionInvalidBlockHeight.Wrapf("sessions can only start at height 1 or greater") + } + // Check if session end height is greater than session start height if sh.SessionEndBlockHeight <= sh.SessionStartBlockHeight { return ErrSessionInvalidBlockHeight.Wrapf("session end block height cannot be less than or equal to session start block height") diff --git a/x/session/types/session_header_test.go b/x/session/types/session_header_test.go index 5d952be42..02b99f882 100644 --- a/x/session/types/session_header_test.go +++ b/x/session/types/session_header_test.go @@ -11,6 +11,11 @@ import ( ) func TestSessionHeader_ValidateBasic(t *testing.T) { + svc := sharedtypes.Service{ + Id: "svc_id", + Name: "svc_name", + } + tests := []struct { desc string sessionHeader types.SessionHeader @@ -21,7 +26,7 @@ func TestSessionHeader_ValidateBasic(t *testing.T) { sessionHeader: types.SessionHeader{ ApplicationAddress: "invalid_address", SessionId: "valid_session_id", - Service: &sharedtypes.Service{}, + Service: &svc, SessionStartBlockHeight: 100, SessionEndBlockHeight: 101, }, @@ -32,7 +37,7 @@ func TestSessionHeader_ValidateBasic(t *testing.T) { sessionHeader: types.SessionHeader{ ApplicationAddress: sample.AccAddress(), SessionId: "", - Service: &sharedtypes.Service{}, + Service: &svc, SessionStartBlockHeight: 100, SessionEndBlockHeight: 101, }, @@ -49,12 +54,23 @@ func TestSessionHeader_ValidateBasic(t *testing.T) { }, expectedErr: types.ErrSessionInvalidService, }, + { + desc: "invalid - start block height is 0", + sessionHeader: types.SessionHeader{ + ApplicationAddress: sample.AccAddress(), + SessionId: "valid_session_id", + Service: &svc, + SessionStartBlockHeight: 0, + SessionEndBlockHeight: 42, + }, + expectedErr: types.ErrSessionInvalidBlockHeight, + }, { desc: "invalid - start block height greater than end block height", sessionHeader: types.SessionHeader{ ApplicationAddress: sample.AccAddress(), SessionId: "valid_session_id", - Service: &sharedtypes.Service{}, + Service: &svc, SessionStartBlockHeight: 100, SessionEndBlockHeight: 99, }, @@ -65,7 +81,7 @@ func TestSessionHeader_ValidateBasic(t *testing.T) { sessionHeader: types.SessionHeader{ ApplicationAddress: sample.AccAddress(), SessionId: "valid_session_id", - Service: &sharedtypes.Service{}, + Service: &svc, SessionStartBlockHeight: 100, SessionEndBlockHeight: 101, }, diff --git a/x/shared/helpers/service.go b/x/shared/helpers/service.go index 2632769e6..9c1071871 100644 --- a/x/shared/helpers/service.go +++ b/x/shared/helpers/service.go @@ -28,6 +28,7 @@ func init() { } // IsValidService checks if the provided ServiceId struct has valid fields +// TODO_TECHDEBT: Refactor to a `Service#ValidateBasic` method. func IsValidService(service *sharedtypes.Service) bool { // Check if service Id and Name are valid using the provided helper functions return service != nil && @@ -36,6 +37,7 @@ func IsValidService(service *sharedtypes.Service) bool { } // IsValidServiceId checks if the input string is a valid serviceId +// TODO_TECHDEBT: Refactor to a `ServiceId#ValidateBasic` method. func IsValidServiceId(serviceId string) bool { // ServiceId CANNOT be empty if len(serviceId) == 0 { diff --git a/x/supplier/keeper/msg_server_stake_supplier.go b/x/supplier/keeper/msg_server_stake_supplier.go index 3d6101f97..0a2695c61 100644 --- a/x/supplier/keeper/msg_server_stake_supplier.go +++ b/x/supplier/keeper/msg_server_stake_supplier.go @@ -21,36 +21,47 @@ func (k msgServer) StakeSupplier(ctx context.Context, msg *types.MsgStakeSupplie // Check if the supplier already exists or not var err error - var coinsToDelegate sdk.Coin + var coinsToEscrow sdk.Coin supplier, isSupplierFound := k.GetSupplier(ctx, msg.Address) if !isSupplierFound { - logger.Info(fmt.Sprintf("Supplier not found. Creating new supplier for address %s", msg.Address)) + logger.Info(fmt.Sprintf("Supplier not found. Creating new supplier for address %q", msg.Address)) supplier = k.createSupplier(ctx, msg) - coinsToDelegate = *msg.Stake + coinsToEscrow = *msg.Stake } else { - logger.Info(fmt.Sprintf("Supplier found. Updating supplier for address %s", msg.Address)) + logger.Info(fmt.Sprintf("Supplier found. About to try updating supplier with address %q", msg.Address)) currSupplierStake := *supplier.Stake if err = k.updateSupplier(ctx, &supplier, msg); err != nil { + logger.Error(fmt.Sprintf("could not update supplier for address %q due to error %v", msg.Address, err)) return nil, err } - coinsToDelegate = (*msg.Stake).Sub(currSupplierStake) + coinsToEscrow, err = (*msg.Stake).SafeSub(currSupplierStake) + if err != nil { + return nil, err + } + logger.Info(fmt.Sprintf("Supplier is going to escrow an additional %+v coins", coinsToEscrow)) + } + + // Must always stake or upstake (> 0 delta) + if coinsToEscrow.IsZero() { + logger.Warn(fmt.Sprintf("Supplier %q must escrow more than 0 additional coins", msg.Address)) + return nil, types.ErrSupplierInvalidStake.Wrapf("supplier %q must escrow more than 0 additional coins", msg.Address) } // Retrieve the address of the supplier supplierAddress, err := sdk.AccAddressFromBech32(msg.Address) if err != nil { - logger.Error(fmt.Sprintf("could not parse address %s", msg.Address)) + logger.Error(fmt.Sprintf("could not parse address %q", msg.Address)) return nil, err } - // TODO_IMPROVE: Should we avoid making this call if `coinsToDelegate` = 0? // Send the coins from the supplier to the staked supplier pool - err = k.bankKeeper.DelegateCoinsFromAccountToModule(ctx, supplierAddress, types.ModuleName, []sdk.Coin{coinsToDelegate}) + err = k.bankKeeper.SendCoinsFromAccountToModule(ctx, supplierAddress, types.ModuleName, []sdk.Coin{coinsToEscrow}) if err != nil { - logger.Error(fmt.Sprintf("could not send %v coins from %s to %s module account due to %v", coinsToDelegate, supplierAddress, types.ModuleName, err)) + logger.Error(fmt.Sprintf("could not send %v coins from %q to %q module account due to %v", coinsToEscrow, supplierAddress, types.ModuleName, err)) return nil, err } + logger.Info(fmt.Sprintf("Successfully escrowed %v coins from %q to %q module account", coinsToEscrow, supplierAddress, types.ModuleName)) // Update the Supplier in the store k.SetSupplier(ctx, supplier) @@ -77,7 +88,7 @@ func (k msgServer) updateSupplier( ) error { // Checks if the the msg address is the same as the current owner if msg.Address != supplier.Address { - return types.ErrSupplierUnauthorized.Wrapf("msg Address (%s) != supplier address (%s)", msg.Address, supplier.Address) + return types.ErrSupplierUnauthorized.Wrapf("msg Address %q != supplier address %q", msg.Address, supplier.Address) } // Validate that the stake is not being lowered diff --git a/x/supplier/keeper/msg_server_unstake_supplier.go b/x/supplier/keeper/msg_server_unstake_supplier.go index cb9c6230c..a0bbff8b0 100644 --- a/x/supplier/keeper/msg_server_unstake_supplier.go +++ b/x/supplier/keeper/msg_server_unstake_supplier.go @@ -37,7 +37,7 @@ func (k msgServer) UnstakeSupplier( } // Send the coins from the supplier pool back to the supplier - err = k.bankKeeper.UndelegateCoinsFromModuleToAccount(ctx, types.ModuleName, supplierAddress, []sdk.Coin{*supplier.Stake}) + err = k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, supplierAddress, []sdk.Coin{*supplier.Stake}) if err != nil { logger.Error(fmt.Sprintf("could not send %v coins from %s module to %s account due to %v", supplier.Stake, supplierAddress, types.ModuleName, err)) return nil, err diff --git a/x/supplier/keeper/supplier_test.go b/x/supplier/keeper/supplier_test.go index c30d8a083..ba043cb58 100644 --- a/x/supplier/keeper/supplier_test.go +++ b/x/supplier/keeper/supplier_test.go @@ -27,6 +27,13 @@ func init() { cmd.InitSDKConfig() } +// The module address is derived off of its semantic name. +// This test is a helper for us to easily identify the underlying address. +func TestModuleAddressSupplier(t *testing.T) { + moduleAddress := authtypes.NewModuleAddress(types.ModuleName) + require.Equal(t, "pokt1j40dzzmn6cn9kxku7a5tjnud6hv37vesr5ccaa", moduleAddress.String()) +} + func createNSuppliers(keeper keeper.Keeper, ctx context.Context, n int) []sharedtypes.Supplier { suppliers := make([]sharedtypes.Supplier, n) for i := range suppliers { @@ -86,10 +93,3 @@ func TestSupplierGetAll(t *testing.T) { nullify.Fill(keeper.GetAllSuppliers(ctx)), ) } - -// The application module address is derived off of its semantic name. -// This test is a helper for us to easily identify the underlying address. -func TestApplicationModuleAddress(t *testing.T) { - moduleAddress := authtypes.NewModuleAddress(types.ModuleName) - require.Equal(t, "pokt1j40dzzmn6cn9kxku7a5tjnud6hv37vesr5ccaa", moduleAddress.String()) -} diff --git a/x/supplier/module/query_supplier_test.go b/x/supplier/module/query_supplier_test.go index 6cb48bf5d..d741481f2 100644 --- a/x/supplier/module/query_supplier_test.go +++ b/x/supplier/module/query_supplier_test.go @@ -5,7 +5,7 @@ import ( "strconv" "testing" - tmcli "github.com/cometbft/cometbft/libs/cli" + cometcli "github.com/cometbft/cometbft/libs/cli" "github.com/cosmos/cosmos-sdk/client/flags" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" "github.com/stretchr/testify/require" @@ -23,7 +23,7 @@ func TestShowSupplier(t *testing.T) { ctx := net.Validators[0].ClientCtx common := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), + fmt.Sprintf("--%s=json", cometcli.OutputFlag), } tests := []struct { desc string @@ -79,7 +79,7 @@ func TestListSuppliers(t *testing.T) { ctx := net.Validators[0].ClientCtx request := func(next []byte, offset, limit uint64, total bool) []string { args := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), + fmt.Sprintf("--%s=json", cometcli.OutputFlag), } if next == nil { args = append(args, fmt.Sprintf("--%s=%d", flags.FlagOffset, offset)) diff --git a/x/supplier/types/expected_keepers.go b/x/supplier/types/expected_keepers.go index c0d57d5d4..ba491c020 100644 --- a/x/supplier/types/expected_keepers.go +++ b/x/supplier/types/expected_keepers.go @@ -16,6 +16,6 @@ type AccountKeeper interface { // BankKeeper defines the expected interface for the Bank module. type BankKeeper interface { - DelegateCoinsFromAccountToModule(ctx context.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error - UndelegateCoinsFromModuleToAccount(ctx context.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error + SendCoinsFromAccountToModule(ctx context.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error + SendCoinsFromModuleToAccount(ctx context.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error } diff --git a/x/tokenomics/keeper/keeper.go b/x/tokenomics/keeper/keeper.go index 03bc1c80a..f1e254164 100644 --- a/x/tokenomics/keeper/keeper.go +++ b/x/tokenomics/keeper/keeper.go @@ -11,31 +11,21 @@ import ( "github.com/pokt-network/poktroll/x/tokenomics/types" ) -// Keeper is the structure that implements the `KeeperI` interface. +type Keeper struct { + cdc codec.BinaryCodec + storeService store.KVStoreService + logger log.Logger -// TODO_TECHDEBT(#240): See `x/nft/keeper.keeper.go` in the Cosmos SDK on how -// we should refactor all our keepers. This keeper has started following a small -// subset of those patterns. -type ( - Keeper struct { - cdc codec.BinaryCodec - storeService store.KVStoreService - logger log.Logger + // the address capable of executing a MsgUpdateParams message. Typically, this + // should be the x/gov module account. + authority string - // the address capable of executing a MsgUpdateParams message. Typically, this - // should be the x/gov module account. - authority string - - bankKeeper types.BankKeeper - accountKeeper types.AccountKeeper - applicationKeeper types.ApplicationKeeper - - // TODO_DISCUSS: The supplier keeper is not used in the tokenomics module, - // the bank keeper is the one that is used to handle the supplier rewards. - // Make sure to remove it from the expected keepers if removed from here. - supplierKeeper types.SupplierKeeper - } -) + // keepers + bankKeeper types.BankKeeper + accountKeeper types.AccountKeeper + applicationKeeper types.ApplicationKeeper + proofKeeper types.ProofKeeper +} func NewKeeper( cdc codec.BinaryCodec, @@ -46,7 +36,7 @@ func NewKeeper( bankKeeper types.BankKeeper, accountKeeper types.AccountKeeper, applicationKeeper types.ApplicationKeeper, - supplierKeeper types.SupplierKeeper, + proofKeeper types.ProofKeeper, ) Keeper { if _, err := sdk.AccAddressFromBech32(authority); err != nil { panic(fmt.Sprintf("invalid authority address: %s", authority)) @@ -61,7 +51,7 @@ func NewKeeper( bankKeeper: bankKeeper, accountKeeper: accountKeeper, applicationKeeper: applicationKeeper, - supplierKeeper: supplierKeeper, + proofKeeper: proofKeeper, } } diff --git a/x/tokenomics/keeper/keeper_test.go b/x/tokenomics/keeper/keeper_test.go new file mode 100644 index 000000000..f5d7f527a --- /dev/null +++ b/x/tokenomics/keeper/keeper_test.go @@ -0,0 +1,285 @@ +package keeper_test + +import ( + "context" + "testing" + "time" + + "cosmossdk.io/math" + abci "github.com/cometbft/cometbft/abci/types" + "github.com/cosmos/cosmos-sdk/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/golang/protobuf/proto" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + + "github.com/pokt-network/poktroll/cmd/poktrolld/cmd" + keepertest "github.com/pokt-network/poktroll/testutil/keeper" + "github.com/pokt-network/poktroll/testutil/sample" + apptypes "github.com/pokt-network/poktroll/x/application/types" + prooftypes "github.com/pokt-network/poktroll/x/proof/types" + sessionkeeper "github.com/pokt-network/poktroll/x/session/keeper" + sessiontypes "github.com/pokt-network/poktroll/x/session/types" + sharedtypes "github.com/pokt-network/poktroll/x/shared/types" + tokenomicskeeper "github.com/pokt-network/poktroll/x/tokenomics/keeper" + tokenomicstypes "github.com/pokt-network/poktroll/x/tokenomics/types" +) + +const ( + testServiceId = "svc1" + testSessionId = "mock_session_id" +) +const minExecutionPeriod = 5 * time.Second + +func init() { + cmd.InitSDKConfig() +} + +type TestSuite struct { + suite.Suite + + sdkCtx sdk.Context + ctx context.Context + keepers keepertest.TokenomicsModuleKeepers + claim prooftypes.Claim + proof prooftypes.Proof +} + +func (s *TestSuite) SetupTest() { + supplierAddr := sample.AccAddress() + appAddr := sample.AccAddress() + + s.keepers, s.ctx = keepertest.NewTokenomicsModuleKeepers(s.T()) + s.sdkCtx = sdk.UnwrapSDKContext(s.ctx) + + // Prepare a claim that can be inserted + s.claim = prooftypes.Claim{ + SupplierAddress: supplierAddr, + SessionHeader: &sessiontypes.SessionHeader{ + ApplicationAddress: appAddr, + Service: &sharedtypes.Service{Id: testServiceId}, + SessionId: "session_id", + SessionStartBlockHeight: 1, + SessionEndBlockHeight: sessionkeeper.GetSessionEndBlockHeight(1), + }, + RootHash: smstRootWithSum(69), + } + + // Prepare a claim that can be inserted + s.proof = prooftypes.Proof{ + SupplierAddress: s.claim.SupplierAddress, + SessionHeader: s.claim.SessionHeader, + // ClosestMerkleProof + } + + appStake := types.NewCoin("upokt", math.NewInt(1000000)) + app := apptypes.Application{ + Address: appAddr, + Stake: &appStake, + } + s.keepers.SetApplication(s.ctx, app) +} + +func TestSettleExpiringClaimsSuite(t *testing.T) { + suite.Run(t, new(TestSuite)) +} + +func (s *TestSuite) TestClaimSettlement_ClaimPendingBeforeSettlement() { + // Retrieve default values + t := s.T() + ctx := s.ctx + sdkCtx := sdk.UnwrapSDKContext(ctx) + + // 0. Add the claim & verify it exists + claim := s.claim + s.keepers.UpsertClaim(ctx, claim) + claims := s.keepers.GetAllClaims(ctx) + s.Require().Len(claims, 1) + + // 1. Settle pending claims while the session is still active. + // Expectations: No claims should be settled because the session is still ongoing + blockHeight := claim.SessionHeader.SessionEndBlockHeight - 2 // session is still active + sdkCtx = sdkCtx.WithBlockHeight(blockHeight) + numClaimsSettled, numClaimsExpired, err := s.keepers.SettlePendingClaims(sdkCtx) + // Check that no claims were settled + require.NoError(t, err) + require.Equal(t, uint64(0), numClaimsSettled) + require.Equal(t, uint64(0), numClaimsExpired) + // Validate that the claim still exists + claims = s.keepers.GetAllClaims(ctx) + require.Len(t, claims, 1) + + // 2. Settle pending claims just after the session ended. + // Expectations: Claims should not be settled because the proof window hasn't closed yet. + // TODO_IMPROVE(@red-0ne, @Olshansk): Use the governance parameters for more + // precise block heights once they are implemented. + blockHeight = claim.SessionHeader.SessionEndBlockHeight + 2 // session ended but proof window is still open + sdkCtx = sdkCtx.WithBlockHeight(blockHeight) + numClaimsSettled, numClaimsExpired, err = s.keepers.SettlePendingClaims(sdkCtx) + // Check that no claims were settled + require.NoError(t, err) + require.Equal(t, uint64(0), numClaimsSettled) + require.Equal(t, uint64(0), numClaimsExpired) + // Validate that the claim still exists + claims = s.keepers.GetAllClaims(ctx) + require.Len(t, claims, 1) +} + +func (s *TestSuite) TestClaimSettlement_ClaimExpired_ProofRequiredAndNotProvided() { + // Retrieve default values + t := s.T() + ctx := s.ctx + sdkCtx := sdk.UnwrapSDKContext(ctx) + + // Create a claim that requires a proof + claim := s.claim + numComputeUnits := uint64(tokenomicskeeper.ProofRequiredComputeUnits + 1) + claim.RootHash = smstRootWithSum(numComputeUnits) + + // 0. Add the claim & verify it exists + s.keepers.UpsertClaim(ctx, claim) + claims := s.keepers.GetAllClaims(ctx) + s.Require().Len(claims, 1) + + // 1. Settle pending claims after proof window closes + // Expectation: All (1) claims should be expired. + // TODO_IMPROVE(@red-0ne, @Olshansk): Use the governance parameters for more precise block heights once they are implemented. + blockHeight := claim.SessionHeader.SessionEndBlockHeight * 10 // proof window has definitely closed at this point + sdkCtx = sdkCtx.WithBlockHeight(blockHeight) + numClaimsSettled, numClaimsExpired, err := s.keepers.SettlePendingClaims(sdkCtx) + // Check that no claims were settled + require.NoError(t, err) + require.Equal(t, uint64(0), numClaimsSettled) + require.Equal(t, uint64(1), numClaimsExpired) + // Validate that the claims expired + claims = s.keepers.GetAllClaims(ctx) + require.Len(t, claims, 0) + + // Confirm an expiration event was emitted + events := sdkCtx.EventManager().Events() + require.Len(t, events, 5) // minting, burning, settling, etc.. + // Validate the expiration event + expectedEvent, ok := s.getClaimEvent(events, "poktroll.tokenomics.EventClaimExpired").(*tokenomicstypes.EventClaimExpired) + require.True(t, ok) + require.Equal(t, numComputeUnits, expectedEvent.ComputeUnits) +} + +func (s *TestSuite) TestClaimSettlement_ClaimSettled_ProofRequiredAndProvided() { + // Retrieve default values + t := s.T() + ctx := s.ctx + sdkCtx := sdk.UnwrapSDKContext(ctx) + + // Create a claim that requires a proof + claim := s.claim + numComputeUnits := uint64(tokenomicskeeper.ProofRequiredComputeUnits + 1) + claim.RootHash = smstRootWithSum(numComputeUnits) + + // 0. Add the claim & verify it exists + s.keepers.UpsertClaim(ctx, claim) + claims := s.keepers.GetAllClaims(ctx) + s.Require().Len(claims, 1) + + // Upsert the proof + s.keepers.UpsertProof(ctx, s.proof) + + // 1. Settle pending claims after proof window closes + // Expectation: All (1) claims should be claimed. + // TODO_IMPROVE(@red-0ne, @Olshansk): Use the governance parameters for more precise block heights once they are implemented. + blockHeight := s.claim.SessionHeader.SessionEndBlockHeight * 10 // proof window has definitely closed at this point + sdkCtx = sdkCtx.WithBlockHeight(blockHeight) + numClaimsSettled, numClaimsExpired, err := s.keepers.SettlePendingClaims(sdkCtx) + // Check that no claims were settled + require.NoError(t, err) + require.Equal(t, uint64(1), numClaimsSettled) + require.Equal(t, uint64(0), numClaimsExpired) + // Validate that the claims expired + claims = s.keepers.GetAllClaims(ctx) + require.Len(t, claims, 0) + + // Confirm an settlement event was emitted + events := sdkCtx.EventManager().Events() + expectedEvent, ok := s.getClaimEvent(events, "poktroll.tokenomics.EventClaimSettled").(*tokenomicstypes.EventClaimSettled) + require.True(t, ok) + require.True(t, expectedEvent.ProofRequired) + require.Equal(t, numComputeUnits, expectedEvent.ComputeUnits) + +} + +func (s *TestSuite) TestClaimSettlement_Settles_WhenAProofIsNotRequired() { + // Retrieve default values + t := s.T() + ctx := s.ctx + sdkCtx := sdk.UnwrapSDKContext(ctx) + + // Create a claim that does not require a proof + claim := s.claim + numComputeUnits := uint64(tokenomicskeeper.ProofRequiredComputeUnits - 1) + claim.RootHash = smstRootWithSum(numComputeUnits) + + // 0. Add the claim & verify it exists + s.keepers.UpsertClaim(ctx, claim) + claims := s.keepers.GetAllClaims(ctx) + s.Require().Len(claims, 1) + + // 1. Settle pending claims after proof window closes + // Expectation: All (1) claims should be claimed. + // TODO_IMPROVE(@red-0ne, @Olshansk): Use the governance parameters for more precise block heights once they are implemented. + blockHeight := claim.SessionHeader.SessionEndBlockHeight * 10 // proof window has definitely closed at this point + sdkCtx = sdkCtx.WithBlockHeight(blockHeight) + numClaimsSettled, numClaimsExpired, err := s.keepers.SettlePendingClaims(sdkCtx) + // Check that no claims were settled + require.NoError(t, err) + require.Equal(t, uint64(1), numClaimsSettled) + require.Equal(t, uint64(0), numClaimsExpired) + // Validate that the claims expired + claims = s.keepers.GetAllClaims(ctx) + require.Len(t, claims, 0) + + // Confirm an expiration event was emitted + events := sdkCtx.EventManager().Events() + expectedEvent, ok := s.getClaimEvent(events, "poktroll.tokenomics.EventClaimSettled").(*tokenomicstypes.EventClaimSettled) + require.True(t, ok) + require.False(t, expectedEvent.ProofRequired) + require.Equal(t, numComputeUnits, expectedEvent.ComputeUnits) +} + +func (s *TestSuite) TestClaimSettlement_DoesNotSettle_BeforeProofWindowCloses() { + s.T().Skip("TODO_TEST: Implement that a claim remains unsettled before the proof window closes") +} + +func (s *TestSuite) TestClaimSettlement_DoesNotSettle_IfProofIsInvalid() { + s.T().Skip("TODO_TEST: Implement that a claim remains unsettled before the proof window closes") +} + +func (s *TestSuite) TestClaimSettlement_DoesNotSettle_IfProofIsRequiredButMissing() { + s.T().Skip("TODO_TEST: Implement that a claim remains unsettled before the proof window closes") +} + +func (s *TestSuite) TestClaimSettlement_MultipleClaimsSettle_WithMultipleApplicationsAndSuppliers() { + s.T().Skip("TODO_TEST: Implement that multiple claims settle at once when different sessions have overlapping applications and suppliers") +} + +// getClaimEvent verifies that there is exactly one event of type protoType in +// the given events and returns it. If there are 0 or more than 1 events of the +// given type, it fails the test. +func (s *TestSuite) getClaimEvent(events sdk.Events, protoType string) proto.Message { + var parsedEvent proto.Message + numExpectedEvents := 0 + for _, event := range events { + switch event.Type { + case protoType: + var err error + parsedEvent, err = sdk.ParseTypedEvent(abci.Event(event)) + s.Require().NoError(err) + numExpectedEvents++ + default: + continue + } + } + if numExpectedEvents == 1 { + return parsedEvent + } + require.NotEqual(s.T(), 1, numExpectedEvents, "Expected exactly one claim event") + return nil +} diff --git a/x/tokenomics/keeper/settle_pending_claims.go b/x/tokenomics/keeper/settle_pending_claims.go new file mode 100644 index 000000000..f49046408 --- /dev/null +++ b/x/tokenomics/keeper/settle_pending_claims.go @@ -0,0 +1,149 @@ +package keeper + +import ( + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/pokt-network/smt" + + prooftypes "github.com/pokt-network/poktroll/x/proof/types" + sessionkeeper "github.com/pokt-network/poktroll/x/session/keeper" + "github.com/pokt-network/poktroll/x/tokenomics/types" +) + +const ( + // TODO_BLOCKER/TODO_UPNEXT(@Olshansk): Implement this properly. Using a constant + // for "probabilistic proofs" is just a simple placeholder mechanism to get + // #359 over the finish line. + ProofRequiredComputeUnits = 100 +) + +// SettlePendingClaims settles all pending (i.e. expiring) claims. +// If a claim is expired and requires a proof and a proof IS available -> it's settled. +// If a claim is expired and requires a proof and a proof IS NOT available -> it's deleted. +// If a claim is expired and does NOT require a proof -> it's settled. +// Events are emitted for each claim that is settled or removed. +// On-chain Claims & Proofs are deleted after they're settled or expired to free up space. +func (k Keeper) SettlePendingClaims(ctx sdk.Context) (numClaimsSettled, numClaimsExpired uint64, err error) { + logger := k.Logger().With("method", "SettlePendingClaims") + + // TODO_BLOCKER(@Olshansk): Optimize this by indexing expiringClaims appropriately + // and only retrieving the expiringClaims that need to be settled rather than all + // of them and iterating through them one by one. + expiringClaims := k.getExpiringClaims(ctx) + + blockHeight := ctx.BlockHeight() + + logger.Info(fmt.Sprintf("found %d expiring claims at block height %d", len(expiringClaims), blockHeight)) + + for _, claim := range expiringClaims { + // Retrieve the number of compute units in the claim for the events emitted + root := (smt.MerkleRoot)(claim.GetRootHash()) + claimComputeUnits := root.Sum() + + sessionId := claim.SessionHeader.SessionId + + // Using the probabilistic proofs approach, determine if this expiring + // claim required an on-chain proof + isProofRequiredForClaim := k.isProofRequiredForClaim(ctx, &claim) + if isProofRequiredForClaim { + _, isProofFound := k.proofKeeper.GetProof(ctx, sessionId, claim.SupplierAddress) + // If a proof is not found, the claim will expire and never be settled. + if !isProofFound { + // Emit an event that a claim has expired and being removed without being settled. + claimExpiredEvent := types.EventClaimExpired{ + Claim: &claim, + ComputeUnits: claimComputeUnits, + } + if err := ctx.EventManager().EmitTypedEvent(&claimExpiredEvent); err != nil { + return 0, 0, err + } + // The claim & proof are no longer necessary, so there's no need for them + // to take up on-chain space. + k.proofKeeper.RemoveClaim(ctx, sessionId, claim.SupplierAddress) + + numClaimsExpired++ + continue + } + // NB: If a proof is found, it is valid because verification is done + // at the time of submission. + } + + // Manage the mint & burn accounting for the claim. + if err := k.SettleSessionAccounting(ctx, &claim); err != nil { + logger.Error(fmt.Sprintf("error settling session accounting for claim %q: %v", claim.SessionHeader.SessionId, err)) + return 0, 0, err + } + + claimSettledEvent := types.EventClaimSettled{ + Claim: &claim, + ComputeUnits: claimComputeUnits, + ProofRequired: isProofRequiredForClaim, + } + if err := ctx.EventManager().EmitTypedEvent(&claimSettledEvent); err != nil { + return 0, 0, err + } + + // The claim & proof are no longer necessary, so there's no need for them + // to take up on-chain space. + k.proofKeeper.RemoveClaim(ctx, sessionId, claim.SupplierAddress) + // NB: We are calling `RemoveProof` of whether or not the proof was required + // to delete it from the state. It is okay for it to fail here if it doesn't exist. + k.proofKeeper.RemoveProof(ctx, sessionId, claim.SupplierAddress) + + numClaimsSettled++ + logger.Info(fmt.Sprintf("Successfully settled claim for session ID %q at block height %d", claim.SessionHeader.SessionId, blockHeight)) + } + + logger.Info(fmt.Sprintf("settled %d and expired %d claims at block height %d", numClaimsSettled, numClaimsExpired, blockHeight)) + + return numClaimsSettled, numClaimsExpired, nil + +} + +// getExpiringClaims returns all claims that are expiring at the current block height. +// This is the height at which the proof window closes. +// If the proof window closes and a proof IS NOT required -> settle the claim. +// If the proof window closes and a proof IS required -> only settle it if a proof is available. +func (k Keeper) getExpiringClaims(ctx sdk.Context) (expiringClaims []prooftypes.Claim) { + blockHeight := ctx.BlockHeight() + + // TODO_BLOCKER: query the on-chain governance parameter once available. + // `* 3` is just a random factor Olshansky added for now to make sure expiration + // doesn't happen immediately after a session's grace period is complete. + submitProofWindowEndHeight := sessionkeeper.GetSessionGracePeriodBlockCount() * 3 + + // TODO_BLOCKER(@Olshansk): Optimize this by indexing claims appropriately + // and only retrieving the claims that need to be settled rather than all + // of them and iterating through them one by one. + claims := k.proofKeeper.GetAllClaims(ctx) + + // Loop over all claims we need to check for expiration + for _, claim := range claims { + expirationHeight := claim.SessionHeader.SessionEndBlockHeight + submitProofWindowEndHeight + if blockHeight >= expirationHeight { + expiringClaims = append(expiringClaims, claim) + } + } + + // Return the actually expiring claims + return expiringClaims +} + +// isProofRequiredForClaim checks if a proof is required for a claim. +// If it is not, the claim will be settled without a proof. +// If it is, the claim will only be settled if a valid proof is available. +// TODO_TECHDEBT(#419): Document safety assumptions of the probabilistic proofs mechanism. +func (k Keeper) isProofRequiredForClaim(_ sdk.Context, claim *prooftypes.Claim) bool { + // NB: Assumption that claim is non-nil and has a valid root sum because it + // is retrieved from the store and validated, on-chain, at time of creation. + root := (smt.MerkleRoot)(claim.GetRootHash()) + claimComputeUnits := root.Sum() + // TODO_BLOCKER(#419): This is just VERY BASIC placeholder logic to have something + // in place while we implement proper probabilistic proofs. If you're reading it, + // do not overthink it and look at the documents linked in #419. + if claimComputeUnits < ProofRequiredComputeUnits { + return false + } + return true +} diff --git a/x/tokenomics/keeper/settle_session_accounting.go b/x/tokenomics/keeper/settle_session_accounting.go index 00f94d343..1edf2e19f 100644 --- a/x/tokenomics/keeper/settle_session_accounting.go +++ b/x/tokenomics/keeper/settle_session_accounting.go @@ -21,8 +21,6 @@ const ( smstRootSize = 40 ) -// atomic.if this function is not atomic. - // SettleSessionAccounting is responsible for all of the post-session accounting // necessary to burn, mint or transfer tokens depending on the amount of work // done. The amount of "work done" complete is dictated by `sum` of `root`. @@ -31,64 +29,72 @@ const ( // against a proof BEFORE calling this function. // // TODO_BLOCKER(@Olshansk): Is there a way to limit who can call this function? -func (k Keeper) SettleSessionAccounting(ctx context.Context, claim *prooftypes.Claim) error { - // Parse the context +func (k Keeper) SettleSessionAccounting( + ctx context.Context, + claim *prooftypes.Claim, +) error { logger := k.Logger().With("method", "SettleSessionAccounting") + // Make sure the claim is not nil if claim == nil { logger.Error("received a nil claim") return types.ErrTokenomicsClaimNil } + // Retrieve & validate the session header sessionHeader := claim.GetSessionHeader() - - // Make sure the session header is not nil if sessionHeader == nil { logger.Error("received a nil session header") return types.ErrTokenomicsSessionHeaderNil } - - // Validate the session header if err := sessionHeader.ValidateBasic(); err != nil { logger.Error("received an invalid session header", "error", err) return types.ErrTokenomicsSessionHeaderInvalid } - // Decompose the claim into its constituent parts for readability supplierAddr, err := sdk.AccAddressFromBech32(claim.GetSupplierAddress()) - if err != nil { + if err != nil || supplierAddr == nil { return types.ErrTokenomicsSupplierAddressInvalid } applicationAddress, err := sdk.AccAddressFromBech32(sessionHeader.GetApplicationAddress()) - if err != nil { + if err != nil || applicationAddress == nil { return types.ErrTokenomicsApplicationAddressInvalid } - // Retrieve the application - application, found := k.applicationKeeper.GetApplication(ctx, applicationAddress.String()) - if !found { - logger.Error(fmt.Sprintf("application for claim with address %s not found", applicationAddress)) - return types.ErrTokenomicsApplicationNotFound - } - + // Retrieve the sum of the root as a proxy into the amount of work done root := (smt.MerkleRoot)(claim.GetRootHash()) // TODO_DISCUSS: This check should be the responsibility of the SMST package // since it's used to get compute units from the root hash. - if len(root) != smstRootSize { + if root == nil || len(root) != smstRootSize { logger.Error(fmt.Sprintf("received an invalid root hash of size: %d", len(root))) return types.ErrTokenomicsRootHashInvalid } - - // Retrieve the sum of the root as a proxy into the amount of work done claimComputeUnits := root.Sum() + // Helpers for logging the same metadata throughout this function calls + logger = logger.With( + "compute_units", claimComputeUnits, + "session_id", sessionHeader.GetSessionId(), + "supplier", supplierAddr, + "application", applicationAddress, + ) + + logger.Info("About to start session settlement accounting") + + // Retrieve the staked application record + application, foundApplication := k.applicationKeeper.GetApplication(ctx, applicationAddress.String()) + if !foundApplication { + logger.Warn(fmt.Sprintf("application for claim with address %q not found", applicationAddress)) + return types.ErrTokenomicsApplicationNotFound + } + logger.Info(fmt.Sprintf("About to start settling claim for %d compute units", claimComputeUnits)) // Calculate the amount of tokens to mint & burn settlementAmt := k.getCoinFromComputeUnits(ctx, root) - settlementAmtCoins := sdk.NewCoins(settlementAmt) + settlementAmtuPOKT := sdk.NewCoins(settlementAmt) logger.Info(fmt.Sprintf( "%d compute units equate to %s for session %s", @@ -102,20 +108,23 @@ func (k Keeper) SettleSessionAccounting(ctx context.Context, claim *prooftypes.C // order economic effects with more optionality. This could include funds // going to pnf, delegators, enabling bonuses/rebates, etc... - // Mint uPOKT to the supplier module account - if err := k.bankKeeper.MintCoins(ctx, suppliertypes.ModuleName, settlementAmtCoins); err != nil { + // Mint new uPOKT to the supplier module account. + // These funds will be transferred to the supplier below. + if err := k.bankKeeper.MintCoins( + ctx, suppliertypes.ModuleName, settlementAmtuPOKT, + ); err != nil { return types.ErrTokenomicsSupplierModuleMintFailed.Wrapf( "minting %s to the supplier module account: %v", settlementAmt, err, ) } - logger.Info(fmt.Sprintf("minted %s in the supplier module", settlementAmt)) - // Sent the minted coins to the supplier + // Send the newley minted uPOKT from the supplier module account + // to the supplier's account. if err := k.bankKeeper.SendCoinsFromModuleToAccount( - ctx, suppliertypes.ModuleName, supplierAddr, settlementAmtCoins, + ctx, suppliertypes.ModuleName, supplierAddr, settlementAmtuPOKT, ); err != nil { return types.ErrTokenomicsSupplierModuleMintFailed.Wrapf( "sending %s to supplier with address %s: %v", @@ -124,57 +133,40 @@ func (k Keeper) SettleSessionAccounting(ctx context.Context, claim *prooftypes.C err, ) } - - logger.Info(fmt.Sprintf("sent %s to supplier with address %s", settlementAmt, supplierAddr)) + logger.Info(fmt.Sprintf("sent %s from the supplier module to the supplier account with address %q", settlementAmt, supplierAddr)) // Verify that the application has enough uPOKT to pay for the services it consumed if application.Stake.IsLT(settlementAmt) { logger.Error(fmt.Sprintf( "THIS SHOULD NOT HAPPEN. Application with address %s needs to be charged more than it has staked: %v > %v", applicationAddress, - settlementAmtCoins, + settlementAmtuPOKT, application.Stake, )) // TODO_BLOCKER(@Olshansk, @RawthiL): The application was over-serviced in the last session so it basically // goes "into debt". Need to design a way to handle this when we implement // probabilistic proofs and add all the parameter logic. Do we touch the application balance? // Do we just let it go into debt? Do we penalize the application? Do we unstake it? Etc... - settlementAmtCoins = sdk.NewCoins(*application.Stake) - } - - // Undelegate the amount of coins that need to be burnt from the application stake. - // Since the application commits a certain amount of stake to the network to be able - // to pay for relay mining, this stake is taken from the funds "in escrow" rather - // than its balance. - if err := k.bankKeeper.UndelegateCoinsFromModuleToAccount(ctx, apptypes.ModuleName, applicationAddress, settlementAmtCoins); err != nil { - logger.Error(fmt.Sprintf( - "THIS SHOULD NOT HAPPEN. Application with address %s needs to be charged more than it has staked: %v > %v", - applicationAddress, - settlementAmtCoins, - application.Stake, - )) + settlementAmtuPOKT = sdk.NewCoins(*application.Stake) } - // Send coins from the application to the application module account - if err := k.bankKeeper.SendCoinsFromAccountToModule( - ctx, applicationAddress, apptypes.ModuleName, settlementAmtCoins, + // Burn uPOKT from the application module account which was held in escrow + // on behalf of the application account. + if err := k.bankKeeper.BurnCoins( + ctx, apptypes.ModuleName, settlementAmtuPOKT, ); err != nil { - return types.ErrTokenomicsApplicationModuleFeeFailed - } - - logger.Info(fmt.Sprintf("took %s from application with address %s", settlementAmt, applicationAddress)) - - // Burn uPOKT from the application module account - if err := k.bankKeeper.BurnCoins(ctx, apptypes.ModuleName, settlementAmtCoins); err != nil { - return types.ErrTokenomicsApplicationModuleBurn + return types.ErrTokenomicsApplicationModuleBurn.Wrapf("burning %s from the application module account: %v", settlementAmt, err) } - - logger.Info(fmt.Sprintf("burned %s in the application module", settlementAmt)) + logger.Info(fmt.Sprintf("burned %s from the application module account", settlementAmt)) // Update the application's on-chain stake - newAppStake := (*application.Stake).Sub(settlementAmt) + newAppStake, err := (*application.Stake).SafeSub(settlementAmt) + if err != nil { + return types.ErrTokenomicsApplicationNewStakeInvalid.Wrapf("application %q stake cannot be reduce to a negative amount %v", applicationAddress, newAppStake) + } application.Stake = &newAppStake k.applicationKeeper.SetApplication(ctx, application) + logger.Info(fmt.Sprintf("updated stake for application with address %q to %s", applicationAddress, newAppStake)) return nil } diff --git a/x/tokenomics/keeper/settle_session_accounting_test.go b/x/tokenomics/keeper/settle_session_accounting_test.go index ec7f75360..567af0d7d 100644 --- a/x/tokenomics/keeper/settle_session_accounting_test.go +++ b/x/tokenomics/keeper/settle_session_accounting_test.go @@ -11,6 +11,7 @@ import ( testkeeper "github.com/pokt-network/poktroll/testutil/keeper" "github.com/pokt-network/poktroll/testutil/sample" prooftypes "github.com/pokt-network/poktroll/x/proof/types" + sessionkeeper "github.com/pokt-network/poktroll/x/session/keeper" sessiontypes "github.com/pokt-network/poktroll/x/session/types" sharedtypes "github.com/pokt-network/poktroll/x/shared/types" "github.com/pokt-network/poktroll/x/tokenomics/types" @@ -48,9 +49,9 @@ func TestSettleSessionAccounting_AppNotFound(t *testing.T) { Id: "svc1", Name: "svcName1", }, + SessionId: "session_id", SessionStartBlockHeight: 1, - SessionId: "1", - SessionEndBlockHeight: 5, + SessionEndBlockHeight: sessionkeeper.GetSessionEndBlockHeight(1), }, RootHash: smstRootWithSum(42), } @@ -252,9 +253,9 @@ func baseClaim(appAddr, supplierAddr string, sum uint64) prooftypes.Claim { Id: "svc1", Name: "svcName1", }, + SessionId: "session_id", SessionStartBlockHeight: 1, - SessionId: "1", - SessionEndBlockHeight: 5, + SessionEndBlockHeight: sessionkeeper.GetSessionEndBlockHeight(1), }, RootHash: smstRootWithSum(sum), } diff --git a/x/tokenomics/module/abci.go b/x/tokenomics/module/abci.go new file mode 100644 index 000000000..ebbdc9f49 --- /dev/null +++ b/x/tokenomics/module/abci.go @@ -0,0 +1,19 @@ +package tokenomics + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/pokt-network/poktroll/x/tokenomics/keeper" +) + +// EndBlocker called at every block and settles all pending claims. +func EndBlocker(ctx sdk.Context, k keeper.Keeper) error { + // NB: There are two main reasons why we settle expiring claims in the end + // instead of when a proof is submitted: + // 1. Logic - Probabilistic proof allows claims to be settled (i.e. rewarded) + // even without a proof to be able to scale to unbounded Claims & Proofs. + // 2. Implementation - This cannot be done from the `x/proof` module because + // it would create a circular dependency. + _, _, err := k.SettlePendingClaims(ctx) + return err +} diff --git a/x/tokenomics/module/module.go b/x/tokenomics/module/module.go index 4beeea0ea..46b88cc52 100644 --- a/x/tokenomics/module/module.go +++ b/x/tokenomics/module/module.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" + // this line is used by starport scaffolding # 1 + "cosmossdk.io/core/appmodule" "cosmossdk.io/core/store" "cosmossdk.io/depinject" @@ -18,9 +20,7 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/grpc-ecosystem/grpc-gateway/runtime" - // this line is used by starport scaffolding # 1 - - modulev1 "github.com/pokt-network/poktroll/api/poktroll/tokenomics/module" + tokenomicsmodule "github.com/pokt-network/poktroll/api/poktroll/tokenomics/module" "github.com/pokt-network/poktroll/x/tokenomics/keeper" "github.com/pokt-network/poktroll/x/tokenomics/types" ) @@ -95,29 +95,29 @@ func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *r type AppModule struct { AppModuleBasic - keeper keeper.Keeper - accountKeeper types.AccountKeeper - bankKeeper types.BankKeeper + tokenomicsKeeper keeper.Keeper + accountKeeper types.AccountKeeper + bankKeeper types.BankKeeper } func NewAppModule( cdc codec.Codec, - keeper keeper.Keeper, + tokenomicsKeeper keeper.Keeper, accountKeeper types.AccountKeeper, bankKeeper types.BankKeeper, ) AppModule { return AppModule{ - AppModuleBasic: NewAppModuleBasic(cdc), - keeper: keeper, - accountKeeper: accountKeeper, - bankKeeper: bankKeeper, + AppModuleBasic: NewAppModuleBasic(cdc), + tokenomicsKeeper: tokenomicsKeeper, + accountKeeper: accountKeeper, + bankKeeper: bankKeeper, } } // RegisterServices registers a gRPC query service to respond to the module-specific gRPC queries func (am AppModule) RegisterServices(cfg module.Configurator) { - types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) - types.RegisterQueryServer(cfg.QueryServer(), am.keeper) + types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.tokenomicsKeeper)) + types.RegisterQueryServer(cfg.QueryServer(), am.tokenomicsKeeper) } // RegisterInvariants registers the invariants of the module. If an invariant deviates from its predicted value, the InvariantRegistry triggers appropriate logic (most often the chain will be halted) @@ -129,12 +129,12 @@ func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, gs json.Ra // Initialize global index to index in genesis state cdc.MustUnmarshalJSON(gs, &genState) - InitGenesis(ctx, am.keeper, genState) + InitGenesis(ctx, am.tokenomicsKeeper, genState) } // ExportGenesis returns the module's exported genesis state as raw JSON bytes. func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { - genState := ExportGenesis(ctx, am.keeper) + genState := ExportGenesis(ctx, am.tokenomicsKeeper) return cdc.MustMarshalJSON(genState) } @@ -151,8 +151,9 @@ func (am AppModule) BeginBlock(_ context.Context) error { // EndBlock contains the logic that is automatically triggered at the end of each block. // The end block implementation is optional. -func (am AppModule) EndBlock(_ context.Context) error { - return nil +func (am AppModule) EndBlock(goCtx context.Context) error { + ctx := sdk.UnwrapSDKContext(goCtx) + return EndBlocker(ctx, am.tokenomicsKeeper) } // IsOnePerModuleType implements the depinject.OnePerModuleType interface. @@ -166,7 +167,7 @@ func (am AppModule) IsAppModule() {} // ---------------------------------------------------------------------------- func init() { - appmodule.Register(&modulev1.Module{}, appmodule.Provide(ProvideModule)) + appmodule.Register(&tokenomicsmodule.Module{}, appmodule.Provide(ProvideModule)) } type ModuleInputs struct { @@ -174,13 +175,13 @@ type ModuleInputs struct { StoreService store.KVStoreService Cdc codec.Codec - Config *modulev1.Module + Config *tokenomicsmodule.Module Logger log.Logger AccountKeeper types.AccountKeeper BankKeeper types.BankKeeper ApplicationKeeper types.ApplicationKeeper - SupplierKeeper types.SupplierKeeper + ProofKeeper types.ProofKeeper } type ModuleOutputs struct { @@ -204,7 +205,7 @@ func ProvideModule(in ModuleInputs) ModuleOutputs { in.BankKeeper, in.AccountKeeper, in.ApplicationKeeper, - in.SupplierKeeper, + in.ProofKeeper, ) m := NewAppModule( in.Cdc, diff --git a/x/tokenomics/module/tx_update_params_test.go b/x/tokenomics/module/tx_update_params_test.go index 022af8460..586c57e45 100644 --- a/x/tokenomics/module/tx_update_params_test.go +++ b/x/tokenomics/module/tx_update_params_test.go @@ -4,15 +4,16 @@ import ( "fmt" "testing" - tmcli "github.com/cometbft/cometbft/libs/cli" + cometcli "github.com/cometbft/cometbft/libs/cli" "github.com/cosmos/cosmos-sdk/client/flags" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/gogo/status" + "github.com/stretchr/testify/require" + "github.com/pokt-network/poktroll/testutil/network" tokenomics "github.com/pokt-network/poktroll/x/tokenomics/module" "github.com/pokt-network/poktroll/x/tokenomics/types" - "github.com/stretchr/testify/require" ) func TestCLI_UpdateParams(t *testing.T) { @@ -20,7 +21,7 @@ func TestCLI_UpdateParams(t *testing.T) { ctx := net.Validators[0].ClientCtx common := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), + fmt.Sprintf("--%s=json", cometcli.OutputFlag), fmt.Sprintf("--%s=%s", flags.FlagFrom, net.Validators[0].Address.String()), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), diff --git a/x/tokenomics/types/errors.go b/x/tokenomics/types/errors.go index 7328652af..01d5a75f1 100644 --- a/x/tokenomics/types/errors.go +++ b/x/tokenomics/types/errors.go @@ -6,19 +6,18 @@ import sdkerrors "cosmossdk.io/errors" // x/tokenomics module sentinel errors var ( - ErrTokenomicsInvalidSigner = sdkerrors.Register(ModuleName, 1100, "the provided authority address does not match the on-chain governance address") - ErrTokenomicsAddressInvalid = sdkerrors.Register(ModuleName, 1101, "the provided authority address is not a valid bech32 address") - ErrTokenomicsClaimNil = sdkerrors.Register(ModuleName, 1102, "provided claim is nil") - ErrTokenomicsSessionHeaderNil = sdkerrors.Register(ModuleName, 1103, "provided claim's session header is nil") - ErrTokenomicsSessionHeaderInvalid = sdkerrors.Register(ModuleName, 1104, "provided claim's session header is invalid") - ErrTokenomicsSupplierModuleMintFailed = sdkerrors.Register(ModuleName, 1105, "failed to mint uPOKT to supplier module account") - ErrTokenomicsSupplierRewardFailed = sdkerrors.Register(ModuleName, 1106, "failed to send uPOKT from supplier module account to supplier") - ErrTokenomicsSupplierAddressInvalid = sdkerrors.Register(ModuleName, 1107, "the supplier address in the claim is not a valid bech32 address") - ErrTokenomicsApplicationNotFound = sdkerrors.Register(ModuleName, 1108, "application not found") - ErrTokenomicsApplicationModuleBurn = sdkerrors.Register(ModuleName, 1109, "failed to burn uPOKT from application module account") - ErrTokenomicsApplicationModuleFeeFailed = sdkerrors.Register(ModuleName, 1110, "failed to send uPOKT from application module account to application") - ErrTokenomicsApplicationUndelegationFailed = sdkerrors.Register(ModuleName, 1111, "failed to undelegate uPOKT from the application module to the application account") - ErrTokenomicsApplicationAddressInvalid = sdkerrors.Register(ModuleName, 1112, "the application address in the claim is not a valid bech32 address") - ErrTokenomicsParamsInvalid = sdkerrors.Register(ModuleName, 1113, "provided params are invalid") - ErrTokenomicsRootHashInvalid = sdkerrors.Register(ModuleName, 1114, "the root hash in the claim is invalid") + ErrTokenomicsInvalidSigner = sdkerrors.Register(ModuleName, 1100, "the provided authority address does not match the on-chain governance address") + ErrTokenomicsAddressInvalid = sdkerrors.Register(ModuleName, 1101, "the provided authority address is not a valid bech32 address") + ErrTokenomicsClaimNil = sdkerrors.Register(ModuleName, 1102, "provided claim is nil") + ErrTokenomicsSessionHeaderNil = sdkerrors.Register(ModuleName, 1103, "provided claim's session header is nil") + ErrTokenomicsSessionHeaderInvalid = sdkerrors.Register(ModuleName, 1104, "provided claim's session header is invalid") + ErrTokenomicsSupplierModuleMintFailed = sdkerrors.Register(ModuleName, 1105, "failed to mint uPOKT to supplier module account") + ErrTokenomicsSupplierRewardFailed = sdkerrors.Register(ModuleName, 1106, "failed to send uPOKT from supplier module account to supplier") + ErrTokenomicsSupplierAddressInvalid = sdkerrors.Register(ModuleName, 1107, "the supplier address in the claim is not a valid bech32 address") + ErrTokenomicsApplicationNotFound = sdkerrors.Register(ModuleName, 1108, "application not found") + ErrTokenomicsApplicationModuleBurn = sdkerrors.Register(ModuleName, 1109, "failed to burn uPOKT from application module account") + ErrTokenomicsApplicationAddressInvalid = sdkerrors.Register(ModuleName, 1112, "the application address in the claim is not a valid bech32 address") + ErrTokenomicsParamsInvalid = sdkerrors.Register(ModuleName, 1113, "provided params are invalid") + ErrTokenomicsRootHashInvalid = sdkerrors.Register(ModuleName, 1114, "the root hash in the claim is invalid") + ErrTokenomicsApplicationNewStakeInvalid = sdkerrors.Register(ModuleName, 1115, "application stake cannot be reduce to a -ve amount") ) diff --git a/x/tokenomics/types/expected_keepers.go b/x/tokenomics/types/expected_keepers.go index 6d4edf39c..2f94dee35 100644 --- a/x/tokenomics/types/expected_keepers.go +++ b/x/tokenomics/types/expected_keepers.go @@ -1,4 +1,4 @@ -//go:generate mockgen -destination ../../../testutil/tokenomics/mocks/expected_keepers_mock.go -package mocks . AccountKeeper,BankKeeper,ApplicationKeeper,SupplierKeeper +//go:generate mockgen -destination ../../../testutil/tokenomics/mocks/expected_keepers_mock.go -package mocks . AccountKeeper,BankKeeper,ApplicationKeeper,ProofKeeper package types @@ -8,37 +8,23 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" apptypes "github.com/pokt-network/poktroll/x/application/types" - sharedtypes "github.com/pokt-network/poktroll/x/shared/types" + prooftypes "github.com/pokt-network/poktroll/x/proof/types" ) // AccountKeeper defines the expected interface for the Account module. type AccountKeeper interface { GetAccount(ctx context.Context, addr sdk.AccAddress) sdk.AccountI // only used for simulation - // Methods imported from account should be defined here } // BankKeeper defines the expected interface for the Bank module. type BankKeeper interface { MintCoins(ctx context.Context, moduleName string, amt sdk.Coins) error BurnCoins(ctx context.Context, moduleName string, amt sdk.Coins) error - SendCoinsFromModuleToAccount( - ctx context.Context, - senderModule string, - recipientAddr sdk.AccAddress, - amt sdk.Coins, - ) error - SendCoinsFromAccountToModule( - ctx context.Context, - senderAddr sdk.AccAddress, - recipientModule string, - amt sdk.Coins, - ) error - UndelegateCoinsFromModuleToAccount( - ctx context.Context, - senderModule string, - recipientAddr sdk.AccAddress, - amt sdk.Coins, - ) error + // We use the bankkeeper SendXXX instead of DelegateXX methods + // because their purpose is to "escrow" funds on behalf of an account rather + // than "delegate" funds from one account to another which is more closely + // linked to staking. + SendCoinsFromModuleToAccount(ctx context.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error } type ApplicationKeeper interface { @@ -46,6 +32,13 @@ type ApplicationKeeper interface { SetApplication(ctx context.Context, app apptypes.Application) } -type SupplierKeeper interface { - GetSupplier(ctx context.Context, suppAddr string) (supplier sharedtypes.Supplier, found bool) +type ProofKeeper interface { + GetAllClaims(ctx context.Context) []prooftypes.Claim + RemoveClaim(ctx context.Context, sessionId, supplierAddr string) + GetProof(ctx context.Context, sessionId, supplierAddr string) (proof prooftypes.Proof, isProofFound bool) + RemoveProof(ctx context.Context, sessionId, supplierAddr string) + + // Only used for testing & simulation + UpsertClaim(ctx context.Context, claim prooftypes.Claim) + UpsertProof(ctx context.Context, claim prooftypes.Proof) } From ef3560d87a6adbe989924adeb8d641938170fa75 Mon Sep 17 00:00:00 2001 From: Dima Kniazev Date: Wed, 10 Apr 2024 17:39:02 -0700 Subject: [PATCH 2/3] [LocalNet] Add observability stack (#475) Co-authored-by: Daniel Olshansky --- Tiltfile | 133 +- config.yml | 6 + .../access_dashboard_on_service.png | Bin 0 -> 237676 bytes .../grafana_save_dashboard.png | Bin 0 -> 539163 bytes .../docs/internal_infrastructure/localnet.md | 35 + .../grafana-dashboards/appgateserver.json | 834 ++++++++++ localnet/grafana-dashboards/cometbft.json | 1418 +++++++++++++++++ localnet/grafana-dashboards/go-runtime.json | 1162 ++++++++++++++ localnet/grafana-dashboards/relayminer.json | 830 ++++++++++ .../kubernetes/observability-loki-stack.yaml | 2 + .../observability-prometheus-stack.yaml | 23 + localnet/poktrolld/config/app.toml | 4 +- localnet/poktrolld/config/config.toml | 2 +- 13 files changed, 4433 insertions(+), 16 deletions(-) create mode 100644 docusaurus/docs/internal_infrastructure/access_dashboard_on_service.png create mode 100644 docusaurus/docs/internal_infrastructure/grafana_save_dashboard.png create mode 100644 localnet/grafana-dashboards/appgateserver.json create mode 100644 localnet/grafana-dashboards/cometbft.json create mode 100644 localnet/grafana-dashboards/go-runtime.json create mode 100644 localnet/grafana-dashboards/relayminer.json create mode 100644 localnet/kubernetes/observability-loki-stack.yaml create mode 100644 localnet/kubernetes/observability-prometheus-stack.yaml diff --git a/Tiltfile b/Tiltfile index 819033202..b06985fa6 100644 --- a/Tiltfile +++ b/Tiltfile @@ -10,6 +10,7 @@ hot_reload_dirs = ["app", "cmd", "tools", "x", "pkg"] localnet_config_path = "localnet_config.yaml" localnet_config_defaults = { "validator": {"cleanupBeforeEachStart": True}, + "observability": {"enabled": True}, "relayminers": {"count": 1}, "gateways": {"count": 1}, "appgateservers": {"count": 1}, @@ -36,13 +37,68 @@ if localnet_config["helm_chart_local_repo"]["enabled"]: print("Using local helm chart repo " + helm_chart_local_repo) chart_prefix = helm_chart_local_repo + "/charts/" + +# Observability +print("Observability enabled: " + str(localnet_config["observability"]["enabled"])) +if localnet_config["observability"]["enabled"]: + print("Observability enabled") + helm_repo( + "prometheus-community", "https://prometheus-community.github.io/helm-charts" + ) + helm_repo("grafana-helm-repo", "https://grafana.github.io/helm-charts") + + helm_resource( + "observability", + "prometheus-community/kube-prometheus-stack", + flags=[ + "--values=./localnet/kubernetes/observability-prometheus-stack.yaml", + ], + resource_deps=["prometheus-community"], + ) + + helm_resource( + "loki", + "grafana-helm-repo/loki-stack", + flags=[ + "--values=./localnet/kubernetes/observability-loki-stack.yaml", + ], + resource_deps=["grafana-helm-repo"], + ) + + k8s_resource( + new_name="grafana", + workload="observability", + extra_pod_selectors=[{"app.kubernetes.io/name": "grafana"}], + port_forwards=["3003:3000"], + labels=["monitoring"], + links=[ + link("localhost:3003", "Grafana"), + ], + pod_readiness="wait", + discovery_strategy="selectors-only", + ) + + # Import our custom grafana dashboards into Kubernetes ConfigMap + configmap_create( + "protocol-dashboards", from_file=listdir("localnet/grafana-dashboards/") + ) + + # Grafana discovers dashboards to "import" via a label + local_resource( + "protocol-dashboards-label", + "kubectl label configmap protocol-dashboards grafana_dashboard=1 --overwrite", + resource_deps=["protocol-dashboards"], + ) + # Import keyring/keybase files into Kubernetes ConfigMap configmap_create( "poktrolld-keys", from_file=listdir("localnet/poktrolld/keyring-test/") ) # Import keyring/keybase files into Kubernetes Secret -secret_create_generic( "poktrolld-keys", from_file=listdir("localnet/poktrolld/keyring-test/")) +secret_create_generic( + "poktrolld-keys", from_file=listdir("localnet/poktrolld/keyring-test/") +) # Import configuration files into Kubernetes ConfigMap configmap_create( "poktrolld-configs", from_file=listdir("localnet/poktrolld/config/"), watch=True @@ -93,7 +149,12 @@ COPY bin/poktrolld /usr/local/bin/poktrolld WORKDIR / """, only=["./bin/poktrolld"], - entrypoint=["/tilt-restart-wrapper", "--watch_file=/tmp/.restart-proc", "--entr_flags=-r", "poktrolld"], + entrypoint=[ + "/tilt-restart-wrapper", + "--watch_file=/tmp/.restart-proc", + "--entr_flags=-r", + "poktrolld", + ], live_update=[sync("bin/poktrolld", "/usr/local/bin/poktrolld")], ) @@ -111,6 +172,8 @@ helm_resource( "--values=./localnet/kubernetes/values-validator.yaml", "--set=persistence.cleanupBeforeEachStart=" + str(localnet_config["validator"]["cleanupBeforeEachStart"]), + "--set=serviceMonitor.enabled=" + + str(localnet_config["observability"]["enabled"]), ], image_deps=["poktrolld"], image_keys=[("image.repository", "image.tag")], @@ -126,20 +189,34 @@ for x in range(localnet_config["relayminers"]["count"]): flags=[ "--values=./localnet/kubernetes/values-common.yaml", "--values=./localnet/kubernetes/values-relayminer-common.yaml", - "--values=./localnet/kubernetes/values-relayminer-"+str(actor_number)+".yaml", + "--values=./localnet/kubernetes/values-relayminer-" + + str(actor_number) + + ".yaml", + "--set=metrics.serviceMonitor.enabled=" + + str(localnet_config["observability"]["enabled"]), ], image_deps=["poktrolld"], image_keys=[("image.repository", "image.tag")], ) k8s_resource( - "relayminer" + str(actor_number), + "relayminer" + str(actor_number), labels=["supplier_nodes"], resource_deps=["validator"], + links=[ + link( + "http://localhost:3003/d/relayminer/relayminer?orgId=1&var-relayminer=relayminer" + + str(actor_number), + "Grafana dashboard", + ), + ], port_forwards=[ - str(8084+actor_number)+":8545", # relayminer1 - exposes 8545, relayminer2 exposes 8546, etc. - str(40044+actor_number)+":40005", # DLV port. relayminer1 - exposes 40045, relayminer2 exposes 40046, etc. + str(8084 + actor_number) + + ":8545", # relayminer1 - exposes 8545, relayminer2 exposes 8546, etc. + str(40044 + actor_number) + + ":40005", # DLV port. relayminer1 - exposes 40045, relayminer2 exposes 40046, etc. # Run `curl localhost:PORT` to see the current snapshot of relayminer metrics. - str(9069+actor_number)+":9090", # Relayminer metrics port. relayminer1 - exposes 9070, relayminer2 exposes 9071, etc. + str(9069 + actor_number) + + ":9090", # Relayminer metrics port. relayminer1 - exposes 9070, relayminer2 exposes 9071, etc. ], ) @@ -154,6 +231,8 @@ for x in range(localnet_config["appgateservers"]["count"]): "--values=./localnet/kubernetes/values-common.yaml", "--values=./localnet/kubernetes/values-appgateserver.yaml", "--set=config.signing_key=app" + str(actor_number), + "--set=metrics.serviceMonitor.enabled=" + + str(localnet_config["observability"]["enabled"]), ], image_deps=["poktrolld"], image_keys=[("image.repository", "image.tag")], @@ -162,11 +241,21 @@ for x in range(localnet_config["appgateservers"]["count"]): "appgateserver" + str(actor_number), labels=["applications"], resource_deps=["validator"], + links=[ + link( + "http://localhost:3003/d/appgateserver/protocol-appgate-server?orgId=1&refresh=5s&var-appgateserver=appgateserver" + + str(actor_number), + "Grafana dashboard", + ), + ], port_forwards=[ - str(42068+actor_number)+":42069", # appgateserver1 - exposes 42069, appgateserver2 exposes 42070, etc. - str(40054+actor_number)+":40006", # DLV port. appgateserver1 - exposes 40055, appgateserver2 exposes 40056, etc. + str(42068 + actor_number) + + ":42069", # appgateserver1 - exposes 42069, appgateserver2 exposes 42070, etc. + str(40054 + actor_number) + + ":40006", # DLV port. appgateserver1 - exposes 40055, appgateserver2 exposes 40056, etc. # Run `curl localhost:PORT` to see the current snapshot of appgateserver metrics. - str(9079+actor_number)+":9090", # appgateserver metrics port. appgateserver1 - exposes 9080, appgateserver2 exposes 9081, etc. + str(9079 + actor_number) + + ":9090", # appgateserver metrics port. appgateserver1 - exposes 9080, appgateserver2 exposes 9081, etc. ], ) @@ -181,6 +270,8 @@ for x in range(localnet_config["gateways"]["count"]): "--values=./localnet/kubernetes/values-common.yaml", "--values=./localnet/kubernetes/values-gateway.yaml", "--set=config.signing_key=gateway" + str(actor_number), + "--set=metrics.serviceMonitor.enabled=" + + str(localnet_config["observability"]["enabled"]), ], image_deps=["poktrolld"], image_keys=[("image.repository", "image.tag")], @@ -189,11 +280,21 @@ for x in range(localnet_config["gateways"]["count"]): "gateway" + str(actor_number), labels=["gateways"], resource_deps=["validator"], + links=[ + link( + "http://localhost:3003/d/appgateserver/protocol-appgate-server?orgId=1&refresh=5s&var-appgateserver=gateway" + + str(actor_number), + "Grafana dashboard", + ), + ], port_forwards=[ - str(42078+actor_number)+":42069", # gateway1 - exposes 42079, gateway2 exposes 42080, etc. - str(40064+actor_number)+":40006", # DLV port. gateway1 - exposes 40065, gateway2 exposes 40066, etc. + str(42078 + actor_number) + + ":42069", # gateway1 - exposes 42079, gateway2 exposes 42080, etc. + str(40064 + actor_number) + + ":40006", # DLV port. gateway1 - exposes 40065, gateway2 exposes 40066, etc. # Run `curl localhost:PORT` to see the current snapshot of gateway metrics. - str(9089+actor_number)+":9090", # gateway metrics port. gateway1 - exposes 9090, gateway2 exposes 9091, etc. + str(9089 + actor_number) + + ":9090", # gateway metrics port. gateway1 - exposes 9090, gateway2 exposes 9091, etc. ], ) @@ -201,6 +302,12 @@ k8s_resource( "validator", labels=["pocket_network"], port_forwards=["36657", "36658", "40004"], + links=[ + link( + "http://localhost:3003/d/cosmoscometbft/protocol-cometbft-dashboard?orgId=1&from=now-1h&to=now", + "Validator dashboard", + ), + ], ) k8s_resource("anvil", labels=["data_nodes"], port_forwards=["8547"]) diff --git a/config.yml b/config.yml index 828c75f95..f213023fa 100644 --- a/config.yml +++ b/config.yml @@ -65,11 +65,17 @@ client: validators: - name: validator1 bonded: 900000000upokt + app: + telemetry: + enabled: true + prometheus-retention-time: "600" # seconds config: moniker: "validator1" consensus: timeout_commit: "2s" timeout_propose: "2s" + instrumentation: + prometheus: true client: chain-id: poktroll diff --git a/docusaurus/docs/internal_infrastructure/access_dashboard_on_service.png b/docusaurus/docs/internal_infrastructure/access_dashboard_on_service.png new file mode 100644 index 0000000000000000000000000000000000000000..5a988102f9263afa093598a8bc76c9ab83cc8f5e GIT binary patch literal 237676 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

AN&^Cuqr9hm(ZR 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 L+~R7P(JlO6n|y0C literal 0 HcmV?d00001 diff --git a/docusaurus/docs/internal_infrastructure/grafana_save_dashboard.png b/docusaurus/docs/internal_infrastructure/grafana_save_dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..94432894857770fb8e0f0140c95be71afe2c166b GIT binary patch literal 539163 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%0DJeMslxUGOwff9_)>DfD*U%$0Yx{Ti& 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≠xFVAtK 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 z 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 literal 0 HcmV?d00001 diff --git a/docusaurus/docs/internal_infrastructure/localnet.md b/docusaurus/docs/internal_infrastructure/localnet.md index 3ddfb4cdb..5960acac7 100644 --- a/docusaurus/docs/internal_infrastructure/localnet.md +++ b/docusaurus/docs/internal_infrastructure/localnet.md @@ -24,6 +24,9 @@ needed to send an end-to-end relay. - [localnet_config.yaml](#localnet_configyaml) - [Scaling network actors](#scaling-network-actors) - [Modify Kubernetes workloads](#modify-kubernetes-workloads) +- [Observability](#observability) + - [Access dashboards with graphs and logs](#access-dashboards-with-graphs-and-logs) + - [How to update and save an existing dashboard?](#how-to-update-and-save-an-existing-dashboard) - [Troubleshooting](#troubleshooting) - [Clean Slate (Nuclear Option)](#clean-slate-nuclear-option) @@ -110,6 +113,38 @@ You can always set it back to `false` with: sed -i'' -e '/helm_chart_local_repo:/,+1 s/\(enabled: \)false/\1true/; /helm_chart_local_repo:/,+1 s/\(enabled: \)true/\1false/' localnet_config.yaml ``` +## Observability + +You can configure LocalNet to deploy third-party observability tools such as Prometheus and Grafana: + +`localnet_config.yaml`: + +```yaml +observability: + enabled: true +``` + +### Access dashboards with graphs and logs + +Each service in Tilt has a link to its own Grafana dashboard as seen in the image below. + +Specifically, the RelayMiner, Validator, AppGateServer and others each have a separate dashboards. + +![Example](./access_dashboard_on_service.png) + +### How to update and save an existing dashboard? + +Every time LocalNet is re-started, Grafana is deployed and provisioned from scratch. + +A list of existing dashboards are saved as JSON files in `localnet/grafana-dashboards`. +If you wish to change a dashboard, do the following: + +1. Make the necessary modifications in the Grafana UI +2. Click save button. This will then display the updated JSON output of the dashboard +3. Copy-paste the output to the corresponding file in `localnet/grafana-dashboards` + +![Example](./grafana_save_dashboard.png) + ## Troubleshooting ### Clean Slate (Nuclear Option) diff --git a/localnet/grafana-dashboards/appgateserver.json b/localnet/grafana-dashboards/appgateserver.json new file mode 100644 index 000000000..85d90e37b --- /dev/null +++ b/localnet/grafana-dashboards/appgateserver.json @@ -0,0 +1,834 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 8, + "panels": [], + "title": "Relay info", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 1 + }, + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum (appgateserver_requests_total{pod=~\"^$appgateserver.*\"}) by (request_type, service_id)", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Relay requests", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 1 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum (appgateserver_errors_total{pod=~\"^$appgateserver.*\"}) by (request_type, service_id)", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Relay errors", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 9 + }, + "id": 2, + "panels": [], + "title": "Golang metrics", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 10 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum (go_goroutines{job=~\"$appgateserver-.*\"}) by (pod)", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Goroutines", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 18 + }, + "id": 5, + "panels": [], + "title": "OS metrics", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "requests" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F2495C", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.lineWidth", + "value": 2 + }, + { + "id": "custom.stacking", + "value": { + "group": "A", + "mode": "none" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "limits" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#FF9830", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.lineWidth", + "value": 2 + }, + { + "id": "custom.stacking", + "value": { + "group": "A", + "mode": "none" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 0, + "y": 19 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{pod=~\"^$appgateserver.*\"}) by (container)", + "format": "time_series", + "legendFormat": "{{container}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum(\n kube_pod_container_resource_requests{pod=~\"^$appgateserver.*\", resource=\"cpu\"}\n)\n", + "format": "time_series", + "legendFormat": "requests", + "range": true, + "refId": "B" + }, + { + "datasource": { + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum(\n kube_pod_container_resource_limits{pod=~\"^$appgateserver.*\", resource=\"cpu\"}\n)\n", + "format": "time_series", + "legendFormat": "limits", + "range": true, + "refId": "C" + } + ], + "title": "CPU Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "requests" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F2495C", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.lineWidth", + "value": 2 + }, + { + "id": "custom.stacking", + "value": { + "group": "A", + "mode": "none" + } + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "limits" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#FF9830", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.lineWidth", + "value": 2 + }, + { + "id": "custom.stacking", + "value": { + "group": "A", + "mode": "none" + } + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 12, + "y": 19 + }, + "id": 7, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", pod=~\"^$appgateserver.*\", container!=\"\", image!=\"\"}) by (container)", + "format": "time_series", + "legendFormat": "{{container}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", pod=~\"^$appgateserver.*\", resource=\"memory\"}\n)\n", + "format": "time_series", + "legendFormat": "requests", + "range": true, + "refId": "B" + }, + { + "datasource": { + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", pod=~\"^$appgateserver.*\", resource=\"memory\"}\n)\n", + "format": "time_series", + "legendFormat": "limits", + "range": true, + "refId": "C" + } + ], + "title": "Memory Usage (WSS)", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 25 + }, + "id": 3, + "panels": [], + "title": "Logs", + "type": "row" + }, + { + "datasource": { + "type": "loki", + "uid": "P8E80F9AEF21F6940" + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 26 + }, + "id": 4, + "options": { + "dedupStrategy": "none", + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": true, + "sortOrder": "Descending", + "wrapLogMessage": true + }, + "targets": [ + { + "datasource": { + "type": "loki", + "uid": "P8E80F9AEF21F6940" + }, + "editorMode": "builder", + "expr": "{instance=\"$appgateserver\"} |= `` | json", + "queryType": "range", + "refId": "A" + } + ], + "title": "Logs", + "type": "logs" + } + ], + "refresh": "5s", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "appgateserver1", + "value": "appgateserver1" + }, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "definition": "label_values(go_info{container=\"appgate-server\"},job)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "appgateserver", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(go_info{container=\"appgate-server\"},job)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "/^(?.*)-appgate/", + "skipUrlSync": false, + "sort": 0, + "type": "query" + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Protocol / AppGate Server", + "uid": "appgateserver", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/localnet/grafana-dashboards/cometbft.json b/localnet/grafana-dashboards/cometbft.json new file mode 100644 index 000000000..ab81a7380 --- /dev/null +++ b/localnet/grafana-dashboards/cometbft.json @@ -0,0 +1,1418 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "A Grafana dashboard compatible with all the cosmos-sdk and cometbft based blockchains.", + "editable": true, + "fiscalYearStartMonth": 0, + "gnetId": 11036, + "graphTooltip": 0, + "links": [], + "panels": [ + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 64, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "refId": "A" + } + ], + "title": "Poktrolld overview", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$DS" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "locale" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 0, + "y": 1 + }, + "hideTimeOverride": false, + "id": 4, + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "uid": "$DS" + }, + "editorMode": "code", + "expr": "cometbft_consensus_height{}", + "format": "time_series", + "hide": false, + "instant": true, + "interval": "30s", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Block Height", + "type": "stat" + }, + { + "datasource": { + "uid": "$DS" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "locale" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 6, + "y": 1 + }, + "hideTimeOverride": false, + "id": 40, + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "uid": "$DS" + }, + "expr": "cometbft_consensus_total_txs{}", + "format": "time_series", + "interval": "30s", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Total Transactions", + "type": "stat" + }, + { + "datasource": { + "uid": "$DS" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 12, + "y": 1 + }, + "hideTimeOverride": true, + "id": 39, + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "uid": "$DS" + }, + "expr": "cometbft_consensus_block_interval_seconds{}", + "format": "time_series", + "interval": "30s", + "intervalFactor": 1, + "refId": "A" + } + ], + "timeFrom": "1h", + "title": "Avg Block Time", + "type": "stat" + }, + { + "datasource": { + "uid": "$DS" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 18, + "y": 1 + }, + "hideTimeOverride": false, + "id": 47, + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "uid": "$DS" + }, + "expr": "cometbft_consensus_validators_power{}", + "format": "time_series", + "instant": false, + "interval": "30s", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Bonded Tokens", + "type": "stat" + }, + { + "aliasColors": { + "Height for last 3 hours": "#447ebc", + "Total Transactions for last 3 hours": "#ef843c" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$DS" + }, + "decimals": 0, + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 3, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 5 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 15, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$DS" + }, + "expr": "cometbft_consensus_validators{}", + "format": "time_series", + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "Active", + "refId": "A" + }, + { + "datasource": { + "uid": "$DS" + }, + "expr": "cometbft_consensus_missing_validators{}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Missing", + "refId": "B" + }, + { + "datasource": { + "uid": "$DS" + }, + "expr": "cometbft_consensus_byzantine_validators{}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Byzantine", + "refId": "C" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Validators", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "locale", + "label": "", + "logBase": 1, + "min": "0", + "show": true + }, + { + "format": "none", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": { + "Height for last 3 hours": "#447ebc", + "Total Transactions for last 3 hours": "#ef843c" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$DS" + }, + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 3, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 5 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 48, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$DS" + }, + "expr": "cometbft_consensus_validators_power{}", + "format": "time_series", + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "Online", + "refId": "A" + }, + { + "datasource": { + "uid": "$DS" + }, + "expr": "cometbft_consensus_missing_validators_power{}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Missing", + "refId": "B" + }, + { + "datasource": { + "uid": "$DS" + }, + "expr": "cometbft_consensus_byzantine_validators_power{}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Byzantine", + "refId": "C" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Voting Power", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": "", + "logBase": 1, + "min": "0", + "show": true + }, + { + "format": "none", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": { + "Height for last 3 hours": "#447ebc", + "Total Transactions for last 3 hours": "#ef843c" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$DS" + }, + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 3, + "fillGradient": 0, + "gridPos": { + "h": 5, + "w": 12, + "x": 0, + "y": 14 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 49, + "legend": { + "alignAsTable": false, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$DS" + }, + "expr": "cometbft_consensus_block_size_bytes{}", + "format": "time_series", + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "Block Size", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Block Size", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 2, + "format": "bytes", + "label": "", + "logBase": 1, + "min": "0", + "show": true + }, + { + "format": "none", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": { + "Height for last 3 hours": "#447ebc", + "Total Transactions for last 3 hours": "#ef843c" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$DS" + }, + "decimals": 0, + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 3, + "fillGradient": 0, + "gridPos": { + "h": 5, + "w": 12, + "x": 12, + "y": 14 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 50, + "legend": { + "alignAsTable": false, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": true, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$DS" + }, + "expr": "cometbft_consensus_num_txs{}", + "format": "time_series", + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "Transactions", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Transactions", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": "", + "logBase": 1, + "min": "0", + "show": true + }, + { + "format": "none", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 19 + }, + "id": 55, + "panels": [], + "repeat": "instance", + "repeatDirection": "h", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "refId": "A" + } + ], + "title": "instance overview", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$DS" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, + "mappings": [], + "max": 20, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#e24d42", + "value": null + }, + { + "color": "#ef843c", + "value": 2 + }, + { + "color": "#7eb26d", + "value": 5 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 0, + "y": 20 + }, + "hideTimeOverride": true, + "id": 53, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "uid": "$DS" + }, + "editorMode": "code", + "expr": "cometbft_p2p_peers{}", + "format": "time_series", + "instant": true, + "interval": "30s", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Connected Peers", + "type": "gauge" + }, + { + "datasource": { + "uid": "$DS" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, + "mappings": [], + "max": 50, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#7eb26d", + "value": null + }, + { + "color": "#ef843c", + "value": 10 + }, + { + "color": "#e24d42", + "value": 20 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 6, + "y": 20 + }, + "hideTimeOverride": true, + "id": 56, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "uid": "$DS" + }, + "expr": "cometbft_mempool_size{}", + "format": "time_series", + "instant": true, + "interval": "30s", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Unconfirmed Transactions", + "type": "gauge" + }, + { + "datasource": { + "uid": "$DS" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 12, + "y": 20 + }, + "hideTimeOverride": true, + "id": 60, + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "uid": "$DS" + }, + "expr": "cometbft_mempool_failed_txs{}", + "format": "time_series", + "instant": true, + "interval": "30s", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Failed Transactions", + "type": "stat" + }, + { + "datasource": { + "uid": "$DS" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "locale" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 18, + "y": 20 + }, + "hideTimeOverride": true, + "id": 61, + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "uid": "$DS" + }, + "expr": "cometbft_mempool_recheck_times{}", + "format": "time_series", + "instant": true, + "interval": "30s", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Recheck Times", + "type": "stat" + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$DS" + }, + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 24 + }, + "hiddenSeries": false, + "id": 59, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": false, + "total": false, + "values": false + }, + "lines": false, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$DS" + }, + "expr": "cometbft_p2p_peer_receive_bytes_total{}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{peer_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Total Network Input", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "series", + "show": false, + "values": [ + "current" + ] + }, + "yaxes": [ + { + "format": "bytes", + "logBase": 1, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "$DS" + }, + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 24 + }, + "hiddenSeries": false, + "id": 58, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": false, + "total": false, + "values": false + }, + "lines": false, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.4.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$DS" + }, + "expr": "cometbft_p2p_peer_send_bytes_total{}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{peer_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Total Network Output", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "series", + "show": false, + "values": [ + "current" + ] + }, + "yaxes": [ + { + "format": "bytes", + "logBase": 1, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 33 + }, + "id": 65, + "panels": [ + { + "datasource": { + "type": "loki", + "uid": "P8E80F9AEF21F6940" + }, + "gridPos": { + "h": 17, + "w": 24, + "x": 0, + "y": 34 + }, + "id": 66, + "options": { + "dedupStrategy": "none", + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": false, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "targets": [ + { + "datasource": { + "type": "loki", + "uid": "P8E80F9AEF21F6940" + }, + "editorMode": "builder", + "expr": "{container=\"poktrolld-validator\"} |= ``", + "queryType": "range", + "refId": "A" + } + ], + "title": "Validator logs", + "type": "logs" + } + ], + "title": "Validator logs", + "type": "row" + } + ], + "refresh": false, + "schemaVersion": 39, + "tags": [ + "Blockchain", + "Cosmos" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "Prometheus", + "value": "prometheus" + }, + "hide": 0, + "includeAll": false, + "label": "Datasource", + "multi": false, + "name": "DS", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "Protocol / CometBFT Dashboard", + "uid": "cosmoscometbft", + "version": 4, + "weekStart": "" +} \ No newline at end of file diff --git a/localnet/grafana-dashboards/go-runtime.json b/localnet/grafana-dashboards/go-runtime.json new file mode 100644 index 000000000..6018c4dd9 --- /dev/null +++ b/localnet/grafana-dashboards/go-runtime.json @@ -0,0 +1,1162 @@ +{ + "__inputs": [], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "7.2.0" + }, + { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "A quickstart to setup the Prometheus Go runtime exporter with preconfigured dashboards, alerting rules, and recording rules.", + "editable": true, + "graphTooltip": 0, + "id": null, + "iteration": 1602794777869, + "links": [], + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "description": "Average total bytes of memory reserved across all process instances of a job.", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "hiddenSeries": false, + "id": 16, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg by(job)(go_memstats_sys_bytes{job=\"$job\", instance=~\"$instance\"})", + "interval": "", + "legendFormat": "{{job}} (avg)", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Total Reserved Memory", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "description": "Average stack memory usage across all instances of a job.", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "hiddenSeries": false, + "id": 24, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg by (job) (go_memstats_stack_sys_bytes{job=\"$job\", instance=~\"$instance\"})", + "interval": "", + "legendFormat": "{{job}}: stack inuse (avg)", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Stack Memory Use", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "description": "Average memory reservations by the runtime, not for stack or heap, across all instances of a job.", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "hiddenSeries": false, + "id": 26, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg by (job)(go_memstats_mspan_sys_bytes{job=\"$job\", instance=~\"$instance\"})", + "interval": "", + "legendFormat": "{{instance}}: mspan (avg)", + "refId": "B" + }, + { + "expr": "avg by (job)(go_memstats_mcache_sys_bytes{job=\"$job\", instance=~\"$instance\"})", + "interval": "", + "legendFormat": "{{instance}}: mcache (avg)", + "refId": "D" + }, + { + "expr": "avg by (job)(go_memstats_buck_hash_sys_bytes{job=\"$job\", instance=~\"$instance\"})", + "interval": "", + "legendFormat": "{{instance}}: buck hash (avg)", + "refId": "E" + }, + { + "expr": "avg by (job)(go_memstats_gc_sys_bytes{job=\"$job\", instance=~\"$instance\"})", + "interval": "", + "legendFormat": "{{job}}: gc (avg)", + "refId": "F" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Other Memory Reservations", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "description": "Average memory reserved, and actually in use, by the heap, across all instances of a job.", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "hiddenSeries": false, + "id": 12, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg by (job)(go_memstats_heap_sys_bytes{job=\"$job\", instance=~\"$instance\"})", + "interval": "", + "legendFormat": "{{job}}: heap reserved (avg)", + "refId": "B" + }, + { + "expr": "avg by (job)(go_memstats_heap_inuse_bytes{job=\"$job\", instance=~\"$instance\"})", + "interval": "", + "legendFormat": "{{job}}: heap in use (avg)", + "refId": "A" + }, + { + "expr": "avg by (job)(go_memstats_heap_alloc_bytes{job=~\"tns_app\",instance=~\".*\"})", + "interval": "", + "legendFormat": "{{job}}: heap alloc (avg)", + "refId": "C" + }, + { + "expr": "avg by (job)(go_memstats_heap_idle_bytes{job=~\"tns_app\",instance=~\".*\"})", + "interval": "", + "legendFormat": "{{job}}: heap idle (avg)", + "refId": "D" + }, + { + "expr": "avg by (job)(go_memstats_heap_released_bytes{job=~\"tns_app\",instance=~\".*\"})", + "interval": "", + "legendFormat": "{{job}}: heap released (avg)", + "refId": "E" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Heap Memory", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "description": "Average allocation rate in bytes per second, across all instances of a job.", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 16 + }, + "hiddenSeries": false, + "id": 14, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 1, + "points": true, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg by (job)(rate(go_memstats_alloc_bytes_total{job=\"$job\", instance=~\"$instance\"}[$__rate_interval]))", + "interval": "", + "legendFormat": "{{job}}: bytes malloced/s (avg)", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Allocation Rate, Bytes", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "description": "Average rate of heap object allocation, across all instances of a job.", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 16 + }, + "hiddenSeries": false, + "id": 20, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(go_memstats_mallocs_total{job=\"$job\", instance=~\"$instance\"}[$__rate_interval])", + "interval": "", + "legendFormat": "{{job}}: obj mallocs/s (avg)", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Heap Object Allocation Rate", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "description": "Average number of live memory objects across all instances of a job.", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 24 + }, + "hiddenSeries": false, + "id": 22, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg by(job)(go_memstats_mallocs_total{job=\"$job\", instance=~\"$instance\"} - go_memstats_frees_total{job=\"$job\", instance=~\"$instance\"})", + "interval": "", + "legendFormat": "{{job}}: object count (avg)", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Number of Live Objects", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "description": "Average number of goroutines across instances of a job.", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 24 + }, + "hiddenSeries": false, + "id": 8, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg by (job)(go_goroutines{job=\"$job\", instance=~\"$instance\"})", + "interval": "", + "legendFormat": "{{job}}: goroutine count (avg)", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Goroutines", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 32 + }, + "hiddenSeries": false, + "id": 4, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg by (job)(go_gc_duration_seconds{quantile=\"0\", job=\"$job\", instance=~\"$instance\"})", + "interval": "", + "legendFormat": "{{job}}: min gc time (avg)", + "refId": "A" + }, + { + "expr": "avg by (job)(go_gc_duration_seconds{quantile=\"1\", job=\"$job\", instance=~\"$instance\"})", + "interval": "", + "legendFormat": "{{job}}: max gc time (avg)", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "GC min & max duration", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ms", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "description": "The number used bytes at which the runtime plans to perform the next GC, averaged across all instances of a job.", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 32 + }, + "hiddenSeries": false, + "id": 27, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg by (job)(go_memstats_next_gc_bytes{job=\"$job\", instance=~\"$instance\"})", + "interval": "", + "legendFormat": "{{job}} next gc bytes (avg)", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Next GC, Bytes", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": "5s", + "schemaVersion": 25, + "style": "dark", + "tags": [ + "go", + "golang" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "Prometheus", + "value": "Prometheus" + }, + "hide": 0, + "includeAll": false, + "label": null, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "allValue": null, + "current": {}, + "datasource": "$datasource", + "definition": "label_values(go_info, job)", + "hide": 0, + "includeAll": false, + "label": "job", + "multi": false, + "name": "job", + "options": [], + "query": "label_values(go_info, job)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": "", + "current": {}, + "datasource": "$datasource", + "definition": "label_values(go_info{job=\"$job\"}, instance)", + "hide": 0, + "includeAll": true, + "label": "instance", + "multi": true, + "name": "instance", + "options": [], + "query": "label_values(go_info{job=\"$job\"}, instance)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "Protocol / Go Runtime Exporter", + "uid": "CgCw8jKZz3", + "version": 3, + "gnetId": 14061 +} \ No newline at end of file diff --git a/localnet/grafana-dashboards/relayminer.json b/localnet/grafana-dashboards/relayminer.json new file mode 100644 index 000000000..5fbd5e25e --- /dev/null +++ b/localnet/grafana-dashboards/relayminer.json @@ -0,0 +1,830 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 8, + "panels": [], + "title": "Relay info", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 1 + }, + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum (relayminer_requests_total{pod=~\"^$relayminer.*\"}) by (pod)", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Relay requests", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 1 + }, + "id": 10, + "options": { + "calculate": true, + "calculation": { + "yBuckets": { + "scale": { + "type": "linear" + } + } + }, + "cellGap": 1, + "cellValues": { + "unit": "dtdurations" + }, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Oranges", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false + } + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "exemplar": false, + "expr": "relayminer_request_duration_seconds_bucket{pod=~\"^$relayminer.*\"}", + "format": "heatmap", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{le}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Request duration", + "type": "heatmap" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 9 + }, + "id": 2, + "panels": [], + "title": "Golang metrics", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 10 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "go_goroutines{job=\"$relayminer\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Goroutines", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 18 + }, + "id": 5, + "panels": [], + "title": "OS metrics", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "requests" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F2495C", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.lineWidth", + "value": 2 + }, + { + "id": "custom.stacking", + "value": { + "group": "A", + "mode": "none" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "limits" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#FF9830", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.lineWidth", + "value": 2 + }, + { + "id": "custom.stacking", + "value": { + "group": "A", + "mode": "none" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 0, + "y": 19 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{pod=~\"^$relayminer.*\"}) by (container)", + "format": "time_series", + "legendFormat": "{{container}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum(\n kube_pod_container_resource_requests{pod=~\"^$relayminer.*\", resource=\"cpu\"}\n)\n", + "format": "time_series", + "legendFormat": "requests", + "range": true, + "refId": "B" + }, + { + "datasource": { + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum(\n kube_pod_container_resource_limits{pod=~\"^$relayminer.*\", resource=\"cpu\"}\n)\n", + "format": "time_series", + "legendFormat": "limits", + "range": true, + "refId": "C" + } + ], + "title": "CPU Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 0, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "requests" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F2495C", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.lineWidth", + "value": 2 + }, + { + "id": "custom.stacking", + "value": { + "group": "A", + "mode": "none" + } + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "limits" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#FF9830", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.lineWidth", + "value": 2 + }, + { + "id": "custom.stacking", + "value": { + "group": "A", + "mode": "none" + } + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 12, + "y": 19 + }, + "id": 7, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", pod=~\"^$relayminer.*\", container!=\"\", image!=\"\"}) by (container)", + "format": "time_series", + "legendFormat": "{{container}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", pod=~\"^$relayminer.*\", resource=\"memory\"}\n)\n", + "format": "time_series", + "legendFormat": "requests", + "range": true, + "refId": "B" + }, + { + "datasource": { + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", pod=~\"^$relayminer.*\", resource=\"memory\"}\n)\n", + "format": "time_series", + "legendFormat": "limits", + "range": true, + "refId": "C" + } + ], + "title": "Memory Usage (WSS)", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 25 + }, + "id": 3, + "panels": [], + "title": "Logs", + "type": "row" + }, + { + "datasource": { + "type": "loki", + "uid": "P8E80F9AEF21F6940" + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 26 + }, + "id": 4, + "options": { + "dedupStrategy": "none", + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": true, + "sortOrder": "Descending", + "wrapLogMessage": true + }, + "targets": [ + { + "datasource": { + "type": "loki", + "uid": "P8E80F9AEF21F6940" + }, + "editorMode": "builder", + "expr": "{instance=\"$relayminer\"} |= `` | json", + "queryType": "range", + "refId": "A" + } + ], + "title": "Logs", + "type": "logs" + } + ], + "refresh": "5s", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": true, + "text": "relayminer1", + "value": "relayminer1" + }, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "definition": "label_values(go_info{container=\"relayminer\"},job)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "relayminer", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(go_info{container=\"relayminer\"},job)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Protocol / RelayMiner", + "uid": "relayminer", + "version": 4, + "weekStart": "" +} \ No newline at end of file diff --git a/localnet/kubernetes/observability-loki-stack.yaml b/localnet/kubernetes/observability-loki-stack.yaml new file mode 100644 index 000000000..adac4fed8 --- /dev/null +++ b/localnet/kubernetes/observability-loki-stack.yaml @@ -0,0 +1,2 @@ +loki: + isDefault: false diff --git a/localnet/kubernetes/observability-prometheus-stack.yaml b/localnet/kubernetes/observability-prometheus-stack.yaml new file mode 100644 index 000000000..c6a29b67b --- /dev/null +++ b/localnet/kubernetes/observability-prometheus-stack.yaml @@ -0,0 +1,23 @@ +grafana: + enabled: true + adminPassword: none + grafana.ini: + auth: + disable_login_form: true + disable_signout_menu: true + auth.anonymous: + enabled: true + org_role: Admin + users: + allow_sign_up: false + allow_org_create: false + auto_assign_org: true + auto_assign_org_role: Admin + auto_assign_org_id: 1 + viewers_can_edit: true + security: + allow_embedding: true + +prometheus: + prometheusSpec: + serviceMonitorSelectorNilUsesHelmValues: false diff --git a/localnet/poktrolld/config/app.toml b/localnet/poktrolld/config/app.toml index 46b8492e7..0e3e51d5a 100644 --- a/localnet/poktrolld/config/app.toml +++ b/localnet/poktrolld/config/app.toml @@ -53,9 +53,9 @@ query-gas-limit = "0" enable-hostname = false enable-hostname-label = false enable-service-label = false - enabled = false + enabled = true global-labels = [] metrics-sink = "" - prometheus-retention-time = 0 + prometheus-retention-time = "600" service-name = "" statsd-addr = "" diff --git a/localnet/poktrolld/config/config.toml b/localnet/poktrolld/config/config.toml index 85e7715cc..d94beca6a 100644 --- a/localnet/poktrolld/config/config.toml +++ b/localnet/poktrolld/config/config.toml @@ -467,7 +467,7 @@ psql-conn = "" # When true, Prometheus metrics are served under /metrics on # PrometheusListenAddr. # Check out the documentation for the list of available metrics. -prometheus = false +prometheus = true # Address to listen for Prometheus collector(s) connections prometheus_listen_addr = ":26660" From dbb6a02ee6736f52a0ea637b5bfe1dd5ec1a31f1 Mon Sep 17 00:00:00 2001 From: Daniel Olshansky Date: Wed, 10 Apr 2024 20:46:44 -0700 Subject: [PATCH 3/3] [Documentation] Refactor poktroll documentation so its easier to navigate (#474) - No changes to the actual documentation - Create navigation bar tabs - Format the sidebar styling - Auto-expand all sidebars - Add search functionality (added after video was recorded) **Before:** https://github.com/pokt-network/poktroll/assets/1892194/b6bcc4fa-6504-432f-90ea-ab36f7bd4fdc **After:** https://github.com/pokt-network/poktroll/assets/1892194/5635ca1d-9f8d-48c5-906b-574c95c11b26 --- docusaurus/README.md | 1 + docusaurus/docs/README.md | 6 +- .../contributing/_category_.json | 0 .../contributing/contributing.md | 0 .../contributing/observability.md | 0 .../developer_guide/_category_.json | 0 .../developer_guide/code_review_guidelines.md | 0 .../{ => develop}/developer_guide/dev_tips.md | 0 .../img/code_review_pyramid.png | Bin .../img/github_line_comment.png | Bin .../img/line_comment_dialog_start.png | Bin .../img/quickstart_accounts.png | Bin .../img/quickstart_applist.png | Bin .../img/quickstart_localnet.png | Bin .../developer_guide/img/submit_review.png | Bin .../developer_guide/quickstart.md | 0 .../internal_infrastructure/_category_.json | 0 .../access_dashboard_on_service.png | Bin .../grafana_save_dashboard.png | Bin .../internal_infrastructure/localnet.md | 0 .../testing/_category_.json | 0 .../testing/load_testing.md | 0 .../testing/load_testing_plan_1.md | 0 .../{ => develop}/packages/_category_.json | 0 .../{ => develop}/packages/appgate_server.md | 22 +- .../{ => develop}/packages/client_events.md | 13 +- .../{ => develop}/packages/client_package.md | 0 .../docs/{ => develop}/packages/observable.md | 0 docusaurus/docs/{ => develop}/packages/sdk.md | 0 .../{ => operate}/configs/_category_.json | 0 .../configs/app_staking_config.md | 0 .../configs/appgate_server_config.md | 0 .../configs/gateway_staking_config.md | 0 .../configs/relayminer_config.md | 95 +- .../configs/supplier_staking_config.md | 0 .../{ => operate}/run_a_node/_category_.json | 0 .../run_a_node/appgate_server.md | 6 +- .../{ => operate}/run_a_node/full_node.md | 0 .../{ => operate}/run_a_node/relay_miner.md | 4 +- .../{ => planning}/roadmap/_category_.json | 0 .../docs/{ => planning}/roadmap/roadmap.md | 0 .../roadmap/roadmap_changelog.md | 0 .../{ => protocol}/actors/_category_.json | 0 .../docs/{ => protocol}/actors/actors.md | 0 .../{ => protocol}/actors/appgate_server.md | 4 +- .../docs/{ => protocol}/actors/application.md | 4 +- .../docs/{ => protocol}/actors/gateway.md | 4 +- .../docs/{ => protocol}/actors/relay_miner.md | 2 +- .../docs/{ => protocol}/actors/supplier.md | 4 +- .../architecture/_category_.json | 0 .../{ => protocol}/architecture/network.md | 0 .../protocol/{ => primitives}/_category_.json | 0 .../claim_and_proof_lifecycle.md | 12 +- .../protocol/{ => primitives}/gateways.md | 4 +- .../{ => primitives}/probabilistic_proofs.md | 2 +- .../protocol/{ => primitives}/relay_mining.md | 2 +- .../docs/protocol/{ => primitives}/session.md | 0 docusaurus/docusaurus.config.js | 66 +- docusaurus/package-lock.json | 1571 +++++++++-------- docusaurus/package.json | 12 +- docusaurus/sidebars.js | 43 +- docusaurus/src/css/custom.css | 230 +++ docusaurus/src/css/header-icons.css | 65 + docusaurus/yarn.lock | 983 ++++++----- 64 files changed, 1879 insertions(+), 1276 deletions(-) rename docusaurus/docs/{ => develop}/contributing/_category_.json (100%) rename docusaurus/docs/{ => develop}/contributing/contributing.md (100%) rename docusaurus/docs/{ => develop}/contributing/observability.md (100%) rename docusaurus/docs/{ => develop}/developer_guide/_category_.json (100%) rename docusaurus/docs/{ => develop}/developer_guide/code_review_guidelines.md (100%) rename docusaurus/docs/{ => develop}/developer_guide/dev_tips.md (100%) rename docusaurus/docs/{ => develop}/developer_guide/img/code_review_pyramid.png (100%) rename docusaurus/docs/{ => develop}/developer_guide/img/github_line_comment.png (100%) rename docusaurus/docs/{ => develop}/developer_guide/img/line_comment_dialog_start.png (100%) rename docusaurus/docs/{ => develop}/developer_guide/img/quickstart_accounts.png (100%) rename docusaurus/docs/{ => develop}/developer_guide/img/quickstart_applist.png (100%) rename docusaurus/docs/{ => develop}/developer_guide/img/quickstart_localnet.png (100%) rename docusaurus/docs/{ => develop}/developer_guide/img/submit_review.png (100%) rename docusaurus/docs/{ => develop}/developer_guide/quickstart.md (100%) rename docusaurus/docs/{ => develop}/internal_infrastructure/_category_.json (100%) rename docusaurus/docs/{ => develop}/internal_infrastructure/access_dashboard_on_service.png (100%) rename docusaurus/docs/{ => develop}/internal_infrastructure/grafana_save_dashboard.png (100%) rename docusaurus/docs/{ => develop}/internal_infrastructure/localnet.md (100%) rename docusaurus/docs/{ => develop}/internal_infrastructure/testing/_category_.json (100%) rename docusaurus/docs/{ => develop}/internal_infrastructure/testing/load_testing.md (100%) rename docusaurus/docs/{ => develop}/internal_infrastructure/testing/load_testing_plan_1.md (100%) rename docusaurus/docs/{ => develop}/packages/_category_.json (100%) rename docusaurus/docs/{ => develop}/packages/appgate_server.md (86%) rename docusaurus/docs/{ => develop}/packages/client_events.md (97%) rename docusaurus/docs/{ => develop}/packages/client_package.md (100%) rename docusaurus/docs/{ => develop}/packages/observable.md (100%) rename docusaurus/docs/{ => develop}/packages/sdk.md (100%) rename docusaurus/docs/{ => operate}/configs/_category_.json (100%) rename docusaurus/docs/{ => operate}/configs/app_staking_config.md (100%) rename docusaurus/docs/{ => operate}/configs/appgate_server_config.md (100%) rename docusaurus/docs/{ => operate}/configs/gateway_staking_config.md (100%) rename docusaurus/docs/{ => operate}/configs/relayminer_config.md (91%) rename docusaurus/docs/{ => operate}/configs/supplier_staking_config.md (100%) rename docusaurus/docs/{ => operate}/run_a_node/_category_.json (100%) rename docusaurus/docs/{ => operate}/run_a_node/appgate_server.md (83%) rename docusaurus/docs/{ => operate}/run_a_node/full_node.md (100%) rename docusaurus/docs/{ => operate}/run_a_node/relay_miner.md (88%) rename docusaurus/docs/{ => planning}/roadmap/_category_.json (100%) rename docusaurus/docs/{ => planning}/roadmap/roadmap.md (100%) rename docusaurus/docs/{ => planning}/roadmap/roadmap_changelog.md (100%) rename docusaurus/docs/{ => protocol}/actors/_category_.json (100%) rename docusaurus/docs/{ => protocol}/actors/actors.md (100%) rename docusaurus/docs/{ => protocol}/actors/appgate_server.md (80%) rename docusaurus/docs/{ => protocol}/actors/application.md (81%) rename docusaurus/docs/{ => protocol}/actors/gateway.md (82%) rename docusaurus/docs/{ => protocol}/actors/relay_miner.md (91%) rename docusaurus/docs/{ => protocol}/actors/supplier.md (81%) rename docusaurus/docs/{ => protocol}/architecture/_category_.json (100%) rename docusaurus/docs/{ => protocol}/architecture/network.md (100%) rename docusaurus/docs/protocol/{ => primitives}/_category_.json (100%) rename docusaurus/docs/protocol/{ => primitives}/claim_and_proof_lifecycle.md (95%) rename docusaurus/docs/protocol/{ => primitives}/gateways.md (98%) rename docusaurus/docs/protocol/{ => primitives}/probabilistic_proofs.md (87%) rename docusaurus/docs/protocol/{ => primitives}/relay_mining.md (89%) rename docusaurus/docs/protocol/{ => primitives}/session.md (100%) create mode 100644 docusaurus/src/css/custom.css create mode 100644 docusaurus/src/css/header-icons.css diff --git a/docusaurus/README.md b/docusaurus/README.md index c598e7be9..8eecd5546 100644 --- a/docusaurus/README.md +++ b/docusaurus/README.md @@ -49,3 +49,4 @@ GIT_USER= yarn deploy ``` If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. + diff --git a/docusaurus/docs/README.md b/docusaurus/docs/README.md index 16a48184d..73d5d724e 100644 --- a/docusaurus/docs/README.md +++ b/docusaurus/docs/README.md @@ -56,14 +56,14 @@ to build a better understanding of Pocket Network: ## Roadmap -You can details related to our roadmap [here](./roadmap/roadmap.md) and the -roadmap changelog [here](./roadmap/roadmap_changelog.md). +You can details related to our roadmap [here](./planning/roadmap/roadmap.md) and the +roadmap changelog [here](./planning/roadmap/roadmap_changelog.md). ## Getting Started ### Quickstart -The best way to get involved is by following the instructions [here](./developer_guide/quickstart.md). +The best way to get involved is by following the instructions [here](./develop/developer_guide/quickstart.md). ### Godoc diff --git a/docusaurus/docs/contributing/_category_.json b/docusaurus/docs/develop/contributing/_category_.json similarity index 100% rename from docusaurus/docs/contributing/_category_.json rename to docusaurus/docs/develop/contributing/_category_.json diff --git a/docusaurus/docs/contributing/contributing.md b/docusaurus/docs/develop/contributing/contributing.md similarity index 100% rename from docusaurus/docs/contributing/contributing.md rename to docusaurus/docs/develop/contributing/contributing.md diff --git a/docusaurus/docs/contributing/observability.md b/docusaurus/docs/develop/contributing/observability.md similarity index 100% rename from docusaurus/docs/contributing/observability.md rename to docusaurus/docs/develop/contributing/observability.md diff --git a/docusaurus/docs/developer_guide/_category_.json b/docusaurus/docs/develop/developer_guide/_category_.json similarity index 100% rename from docusaurus/docs/developer_guide/_category_.json rename to docusaurus/docs/develop/developer_guide/_category_.json diff --git a/docusaurus/docs/developer_guide/code_review_guidelines.md b/docusaurus/docs/develop/developer_guide/code_review_guidelines.md similarity index 100% rename from docusaurus/docs/developer_guide/code_review_guidelines.md rename to docusaurus/docs/develop/developer_guide/code_review_guidelines.md diff --git a/docusaurus/docs/developer_guide/dev_tips.md b/docusaurus/docs/develop/developer_guide/dev_tips.md similarity index 100% rename from docusaurus/docs/developer_guide/dev_tips.md rename to docusaurus/docs/develop/developer_guide/dev_tips.md diff --git a/docusaurus/docs/developer_guide/img/code_review_pyramid.png b/docusaurus/docs/develop/developer_guide/img/code_review_pyramid.png similarity index 100% rename from docusaurus/docs/developer_guide/img/code_review_pyramid.png rename to docusaurus/docs/develop/developer_guide/img/code_review_pyramid.png diff --git a/docusaurus/docs/developer_guide/img/github_line_comment.png b/docusaurus/docs/develop/developer_guide/img/github_line_comment.png similarity index 100% rename from docusaurus/docs/developer_guide/img/github_line_comment.png rename to docusaurus/docs/develop/developer_guide/img/github_line_comment.png diff --git a/docusaurus/docs/developer_guide/img/line_comment_dialog_start.png b/docusaurus/docs/develop/developer_guide/img/line_comment_dialog_start.png similarity index 100% rename from docusaurus/docs/developer_guide/img/line_comment_dialog_start.png rename to docusaurus/docs/develop/developer_guide/img/line_comment_dialog_start.png diff --git a/docusaurus/docs/developer_guide/img/quickstart_accounts.png b/docusaurus/docs/develop/developer_guide/img/quickstart_accounts.png similarity index 100% rename from docusaurus/docs/developer_guide/img/quickstart_accounts.png rename to docusaurus/docs/develop/developer_guide/img/quickstart_accounts.png diff --git a/docusaurus/docs/developer_guide/img/quickstart_applist.png b/docusaurus/docs/develop/developer_guide/img/quickstart_applist.png similarity index 100% rename from docusaurus/docs/developer_guide/img/quickstart_applist.png rename to docusaurus/docs/develop/developer_guide/img/quickstart_applist.png diff --git a/docusaurus/docs/developer_guide/img/quickstart_localnet.png b/docusaurus/docs/develop/developer_guide/img/quickstart_localnet.png similarity index 100% rename from docusaurus/docs/developer_guide/img/quickstart_localnet.png rename to docusaurus/docs/develop/developer_guide/img/quickstart_localnet.png diff --git a/docusaurus/docs/developer_guide/img/submit_review.png b/docusaurus/docs/develop/developer_guide/img/submit_review.png similarity index 100% rename from docusaurus/docs/developer_guide/img/submit_review.png rename to docusaurus/docs/develop/developer_guide/img/submit_review.png diff --git a/docusaurus/docs/developer_guide/quickstart.md b/docusaurus/docs/develop/developer_guide/quickstart.md similarity index 100% rename from docusaurus/docs/developer_guide/quickstart.md rename to docusaurus/docs/develop/developer_guide/quickstart.md diff --git a/docusaurus/docs/internal_infrastructure/_category_.json b/docusaurus/docs/develop/internal_infrastructure/_category_.json similarity index 100% rename from docusaurus/docs/internal_infrastructure/_category_.json rename to docusaurus/docs/develop/internal_infrastructure/_category_.json diff --git a/docusaurus/docs/internal_infrastructure/access_dashboard_on_service.png b/docusaurus/docs/develop/internal_infrastructure/access_dashboard_on_service.png similarity index 100% rename from docusaurus/docs/internal_infrastructure/access_dashboard_on_service.png rename to docusaurus/docs/develop/internal_infrastructure/access_dashboard_on_service.png diff --git a/docusaurus/docs/internal_infrastructure/grafana_save_dashboard.png b/docusaurus/docs/develop/internal_infrastructure/grafana_save_dashboard.png similarity index 100% rename from docusaurus/docs/internal_infrastructure/grafana_save_dashboard.png rename to docusaurus/docs/develop/internal_infrastructure/grafana_save_dashboard.png diff --git a/docusaurus/docs/internal_infrastructure/localnet.md b/docusaurus/docs/develop/internal_infrastructure/localnet.md similarity index 100% rename from docusaurus/docs/internal_infrastructure/localnet.md rename to docusaurus/docs/develop/internal_infrastructure/localnet.md diff --git a/docusaurus/docs/internal_infrastructure/testing/_category_.json b/docusaurus/docs/develop/internal_infrastructure/testing/_category_.json similarity index 100% rename from docusaurus/docs/internal_infrastructure/testing/_category_.json rename to docusaurus/docs/develop/internal_infrastructure/testing/_category_.json diff --git a/docusaurus/docs/internal_infrastructure/testing/load_testing.md b/docusaurus/docs/develop/internal_infrastructure/testing/load_testing.md similarity index 100% rename from docusaurus/docs/internal_infrastructure/testing/load_testing.md rename to docusaurus/docs/develop/internal_infrastructure/testing/load_testing.md diff --git a/docusaurus/docs/internal_infrastructure/testing/load_testing_plan_1.md b/docusaurus/docs/develop/internal_infrastructure/testing/load_testing_plan_1.md similarity index 100% rename from docusaurus/docs/internal_infrastructure/testing/load_testing_plan_1.md rename to docusaurus/docs/develop/internal_infrastructure/testing/load_testing_plan_1.md diff --git a/docusaurus/docs/packages/_category_.json b/docusaurus/docs/develop/packages/_category_.json similarity index 100% rename from docusaurus/docs/packages/_category_.json rename to docusaurus/docs/develop/packages/_category_.json diff --git a/docusaurus/docs/packages/appgate_server.md b/docusaurus/docs/develop/packages/appgate_server.md similarity index 86% rename from docusaurus/docs/packages/appgate_server.md rename to docusaurus/docs/develop/packages/appgate_server.md index 2d5e9ae57..063db6544 100644 --- a/docusaurus/docs/packages/appgate_server.md +++ b/docusaurus/docs/develop/packages/appgate_server.md @@ -8,9 +8,9 @@ sidebar_position: 3 - [What is AppGate Server?](#what-is-appgate-server) - [Architecture Overview](#architecture-overview) - [Starting the AppGate Server](#starting-the-appgate-server) -- [Application Mode (self\_signing = true)](#application-mode-self_signing--true) +- [Application Mode (self_signing = true)](#application-mode-self_signing--true) - [Application RPC Request Schema](#application-rpc-request-schema) -- [Gateway Mode (self\_signing = false)](#gateway-mode-self_signing--false) +- [Gateway Mode (self_signing = false)](#gateway-mode-self_signing--false) - [Gateway RPC Request Schema](#gateway-rpc-request-schema) - [POKTRollSDK integration](#poktrollsdk-integration) @@ -20,7 +20,7 @@ sidebar_position: 3 `Gateway`s to relay RPC requests to the Pocket Network `Supplier`s without having to manage the underlying logic of the protocol. -An operator only needs to specify a single [configuration file](configs/appgate_server_config.md), +An operator only needs to specify a single [configuration file](../../operate/configs/appgate_server_config.md), in order to run a sovereign `Application` or a `Gateway` via an `AppGate Server`. ## Architecture Overview @@ -62,7 +62,7 @@ poktrolld appgate-server \ --keyring-backend ``` -Where `` is the path to the `.yaml` [appgate server config file](configs/appgate_server_config.md) +Where `` is the path to the `.yaml` [appgate server config file](../../operate/configs/appgate_server_config.md) and `` is the backend to use for the keying. See the [cosmos documentation](https://docs.cosmos.network/v0.46/run-node/keyring.html) for the full available set. @@ -82,9 +82,9 @@ It takes care of things such as: ## Application Mode (self_signing = true) -If the [`self_signing`](configs/appgate_server_config.md#self_signing) field is +If the [`self_signing`](../../operate/configs/appgate_server_config.md#self_signing) field is set to `true`, the `AppGate Server` will act as an `Application`. It will -only serve the address derived from the [`signing_key`](configs/appgate_server_config.md#signing_key). +only serve the address derived from the [`signing_key`](../../operate/configs/appgate_server_config.md#signing_key). `RelayRequests` sent to the `AppGate Server` will be signed with the `signing_key` resulting in a ring-signature that is only associated with the `Application`'s address. @@ -102,7 +102,7 @@ When acting as an `Application`, the `AppGate Server` expects: - The `serviceId` to be part of the URL path - The payload to be the body of the POST request -- The request should be sent to the [`listening_endpoint`](configs/appgate_server_config.md#listening_endpoint) specified in the config file +- The request should be sent to the [`listening_endpoint`](../../operate/configs/appgate_server_config.md#listening_endpoint) specified in the config file The following `curl` command demonstrates how to send a JSON-RPC type request to the `AppGate Server`: @@ -121,10 +121,10 @@ curl -X POST \ ## Gateway Mode (self_signing = false) -If the [`self_signing`](configs/appgate_server_config.md#self_signing) field +If the [`self_signing`](../../operate/configs/appgate_server_config.md#self_signing) field is set to `false`, then the `AppGate Server` will act as a `Gateway`, serving `Application`s that delegated to the `Gateway` address represented by the -[`signing_key`](configs/appgate_server_config.md#signing_key). +[`signing_key`](../../operate/configs/appgate_server_config.md#signing_key). The `AppGate Server` will determine the `Application` address to use by extracting it from the `senderAddr` query parameter and use it along with the `signing_key` to @@ -145,7 +145,7 @@ When acting as an `Gateway`, the `AppGate Server` expects: - The `serviceId` to be part of the URL path - The `payload` to be the body of the POST request - The `Application` address as a query parameter in the request URL -- The request should be sent to the [`listening_endpoint`](configs/appgate_server_config.md#listening_endpoint) specified in the config file +- The request should be sent to the [`listening_endpoint`](../../operate/configs/appgate_server_config.md#listening_endpoint) specified in the config file The following `curl` command demonstrates how to send a JSON-RPC type request to the `AppGate Server`: @@ -190,4 +190,4 @@ While `POKTRollSDK` manages: - Verifying the `Supplier`'s signature. A sequence diagram demonstrating the interaction between the `AppGate Server` and -the `POKTRollSDK` can be found in the [POKTRollSDK documentation](./../packages/sdk.md). +the `POKTRollSDK` can be found in the [POKTRollSDK documentation](../packages/sdk.md). diff --git a/docusaurus/docs/packages/client_events.md b/docusaurus/docs/develop/packages/client_events.md similarity index 97% rename from docusaurus/docs/packages/client_events.md rename to docusaurus/docs/develop/packages/client_events.md index f055b71ec..408f60b94 100644 --- a/docusaurus/docs/packages/client_events.md +++ b/docusaurus/docs/develop/packages/client_events.md @@ -21,11 +21,11 @@ sidebar_position: 2 - [Features](#features) - [Usage (`EventsQueryClient`)](#usage-eventsqueryclient) - [Basic Example](#basic-example) - - [Advanced Usage](#advanced-usage) + - [Advanced Usage - Query Client](#advanced-usage---query-client) - [Configuration](#configuration) - [Usage (`EventsReplayClient`)](#usage-eventsreplayclient) - [Basic Usage](#basic-usage) - - [Advanced Usage](#advanced-usage-1) + - [- Replay Client](#--replay-client) - [Best Practices](#best-practices) - [FAQ](#faq) - [Why use `events` over directly using Gorilla WebSockets?](#why-use-events-over-directly-using-gorilla-websockets) @@ -238,7 +238,7 @@ for eitherEvent := range observer.Ch() { } ``` -### Advanced Usage +### Advanced Usage - Query Client ```go // Given some custom dialer & connection implementation, e.g.: @@ -359,7 +359,7 @@ lastEventType = latestEventsObs.Last(ctx, 1)[0] cancel() ``` -### Advanced Usage +### - Replay Client The `EventsReplayClient` can be lightly wrapped to define a custom client for a respective type. Examples of these include the `client.BlockClient` and @@ -367,11 +367,10 @@ a respective type. Examples of these include the `client.BlockClient` and `EventsReplayClient`. :::danger -TODO: Update links for BlockClient and DelegationClient when they are added to the documentation. +TODO(@bryanchriswhite): Update links for BlockClient and DelegationClient when they are added to the documentation. ::: -See: [BlockClient](#TODO) and -[DelegationClient](#TODO) for more detailed examples +See: **BlockClient** and **DelegationClient** for more detailed examples on how to wrap and use the `EventsReplayClient` in a more advanced setting. ## Best Practices diff --git a/docusaurus/docs/packages/client_package.md b/docusaurus/docs/develop/packages/client_package.md similarity index 100% rename from docusaurus/docs/packages/client_package.md rename to docusaurus/docs/develop/packages/client_package.md diff --git a/docusaurus/docs/packages/observable.md b/docusaurus/docs/develop/packages/observable.md similarity index 100% rename from docusaurus/docs/packages/observable.md rename to docusaurus/docs/develop/packages/observable.md diff --git a/docusaurus/docs/packages/sdk.md b/docusaurus/docs/develop/packages/sdk.md similarity index 100% rename from docusaurus/docs/packages/sdk.md rename to docusaurus/docs/develop/packages/sdk.md diff --git a/docusaurus/docs/configs/_category_.json b/docusaurus/docs/operate/configs/_category_.json similarity index 100% rename from docusaurus/docs/configs/_category_.json rename to docusaurus/docs/operate/configs/_category_.json diff --git a/docusaurus/docs/configs/app_staking_config.md b/docusaurus/docs/operate/configs/app_staking_config.md similarity index 100% rename from docusaurus/docs/configs/app_staking_config.md rename to docusaurus/docs/operate/configs/app_staking_config.md diff --git a/docusaurus/docs/configs/appgate_server_config.md b/docusaurus/docs/operate/configs/appgate_server_config.md similarity index 100% rename from docusaurus/docs/configs/appgate_server_config.md rename to docusaurus/docs/operate/configs/appgate_server_config.md diff --git a/docusaurus/docs/configs/gateway_staking_config.md b/docusaurus/docs/operate/configs/gateway_staking_config.md similarity index 100% rename from docusaurus/docs/configs/gateway_staking_config.md rename to docusaurus/docs/operate/configs/gateway_staking_config.md diff --git a/docusaurus/docs/configs/relayminer_config.md b/docusaurus/docs/operate/configs/relayminer_config.md similarity index 91% rename from docusaurus/docs/configs/relayminer_config.md rename to docusaurus/docs/operate/configs/relayminer_config.md index 5f7042807..8b410c0fe 100644 --- a/docusaurus/docs/configs/relayminer_config.md +++ b/docusaurus/docs/operate/configs/relayminer_config.md @@ -3,7 +3,7 @@ title: RelayMiner config sidebar_position: 1 --- -## `relayer/config/relayminer_configs_reader` +# `relayer/config/relayminer_configs_reader` _This document describes the configuration options available through the `relayminer_config.yaml` file. It drives how the `RelayMiner` is setup in terms @@ -33,11 +33,12 @@ queries from and which services it forwards requests to._ - [`headers`](#headers) - [`hosts`](#hosts) - [`proxy_names`](#proxy_names) -- [Proxy -\> Supplier referencing](#proxy---supplier-referencing) - - [RelayMiner config -\> On-chain service relationship](#relayminer-config---on-chain-service-relationship) +- [Proxy to Supplier referencing](#proxy-to-supplier-referencing) +- [RelayMiner config -\> On-chain service relationship](#relayminer-config---on-chain-service-relationship) - [Full config example](#full-config-example) - [Supported proxy types](#supported-proxy-types) -# Usage + +## Usage The `RelayMiner` start command accepts a `--config` flag that points to a configuration `yaml` file that will be used to setup the `RelayMiner` instance. @@ -46,38 +47,40 @@ The `RelayMiner` start command accepts a `--config` flag that points to a config poktrolld relayminer --config ./relayminer_config.yaml --keyring-backend test ``` -# Structure +## Structure The `RelayMiner` configuration file is a `yaml` file that contains `top level options`, `proxies` and `suppliers` sections. -# Top level options +## Top level options ```yaml signing_key_name: smt_store_path: ``` -## `signing_key_name` - _`Required`_ +### `signing_key_name` + +_`Required`_ The name of the key that will be used to sign transactions, derive the public key and the corresponding address. This key name must be present in the keyring that is used to start the `RelayMiner` instance. -## `smt_store_path` +### `smt_store_path` + _`Required`_ The relative or absolute path to the directory where the `RelayMiner` will store the `SparseMerkleTree` data on disk. This directory is used to persist the `SMT` in a BadgerDB KV store data files. -## `metrics` +### `metrics` _`Optional`_ -This section configures a Prometheus exporter endpoint, enabling the collection -and export of metrics data. The `addr` field specifies the network address for +This section configures a Prometheus exporter endpoint, enabling the collection +and export of metrics data. The `addr` field specifies the network address for the exporter to bind to. It can be either a port number, which assumes binding to all interfaces, or a specific host:port combination. @@ -93,8 +96,7 @@ When `enabled` is set to `true`, the exporter is active. The addr `value` of `:9090` implies the exporter is bound to port 9090 on all available network interfaces. - -# Pocket node connectivity +## Pocket node connectivity ```yaml pocket_node: @@ -103,7 +105,8 @@ pocket_node: tx_node_rpc_url: tcp://: ``` -## `query_node_rpc_url` +### `query_node_rpc_url` + _`Required`_ The RPC URL of the Pocket node that allows the `RelayMiner` to subscribe to events @@ -112,20 +115,22 @@ and establishes a persistent connection to the Pocket node to stream events such latest blocks, application staking events, etc... If unspecified, `tx_node_rpc_url` value will be used. -## `query_node_grpc_url` +### `query_node_grpc_url` + _`Optional`_ The gRPC URL of the Pocket node that allows the `RelayMiner` to query/pull data from the Pocket network (eg. Sessions, Accounts, etc...). -## `tx_node_rpc_url` +### `tx_node_rpc_url` + _`Required`_ The RPC URL of the Pocket node that allows the `RelayMiner` to broadcast transactions to the a Pocket network Tendermint node. It may have a different host than the `query_node_rpc_url` but the same value is acceptable too. -# RelayMiner proxies +## RelayMiner proxies The `proxies` section of the configuration file is a list of proxies that the `RelayMiner` will use to start servers by listening on the configured host. @@ -139,7 +144,8 @@ proxies: host: ``` -## `proxy_name` +### `proxy_name` + _`Required`_, _`Unique`_ Is the name of the proxy which will be used as a unique identifier to reference @@ -147,20 +153,22 @@ proxies in the [Suppliers](#suppliers) section of the configuration file. It corresponds to a server that will be started by the `RelayMiner` instance and must be unique across all proxies. -## `type` +### `type` + _`Required`_ The type of the proxy server to be started. Must be one of the [supported types](#supported-proxy-types). When other types are supported, the `type` field could determine if additional configuration options are allowed be them optional or required. -## `host` +### `host` + _`Required`_, _`Unique`_ The host to which the proxy server will be started and listening to. It must be a valid host according to the `type` filed and must be unique across all proxies. -# Suppliers +## Suppliers The `suppliers` section of the configuration file is a list of suppliers that represent the services that the `RelayMiner` will offer to the Pocket network @@ -190,7 +198,8 @@ suppliers: - ``` -## `service_id` +### `service_id` + _`Required`_, _`Unique`_ The Id of the service which will be used as a unique identifier to reference @@ -199,35 +208,40 @@ a service provided by the `Supplier` and served by the `RelayMiner` instance. It must match the `Service.Id` specified by the supplier when staking for the service. -## `type` +### `type` + _`Required`_ The transport type that the service will be offered on. It must match the `type` field of the proxy that the supplier is referencing through `proxy_names`. Must be one of the [supported types](#supported-proxy-types). -## `service_config` +### `service_config` + _`Required`_ The `service_config` section of the supplier configuration is a set of options that are specific to the service that the `RelayMiner` will be offering to the Pocket network. -### `url` +#### `url` + _`Required`_ The URL of the service that the `RelayMiner` will forward the requests to when a relay is received, also known as **data node** or **service node**. It must be a valid URL (not just a host) and be reachable from the `RelayMiner` instance. -### `authentication` +#### `authentication` + _`Optional`_ The `authentication` section of the supplier configuration is a pair of `username` and `password` that will be used by the basic authentication mechanism to authenticate the requests that are forwarded to the service. -### `headers` +#### `headers` + _`Optional`_ The `headers` section of the supplier configuration is a set of key-value pairs @@ -235,7 +249,8 @@ that will be added to the request headers when the `RelayMiner` forwards the requests to the service. It can be used to add additional headers like `Authorization: Bearer ` for example. -## `hosts` +### `hosts` + _`Required`_, _`Unique` for each referenced proxy_, _`Unique` within the supplier's `hosts` list_ The `hosts` section of the supplier configuration is a list of hosts that the @@ -247,12 +262,13 @@ the referenced proxy server as well as to check if the request's RPC-Type matche the on-chain endpoint's RPC-Type. There are various reasons to having multiple hosts for the same supplier services. + - The on-chain Supplier may provide the same Service on multiple domains -(e.g. for different regions). + (e.g. for different regions). - The operator may want to route requests of different RPC types to -the same proxy + the same proxy - Migrating from one domain to another. Where the operator could still -accept requests on the old domain while the new domain is being propagated. + accept requests on the old domain while the new domain is being propagated. - The operator may want to have a different domain for internal requests. - The on-chain Service configuration accepts multiple endpoints. @@ -262,17 +278,18 @@ _Note: The `service_id` of the supplier is automatically added to the `hosts` li it may help troubleshooting the `RelayMiner` and/or send requests internally from a k8s cluster for example._ -## `proxy_names` +### `proxy_names` + _`Required`_, _`Unique` within the `proxy_names` list_ The `proxy_names` section of the supplier configuration is the list of proxies that the `RelayMiner` will use to serve the requests for the given supplier entry. It must be a valid proxy name that is defined in the `proxies` section of the -configuration file, must be unique across the supplier's `proxy_names` and the +configuration file, must be unique across the supplier's `proxy_names` and the `supplier` `type` must match the `type` of the referenced `proxy`. -# Proxy -> Supplier referencing +## Proxy to Supplier referencing To illustrate how the `suppliers.proxy_names` and `proxies.proxy_name` fields are used to reference proxies and suppliers, let's consider the following configuration file: @@ -298,7 +315,7 @@ In this example, the `ethereum` supplier is referencing two proxies, `http-examp and `http-example-2` and the `7b-llm-model` supplier is referencing only the `http-example` proxy. This would result in the following setup: -``` +```yaml - http-example - ethereum - 7b-llm-model @@ -354,13 +371,13 @@ end svc2Config-->svc2 ``` -# Full config example +## Full config example A full and commented example of a `RelayMiner` configuration file can be found at [localnet/poktrolld/config/relayminer_config_full_example.yaml](https://github.com/pokt-network/poktroll/tree/main/localnet/poktrolld/config/relayminer_config_full_example.yaml) --- -# Supported proxy types +## Supported proxy types -The list of supported proxy types can be found at [pkg/relayer/config/types.go](https://github.com/pokt-network/poktroll/tree/main/pkg/relayer/config/types.go#L8) \ No newline at end of file +The list of supported proxy types can be found at [pkg/relayer/config/types.go](https://github.com/pokt-network/poktroll/tree/main/pkg/relayer/config/types.go#L8) diff --git a/docusaurus/docs/configs/supplier_staking_config.md b/docusaurus/docs/operate/configs/supplier_staking_config.md similarity index 100% rename from docusaurus/docs/configs/supplier_staking_config.md rename to docusaurus/docs/operate/configs/supplier_staking_config.md diff --git a/docusaurus/docs/run_a_node/_category_.json b/docusaurus/docs/operate/run_a_node/_category_.json similarity index 100% rename from docusaurus/docs/run_a_node/_category_.json rename to docusaurus/docs/operate/run_a_node/_category_.json diff --git a/docusaurus/docs/run_a_node/appgate_server.md b/docusaurus/docs/operate/run_a_node/appgate_server.md similarity index 83% rename from docusaurus/docs/run_a_node/appgate_server.md rename to docusaurus/docs/operate/run_a_node/appgate_server.md index a02ffe2f5..a710bc56b 100644 --- a/docusaurus/docs/run_a_node/appgate_server.md +++ b/docusaurus/docs/operate/run_a_node/appgate_server.md @@ -12,7 +12,7 @@ sidebar_position: 2 ## What is AppGate Server? -See the [AppGate Server](../actors/appgate_server.md) documentation for more +See the [AppGate Server](../../protocol/actors/appgate_server.md) documentation for more information on what an AppGate Server is. This page aims to provide links and details on how to deploy and operate it. @@ -20,8 +20,8 @@ details on how to deploy and operate it. An AppGate Server requires the following: -1. A staked on-chain [Application](../actors/application.md) to pay for services. -2. An optional on-chain [Gateway](../actors/gateway.md) to optionally proxy services. +1. A staked on-chain [Application](../../protocol/actors/application.md) to pay for services. +2. An optional on-chain [Gateway](../../protocol/actors/gateway.md) to optionally proxy services. 3. A connection to a [Full Node](./full_node.md) to interact with the blockchain. :::tip diff --git a/docusaurus/docs/run_a_node/full_node.md b/docusaurus/docs/operate/run_a_node/full_node.md similarity index 100% rename from docusaurus/docs/run_a_node/full_node.md rename to docusaurus/docs/operate/run_a_node/full_node.md diff --git a/docusaurus/docs/run_a_node/relay_miner.md b/docusaurus/docs/operate/run_a_node/relay_miner.md similarity index 88% rename from docusaurus/docs/run_a_node/relay_miner.md rename to docusaurus/docs/operate/run_a_node/relay_miner.md index 218e0f42c..955303d4f 100644 --- a/docusaurus/docs/run_a_node/relay_miner.md +++ b/docusaurus/docs/operate/run_a_node/relay_miner.md @@ -12,7 +12,7 @@ sidebar_position: 3 ## What is a RelayMiner -See the [RelayMiner](../actors/appgate_server.md) documentation for more +See the [RelayMiner](../../protocol/actors/appgate_server.md) documentation for more information on what a RelayMiner is. This page aims to provide links and details on how to deploy and operate it. @@ -20,7 +20,7 @@ details on how to deploy and operate it. A RelayMiner requires the following: -1. A staked on-chain [Supplier](../actors/supplier.md) to provide services. +1. A staked on-chain [Supplier](../../protocol/actors/supplier.md) to provide services. 2. A connection to a [Full Node](./full_node.md) to interact with the blockchain. :::tip diff --git a/docusaurus/docs/roadmap/_category_.json b/docusaurus/docs/planning/roadmap/_category_.json similarity index 100% rename from docusaurus/docs/roadmap/_category_.json rename to docusaurus/docs/planning/roadmap/_category_.json diff --git a/docusaurus/docs/roadmap/roadmap.md b/docusaurus/docs/planning/roadmap/roadmap.md similarity index 100% rename from docusaurus/docs/roadmap/roadmap.md rename to docusaurus/docs/planning/roadmap/roadmap.md diff --git a/docusaurus/docs/roadmap/roadmap_changelog.md b/docusaurus/docs/planning/roadmap/roadmap_changelog.md similarity index 100% rename from docusaurus/docs/roadmap/roadmap_changelog.md rename to docusaurus/docs/planning/roadmap/roadmap_changelog.md diff --git a/docusaurus/docs/actors/_category_.json b/docusaurus/docs/protocol/actors/_category_.json similarity index 100% rename from docusaurus/docs/actors/_category_.json rename to docusaurus/docs/protocol/actors/_category_.json diff --git a/docusaurus/docs/actors/actors.md b/docusaurus/docs/protocol/actors/actors.md similarity index 100% rename from docusaurus/docs/actors/actors.md rename to docusaurus/docs/protocol/actors/actors.md diff --git a/docusaurus/docs/actors/appgate_server.md b/docusaurus/docs/protocol/actors/appgate_server.md similarity index 80% rename from docusaurus/docs/actors/appgate_server.md rename to docusaurus/docs/protocol/actors/appgate_server.md index b0b0fb496..32ec5febc 100644 --- a/docusaurus/docs/actors/appgate_server.md +++ b/docusaurus/docs/protocol/actors/appgate_server.md @@ -17,12 +17,12 @@ Network, handling all intermediary business logic. A [Gateway](./gateway.md) operator or a sovereign [Application](./application.md) interested in accessing Pocket Network directly would need to run an -`AppGate Server` or custom software that implements the same functionality.[POKTRollSDK](../packages/sdk.md) could be leverage or referenced to build such software. +`AppGate Server` or custom software that implements the same functionality.[POKTRollSDK](../../develop/packages/sdk.md) could be leverage or referenced to build such software. ## Configuration Configurations and additional documentation related to operating an `AppGate Server` -can be found at [appgate_server_config.md](../configs/appgate_server_config.md). +can be found at [appgate_server_config.md](../../operate/configs/appgate_server_config.md). ## CLI diff --git a/docusaurus/docs/actors/application.md b/docusaurus/docs/protocol/actors/application.md similarity index 81% rename from docusaurus/docs/actors/application.md rename to docusaurus/docs/protocol/actors/application.md index 0678c346d..56c174eff 100644 --- a/docusaurus/docs/actors/application.md +++ b/docusaurus/docs/protocol/actors/application.md @@ -17,11 +17,11 @@ services available on Pocket Network as a function of volume and time. ## Schema -The on-chain representation of an `Application` can be found at [application.proto](./../../../proto/poktroll/application/application.proto). +The on-chain representation of an `Application` can be found at [application.proto](https://github.com/pokt-network/poktroll/blob/main/proto/poktroll/application/application.proto). ## Configuration -Configurations to stake an `Application` can be found at [app_staking_config.md](../configs/app_staking_config.md). +Configurations to stake an `Application` can be found at [app_staking_config.md](../../operate/configs/app_staking_config.md). ## CLI diff --git a/docusaurus/docs/actors/gateway.md b/docusaurus/docs/protocol/actors/gateway.md similarity index 82% rename from docusaurus/docs/actors/gateway.md rename to docusaurus/docs/protocol/actors/gateway.md index b1164c593..1cfbe4ebb 100644 --- a/docusaurus/docs/actors/gateway.md +++ b/docusaurus/docs/protocol/actors/gateway.md @@ -17,11 +17,11 @@ on behalf of an [Application](./application.md). ## Schema -The on-chain representation of a `Gateway` can be found at [gateway.proto](./../../../proto/poktroll/gateway/gateway.proto). +The on-chain representation of a `Gateway` can be found at [gateway.proto](https://github.com/pokt-network/poktroll/blob/main/proto/poktroll/gateway/gateway.proto). ## Configuration -Configurations to stake a `Gateway` can be found at [gateway_staking_config.md](../configs/gateway_staking_config.md). +Configurations to stake a `Gateway` can be found at [gateway_staking_config.md](../../operate/configs/gateway_staking_config.md). ## CLI diff --git a/docusaurus/docs/actors/relay_miner.md b/docusaurus/docs/protocol/actors/relay_miner.md similarity index 91% rename from docusaurus/docs/actors/relay_miner.md rename to docusaurus/docs/protocol/actors/relay_miner.md index 822b742cd..9ad73f215 100644 --- a/docusaurus/docs/actors/relay_miner.md +++ b/docusaurus/docs/protocol/actors/relay_miner.md @@ -22,7 +22,7 @@ would need to run a `RelayMiner` in addition to the software that provides the s ## Configuration Configurations and additional documentation related to operating a `RelayMiner` -can be found at [relayminer_config.md](../configs/relayminer_config.md). +can be found at [relayminer_config.md](../../operate/configs/relayminer_config.md). ## CLI diff --git a/docusaurus/docs/actors/supplier.md b/docusaurus/docs/protocol/actors/supplier.md similarity index 81% rename from docusaurus/docs/actors/supplier.md rename to docusaurus/docs/protocol/actors/supplier.md index 4a1149abf..55b9c2f85 100644 --- a/docusaurus/docs/actors/supplier.md +++ b/docusaurus/docs/protocol/actors/supplier.md @@ -17,11 +17,11 @@ providing services as a function of volume and time. ## Schema -The on-chain representation of a `Supplier` can be found at [supplier.proto](./../../../proto/poktroll/shared/supplier.proto). +The on-chain representation of a `Supplier` can be found at [supplier.proto](https://github.com/pokt-network/poktroll/blob/main/proto/poktroll/shared/supplier.proto). ## Configuration -Configurations to stake an `Supplier` can be found at [supplier_staking_config.md](../configs/supplier_staking_config.md). +Configurations to stake an `Supplier` can be found at [supplier_staking_config.md](../../operate/configs/supplier_staking_config.md). ## CLI diff --git a/docusaurus/docs/architecture/_category_.json b/docusaurus/docs/protocol/architecture/_category_.json similarity index 100% rename from docusaurus/docs/architecture/_category_.json rename to docusaurus/docs/protocol/architecture/_category_.json diff --git a/docusaurus/docs/architecture/network.md b/docusaurus/docs/protocol/architecture/network.md similarity index 100% rename from docusaurus/docs/architecture/network.md rename to docusaurus/docs/protocol/architecture/network.md diff --git a/docusaurus/docs/protocol/_category_.json b/docusaurus/docs/protocol/primitives/_category_.json similarity index 100% rename from docusaurus/docs/protocol/_category_.json rename to docusaurus/docs/protocol/primitives/_category_.json diff --git a/docusaurus/docs/protocol/claim_and_proof_lifecycle.md b/docusaurus/docs/protocol/primitives/claim_and_proof_lifecycle.md similarity index 95% rename from docusaurus/docs/protocol/claim_and_proof_lifecycle.md rename to docusaurus/docs/protocol/primitives/claim_and_proof_lifecycle.md index f34d44404..937b53373 100644 --- a/docusaurus/docs/protocol/claim_and_proof_lifecycle.md +++ b/docusaurus/docs/protocol/primitives/claim_and_proof_lifecycle.md @@ -143,17 +143,17 @@ _TODO_DOCUMENT(@Olshansk): Link to a document on compute units once it it writte A serialized version of the `Claim` is stored on-chain. -You can find the definition for the [Claim structure here](../../../proto/poktroll/proof/claim.proto). +You can find the definition for the [Claim structure here](https://github.com/pokt-network/poktroll/blob/main/proto/poktroll/proof/claim.proto). ### CreateClaim Transaction A `CreateClaim` transaction can be submitted by a `Supplier` to store a claim `on-chain`. -You can find the definition for the [CreateClaim Transaction here](../../../proto/poktroll/proof/tx.proto). +You can find the definition for the [CreateClaim Transaction here](https://github.com/pokt-network/poktroll/blob/main/proto/poktroll/proof/tx.proto). ### CreateClaim Validation -_TODO(@bryanchriswhite, @Olshansk): Update this section once [msg_server_create_claim.go](./../../../x/proof/keeper/msg_server_create_claim.go) is fully implemented._ +_TODO(@bryanchriswhite, @Olshansk): Update this section once [msg_server_create_claim.go](https://github.com/pokt-network/poktroll/blob/main/proto/poktroll/x/proof/keeper/msg_server_create_claim.go) is fully implemented._ ### Claim Window @@ -182,7 +182,7 @@ _TODO_DOCUMENT(@Olshansk): Link to a document on compute units once it it writte A serialized version of the `Proof` is stored on-chain. -You can find the definition for the [Proof structure here](../../../proto/poktroll/proof/proof.proto) +You can find the definition for the [Proof structure here](https://github.com/pokt-network/poktroll/blob/main/proto/poktroll/proof/proof.proto) ### SubmitProof Transaction @@ -191,11 +191,11 @@ A `SubmitProof` transaction can be submitted by a `Supplier` to store a proof `o If the `Proof` is invalid, or if there is no corresponding `Claim` for the `Proof`, the transaction will be rejected. -You can find the definition for the [SubmitProof Transaction here](../../../proto/poktroll/proof/tx.proto). +You can find the definition for the [SubmitProof Transaction here](https://github.com/pokt-network/poktroll/blob/main/proto/poktroll/proof/tx.proto). ### SubmitProof Validation -_TODO(@bryanchriswhite, @Olshansk): Update this section once [msg_server_submit_proof.go](./../../../x/proof/keeper/msg_server_submit_proof.go) is fully implemented._ +_TODO(@bryanchriswhite, @Olshansk): Update this section once [msg_server_submit_proof.go](https://github.com/pokt-network/poktroll/blob/main/proto/poktroll/x/proof/keeper/msg_server_submit_proof.go) is fully implemented._ ### Proof Window diff --git a/docusaurus/docs/protocol/gateways.md b/docusaurus/docs/protocol/primitives/gateways.md similarity index 98% rename from docusaurus/docs/protocol/gateways.md rename to docusaurus/docs/protocol/primitives/gateways.md index 51393562c..28eecb3f3 100644 --- a/docusaurus/docs/protocol/gateways.md +++ b/docusaurus/docs/protocol/primitives/gateways.md @@ -30,7 +30,7 @@ TODO(@red-0ne): Review this document and submit a PR with updates & edits. ## Introduction -The [Gateway Actor](./../actors/gateway.md) section covers what a Gateway is. +The [Gateway Actor](../../protocol/actors/gateway.md) section covers what a Gateway is. Recall that it is a permissionless protocol actor to whom the Application can **optionally** delegate on-chain trust in order to perform off-chain operations. @@ -217,7 +217,7 @@ sequenceDiagram ## Relay Signatures -As explained in the [Claim & Proof Lifecycle](./../protocol/claim_and_proof_lifecycle.md) document, +As explained in the [Claim & Proof Lifecycle](./claim_and_proof_lifecycle.md) document, the `Application` that signs the relay request is the one whose stake is used to for access to services provided by the Pocket `Supplier` Network. diff --git a/docusaurus/docs/protocol/probabilistic_proofs.md b/docusaurus/docs/protocol/primitives/probabilistic_proofs.md similarity index 87% rename from docusaurus/docs/protocol/probabilistic_proofs.md rename to docusaurus/docs/protocol/primitives/probabilistic_proofs.md index f448df537..fd664fae1 100644 --- a/docusaurus/docs/protocol/probabilistic_proofs.md +++ b/docusaurus/docs/protocol/primitives/probabilistic_proofs.md @@ -19,5 +19,5 @@ document as a reference for writing this. Probabilistic Proofs is the solution to solving for the long tail of low relay sessions that can cause on-chain bloat. -This complements the design of [Relay Mining](./../protocol/relay_mining.md) +This complements the design of [Relay Mining](./relay_mining.md) to solve for all scenarios. diff --git a/docusaurus/docs/protocol/relay_mining.md b/docusaurus/docs/protocol/primitives/relay_mining.md similarity index 89% rename from docusaurus/docs/protocol/relay_mining.md rename to docusaurus/docs/protocol/primitives/relay_mining.md index 68b484949..60cc67720 100644 --- a/docusaurus/docs/protocol/relay_mining.md +++ b/docusaurus/docs/protocol/primitives/relay_mining.md @@ -23,5 +23,5 @@ Relay Mining is the only solution in Web3 to incentivizing read-only requests and solving for the problem of high volume: `how can we scale to billions or trillions of relays per session`. -This complements the design of [Probabilistic Proofs](./../protocol/probabilistic_proofs.md) +This complements the design of [Probabilistic Proofs](./probabilistic_proofs.md) to solve for all scenarios. diff --git a/docusaurus/docs/protocol/session.md b/docusaurus/docs/protocol/primitives/session.md similarity index 100% rename from docusaurus/docs/protocol/session.md rename to docusaurus/docs/protocol/primitives/session.md diff --git a/docusaurus/docusaurus.config.js b/docusaurus/docusaurus.config.js index ff1cac9bd..036e69d82 100644 --- a/docusaurus/docusaurus.config.js +++ b/docusaurus/docusaurus.config.js @@ -12,19 +12,32 @@ const config = { tagline: "Roll the POKT", favicon: "img/logo.png", - // Set the // pathname under which your site is served - // For GitHub pages deployment, it is often '//' + markdown: { + mermaid: true, + }, + themes: [ + "@docusaurus/theme-mermaid", + [ + require.resolve("@easyops-cn/docusaurus-search-local"), + /** @type {import('@easyops-cn/docusaurus-search-local').PluginOptions} **/ + { + docsRouteBasePath: "/", + hashed: false, + indexBlog: false, + highlightSearchTermsOnTargetPage: true, + explicitSearchResultPath: true, + }, + ], + ], // GitHub pages deployment config. url: "https://poktroll.com/", baseUrl: "/", + // Custom domain config. // url: "https://docs.poktroll.com", // baseUrl: "/", - markdown: { mermaid: true }, - themes: ["@docusaurus/theme-mermaid"], - // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. organizationName: "pokt-network", // Usually your GitHub org/user name (ORGANIZATION_NAME) @@ -50,10 +63,17 @@ const config = { /** @type {import('@docusaurus/preset-classic').Options} */ ({ docs: { + // path: "docs", routeBasePath: "/", sidebarPath: "./sidebars.js", + sidebarCollapsible: false, + }, + theme: { + customCss: [ + require.resolve("./src/css/custom.css"), + require.resolve("./src/css/header-icons.css"), + ], }, - theme: {}, }), ], ], @@ -61,7 +81,12 @@ const config = { themeConfig: /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ ({ - // Replace with your project's social card + docs: { + sidebar: { + hideable: false, + autoCollapseCategories: false, + }, + }, // image: "img/docusaurus-social-card.jpg", style: "dark", navbar: { @@ -70,7 +95,32 @@ const config = { alt: "Pocket Network Logo", src: "img/logo.png", }, - items: [], + items: [ + { + type: "docSidebar", + position: "left", + sidebarId: "operateSidebar", + label: "⚙️ Operate", + }, + { + type: "docSidebar", + position: "left", + sidebarId: "developSidebar", + label: "💻 Develop", + }, + { + type: "docSidebar", + position: "left", + sidebarId: "protocolSidebar", + label: "🧠 Protocol", + }, + { + type: "docSidebar", + position: "left", + sidebarId: "planningSidebar", + label: "🗒️ Planning", + }, + ], }, footer: { style: "dark", diff --git a/docusaurus/package-lock.json b/docusaurus/package-lock.json index 27234bc8c..5f9d3e356 100644 --- a/docusaurus/package-lock.json +++ b/docusaurus/package-lock.json @@ -8,9 +8,11 @@ "name": "docusaurus", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "^3.1.1", - "@docusaurus/preset-classic": "^3.1.1", - "@docusaurus/theme-mermaid": "^3.1.1", + "@docusaurus/core": "^3.2.1", + "@docusaurus/plugin-content-docs": "^3.2.1", + "@docusaurus/preset-classic": "^3.2.1", + "@docusaurus/theme-mermaid": "^3.2.1", + "@easyops-cn/docusaurus-search-local": "^0.40.1", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "prism-react-renderer": "^2.3.0", @@ -18,8 +20,8 @@ "react-dom": "^18.0.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.1.1", - "@docusaurus/types": "^3.1.1" + "@docusaurus/module-type-aliases": "^3.2.1", + "@docusaurus/types": "^3.2.1" }, "engines": { "node": ">=18.0" @@ -67,74 +69,74 @@ } }, "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz", - "integrity": "sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.2.tgz", + "integrity": "sha512-PvRQdCmtiU22dw9ZcTJkrVKgNBVAxKgD0/cfiqyxhA5+PHzA2WDt6jOmZ9QASkeM2BpyzClJb/Wr1yt2/t78Kw==", "dependencies": { - "@algolia/cache-common": "4.22.1" + "@algolia/cache-common": "4.23.2" } }, "node_modules/@algolia/cache-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.1.tgz", - "integrity": "sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==" + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.23.2.tgz", + "integrity": "sha512-OUK/6mqr6CQWxzl/QY0/mwhlGvS6fMtvEPyn/7AHUx96NjqDA4X4+Ju7aXFQKh+m3jW9VPB0B9xvEQgyAnRPNw==" }, "node_modules/@algolia/cache-in-memory": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz", - "integrity": "sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.23.2.tgz", + "integrity": "sha512-rfbi/SnhEa3MmlqQvgYz/9NNJ156NkU6xFxjbxBtLWnHbpj+qnlMoKd+amoiacHRITpajg6zYbLM9dnaD3Bczw==", "dependencies": { - "@algolia/cache-common": "4.22.1" + "@algolia/cache-common": "4.23.2" } }, "node_modules/@algolia/client-account": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.1.tgz", - "integrity": "sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.23.2.tgz", + "integrity": "sha512-VbrOCLIN/5I7iIdskSoSw3uOUPF516k4SjDD4Qz3BFwa3of7D9A0lzBMAvQEJJEPHWdVraBJlGgdJq/ttmquJQ==", "dependencies": { - "@algolia/client-common": "4.22.1", - "@algolia/client-search": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/client-common": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/client-analytics": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.1.tgz", - "integrity": "sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.23.2.tgz", + "integrity": "sha512-lLj7irsAztGhMoEx/SwKd1cwLY6Daf1Q5f2AOsZacpppSvuFvuBrmkzT7pap1OD/OePjLKxicJS8wNA0+zKtuw==", "dependencies": { - "@algolia/client-common": "4.22.1", - "@algolia/client-search": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/client-common": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/client-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.1.tgz", - "integrity": "sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.23.2.tgz", + "integrity": "sha512-Q2K1FRJBern8kIfZ0EqPvUr3V29ICxCm/q42zInV+VJRjldAD9oTsMGwqUQ26GFMdFYmqkEfCbY4VGAiQhh22g==", "dependencies": { - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/client-personalization": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.1.tgz", - "integrity": "sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.23.2.tgz", + "integrity": "sha512-vwPsgnCGhUcHhhQG5IM27z8q7dWrN9itjdvgA6uKf2e9r7vB+WXt4OocK0CeoYQt3OGEAExryzsB8DWqdMK5wg==", "dependencies": { - "@algolia/client-common": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/client-common": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/client-search": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.1.tgz", - "integrity": "sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.23.2.tgz", + "integrity": "sha512-CxSB29OVGSE7l/iyoHvamMonzq7Ev8lnk/OkzleODZ1iBcCs3JC/XgTIKzN/4RSTrJ9QybsnlrN/bYCGufo7qw==", "dependencies": { - "@algolia/client-common": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/client-common": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/events": { @@ -143,47 +145,65 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "node_modules/@algolia/logger-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.1.tgz", - "integrity": "sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==" + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.23.2.tgz", + "integrity": "sha512-jGM49Q7626cXZ7qRAWXn0jDlzvoA1FvN4rKTi1g0hxKsTTSReyYk0i1ADWjChDPl3Q+nSDhJuosM2bBUAay7xw==" }, "node_modules/@algolia/logger-console": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.1.tgz", - "integrity": "sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.23.2.tgz", + "integrity": "sha512-oo+lnxxEmlhTBTFZ3fGz1O8PJ+G+8FiAoMY2Qo3Q4w23xocQev6KqDTA1JQAGPDxAewNA2VBwWOsVXeXFjrI/Q==", "dependencies": { - "@algolia/logger-common": "4.22.1" + "@algolia/logger-common": "4.23.2" + } + }, + "node_modules/@algolia/recommend": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.23.2.tgz", + "integrity": "sha512-Q75CjnzRCDzgIlgWfPnkLtrfF4t82JCirhalXkSSwe/c1GH5pWh4xUyDOR3KTMo+YxxX3zTlrL/FjHmUJEWEcg==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.23.2", + "@algolia/cache-common": "4.23.2", + "@algolia/cache-in-memory": "4.23.2", + "@algolia/client-common": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/logger-common": "4.23.2", + "@algolia/logger-console": "4.23.2", + "@algolia/requester-browser-xhr": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/requester-node-http": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz", - "integrity": "sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.2.tgz", + "integrity": "sha512-TO9wLlp8+rvW9LnIfyHsu8mNAMYrqNdQ0oLF6eTWFxXfxG3k8F/Bh7nFYGk2rFAYty4Fw4XUtrv/YjeNDtM5og==", "dependencies": { - "@algolia/requester-common": "4.22.1" + "@algolia/requester-common": "4.23.2" } }, "node_modules/@algolia/requester-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.1.tgz", - "integrity": "sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==" + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.23.2.tgz", + "integrity": "sha512-3EfpBS0Hri0lGDB5H/BocLt7Vkop0bTTLVUBB844HH6tVycwShmsV6bDR7yXbQvFP1uNpgePRD3cdBCjeHmk6Q==" }, "node_modules/@algolia/requester-node-http": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz", - "integrity": "sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.23.2.tgz", + "integrity": "sha512-SVzgkZM/malo+2SB0NWDXpnT7nO5IZwuDTaaH6SjLeOHcya1o56LSWXk+3F3rNLz2GVH+I/rpYKiqmHhSOjerw==", "dependencies": { - "@algolia/requester-common": "4.22.1" + "@algolia/requester-common": "4.23.2" } }, "node_modules/@algolia/transporter": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.1.tgz", - "integrity": "sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.23.2.tgz", + "integrity": "sha512-GY3aGKBy+8AK4vZh8sfkatDciDVKad5rTY2S10Aefyjh7e7UGBP4zigf42qVXwU8VOPwi7l/L7OACGMOFcjB0Q==", "dependencies": { - "@algolia/cache-common": "4.22.1", - "@algolia/logger-common": "4.22.1", - "@algolia/requester-common": "4.22.1" + "@algolia/cache-common": "4.23.2", + "@algolia/logger-common": "4.23.2", + "@algolia/requester-common": "4.23.2" } }, "node_modules/@ampproject/remapping": { @@ -2275,18 +2295,18 @@ } }, "node_modules/@docsearch/css": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.2.tgz", - "integrity": "sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==" + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", + "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==" }, "node_modules/@docsearch/react": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.2.tgz", - "integrity": "sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", + "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", "dependencies": { "@algolia/autocomplete-core": "1.9.3", "@algolia/autocomplete-preset-algolia": "1.9.3", - "@docsearch/css": "3.5.2", + "@docsearch/css": "3.6.0", "algoliasearch": "^4.19.1" }, "peerDependencies": { @@ -2311,9 +2331,9 @@ } }, "node_modules/@docusaurus/core": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.1.1.tgz", - "integrity": "sha512-2nQfKFcf+MLEM7JXsXwQxPOmQAR6ytKMZVSx7tVi9HEm9WtfwBH1fp6bn8Gj4zLUhjWKCLoysQ9/Wm+EZCQ4yQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.2.1.tgz", + "integrity": "sha512-ZeMAqNvy0eBv2dThEeMuNzzuu+4thqMQakhxsgT5s02A8LqRcdkg+rbcnuNqUIpekQ4GRx3+M5nj0ODJhBXo9w==", "dependencies": { "@babel/core": "^7.23.3", "@babel/generator": "^7.23.3", @@ -2325,14 +2345,13 @@ "@babel/runtime": "^7.22.6", "@babel/runtime-corejs3": "^7.22.6", "@babel/traverse": "^7.22.8", - "@docusaurus/cssnano-preset": "3.1.1", - "@docusaurus/logger": "3.1.1", - "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/cssnano-preset": "3.2.1", + "@docusaurus/logger": "3.2.1", + "@docusaurus/mdx-loader": "3.2.1", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "3.1.1", - "@docusaurus/utils-common": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", - "@slorber/static-site-generator-webpack-plugin": "^4.0.7", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-common": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", "@svgr/webpack": "^6.5.1", "autoprefixer": "^10.4.14", "babel-loader": "^9.1.3", @@ -2353,6 +2372,7 @@ "detect-port": "^1.5.1", "escape-html": "^1.0.3", "eta": "^2.2.0", + "eval": "^0.1.8", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "html-minifier-terser": "^7.2.0", @@ -2361,6 +2381,7 @@ "leven": "^3.1.0", "lodash": "^4.17.21", "mini-css-extract-plugin": "^2.7.6", + "p-map": "^4.0.0", "postcss": "^8.4.26", "postcss-loader": "^7.3.3", "prompts": "^2.4.2", @@ -2397,9 +2418,9 @@ } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.1.1.tgz", - "integrity": "sha512-LnoIDjJWbirdbVZDMq+4hwmrTl2yHDnBf9MLG9qyExeAE3ac35s4yUhJI8yyTCdixzNfKit4cbXblzzqMu4+8g==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.2.1.tgz", + "integrity": "sha512-wTL9KuSSbMJjKrfu385HZEzAoamUsbKqwscAQByZw4k6Ja/RWpqgVvt/CbAC+aYEH6inLzOt+MjuRwMOrD3VBA==", "dependencies": { "cssnano-preset-advanced": "^5.3.10", "postcss": "^8.4.26", @@ -2411,9 +2432,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.1.1.tgz", - "integrity": "sha512-BjkNDpQzewcTnST8trx4idSoAla6zZ3w22NqM/UMcFtvYJgmoE4layuTzlfql3VFPNuivvj7BOExa/+21y4X2Q==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.2.1.tgz", + "integrity": "sha512-0voOKJCn9RaM3np6soqEfo7SsVvf2C+CDTWhW+H/1AyBhybASpExtDEz+7ECck9TwPzFQ5tt+I3zVugUJbJWDg==", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.6.0" @@ -2423,15 +2444,13 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.1.1.tgz", - "integrity": "sha512-xN2IccH9+sv7TmxwsDJNS97BHdmlqWwho+kIVY4tcCXkp+k4QuzvWBeunIMzeayY4Fu13A6sAjHGv5qm72KyGA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.2.1.tgz", + "integrity": "sha512-Fs8tXhXKZjNkdGaOy1xSLXSwfjCMT73J3Zfrju2U16uGedRFRjgK0ojpK5tiC7TnunsL3tOFgp1BSMBRflX9gw==", "dependencies": { - "@babel/parser": "^7.22.7", - "@babel/traverse": "^7.22.8", - "@docusaurus/logger": "3.1.1", - "@docusaurus/utils": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "@docusaurus/logger": "3.2.1", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", @@ -2463,12 +2482,12 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.1.1.tgz", - "integrity": "sha512-xBJyx0TMfAfVZ9ZeIOb1awdXgR4YJMocIEzTps91rq+hJDFJgJaylDtmoRhUxkwuYmNK1GJpW95b7DLztSBJ3A==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.2.1.tgz", + "integrity": "sha512-FyViV5TqhL1vsM7eh29nJ5NtbRE6Ra6LP1PDcPvhwPSlA7eiWGRKAn3jWwMUcmjkos5SYY+sr0/feCdbM3eQHQ==", "dependencies": { "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "3.1.1", + "@docusaurus/types": "3.2.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2482,17 +2501,17 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.1.1.tgz", - "integrity": "sha512-ew/3VtVoG3emoAKmoZl7oKe1zdFOsI0NbcHS26kIxt2Z8vcXKCUgK9jJJrz0TbOipyETPhqwq4nbitrY3baibg==", - "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/logger": "3.1.1", - "@docusaurus/mdx-loader": "3.1.1", - "@docusaurus/types": "3.1.1", - "@docusaurus/utils": "3.1.1", - "@docusaurus/utils-common": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.2.1.tgz", + "integrity": "sha512-lOx0JfhlGZoZu6pEJfeEpSISZR5dQbJGGvb42IP13G5YThNHhG9R9uoWuo4IOimPqBC7sHThdLA3VLevk61Fsw==", + "dependencies": { + "@docusaurus/core": "3.2.1", + "@docusaurus/logger": "3.2.1", + "@docusaurus/mdx-loader": "3.2.1", + "@docusaurus/types": "3.2.1", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-common": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^11.1.1", @@ -2513,17 +2532,18 @@ } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.1.1.tgz", - "integrity": "sha512-lhFq4E874zw0UOH7ujzxnCayOyAt0f9YPVYSb9ohxrdCM8B4szxitUw9rIX4V9JLLHVoqIJb6k+lJJ1jrcGJ0A==", - "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/logger": "3.1.1", - "@docusaurus/mdx-loader": "3.1.1", - "@docusaurus/module-type-aliases": "3.1.1", - "@docusaurus/types": "3.1.1", - "@docusaurus/utils": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.2.1.tgz", + "integrity": "sha512-GHe5b/lCskAR8QVbfWAfPAApvRZgqk7FN3sOHgjCtjzQACZxkHmq6QqyqZ8Jp45V7lVck4wt2Xw2IzBJ7Cz3bA==", + "dependencies": { + "@docusaurus/core": "3.2.1", + "@docusaurus/logger": "3.2.1", + "@docusaurus/mdx-loader": "3.2.1", + "@docusaurus/module-type-aliases": "3.2.1", + "@docusaurus/types": "3.2.1", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-common": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", @@ -2542,15 +2562,15 @@ } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.1.1.tgz", - "integrity": "sha512-NQHncNRAJbyLtgTim9GlEnNYsFhuCxaCNkMwikuxLTiGIPH7r/jpb7O3f3jUMYMebZZZrDq5S7om9a6rvB/YCA==", - "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/mdx-loader": "3.1.1", - "@docusaurus/types": "3.1.1", - "@docusaurus/utils": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.2.1.tgz", + "integrity": "sha512-TOqVfMVTAHqWNEGM94Drz+PUpHDbwFy6ucHFgyTx9zJY7wPNSG5EN+rd/mU7OvAi26qpOn2o9xTdUmb28QLjEQ==", + "dependencies": { + "@docusaurus/core": "3.2.1", + "@docusaurus/mdx-loader": "3.2.1", + "@docusaurus/types": "3.2.1", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" @@ -2564,13 +2584,13 @@ } }, "node_modules/@docusaurus/plugin-debug": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.1.1.tgz", - "integrity": "sha512-xWeMkueM9wE/8LVvl4+Qf1WqwXmreMjI5Kgr7GYCDoJ8zu4kD+KaMhrh7py7MNM38IFvU1RfrGKacCEe2DRRfQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.2.1.tgz", + "integrity": "sha512-AMKq8NuUKf2sRpN1m/sIbqbRbnmk+rSA+8mNU1LNxEl9BW9F/Gng8m9HKlzeyMPrf5XidzS1jqkuTLDJ6KIrFw==", "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/types": "3.1.1", - "@docusaurus/utils": "3.1.1", + "@docusaurus/core": "3.2.1", + "@docusaurus/types": "3.2.1", + "@docusaurus/utils": "3.2.1", "fs-extra": "^11.1.1", "react-json-view-lite": "^1.2.0", "tslib": "^2.6.0" @@ -2584,13 +2604,13 @@ } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.1.1.tgz", - "integrity": "sha512-+q2UpWTqVi8GdlLoSlD5bS/YpxW+QMoBwrPrUH/NpvpuOi0Of7MTotsQf9JWd3hymZxl2uu1o3PIrbpxfeDFDQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.2.1.tgz", + "integrity": "sha512-/rJ+9u+Px0eTCiF4TNcNtj3kHf8cp6K1HCwOTdbsSlz6Xn21syZYcy+f1VM9wF6HrvUkXUcbM5TDCvg2IRL6bQ==", "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/types": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "@docusaurus/core": "3.2.1", + "@docusaurus/types": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", "tslib": "^2.6.0" }, "engines": { @@ -2602,13 +2622,13 @@ } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.1.1.tgz", - "integrity": "sha512-0mMPiBBlQ5LFHTtjxuvt/6yzh8v7OxLi3CbeEsxXZpUzcKO/GC7UA1VOWUoBeQzQL508J12HTAlR3IBU9OofSw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.2.1.tgz", + "integrity": "sha512-XtuJnlMvYfppeVdUyKiDIJAa/gTJKCQU92z8CLZZ9ibJdgVjFOLS10s0hIC0eL5z0U2u2loJz2rZ63HOkNHbBA==", "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/types": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "@docusaurus/core": "3.2.1", + "@docusaurus/types": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", "@types/gtag.js": "^0.0.12", "tslib": "^2.6.0" }, @@ -2621,13 +2641,13 @@ } }, "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.1.1.tgz", - "integrity": "sha512-d07bsrMLdDIryDtY17DgqYUbjkswZQr8cLWl4tzXrt5OR/T/zxC1SYKajzB3fd87zTu5W5klV5GmUwcNSMXQXA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.2.1.tgz", + "integrity": "sha512-wiS/kE0Ny5pnjTxVCs8ljRnkL1RVMj59t6jmSsgEX7piDOoaXSMIUaoIt9ogS/v132uO0xEsxHstkRUZHQyPcQ==", "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/types": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "@docusaurus/core": "3.2.1", + "@docusaurus/types": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", "tslib": "^2.6.0" }, "engines": { @@ -2639,16 +2659,16 @@ } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.1.1.tgz", - "integrity": "sha512-iJ4hCaMmDaUqRv131XJdt/C/jJQx8UreDWTRqZKtNydvZVh/o4yXGRRFOplea1D9b/zpwL1Y+ZDwX7xMhIOTmg==", - "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/logger": "3.1.1", - "@docusaurus/types": "3.1.1", - "@docusaurus/utils": "3.1.1", - "@docusaurus/utils-common": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.2.1.tgz", + "integrity": "sha512-uWZ7AxzdeaQSTCwD2yZtOiEm9zyKU+wqCmi/Sf25kQQqqFSBZUStXfaQ8OHP9cecnw893ZpZ811rPhB/wfujJw==", + "dependencies": { + "@docusaurus/core": "3.2.1", + "@docusaurus/logger": "3.2.1", + "@docusaurus/types": "3.2.1", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-common": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" @@ -2662,23 +2682,23 @@ } }, "node_modules/@docusaurus/preset-classic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.1.1.tgz", - "integrity": "sha512-jG4ys/hWYf69iaN/xOmF+3kjs4Nnz1Ay3CjFLDtYa8KdxbmUhArA9HmP26ru5N0wbVWhY+6kmpYhTJpez5wTyg==", - "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/plugin-content-blog": "3.1.1", - "@docusaurus/plugin-content-docs": "3.1.1", - "@docusaurus/plugin-content-pages": "3.1.1", - "@docusaurus/plugin-debug": "3.1.1", - "@docusaurus/plugin-google-analytics": "3.1.1", - "@docusaurus/plugin-google-gtag": "3.1.1", - "@docusaurus/plugin-google-tag-manager": "3.1.1", - "@docusaurus/plugin-sitemap": "3.1.1", - "@docusaurus/theme-classic": "3.1.1", - "@docusaurus/theme-common": "3.1.1", - "@docusaurus/theme-search-algolia": "3.1.1", - "@docusaurus/types": "3.1.1" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.2.1.tgz", + "integrity": "sha512-E3OHSmttpEBcSMhfPBq3EJMBxZBM01W1rnaCUTXy9EHvkmB5AwgTfW1PwGAybPAX579ntE03R+2zmXdizWfKnQ==", + "dependencies": { + "@docusaurus/core": "3.2.1", + "@docusaurus/plugin-content-blog": "3.2.1", + "@docusaurus/plugin-content-docs": "3.2.1", + "@docusaurus/plugin-content-pages": "3.2.1", + "@docusaurus/plugin-debug": "3.2.1", + "@docusaurus/plugin-google-analytics": "3.2.1", + "@docusaurus/plugin-google-gtag": "3.2.1", + "@docusaurus/plugin-google-tag-manager": "3.2.1", + "@docusaurus/plugin-sitemap": "3.2.1", + "@docusaurus/theme-classic": "3.2.1", + "@docusaurus/theme-common": "3.2.1", + "@docusaurus/theme-search-algolia": "3.2.1", + "@docusaurus/types": "3.2.1" }, "engines": { "node": ">=18.0" @@ -2702,22 +2722,22 @@ } }, "node_modules/@docusaurus/theme-classic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.1.1.tgz", - "integrity": "sha512-GiPE/jbWM8Qv1A14lk6s9fhc0LhPEQ00eIczRO4QL2nAQJZXkjPG6zaVx+1cZxPFWbAsqSjKe2lqkwF3fGkQ7Q==", - "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/mdx-loader": "3.1.1", - "@docusaurus/module-type-aliases": "3.1.1", - "@docusaurus/plugin-content-blog": "3.1.1", - "@docusaurus/plugin-content-docs": "3.1.1", - "@docusaurus/plugin-content-pages": "3.1.1", - "@docusaurus/theme-common": "3.1.1", - "@docusaurus/theme-translations": "3.1.1", - "@docusaurus/types": "3.1.1", - "@docusaurus/utils": "3.1.1", - "@docusaurus/utils-common": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.2.1.tgz", + "integrity": "sha512-+vSbnQyoWjc6vRZi4vJO2dBU02wqzynsai15KK+FANZudrYaBHtkbLZAQhgmxzBGVpxzi87gRohlMm+5D8f4tA==", + "dependencies": { + "@docusaurus/core": "3.2.1", + "@docusaurus/mdx-loader": "3.2.1", + "@docusaurus/module-type-aliases": "3.2.1", + "@docusaurus/plugin-content-blog": "3.2.1", + "@docusaurus/plugin-content-docs": "3.2.1", + "@docusaurus/plugin-content-pages": "3.2.1", + "@docusaurus/theme-common": "3.2.1", + "@docusaurus/theme-translations": "3.2.1", + "@docusaurus/types": "3.2.1", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-common": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "copy-text-to-clipboard": "^3.2.0", @@ -2741,17 +2761,17 @@ } }, "node_modules/@docusaurus/theme-common": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.1.1.tgz", - "integrity": "sha512-38urZfeMhN70YaXkwIGXmcUcv2CEYK/2l4b05GkJPrbEbgpsIZM3Xc+Js2ehBGGZmfZq8GjjQ5RNQYG+MYzCYg==", - "dependencies": { - "@docusaurus/mdx-loader": "3.1.1", - "@docusaurus/module-type-aliases": "3.1.1", - "@docusaurus/plugin-content-blog": "3.1.1", - "@docusaurus/plugin-content-docs": "3.1.1", - "@docusaurus/plugin-content-pages": "3.1.1", - "@docusaurus/utils": "3.1.1", - "@docusaurus/utils-common": "3.1.1", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.2.1.tgz", + "integrity": "sha512-d+adiD7L9xv6EvfaAwUqdKf4orsM3jqgeqAM+HAjgL/Ux0GkVVnfKr+tsoe+4ow4rHe6NUt+nkkW8/K8dKdilA==", + "dependencies": { + "@docusaurus/mdx-loader": "3.2.1", + "@docusaurus/module-type-aliases": "3.2.1", + "@docusaurus/plugin-content-blog": "3.2.1", + "@docusaurus/plugin-content-docs": "3.2.1", + "@docusaurus/plugin-content-pages": "3.2.1", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-common": "3.2.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2770,15 +2790,15 @@ } }, "node_modules/@docusaurus/theme-mermaid": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.1.1.tgz", - "integrity": "sha512-O6u9/7QX/ZapV4HJJSzNs0Jir1KA/LRLORWYeDvbGswqZNusj6q4iLELrKIClysJ3PB3zWUzyKtI/wjIKiV1vA==", - "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/module-type-aliases": "3.1.1", - "@docusaurus/theme-common": "3.1.1", - "@docusaurus/types": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.2.1.tgz", + "integrity": "sha512-l1FzUPgDUor/25XeJDeO22dttmzB0QnmAbF2qKjDz3ENa9vlD5rd5r0NrItZIe8y7qoa+OOxkl5lLBKBxBVbLg==", + "dependencies": { + "@docusaurus/core": "3.2.1", + "@docusaurus/module-type-aliases": "3.2.1", + "@docusaurus/theme-common": "3.2.1", + "@docusaurus/types": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", "mermaid": "^10.4.0", "tslib": "^2.6.0" }, @@ -2791,18 +2811,18 @@ } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.1.1.tgz", - "integrity": "sha512-tBH9VY5EpRctVdaAhT+b1BY8y5dyHVZGFXyCHgTrvcXQy5CV4q7serEX7U3SveNT9zksmchPyct6i1sFDC4Z5g==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.2.1.tgz", + "integrity": "sha512-bzhCrpyXBXzeydNUH83II2akvFEGfhsNTPPWsk5N7e+odgQCQwoHhcF+2qILbQXjaoZ6B3c48hrvkyCpeyqGHw==", "dependencies": { "@docsearch/react": "^3.5.2", - "@docusaurus/core": "3.1.1", - "@docusaurus/logger": "3.1.1", - "@docusaurus/plugin-content-docs": "3.1.1", - "@docusaurus/theme-common": "3.1.1", - "@docusaurus/theme-translations": "3.1.1", - "@docusaurus/utils": "3.1.1", - "@docusaurus/utils-validation": "3.1.1", + "@docusaurus/core": "3.2.1", + "@docusaurus/logger": "3.2.1", + "@docusaurus/plugin-content-docs": "3.2.1", + "@docusaurus/theme-common": "3.2.1", + "@docusaurus/theme-translations": "3.2.1", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", "algoliasearch": "^4.18.0", "algoliasearch-helper": "^3.13.3", "clsx": "^2.0.0", @@ -2821,9 +2841,9 @@ } }, "node_modules/@docusaurus/theme-translations": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.1.1.tgz", - "integrity": "sha512-xvWQFwjxHphpJq5fgk37FXCDdAa2o+r7FX8IpMg+bGZBNXyWBu3MjZ+G4+eUVNpDhVinTc+j6ucL0Ain5KCGrg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.2.1.tgz", + "integrity": "sha512-jAUMkIkFfY+OAhJhv6mV8zlwY6J4AQxJPTgLdR2l+Otof9+QdJjHNh/ifVEu9q0lp3oSPlJj9l05AaP7Ref+cg==", "dependencies": { "fs-extra": "^11.1.1", "tslib": "^2.6.0" @@ -2833,9 +2853,9 @@ } }, "node_modules/@docusaurus/types": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.1.tgz", - "integrity": "sha512-grBqOLnubUecgKFXN9q3uit2HFbCxTWX4Fam3ZFbMN0sWX9wOcDoA7lwdX/8AmeL20Oc4kQvWVgNrsT8bKRvzg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.2.1.tgz", + "integrity": "sha512-n/toxBzL2oxTtRTOFiGKsHypzn/Pm+sXyw+VSk1UbqbXQiHOwHwts55bpKwbcUgA530Is6kix3ELiFOv9GAMfw==", "dependencies": { "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", @@ -2853,11 +2873,12 @@ } }, "node_modules/@docusaurus/utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.1.1.tgz", - "integrity": "sha512-ZJfJa5cJQtRYtqijsPEnAZoduW6sjAQ7ZCWSZavLcV10Fw0Z3gSaPKA/B4micvj2afRZ4gZxT7KfYqe5H8Cetg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.2.1.tgz", + "integrity": "sha512-DPkIS/EPc+pGAV798PUXgNzJFM3HJouoQXgr0KDZuJVz1EkWbDLOcQwLIz8Qx7liI9ddfkN/TXTRQdsTPZNakw==", "dependencies": { - "@docusaurus/logger": "3.1.1", + "@docusaurus/logger": "3.2.1", + "@docusaurus/utils-common": "3.2.1", "@svgr/webpack": "^6.5.1", "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", @@ -2869,6 +2890,7 @@ "js-yaml": "^4.1.0", "lodash": "^4.17.21", "micromatch": "^4.0.5", + "prompts": "^2.4.2", "resolve-pathname": "^3.0.0", "shelljs": "^0.8.5", "tslib": "^2.6.0", @@ -2888,9 +2910,9 @@ } }, "node_modules/@docusaurus/utils-common": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.1.1.tgz", - "integrity": "sha512-eGne3olsIoNfPug5ixjepZAIxeYFzHHnor55Wb2P57jNbtVaFvij/T+MS8U0dtZRFi50QU+UPmRrXdVUM8uyMg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.2.1.tgz", + "integrity": "sha512-N5vadULnRLiqX2QfTjVEU3u5vo6RG2EZTdyXvJdzDOdrLCGIZAfnf/VkssinFZ922sVfaFfQ4FnStdhn5TWdVg==", "dependencies": { "tslib": "^2.6.0" }, @@ -2907,12 +2929,13 @@ } }, "node_modules/@docusaurus/utils-validation": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.1.1.tgz", - "integrity": "sha512-KlY4P9YVDnwL+nExvlIpu79abfEv6ZCHuOX4ZQ+gtip+Wxj0daccdReIWWtqxM/Fb5Cz1nQvUCc7VEtT8IBUAA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.2.1.tgz", + "integrity": "sha512-+x7IR9hNMXi62L1YAglwd0s95fR7+EtirjTxSN4kahYRWGqOi3jlQl1EV0az/yTEvKbxVvOPcdYicGu9dk4LJw==", "dependencies": { - "@docusaurus/logger": "3.1.1", - "@docusaurus/utils": "3.1.1", + "@docusaurus/logger": "3.2.1", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-common": "3.2.1", "joi": "^17.9.2", "js-yaml": "^4.1.0", "tslib": "^2.6.0" @@ -2921,17 +2944,94 @@ "node": ">=18.0" } }, + "node_modules/@easyops-cn/autocomplete.js": { + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz", + "integrity": "sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q==", + "dependencies": { + "cssesc": "^3.0.0", + "immediate": "^3.2.3" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local": { + "version": "0.40.1", + "resolved": "https://registry.npmjs.org/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.40.1.tgz", + "integrity": "sha512-4HMFZMpKKdd5qq1nFB8cvrAkgzZ1kNxphVciI64YHtmDYGIthVGZVG6+Ci7AAhzCR+ixLJkYwtVekvuMLjr2ZQ==", + "dependencies": { + "@docusaurus/plugin-content-docs": "^2 || ^3", + "@docusaurus/theme-translations": "^2 || ^3", + "@docusaurus/utils": "^2 || ^3", + "@docusaurus/utils-common": "^2 || ^3", + "@docusaurus/utils-validation": "^2 || ^3", + "@easyops-cn/autocomplete.js": "^0.38.1", + "@node-rs/jieba": "^1.6.0", + "cheerio": "^1.0.0-rc.3", + "clsx": "^1.1.1", + "debug": "^4.2.0", + "fs-extra": "^10.0.0", + "klaw-sync": "^6.0.0", + "lunr": "^2.3.9", + "lunr-languages": "^1.4.0", + "mark.js": "^8.11.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^2 || ^3", + "react": "^16.14.0 || ^17 || ^18", + "react-dom": "^16.14.0 || 17 || ^18" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@emnapi/core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.1.1.tgz", + "integrity": "sha512-eu4KjHfXg3I+UUR7vSuwZXpRo4c8h4Rtb5Lu2F7Z4JqJFl/eidquONEBiRs6viXKpWBC3BaJBy68xGJ2j56idw==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.1.1.tgz", + "integrity": "sha512-3bfqkzuR1KLx57nZfjr2NLnFOobvyS0aTszaEGCGqmYMVDRaGvgIZbjGSV/MHSSmLgQ/b9JFHQ5xm5WRZYd+XQ==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "license": "BSD-3-Clause" + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" }, "node_modules/@hapi/topo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" } @@ -3030,10 +3130,9 @@ "license": "MIT" }, "node_modules/@mdx-js/mdx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.0.tgz", - "integrity": "sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==", - "license": "MIT", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", + "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", @@ -3081,6 +3180,255 @@ "react": ">=16" } }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.1.2.tgz", + "integrity": "sha512-8JuczewTFIZ/XIjHQ+YlQUydHvlKx2hkcxtuGwh+t/t5zWyZct6YG4+xjHcq8xyc/e7FmFwf42Zj2YgICwmlvA==", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.8.1" + } + }, + "node_modules/@node-rs/jieba": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba/-/jieba-1.10.0.tgz", + "integrity": "sha512-9oZMCvZVnrAMeWTSnEjJ0OSw7YcV4dJJKSioqq80oUNf3eYLGdEXsgYwCe1AYEMcfUfNVgvjznItJKrsoud0IA==", + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@node-rs/jieba-android-arm-eabi": "1.10.0", + "@node-rs/jieba-android-arm64": "1.10.0", + "@node-rs/jieba-darwin-arm64": "1.10.0", + "@node-rs/jieba-darwin-x64": "1.10.0", + "@node-rs/jieba-freebsd-x64": "1.10.0", + "@node-rs/jieba-linux-arm-gnueabihf": "1.10.0", + "@node-rs/jieba-linux-arm64-gnu": "1.10.0", + "@node-rs/jieba-linux-arm64-musl": "1.10.0", + "@node-rs/jieba-linux-x64-gnu": "1.10.0", + "@node-rs/jieba-linux-x64-musl": "1.10.0", + "@node-rs/jieba-wasm32-wasi": "1.10.0", + "@node-rs/jieba-win32-arm64-msvc": "1.10.0", + "@node-rs/jieba-win32-ia32-msvc": "1.10.0", + "@node-rs/jieba-win32-x64-msvc": "1.10.0" + } + }, + "node_modules/@node-rs/jieba-android-arm-eabi": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm-eabi/-/jieba-android-arm-eabi-1.10.0.tgz", + "integrity": "sha512-bzusJSLHm7I0qL8aQXGLt7IQ51Px35yGGEcQ/Ps4SEt0AxRSJ2/rxNET/8mlwBpOCZ5xiKE3BOBRfQajiPiI3g==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-android-arm64": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm64/-/jieba-android-arm64-1.10.0.tgz", + "integrity": "sha512-g89Oq5U2RPmtlvuQhjNj8YZc5Gq033ODb7Ot4Z/OdIHvg2WMxi2M1GQhcdKu60dO79/tazc53W6I8/y691DUfQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-darwin-arm64": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.10.0.tgz", + "integrity": "sha512-IhR5r+XxFcfhVsF93zQ3uCJy8ndotRntXzoW/JCyKqOahUo/ITQRT6vTKHKMyD9xNmjl222OZonBSo2+mlI2fQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-darwin-x64": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-x64/-/jieba-darwin-x64-1.10.0.tgz", + "integrity": "sha512-MBIs8ixKY4FPnifdZ7eTx6ht85TXE4kFBK4c8A/VDAbnmzBzpEyuV7tHUA2wAdfR0muC9j7/5FB4kQGZgYfc8g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-freebsd-x64": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-freebsd-x64/-/jieba-freebsd-x64-1.10.0.tgz", + "integrity": "sha512-MuY+1QEXONxo3I/uFLFju0/pSN5bzQORhJkIdP8CYv+jZaVB4Uz6rC7A5HrgjiAXOna6QsKlRgx2bYyHfaBUrA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm-gnueabihf": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm-gnueabihf/-/jieba-linux-arm-gnueabihf-1.10.0.tgz", + "integrity": "sha512-QfSBnwISdVuTqsi4iThAO1LSbKRSqSsIWiIJgCduhYsTDDiG9+pHyfiZtcTwSf73SDXHZ400QuBNONWLQ/dSag==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm64-gnu": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-gnu/-/jieba-linux-arm64-gnu-1.10.0.tgz", + "integrity": "sha512-vzA2tX/6dReEd/7tZ9927glWQmKDausM6R9S5CqZx4BA4NSaWAK0xFdWsz0K7np459FXqNavLdNB5FVFJb4zzA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm64-musl": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-musl/-/jieba-linux-arm64-musl-1.10.0.tgz", + "integrity": "sha512-gxqoAVOQsn9sgYK6mFO9dsMZ/yOMvVecLZW5rGvLErjiugVvYUlESXIvCqxp2GSws8RtTqJj6p9u/lBmCCuvaw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-x64-gnu": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-gnu/-/jieba-linux-x64-gnu-1.10.0.tgz", + "integrity": "sha512-rS5Shs8JITxJjFIjoIZ5a9O+GO21TJgKu03g2qwFE3QaN5ZOvXtz+/AqqyfT4GmmMhCujD83AGqfOGXDmItF9w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-x64-musl": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-musl/-/jieba-linux-x64-musl-1.10.0.tgz", + "integrity": "sha512-BvSiF2rR8Birh2oEVHcYwq0WGC1cegkEdddWsPrrSmpKmukJE2zyjcxaOOggq2apb8fIRsjyeeUh6X3R5AgjvA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-wasm32-wasi": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-wasm32-wasi/-/jieba-wasm32-wasi-1.10.0.tgz", + "integrity": "sha512-EzeAAbRrFTdYw61rd8Mfwdp/fA21d58z9vLY06CDbI+dqANfMFn1IUdwzKWi8S5J/MRhvbzonbbh3yHlz6F43Q==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@node-rs/jieba-win32-arm64-msvc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-arm64-msvc/-/jieba-win32-arm64-msvc-1.10.0.tgz", + "integrity": "sha512-eZjRLFUAvq1/E5+xXfJRqIB99Gu6BA+6+EXf/rCLuvEjXrDQuUunhmrSoOL5MjmUXTtazS+bXq9PXV5EFYyOPw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-win32-ia32-msvc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-ia32-msvc/-/jieba-win32-ia32-msvc-1.10.0.tgz", + "integrity": "sha512-DrfbeCN7UcLN+MiocZabWo74XZIjfpQsJ/WMOItZzVbU2gDcJSkSyAhML9+OqId66DhGCMFFlGinocElM8iIAw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-win32-x64-msvc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-x64-msvc/-/jieba-win32-x64-msvc-1.10.0.tgz", + "integrity": "sha512-RjBkBmjjHmj+bofiq5/han8wzbCkDk24OAPJ+YX8PX20GFSHmdjCiWapv3AooN8/RiKqlBfgodjS1JUngNWo5g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3164,10 +3512,9 @@ "license": "MIT" }, "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "license": "BSD-3-Clause", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "dependencies": { "@hapi/hoek": "^9.0.0" } @@ -3175,14 +3522,12 @@ "node_modules/@sideway/formula": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "license": "BSD-3-Clause" + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" }, "node_modules/@sideway/pinpoint": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "license": "BSD-3-Clause" + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", @@ -3194,7 +3539,6 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -3206,27 +3550,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", - "license": "MIT", "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.1.0", "micromark-util-symbol": "^1.0.1" } }, - "node_modules/@slorber/static-site-generator-webpack-plugin": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", - "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", - "license": "MIT", - "dependencies": { - "eval": "^0.1.8", - "p-map": "^4.0.0", - "webpack-sources": "^3.2.2" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", @@ -3505,11 +3834,19 @@ "node": ">=10.13.0" } }, + "node_modules/@tybys/wasm-util": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.8.1.tgz", + "integrity": "sha512-GSsTwyBl4pIzsxAY5wroZdyQKyhXk0d8PCRZtrSZ2WEB1cBdrp2EgGBwHOGCZtIIPun/DL3+AykCv+J6fyRH4Q==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/acorn": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", - "license": "MIT", "dependencies": { "@types/estree": "*" } @@ -3609,10 +3946,9 @@ "license": "MIT" }, "node_modules/@types/estree-jsx": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.3.tgz", - "integrity": "sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==", - "license": "MIT", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", "dependencies": { "@types/estree": "*" } @@ -3647,10 +3983,9 @@ "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==" }, "node_modules/@types/hast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz", - "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==", - "license": "MIT", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } @@ -3722,7 +4057,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", - "license": "MIT", "dependencies": { "@types/unist": "*" } @@ -3898,8 +4232,7 @@ "node_modules/@types/unist": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", - "license": "MIT" + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/@types/ws": { "version": "8.5.10", @@ -3928,8 +4261,7 @@ "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "license": "ISC" + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@webassemblyjs/ast": { "version": "1.11.6", @@ -4148,7 +4480,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -4230,30 +4561,31 @@ } }, "node_modules/algoliasearch": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.1.tgz", - "integrity": "sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.22.1", - "@algolia/cache-common": "4.22.1", - "@algolia/cache-in-memory": "4.22.1", - "@algolia/client-account": "4.22.1", - "@algolia/client-analytics": "4.22.1", - "@algolia/client-common": "4.22.1", - "@algolia/client-personalization": "4.22.1", - "@algolia/client-search": "4.22.1", - "@algolia/logger-common": "4.22.1", - "@algolia/logger-console": "4.22.1", - "@algolia/requester-browser-xhr": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/requester-node-http": "4.22.1", - "@algolia/transporter": "4.22.1" + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.2.tgz", + "integrity": "sha512-8aCl055IsokLuPU8BzLjwzXjb7ty9TPcUFFOk0pYOwsE5DMVhE3kwCMFtsCFKcnoPZK7oObm+H5mbnSO/9ioxQ==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.23.2", + "@algolia/cache-common": "4.23.2", + "@algolia/cache-in-memory": "4.23.2", + "@algolia/client-account": "4.23.2", + "@algolia/client-analytics": "4.23.2", + "@algolia/client-common": "4.23.2", + "@algolia/client-personalization": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/logger-common": "4.23.2", + "@algolia/logger-console": "4.23.2", + "@algolia/recommend": "4.23.2", + "@algolia/requester-browser-xhr": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/requester-node-http": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/algoliasearch-helper": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.16.2.tgz", - "integrity": "sha512-Yl/Gu5Cq4Z5s/AJ0jR37OPI1H3+z7PHz657ibyaXgMOaWvPlZ3OACN13N+7HCLPUlB0BN+8BtmrG/CqTilowBA==", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.17.0.tgz", + "integrity": "sha512-R5422OiQjvjlK3VdpNQ/Qk7KsTIGeM5ACm8civGifOVWdRRV/3SgXuKmeNxe94Dz6fwj/IgpVmXbHutU4mHubg==", "dependencies": { "@algolia/events": "^4.0.1" }, @@ -4369,7 +4701,6 @@ "version": "1.8.6", "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", - "license": "MIT", "bin": { "astring": "bin/astring" } @@ -4384,9 +4715,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", "funding": [ { "type": "opencollective", @@ -4401,11 +4732,10 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -4498,7 +4828,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4645,9 +4974,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "funding": [ { "type": "opencollective", @@ -4662,10 +4991,9 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -4788,9 +5116,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001566", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz", - "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==", + "version": "1.0.30001608", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001608.tgz", + "integrity": "sha512-cjUJTQkk9fQlJR2s4HMuPMvTiRggl0rAVMtthQuyOlDWuqHXqN8azLq+pi8B2TjwKJ32diHjUqRIKeFX4z1FoA==", "funding": [ { "type": "opencollective", @@ -4804,14 +5132,12 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4837,7 +5163,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "license": "MIT", "engines": { "node": ">=10" } @@ -4856,7 +5181,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4866,7 +5190,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4876,7 +5199,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4886,7 +5208,6 @@ "version": "1.0.0-rc.12", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", @@ -4907,7 +5228,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", @@ -5087,7 +5407,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5136,7 +5455,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5586,7 +5904,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -6544,7 +6861,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", "dependencies": { "dequal": "^2.0.0" }, @@ -6605,7 +6921,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -6631,7 +6946,6 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -6652,7 +6966,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -6715,10 +7028,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.609", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.609.tgz", - "integrity": "sha512-ihiCP7PJmjoGNuLpl7TjNA8pCQWu09vGyjlPYw1Rqww4gvNuCcmvl+44G+2QyJ6S2K4o+wbTS++Xz0YN8Q9ERw==", - "license": "ISC" + "version": "1.4.732", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.732.tgz", + "integrity": "sha512-nLrzr6UML+oqCyvseTxJ1WxLsnMSQPJCoHu+MuOuNiCp7BHEdG9AmCTw2Y9FU/wFFc/ETE0F6JVtzzPryEjecw==" }, "node_modules/elkjs": { "version": "0.8.2", @@ -6735,8 +7047,7 @@ "node_modules/emojilib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", - "license": "MIT" + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" }, "node_modules/emojis-list": { "version": "3.0.0", @@ -6751,7 +7062,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.0.1.tgz", "integrity": "sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -6862,7 +7172,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -6905,7 +7214,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", - "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" }, @@ -6918,7 +7226,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", - "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", @@ -6934,7 +7241,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -6944,7 +7250,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", - "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", @@ -6956,17 +7261,13 @@ } }, "node_modules/estree-util-value-to-estree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.0.1.tgz", - "integrity": "sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA==", - "license": "MIT", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.1.1.tgz", + "integrity": "sha512-5mvUrF2suuv5f5cGDnDphIy4/gW86z82kl5qG6mM9z04SEQI4FB5Apmaw/TGEf3l55nLtMs5s51dmhUzvAHQCA==", "dependencies": { "@types/estree": "^1.0.0", "is-plain-obj": "^4.0.0" }, - "engines": { - "node": ">=16.0.0" - }, "funding": { "url": "https://github.com/sponsors/remcohaszing" } @@ -6975,7 +7276,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", - "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" @@ -6989,7 +7289,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -7167,14 +7466,12 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -7232,7 +7529,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", - "license": "MIT", "dependencies": { "format": "^0.2.0" }, @@ -7257,7 +7553,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", - "license": "MIT", "dependencies": { "xml-js": "^1.6.11" }, @@ -7607,7 +7902,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "license": "MIT", "engines": { "node": "*" }, @@ -7700,8 +7994,7 @@ "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "license": "ISC" + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" }, "node_modules/get-stream": { "version": "6.0.1", @@ -7718,8 +8011,7 @@ "node_modules/github-slugger": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", - "license": "ISC" + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" }, "node_modules/glob": { "version": "7.2.3", @@ -7909,7 +8201,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "license": "MIT", "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", @@ -7924,7 +8215,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -7933,7 +8223,6 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -8036,7 +8325,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", - "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -8056,7 +8344,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", - "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, @@ -8066,10 +8353,9 @@ } }, "node_modules/hast-util-raw": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.1.tgz", - "integrity": "sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==", - "license": "MIT", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.2.tgz", + "integrity": "sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -8094,7 +8380,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", - "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", @@ -8122,7 +8407,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", - "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", @@ -8146,25 +8430,22 @@ } }, "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.2.tgz", - "integrity": "sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==", - "license": "MIT" + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", + "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" }, "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.5.tgz", - "integrity": "sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==", - "license": "MIT", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", + "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", "dependencies": { - "inline-style-parser": "0.2.2" + "inline-style-parser": "0.2.3" } }, "node_modules/hast-util-to-parse5": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", - "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", @@ -8183,7 +8464,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, @@ -8196,7 +8476,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", - "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", @@ -8363,7 +8642,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8433,7 +8711,6 @@ "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -8581,10 +8858,9 @@ } }, "node_modules/image-size": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", - "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", - "license": "MIT", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", "dependencies": { "queue": "6.0.2" }, @@ -8592,9 +8868,14 @@ "image-size": "bin/image-size.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.x" } }, + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==" + }, "node_modules/immer": { "version": "9.0.21", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", @@ -8681,8 +8962,7 @@ "node_modules/inline-style-parser": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", - "license": "MIT" + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, "node_modules/internmap": { "version": "2.0.3", @@ -8724,7 +9004,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8734,7 +9013,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "license": "MIT", "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" @@ -8790,7 +9068,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8815,7 +9092,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8854,7 +9130,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8901,7 +9176,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8928,7 +9202,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -8949,7 +9222,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "license": "MIT", "dependencies": { "@types/estree": "*" } @@ -8958,7 +9230,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9089,14 +9360,13 @@ } }, "node_modules/joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", - "license": "BSD-3-Clause", + "version": "17.12.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.3.tgz", + "integrity": "sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g==", "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } @@ -9196,6 +9466,14 @@ "node": ">=0.10.0" } }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -9332,7 +9610,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -9380,11 +9657,25 @@ "yallist": "^3.0.2" } }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" + }, + "node_modules/lunr-languages": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.14.0.tgz", + "integrity": "sha512-hWUAb2KqM3L7J5bcrngszzISY4BxrXn/Xhbb9TTCJYEGqlR1nG67/M14sp09+PTIRklobrn57IAxcdcO/ZFyNA==" + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==" + }, "node_modules/markdown-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", - "license": "MIT", "engines": { "node": ">=16" }, @@ -9396,7 +9687,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -9406,7 +9696,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -9426,7 +9715,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", @@ -9442,7 +9730,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -9454,7 +9741,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -9487,14 +9773,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/mdast-util-frontmatter": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", @@ -9512,7 +9796,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -9524,7 +9807,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", - "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", @@ -9543,7 +9825,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", @@ -9557,9 +9838,9 @@ } }, "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -9570,7 +9851,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -9589,14 +9869,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/mdast-util-gfm-footnote": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", @@ -9613,7 +9891,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", @@ -9628,7 +9905,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", @@ -9645,7 +9921,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", @@ -9661,7 +9936,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", - "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", @@ -9678,7 +9952,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", - "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -9693,10 +9966,9 @@ } }, "node_modules/mdast-util-mdx-jsx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.0.0.tgz", - "integrity": "sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==", - "license": "MIT", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", + "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -9721,7 +9993,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -9736,10 +10007,9 @@ } }, "node_modules/mdast-util-phrasing": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz", - "integrity": "sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==", - "license": "MIT", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" @@ -9750,10 +10020,9 @@ } }, "node_modules/mdast-util-to-hast": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz", - "integrity": "sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==", - "license": "MIT", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", + "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -9762,7 +10031,8 @@ "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0" + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" }, "funding": { "type": "opencollective", @@ -9773,7 +10043,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -9793,7 +10062,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0" }, @@ -10365,7 +10633,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", @@ -10400,7 +10667,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", @@ -10434,16 +10700,15 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10454,7 +10719,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -10473,14 +10737,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-extension-directive": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz", "integrity": "sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==", - "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -10509,16 +10771,15 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10529,7 +10790,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -10548,14 +10808,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-extension-frontmatter": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", - "license": "MIT", "dependencies": { "fault": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -10568,9 +10826,9 @@ } }, "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10581,7 +10839,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -10600,14 +10857,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "license": "MIT", "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", @@ -10627,7 +10882,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", - "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", @@ -10640,9 +10894,9 @@ } }, "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10653,7 +10907,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -10672,14 +10925,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-extension-gfm-footnote": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", - "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", @@ -10709,16 +10960,15 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10729,7 +10979,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -10748,14 +10997,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-extension-gfm-strikethrough": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", - "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -10782,14 +11029,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-extension-gfm-table": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", - "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -10816,16 +11061,15 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10836,7 +11080,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -10855,14 +11098,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-extension-gfm-tagfilter": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" }, @@ -10875,7 +11116,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", - "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -10902,16 +11142,15 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10922,7 +11161,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -10941,8 +11179,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-extension-mdx-expression": { "version": "3.0.0", @@ -10958,7 +11195,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", @@ -10984,16 +11220,15 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11004,7 +11239,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11023,14 +11257,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-extension-mdx-jsx": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", - "license": "MIT", "dependencies": { "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", @@ -11062,16 +11294,15 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11082,7 +11313,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11101,14 +11331,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-extension-mdx-md": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", - "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" }, @@ -11121,7 +11349,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", - "license": "MIT", "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", @@ -11141,7 +11368,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", - "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", @@ -11159,9 +11385,9 @@ } }, "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11172,7 +11398,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11191,8 +11416,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-factory-destination": { "version": "2.0.0", @@ -11208,7 +11432,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -11216,9 +11439,9 @@ } }, "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11229,7 +11452,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11248,8 +11470,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-factory-label": { "version": "2.0.0", @@ -11265,7 +11486,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -11274,9 +11494,9 @@ } }, "node_modules/micromark-factory-label/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11287,7 +11507,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11306,8 +11525,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-factory-mdx-expression": { "version": "2.0.1", @@ -11323,7 +11541,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", @@ -11336,9 +11553,9 @@ } }, "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11349,7 +11566,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11368,8 +11584,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-factory-space": { "version": "1.1.0", @@ -11421,7 +11636,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -11443,16 +11657,15 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-title/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11463,7 +11676,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11482,8 +11694,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-factory-whitespace": { "version": "2.0.0", @@ -11499,7 +11710,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -11521,16 +11731,15 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11541,7 +11750,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11560,8 +11768,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-util-character": { "version": "1.2.0", @@ -11613,7 +11820,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } @@ -11631,8 +11837,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-util-classify-character": { "version": "2.0.0", @@ -11648,7 +11853,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -11656,9 +11860,9 @@ } }, "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11669,7 +11873,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11688,8 +11891,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-util-combine-extensions": { "version": "2.0.0", @@ -11705,7 +11907,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11725,7 +11926,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } @@ -11743,8 +11943,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-util-decode-string": { "version": "2.0.0", @@ -11760,7 +11959,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -11769,9 +11967,9 @@ } }, "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11782,7 +11980,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11801,8 +11998,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-util-encode": { "version": "2.0.0", @@ -11817,8 +12013,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-util-events-to-acorn": { "version": "2.0.2", @@ -11834,7 +12029,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", @@ -11859,8 +12053,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.0", @@ -11875,8 +12068,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-util-normalize-identifier": { "version": "2.0.0", @@ -11892,7 +12084,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } @@ -11910,8 +12101,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-util-resolve-all": { "version": "2.0.0", @@ -11927,7 +12117,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" } @@ -11946,7 +12135,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", @@ -11954,9 +12142,9 @@ } }, "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11967,7 +12155,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -11986,8 +12173,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-util-subtokenize": { "version": "2.0.0", @@ -12003,7 +12189,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -12024,8 +12209,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-util-symbol": { "version": "1.1.0", @@ -12056,8 +12240,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark/node_modules/micromark-factory-space": { "version": "2.0.0", @@ -12073,16 +12256,15 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -12093,7 +12275,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -12112,8 +12293,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromatch": { "version": "4.0.5", @@ -12312,7 +12492,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", - "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.6.0", "char-regex": "^1.0.2", @@ -12357,7 +12536,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12645,7 +12823,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", - "license": "MIT", "dependencies": { "@types/unist": "^2.0.0", "character-entities": "^2.0.0", @@ -12664,8 +12841,7 @@ "node_modules/parse-entities/node_modules/@types/unist": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "license": "MIT" + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" }, "node_modules/parse-json": { "version": "5.2.0", @@ -12688,14 +12864,12 @@ "node_modules/parse-numeric-range": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", - "license": "ISC" + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, "node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "license": "MIT", "dependencies": { "entities": "^4.4.0" }, @@ -12707,7 +12881,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "license": "MIT", "dependencies": { "domhandler": "^5.0.2", "parse5": "^7.0.0" @@ -12796,7 +12969,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^3.0.0", @@ -13607,10 +13779,9 @@ } }, "node_modules/property-information": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.0.tgz", - "integrity": "sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==", - "license": "MIT", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -13684,7 +13855,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "license": "MIT", "dependencies": { "inherits": "~2.0.3" } @@ -13974,9 +14144,9 @@ "license": "MIT" }, "node_modules/react-json-view-lite": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.2.1.tgz", - "integrity": "sha512-Itc0g86fytOmKZoIoJyGgvNqohWSbh3NXIKNgH6W6FT9PC1ck4xas1tT3Rr/b3UlFXyA9Jjaw9QSXdZy2JwGMQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.3.0.tgz", + "integrity": "sha512-aN1biKC5v4DQkmQBlZjuMFR09MKZGMPtIg+cut8zEeg2HXd6gl2gRy0n4HMacHf0dznQgo0SVXN7eT8zV3hEuQ==", "engines": { "node": ">=14" }, @@ -14094,8 +14264,7 @@ "node_modules/reading-time": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", - "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==", - "license": "MIT" + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" }, "node_modules/rechoir": { "version": "0.6.2", @@ -14221,7 +14390,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", - "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", @@ -14245,7 +14413,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-directive": "^3.0.0", @@ -14261,7 +14428,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.2", "emoticon": "^4.0.1", @@ -14277,7 +14443,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-frontmatter": "^2.0.0", @@ -14293,7 +14458,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", @@ -14308,10 +14472,9 @@ } }, "node_modules/remark-mdx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.0.tgz", - "integrity": "sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==", - "license": "MIT", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", + "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" @@ -14325,7 +14488,6 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", @@ -14338,10 +14500,9 @@ } }, "node_modules/remark-rehype": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.0.0.tgz", - "integrity": "sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==", - "license": "MIT", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -14358,7 +14519,6 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", @@ -14678,8 +14838,7 @@ "node_modules/sax": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", - "license": "ISC" + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" }, "node_modules/scheduler": { "version": "0.23.0", @@ -14719,7 +14878,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" @@ -15126,7 +15284,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", - "license": "MIT", "dependencies": { "unicode-emoji-modifier-base": "^1.0.0" }, @@ -15166,7 +15323,6 @@ "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "license": "BSD-3-Clause", "engines": { "node": ">= 8" } @@ -15203,7 +15359,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -15242,14 +15397,12 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/srcset": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -15332,10 +15485,9 @@ } }, "node_modules/stringify-entities": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", - "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", - "license": "MIT", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" @@ -15349,7 +15501,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "license": "BSD-2-Clause", "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", @@ -15375,7 +15526,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -15404,7 +15554,6 @@ "version": "0.4.4", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", - "license": "MIT", "dependencies": { "inline-style-parser": "0.1.1" } @@ -15771,17 +15920,15 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/trough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", - "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", - "license": "MIT", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -15888,7 +16035,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", - "license": "MIT", "engines": { "node": ">=4" } @@ -15928,7 +16074,6 @@ "version": "11.0.4", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", - "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", @@ -15962,7 +16107,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -15975,7 +16119,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -15988,7 +16131,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", - "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -16001,7 +16143,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" @@ -16015,7 +16156,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -16028,7 +16168,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", @@ -16043,7 +16182,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" @@ -16303,10 +16441,9 @@ "license": "MIT" }, "node_modules/utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", - "license": "MIT", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", "engines": { "node": ">= 4" } @@ -16375,7 +16512,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", - "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0", @@ -16390,7 +16526,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", - "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" @@ -16404,7 +16539,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", - "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" @@ -16440,7 +16574,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -16949,7 +17082,6 @@ "version": "1.6.11", "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "license": "MIT", "dependencies": { "sax": "^1.2.4" }, @@ -16988,7 +17120,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" diff --git a/docusaurus/package.json b/docusaurus/package.json index 49e6179da..61ef83394 100644 --- a/docusaurus/package.json +++ b/docusaurus/package.json @@ -14,9 +14,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "^3.1.1", - "@docusaurus/preset-classic": "^3.1.1", - "@docusaurus/theme-mermaid": "^3.1.1", + "@docusaurus/core": "^3.2.1", + "@docusaurus/plugin-content-docs": "^3.2.1", + "@docusaurus/preset-classic": "^3.2.1", + "@docusaurus/theme-mermaid": "^3.2.1", + "@easyops-cn/docusaurus-search-local": "^0.40.1", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "prism-react-renderer": "^2.3.0", @@ -24,8 +26,8 @@ "react-dom": "^18.0.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.1.1", - "@docusaurus/types": "^3.1.1" + "@docusaurus/module-type-aliases": "^3.2.1", + "@docusaurus/types": "^3.2.1" }, "browserslist": { "production": [ diff --git a/docusaurus/sidebars.js b/docusaurus/sidebars.js index 5deef50d1..f7748237c 100644 --- a/docusaurus/sidebars.js +++ b/docusaurus/sidebars.js @@ -1,32 +1,31 @@ -/** - * Creating a sidebar enables you to: - - create an ordered group of docs - - render a sidebar for each doc of that group - - provide next/previous navigation - - The sidebars can be generated from the filesystem, or explicitly defined here. - - Create as many sidebars as you want. - */ - // @ts-check /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ const sidebars = { - // By default, Docusaurus generates a sidebar from the docs folder structure - tutorialSidebar: [{ type: "autogenerated", dirName: "." }], - // But you can create a sidebar manually - /* - tutorialSidebar: [ - 'intro', - 'hello', + operateSidebar: [ + { + type: "autogenerated", + dirName: "operate", + }, + ], + developSidebar: [ + { + type: "autogenerated", + dirName: "develop", + }, + ], + protocolSidebar: [ + { + type: "autogenerated", + dirName: "protocol", + }, + ], + planningSidebar: [ { - type: 'category', - label: 'Tutorial', - items: ['tutorial-basics/create-a-document'], + type: "autogenerated", + dirName: "planning", }, ], - */ }; export default sidebars; diff --git a/docusaurus/src/css/custom.css b/docusaurus/src/css/custom.css new file mode 100644 index 000000000..b1fcd84b7 --- /dev/null +++ b/docusaurus/src/css/custom.css @@ -0,0 +1,230 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +:root { + --ifm-color-primary: #1f2327; + --ifm-color-primary-dark: #1c2023; + --ifm-color-primary-darker: #191c1f; + --ifm-color-primary-darkest: #16191b; + /*--ifm-color-primary-light: #5e99e3;*/ + /*--ifm-color-primary-lighter: #6aa1e5;*/ + /*--ifm-color-primary-lightest: #90b8ec;*/ + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); + + /* Change collapse button color */ + --docusaurus-collapse-button-bg: #f2f2f2 !important; + --docusaurus-collapse-button-bg-hover: #dadada !important; + + /* Search style var */ + --ifm-navbar-search-input-placeholder-color: var(--ifm-color-emphasis-800); + + /* Hyperlinks hover */ + --ifm-link-color: #389f58; + + --ifm-menu-color-background-active: #e9ecef; + /* Pocket Custom */ + --pokt-header-vertical-devider: #353a40; + + /* Pocket Custom */ + --pokt-nav-borders: #e3e8ed; + --pokt-nav-selected-border: #27292f; + + /* Disable nav boxshadow in light mode */ + --ifm-navbar-shadow: 0; + + /* Disable nav nested items padding */ + --ifm-menu-color: var(--ifm-color-primary); + + --ifm-navbar-height: 81px; + + /* Font Family */ + --ifm-font-family-base: "Inter", system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, + Cantarell, Noto Sans, sans-serif, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, + sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + + /* Search highlight color */ + --search-local-highlight-color: var(--mantine-primary-color-filled); +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme="dark"] { + --ifm-color-primary: #e6edf3; + --ifm-color-primary-dark: #cfd5db; + --ifm-color-primary-darker: #b8bec2; + --ifm-color-primary-darkest: #a1a6aa; + /*--ifm-color-primary-light: #4ea7f2;*/ + /*--ifm-color-primary-lighter: #5caef3;*/ + /*--ifm-color-primary-lightest: #84c2f6;*/ + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); + --ifm-navbar-background-color: #1a1b1e; + --ifm-menu-color-background-active: #27292f; + + /* Change collapse button color */ + --docusaurus-collapse-button-bg: #272729 !important; + --docusaurus-collapse-button-bg-hover: #232325 !important; + + /* Search style var */ + --ifm-navbar-search-input-icon: url('data:image/svg+xml;utf8,'); + + /*!* Hyperlinks hover *!*/ + /*--ifm-link-color: #379F58;*/ + + /* Pocket Custom */ + --pokt-header-vertical-devider: #ced4da; + + /* Pocket Custom */ + --pokt-nav-borders: #343438; + --pokt-nav-selected-border: #ebeaef; +} + +body { + background-color: var(--ifm-navbar-background-color) !important; +} + +a.mantine-Button-root:hover { + color: var(--_button-color, var(--button-color, var(--mantine-color-white))); + text-decoration: none; +} + +/* Header navbar styling and layout */ +.navbar { + border-bottom: 1px solid var(--mantine-color-default-border); + padding: 1rem; + height: auto; +} +.navbar__item { + position: relative; +} +.navbar__item:hover { + color: var(--mantine-primary-color-filled); +} +.navbar__item.navbar__link--active:before, +.navbar__item .navbar__link.active:before { + content: ""; + position: absolute; + width: 100%; + border-bottom: 2px solid var(--mantine-primary-color-filled); + left: 0; + bottom: -8px; +} +.navbar__items.navbar__items--right { + flex-direction: row-reverse; +} + +/* Navbar right section search styling */ +.navbar__search { + border: 1px solid var(--mantine-color-default-border); + border-radius: 4px; + padding: 3px; + margin-right: 16px; +} + +.navbar__search-input { + background-color: transparent; + outline-color: transparent; +} + +.navbar__search-input:hover { + border-color: transparent; +} + +.navbar__item.header-link-button { + border-radius: 100px; + color: var(--mantine-color-gray-0); +} + +/* sidebar nav menu styling and spacing */ +.theme-doc-sidebar-item-category:not(:first-child) { + margin-top: 2rem; +} + +nav.menu { + padding: 2rem 1rem; + overflow: hidden; +} + +nav.menu:hover { + overflow-y: auto; +} + +nav.menu .menu__list { + padding-left: 0; +} + +nav.menu li > .menu__link { + font-size: 14px; +} + +nav.menu li > .menu__link:not(.menu__link--active) { + font-weight: 400; +} +nav.menu li > .menu__link.menu__link--active { + font-weight: 600; +} + +nav.menu li > .menu__list-item-collapsible { + font-size: 12px; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 1px; +} +nav.menu li > .menu__list-item-collapsible .menu__link { + color: var(--mantine-color-gray-filled); +} + +/* blog sidebar */ +.blog-layout nav:not(.pagination-nav) { + border-right: 1px solid var(--mantine-color-default-border); + min-height: calc(100vh - var(--ifm-navbar-height)); + margin: 0; + top: var(--ifm-navbar-height); + padding: 2rem 1rem; + overflow: hidden; +} + +/* docs accordion */ +.docs-wrapper .mantine-Accordion-item { + border-left: calc(0.0625rem * var(--mantine-scale)) solid var(--_item-border-color); + border-bottom: none; +} + +/* TABLE */ +table { + display: table; + width: 100%; +} + +table thead { + background-color: transparent; +} + +table thead tr { + border: none; +} + +table tr { + border-color: var(--mantine-color-default-border); +} + +table thead tr th { + color: var(--mantine-color-text) !important; +} + +table tr td, +table tr th { + border: none; + border-color: var(--mantine-color-default-border); +} + +table tr:nth-child(2n) { + background-color: transparent; +} + +table tr:last-of-type td { + border-bottom: 1px solid; + /* border-bottom: calc(0.0625rem * var(--mantine-scale)) solid; */ + border-color: var(--mantine-color-default-border); +} diff --git a/docusaurus/src/css/header-icons.css b/docusaurus/src/css/header-icons.css new file mode 100644 index 000000000..2616aa3c6 --- /dev/null +++ b/docusaurus/src/css/header-icons.css @@ -0,0 +1,65 @@ +.header-link-icon { + padding: 8px; +} + +.header-link-icon:hover { + opacity: 0.6; +} + +.header-link-icon:before { + content: ''; + width: 24px; + height: 24px; + display: flex; +} + +.header-github-link::before { + background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 18' fill='none'%3E%3Cpath d='M9.00075 1.5C4.85698 1.5 1.50073 4.85625 1.50073 9C1.50073 12.3187 3.64761 15.1219 6.62886 16.1156C7.00386 16.1812 7.14448 15.9562 7.14448 15.7594C7.14448 15.5812 7.13511 14.9906 7.13511 14.3625C5.25073 14.7094 4.76323 13.9031 4.61323 13.4812C4.52886 13.2656 4.16323 12.6 3.84448 12.4219C3.58198 12.2812 3.20698 11.9344 3.83511 11.925C4.42573 11.9156 4.84761 12.4687 4.98823 12.6937C5.66323 13.8281 6.74136 13.5094 7.17261 13.3125C7.23823 12.825 7.43511 12.4969 7.65075 12.3094C5.98198 12.1219 4.23823 11.475 4.23823 8.60625C4.23823 7.79062 4.52886 7.11562 5.00698 6.59062C4.93198 6.40312 4.66948 5.63437 5.08198 4.60312C5.08198 4.60312 5.71011 4.40625 7.14448 5.37187C7.7445 5.20312 8.382 5.11875 9.0195 5.11875C9.657 5.11875 10.2945 5.20312 10.8945 5.37187C12.3289 4.39687 12.957 4.60312 12.957 4.60312C13.3695 5.63437 13.107 6.40312 13.032 6.59062C13.5101 7.11562 13.8007 7.78125 13.8007 8.60625C13.8007 11.4844 12.0476 12.1219 10.3789 12.3094C10.6507 12.5437 10.8851 12.9937 10.8851 13.6969C10.8851 14.7 10.8757 15.5062 10.8757 15.7594C10.8757 15.9562 11.0164 16.1906 11.3914 16.1156C14.4442 15.085 16.4999 12.2222 16.5007 9C16.5007 4.85625 13.1445 1.5 9.00075 1.5Z' fill='%231F2327'/%3E%3C/svg%3E") + no-repeat; +} + +[data-theme='dark'] .header-github-link::before { + background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 18' fill='none'%3E%3Cpath d='M9.00075 1.5C4.85698 1.5 1.50073 4.85625 1.50073 9C1.50073 12.3187 3.64761 15.1219 6.62886 16.1156C7.00386 16.1812 7.14448 15.9562 7.14448 15.7594C7.14448 15.5812 7.13511 14.9906 7.13511 14.3625C5.25073 14.7094 4.76323 13.9031 4.61323 13.4812C4.52886 13.2656 4.16323 12.6 3.84448 12.4219C3.58198 12.2812 3.20698 11.9344 3.83511 11.925C4.42573 11.9156 4.84761 12.4687 4.98823 12.6937C5.66323 13.8281 6.74136 13.5094 7.17261 13.3125C7.23823 12.825 7.43511 12.4969 7.65075 12.3094C5.98198 12.1219 4.23823 11.475 4.23823 8.60625C4.23823 7.79062 4.52886 7.11562 5.00698 6.59062C4.93198 6.40312 4.66948 5.63437 5.08198 4.60312C5.08198 4.60312 5.71011 4.40625 7.14448 5.37187C7.7445 5.20312 8.382 5.11875 9.0195 5.11875C9.657 5.11875 10.2945 5.20312 10.8945 5.37187C12.3289 4.39687 12.957 4.60312 12.957 4.60312C13.3695 5.63437 13.107 6.40312 13.032 6.59062C13.5101 7.11562 13.8007 7.78125 13.8007 8.60625C13.8007 11.4844 12.0476 12.1219 10.3789 12.3094C10.6507 12.5437 10.8851 12.9937 10.8851 13.6969C10.8851 14.7 10.8757 15.5062 10.8757 15.7594C10.8757 15.9562 11.0164 16.1906 11.3914 16.1156C14.4442 15.085 16.4999 12.2222 16.5007 9C16.5007 4.85625 13.1445 1.5 9.00075 1.5Z' fill='%23E6EDF3'/%3E%3C/svg%3E") + no-repeat; +} + +.header-twitter-link::before { + background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 18' fill='none'%3E%3Cpath d='M16.6594 4.24204C16.0868 4.49531 15.4796 4.66166 14.858 4.73558C15.5129 4.34349 16.0031 3.72667 16.237 3.00004C15.6215 3.36571 14.9479 3.62308 14.2454 3.76096C13.6523 3.12829 12.8235 2.76977 11.9564 2.77075C10.2245 2.77075 8.81978 4.17496 8.81978 5.90762C8.81978 6.15343 8.84798 6.39181 8.9007 6.62182C6.29286 6.49053 3.98256 5.24254 2.43509 3.34456C2.15647 3.82325 2.01004 4.36738 2.01078 4.92125C2.01078 6.00944 2.5647 6.96993 3.40612 7.53225C2.90803 7.5165 2.42091 7.38198 1.98539 7.1398C1.98491 7.15297 1.98491 7.16615 1.98491 7.17861C1.98491 8.6988 3.06615 9.9669 4.5015 10.2548C4.2321 10.3277 3.95424 10.3645 3.67517 10.3643C3.47248 10.3643 3.27579 10.3456 3.0846 10.309C3.48399 11.5549 4.64165 12.4619 6.0147 12.4868C4.9036 13.3588 3.53152 13.8319 2.11908 13.8299C1.86909 13.8301 1.61932 13.8154 1.37109 13.7858C2.80503 14.7076 4.47414 15.1969 6.17882 15.1951C11.9487 15.1951 15.1035 10.4156 15.1035 6.27083C15.1035 6.13522 15.1002 5.99914 15.0942 5.86498C15.7082 5.42134 16.2383 4.87175 16.6594 4.24204Z' fill='%231F2327'/%3E%3C/svg%3E") + no-repeat; +} + +[data-theme='dark'] .header-twitter-link::before { + background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 18' fill='none'%3E%3Cpath d='M16.6594 4.24204C16.0868 4.49531 15.4796 4.66166 14.858 4.73558C15.5129 4.34349 16.0031 3.72667 16.237 3.00004C15.6215 3.36571 14.9479 3.62308 14.2454 3.76096C13.6523 3.12829 12.8235 2.76977 11.9564 2.77075C10.2245 2.77075 8.81978 4.17496 8.81978 5.90762C8.81978 6.15343 8.84798 6.39181 8.9007 6.62182C6.29286 6.49053 3.98256 5.24254 2.43509 3.34456C2.15647 3.82325 2.01004 4.36738 2.01078 4.92125C2.01078 6.00944 2.5647 6.96993 3.40612 7.53225C2.90803 7.5165 2.42091 7.38198 1.98539 7.1398C1.98491 7.15297 1.98491 7.16615 1.98491 7.17861C1.98491 8.6988 3.06615 9.9669 4.5015 10.2548C4.2321 10.3277 3.95424 10.3645 3.67517 10.3643C3.47248 10.3643 3.27579 10.3456 3.0846 10.309C3.48399 11.5549 4.64165 12.4619 6.0147 12.4868C4.9036 13.3588 3.53152 13.8319 2.11908 13.8299C1.86909 13.8301 1.61932 13.8154 1.37109 13.7858C2.80503 14.7076 4.47414 15.1969 6.17882 15.1951C11.9487 15.1951 15.1035 10.4156 15.1035 6.27083C15.1035 6.13522 15.1002 5.99914 15.0942 5.86498C15.7082 5.42134 16.2383 4.87175 16.6594 4.24204Z' fill='%23E6EDF3'/%3E%3C/svg%3E") + no-repeat; +} + +.header-discord-link::before { + background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 18' fill='none'%3E%3Cpath d='M14.4775 4.00287C13.4508 3.53327 12.3604 3.19102 11.2222 3C11.0789 3.24674 10.9197 3.58103 10.8082 3.84369C9.59767 3.66858 8.3958 3.66858 7.20191 3.84369C7.09048 3.58103 6.92332 3.24674 6.78801 3C5.64188 3.19102 4.55146 3.53327 3.53186 4.00287C1.4704 7.04333 0.913244 10.0121 1.19182 12.9412C2.56082 13.9361 3.88209 14.541 5.18026 14.939C5.49863 14.5092 5.78517 14.0475 6.03191 13.562C5.56231 13.3869 5.11658 13.172 4.68678 12.9173C4.79821 12.8377 4.90965 12.7502 5.01312 12.6626C7.60785 13.8486 10.4183 13.8486 12.9811 12.6626C13.0926 12.7502 13.1961 12.8377 13.3075 12.9173C12.8777 13.172 12.432 13.3869 11.9624 13.562C12.2092 14.0475 12.4957 14.5092 12.814 14.939C14.1114 14.541 15.4406 13.9361 16.8025 12.9412C17.1447 9.55057 16.2604 6.6056 14.4775 4.00287ZM6.39007 11.1344C5.61005 11.1344 4.9733 10.426 4.9733 9.55852C4.9733 8.69092 5.59413 7.98255 6.39007 7.98255C7.17803 7.98255 7.82272 8.69092 7.80682 9.55852C7.80682 10.426 7.17803 11.1344 6.39007 11.1344ZM11.6202 11.1344C10.8401 11.1344 10.2025 10.426 10.2025 9.55852C10.2025 8.69092 10.8242 7.98255 11.6202 7.98255C12.4081 7.98255 13.0528 8.69092 13.0369 9.55852C13.0369 10.426 12.4161 11.1344 11.6202 11.1344Z' fill='%231F2327'/%3E%3C/svg%3E") + no-repeat; +} + +[data-theme='dark'] .header-discord-link::before { + background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 18' fill='none'%3E%3Cpath d='M14.4775 4.00287C13.4508 3.53327 12.3604 3.19102 11.2222 3C11.0789 3.24674 10.9197 3.58103 10.8082 3.84369C9.59767 3.66858 8.3958 3.66858 7.20191 3.84369C7.09048 3.58103 6.92332 3.24674 6.78801 3C5.64188 3.19102 4.55146 3.53327 3.53186 4.00287C1.4704 7.04333 0.913244 10.0121 1.19182 12.9412C2.56082 13.9361 3.88209 14.541 5.18026 14.939C5.49863 14.5092 5.78517 14.0475 6.03191 13.562C5.56231 13.3869 5.11658 13.172 4.68678 12.9173C4.79821 12.8377 4.90965 12.7502 5.01312 12.6626C7.60785 13.8486 10.4183 13.8486 12.9811 12.6626C13.0926 12.7502 13.1961 12.8377 13.3075 12.9173C12.8777 13.172 12.432 13.3869 11.9624 13.562C12.2092 14.0475 12.4957 14.5092 12.814 14.939C14.1114 14.541 15.4406 13.9361 16.8025 12.9412C17.1447 9.55057 16.2604 6.6056 14.4775 4.00287ZM6.39007 11.1344C5.61005 11.1344 4.9733 10.426 4.9733 9.55852C4.9733 8.69092 5.59413 7.98255 6.39007 7.98255C7.17803 7.98255 7.82272 8.69092 7.80682 9.55852C7.80682 10.426 7.17803 11.1344 6.39007 11.1344ZM11.6202 11.1344C10.8401 11.1344 10.2025 10.426 10.2025 9.55852C10.2025 8.69092 10.8242 7.98255 11.6202 7.98255C12.4081 7.98255 13.0528 8.69092 13.0369 9.55852C13.0369 10.426 12.4161 11.1344 11.6202 11.1344Z' fill='%23E6EDF3'/%3E%3C/svg%3E") + no-repeat; +} + + + + +.header-link-button { + padding: 8px; + border: 1px solid var(--pokt-nav-borders); + border-radius: 4px; + margin-left: 20px; +} +.header-portal-link { + padding: 8px 16px; + background-color: var(--ifm-link-color); +} +.header-portal-link:hover { + color: var(--ifm-navbar-link-hover-color); + background-color: var(--ifm-link-hover-color); +} +.header-portal-link svg { + display: none; +} \ No newline at end of file diff --git a/docusaurus/yarn.lock b/docusaurus/yarn.lock index 2d9800bf6..ef13ae772 100644 --- a/docusaurus/yarn.lock +++ b/docusaurus/yarn.lock @@ -29,114 +29,131 @@ resolved "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz" integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ== -"@algolia/cache-browser-local-storage@4.22.1": - version "4.22.1" - resolved "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz" - integrity sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g== - dependencies: - "@algolia/cache-common" "4.22.1" - -"@algolia/cache-common@4.22.1": - version "4.22.1" - resolved "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.1.tgz" - integrity sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA== - -"@algolia/cache-in-memory@4.22.1": - version "4.22.1" - resolved "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz" - integrity sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw== - dependencies: - "@algolia/cache-common" "4.22.1" - -"@algolia/client-account@4.22.1": - version "4.22.1" - resolved "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.1.tgz" - integrity sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw== - dependencies: - "@algolia/client-common" "4.22.1" - "@algolia/client-search" "4.22.1" - "@algolia/transporter" "4.22.1" - -"@algolia/client-analytics@4.22.1": - version "4.22.1" - resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.1.tgz" - integrity sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg== - dependencies: - "@algolia/client-common" "4.22.1" - "@algolia/client-search" "4.22.1" - "@algolia/requester-common" "4.22.1" - "@algolia/transporter" "4.22.1" - -"@algolia/client-common@4.22.1": - version "4.22.1" - resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.1.tgz" - integrity sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ== - dependencies: - "@algolia/requester-common" "4.22.1" - "@algolia/transporter" "4.22.1" - -"@algolia/client-personalization@4.22.1": - version "4.22.1" - resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.1.tgz" - integrity sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ== - dependencies: - "@algolia/client-common" "4.22.1" - "@algolia/requester-common" "4.22.1" - "@algolia/transporter" "4.22.1" - -"@algolia/client-search@>= 4.9.1 < 6", "@algolia/client-search@4.22.1": - version "4.22.1" - resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.1.tgz" - integrity sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA== - dependencies: - "@algolia/client-common" "4.22.1" - "@algolia/requester-common" "4.22.1" - "@algolia/transporter" "4.22.1" +"@algolia/cache-browser-local-storage@4.23.2": + version "4.23.2" + resolved "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.2.tgz" + integrity sha512-PvRQdCmtiU22dw9ZcTJkrVKgNBVAxKgD0/cfiqyxhA5+PHzA2WDt6jOmZ9QASkeM2BpyzClJb/Wr1yt2/t78Kw== + dependencies: + "@algolia/cache-common" "4.23.2" + +"@algolia/cache-common@4.23.2": + version "4.23.2" + resolved "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.23.2.tgz" + integrity sha512-OUK/6mqr6CQWxzl/QY0/mwhlGvS6fMtvEPyn/7AHUx96NjqDA4X4+Ju7aXFQKh+m3jW9VPB0B9xvEQgyAnRPNw== + +"@algolia/cache-in-memory@4.23.2": + version "4.23.2" + resolved "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.23.2.tgz" + integrity sha512-rfbi/SnhEa3MmlqQvgYz/9NNJ156NkU6xFxjbxBtLWnHbpj+qnlMoKd+amoiacHRITpajg6zYbLM9dnaD3Bczw== + dependencies: + "@algolia/cache-common" "4.23.2" + +"@algolia/client-account@4.23.2": + version "4.23.2" + resolved "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.23.2.tgz" + integrity sha512-VbrOCLIN/5I7iIdskSoSw3uOUPF516k4SjDD4Qz3BFwa3of7D9A0lzBMAvQEJJEPHWdVraBJlGgdJq/ttmquJQ== + dependencies: + "@algolia/client-common" "4.23.2" + "@algolia/client-search" "4.23.2" + "@algolia/transporter" "4.23.2" + +"@algolia/client-analytics@4.23.2": + version "4.23.2" + resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.23.2.tgz" + integrity sha512-lLj7irsAztGhMoEx/SwKd1cwLY6Daf1Q5f2AOsZacpppSvuFvuBrmkzT7pap1OD/OePjLKxicJS8wNA0+zKtuw== + dependencies: + "@algolia/client-common" "4.23.2" + "@algolia/client-search" "4.23.2" + "@algolia/requester-common" "4.23.2" + "@algolia/transporter" "4.23.2" + +"@algolia/client-common@4.23.2": + version "4.23.2" + resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.23.2.tgz" + integrity sha512-Q2K1FRJBern8kIfZ0EqPvUr3V29ICxCm/q42zInV+VJRjldAD9oTsMGwqUQ26GFMdFYmqkEfCbY4VGAiQhh22g== + dependencies: + "@algolia/requester-common" "4.23.2" + "@algolia/transporter" "4.23.2" + +"@algolia/client-personalization@4.23.2": + version "4.23.2" + resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.23.2.tgz" + integrity sha512-vwPsgnCGhUcHhhQG5IM27z8q7dWrN9itjdvgA6uKf2e9r7vB+WXt4OocK0CeoYQt3OGEAExryzsB8DWqdMK5wg== + dependencies: + "@algolia/client-common" "4.23.2" + "@algolia/requester-common" "4.23.2" + "@algolia/transporter" "4.23.2" + +"@algolia/client-search@>= 4.9.1 < 6", "@algolia/client-search@4.23.2": + version "4.23.2" + resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.23.2.tgz" + integrity sha512-CxSB29OVGSE7l/iyoHvamMonzq7Ev8lnk/OkzleODZ1iBcCs3JC/XgTIKzN/4RSTrJ9QybsnlrN/bYCGufo7qw== + dependencies: + "@algolia/client-common" "4.23.2" + "@algolia/requester-common" "4.23.2" + "@algolia/transporter" "4.23.2" "@algolia/events@^4.0.1": version "4.0.1" resolved "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz" integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== -"@algolia/logger-common@4.22.1": - version "4.22.1" - resolved "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.1.tgz" - integrity sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg== - -"@algolia/logger-console@4.22.1": - version "4.22.1" - resolved "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.1.tgz" - integrity sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA== - dependencies: - "@algolia/logger-common" "4.22.1" - -"@algolia/requester-browser-xhr@4.22.1": - version "4.22.1" - resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz" - integrity sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw== - dependencies: - "@algolia/requester-common" "4.22.1" - -"@algolia/requester-common@4.22.1": - version "4.22.1" - resolved "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.1.tgz" - integrity sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg== - -"@algolia/requester-node-http@4.22.1": - version "4.22.1" - resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz" - integrity sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA== - dependencies: - "@algolia/requester-common" "4.22.1" - -"@algolia/transporter@4.22.1": - version "4.22.1" - resolved "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.1.tgz" - integrity sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ== - dependencies: - "@algolia/cache-common" "4.22.1" - "@algolia/logger-common" "4.22.1" - "@algolia/requester-common" "4.22.1" +"@algolia/logger-common@4.23.2": + version "4.23.2" + resolved "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.23.2.tgz" + integrity sha512-jGM49Q7626cXZ7qRAWXn0jDlzvoA1FvN4rKTi1g0hxKsTTSReyYk0i1ADWjChDPl3Q+nSDhJuosM2bBUAay7xw== + +"@algolia/logger-console@4.23.2": + version "4.23.2" + resolved "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.23.2.tgz" + integrity sha512-oo+lnxxEmlhTBTFZ3fGz1O8PJ+G+8FiAoMY2Qo3Q4w23xocQev6KqDTA1JQAGPDxAewNA2VBwWOsVXeXFjrI/Q== + dependencies: + "@algolia/logger-common" "4.23.2" + +"@algolia/recommend@4.23.2": + version "4.23.2" + resolved "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.23.2.tgz" + integrity sha512-Q75CjnzRCDzgIlgWfPnkLtrfF4t82JCirhalXkSSwe/c1GH5pWh4xUyDOR3KTMo+YxxX3zTlrL/FjHmUJEWEcg== + dependencies: + "@algolia/cache-browser-local-storage" "4.23.2" + "@algolia/cache-common" "4.23.2" + "@algolia/cache-in-memory" "4.23.2" + "@algolia/client-common" "4.23.2" + "@algolia/client-search" "4.23.2" + "@algolia/logger-common" "4.23.2" + "@algolia/logger-console" "4.23.2" + "@algolia/requester-browser-xhr" "4.23.2" + "@algolia/requester-common" "4.23.2" + "@algolia/requester-node-http" "4.23.2" + "@algolia/transporter" "4.23.2" + +"@algolia/requester-browser-xhr@4.23.2": + version "4.23.2" + resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.2.tgz" + integrity sha512-TO9wLlp8+rvW9LnIfyHsu8mNAMYrqNdQ0oLF6eTWFxXfxG3k8F/Bh7nFYGk2rFAYty4Fw4XUtrv/YjeNDtM5og== + dependencies: + "@algolia/requester-common" "4.23.2" + +"@algolia/requester-common@4.23.2": + version "4.23.2" + resolved "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.23.2.tgz" + integrity sha512-3EfpBS0Hri0lGDB5H/BocLt7Vkop0bTTLVUBB844HH6tVycwShmsV6bDR7yXbQvFP1uNpgePRD3cdBCjeHmk6Q== + +"@algolia/requester-node-http@4.23.2": + version "4.23.2" + resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.23.2.tgz" + integrity sha512-SVzgkZM/malo+2SB0NWDXpnT7nO5IZwuDTaaH6SjLeOHcya1o56LSWXk+3F3rNLz2GVH+I/rpYKiqmHhSOjerw== + dependencies: + "@algolia/requester-common" "4.23.2" + +"@algolia/transporter@4.23.2": + version "4.23.2" + resolved "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.23.2.tgz" + integrity sha512-GY3aGKBy+8AK4vZh8sfkatDciDVKad5rTY2S10Aefyjh7e7UGBP4zigf42qVXwU8VOPwi7l/L7OACGMOFcjB0Q== + dependencies: + "@algolia/cache-common" "4.23.2" + "@algolia/logger-common" "4.23.2" + "@algolia/requester-common" "4.23.2" "@ampproject/remapping@^2.2.0": version "2.2.1" @@ -388,7 +405,7 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.22.15", "@babel/parser@^7.22.7", "@babel/parser@^7.23.5": +"@babel/parser@^7.22.15", "@babel/parser@^7.23.5": version "7.23.5" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz" integrity sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ== @@ -1200,25 +1217,25 @@ resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@docsearch/css@3.5.2": - version "3.5.2" - resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.5.2.tgz" - integrity sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA== +"@docsearch/css@3.6.0": + version "3.6.0" + resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz" + integrity sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ== "@docsearch/react@^3.5.2": - version "3.5.2" - resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.5.2.tgz" - integrity sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng== + version "3.6.0" + resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz" + integrity sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w== dependencies: "@algolia/autocomplete-core" "1.9.3" "@algolia/autocomplete-preset-algolia" "1.9.3" - "@docsearch/css" "3.5.2" + "@docsearch/css" "3.6.0" algoliasearch "^4.19.1" -"@docusaurus/core@^3.1.1", "@docusaurus/core@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/core/-/core-3.1.1.tgz" - integrity sha512-2nQfKFcf+MLEM7JXsXwQxPOmQAR6ytKMZVSx7tVi9HEm9WtfwBH1fp6bn8Gj4zLUhjWKCLoysQ9/Wm+EZCQ4yQ== +"@docusaurus/core@^3.2.1", "@docusaurus/core@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/core/-/core-3.2.1.tgz" + integrity sha512-ZeMAqNvy0eBv2dThEeMuNzzuu+4thqMQakhxsgT5s02A8LqRcdkg+rbcnuNqUIpekQ4GRx3+M5nj0ODJhBXo9w== dependencies: "@babel/core" "^7.23.3" "@babel/generator" "^7.23.3" @@ -1230,14 +1247,13 @@ "@babel/runtime" "^7.22.6" "@babel/runtime-corejs3" "^7.22.6" "@babel/traverse" "^7.22.8" - "@docusaurus/cssnano-preset" "3.1.1" - "@docusaurus/logger" "3.1.1" - "@docusaurus/mdx-loader" "3.1.1" + "@docusaurus/cssnano-preset" "3.2.1" + "@docusaurus/logger" "3.2.1" + "@docusaurus/mdx-loader" "3.2.1" "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/utils" "3.1.1" - "@docusaurus/utils-common" "3.1.1" - "@docusaurus/utils-validation" "3.1.1" - "@slorber/static-site-generator-webpack-plugin" "^4.0.7" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-common" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" "@svgr/webpack" "^6.5.1" autoprefixer "^10.4.14" babel-loader "^9.1.3" @@ -1258,6 +1274,7 @@ detect-port "^1.5.1" escape-html "^1.0.3" eta "^2.2.0" + eval "^0.1.8" file-loader "^6.2.0" fs-extra "^11.1.1" html-minifier-terser "^7.2.0" @@ -1266,6 +1283,7 @@ leven "^3.1.0" lodash "^4.17.21" mini-css-extract-plugin "^2.7.6" + p-map "^4.0.0" postcss "^8.4.26" postcss-loader "^7.3.3" prompts "^2.4.2" @@ -1290,34 +1308,32 @@ webpack-merge "^5.9.0" webpackbar "^5.0.2" -"@docusaurus/cssnano-preset@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.1.1.tgz" - integrity sha512-LnoIDjJWbirdbVZDMq+4hwmrTl2yHDnBf9MLG9qyExeAE3ac35s4yUhJI8yyTCdixzNfKit4cbXblzzqMu4+8g== +"@docusaurus/cssnano-preset@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.2.1.tgz" + integrity sha512-wTL9KuSSbMJjKrfu385HZEzAoamUsbKqwscAQByZw4k6Ja/RWpqgVvt/CbAC+aYEH6inLzOt+MjuRwMOrD3VBA== dependencies: cssnano-preset-advanced "^5.3.10" postcss "^8.4.26" postcss-sort-media-queries "^4.4.1" tslib "^2.6.0" -"@docusaurus/logger@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.1.1.tgz" - integrity sha512-BjkNDpQzewcTnST8trx4idSoAla6zZ3w22NqM/UMcFtvYJgmoE4layuTzlfql3VFPNuivvj7BOExa/+21y4X2Q== +"@docusaurus/logger@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.2.1.tgz" + integrity sha512-0voOKJCn9RaM3np6soqEfo7SsVvf2C+CDTWhW+H/1AyBhybASpExtDEz+7ECck9TwPzFQ5tt+I3zVugUJbJWDg== dependencies: chalk "^4.1.2" tslib "^2.6.0" -"@docusaurus/mdx-loader@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.1.1.tgz" - integrity sha512-xN2IccH9+sv7TmxwsDJNS97BHdmlqWwho+kIVY4tcCXkp+k4QuzvWBeunIMzeayY4Fu13A6sAjHGv5qm72KyGA== +"@docusaurus/mdx-loader@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.2.1.tgz" + integrity sha512-Fs8tXhXKZjNkdGaOy1xSLXSwfjCMT73J3Zfrju2U16uGedRFRjgK0ojpK5tiC7TnunsL3tOFgp1BSMBRflX9gw== dependencies: - "@babel/parser" "^7.22.7" - "@babel/traverse" "^7.22.8" - "@docusaurus/logger" "3.1.1" - "@docusaurus/utils" "3.1.1" - "@docusaurus/utils-validation" "3.1.1" + "@docusaurus/logger" "3.2.1" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" "@mdx-js/mdx" "^3.0.0" "@slorber/remark-comment" "^1.0.0" escape-html "^1.0.3" @@ -1340,13 +1356,13 @@ vfile "^6.0.1" webpack "^5.88.1" -"@docusaurus/module-type-aliases@^3.1.1", "@docusaurus/module-type-aliases@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.1.1.tgz" - integrity sha512-xBJyx0TMfAfVZ9ZeIOb1awdXgR4YJMocIEzTps91rq+hJDFJgJaylDtmoRhUxkwuYmNK1GJpW95b7DLztSBJ3A== +"@docusaurus/module-type-aliases@^3.2.1", "@docusaurus/module-type-aliases@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.2.1.tgz" + integrity sha512-FyViV5TqhL1vsM7eh29nJ5NtbRE6Ra6LP1PDcPvhwPSlA7eiWGRKAn3jWwMUcmjkos5SYY+sr0/feCdbM3eQHQ== dependencies: "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/types" "3.1.1" + "@docusaurus/types" "3.2.1" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" @@ -1354,18 +1370,18 @@ react-helmet-async "*" react-loadable "npm:@docusaurus/react-loadable@5.5.2" -"@docusaurus/plugin-content-blog@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.1.1.tgz" - integrity sha512-ew/3VtVoG3emoAKmoZl7oKe1zdFOsI0NbcHS26kIxt2Z8vcXKCUgK9jJJrz0TbOipyETPhqwq4nbitrY3baibg== - dependencies: - "@docusaurus/core" "3.1.1" - "@docusaurus/logger" "3.1.1" - "@docusaurus/mdx-loader" "3.1.1" - "@docusaurus/types" "3.1.1" - "@docusaurus/utils" "3.1.1" - "@docusaurus/utils-common" "3.1.1" - "@docusaurus/utils-validation" "3.1.1" +"@docusaurus/plugin-content-blog@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.2.1.tgz" + integrity sha512-lOx0JfhlGZoZu6pEJfeEpSISZR5dQbJGGvb42IP13G5YThNHhG9R9uoWuo4IOimPqBC7sHThdLA3VLevk61Fsw== + dependencies: + "@docusaurus/core" "3.2.1" + "@docusaurus/logger" "3.2.1" + "@docusaurus/mdx-loader" "3.2.1" + "@docusaurus/types" "3.2.1" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-common" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" cheerio "^1.0.0-rc.12" feed "^4.2.2" fs-extra "^11.1.1" @@ -1377,18 +1393,19 @@ utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-docs@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.1.1.tgz" - integrity sha512-lhFq4E874zw0UOH7ujzxnCayOyAt0f9YPVYSb9ohxrdCM8B4szxitUw9rIX4V9JLLHVoqIJb6k+lJJ1jrcGJ0A== - dependencies: - "@docusaurus/core" "3.1.1" - "@docusaurus/logger" "3.1.1" - "@docusaurus/mdx-loader" "3.1.1" - "@docusaurus/module-type-aliases" "3.1.1" - "@docusaurus/types" "3.1.1" - "@docusaurus/utils" "3.1.1" - "@docusaurus/utils-validation" "3.1.1" +"@docusaurus/plugin-content-docs@^2 || ^3", "@docusaurus/plugin-content-docs@^3.2.1", "@docusaurus/plugin-content-docs@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.2.1.tgz" + integrity sha512-GHe5b/lCskAR8QVbfWAfPAApvRZgqk7FN3sOHgjCtjzQACZxkHmq6QqyqZ8Jp45V7lVck4wt2Xw2IzBJ7Cz3bA== + dependencies: + "@docusaurus/core" "3.2.1" + "@docusaurus/logger" "3.2.1" + "@docusaurus/mdx-loader" "3.2.1" + "@docusaurus/module-type-aliases" "3.2.1" + "@docusaurus/types" "3.2.1" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-common" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" "@types/react-router-config" "^5.0.7" combine-promises "^1.1.0" fs-extra "^11.1.1" @@ -1398,96 +1415,96 @@ utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-pages@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.1.1.tgz" - integrity sha512-NQHncNRAJbyLtgTim9GlEnNYsFhuCxaCNkMwikuxLTiGIPH7r/jpb7O3f3jUMYMebZZZrDq5S7om9a6rvB/YCA== - dependencies: - "@docusaurus/core" "3.1.1" - "@docusaurus/mdx-loader" "3.1.1" - "@docusaurus/types" "3.1.1" - "@docusaurus/utils" "3.1.1" - "@docusaurus/utils-validation" "3.1.1" +"@docusaurus/plugin-content-pages@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.2.1.tgz" + integrity sha512-TOqVfMVTAHqWNEGM94Drz+PUpHDbwFy6ucHFgyTx9zJY7wPNSG5EN+rd/mU7OvAi26qpOn2o9xTdUmb28QLjEQ== + dependencies: + "@docusaurus/core" "3.2.1" + "@docusaurus/mdx-loader" "3.2.1" + "@docusaurus/types" "3.2.1" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" fs-extra "^11.1.1" tslib "^2.6.0" webpack "^5.88.1" -"@docusaurus/plugin-debug@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.1.1.tgz" - integrity sha512-xWeMkueM9wE/8LVvl4+Qf1WqwXmreMjI5Kgr7GYCDoJ8zu4kD+KaMhrh7py7MNM38IFvU1RfrGKacCEe2DRRfQ== +"@docusaurus/plugin-debug@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.2.1.tgz" + integrity sha512-AMKq8NuUKf2sRpN1m/sIbqbRbnmk+rSA+8mNU1LNxEl9BW9F/Gng8m9HKlzeyMPrf5XidzS1jqkuTLDJ6KIrFw== dependencies: - "@docusaurus/core" "3.1.1" - "@docusaurus/types" "3.1.1" - "@docusaurus/utils" "3.1.1" + "@docusaurus/core" "3.2.1" + "@docusaurus/types" "3.2.1" + "@docusaurus/utils" "3.2.1" fs-extra "^11.1.1" react-json-view-lite "^1.2.0" tslib "^2.6.0" -"@docusaurus/plugin-google-analytics@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.1.1.tgz" - integrity sha512-+q2UpWTqVi8GdlLoSlD5bS/YpxW+QMoBwrPrUH/NpvpuOi0Of7MTotsQf9JWd3hymZxl2uu1o3PIrbpxfeDFDQ== +"@docusaurus/plugin-google-analytics@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.2.1.tgz" + integrity sha512-/rJ+9u+Px0eTCiF4TNcNtj3kHf8cp6K1HCwOTdbsSlz6Xn21syZYcy+f1VM9wF6HrvUkXUcbM5TDCvg2IRL6bQ== dependencies: - "@docusaurus/core" "3.1.1" - "@docusaurus/types" "3.1.1" - "@docusaurus/utils-validation" "3.1.1" + "@docusaurus/core" "3.2.1" + "@docusaurus/types" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" tslib "^2.6.0" -"@docusaurus/plugin-google-gtag@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.1.1.tgz" - integrity sha512-0mMPiBBlQ5LFHTtjxuvt/6yzh8v7OxLi3CbeEsxXZpUzcKO/GC7UA1VOWUoBeQzQL508J12HTAlR3IBU9OofSw== +"@docusaurus/plugin-google-gtag@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.2.1.tgz" + integrity sha512-XtuJnlMvYfppeVdUyKiDIJAa/gTJKCQU92z8CLZZ9ibJdgVjFOLS10s0hIC0eL5z0U2u2loJz2rZ63HOkNHbBA== dependencies: - "@docusaurus/core" "3.1.1" - "@docusaurus/types" "3.1.1" - "@docusaurus/utils-validation" "3.1.1" + "@docusaurus/core" "3.2.1" + "@docusaurus/types" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" "@types/gtag.js" "^0.0.12" tslib "^2.6.0" -"@docusaurus/plugin-google-tag-manager@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.1.1.tgz" - integrity sha512-d07bsrMLdDIryDtY17DgqYUbjkswZQr8cLWl4tzXrt5OR/T/zxC1SYKajzB3fd87zTu5W5klV5GmUwcNSMXQXA== +"@docusaurus/plugin-google-tag-manager@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.2.1.tgz" + integrity sha512-wiS/kE0Ny5pnjTxVCs8ljRnkL1RVMj59t6jmSsgEX7piDOoaXSMIUaoIt9ogS/v132uO0xEsxHstkRUZHQyPcQ== dependencies: - "@docusaurus/core" "3.1.1" - "@docusaurus/types" "3.1.1" - "@docusaurus/utils-validation" "3.1.1" + "@docusaurus/core" "3.2.1" + "@docusaurus/types" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" tslib "^2.6.0" -"@docusaurus/plugin-sitemap@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.1.1.tgz" - integrity sha512-iJ4hCaMmDaUqRv131XJdt/C/jJQx8UreDWTRqZKtNydvZVh/o4yXGRRFOplea1D9b/zpwL1Y+ZDwX7xMhIOTmg== - dependencies: - "@docusaurus/core" "3.1.1" - "@docusaurus/logger" "3.1.1" - "@docusaurus/types" "3.1.1" - "@docusaurus/utils" "3.1.1" - "@docusaurus/utils-common" "3.1.1" - "@docusaurus/utils-validation" "3.1.1" +"@docusaurus/plugin-sitemap@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.2.1.tgz" + integrity sha512-uWZ7AxzdeaQSTCwD2yZtOiEm9zyKU+wqCmi/Sf25kQQqqFSBZUStXfaQ8OHP9cecnw893ZpZ811rPhB/wfujJw== + dependencies: + "@docusaurus/core" "3.2.1" + "@docusaurus/logger" "3.2.1" + "@docusaurus/types" "3.2.1" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-common" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" fs-extra "^11.1.1" sitemap "^7.1.1" tslib "^2.6.0" -"@docusaurus/preset-classic@^3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.1.1.tgz" - integrity sha512-jG4ys/hWYf69iaN/xOmF+3kjs4Nnz1Ay3CjFLDtYa8KdxbmUhArA9HmP26ru5N0wbVWhY+6kmpYhTJpez5wTyg== - dependencies: - "@docusaurus/core" "3.1.1" - "@docusaurus/plugin-content-blog" "3.1.1" - "@docusaurus/plugin-content-docs" "3.1.1" - "@docusaurus/plugin-content-pages" "3.1.1" - "@docusaurus/plugin-debug" "3.1.1" - "@docusaurus/plugin-google-analytics" "3.1.1" - "@docusaurus/plugin-google-gtag" "3.1.1" - "@docusaurus/plugin-google-tag-manager" "3.1.1" - "@docusaurus/plugin-sitemap" "3.1.1" - "@docusaurus/theme-classic" "3.1.1" - "@docusaurus/theme-common" "3.1.1" - "@docusaurus/theme-search-algolia" "3.1.1" - "@docusaurus/types" "3.1.1" +"@docusaurus/preset-classic@^3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.2.1.tgz" + integrity sha512-E3OHSmttpEBcSMhfPBq3EJMBxZBM01W1rnaCUTXy9EHvkmB5AwgTfW1PwGAybPAX579ntE03R+2zmXdizWfKnQ== + dependencies: + "@docusaurus/core" "3.2.1" + "@docusaurus/plugin-content-blog" "3.2.1" + "@docusaurus/plugin-content-docs" "3.2.1" + "@docusaurus/plugin-content-pages" "3.2.1" + "@docusaurus/plugin-debug" "3.2.1" + "@docusaurus/plugin-google-analytics" "3.2.1" + "@docusaurus/plugin-google-gtag" "3.2.1" + "@docusaurus/plugin-google-tag-manager" "3.2.1" + "@docusaurus/plugin-sitemap" "3.2.1" + "@docusaurus/theme-classic" "3.2.1" + "@docusaurus/theme-common" "3.2.1" + "@docusaurus/theme-search-algolia" "3.2.1" + "@docusaurus/types" "3.2.1" "@docusaurus/react-loadable@5.5.2": version "5.5.2" @@ -1497,23 +1514,23 @@ "@types/react" "*" prop-types "^15.6.2" -"@docusaurus/theme-classic@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.1.1.tgz" - integrity sha512-GiPE/jbWM8Qv1A14lk6s9fhc0LhPEQ00eIczRO4QL2nAQJZXkjPG6zaVx+1cZxPFWbAsqSjKe2lqkwF3fGkQ7Q== - dependencies: - "@docusaurus/core" "3.1.1" - "@docusaurus/mdx-loader" "3.1.1" - "@docusaurus/module-type-aliases" "3.1.1" - "@docusaurus/plugin-content-blog" "3.1.1" - "@docusaurus/plugin-content-docs" "3.1.1" - "@docusaurus/plugin-content-pages" "3.1.1" - "@docusaurus/theme-common" "3.1.1" - "@docusaurus/theme-translations" "3.1.1" - "@docusaurus/types" "3.1.1" - "@docusaurus/utils" "3.1.1" - "@docusaurus/utils-common" "3.1.1" - "@docusaurus/utils-validation" "3.1.1" +"@docusaurus/theme-classic@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.2.1.tgz" + integrity sha512-+vSbnQyoWjc6vRZi4vJO2dBU02wqzynsai15KK+FANZudrYaBHtkbLZAQhgmxzBGVpxzi87gRohlMm+5D8f4tA== + dependencies: + "@docusaurus/core" "3.2.1" + "@docusaurus/mdx-loader" "3.2.1" + "@docusaurus/module-type-aliases" "3.2.1" + "@docusaurus/plugin-content-blog" "3.2.1" + "@docusaurus/plugin-content-docs" "3.2.1" + "@docusaurus/plugin-content-pages" "3.2.1" + "@docusaurus/theme-common" "3.2.1" + "@docusaurus/theme-translations" "3.2.1" + "@docusaurus/types" "3.2.1" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-common" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" "@mdx-js/react" "^3.0.0" clsx "^2.0.0" copy-text-to-clipboard "^3.2.0" @@ -1528,18 +1545,18 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-common@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.1.1.tgz" - integrity sha512-38urZfeMhN70YaXkwIGXmcUcv2CEYK/2l4b05GkJPrbEbgpsIZM3Xc+Js2ehBGGZmfZq8GjjQ5RNQYG+MYzCYg== - dependencies: - "@docusaurus/mdx-loader" "3.1.1" - "@docusaurus/module-type-aliases" "3.1.1" - "@docusaurus/plugin-content-blog" "3.1.1" - "@docusaurus/plugin-content-docs" "3.1.1" - "@docusaurus/plugin-content-pages" "3.1.1" - "@docusaurus/utils" "3.1.1" - "@docusaurus/utils-common" "3.1.1" +"@docusaurus/theme-common@^2 || ^3", "@docusaurus/theme-common@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.2.1.tgz" + integrity sha512-d+adiD7L9xv6EvfaAwUqdKf4orsM3jqgeqAM+HAjgL/Ux0GkVVnfKr+tsoe+4ow4rHe6NUt+nkkW8/K8dKdilA== + dependencies: + "@docusaurus/mdx-loader" "3.2.1" + "@docusaurus/module-type-aliases" "3.2.1" + "@docusaurus/plugin-content-blog" "3.2.1" + "@docusaurus/plugin-content-docs" "3.2.1" + "@docusaurus/plugin-content-pages" "3.2.1" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-common" "3.2.1" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" @@ -1549,32 +1566,32 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-mermaid@^3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.1.1.tgz" - integrity sha512-O6u9/7QX/ZapV4HJJSzNs0Jir1KA/LRLORWYeDvbGswqZNusj6q4iLELrKIClysJ3PB3zWUzyKtI/wjIKiV1vA== - dependencies: - "@docusaurus/core" "3.1.1" - "@docusaurus/module-type-aliases" "3.1.1" - "@docusaurus/theme-common" "3.1.1" - "@docusaurus/types" "3.1.1" - "@docusaurus/utils-validation" "3.1.1" +"@docusaurus/theme-mermaid@^3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.2.1.tgz" + integrity sha512-l1FzUPgDUor/25XeJDeO22dttmzB0QnmAbF2qKjDz3ENa9vlD5rd5r0NrItZIe8y7qoa+OOxkl5lLBKBxBVbLg== + dependencies: + "@docusaurus/core" "3.2.1" + "@docusaurus/module-type-aliases" "3.2.1" + "@docusaurus/theme-common" "3.2.1" + "@docusaurus/types" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" mermaid "^10.4.0" tslib "^2.6.0" -"@docusaurus/theme-search-algolia@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.1.1.tgz" - integrity sha512-tBH9VY5EpRctVdaAhT+b1BY8y5dyHVZGFXyCHgTrvcXQy5CV4q7serEX7U3SveNT9zksmchPyct6i1sFDC4Z5g== +"@docusaurus/theme-search-algolia@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.2.1.tgz" + integrity sha512-bzhCrpyXBXzeydNUH83II2akvFEGfhsNTPPWsk5N7e+odgQCQwoHhcF+2qILbQXjaoZ6B3c48hrvkyCpeyqGHw== dependencies: "@docsearch/react" "^3.5.2" - "@docusaurus/core" "3.1.1" - "@docusaurus/logger" "3.1.1" - "@docusaurus/plugin-content-docs" "3.1.1" - "@docusaurus/theme-common" "3.1.1" - "@docusaurus/theme-translations" "3.1.1" - "@docusaurus/utils" "3.1.1" - "@docusaurus/utils-validation" "3.1.1" + "@docusaurus/core" "3.2.1" + "@docusaurus/logger" "3.2.1" + "@docusaurus/plugin-content-docs" "3.2.1" + "@docusaurus/theme-common" "3.2.1" + "@docusaurus/theme-translations" "3.2.1" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" algoliasearch "^4.18.0" algoliasearch-helper "^3.13.3" clsx "^2.0.0" @@ -1584,18 +1601,18 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-translations@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.1.1.tgz" - integrity sha512-xvWQFwjxHphpJq5fgk37FXCDdAa2o+r7FX8IpMg+bGZBNXyWBu3MjZ+G4+eUVNpDhVinTc+j6ucL0Ain5KCGrg== +"@docusaurus/theme-translations@^2 || ^3", "@docusaurus/theme-translations@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.2.1.tgz" + integrity sha512-jAUMkIkFfY+OAhJhv6mV8zlwY6J4AQxJPTgLdR2l+Otof9+QdJjHNh/ifVEu9q0lp3oSPlJj9l05AaP7Ref+cg== dependencies: fs-extra "^11.1.1" tslib "^2.6.0" -"@docusaurus/types@*", "@docusaurus/types@^3.1.1", "@docusaurus/types@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.1.tgz" - integrity sha512-grBqOLnubUecgKFXN9q3uit2HFbCxTWX4Fam3ZFbMN0sWX9wOcDoA7lwdX/8AmeL20Oc4kQvWVgNrsT8bKRvzg== +"@docusaurus/types@*", "@docusaurus/types@^3.2.1", "@docusaurus/types@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/types/-/types-3.2.1.tgz" + integrity sha512-n/toxBzL2oxTtRTOFiGKsHypzn/Pm+sXyw+VSk1UbqbXQiHOwHwts55bpKwbcUgA530Is6kix3ELiFOv9GAMfw== dependencies: "@mdx-js/mdx" "^3.0.0" "@types/history" "^4.7.11" @@ -1607,30 +1624,32 @@ webpack "^5.88.1" webpack-merge "^5.9.0" -"@docusaurus/utils-common@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.1.1.tgz" - integrity sha512-eGne3olsIoNfPug5ixjepZAIxeYFzHHnor55Wb2P57jNbtVaFvij/T+MS8U0dtZRFi50QU+UPmRrXdVUM8uyMg== +"@docusaurus/utils-common@^2 || ^3", "@docusaurus/utils-common@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.2.1.tgz" + integrity sha512-N5vadULnRLiqX2QfTjVEU3u5vo6RG2EZTdyXvJdzDOdrLCGIZAfnf/VkssinFZ922sVfaFfQ4FnStdhn5TWdVg== dependencies: tslib "^2.6.0" -"@docusaurus/utils-validation@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.1.1.tgz" - integrity sha512-KlY4P9YVDnwL+nExvlIpu79abfEv6ZCHuOX4ZQ+gtip+Wxj0daccdReIWWtqxM/Fb5Cz1nQvUCc7VEtT8IBUAA== +"@docusaurus/utils-validation@^2 || ^3", "@docusaurus/utils-validation@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.2.1.tgz" + integrity sha512-+x7IR9hNMXi62L1YAglwd0s95fR7+EtirjTxSN4kahYRWGqOi3jlQl1EV0az/yTEvKbxVvOPcdYicGu9dk4LJw== dependencies: - "@docusaurus/logger" "3.1.1" - "@docusaurus/utils" "3.1.1" + "@docusaurus/logger" "3.2.1" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-common" "3.2.1" joi "^17.9.2" js-yaml "^4.1.0" tslib "^2.6.0" -"@docusaurus/utils@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.1.1.tgz" - integrity sha512-ZJfJa5cJQtRYtqijsPEnAZoduW6sjAQ7ZCWSZavLcV10Fw0Z3gSaPKA/B4micvj2afRZ4gZxT7KfYqe5H8Cetg== +"@docusaurus/utils@^2 || ^3", "@docusaurus/utils@3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.2.1.tgz" + integrity sha512-DPkIS/EPc+pGAV798PUXgNzJFM3HJouoQXgr0KDZuJVz1EkWbDLOcQwLIz8Qx7liI9ddfkN/TXTRQdsTPZNakw== dependencies: - "@docusaurus/logger" "3.1.1" + "@docusaurus/logger" "3.2.1" + "@docusaurus/utils-common" "3.2.1" "@svgr/webpack" "^6.5.1" escape-string-regexp "^4.0.0" file-loader "^6.2.0" @@ -1642,18 +1661,49 @@ js-yaml "^4.1.0" lodash "^4.17.21" micromatch "^4.0.5" + prompts "^2.4.2" resolve-pathname "^3.0.0" shelljs "^0.8.5" tslib "^2.6.0" url-loader "^4.1.1" webpack "^5.88.1" -"@hapi/hoek@^9.0.0": +"@easyops-cn/autocomplete.js@^0.38.1": + version "0.38.1" + resolved "https://registry.npmjs.org/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz" + integrity sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q== + dependencies: + cssesc "^3.0.0" + immediate "^3.2.3" + +"@easyops-cn/docusaurus-search-local@^0.40.1": + version "0.40.1" + resolved "https://registry.npmjs.org/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.40.1.tgz" + integrity sha512-4HMFZMpKKdd5qq1nFB8cvrAkgzZ1kNxphVciI64YHtmDYGIthVGZVG6+Ci7AAhzCR+ixLJkYwtVekvuMLjr2ZQ== + dependencies: + "@docusaurus/plugin-content-docs" "^2 || ^3" + "@docusaurus/theme-translations" "^2 || ^3" + "@docusaurus/utils" "^2 || ^3" + "@docusaurus/utils-common" "^2 || ^3" + "@docusaurus/utils-validation" "^2 || ^3" + "@easyops-cn/autocomplete.js" "^0.38.1" + "@node-rs/jieba" "^1.6.0" + cheerio "^1.0.0-rc.3" + clsx "^1.1.1" + debug "^4.2.0" + fs-extra "^10.0.0" + klaw-sync "^6.0.0" + lunr "^2.3.9" + lunr-languages "^1.4.0" + mark.js "^8.11.1" + tslib "^2.4.0" + +"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": version "9.3.0" resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz" integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== -"@hapi/topo@^5.0.0": +"@hapi/topo@^5.1.0": version "5.1.0" resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz" integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== @@ -1725,9 +1775,9 @@ integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== "@mdx-js/mdx@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.0.tgz" - integrity sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw== + version "3.0.1" + resolved "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz" + integrity sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA== dependencies: "@types/estree" "^1.0.0" "@types/estree-jsx" "^1.0.0" @@ -1760,6 +1810,31 @@ dependencies: "@types/mdx" "^2.0.0" +"@node-rs/jieba-darwin-arm64@1.10.0": + version "1.10.0" + resolved "https://registry.npmjs.org/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.10.0.tgz" + integrity sha512-IhR5r+XxFcfhVsF93zQ3uCJy8ndotRntXzoW/JCyKqOahUo/ITQRT6vTKHKMyD9xNmjl222OZonBSo2+mlI2fQ== + +"@node-rs/jieba@^1.6.0": + version "1.10.0" + resolved "https://registry.npmjs.org/@node-rs/jieba/-/jieba-1.10.0.tgz" + integrity sha512-9oZMCvZVnrAMeWTSnEjJ0OSw7YcV4dJJKSioqq80oUNf3eYLGdEXsgYwCe1AYEMcfUfNVgvjznItJKrsoud0IA== + optionalDependencies: + "@node-rs/jieba-android-arm-eabi" "1.10.0" + "@node-rs/jieba-android-arm64" "1.10.0" + "@node-rs/jieba-darwin-arm64" "1.10.0" + "@node-rs/jieba-darwin-x64" "1.10.0" + "@node-rs/jieba-freebsd-x64" "1.10.0" + "@node-rs/jieba-linux-arm-gnueabihf" "1.10.0" + "@node-rs/jieba-linux-arm64-gnu" "1.10.0" + "@node-rs/jieba-linux-arm64-musl" "1.10.0" + "@node-rs/jieba-linux-x64-gnu" "1.10.0" + "@node-rs/jieba-linux-x64-musl" "1.10.0" + "@node-rs/jieba-wasm32-wasi" "1.10.0" + "@node-rs/jieba-win32-arm64-msvc" "1.10.0" + "@node-rs/jieba-win32-ia32-msvc" "1.10.0" + "@node-rs/jieba-win32-x64-msvc" "1.10.0" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -1807,10 +1882,10 @@ resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz" integrity sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ== -"@sideway/address@^4.1.3": - version "4.1.4" - resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz" - integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== +"@sideway/address@^4.1.5": + version "4.1.5" + resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz" + integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== dependencies: "@hapi/hoek" "^9.0.0" @@ -1848,15 +1923,6 @@ micromark-util-character "^1.1.0" micromark-util-symbol "^1.0.1" -"@slorber/static-site-generator-webpack-plugin@^4.0.7": - version "4.0.7" - resolved "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz" - integrity sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA== - dependencies: - eval "^0.1.8" - p-map "^4.0.0" - webpack-sources "^3.2.2" - "@svgr/babel-plugin-add-jsx-attribute@^6.5.1": version "6.5.1" resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz" @@ -2053,9 +2119,9 @@ "@types/json-schema" "*" "@types/estree-jsx@^1.0.0": - version "1.0.3" - resolved "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.3.tgz" - integrity sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w== + version "1.0.5" + resolved "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz" + integrity sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg== dependencies: "@types/estree" "*" @@ -2090,9 +2156,9 @@ integrity sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg== "@types/hast@^3.0.0": - version "3.0.3" - resolved "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz" - integrity sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ== + version "3.0.4" + resolved "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== dependencies: "@types/unist" "*" @@ -2554,31 +2620,32 @@ ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0: uri-js "^4.2.2" algoliasearch-helper@^3.13.3: - version "3.16.2" - resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.16.2.tgz" - integrity sha512-Yl/Gu5Cq4Z5s/AJ0jR37OPI1H3+z7PHz657ibyaXgMOaWvPlZ3OACN13N+7HCLPUlB0BN+8BtmrG/CqTilowBA== + version "3.17.0" + resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.17.0.tgz" + integrity sha512-R5422OiQjvjlK3VdpNQ/Qk7KsTIGeM5ACm8civGifOVWdRRV/3SgXuKmeNxe94Dz6fwj/IgpVmXbHutU4mHubg== dependencies: "@algolia/events" "^4.0.1" algoliasearch@^4.18.0, algoliasearch@^4.19.1, "algoliasearch@>= 3.1 < 6", "algoliasearch@>= 4.9.1 < 6": - version "4.22.1" - resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.1.tgz" - integrity sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg== - dependencies: - "@algolia/cache-browser-local-storage" "4.22.1" - "@algolia/cache-common" "4.22.1" - "@algolia/cache-in-memory" "4.22.1" - "@algolia/client-account" "4.22.1" - "@algolia/client-analytics" "4.22.1" - "@algolia/client-common" "4.22.1" - "@algolia/client-personalization" "4.22.1" - "@algolia/client-search" "4.22.1" - "@algolia/logger-common" "4.22.1" - "@algolia/logger-console" "4.22.1" - "@algolia/requester-browser-xhr" "4.22.1" - "@algolia/requester-common" "4.22.1" - "@algolia/requester-node-http" "4.22.1" - "@algolia/transporter" "4.22.1" + version "4.23.2" + resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.2.tgz" + integrity sha512-8aCl055IsokLuPU8BzLjwzXjb7ty9TPcUFFOk0pYOwsE5DMVhE3kwCMFtsCFKcnoPZK7oObm+H5mbnSO/9ioxQ== + dependencies: + "@algolia/cache-browser-local-storage" "4.23.2" + "@algolia/cache-common" "4.23.2" + "@algolia/cache-in-memory" "4.23.2" + "@algolia/client-account" "4.23.2" + "@algolia/client-analytics" "4.23.2" + "@algolia/client-common" "4.23.2" + "@algolia/client-personalization" "4.23.2" + "@algolia/client-search" "4.23.2" + "@algolia/logger-common" "4.23.2" + "@algolia/logger-console" "4.23.2" + "@algolia/recommend" "4.23.2" + "@algolia/requester-browser-xhr" "4.23.2" + "@algolia/requester-common" "4.23.2" + "@algolia/requester-node-http" "4.23.2" + "@algolia/transporter" "4.23.2" ansi-align@^3.0.1: version "3.0.1" @@ -2672,13 +2739,13 @@ at-least-node@^1.0.0: integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== autoprefixer@^10.4.12, autoprefixer@^10.4.14: - version "10.4.16" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz" - integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ== + version "10.4.19" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz" + integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== dependencies: - browserslist "^4.21.10" - caniuse-lite "^1.0.30001538" - fraction.js "^4.3.6" + browserslist "^4.23.0" + caniuse-lite "^1.0.30001599" + fraction.js "^4.3.7" normalize-range "^0.1.2" picocolors "^1.0.0" postcss-value-parser "^4.2.0" @@ -2823,13 +2890,13 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9, browserslist@^4.22.2, "browserslist@>= 4.21.0": - version "4.22.2" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz" - integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.4, browserslist@^4.21.9, browserslist@^4.22.2, browserslist@^4.23.0, "browserslist@>= 4.21.0": + version "4.23.0" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== dependencies: - caniuse-lite "^1.0.30001565" - electron-to-chromium "^1.4.601" + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" node-releases "^2.0.14" update-browserslist-db "^1.0.13" @@ -2908,10 +2975,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001565: - version "1.0.30001566" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz" - integrity sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: + version "1.0.30001608" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001608.tgz" + integrity sha512-cjUJTQkk9fQlJR2s4HMuPMvTiRggl0rAVMtthQuyOlDWuqHXqN8azLq+pi8B2TjwKJ32diHjUqRIKeFX4z1FoA== ccount@^2.0.0: version "2.0.1" @@ -2977,7 +3044,7 @@ cheerio-select@^2.1.0: domhandler "^5.0.3" domutils "^3.0.1" -cheerio@^1.0.0-rc.12: +cheerio@^1.0.0-rc.12, cheerio@^1.0.0-rc.3: version "1.0.0-rc.12" resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz" integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== @@ -3050,6 +3117,11 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" +clsx@^1.1.1: + version "1.2.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + clsx@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz" @@ -3788,7 +3860,7 @@ debug@^2.6.0: dependencies: ms "2.0.0" -debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@4: +debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -4051,10 +4123,10 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.601: - version "1.4.609" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.609.tgz" - integrity sha512-ihiCP7PJmjoGNuLpl7TjNA8pCQWu09vGyjlPYw1Rqww4gvNuCcmvl+44G+2QyJ6S2K4o+wbTS++Xz0YN8Q9ERw== +electron-to-chromium@^1.4.668: + version "1.4.732" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.732.tgz" + integrity sha512-nLrzr6UML+oqCyvseTxJ1WxLsnMSQPJCoHu+MuOuNiCp7BHEdG9AmCTw2Y9FU/wFFc/ETE0F6JVtzzPryEjecw== elkjs@^0.8.2: version "0.8.2" @@ -4213,9 +4285,9 @@ estree-util-to-js@^2.0.0: source-map "^0.7.0" estree-util-value-to-estree@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.0.1.tgz" - integrity sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA== + version "3.1.1" + resolved "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.1.1.tgz" + integrity sha512-5mvUrF2suuv5f5cGDnDphIy4/gW86z82kl5qG6mM9z04SEQI4FB5Apmaw/TGEf3l55nLtMs5s51dmhUzvAHQCA== dependencies: "@types/estree" "^1.0.0" is-plain-obj "^4.0.0" @@ -4496,7 +4568,7 @@ forwarded@0.2.0: resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fraction.js@^4.3.6: +fraction.js@^4.3.7: version "4.3.7" resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== @@ -4506,6 +4578,15 @@ fresh@0.5.2: resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^11.1.1: version "11.2.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz" @@ -4681,7 +4762,7 @@ got@^12.1.0: p-cancelable "^3.0.0" responselike "^3.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -4774,9 +4855,9 @@ hast-util-parse-selector@^4.0.0: "@types/hast" "^3.0.0" hast-util-raw@^9.0.0: - version "9.0.1" - resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.1.tgz" - integrity sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA== + version "9.0.2" + resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.2.tgz" + integrity sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA== dependencies: "@types/hast" "^3.0.0" "@types/unist" "^3.0.0" @@ -5076,12 +5157,17 @@ ignore@^5.2.0, ignore@^5.2.4: integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== image-size@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz" - integrity sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg== + version "1.1.1" + resolved "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz" + integrity sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ== dependencies: queue "6.0.2" +immediate@^3.2.3: + version "3.3.0" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz" + integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== + immer@^9.0.7: version "9.0.21" resolved "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz" @@ -5148,10 +5234,10 @@ inline-style-parser@0.1.1: resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== -inline-style-parser@0.2.2: - version "0.2.2" - resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.2.tgz" - integrity sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ== +inline-style-parser@0.2.3: + version "0.2.3" + resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz" + integrity sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g== internmap@^1.0.0: version "1.0.1" @@ -5417,13 +5503,13 @@ jiti@^1.18.2, jiti@^1.20.0: integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== joi@^17.9.2: - version "17.11.0" - resolved "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz" - integrity sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ== + version "17.12.3" + resolved "https://registry.npmjs.org/joi/-/joi-17.12.3.tgz" + integrity sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g== dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.3" + "@hapi/hoek" "^9.3.0" + "@hapi/topo" "^5.1.0" + "@sideway/address" "^4.1.5" "@sideway/formula" "^3.0.1" "@sideway/pinpoint" "^2.0.0" @@ -5508,6 +5594,13 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" @@ -5662,6 +5755,21 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lunr-languages@^1.4.0: + version "1.14.0" + resolved "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.14.0.tgz" + integrity sha512-hWUAb2KqM3L7J5bcrngszzISY4BxrXn/Xhbb9TTCJYEGqlR1nG67/M14sp09+PTIRklobrn57IAxcdcO/ZFyNA== + +lunr@^2.3.9: + version "2.3.9" + resolved "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== + +mark.js@^8.11.1: + version "8.11.1" + resolved "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz" + integrity sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ== + markdown-extensions@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz" @@ -5822,9 +5930,9 @@ mdast-util-mdx-expression@^2.0.0: mdast-util-to-markdown "^2.0.0" mdast-util-mdx-jsx@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.0.0.tgz" - integrity sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA== + version "3.1.2" + resolved "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz" + integrity sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA== dependencies: "@types/estree-jsx" "^1.0.0" "@types/hast" "^3.0.0" @@ -5864,17 +5972,17 @@ mdast-util-mdxjs-esm@^2.0.0: mdast-util-to-markdown "^2.0.0" mdast-util-phrasing@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz" - integrity sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA== + version "4.1.0" + resolved "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz" + integrity sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w== dependencies: "@types/mdast" "^4.0.0" unist-util-is "^6.0.0" mdast-util-to-hast@^13.0.0: - version "13.0.2" - resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz" - integrity sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og== + version "13.1.0" + resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz" + integrity sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA== dependencies: "@types/hast" "^3.0.0" "@types/mdast" "^4.0.0" @@ -5884,6 +5992,7 @@ mdast-util-to-hast@^13.0.0: trim-lines "^3.0.0" unist-util-position "^5.0.0" unist-util-visit "^5.0.0" + vfile "^6.0.0" mdast-util-to-markdown@^2.0.0: version "2.1.0" @@ -6305,9 +6414,9 @@ micromark-util-character@^1.0.0, micromark-util-character@^1.1.0: micromark-util-types "^1.0.0" micromark-util-character@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz" - integrity sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw== + version "2.1.0" + resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz" + integrity sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ== dependencies: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" @@ -7430,9 +7539,9 @@ prop-types@^15.6.2, prop-types@^15.7.2: react-is "^16.13.1" property-information@^6.0.0: - version "6.4.0" - resolved "https://registry.npmjs.org/property-information/-/property-information-6.4.0.tgz" - integrity sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ== + version "6.5.0" + resolved "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz" + integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== proto-list@~1.2.1: version "1.2.4" @@ -7560,7 +7669,7 @@ react-dev-utils@^12.0.1: strip-ansi "^6.0.1" text-table "^0.2.0" -react-dom@*, "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0", react-dom@^18.0.0, "react-dom@>= 16.8.0 < 19.0.0": +react-dom@*, "react-dom@^16.14.0 || 17 || ^18", "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0", react-dom@^18.0.0, "react-dom@>= 16.8.0 < 19.0.0": version "18.2.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== @@ -7595,9 +7704,9 @@ react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-json-view-lite@^1.2.0: - version "1.2.1" - resolved "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.2.1.tgz" - integrity sha512-Itc0g86fytOmKZoIoJyGgvNqohWSbh3NXIKNgH6W6FT9PC1ck4xas1tT3Rr/b3UlFXyA9Jjaw9QSXdZy2JwGMQ== + version "1.3.0" + resolved "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.3.0.tgz" + integrity sha512-aN1biKC5v4DQkmQBlZjuMFR09MKZGMPtIg+cut8zEeg2HXd6gl2gRy0n4HMacHf0dznQgo0SVXN7eT8zV3hEuQ== react-loadable-ssr-addon-v5-slorber@^1.0.1: version "1.0.1" @@ -7649,7 +7758,7 @@ react-router@^5.3.4, react-router@>=5, react-router@5.3.4: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react@*, "react@^16.13.1 || ^17.0.0 || ^18.0.0", "react@^16.6.0 || ^17.0.0 || ^18.0.0", react@^18.0.0, react@^18.2.0, "react@>= 16.8.0 < 19.0.0", react@>=15, react@>=16, react@>=16.0.0: +react@*, "react@^16.13.1 || ^17.0.0 || ^18.0.0", "react@^16.14.0 || ^17 || ^18", "react@^16.6.0 || ^17.0.0 || ^18.0.0", react@^18.0.0, react@^18.2.0, "react@>= 16.8.0 < 19.0.0", react@>=15, react@>=16, react@>=16.0.0: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== @@ -7819,9 +7928,9 @@ remark-gfm@^4.0.0: unified "^11.0.0" remark-mdx@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.0.tgz" - integrity sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g== + version "3.0.1" + resolved "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz" + integrity sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA== dependencies: mdast-util-mdx "^3.0.0" micromark-extension-mdxjs "^3.0.0" @@ -7837,9 +7946,9 @@ remark-parse@^11.0.0: unified "^11.0.0" remark-rehype@^11.0.0: - version "11.0.0" - resolved "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.0.0.tgz" - integrity sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw== + version "11.1.0" + resolved "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz" + integrity sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g== dependencies: "@types/hast" "^3.0.0" "@types/mdast" "^4.0.0" @@ -8415,9 +8524,9 @@ string-width@^5.0.1, string-width@^5.1.2: strip-ansi "^7.0.1" stringify-entities@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz" - integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== + version "4.0.4" + resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz" + integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== dependencies: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" @@ -8473,11 +8582,11 @@ style-to-object@^0.4.0: inline-style-parser "0.1.1" style-to-object@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.5.tgz" - integrity sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ== + version "1.0.6" + resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz" + integrity sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA== dependencies: - inline-style-parser "0.2.2" + inline-style-parser "0.2.3" stylehacks@^5.1.1: version "5.1.1" @@ -8615,16 +8724,16 @@ trim-lines@^3.0.0: integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== trough@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz" - integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== + version "2.2.0" + resolved "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== ts-dedent@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz" integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== -tslib@^2.0.3, tslib@^2.6.0: +tslib@^2.0.3, tslib@^2.4.0, tslib@^2.6.0: version "2.6.2" resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -8835,9 +8944,9 @@ utila@~0.4: integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== utility-types@^3.10.0: - version "3.10.0" - resolved "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz" - integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== + version "3.11.0" + resolved "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz" + integrity sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw== utils-merge@1.0.1: version "1.0.1" @@ -8999,7 +9108,7 @@ webpack-merge@^5.9.0: flat "^5.0.2" wildcard "^2.0.0" -webpack-sources@^3.2.2, webpack-sources@^3.2.3: +webpack-sources@^3.2.3: version "3.2.3" resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==